Initial Commit
parent
97b3d6210c
commit
bb42ce816d
|
@ -0,0 +1,47 @@
|
|||
read_globals = {
|
||||
"DIR_DELIM", "INIT",
|
||||
|
||||
"minetest", "core",
|
||||
"dump", "dump2",
|
||||
|
||||
"api",
|
||||
|
||||
"Raycast",
|
||||
"Settings",
|
||||
"PseudoRandom",
|
||||
"PerlinNoise",
|
||||
"VoxelManip",
|
||||
"SecureRandom",
|
||||
"VoxelArea",
|
||||
"PerlinNoiseMap",
|
||||
"PcgRandom",
|
||||
"ItemStack",
|
||||
"AreaStore",
|
||||
|
||||
"vector",
|
||||
|
||||
table = {
|
||||
fields = {
|
||||
"copy",
|
||||
"indexof",
|
||||
"insert_all",
|
||||
"key_value_swap",
|
||||
"shuffle",
|
||||
}
|
||||
},
|
||||
|
||||
string = {
|
||||
fields = {
|
||||
"split",
|
||||
"trim",
|
||||
}
|
||||
},
|
||||
|
||||
math = {
|
||||
fields = {
|
||||
"hypot",
|
||||
"sign",
|
||||
"factorial"
|
||||
}
|
||||
},
|
||||
}
|
|
@ -0,0 +1,23 @@
|
|||
## Custom item definition values
|
||||
|
||||
```lua
|
||||
{
|
||||
-- Name of the loaded version of the ranged weapon
|
||||
-- Used by: load_weapon()
|
||||
-- Set by: also_register_loaded_tool()
|
||||
loaded_name = <string>,
|
||||
|
||||
-- Name of the unloaded version of the ranged weapon
|
||||
-- Used by: unload_weapon()
|
||||
-- Set by: also_register_loaded_tool()
|
||||
unloaded_name = <string>,
|
||||
|
||||
-- Amount of bullets the ranged weapon can shoot.
|
||||
-- Used by: unload_weapon()
|
||||
rounds = <number>,
|
||||
|
||||
-- Ammo that can be used by the ranged weapon
|
||||
-- Used by: load_weapon()
|
||||
ammo = <itemstack | string | list>
|
||||
}
|
||||
```
|
|
@ -0,0 +1,66 @@
|
|||
local MODNAME = minetest.get_current_modname()
|
||||
local api = rawget(_G, MODNAME)
|
||||
|
||||
function api.also_register_loaded_tool(name, def, user_loaded_def)
|
||||
local loaded_def = table.copy(def)
|
||||
|
||||
if user_loaded_def then
|
||||
user_loaded_def(loaded_def)
|
||||
end
|
||||
|
||||
loaded_def.unloaded_name = name
|
||||
def.loaded_name = name.."_loaded"
|
||||
|
||||
minetest.register_tool(def.loaded_name, loaded_def)
|
||||
|
||||
return name, def
|
||||
end
|
||||
|
||||
function api.unload_weapon(weapon, amount)
|
||||
local iname = weapon:get_name()
|
||||
local rounds = assert(
|
||||
minetest.registered_tools[iname].rounds,
|
||||
"Must define 'rounds' property for ranged weapon "..dump(iname)
|
||||
)
|
||||
|
||||
local new_wear = (65535 / (rounds-1)) * (amount or 1)
|
||||
|
||||
new_wear = weapon:get_wear() + new_wear
|
||||
|
||||
if new_wear >= 65535 then
|
||||
return ItemStack(weapon:get_definition().unloaded_name)
|
||||
end
|
||||
|
||||
weapon:set_wear(new_wear)
|
||||
|
||||
return weapon
|
||||
end
|
||||
|
||||
function api.load_weapon(weapon, inv, lists)
|
||||
local idef = weapon:get_definition()
|
||||
|
||||
assert(idef.loaded_name, "Item "..idef.name.." doesn't have 'loaded_name' set!")
|
||||
assert(idef.ammo, "Item "..idef.name.." doesn't have 'ammo' set!")
|
||||
|
||||
if type(idef.ammo) ~= "table" then
|
||||
idef.ammo = {idef.ammo}
|
||||
end
|
||||
|
||||
if not lists then
|
||||
lists = {"main"}
|
||||
elseif type(lists) ~= "table" then
|
||||
lists = {lists}
|
||||
end
|
||||
|
||||
for _, item in pairs(idef.ammo) do
|
||||
for _, list in pairs(lists) do
|
||||
if inv:contains_item(list, item) then
|
||||
inv:remove_item(list, item)
|
||||
|
||||
return ItemStack(idef.loaded_name)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return weapon
|
||||
end
|
|
@ -0,0 +1,71 @@
|
|||
local MODNAME = minetest.get_current_modname()
|
||||
local api = rawget(_G, MODNAME)
|
||||
|
||||
function api.get_bullet_start_data(player)
|
||||
local first_person_offset = player:get_eye_offset()
|
||||
local look_dir = player:get_look_dir()
|
||||
local spawnpos = vector.offset(player:get_pos(), 0, 1.47, 0)
|
||||
|
||||
spawnpos = vector.add(spawnpos, vector.multiply(look_dir, 0.4))
|
||||
spawnpos = vector.add(spawnpos, first_person_offset)
|
||||
|
||||
return spawnpos, look_dir
|
||||
end
|
||||
|
||||
function api.bulletcast(bullet, pos1, pos2, objects, liquids)
|
||||
minetest.add_particle({
|
||||
pos = pos1,
|
||||
velocity = vector.multiply(vector.direction(pos1, pos2), vector.distance(pos1, pos2)/0.1),
|
||||
acceleration = {x=0, y=0, z=0},
|
||||
expirationtime = 0.1,
|
||||
size = 1,
|
||||
collisiondetection = true,
|
||||
collision_removal = true,
|
||||
object_collision = objects,
|
||||
texture = bullet.texture or bullet,
|
||||
glow = bullet.glow or 0
|
||||
})
|
||||
|
||||
local raycast = minetest.raycast(pos1, pos2, objects, liquids)
|
||||
local bulletcast = {
|
||||
raycast = raycast,
|
||||
hit_object_or_node = function(self, options)
|
||||
if not options then
|
||||
options = {}
|
||||
end
|
||||
|
||||
for hitpoint in self.raycast do
|
||||
if hitpoint.type == "node" then
|
||||
if not options.node or options.node(minetest.registered_nodes[minetest.get_node(hitpoint.under).name]) then
|
||||
return hitpoint
|
||||
end
|
||||
elseif hitpoint.type == "object" then
|
||||
if not options.object or options.object(hitpoint.ref) then
|
||||
return hitpoint
|
||||
end
|
||||
end
|
||||
end
|
||||
end,
|
||||
}
|
||||
|
||||
setmetatable(bulletcast, {
|
||||
__index = function(table, key)
|
||||
local not_raycast_func = rawget(table, key)
|
||||
|
||||
if not_raycast_func then
|
||||
return not_raycast_func
|
||||
else
|
||||
return function(self, ...)
|
||||
local sraycast = rawget(self, "raycast")
|
||||
|
||||
return sraycast[key](sraycast, ...)
|
||||
end
|
||||
end
|
||||
end,
|
||||
__call = function(table, ...)
|
||||
return rawget(table, "raycast")(...)
|
||||
end
|
||||
})
|
||||
|
||||
return bulletcast
|
||||
end
|
|
@ -0,0 +1,11 @@
|
|||
local api = {}
|
||||
local MODNAME = minetest.get_current_modname()
|
||||
rawset(_G, MODNAME, api)
|
||||
|
||||
local files = {
|
||||
"bullet.lua",
|
||||
"ammo.lua"
|
||||
}
|
||||
for _, file in ipairs(files) do
|
||||
dofile(minetest.get_modpath(MODNAME).."/"..file)
|
||||
end
|
Loading…
Reference in New Issue