Initial Commit

master
LoneWolfHT 2021-06-28 19:07:19 -07:00
parent 97b3d6210c
commit bb42ce816d
6 changed files with 220 additions and 0 deletions

47
.luacheckrc Normal file
View File

@ -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"
}
},
}

23
API.md Normal file
View File

@ -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>
}
```

66
ammo.lua Normal file
View File

@ -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

71
bullet.lua Normal file
View File

@ -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

11
init.lua Normal file
View File

@ -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

2
mod.conf Normal file
View File

@ -0,0 +1,2 @@
name = rawf