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