Ports fully automatic drag-to-fire functionality from Bay. (#8917)

Watch the video until the end. The gatling gun is slow to shoot, for some reason, but the rest are all full-auto.
This commit is contained in:
TheDanseMacabre
2020-05-22 22:39:32 +03:00
committed by GitHub
parent 85267136ba
commit 4cf08ab516
4 changed files with 69 additions and 8 deletions
+16
View File
@@ -49,6 +49,7 @@
zoomdevicename = "scope"
var/burst = 1
var/can_autofire = FALSE
var/fire_delay = 6 //delay after shooting before the gun can be used again
var/burst_delay = 1 //delay between shots, if firing in bursts
var/move_delay = 0
@@ -819,3 +820,18 @@
qdel(pin)
pin = null
return ..()
//Autofire
/obj/item/gun/proc/can_autofire()
return (can_autofire && world.time >= next_fire_time)
/client/MouseDrag(src_object, over_object, src_location, over_location, src_control, over_control, params)
. = ..()
if(over_object)
var/mob/living/M = mob
if(istype(M) && !M.incapacitated())
var/obj/item/gun/gun = mob.get_active_hand()
if(istype(gun) && gun.can_autofire())
M.set_dir(get_dir(M, over_object))
gun.Fire(get_turf(over_object), mob, params, (get_dist(over_object, mob) <= 1), FALSE)
@@ -17,9 +17,10 @@
sel_mode = 1
firemodes = list(
list(mode_name="semiauto", burst=1, fire_delay=null, move_delay=null, burst_accuracy=null, dispersion=null),
list(mode_name="3-round bursts", burst=3, fire_delay=null, move_delay=null, burst_accuracy=list(1,0,0), dispersion=list(0, 10, 15)),
list(mode_name="short bursts", burst=5, fire_delay=null, move_delay=null, burst_accuracy=list(1,0,,-1,-1), dispersion=list(5, 10, 15, 20))
list(mode_name="semiauto", can_autofire=0, burst=1, fire_delay=null, move_delay=null, burst_accuracy=null, dispersion=null),
list(mode_name="3-round bursts", can_autofire=0, burst=3, fire_delay=null, move_delay=null, burst_accuracy=list(1,0,0), dispersion=list(0, 10, 15)),
list(mode_name="short bursts", can_autofire=0, burst=5, fire_delay=null, move_delay=null, burst_accuracy=list(1,0,,-1,-1), dispersion=list(5, 10, 15, 20)),
list(mode_name="full auto", can_autofire=1, burst=1, fire_delay=1, one_hand_penalty=12, burst_accuracy = list(0,-1,-1,-2,-2,-2,-3,-3), dispersion = list(1.0, 1.0, 1.0, 1.0, 1.2))
)
//Submachine guns and personal defence weapons, go.
@@ -119,7 +120,8 @@
firemodes = list(
list(mode_name="semiauto", burst=1, fire_delay=10, move_delay=null, burst_accuracy=null, dispersion=null),
list(mode_name="3-round bursts", burst=3, fire_delay=null, move_delay=null, burst_accuracy=list(1,0,0), dispersion=list(0, 5, 10)),
list(mode_name="short bursts", burst=5, fire_delay=null, move_delay=null, burst_accuracy=list(1,0,0,-1,-1), dispersion=list(5, 5, 15))
list(mode_name="short bursts", burst=5, fire_delay=null, move_delay=null, burst_accuracy=list(1,0,0,-1,-1), dispersion=list(5, 5, 15)),
list(mode_name="full auto", can_autofire=1, burst=1, fire_delay=1, one_hand_penalty=12, burst_accuracy = list(0,-1,-1,-2,-2,-2,-3,-3), dispersion = list(1.0, 1.0, 1.0, 1.0, 1.2)),
)
//slower to regain aim, more inaccurate if not wielding
@@ -273,7 +275,8 @@
firemodes = list(
list(mode_name="short bursts", burst=5, move_delay=null, burst_accuracy = list(1,0,0,-1,-1), dispersion = list(3, 6, 9)),
list(mode_name="long bursts", burst=8, move_delay=null, burst_accuracy = list(1,0,0,-1,-1,-1,-2,-2), dispersion = list(8))
list(mode_name="long bursts", burst=8, move_delay=null, burst_accuracy = list(1,0,0,-1,-1,-1,-2,-2), dispersion = list(8)),
list(mode_name="full auto", can_autofire=1, burst=1, fire_delay=1, one_hand_penalty=12, burst_accuracy = list(0,-1,-1,-2,-2,-2,-3,-3), dispersion = list(1.0, 1.0, 1.0, 1.0, 1.2))
)
var/cover_open = 0
@@ -127,8 +127,9 @@
origin_tech = null
firemodes = list(
list(mode_name="short bursts", burst=6, move_delay=8, burst_accuracy = list(0,-1,-1,-2,-2), dispersion = list(3, 6, 9)),
list(mode_name="long bursts", burst=12, move_delay=9, burst_accuracy = list(0,-1,-1,-2,-2,-2,-3,-3), dispersion = list(8))
list(mode_name="short bursts", can_autofire=0, burst=6, move_delay=8, burst_accuracy = list(0,-1,-1,-2,-2), dispersion = list(3, 6, 9)),
list(mode_name="long bursts", can_autofire=0, burst=12, move_delay=9, burst_accuracy = list(0,-1,-1,-2,-2,-2,-3,-3), dispersion = list(8)),
list(mode_name="full auto", can_autofire=1, burst=1, fire_delay=1, one_hand_penalty=12, burst_accuracy = list(0,-1,-1,-2,-2,-2,-3,-3), dispersion = list(1.0, 1.0, 1.0, 1.0, 1.2))
)
@@ -162,4 +163,4 @@
/obj/item/gun/projectile/automatic/rifle/minigun/Move()
..()
if(loc != source.loc)
INVOKE_ASYNC(source, /obj/item/minigunpack/.proc/remove_gun)
INVOKE_ASYNC(source, /obj/item/minigunpack/.proc/remove_gun)