mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2025-12-25 17:51:17 +00:00
Merge remote-tracking branch 'upstream/master' into crusher-trophies
This commit is contained in:
@@ -50,6 +50,12 @@
|
||||
var/obj/item/flashlight/gun_light = null
|
||||
var/can_flashlight = 0
|
||||
|
||||
var/can_bayonet = FALSE //if a bayonet can be added or removed if it already has one.
|
||||
var/obj/item/kitchen/knife/bayonet
|
||||
var/mutable_appearance/knife_overlay
|
||||
var/knife_x_offset = 0
|
||||
var/knife_y_offset = 0
|
||||
|
||||
var/list/upgrades = list()
|
||||
|
||||
var/ammo_x_offset = 0 //used for positioning ammo count overlay on sprite
|
||||
@@ -69,12 +75,27 @@
|
||||
verbs += /obj/item/gun/proc/toggle_gunlight
|
||||
build_zooming()
|
||||
|
||||
/obj/item/gun/Destroy()
|
||||
QDEL_NULL(bayonet)
|
||||
return ..()
|
||||
|
||||
/obj/item/gun/handle_atom_del(atom/A)
|
||||
if(A == bayonet)
|
||||
clear_bayonet()
|
||||
return ..()
|
||||
|
||||
/obj/item/gun/examine(mob/user)
|
||||
..()
|
||||
if(unique_reskin && !current_skin)
|
||||
to_chat(user, "<span class='notice'>Alt-click it to reskin it.</span>")
|
||||
if(unique_rename)
|
||||
to_chat(user, "<span class='notice'>Use a pen on it to rename it.</span>")
|
||||
if(bayonet)
|
||||
to_chat(user, "It has \a [bayonet] [can_bayonet ? "" : "permanently "]affixed to it.")
|
||||
if(can_bayonet) //if it has a bayonet and this is false, the bayonet is permanent.
|
||||
to_chat(user, "<span class='info'>[bayonet] looks like it can be <b>unscrewed</b> from [src].</span>")
|
||||
else if(can_bayonet)
|
||||
to_chat(user, "It has a <b>bayonet</b> lug on it.")
|
||||
|
||||
/obj/item/gun/proc/process_chamber()
|
||||
return 0
|
||||
@@ -233,11 +254,19 @@ obj/item/gun/proc/newshot()
|
||||
user.update_inv_r_hand()
|
||||
feedback_add_details("gun_fired","[type]")
|
||||
|
||||
/obj/item/gun/attack(mob/M as mob, mob/user)
|
||||
/obj/item/gun/attack(mob/M, mob/user)
|
||||
if(user.a_intent == INTENT_HARM) //Flogging
|
||||
..()
|
||||
else
|
||||
return
|
||||
if(bayonet)
|
||||
M.attackby(bayonet, user)
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/gun/attack_obj(obj/O, mob/user)
|
||||
if(user.a_intent == INTENT_HARM)
|
||||
if(bayonet)
|
||||
O.attackby(bayonet, user)
|
||||
return
|
||||
return ..()
|
||||
|
||||
/obj/item/gun/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/flashlight/seclite))
|
||||
@@ -257,7 +286,7 @@ obj/item/gun/proc/newshot()
|
||||
if(loc == user)
|
||||
A.Grant(user)
|
||||
|
||||
if(istype(I, /obj/item/screwdriver))
|
||||
if(isscrewdriver(I))
|
||||
if(gun_light && can_flashlight)
|
||||
for(var/obj/item/flashlight/seclite/S in src)
|
||||
to_chat(user, "<span class='notice'>You unscrew the seclite from [src].</span>")
|
||||
@@ -268,11 +297,32 @@ obj/item/gun/proc/newshot()
|
||||
update_icon()
|
||||
for(var/datum/action/item_action/toggle_gunlight/TGL in actions)
|
||||
qdel(TGL)
|
||||
else if(bayonet && can_bayonet) //if it has a bayonet, and the bayonet can be removed
|
||||
bayonet.forceMove(get_turf(user))
|
||||
clear_bayonet()
|
||||
|
||||
if(unique_rename)
|
||||
if(istype(I, /obj/item/pen))
|
||||
rename_gun(user)
|
||||
..()
|
||||
if(istype(I, /obj/item/kitchen/knife))
|
||||
var/obj/item/kitchen/knife/K = I
|
||||
if(!can_bayonet || !K.bayonet || bayonet) //ensure the gun has an attachment point available, and that the knife is compatible with it.
|
||||
return ..()
|
||||
if(!user.drop_item())
|
||||
return
|
||||
K.forceMove(src)
|
||||
to_chat(user, "<span class='notice'>You attach [K] to [src]'s bayonet lug.</span>")
|
||||
bayonet = K
|
||||
var/state = "bayonet" //Generic state.
|
||||
if(bayonet.icon_state in icon_states('icons/obj/guns/bayonets.dmi')) //Snowflake state?
|
||||
state = bayonet.icon_state
|
||||
var/icon/bayonet_icons = 'icons/obj/guns/bayonets.dmi'
|
||||
knife_overlay = mutable_appearance(bayonet_icons, state)
|
||||
knife_overlay.pixel_x = knife_x_offset
|
||||
knife_overlay.pixel_y = knife_y_offset
|
||||
overlays += knife_overlay
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/gun/proc/toggle_gunlight()
|
||||
set name = "Toggle Gun Light"
|
||||
@@ -305,6 +355,15 @@ obj/item/gun/proc/newshot()
|
||||
var/datum/action/A = X
|
||||
A.UpdateButtonIcon()
|
||||
|
||||
/obj/item/gun/proc/clear_bayonet()
|
||||
if(!bayonet)
|
||||
return
|
||||
bayonet = null
|
||||
if(knife_overlay)
|
||||
overlays -= knife_overlay
|
||||
knife_overlay = null
|
||||
return TRUE
|
||||
|
||||
/obj/item/gun/extinguish_light()
|
||||
if(gun_light.on)
|
||||
toggle_gunlight()
|
||||
|
||||
@@ -101,6 +101,8 @@
|
||||
beakers += B
|
||||
to_chat(user, "<span class='notice'>You slot [B] into [src].</span>")
|
||||
src.updateUsrDialog()
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/gun/dartgun/can_shoot()
|
||||
if(!cartridge)
|
||||
|
||||
@@ -140,6 +140,8 @@
|
||||
if(gun_light.on)
|
||||
iconF = "flight_on"
|
||||
overlays += image(icon = icon, icon_state = iconF, pixel_x = flight_x_offset, pixel_y = flight_y_offset)
|
||||
if(bayonet && can_bayonet)
|
||||
overlays += knife_overlay
|
||||
if(itemState)
|
||||
itemState += "[ratio]"
|
||||
item_state = itemState
|
||||
|
||||
@@ -16,6 +16,9 @@
|
||||
var/holds_charge = FALSE
|
||||
var/unique_frequency = FALSE // modified by KA modkits
|
||||
var/overheat = FALSE
|
||||
can_bayonet = TRUE
|
||||
knife_x_offset = 20
|
||||
knife_y_offset = 12
|
||||
|
||||
var/max_mod_capacity = 100
|
||||
var/list/modkits = list()
|
||||
@@ -148,6 +151,8 @@
|
||||
if(gun_light.on)
|
||||
iconF = "flight_on"
|
||||
overlays += image(icon = icon, icon_state = iconF, pixel_x = flight_x_offset, pixel_y = flight_y_offset)
|
||||
if(bayonet && can_bayonet)
|
||||
overlays += knife_overlay
|
||||
|
||||
|
||||
/obj/item/gun/energy/kinetic_accelerator/experimental
|
||||
|
||||
@@ -175,7 +175,7 @@
|
||||
power_supply.give(500)
|
||||
to_chat(user, "<span class='notice'>You insert [A] in [src], recharging it.</span>")
|
||||
else
|
||||
..()
|
||||
return ..()
|
||||
|
||||
/obj/item/gun/energy/plasmacutter/update_icon()
|
||||
return
|
||||
|
||||
@@ -28,6 +28,8 @@
|
||||
to_chat(user, "<span class='notice'>[grenades.len] / [max_grenades] grenades.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='warning'>The grenade launcher cannot hold more grenades.</span>")
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/gun/grenadelauncher/afterattack(obj/target, mob/user , flag)
|
||||
if(target == user)
|
||||
|
||||
@@ -24,6 +24,8 @@
|
||||
icon_state = "[current_skin][suppressed ? "-suppressed" : ""][sawn_state ? "-sawn" : ""]"
|
||||
else
|
||||
icon_state = "[initial(icon_state)][suppressed ? "-suppressed" : ""][sawn_state ? "-sawn" : ""]"
|
||||
if(bayonet && can_bayonet)
|
||||
overlays += knife_overlay
|
||||
|
||||
/obj/item/gun/projectile/process_chamber(eject_casing = 1, empty_chamber = 1)
|
||||
var/obj/item/ammo_casing/AC = chambered //Find chambered round
|
||||
@@ -66,7 +68,6 @@
|
||||
return
|
||||
|
||||
/obj/item/gun/projectile/attackby(var/obj/item/A as obj, mob/user as mob, params)
|
||||
..()
|
||||
if(istype(A, /obj/item/ammo_box/magazine))
|
||||
var/obj/item/ammo_box/magazine/AM = A
|
||||
if(istype(AM, mag_type))
|
||||
@@ -108,7 +109,8 @@
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You can't seem to figure out how to fit [S] on [src].</span>")
|
||||
return
|
||||
return 0
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/gun/projectile/attack_hand(mob/user)
|
||||
if(loc == user)
|
||||
@@ -178,6 +180,9 @@
|
||||
if(sawn_state == SAWN_OFF)
|
||||
to_chat(user, "<span class='warning'>\The [src] is already shortened!</span>")
|
||||
return
|
||||
if(bayonet)
|
||||
to_chat(user, "<span class='warning'>You cannot saw-off [src] with [bayonet] attached!</span>")
|
||||
return
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
user.visible_message("[user] begins to shorten \the [src].", "<span class='notice'>You begin to shorten \the [src]...</span>")
|
||||
|
||||
|
||||
@@ -19,6 +19,8 @@
|
||||
if(select == 1)
|
||||
overlays += "[initial(icon_state)]burst"
|
||||
icon_state = "[initial(icon_state)][magazine ? "-[magazine.max_ammo]" : ""][chambered ? "" : "-e"][suppressed ? "-suppressed" : ""]"
|
||||
if(bayonet && can_bayonet)
|
||||
overlays += knife_overlay
|
||||
|
||||
/obj/item/gun/projectile/automatic/attackby(var/obj/item/A as obj, mob/user as mob, params)
|
||||
. = ..()
|
||||
@@ -96,6 +98,9 @@
|
||||
fire_sound = 'sound/weapons/gunshots/gunshot_smg.ogg'
|
||||
fire_delay = 2
|
||||
burst_size = 2
|
||||
can_bayonet = TRUE
|
||||
knife_x_offset = 26
|
||||
knife_y_offset = 12
|
||||
|
||||
/obj/item/gun/projectile/automatic/c20r/New()
|
||||
..()
|
||||
@@ -123,6 +128,9 @@
|
||||
can_suppress = 0
|
||||
burst_size = 1
|
||||
actions_types = list()
|
||||
can_bayonet = TRUE
|
||||
knife_x_offset = 25
|
||||
knife_y_offset = 12
|
||||
|
||||
/obj/item/gun/projectile/automatic/wt550/update_icon()
|
||||
..()
|
||||
@@ -172,7 +180,7 @@
|
||||
underbarrel.attack_self()
|
||||
underbarrel.attackby(A, user, params)
|
||||
else
|
||||
..()
|
||||
return ..()
|
||||
|
||||
/obj/item/gun/projectile/automatic/m90/update_icon()
|
||||
..()
|
||||
|
||||
@@ -115,7 +115,6 @@
|
||||
..()
|
||||
|
||||
/obj/item/gun/projectile/revolver/detective/attackby(obj/item/A, mob/user, params)
|
||||
..()
|
||||
if(istype(A, /obj/item/screwdriver))
|
||||
if(magazine.caliber == "38")
|
||||
to_chat(user, "<span class='notice'>You begin to reinforce the barrel of [src]...</span>")
|
||||
@@ -143,6 +142,8 @@
|
||||
magazine.caliber = "38"
|
||||
desc = initial(desc)
|
||||
to_chat(user, "<span class='notice'>You remove the modifications on [src]. Now it will fire .38 rounds.</span>")
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/gun/projectile/revolver/fingergun //Summoned by the Finger Gun spell, from advanced mimery traitor item
|
||||
name = "\improper finger gun"
|
||||
@@ -347,7 +348,6 @@
|
||||
options["Cancel"] = null
|
||||
|
||||
/obj/item/gun/projectile/revolver/doublebarrel/attackby(obj/item/A, mob/user, params)
|
||||
..()
|
||||
if(istype(A, /obj/item/ammo_box) || istype(A, /obj/item/ammo_casing))
|
||||
chamber_round()
|
||||
if(istype(A, /obj/item/melee/energy))
|
||||
@@ -356,6 +356,8 @@
|
||||
sawoff(user)
|
||||
if(istype(A, /obj/item/circular_saw) || istype(A, /obj/item/gun/energy/plasmacutter))
|
||||
sawoff(user)
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/gun/projectile/revolver/doublebarrel/attack_self(mob/living/user)
|
||||
var/num_unloaded = 0
|
||||
@@ -394,7 +396,6 @@
|
||||
var/slung = 0
|
||||
|
||||
/obj/item/gun/projectile/revolver/doublebarrel/improvised/attackby(obj/item/A, mob/user, params)
|
||||
..()
|
||||
if(istype(A, /obj/item/stack/cable_coil) && !sawn_state)
|
||||
var/obj/item/stack/cable_coil/C = A
|
||||
if(C.use(10))
|
||||
@@ -406,6 +407,8 @@
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You need at least ten lengths of cable if you want to make a sling.</span>")
|
||||
return
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/gun/projectile/revolver/doublebarrel/improvised/update_icon()
|
||||
..()
|
||||
@@ -450,9 +453,10 @@
|
||||
return
|
||||
|
||||
/obj/item/gun/projectile/revolver/doublebarrel/improvised/cane/attackby(obj/item/A, mob/user, params)
|
||||
..()
|
||||
if(istype(A, /obj/item/stack/cable_coil))
|
||||
return
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/gun/projectile/revolver/doublebarrel/improvised/cane/examine(mob/user) // HAD TO REPEAT EXAMINE CODE BECAUSE GUN CODE DOESNT STEALTH
|
||||
var/f_name = "\a [src]."
|
||||
|
||||
@@ -50,14 +50,15 @@
|
||||
to_chat(user, "<span class='notice'>You remove the magazine from [src].</span>")
|
||||
|
||||
|
||||
/obj/item/gun/projectile/automatic/l6_saw/attackby(obj/item/A, mob/user, params)
|
||||
/obj/item/gun/projectile/automatic/l6_saw/attackby(obj/item/A, mob/user, params)
|
||||
if(istype(A, /obj/item/ammo_box/magazine))
|
||||
var/obj/item/ammo_box/magazine/AM = A
|
||||
if(istype(AM, mag_type))
|
||||
if(!cover_open)
|
||||
to_chat(user, "<span class='warning'>[src]'s cover is closed! You can't insert a new mag.</span>")
|
||||
return
|
||||
..()
|
||||
else
|
||||
return ..()
|
||||
|
||||
//ammo//
|
||||
|
||||
|
||||
@@ -86,7 +86,6 @@
|
||||
sawn_state = SAWN_INTACT
|
||||
|
||||
/obj/item/gun/projectile/shotgun/riot/attackby(obj/item/A, mob/user, params)
|
||||
..()
|
||||
if(istype(A, /obj/item/circular_saw) || istype(A, /obj/item/gun/energy/plasmacutter))
|
||||
sawoff(user)
|
||||
if(istype(A, /obj/item/melee/energy))
|
||||
@@ -95,6 +94,8 @@
|
||||
sawoff(user)
|
||||
if(istype(A, /obj/item/pipe))
|
||||
unsaw(A, user)
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/gun/projectile/shotgun/riot/sawoff(mob/user)
|
||||
if(sawn_state == SAWN_OFF)
|
||||
@@ -210,6 +211,9 @@
|
||||
mag_type = /obj/item/ammo_box/magazine/internal/boltaction
|
||||
fire_sound = 'sound/weapons/gunshots/gunshot_rifle.ogg'
|
||||
var/bolt_open = 0
|
||||
can_bayonet = TRUE
|
||||
knife_x_offset = 27
|
||||
knife_y_offset = 13
|
||||
|
||||
/obj/item/gun/projectile/shotgun/boltaction/pump(mob/M)
|
||||
playsound(M, 'sound/weapons/gun_interactions/rifle_load.ogg', 60, 1)
|
||||
@@ -242,6 +246,7 @@
|
||||
desc = "Careful not to lose your head."
|
||||
var/guns_left = 30
|
||||
mag_type = /obj/item/ammo_box/magazine/internal/boltaction/enchanted
|
||||
can_bayonet = FALSE
|
||||
|
||||
/obj/item/gun/projectile/shotgun/boltaction/enchanted/New()
|
||||
..()
|
||||
|
||||
@@ -37,6 +37,8 @@
|
||||
to_chat(user, "<span class='notice'>[rockets.len] / [max_rockets] rockets.</span>")
|
||||
else
|
||||
to_chat(usr, "<span class='notice'>[src] cannot hold more rockets.</span>")
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/gun/rocketlauncher/can_shoot()
|
||||
return rockets.len
|
||||
|
||||
@@ -76,7 +76,8 @@
|
||||
return 1
|
||||
else
|
||||
to_chat(user, "<span class='notice'>[src] cannot hold more syringes.</span>")
|
||||
return 0
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/gun/syringe/rapidsyringe
|
||||
name = "rapid syringe gun"
|
||||
|
||||
Reference in New Issue
Block a user