From bb42ce816d88c72df100ccc0e0ee5b5d16ef5e5e Mon Sep 17 00:00:00 2001 From: LoneWolfHT Date: Mon, 28 Jun 2021 19:07:19 -0700 Subject: [PATCH] Initial Commit --- .luacheckrc | 47 +++++++++++++++++++++++++++++++++++ API.md | 23 +++++++++++++++++ ammo.lua | 66 +++++++++++++++++++++++++++++++++++++++++++++++++ bullet.lua | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++ init.lua | 11 +++++++++ mod.conf | 2 ++ 6 files changed, 220 insertions(+) create mode 100644 .luacheckrc create mode 100644 API.md create mode 100644 ammo.lua create mode 100644 bullet.lua create mode 100644 init.lua create mode 100644 mod.conf diff --git a/.luacheckrc b/.luacheckrc new file mode 100644 index 0000000..062cd08 --- /dev/null +++ b/.luacheckrc @@ -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" + } + }, +} diff --git a/API.md b/API.md new file mode 100644 index 0000000..78bedb6 --- /dev/null +++ b/API.md @@ -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 = , + + -- Name of the unloaded version of the ranged weapon + -- Used by: unload_weapon() + -- Set by: also_register_loaded_tool() + unloaded_name = , + + -- Amount of bullets the ranged weapon can shoot. + -- Used by: unload_weapon() + rounds = , + + -- Ammo that can be used by the ranged weapon + -- Used by: load_weapon() + ammo = +} +``` diff --git a/ammo.lua b/ammo.lua new file mode 100644 index 0000000..2e06308 --- /dev/null +++ b/ammo.lua @@ -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 diff --git a/bullet.lua b/bullet.lua new file mode 100644 index 0000000..651af4b --- /dev/null +++ b/bullet.lua @@ -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 diff --git a/init.lua b/init.lua new file mode 100644 index 0000000..58b95a3 --- /dev/null +++ b/init.lua @@ -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 diff --git a/mod.conf b/mod.conf new file mode 100644 index 0000000..fa5b8f3 --- /dev/null +++ b/mod.conf @@ -0,0 +1,2 @@ +name = rawf +