diff --git a/classes/Control_handler.lua b/classes/Control_handler.lua index bcd43d3..fb9aaf9 100644 --- a/classes/Control_handler.lua +++ b/classes/Control_handler.lua @@ -33,7 +33,7 @@ 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 = self.busy_list --list of controls that have their conditions met. Has to be reset at END of update, so on_use and on_secondary_use can be marked + local busy_list = self.busy_list or {} --list of controls that have their conditions met. Has to be reset at END of update, so on_use and on_secondary_use can be marked for i, control in pairs(self.controls) do if not (i=="on_use") and not (i=="on_secondary_use") then local def = control @@ -44,6 +44,7 @@ function controls:update(dt) if not pressed[key] then conditions_met = false break end end if conditions_met then + busy_list[i] = true data.timer = data.timer - dt --when time is over, if it wasnt held (or loop is active) then reset and call the function. --held indicates wether the function was called (as active) before last step. @@ -54,7 +55,6 @@ function controls:update(dt) table.insert(call_queue, {control=def, active=false, interrupt=false, data=data}) end else - busy_list[i] = true data.held = false --detect interrupts, check if the timer was in progress if data.timer ~= def.timer then @@ -64,10 +64,8 @@ function controls:update(dt) end end end - --busy list is so we can tell if a function should be allowed or not - if #busy_list == 0 then busy_list = nil end for i, tbl in pairs(call_queue) do - tbl.control.func(tbl.active, tbl.interrupt, tbl.data, busy_list, self.handler) + tbl.control.func(tbl.active, tbl.interrupt, tbl.data, busy_list, self.handler.gun, self.handler) end self.busy_list = {} end diff --git a/classes/Gun.lua b/classes/Gun.lua index b5715a9..c5e55ed 100644 --- a/classes/Gun.lua +++ b/classes/Gun.lua @@ -18,6 +18,11 @@ local gun_default = { horizontal_offset = 0, aim_time = 1, }, + firemodes = { + "single", --not limited to semi-automatic. + "auto", + "burst" + }, recoil = { --used by update_recoil() velocity_correction_factor = { --velocity correction factor is currently very broken. gun_axial = 1, @@ -74,9 +79,10 @@ local gun_default = { controls = { --used by control_handler __overfill=true, --if present, this table will not be filled in. aim = Guns4d.default_controls.aim, - fire = Guns4d.default_controls.fire, + auto = Guns4d.default_controls.auto, reload = Guns4d.default_controls.reload, - on_use = Guns4d.default_controls.on_use + on_use = Guns4d.default_controls.on_use, + firemode = Guns4d.default_controls.firemode }, reload = { --used by defualt controls. Still provides usefulness elsewhere. __overfill=true, --if present, this table will not be filled in. @@ -90,6 +96,7 @@ local gun_default = { }, visuals = { --mesh + backface_culling = true, root = "gun", arm_right = "right_aimpoint", arm_left = "left_aimpoint", @@ -127,10 +134,10 @@ local gun_default = { spread = { }, - total_offset_rotation = { --can't be in offsets, as they're added automatically. + --[[total_offset_rotation = { --can't be in offsets, as they're added automatically. gun_axial = Vec.new(), player_axial = Vec.new(), - }, + },]] player_rotation = Vec.new(), velocities = { recoil = { @@ -174,6 +181,7 @@ local gun_default = { ]] }, particle_spawners = {}, + current_firemode = 1, walking_tick = 0, time_since_last_fire = 0, time_since_creation = 0, @@ -247,6 +255,10 @@ function gun_default:update(dt) end end +function gun_default:cycle_firemodes() + self.current_firemode = (self.current_firemode+1)%(#self.properties.firemodes) + minetest.chat_send_all(self.properties.firemodes[self.current_firemode+1]) +end function gun_default:attempt_fire() assert(self.instance, "attempt to call object method on a class") if self.rechamber_time <= 0 then @@ -512,10 +524,10 @@ function gun_default:update_animation(dt) if data.loop and (data.current_frame > data.frames.y) then data.current_frame = data.frames.x end - --track rotations + --track rotations and applies to aim. if self.consts.ANIMATIONS_OFFSET_AIM then self:update_animation_rotation() end end ---IMPORTANT!!! this does not directly modify the animation_data table, it's all hooked through ObjRef:set_animation() (init.lua) so if animation is set elsewhere it doesnt break. +--IMPORTANT!!! this does not directly modify the animation_data table anymore, it's all hooked through ObjRef:set_animation() (init.lua) so if animation is set elsewhere it doesnt break. --this may be deprecated in the future- as it is no longer really needed now that I hook ObjRef functions. function gun_default:set_animation(frames, length, fps, loop) loop = loop or false --why the fuck default is true? I DONT FUCKIN KNOW (this undoes this) @@ -527,7 +539,7 @@ function gun_default:set_animation(frames, length, fps, loop) elseif not fps then fps = self.consts.DEFAULT_FPS end - self.entity:set_animation(frames, fps, 0, loop) + self.entity:set_animation(frames, fps, 0, loop) --see init.lua for modified ObjRef stuff. end function gun_default:clear_animation() local loaded = false @@ -538,7 +550,6 @@ function gun_default:clear_animation() elseif self.ammo_handler.ammo.total_bullets > 0 then loaded = true end - local data = self.animation_data if loaded then self.entity:set_animation({x=self.properties.visuals.animations.loaded.x, y=self.properties.visuals.animations.loaded.y}, 0, 0, self.consts.LOOP_IDLE_ANIM) else @@ -608,8 +619,6 @@ function gun_default:update_animation_rotation() out = vector.new() end self.animation_rotation = out - --minetest.chat_send_all(dump(out)) - --minetest.chat_send_all(self.animation_data.current_frame) end --relative to the gun's entity. Returns left, right vectors. @@ -689,7 +698,11 @@ gun_default.construct = function(def) def.properties = table.fill(def.base_class.properties, def.properties) def.particle_spawners = {} --Instantiatable_class only shallow copies. So tables will not change, and thus some need to be initialized. def.property_modifiers = {} - + def.total_offset_rotation = { + gun_axial = Vec.new(), + player_axial = Vec.new(), + } + def.player_rotation = Vec.new() --initialize all offsets --def.offsets = table.deep_copy(def.base_class.offsets) def.offsets = {} @@ -836,6 +849,7 @@ gun_default.construct = function(def) glow = 0, pointable = false, static_save = false, + backface_culling = props.visuals.backface_culling }, on_step = function(self, dtime) local obj = self.object diff --git a/classes/Player_handler.lua b/classes/Player_handler.lua index 9df3810..1cc4a3f 100644 --- a/classes/Player_handler.lua +++ b/classes/Player_handler.lua @@ -26,7 +26,6 @@ function player_handler:update(dt) --was there a gun last time? did the wield index change? local old_index = self.wield_index self.wield_index = player:get_wield_index() - --initialize all handlers and objects if (not self.gun) or (self.gun.id ~= self.wielded_item:get_meta():get_string("guns4d_id")) then --initialize important player data diff --git a/default_controls.lua b/default_controls.lua index 4020891..a4de07a 100644 --- a/default_controls.lua +++ b/default_controls.lua @@ -5,19 +5,29 @@ Guns4d.default_controls.aim = { conditions = {"RMB"}, loop = false, timer = 0, - func = function(active, interrupted, data, busy_list, handler) + func = function(active, interrupted, data, busy_list, gun, handler) if active then handler.control_bools.ads = not handler.control_bools.ads end end } -Guns4d.default_controls.fire = { +Guns4d.default_controls.auto = { conditions = {"LMB"}, loop = true, timer = 0, - func = function(active, interrupted, data, busy_list, handler) - if not handler.control_handler.busy_list.on_use then - handler.gun:attempt_fire() + func = function(active, interrupted, data, busy_list, gun, handler) + if gun.properties.firemodes[gun.current_firemode+1] == "auto" then + gun:attempt_fire() + end + end +} +Guns4d.default_controls.firemode = { + conditions = {"sneak", "zoom"}, + loop = false, + timer = .5, + func = function(active, interrupted, data, busy_list, gun, handler) + if not (busy_list.on_use or busy_list.auto) then + gun:cycle_firemodes() end end } @@ -25,11 +35,10 @@ Guns4d.default_controls.reload = { conditions = {"zoom"}, loop = false, timer = 0, --1 so we have a call to initialize the timer. - func = function(active, interrupted, data, busy_list, handler) - local gun = handler.gun + func = function(active, interrupted, data, busy_list, gun, handler) local ammo_handler = gun.ammo_handler local props = gun.properties - if active then + if active and not busy_list.firemode then if not data.state then data.state = 0 end @@ -174,5 +183,5 @@ Guns4d.default_controls.reload = { } Guns4d.default_controls.on_use = function(itemstack, handler, pointed_thing) handler.gun:attempt_fire() - handler.control_handler.busy_list.on_use = true + --handler.control_handler.busy_list.on_use = true end \ No newline at end of file diff --git a/init.lua b/init.lua index 439ab85..0191a7a 100644 --- a/init.lua +++ b/init.lua @@ -76,10 +76,14 @@ minetest.register_on_joinplayer(function(player) end --so... minetest is stupid, and so it won't let me set something to the same animation twice (utterly fucking brilliant). --This means I literally need to flip flop between +1 frames - frame_range = (frame_range and table.copy(frame_range)) or {x=1,y=1} + frame_range = table.copy(frame_range) + minetest.chat_send_all(dump(frame_range)) if data.frames.x == frame_range.x and data.frames.y == frame_range.y then - frame_range.y = frame_range.y + 1 --oh yeah, and it only accepts whole frames... because of course. + --oh yeah, and it only accepts whole frames... because of course. + frame_range.x = frame_range.x+1 + minetest.chat_send_all("+1") end + minetest.chat_send_all(dump(frame_range)) data.frames = frame_range data.current_frame = data.frames.x end diff --git a/misc_helpers.lua b/misc_helpers.lua index 544b697..231cb4b 100644 --- a/misc_helpers.lua +++ b/misc_helpers.lua @@ -262,7 +262,7 @@ function table.shallow_copy(t) end --for the following code and functions only: ---for license see the link on the next line. +--for license see the link on the next line (direct permission was granted). --https://github.com/3dreamengine/3DreamEngine function Point_to_hud(pos, fov, aspect) local n = .1 --near diff --git a/textures/awm_backscope.png b/textures/awm_backscope.png deleted file mode 100644 index 281aea4..0000000 Binary files a/textures/awm_backscope.png and /dev/null differ diff --git a/textures/awm_forescope.png b/textures/awm_forescope.png deleted file mode 100644 index ea12ca0..0000000 Binary files a/textures/awm_forescope.png and /dev/null differ diff --git a/textures/awm_reticle.png b/textures/awm_reticle.png deleted file mode 100644 index 2062c3c..0000000 Binary files a/textures/awm_reticle.png and /dev/null differ