From 5bd53dc6a2c73ed4a90dd44606bbf06107fe5827 Mon Sep 17 00:00:00 2001 From: FatalErr42O <58855799+FatalError42O@users.noreply.github.com> Date: Sun, 11 Jun 2023 23:34:28 -0700 Subject: [PATCH] first commit --- .vscode/settings.json | 9 + block_values.lua | 75 +++++ classes/Bullet_ray.lua | 184 ++++++++++++ classes/Control_handler.lua | 82 ++++++ classes/Gun.lua | 473 +++++++++++++++++++++++++++++++ classes/Instantiatable_class.lua | 35 +++ classes/Player_handler.lua | 195 +++++++++++++ classes/Player_model_handler.lua | 78 +++++ classes/raycast_defunked.lua | 159 +++++++++++ gun_api.lua | 98 +++++++ init.lua | 51 ++++ misc_helpers.lua | 129 +++++++++ model_api.lua | 0 models/guns3d_character.b3d | Bin 0 -> 100873 bytes models/guns3d_character.blend | Bin 0 -> 710180 bytes textures/gun_mrkr.png | Bin 0 -> 494 bytes textures/scope_back.png | Bin 0 -> 10923 bytes textures/scope_fore.png | Bin 0 -> 9074 bytes textures/smoke.png | Bin 0 -> 285 bytes visual_effects.lua | 78 +++++ 20 files changed, 1646 insertions(+) create mode 100644 .vscode/settings.json create mode 100644 block_values.lua create mode 100644 classes/Bullet_ray.lua create mode 100644 classes/Control_handler.lua create mode 100644 classes/Gun.lua create mode 100644 classes/Instantiatable_class.lua create mode 100644 classes/Player_handler.lua create mode 100644 classes/Player_model_handler.lua create mode 100644 classes/raycast_defunked.lua create mode 100644 gun_api.lua create mode 100644 init.lua create mode 100644 misc_helpers.lua create mode 100644 model_api.lua create mode 100644 models/guns3d_character.b3d create mode 100644 models/guns3d_character.blend create mode 100644 textures/gun_mrkr.png create mode 100644 textures/scope_back.png create mode 100644 textures/scope_fore.png create mode 100644 textures/smoke.png create mode 100644 visual_effects.lua diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..45a66c9 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,9 @@ +{ + "Lua.diagnostics.globals": [ + "minetest", + "vector", + "dump", + "player_api", + "ItemStack" + ] +} \ No newline at end of file diff --git a/block_values.lua b/block_values.lua new file mode 100644 index 0000000..c537554 --- /dev/null +++ b/block_values.lua @@ -0,0 +1,75 @@ +Guns4d.node_properties = {} +--{["default:gravel"] = {rha=2, random_deviation=1, behavior="normal"}, . . . } +--behavior types: +--normal, bullets hit and penetrate +--breaks, bullets break it but still applies RHA/randomness values (etc) +--ignore, bullets pass through + +--unimplemented + +--liquid, bullets hit and penetrate, but effects are different +--damage, bullets hit and penetrate, but replace with "replace = _" + +--mmRHA of wood .05 (mostly arbitrary) +--{choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1} + +--this is really the best way I could think of to do this +--in a perfect world you could perfectly balance each node, but a aproximation will have to do +--luckily its still an option, if you are literally out of your fucking mind. +minetest.register_on_mods_loaded(function() + for i, v in pairs(minetest.registered_nodes) do + local groups = v.groups + local RHA = 1 + local random_deviation = 1 + local behavior_type = "normal" + if groups.wood then + RHA = RHA*groups.wood*.1 + random_deviation = random_deviation/groups.wood + end + if groups.oddly_breakable_by_hand then + RHA = RHA / groups.oddly_breakable_by_hand + end + if groups.choppy then + RHA = RHA*(1+(groups.choppy*.5)) + end + if groups.flora or groups.grass then + RHA = 0 + random_deviation = 0 + behavior_type = "ignore" + end + if groups.leaves then + RHA = .0001 + random_deviation = .005 + end + if groups.stone then + RHA = groups.stone + random_deviation = .5 + end + if groups.cracky then + RHA = RHA*groups.cracky + random_deviation = random_deviation*(groups.cracky*.5) + end + if groups.crumbly then + RHA = RHA/groups.crumbly + end + if groups.soil then + RHA = RHA*(groups.soil*2) + end + if groups.sand then + RHA = RHA*(groups.sand*2) + end + if groups.liquid then + --behavior type here + RHA = .5 + random_deviation = .1 + end + Guns4d.node_properties[i] = {mmRHA=RHA*1000, random_deviation=random_deviation, behavior=behavior_type} + end +end) +function Guns4d.override_node_propertoes(node, table) + --TODO: check if node is valid + assert(type(table.mmRHA)=="number", "no mmRHA value provided in override") + assert(type(table.behavior)=="string", "no behavior type provided in override") + assert(type(table.behavior)=="number", "no random_deviation value provided in override") + Guns4d.node_properties[node] = table +end \ No newline at end of file diff --git a/classes/Bullet_ray.lua b/classes/Bullet_ray.lua new file mode 100644 index 0000000..b9f858b --- /dev/null +++ b/classes/Bullet_ray.lua @@ -0,0 +1,184 @@ +local ray = { + history = {}, + state = "free", + --pos = pos, + last_node = "", + normal = vector.new(), + --last_dir + --exit_direction = dir, + --range_left = def.bullet.range, + --force_mmRHA = def.bullet.penetration_RHA + ITERATION_DISTANCE = .3, + damage = 0 +} +function ray:validate_location() +end + +function ray:record_state() + table.insert(self.history, { + state = self.state + + }) +end +--find (valid) edge. Slabs or other nodeboxes that are not the last hit position are not considered (to account for holes) TODO: update to account for hollow nodes +function ray:transverse_end_point() + assert(self.instance, "attempt to call obj method on a class") + local pointed + local cast = minetest.raycast(self.pos+(self.dir*(self.ITERATION_DISTANCE+.01)), self.pos, false, false) + for hit in cast do + --we can't solidly predict all nodes, so ignore them as the distance will be solved regardless. If node name is different then + if hit.type == "node" and (vector.equals(hit.under, self.last_pointed.under) or not minetest.registered_nodes[self.last_node_name].node_box) then + pointed = hit + break + end + end + if pointed and vector.distance(pointed.intersection_point, self.pos) < self.ITERATION_DISTANCE then + self.normal = pointed.intersection_normal + self.exit_direction = vector.direction(self.dir, vector.new()) --reverse dir is exit direction (for VFX) + return pointed.intersection_point + end +end +function ray:cast() + assert(self.instance, "attempt to call obj method on a class") + local end_pos = self.pos+(self.dir*self.range) + --if block ends early, then we set end position accordingly + local next_penetration_val + local edge + local next_state = self.state + if self.state == "transverse" then + edge = self:transverse_end_point() + if edge then + end_pos = edge + next_state = "free" + else + end_pos = self.pos+(self.dir*self.ITERATION_DISTANCE) + end + end + local continue = true + local cast = minetest.raycast(self.pos, end_pos, true, true) + local pointed + for hit in cast do + if not continue then break end + if vector.distance(hit.intersection_point, self.pos) > 0.0005 and vector.distance(hit.intersection_point, self.pos) < self.range then + --if it's a node, check that it's note supposed to be ignored according to it's generated properties + if hit.type == "node" then + if self.state == "free" and Guns4d.node_properties[minetest.get_node(hit.under).name].behavior ~= "ignore" then + next_state = "transverse" + pointed = hit + break + end + if self.state == "transverse" then + --if it isn't the same name as the last node we intersected, then it's a different block with different stats for penetration + if minetest.get_node(hit.under).name ~= self.last_node_name then + pointed = hit + end + --make sure it's set to transverse if the edge has a block infront of it + if Guns4d.node_properties[minetest.get_node(hit.under).name].behavior == "ignore" then + next_state = "free" + else + next_state = "transverse" + end + break + end + end + --if it's an object, make sure it's not the player object + --note that while it may seem like this will create a infinite hit loop, it resolves itself as the intersection_point of the next ray will be close enough as to skip the pointed. See first line of iterator. + if hit.type == "object" and hit.ref ~= self.player then + if self.over_penetrate then + pointed = hit + break + else + pointed = hit + continue = false + break + end + end + end + end + if pointed then + end_pos = pointed.intersection_point + if self.state == "transverse" then + next_penetration_val = self.force_mmRHA-(vector.distance(self.pos, end_pos)*Guns4d.node_properties[self.last_node_name].mmRHA) + else -- transverse + next_penetration_val = self.force_mmRHA-(vector.distance(self.pos, end_pos)*self.dropoff_mmRHA) + end + else + --if there is no pointed, and it's not transverse, then the ray has ended. + if self.state == "transverse" then + next_penetration_val = self.force_mmRHA-(vector.distance(self.pos, end_pos)*Guns4d.node_properties[self.last_node_name].mmRHA) + else --free + continue = false + next_penetration_val = self.force_mmRHA-(self.range*self.dropoff_mmRHA) + end + end + + --set "last" values. + return pointed, next_penetration_val, next_state, end_pos, continue +end +function ray:apply_damage(obj) + local damage = math.floor((self.damage*(self.force_mmRHA/self.init_force_mmRHA))+1) + obj:punch(self.player, nil, {damage_groups = {fleshy = damage, penetration_mmRHA=self.force_mmRHA}}, self.dir) +end +function ray:iterate(initialized) + assert(self.instance, "attempt to call obj method on a class") + local pointed, penetration, next_state, end_pos, continue = self:cast() + self.range = self.range-vector.distance(self.pos, end_pos) + self.pos = end_pos + self.force_mmRHA = penetration +---@diagnostic disable-next-line: assign-type-mismatch + self.state = next_state + if pointed then + self.last_pointed = pointed + end + if pointed then + if pointed.type == "node" then + self.last_node_name = minetest.get_node(pointed.under).name + elseif pointed.type == "object" then + ray:apply_damage(pointed.ref) + end + end + table.insert(self.history, { + pos = self.pos, + force_mmRHA = self.force_mmRHA, + state = self.state, + last_node = self.last_node_name, + normal = self.normal, + }) + if continue and self.range > 0 and self.force_mmRHA > 0 then + self:iterate(true) + end + if not initialized then + for i, v in pairs(self.history) do + --[[local hud = self.player:hud_add({ + hud_elem_type = "waypoint", + text = "mmRHA:"..tostring(math.floor(v.force_mmRHA or 0)).." ", + number = 255255255, + precision = 1, + world_pos = v.pos, + scale = {x=1, y=1}, + alignment = {x=0,y=0}, + offset = {x=0,y=0}, + }) + minetest.after(40, function(hud) + self.player:hud_remove(hud) + end, hud)]] + end + end +end +function ray.construct(def) + if def.instance then + assert(def.player, "no player") + assert(def.pos, "no position") + assert(def.dir, "no direction") + assert(def.gun, "no Gun object") + assert(def.range, "no range") + assert(def.force_mmRHA, "no force") + assert(def.dropoff_mmRHA, "no force dropoff") + def.init_force_mmRHA = def.force_mmRHA + def.dir = vector.new(def.dir) + def.pos = vector.new(def.pos) + def.history = {} + def:iterate() + end +end +Guns4d.bullet_ray = Instantiatable_class:inherit(ray) \ No newline at end of file diff --git a/classes/Control_handler.lua b/classes/Control_handler.lua new file mode 100644 index 0000000..94e0543 --- /dev/null +++ b/classes/Control_handler.lua @@ -0,0 +1,82 @@ +Guns4d.control_handler = { + --[[example: + controls = { + reload = { + conditions = { --the list of controls (see lua_api.txt) to call + "shift", + "zoom" + }, + timer = .3, + call_before_timer = false, + loop = false, + func=function(active, interrupted, data, busy_controls) + data = { + + } + } + } + ]] +} +local controls = Guns4d.control_handler +--[[-modify controls (future implementation if needed) +function controls.modify() +end]] +function controls:update(dt) + self.player_pressed = self.player:get_player_control() + local pressed = self.player_pressed + local call_queue = {} --so I need to have a "call" queue so I can tell the functions the names of other active controls (busy_list) + local busy_list = {} --list of controls that have their conditions met + for i, control in pairs(self.controls) do + local def = control + local data = control.data + local conditions_met = true + for _, key in pairs(control.conditions) do + if not pressed[key] then conditions_met = false break end + end + if not conditions_met then + busy_list[i] = true + data.held = false + --detect interrupts + if data.timer ~= def.timer then + table.insert(call_queue, {control=def, active=false, interrupt=true, data=data}) + data.timer = def.timer + end + else + data.timer = data.timer - dt + --when time is over, if it wasnt held (or loop is active) then reset and call the function. + if data.timer <= 0 and ((not data.held) or def.loop) then + data.held = true + table.insert(call_queue, {control=def, active=true, interrupt=false, data=data}) + elseif def.call_before_timer then + table.insert(call_queue, {control=def, active=false, interrupt=false, data=data}) + end + end + end + local count = 0 + for i, v in pairs(busy_list) do + count = count + 1 + end + if count == 0 then busy_list = nil end --so funcs can quickly deduce if they can call + for i, tbl in pairs(call_queue) do + tbl.control.func(tbl.active, tbl.interrupt, tbl.data, busy_list, Guns4d.players[self.player:get_player_name()].handler) + end +end +---@diagnostic disable-next-line: duplicate-set-field +function controls.construct(def) + if def.instance then + assert(def.controls, "no controls provided") + assert(def.player, "no player provided") + def.controls = table.deep_copy(def.controls) + for i, control in pairs(def.controls) do + control.timer = control.timer or 0 + control.data = { + timer = control.timer, + held = false + } + end + table.sort(def.controls, function(a,b) + return #a.conditions > #b.conditions + end) + end +end +Guns4d.control_handler = Instantiatable_class:inherit(Guns4d.control_handler) \ No newline at end of file diff --git a/classes/Gun.lua b/classes/Gun.lua new file mode 100644 index 0000000..038c754 --- /dev/null +++ b/classes/Gun.lua @@ -0,0 +1,473 @@ +local Vec = vector +local gun = { + --itemstack = Itemstack + --gun_entity = ObjRef + name = "__template__", + registered = {}, + properties = { + hip = { + offset = Vec.new(), + }, + ads = { + offset = Vec.new(), + horizontal_offset = 0, + }, + recoil = { + velocity_correction_factor = { + gun_axial = 1, + player_axial = 1, + }, + target_correction_factor = { --angular correction rate per second: time_since_fire*target_correction_factor + gun_axial = 1, + player_axial = 1, + }, + angular_velocity_max = { + gun_axial = 2, + player_axial = 2, + }, + angular_velocity = { + gun_axial = {x=0, y=0}, + player_axial = {x=0, y=0}, + }, + angular_velocity_bias = { + gun_axial = {x=1, y=0}, + player_axial = {x=1, y=0}, + }, + target_correction_max_rate = { --the cap for time_since_fire*target_correction_factor + gun_axial = 10000, + player_axial = 10000, + }, + }, + sway = { + max_angle = { + gun_axial = 0, + player_axial = 0, + }, + angular_velocity = { + gun_axial = 0, + player_axial = 0, + }, + }, + walking_offset = { + gun_axial = {x=.2, y=-.2}, + player_axial = {x=1,y=1}, + }, + flash_offset = Vec.new(), + aim_time = 1, + firerateRPM = 10000, + controls = {} + }, + transforms = { + pos = Vec.new(), + player_rotation = Vec.new(), + dir = Vec.new(), + --I'll need all three of them, do some precalculation. + total_offset_rotation = { + gun_axial = Vec.new(), + player_axial = Vec.new(), + }, + recoil = { + gun_axial = Vec.new(), + player_axial = Vec.new(), + }, + sway = { + gun_axial = Vec.new(), + player_axial = Vec.new(), + }, + walking = { + gun_axial = Vec.new(), + player_axial = Vec.new(), + }, + breathing = { + gun_axial = 1, + player_axial = 1, + } + }, + velocities = { + recoil = { + gun_axial = Vec.new(), + player_axial = Vec.new(), + }, + sway = { + gun_axial = Vec.new(), + player_axial = Vec.new(), + }, + }, + particle_spawners = { + --muzzle_smoke + }, + --magic number BEGONE + consts = { + HIP_PLAYER_GUN_ROT_RATIO = .75, + HIPFIRE_BONE = "guns3d_hipfire_bone", + AIMING_BONE = "guns3d_aiming_bone", + HAS_RECOIL = true, + HAS_BREATHING = true, + HAS_SWAY = true, + HAS_WAG = true, + }, + walking_tick = 0, + time_since_last_fire = 0, + time_since_creation = 0, + rechamber_time = 0, + muzzle_flash = Guns4d.muzzle_flash +} +function gun:fire() + if self.rechamber_time <= 0 then + local dir = self:get_dir() + local pos = self:get_pos() + Guns4d.bullet_ray:new({ + player = self.player, + pos = pos, + dir = dir, + range = 100, + gun = self, + force_mmRHA = 1, + dropoff_mmRHA = 0 + }) + self:recoil() + self:muzzle_flash() + self.rechamber_time = 60/self.properties.firerateRPM + end +end +function gun:recoil() + for axis, recoil in pairs(self.velocities.recoil) do + for _, i in pairs({"x","y"}) do + print(i,self.properties.recoil.angular_velocity_bias[axis][i]) + recoil[i] = recoil[i] + (self.properties.recoil.angular_velocity[axis][i]*math.rand_sign((self.properties.recoil.angular_velocity_bias[axis][i]/2)+.5)) + end + end + self.time_since_last_fire = 0 +end +function gun:get_dir(added_pos) + local offset + if added_pos then + offset = true + end + added_pos = Vec.new(added_pos) + local player = self.player + local player_rotation = Vec.new(self.transforms.player_rotation.x, self.transforms.player_rotation.y, 0) + local rotation = self.transforms.total_offset_rotation + local dir = Vec.new(Vec.rotate({x=0, y=0, z=1}, {y=0, x=((rotation.gun_axial.x+rotation.player_axial.x+player_rotation.x)*math.pi/180), z=0})) + dir = Vec.rotate(dir, {y=((rotation.gun_axial.y+rotation.player_axial.y+player_rotation.y)*math.pi/180), x=0, z=0}) + local hud_pos = dir+self:get_pos() + if not false then + local hud = player:hud_add({ + hud_elem_type = "image_waypoint", + text = "muzzle_flash2.png", + world_pos = hud_pos, + scale = {x=10, y=10}, + alignment = {x=0,y=0}, + offset = {x=0,y=0}, + }) + minetest.after(0, function(hud) + player:hud_remove(hud) + end, hud) + end + return dir +end +function gun:get_pos(added_pos) + added_pos = Vec.new(added_pos) + local player = self.player + local handler = self.handler + local bone_location = Vec.new(handler.model_handler.offsets.arm.right)/10 + local gun_offset = Vec.new(self.properties.hip.offset) + local player_rotation = Vec.new(self.transforms.player_rotation.x, self.transforms.player_rotation.y, 0) + if handler.controls.ads then + gun_offset = self.properties.ads.offset + bone_location = Vec.new(0, handler:get_properties().eye_height, 0)+player:get_eye_offset()/10 + else + --minetest is really wacky. + bone_location = Vec.new(-bone_location.x, bone_location.y, bone_location.z) + player_rotation.x = self.transforms.player_rotation.x*self.consts.HIP_PLAYER_GUN_ROT_RATIO + end + gun_offset = gun_offset+added_pos + --dir needs to be rotated twice seperately to avoid weirdness + local rotation = self.transforms.total_offset_rotation + local bone_pos = Vec.rotate(bone_location, {x=0, y=player_rotation.y*math.pi/180, z=0}) + local gun_offset = Vec.rotate(Vec.rotate(gun_offset, {x=(rotation.player_axial.x+player_rotation.x)*math.pi/180,y=0,z=0}), {x=0,y=(rotation.player_axial.y+player_rotation.y)*math.pi/180,z=0}) + --[[local hud_pos = bone_pos+gun_offset+handler:get_pos() + if not false then + local hud = player:hud_add({ + hud_elem_type = "image_waypoint", + text = "muzzle_flash2.png", + world_pos = hud_pos, + scale = {x=10, y=10}, + alignment = {x=0,y=0}, + offset = {x=0,y=0}, + }) + minetest.after(0, function(hud) + player:hud_remove(hud) + end, hud) + end]] + --world pos, position of bone, offset of gun from bone (with added_pos) + return bone_pos+gun_offset+handler:get_pos(), bone_pos, gun_offset +end +function gun:add_entity() + assert(self.instance, "attempt to call object method on a class") + self.entity = minetest.add_entity(self.player:get_pos(), self.name.."_visual") + local obj = self.entity:get_luaentity() + obj.parent_player = self.player + obj:on_step() +end +function gun:has_entity() + assert(self.instance, "attempt to call object method on a class") + if not self.entity then return false end + if not self.entity:get_pos() then return false end + return true +end +function gun:update(dt) + assert(self.instance, "attempt to call object method on a class") + if not self:has_entity() then self:add_entity() end + self.dir = self:get_dir() + self.pos = self:get_pos() + local handler = self.handler + local look_rotation = {x=handler.look_rotation.x,y=handler.look_rotation.y} + local total_rot = self.transforms.total_offset_rotation + local player_rot = self.transforms.player_rotation + local constant = 1.4 + + --player look rotation + local next_vert_aim = ((player_rot.x+look_rotation.x)/(1+((constant*10)*dt)))-look_rotation.x + if math.abs(look_rotation.x-next_vert_aim) > .005 then + player_rot.x = next_vert_aim + else + player_rot.x = look_rotation.x + end + if self.rechamber_time > 0 then + self.rechamber_time = self.rechamber_time - dt + else + self.rechamber_time = 0 + end + self.time_since_creation = self.time_since_creation + dt + self.time_since_last_fire = self.time_since_last_fire + dt + if self.consts.HAS_SWAY then self:update_sway(dt) end + if self.consts.HAS_RECOIL then self:update_recoil(dt) end + if self.consts.HAS_BREATHING then self:update_breathing(dt) end + if self.consts.HAS_WAG then self:update_wag(dt) end + player_rot.y = -handler.look_rotation.y + local offsets = self.transforms + total_rot.player_axial = offsets.recoil.player_axial + offsets.walking.player_axial + offsets.sway.player_axial + {x=offsets.breathing.player_axial,y=0,z=0} + {x=0,y=0,z=0} + total_rot.gun_axial = offsets.recoil.gun_axial + offsets.walking.gun_axial + offsets.sway.gun_axial + if self.handler.controls.ads then + if not self.useless_hud then + self.useless_hud = {} + self.useless_hud.reticle = self.player:hud_add{ + hud_elem_type = "image", + position = {x=.5,y=.5}, + scale = {x=1.5,y=1.5}, + text = "gun_mrkr.png", + } + self.useless_hud.fore = self.player:hud_add{ + hud_elem_type = "image", + position = {x=.5,y=.5}, + scale = {x=10,y=10}, + text = "scope_fore.png", + } + self.useless_hud.back = self.player:hud_add{ + hud_elem_type = "image", + position = {x=.5,y=.5}, + scale = {x=10,y=10}, + text = "scope_back.png", + } + end + local wininfo = minetest.get_player_window_information(self.player:get_player_name()) + if wininfo then + local rot = total_rot.player_axial+total_rot.gun_axial + local ratio = wininfo.size.x/wininfo.size.y + local offset_y = ((-rot.y/(80*2))+.5) + local offset_x = (((-rot.x*ratio)/(80*2))+.5) + self.player:hud_change(self.useless_hud.reticle, "position", {x=offset_y, y=offset_x}) + self.player:hud_change(self.useless_hud.fore, "position", {x=offset_y, y=offset_x}) + self.player:hud_change(self.useless_hud.back, "position", {x=((4*total_rot.player_axial.y/(80*2))+.5), y=(((4*total_rot.player_axial.x*ratio)/(80*2))+.5)}) + end + elseif self.useless_hud then + for i, v in pairs(self.useless_hud) do + self.player:hud_remove(v) + end + self.useless_hud = nil + end +end +function gun:update_wag(dt) + local handler = self.handler + if handler.walking then + self.walking_tick = self.walking_tick + (dt*Vec.length(self.player:get_velocity())) + else + self.walking_tick = 0 + end + local walking_offset = self.transforms.walking + for _, i in pairs({"x","y"}) do + for axis, _ in pairs(walking_offset) do + if handler.walking then + local time = self.walking_tick + local multiplier = 1 + if i == "x" then + multiplier = 2 + end + print(dump(self.properties.walking_offset[axis])) + walking_offset[axis][i] = math.sin((time/1.6)*math.pi*multiplier)*self.properties.walking_offset[axis][i] + else + local old_value = walking_offset[axis][i] + if (math.abs(walking_offset[axis][i]) > .5 and axis=="player_axial") or (math.abs(walking_offset[axis][i]) > .6 and axis=="gun_axial") then + local multiplier = (walking_offset[axis][i]/math.abs(walking_offset[axis][i])) + walking_offset[axis][i] = walking_offset[axis][i]-(dt*2*multiplier) + elseif axis == "gun_axial" then + walking_offset[axis][i] = 0 + end + if math.abs(walking_offset[axis][i]) > math.abs(old_value) then + walking_offset[axis][i] = 0 + end + end + end + end +end +function gun:update_recoil(dt) + for axis, _ in pairs(self.transforms.recoil) do + for _, i in pairs({"x","y"}) do + local recoil = self.transforms.recoil[axis][i] + local recoil_vel = math.clamp(self.velocities.recoil[axis][i],-self.properties.recoil.angular_velocity_max[axis],self.properties.recoil.angular_velocity_max[axis]) + local old_recoil_vel = recoil_vel + recoil = recoil + recoil_vel + if math.abs(recoil_vel) > 0.01 then + --look, I know this doesn't really make sense, but this is the best I can do atm. I've looked for better and mroe intuitive methods, I cannot find them. + --8-(8*(1-(8/100)) + --recoil_vel = recoil_vel-((recoil_vel-(recoil_vel/(1+self.properties.recoil.velocity_correction_factor[axis])))*dt*10) + recoil_vel = recoil_vel * (recoil_vel/(recoil_vel/(self.properties.recoil.velocity_correction_factor[axis]*2))*dt) + else + recoil_vel = 0 + end + if math.abs(recoil_vel)>math.abs(old_recoil_vel) then + recoil_vel = 0 + end + --ax^2+bx+c + --recoil_velocity_correction_rate + --recoil_correction_rate + local old_recoil = recoil + if math.abs(recoil) > 0.001 then + local correction_multiplier = self.time_since_last_fire*self.properties.recoil.target_correction_factor[axis] + local correction_value = recoil*correction_multiplier + correction_value = math.clamp(math.abs(correction_value), 0, self.properties.recoil.target_correction_max_rate[axis]) + recoil=recoil-(correction_value*dt*(math.abs(recoil)/recoil)) + --prevent overcorrection + if math.abs(recoil) > math.abs(old_recoil) then + recoil = 0 + end + end + self.velocities.recoil[axis][i] = recoil_vel + self.transforms.recoil[axis][i] = recoil + end + end +end +function gun:update_breathing(dt) + local breathing_info = {pause=1.4, rate=4.2} + --we want X to be between 0 and 4.2. Since math.pi is a positive crest, we want X to be above it before it reaches our- + --"length" (aka rate-pause), thus it will pi/length or pi/(rate-pause) will represent out slope of our control. + local x = (self.time_since_creation%breathing_info.rate)*math.pi/(breathing_info.rate-breathing_info.pause) + local scale = 1 + --now if it's above math.pi we know it's in the pause half of the cycle. For smoothness, we cut the sine off early and decay the value linearly. + if x > math.pi*(8/9) then + self.transforms.breathing.player_axial=self.transforms.breathing.player_axial-(self.transforms.breathing.player_axial*2*dt) + else + self.transforms.breathing.player_axial = scale*(math.sin(x)) + end +end +function gun:update_sway(dt) + for axis, sway in pairs(self.transforms.sway) do + local sway_vel = self.velocities.sway[axis] + local ran + ran = Vec.apply(Vec.new(), function(i,v) + if i ~= "x" then + return (math.random()-.5)*2 + end + end) + ran.z = 0 + sway_vel = Vec.normalize(sway_vel+(ran*dt))*self.properties.sway.angular_velocity[axis] + sway=sway+(sway_vel*dt) + if Vec.length(sway) > self.properties.sway.max_angle[axis] then + sway=Vec.normalize(sway)*self.properties.sway.max_angle[axis] + sway_vel = Vec.new() + end + self.transforms.sway[axis] = sway + self.velocities.sway[axis] = sway_vel + end + print(self.transforms.sway) +end +function gun:prepare_deletion() + assert(self.instance, "attempt to call object method on a class") + if self:has_entity() then self.entity:remove() end +end +gun.construct = function(def) + if def.instance then + --remember to give gun an id + assert(def.itemstack, "no itemstack provided for initialized object") + assert(def.player, "no player provided") + local meta = def.itemstack:get_meta() + if meta:get_string("guns4d_id") == "" then + local id = tostring(Unique_id.generate()) + meta:set_string("guns4d_id", id) + def.player:set_wielded_item(def.itemstack) + def.id = id + else + def.id = meta:get_string("guns4d_id") + end + --make sure there's nothing missing + def.properties = table.fill(gun.properties, def.properties) + --Vecize + def.transforms = table.deep_copy(gun.transforms) + for i, tbl in pairs(def.transforms) do + if tbl.gun_axial and tbl.player_axial and (not i=="breathing") then + tbl.gun_axial = Vec.new(tbl.gun_axial) + tbl.player_axial = Vec.new(tbl.player_axial) + end + end + def.velocities = table.deep_copy(gun.velocities) + for i, tbl in pairs(def.velocities) do + if tbl.gun_axial and tbl.player_axial then + tbl.gun_axial = Vec.new(tbl.gun_axial) + tbl.player_axial = Vec.new(tbl.player_axial) + end + end + elseif def.name ~= "__template__" then + local props = def.properties + assert(def.name, "no name provided") + assert(def.itemstring, "no itemstring provided") + --(this tableref is ephermeral after constructor is called, see instantiatable_class) + Guns4d.gun.registered[def.name] = def + minetest.register_entity(def.name.."_visual", { + initial_properties = { + visual = "mesh", + mesh = props.mesh, + textures = props.textures, + glow = 0, + pointable = false, + static_save = false, + }, + on_step = function(self, dtime) + local name = string.gsub(self.name, "_visual", "") + local obj = self.object + if not self.parent_player then obj:remove() return end + local player = self.parent_player + local handler = Guns4d.players[player:get_player_name()].handler + local lua_object = handler.gun + if not lua_object then obj:remove() return end + --this is changing the point of rotation if not aiming, this is to make it look less shit. + local axial_modifier = Vec.new() + if not handler.controls.ads then + local pitch = lua_object.transforms.total_offset_rotation.player_axial.x+lua_object.transforms.player_rotation.x + axial_modifier = Vec.new(pitch*(1-lua_object.consts.HIP_PLAYER_GUN_ROT_RATIO),0,0) + end + local axial_rot = lua_object.transforms.total_offset_rotation.gun_axial+axial_modifier + --attach to the correct bone, and rotate + if handler.controls.ads == false then + local normal_pos = Vec.new(props.hip.offset)*10 + -- Vec.multiply({x=normal_pos.x, y=normal_pos.z, z=-normal_pos.y}, 10) + obj:set_attach(player, gun.consts.HIPFIRE_BONE, normal_pos, -axial_rot, true) + else + local normal_pos = (props.ads.offset+Vec.new(props.ads.horizontal_offset,0,0))*10 + obj:set_attach(player, gun.consts.AIMING_BONE, normal_pos, -axial_rot, true) + end + end + }) + end +end +Guns4d.gun = Instantiatable_class:inherit(gun) \ No newline at end of file diff --git a/classes/Instantiatable_class.lua b/classes/Instantiatable_class.lua new file mode 100644 index 0000000..65cb4b5 --- /dev/null +++ b/classes/Instantiatable_class.lua @@ -0,0 +1,35 @@ +Instantiatable_class = { + instance = false +} +--not that construction change is NOT called for inheriting an object. +function Instantiatable_class:inherit(def) + --construction chain for inheritance + if not def then def = {} else def = table.shallow_copy(def) end + def.instance = false + def._construct_low = def.construct + --this effectively creates a construction chain by overwriting .construct + function def.construct(parameters) + --rawget because in a instance it may only be present in a hierarchy but not the table itself + if rawget(def, "_construct_low") then + def._construct_low(parameters) + end + if self.construct then + self.construct(parameters) + end + end + def.construct(def) + --iterate through table properties + setmetatable(def, {__index = self}) + return def +end +function Instantiatable_class:new(def) + if not def then def = {} else def = table.shallow_copy(def) end + def.instance = true + function def:inherit(def) + assert(false, "cannot inherit instantiated object") + end + setmetatable(def, {__index = self}) + --call the construct chain for inherited objects, also important this is called after meta changes + self.construct(def) + return def +end \ No newline at end of file diff --git a/classes/Player_handler.lua b/classes/Player_handler.lua new file mode 100644 index 0000000..84b57d8 --- /dev/null +++ b/classes/Player_handler.lua @@ -0,0 +1,195 @@ +local Vec = vector +local default_active_controls = { + ads = false +} +local player_handler = { + --player = playerref + --name = playername + --wielded_item = ItemStack + --gun = Gun (class) + --wield_index = Int + --model_handler = player_model_handler + look_rotation = {x=0, y=0}, + look_offset = Vec.new(), + ads_location = 0, + controls = {}, + horizontal_offset = 0 +} +local model_handler = Guns4d.player_model_handler +function player_handler:update(dt) + assert(self.instance, "attempt to call object method on a class") + local player = self.player + self.wielded_item = self.player:get_wielded_item() + local held_gun = self:holding_gun() --get the gun class that is associated with the held gun + if held_gun then + --was there a gun last time? did the wield index change? + local old_index = self.wield_index + self.wield_index = player:get_wield_index() + --if gun has changed or was not held, then reset. + if (not self.gun) or (self.gun.id ~= self.wielded_item:get_meta():get_string("guns4d_id")) then + --initialize all handlers + ----gun handler---- + if self.gun then --delete gun object if present + self.gun:prepare_deletion() + self.gun = nil + end + self.gun = held_gun:new({itemstack=self.wielded_item, player=self.player, handler=self}) --this will set itemstack meta, and create the gun based off of meta and other data. + ----model handler---- + if self.model_handler then --if model_handler present, then delete + self.model_handler:prepare_deletion() + self.model_handler = nil + end + self.model_handler = model_handler.get_handler(self:get_properties().mesh):new({player=self.player}) + ----control handler---- + self.control_handler = Guns4d.control_handler:new({player=player, controls=self.gun.properties.controls}) + --reinitialize some handler data and set set_hud_flags + self.horizontal_offset = self.gun.properties.ads.horizontal_offset + player:hud_set_flags({wielditem = false, crosshair = false}) + end + self.look_rotation.x, self.look_rotation.y = player:get_look_vertical()*180/math.pi, -player:get_look_horizontal()*180/math.pi + --update handlers + self.control_handler:update(dt) + self.model_handler:update(dt) + self.gun:update(dt) + elseif self.gun then + self.control_handler = nil + --delete gun object + self.gun:prepare_deletion() + self.gun = nil + self:reset_controls_table() --return controls to default + --delete model handler object (this resets the player model) + self.model_handler:prepare_deletion() + self.model_handler = nil + player:hud_set_flags({wielditem = true, crosshair = true}) --reenable hud elements + end + --eye offsets + if self.controls.ads and (self.ads_location<1) then + self.ads_location = math.clamp(self.ads_location + (dt/self.gun.properties.aim_time), 0, 1) + elseif (not self.controls.ads) and self.ads_location>0 then + local divisor = .4 + if self.gun then + divisor = self.gun.properties.aim_time + end + self.ads_location = math.clamp(self.ads_location - (dt/divisor), 0, 1) + end + self.look_offset.x = self.horizontal_offset*self.ads_location + player:set_eye_offset(self.look_offset*10) + --some status stuff + if TICK % 2 == 0 then + self.touching_ground = self:get_is_on_ground() + end + self.walking = self:get_is_walking() + --stored properties and pos must be reset as they could be outdated. + self.properties = nil + self.pos = nil +end +function player_handler:get_is_on_ground() + assert(self.instance, "attempt to call object method on a class") + local touching_ground = false + local player = self.player + local player_properties = self:get_properties() + local ray = minetest.raycast(self:get_pos()+vector.new(0, self:get_properties().eye_height, 0), self:get_pos()-vector.new(0,.1,0), true, true) + for pointed_thing in ray do + if pointed_thing.type == "object" then + if pointed_thing.ref ~= player and pointed_thing.ref:get_properties().physical == true then + touching_ground = true + end + end + if pointed_thing.type == "node" then + touching_ground = true + end + end + return touching_ground +end +function player_handler:get_is_walking() + assert(self.instance, "attempt to call object method on a class") + local walking = false + local velocity = self.player:get_velocity() + local controls + if not self.control_handler then + controls = self.player:get_player_control() + else + controls = self.control_handler.player_pressed + end + if (vector.length(vector.new(velocity.x, 0, velocity.z)) > .1) and (controls.up or controls.down or controls.left or controls.right) and self.touching_ground then + walking = true + end + return walking +end +--resets the controls bools table for the player_handler +function player_handler:reset_controls_table() + assert(self.instance, "attempt to call object method on a class") + self.controls = table.deep_copy(default_active_controls) +end +--doubt I'll ever use this... but just in case I don't want to forget. +function player_handler:get_pos() + assert(self.instance, "attempt to call object method on a class") + if self.pos then return self.pos end + self.pos = self.player:get_pos() + return self.pos +end +function player_handler:set_pos(val) + assert(self.instance, "attempt to call object method on a class") + self.pos = vector.new(val) + self.player:set_pos(val) +end +function player_handler:get_properties() + assert(self.instance, "attempt to call object method on a class") + if self.properties then return self.properties end + self.properties = self.player:get_properties() + return self.properties +end +function player_handler:set_properties(properties) + assert(self.instance, "attempt to call object method on a class") + self.player:set_properties(properties) + self.properties = table.fill(self.properties, properties) +end +function player_handler:holding_gun() + assert(self.instance, "attempt to call object method on a class") + if self.wielded_item then + for name, obj in pairs(Guns4d.gun.registered) do + if obj.itemstring == self.wielded_item:get_name() then + return obj + end + end + end +end +function player_handler:update_wield_item(wield, meta) + assert(self.instance, "attempt to call object method on a class") + local stack = self.wielded_item + if wield then + stack = ItemStack(wield) + end + if meta then + local tbl = meta + if type(meta) ~= "table" then + tbl = meta:to_table() + end + stack:from_table(tbl) + end + self.player:set_wielded_item(stack) + return stack +end +function player_handler:prepare_deletion() + assert(self.instance, "attempt to call object method on a class") + if self.gun then + self.gun:prepare_deletion() + self.gun = nil + end +end +--note that construct is NOT called as a method +function player_handler.construct(def) + if def.instance then + def.old_mesh = def.player:get_properties().mesh + assert(def.player, "no player obj provided to player_handler on construction") + --this is important, as setting a value within a table would set it for all tables otherwise + for i, v in pairs(player_handler) do + if (type(v) == "table") and not def[i] then + def[i] = v + end + end + def.look_rotation = table.deep_copy(player_handler.look_rotation) + def.controls = table.deep_copy(default_active_controls) + end +end +Guns4d.player_handler = Instantiatable_class:inherit(player_handler) diff --git a/classes/Player_model_handler.lua b/classes/Player_model_handler.lua new file mode 100644 index 0000000..1a696a9 --- /dev/null +++ b/classes/Player_model_handler.lua @@ -0,0 +1,78 @@ +local Vec = vector +--[[offsets = { + head = vector.new(0,6.3,0), + arm_right = vector.new(-3.15, 5.5, 0), + arm_right_global = vector.new(-3.15, 11.55, 0), --can be low precision + arm_left = vector.new(3.15, 5.5, 0), + arm_left_global = vector.new(3.15, 11.55, 0), +}]] +Guns4d.player_model_handler = { + offsets = { + arm = { + right = Vec.new(-3.15, 11.55, 0), + rltv_right = Vec.new(-3.15, 5.5, 0), + left = Vec.new(3.15, 11.55, 0), + rltv_left = Vec.new(3.15, 5.5, 0) + }, + head = Vec.new(0,6.3,0) + }, + handlers = {}, + mesh = "guns3d_character.b3d" +} +local player_model = Guns4d.player_model_handler +function player_model:set_default_handler() + assert(not self.instance, "cannot set default handler to an instance of a handler") + player_model.default_handler = self +end +function player_model:get_handler(meshname) + local selected_handler = player_model.handlers[meshname] + if selected_handler then return selected_handler end + return player_model.default_handler +end +function player_model:update() + assert(self.instance, "attempt to call object method on a class") + local player = self.player + local handler = Guns4d.players[player:get_player_name()].handler + local gun = handler.gun + local player_axial_offset = gun.transforms.total_offset_rotation.player_axial + local pitch = player_axial_offset.x+gun.transforms.player_rotation.x + local combined = player_axial_offset+gun.transforms.total_offset_rotation.gun_axial+Vec.new(gun.transforms.player_rotation.x,0,0) + local eye_pos = vector.new(0, handler:get_properties().eye_height*10, 0) + player:set_bone_position("guns3d_hipfire_bone", self.offsets.arm.rltv_right, vector.new(-(pitch*gun.consts.HIP_PLAYER_GUN_ROT_RATIO), 180-player_axial_offset.y, 0)) + player:set_bone_position("guns3d_aiming_bone", eye_pos, vector.new(pitch, 180-player_axial_offset.y, 0)) + player:set_bone_position("guns3d_reticle_bone", eye_pos, vector.new(combined.x, 180-combined.y, 0)) + player:set_bone_position("guns3d_head", self.offsets.head, {x=pitch,z=0,y=0}) +end +function player_model:prepare_deletion() + assert(self.instance, "attempt to call object method on a class") + local handler = Guns4d.players[self.player:get_player_name()].handler + local properties = handler:get_properties() + if minetest.get_modpath("player_api") then + player_api.set_model(self.player, self.old) + end + properties.mesh = self.old + handler:set_properties(properties) +end +---@diagnostic disable-next-line: duplicate-set-field +function player_model.construct(def) + if def.instance then + assert(def.mesh, "model has no mesh") + assert(def.player, "no player provided") + local handler = Guns4d.players[def.player:get_player_name()].handler + local properties = handler:get_properties() + def.old = properties.mesh + --set the model + if minetest.get_modpath("player_api") then + player_api.set_model(def.player, def.mesh) + end + properties.mesh = def.mesh + handler:set_properties(properties) + else + if def.replace then + player_model.handlers[def.replace] = def + end + end +end +Guns4d.player_model_handler = Instantiatable_class:inherit(player_model) +Guns4d.player_model_handler:set_default_handler() + diff --git a/classes/raycast_defunked.lua b/classes/raycast_defunked.lua new file mode 100644 index 0000000..78ce11e --- /dev/null +++ b/classes/raycast_defunked.lua @@ -0,0 +1,159 @@ +function guns3d.ray(player, pos, dir, def, bullet_info) + --"transverse" just means in a node + --"free" means in open air + local playername = player:get_player_name() + local is_first_iter = false + local constant = .7 + local normal + ----------------------------------------------------------initialize------------------------------------------------------------------ + if not bullet_info then + is_first_iter = true + bullet_info = { + history = {}, + state = "free", + last_pos = pos, + last_node = "", + last_normal = vector.new(), + end_direction = dir, + range_left = def.bullet.range, + penetrating_force = def.bullet.penetration_RHA + --last_pointed + } + end + table.insert(bullet_info.history, {start_pos=pos, state=bullet_info.state, normal=bullet_info.last_normal, end_direction = bullet_info.end_direction}) + --set ray end + local pos2 = pos+(dir*bullet_info.range_left) + local block_ends_early = false + --if was last in a block, check where the "transverse" state should end. + --------------------------------------------------prepare for raycast -------------------------------------------------------------- + if bullet_info.state == "transverse" then + local pointed + local ray = minetest.raycast(pos+(dir*(constant+.01)), pos, false, false) + for p in ray do + if p.type == "node" and (table.compare(p.under, bullet_info.last_pointed.under) or not minetest.registered_nodes[minetest.get_node(bullet_info.last_pointed.under).name].node_box) then + pointed = p + break + end + end + --maybe remove check for pointed + if pointed and vector.distance(pointed.intersection_point, pos) < constant then + pos2 = pointed.intersection_point + block_ends_early = true + normal = pointed.intersection_normal + bullet_info.end_direction = vector.direction(dir, vector.new()) + else + pos2 = pos+(dir*constant) + end + end + -----------------------------------------------------------raycast-------------------------------------------------------------- + local ray = minetest.raycast(pos, pos2, true, true) + local pointed + local next_ray_pos = pos2 + for p in ray do + if vector.distance(p.intersection_point, bullet_info.last_pos) > 0.0005 and vector.distance(p.intersection_point, bullet_info.last_pos) < bullet_info.range_left then + local distance = vector.distance(pos, p.intersection_point) + --if it's a node, check that it's note supposed to be ignored according to it's generated properties + if p.type == "node" and guns3d.node_properties[minetest.get_node(p.under).name].behavior ~= "ignore" then + local next_penetration_val = bullet_info.penetrating_force-(distance*guns3d.node_properties[minetest.get_node(p.under).name].rha*1000) + if bullet_info.state ~= "transverse" then + pointed = p + --print(dump(p)) + bullet_info.state = "transverse" + next_ray_pos = p.intersection_point + else + pointed = p + if minetest.get_node(p.under).name ~= bullet_info.last_node and next_penetration_val > 0 and guns3d.node_properties[minetest.get_node(p.under).name].behavior ~= "ignore" then + next_ray_pos = p.intersection_point + end + end + break + end + --if it's an object, make sure it's not the player object + --note that while it may seem like this will create a infinite hit loop, it resolves itself as the intersection_point of the next ray will be close enough as to skip the pointed. See first line of iterator. + if p.type == "object" and p.ref ~= player then + --apply force dropoff + local next_penetration_val = bullet_info.penetrating_force-def.bullet.penetration_dropoff_RHA*distance + if bullet_info.state == "transverse" then + next_penetration_val = bullet_info.penetrating_force-(distance*guns3d.node_properties[minetest.get_node(bullet_info.last_pointed.under).name].rha*1000) + end + --insure there's still penetrating force left to actually damage the player + if bullet_info.penetrating_force > 0 then + if (bullet_info.state == "transverse" and next_penetration_val > 0) or (bullet_info.state == "free" and bullet_info.penetrating_force-def.bullet.penetration_dropoff_RHA*distance > 0) then + local penetration_val = next_penetration_val + if bullet_info.state == "free" then + bullet_info.penetrating_force = next_penetration_val + penetration_val = bullet_info.penetrating_force + end + local damage = math.floor((def.bullet.damage*(next_penetration_val/def.bullet.penetration_RHA))+1) + p.ref:punch(player, nil, {damage_groups = {fleshy = damage}}, dir) + if p.ref:is_player() then + --TODO: finish + end + end + end + end + end + end + ---------------------prepare for recursion--------------------------------------------------------------------------------- + local penetration_loss = def.bullet.penetration_dropoff_RHA + local distance = vector.distance(pos, next_ray_pos) + local new_dir = dir + local node_properties + if pointed then + node_properties = guns3d.node_properties[minetest.get_node(pointed.under).name] + end + if pointed and (not normal) then + normal = pointed.intersection_normal + else + normal = vector.new() + end + if not bullet_info.end_direction then + bullet_info.end_direction = new_dir + end + --we know if the first raycast didn't find it ended early, or if there wasn't a hit, that it isn't in a block + if block_ends_early or not pointed then + bullet_info.state = "free" + end + --calculate penetration loss, and simulate loss of accuracy + if bullet_info.history[#bullet_info.history].state == "transverse" and pointed then + local rotation = vector.apply(vector.new(), function(a) + a=a+(((math.random()-.5)*2)*node_properties.random_deviation*def.bullet.penetration_deviation*distance) + return a + end) + new_dir = vector.rotate(new_dir, rotation*math.pi/180) + penetration_loss = node_properties.rha*1000 + end + --set the current bullet info. + bullet_info.penetrating_force=bullet_info.penetrating_force-(penetration_loss*distance) + bullet_info.range_left = bullet_info.range_left-distance + bullet_info.last_pointed = pointed + bullet_info.last_normal = normal + bullet_info.last_pos = pos + + --set the last node + if pointed then + bullet_info.last_node = minetest.get_node(pointed.under).name + end + --recurse. + if bullet_info.range_left > 0.001 and bullet_info.penetrating_force > 0 then + guns3d.ray(player, next_ray_pos, new_dir, def, bullet_info) + end + -------------------------- visual ------------------------------------------------------------------------------------- + if is_first_iter then + for i, val in pairs(bullet_info.history) do + if not table.compare(val.normal, vector.new()) then + guns3d.handle_node_hit_fx(val.normal, val.end_direction, val.start_pos) + end + end + end +end +local raycast = { + history = {}, + state = "free", + last_pos = pos, + last_node = "", + last_normal = vector.new(), + end_direction = dir, + range_left = def.bullet.range, + penetrating_force = def.bullet.penetration_RHA +} \ No newline at end of file diff --git a/gun_api.lua b/gun_api.lua new file mode 100644 index 0000000..c66ac20 --- /dev/null +++ b/gun_api.lua @@ -0,0 +1,98 @@ +local Vec = vector +local default_def = { + --name = + --itemstring = + --textures = {} + --mesh = (media) + hip = { + offset = Vec.new(0,0,.2), + }, + ads = { + offset = Vec.new(0,0,.1), + horizontal_offset = .1, + }, + recoil = { + velocity_correction_factor = { + gun_axial = 2, + player_axial = 2, + }, + target_correction_factor = { --angular correction rate per second: time_since_fire*target_correction_factor + gun_axial = 30, + player_axial = 1, + }, + target_correction_max_rate = { --the cap for time_since_fire*target_correction_factor + gun_axial = 100, + player_axial = 6, + }, + angular_velocity_max = { + gun_axial = 0, + player_axial = 0, + }, + angular_velocity = { + gun_axial = {x=.2, y=.25}, + player_axial = {x=.25, y=.4}, + }, + }, + firerateRPM = 600, + controls = { + aim = { + conditions = {"RMB"}, + loop = false, + timer = 0, + func = function(active, interrupted, data, busy_list, handler) + if active then + handler.controls.ads = not handler.controls.ads + end + end + }, + fire = { + conditions = {"LMB"}, + loop = true, + timer = 0, + func = function(active, interrupted, data, busy_list, handler) + handler.gun:fire() + end + } + }, + consts = { + HIP_PLAYER_GUN_ROT_RATIO = .6 + }, + aim_time = .5 +} +local valid_ctrls = { + up=true, + down=true, + left=true, + right=true, + jump=true, + aux1=true, + sneak=true, + dig=true, + place=true, + LMB=true, + RMB=true, + zoom=true, +} +function Guns4d.register_gun_default(def) + assert(def, "no definition table provided") + assert(def.name, "no name provided when registering gun") + assert(def.itemstring, "no itemstring provided when registering gun") + local new_def = {} + new_def.consts = def.consts + new_def.name = def.name; def.name = nil + new_def.itemstring = def.itemstring; def.itemstring = nil + new_def.properties = table.fill(default_def, def) + --validate controls + if new_def.properties.controls then + for i, control in pairs(new_def.properties.controls) do + assert(control.conditions, "no conditions provided for control") + for _, condition in pairs(control.conditions) do + if not valid_ctrls[condition] then + assert(false, "invalid key: '"..condition.."'") + end + end + end + end + --gun is registered within this function + Guns4d.gun:inherit(new_def) +end \ No newline at end of file diff --git a/init.lua b/init.lua new file mode 100644 index 0000000..c671907 --- /dev/null +++ b/init.lua @@ -0,0 +1,51 @@ +local Vec = vector +Guns4d = { + players = {} +} +local path = minetest.get_modpath("guns4d") +dofile(path.."/misc_helpers.lua") +dofile(path.."/visual_effects.lua") +dofile(path.."/gun_api.lua") +dofile(path.."/block_values.lua") +path = path .. "/classes" +dofile(path.."/Instantiatable_class.lua") +dofile(path.."/Bullet_ray.lua") +dofile(path.."/Control_handler.lua") +dofile(path.."/Gun.lua") +dofile(path.."/Player_model_handler.lua") +dofile(path.."/Player_handler.lua") + +--load after +path = minetest.get_modpath("guns4d") + + +local player_handler = Guns4d.player_handler +local gun = Guns4d.gun + + + +minetest.register_on_joinplayer(function(player) + local pname = player:get_player_name() + Guns4d.players[pname] = { + handler = player_handler:new({player=player}) + } + player:set_fov(80) +end) +minetest.register_on_leaveplayer(function(player) + local pname = player:get_player_name() + Guns4d.players[pname].handler:prepare_deletion() + Guns4d.players[pname] = nil +end) +TICK = 0 +minetest.register_globalstep(function(dt) + TICK = TICK + 1 + if TICK > 100000 then TICK = 0 end + for player, obj in pairs(Guns4d.players) do + if not obj.handler then + --spawn the player handler. The player handler handles the gun(s), + --the player's model, and controls + obj.handler = player_handler:new({player=player}) + end + obj.handler:update(dt) + end +end) \ No newline at end of file diff --git a/misc_helpers.lua b/misc_helpers.lua new file mode 100644 index 0000000..70912dd --- /dev/null +++ b/misc_helpers.lua @@ -0,0 +1,129 @@ +--can't be copyright claimed by myself, luckily... well actually knowing the legal system I probably could sue myself. +Unique_id = { + generated = {}, +} +function math.clamp(val, lower, upper) + if lower > upper then lower, upper = upper, lower end + return math.max(lower, math.min(upper, val)) +end +function Unique_id.generate() + local genned_ids = Unique_id.generated + local id = string.sub(tostring(math.random()), 3) + while genned_ids[id] do + id = string.sub(tostring(math.random()), 3) + end + genned_ids[id] = true + return id +end +function math.rand_sign(b) + b = b or .5 + local int = 1 + if math.random() > b then int=-1 end + return int +end +--for table vectors that aren't vector objects +---@diagnostic disable-next-line: lowercase-global +function tolerance_check(a,b,tolerance) + return math.abs(a-b) > tolerance +end +function vector.equals_tolerance(v, vb, tolerance) + tolerance = tolerance or 0 + return ( + tolerance_check(v.x, vb.x, tolerance) and + tolerance_check(v.y, vb.y, tolerance) and + tolerance_check(v.z, vb.z, tolerance) + ) +end +--copy everything +function table.deep_copy(tbl, copy_metatable, indexed_tables) + if not indexed_tables then indexed_tables = {} end + local new_table = {} + local metat = getmetatable(tbl) + if metat then + if copy_metatable then + setmetatable(new_table, table.deep_copy(metat, true)) + else + setmetatable(new_table, metat) + end + end + for i, v in pairs(tbl) do + if type(v) == "table" then + if not indexed_tables[v] then + indexed_tables[v] = true + new_table[i] = table.deep_copy(v, copy_metatable) + end + else + new_table[i] = v + end + end + return new_table +end +--replace elements in tbl with elements in replacement, but preserve the rest +function table.fill(tbl, replacement, preserve_reference, indexed_tables) + if not indexed_tables then indexed_tables = {} end --store tables to prevent circular referencing + local new_table = tbl + if not preserve_reference then + new_table = table.deep_copy(tbl) + end + for i, v in pairs(replacement) do + if new_table[i] then + if type(v) == "table" and type(replacement[i]) == "table" then + if not indexed_tables[v] then + indexed_tables[v] = true + new_table[i] = table.fill(tbl[i], replacement[i], false, indexed_tables) + end + elseif type(replacement[i]) == "table" then + new_table[i] = table.deep_copy(replacement[i]) + else + new_table[i] = replacement[i] + end + else + new_table[i] = replacement[i] + end + end + return new_table +end +--fill "holes" in the tables. +function table.fill_in(tbl, replacement, preserve_reference, indexed_tables) + if not indexed_tables then indexed_tables = {} end --store tables to prevent circular referencing + local new_table = tbl + if not preserve_reference then + new_table = table.deep_copy(tbl) + end + for i, v in pairs(replacement) do + if new_table[i]==nil then + if type(v)=="table" then + new_table[i] = table.deep_copy(v) + else + new_table[i] = v + end + else + if (type(new_table[i]) == "table") and (type(v) == "table") then + table.fill_in(new_table[i], v, true, indexed_tables) + end + end + end + return new_table +end +--for class based OOP, ensure values containing a table in btbl are tables in a_tbl- instantiate, but do not fill. +function table.instantiate_struct(tbl, btbl, indexed_tables) + if not indexed_tables then indexed_tables = {} end --store tables to prevent circular referencing + for i, v in pairs(btbl) do + if type(v) == "table" and not indexed_tables[v] then + indexed_tables[v] = true + if not tbl[i] then + tbl[i] = table.instantiate_struct({}, v, indexed_tables) + elseif type(tbl[i]) == "table" then + tbl[i] = table.instantiate_struct(tbl[i], v, indexed_tables) + end + end + end + return tbl +end +function table.shallow_copy(t) + local new_table = {} + for i, v in pairs(t) do + new_table[i] = v + end + return new_table +end \ No newline at end of file diff --git a/model_api.lua b/model_api.lua new file mode 100644 index 0000000..e69de29 diff --git a/models/guns3d_character.b3d b/models/guns3d_character.b3d new file mode 100644 index 0000000000000000000000000000000000000000..73a3c0d693a17ec5ae4635e36423bd63d35b37e2 GIT binary patch literal 100873 zcmeI*cU%+M9zXnmfW7yQ9lH=vQe?1q#f}}ZU279l2o%~*n&*1gB9d93R^9WvFny8Pr z#l6m5pZmRhorfzTw#{QZ*g6C619w|ko89Z&^#y15mDW1Bud?6E+bs7LYcsDe$9ANq zUbnmZ#UQpVq{OlAwdK!X>ul_E55l@ba(&T!-Bx_BdtIq+q;Ob8_xG{ zT=qKn>}dBo8-FibC)dZ`E3aeq$^9J7->dZ*Y@OD7**f=oZBnDNS;i`t?1$uSW7`qT z*4bfQZTEHyu_fp$=HV`XGv(AMSPMS>N+@>=>6FTj$=t?)UO_n(t-xjezrs)#X{Ad!77V zjnClqxgBo{Z?n9P^_9Giz1O|YU7!2C?l#NovbT*Nrykp85MzYAjt0j~5#| z-*TLT(3TwMs@Aav=Ou5m=W(h$?hR}o@#9Z@Ou~5-tvqLfp)HH}x&%J{WuMc09lYi; z7}z=kJAe5)>?^*Gy_cQ8@_QS>IzC45b?)=hy-w@B@@KI38YHbTM{8_?eu-w==H5r{ zzIU$+X7%OhE3JK=bBs`rCE0z-_pkgJ>?q~OhDTf2I=L;wK@ zWuLO~kMB#5zL&>IsGnaeRL2Wnr#fEFE00rl&Me~V-0zjwvEvV3bFsFuqV*Zx-pfA2 z{a#)lKX%>gczqt{0{aZvvG=Ol!r$v&=e;fNHp|Do@|wr4gZzBU(J#<0tx<*<6MgSqC!hQ7b6V~z z*e;K8Tt4oV(cff;vUt-^z*n_QN%j^*ZB@jvgl-#(?p67#-7fK!| z`Ei*&F9d~s4J!bpFfOy_#h}1fHA4|7#c`QEF9oF}loC)%<1%|*4oX=lWuTPDW%j%h zl!{O)K&gz&?0HovRiFezsRo5Dv*$IT)PPbQN-bPw&+9;`4J8ChU0i0**_YS)Q0hTx zh|BDG7?e;bji4BDnLTd|B?3w~lqR^$o|~bVphQBk;4*v8PAqmovO-}yi!HO~&7m}d z5)GvV6t>Ksw}#RRN=qnhaG5=C52YQHwop3YGJD<`N+&2Cp>)Az_PiUEu25p2bjM}( zycd+7PKsFM_fV$^s~hahW||24yLfB~X^* zGJC!X%1S6JpsdDa_Ixdr6ew$;tixsYd?S<%P}W1)gv;#t7AUDuHbdEp%k23MDBGcI zgR&Es+4J2{c0oylvIh!VX3zIS*#~7WlmocTo;T~_ISnrO=`}543kpV&(J(^ z=yXHT)xA!#8$bSMvW-iPCOqtrGAY9IknFlj3 zWU|rvpr@9%#N6yFgs&* z!HmJ|irEdbJ7y0|HrTO8FFE+2$DYRGav#jTnEf#O^R!6=Fb84|!i?i74}$DzJT4Ex z9Ev#%b2w%K<_OG@n4>U9V~)Wbi#ZN65i<#MJmv(=-CVM&!m#1US zz?_LW3v)K+9L!`)8|GZhd6@Gt7ho>LT!gt8a|z~B%w?F%F;`% W2B8gmV13g%kO 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 literal 0 HcmV?d00001 diff --git a/models/guns3d_character.blend b/models/guns3d_character.blend new file mode 100644 index 0000000000000000000000000000000000000000..c6290dc00949e8933555366213333ff6f6522f99 GIT binary patch literal 710180 zcmeEv2Vfq>(e}wzm}U$F(M1WEP=gH!EG)@YPF#d#Y(W57mR?)JYEdyV&7wwhC!q*J zaf3J^A$*j?U?bUvB+3Wm<4*!O1Ofy?3?ZR|AO!t0xAW}nt?u3?xk!G`ezoOxX6Koi zEw{IKH*V_0=@TZ-Ja*BES)*oBG~aQY=HK4)^PMT=BTWU)%M=!tMyex{P9~T&v2a#8 zaUA*F{g>Y*j5%nQ9|dz$zmyJAK9KT(lneQ>RUDm^OX-qUkecG|}(E83hFw z)9;cQ1!r8!@#!-PF647uhRYI79n;r}$#L*WJ?c)AqZxhRo)BX#Z{Ps6|AjX)$*Mz3d`dfTQX#aF=e_?m~ z$JZAS?M3~~=D@R~w0~OPxhUNJ{=UGzJ|Nmlps)TI?g;I_;EXdaj&6Uy517{oM0;s} zv^!(kQQH6PIYmpByYoKu`O!lEb>i$fbDI0B{ly378ht>&T>qPO=IkZQSFY?z#s`SD z-`amiY5!-P{hiBP`->06=Lf1EIP2`QFHg1qzI{LNoO92+eEG^%UD^lY?h96QopbKF zSM*o=?JD z)8=-Zt`7tHf%yx{uj#M$-%;9s#rfx7vtre%u4H_myyE=p`m6nSl=i={vhq6D{z>@2 z`3ozr@2~dXQQCiHb@lby{_F$vi+4V-u&V0D{%ZgJ)c$Fo)_3V%?IOBgv-msboO|iH z=bd+1S!Djz)PApRx%S%MtXOrgYj@KR;_-p+wOsSt^7GHXmaYS?rgfytXf1IG-%sW} zMZB-Lulol1z+B_kXV?GlUbg)GmG|D;<^IUlD_wiD&4Yfb4@jgR2)ciG=iT>wK=$XO zPd+cvpV~j&xBpPvpZy>KABa9L48AU4f4J+Odp=U;@0<2#zct$aT=s{)>dUmZ_v4lK z-bd}9f6@=c^aHOSNX7^5x@XzPecAqOZ`1yL)%GkmwZ~69`zPlE@yrLzap3M{%RcSP z_Gi7B_Gf?St3E($_@DaizlD6jSRcw|&4r7a;q0 z_GSCC-c0+mKlD`}pt=0#tMvHKcDH}=TpM`vf$*`w^8uQ3e%_bu&-OO$-&bwVa+CeP zSasihUGA@&?coc(>jPx}FZ#0mS#PHO*&q6<573uiBpF_Uyk^eV|X+ipZ%e)`heg5@%n&&oiOUXg21`J%0Auy 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 literal 0 HcmV?d00001 diff --git a/textures/gun_mrkr.png b/textures/gun_mrkr.png new file mode 100644 index 0000000000000000000000000000000000000000..9bad1e22f90cd4c3a913591e9e9fe97c7c742570 GIT binary patch literal 494 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 lD3dOZ|CblZEN4f^8Df?Qnv!h$)t5|EKdojC2V z+rh44>9d`V0gWp51Vdkod@5wOCUJTTmmIzWq8(~?3!qU&2?AV%*BwZRM%+e~YIkN+ zC!M6DFXLzNonnvClcJH$A$nj?%;x4AnlSp*Hi#XvA@gebF>z*(F_xl10lwSEqDJ%U z@30&3r-GY{%~*>d(TFBR`a+y`u+yFBa^i58shEY#n=T4sBR(pb-e4-^>tP~t?V0@W j7Kh?9?|XUc8{Xmr=*2?*EOThP00000NkvXXu0mjftha#@ literal 0 HcmV?d00001 diff --git a/visual_effects.lua b/visual_effects.lua new file mode 100644 index 0000000..96771e7 --- /dev/null +++ b/visual_effects.lua @@ -0,0 +1,78 @@ +--designed for use with the gun class +function Guns4d.muzzle_flash(self) + local playername = self.player:get_player_name() + if self.particle_spawners.muzzle_smoke and self.particle_spawners.muzzle_smoke ~= -1 then + minetest.delete_particlespawner(self.particle_spawners.muzzle_smoke, self.player:get_player_name()) + end + local dir, offset_pos = self:get_dir(), self:get_pos(self.properties.flash_offset) + offset_pos=offset_pos+self.player:get_pos() + local min = vector.rotate(vector.new(-2, -2, -.3), vector.dir_to_rotation(dir)) + local max = vector.rotate(vector.new(2, 2, .3), vector.dir_to_rotation(dir)) + minetest.add_particlespawner({ + exptime = .18, + time = .1, + amount = 15, + attached = self.entity, + pos = self.properties.flash_offset, + radius = .04, + glow = 3.5, + vel = {min=vector.new(-1, -1, -.15), max=vector.new(1, 1, .15), bias=0}, + texpool = { + { name = "smoke.png", alpha_tween = {.25, 0}, scale = 2, blend = "alpha", + animation = { + type = "vertical_frames", aspect_w = 16, + aspect_h = 16, length = .1, + }, + }, + { name = "smoke.png", alpha_tween = {.25, 0}, scale = .8, blend = "alpha", + animation = { + type = "vertical_frames", aspect_w = 16, + aspect_h = 16, length = .1, + }, + }, + { name = "smoke.png^[multiply:#dedede", alpha_tween = {.25, 0}, scale = 2, + blend = "alpha", + animation = { + type = "vertical_frames", aspect_h = 16, + aspect_w = 16, length = .1, + }, + }, + { name = "smoke.png^[multiply:#b0b0b0", alpha_tween = {.2, 0}, scale = 2, blend = "alpha", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = .25, + }, + } + } + }) + --muzzle smoke + self.particle_spawners.muzzle_smoke = minetest.add_particlespawner({ + exptime = .3, + time = 2, + amount = 50, + pos = self.properties.flash_offset, + glow = 2, + vel = {min=vector.new(-.1,.4,.2), max=vector.new(.1,.6,1), bias=0}, + attached = self.entity, + texpool = { + {name = "smoke.png", alpha_tween = {.12, 0}, scale = 1.4, blend = "alpha", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = .35, + }, + }, + {name = "smoke.png^[multiply:#b0b0b0", alpha_tween = {.2, 0}, scale = 1.4, blend = "alpha", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = .35, + }, + } + } + }) +end \ No newline at end of file