Merge pull request #811 from Zuhayr/gunhands

Added functionality for two-handed gun use.
This commit is contained in:
Neerti
2016-01-21 09:12:40 -05:00
12 changed files with 62 additions and 103 deletions

View File

@@ -216,7 +216,7 @@ var/list/slot_equipment_priority = list( \
wear_mask = null
update_inv_wear_mask(0)
return
/mob/proc/isEquipped(obj/item/I)
if(!I)
return 0

View File

@@ -140,12 +140,6 @@
return
/mob/living/carbon/swap_hand()
var/obj/item/item_in_hand = src.get_active_hand()
if(item_in_hand) //this segment checks if the item in your hand is twohanded.
if(istype(item_in_hand,/obj/item/weapon/material/twohanded))
if(item_in_hand:wielded == 1)
usr << "<span class='warning'>Your other hand is too busy holding the [item_in_hand.name]</span>"
return
src.hand = !( src.hand )
if(hud_used.l_hand_hud_object && hud_used.r_hand_hud_object)
if(hand) //This being 1 means the left hand is in use
@@ -154,10 +148,6 @@
else
hud_used.l_hand_hud_object.icon_state = "l_hand_inactive"
hud_used.r_hand_hud_object.icon_state = "r_hand_active"
/*if (!( src.hand ))
src.hands.set_dir(NORTH)
else
src.hands.set_dir(SOUTH)*/
return
/mob/living/carbon/proc/activate_hand(var/selhand) //0 or "r" or "right" for right hand; 1 or "l" or "left" for left hand.

View File

@@ -171,9 +171,15 @@ This saves us from having to call add_fingerprint() any time something is put in
update_inv_legcuffed()
else if (W == r_hand)
r_hand = null
if(l_hand)
l_hand.update_held_icon()
update_inv_l_hand()
update_inv_r_hand()
else if (W == l_hand)
l_hand = null
if(r_hand)
r_hand.update_held_icon()
update_inv_l_hand()
update_inv_l_hand()
else
return 0

View File

@@ -70,6 +70,7 @@ var/const/MAX_ACTIVE_TIME = 400
return
/obj/item/clothing/mask/facehugger/equipped(mob/M)
..()
Attach(M)
/obj/item/clothing/mask/facehugger/Crossed(atom/target)

View File

@@ -64,6 +64,8 @@
var/list/burst_accuracy = list(0) //allows for different accuracies for each shot in a burst. Applied on top of accuracy
var/list/dispersion = list(0)
var/mode_name = null
var/requires_two_hands
var/wielded_icon = "gun_wielded"
var/next_fire_time = 0
@@ -87,17 +89,28 @@
if(isnull(scoped_accuracy))
scoped_accuracy = accuracy
/obj/item/weapon/gun/update_held_icon()
if(requires_two_hands)
var/mob/living/M = loc
if(istype(M))
if((M.l_hand == src && !M.r_hand) || (M.r_hand == src && !M.l_hand))
item_state = wielded_icon
else
item_state = initial(item_state)
update_icon() // In case item_state is set somewhere else.
..()
//Checks whether a given mob can use the gun
//Any checks that shouldn't result in handle_click_empty() being called if they fail should go here.
//Otherwise, if you want handle_click_empty() to be called, check in consume_next_projectile() and return null there.
/obj/item/weapon/gun/proc/special_check(var/mob/user)
if(!istype(user, /mob/living))
return 0
if(!user.IsAdvancedToolUser())
return 0
var/mob/living/M = user
if(HULK in M.mutations)
M << "<span class='danger'>Your fingers are much too large for the trigger guard!</span>"
return 0
@@ -161,6 +174,14 @@
user.setMoveCooldown(shoot_time) //no moving while shooting either
next_fire_time = world.time + shoot_time
var/held_acc_mod = 0
var/held_disp_mod = 0
if(requires_two_hands)
update_held_icon()
if((user.l_hand == src && user.r_hand) || (user.r_hand == src && user.l_hand))
held_acc_mod = -3
held_disp_mod = 3
//actually attempt to shoot
var/turf/targloc = get_turf(target) //cache this in case target gets deleted during shooting, e.g. if it was a securitron that got destroyed.
for(var/i in 1 to burst)
@@ -169,8 +190,8 @@
handle_click_empty(user)
break
var/acc = burst_accuracy[min(i, burst_accuracy.len)]
var/disp = dispersion[min(i, dispersion.len)]
var/acc = burst_accuracy[min(i, burst_accuracy.len)] + held_acc_mod
var/disp = dispersion[min(i, dispersion.len)] + held_disp_mod
process_accuracy(projectile, user, target, acc, disp)
if(pointblank)