diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm index c73dbb1b3be0..6c062677b6f4 100644 --- a/code/modules/projectiles/ammunition.dm +++ b/code/modules/projectiles/ammunition.dm @@ -17,6 +17,7 @@ var/delay = 0 //Delay for energy weapons var/click_cooldown_override = 0 //Override this to make your gun have a faster fire rate, in tenths of a second. 4 is the default gun cooldown. var/firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect //the visual effect appearing when the ammo is fired. + var/heavy_metal = TRUE /obj/item/ammo_casing/Initialize() @@ -58,3 +59,47 @@ to_chat(user, "You fail to collect anything!") else return ..() + +/obj/item/ammo_casing/throw_impact(atom/A) + if(heavy_metal) + bounce_away(FALSE, NONE) + . = ..() + +/obj/item/ammo_casing/proc/bounce_away(still_warm = FALSE, delay = 3) + SpinAnimation(10, 1) + update_icon() + var/turf/T = get_turf(src) + if(still_warm && T && (is_type_in_typecache(T, GLOB.bullet_bounce_away_sizzle))) + addtimer(CALLBACK(GLOBAL_PROC, .proc/playsound, src, 'sound/items/welder.ogg', 20, 1), delay) + else if(T && (!is_type_in_typecache(T, GLOB.bullet_bounce_away_blacklist))) + addtimer(CALLBACK(GLOBAL_PROC, .proc/playsound, src, 'sound/weapons/bulletremove.ogg', 60, 1), delay) + +GLOBAL_LIST_INIT(bullet_bounce_away_sizzle, typecacheof(list( + /turf/closed/indestructible/rock/snow, + /turf/closed/wall/ice, + /turf/closed/wall/mineral/snow, + /turf/open/floor/grass/snow, + /turf/open/floor/holofloor/snow, + /turf/open/floor/plating/asteroid/snow, + /turf/open/floor/plating/ice, + /turf/open/water))) + +GLOBAL_LIST_INIT(bullet_bounce_away_blacklist, typecacheof(list( + /turf/closed/indestructible/rock/snow, + /turf/closed/indestructible/splashscreen, + /turf/closed/wall/mineral/snow, + /turf/open/chasm, + /turf/open/floor/carpet, + /turf/open/floor/grass, + /turf/open/floor/holofloor/beach, + /turf/open/floor/holofloor/carpet, + /turf/open/floor/holofloor/grass, + /turf/open/floor/holofloor/hyperspace, + /turf/open/floor/holofloor/snow, + /turf/open/floor/plating/asteroid/snow, + /turf/open/floor/plating/beach, + /turf/open/indestructible/reebe_void, + /turf/open/lava, + /turf/open/space, + /turf/open/water, + /turf/template_noop))) diff --git a/code/modules/projectiles/ammunition/caseless.dm b/code/modules/projectiles/ammunition/caseless.dm index 7432f9f8e7df..b3439c86b226 100644 --- a/code/modules/projectiles/ammunition/caseless.dm +++ b/code/modules/projectiles/ammunition/caseless.dm @@ -4,6 +4,7 @@ /obj/item/ammo_casing/caseless desc = "A caseless bullet casing." firing_effect_type = null + heavy_metal = FALSE /obj/item/ammo_casing/caseless/fire_casing(atom/target, mob/living/user, params, distro, quiet, zone_override, spread) if (..()) //successfully firing diff --git a/code/modules/projectiles/ammunition/energy.dm b/code/modules/projectiles/ammunition/energy.dm index dcd9d356adde..40c198ec4e46 100644 --- a/code/modules/projectiles/ammunition/energy.dm +++ b/code/modules/projectiles/ammunition/energy.dm @@ -7,6 +7,7 @@ var/select_name = "energy" fire_sound = 'sound/weapons/laser.ogg' firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/energy + heavy_metal = FALSE /obj/item/ammo_casing/energy/chameleon projectile_type = /obj/item/projectile/energy/chameleon diff --git a/code/modules/projectiles/ammunition/special.dm b/code/modules/projectiles/ammunition/special.dm index 11fd12da70a7..de103b399ed3 100644 --- a/code/modules/projectiles/ammunition/special.dm +++ b/code/modules/projectiles/ammunition/special.dm @@ -3,6 +3,7 @@ desc = "I didn't even know magic needed ammo..." projectile_type = /obj/item/projectile/magic firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/magic + heavy_metal = FALSE /obj/item/ammo_casing/magic/change projectile_type = /obj/item/projectile/magic/change diff --git a/code/modules/projectiles/box_magazine.dm b/code/modules/projectiles/box_magazine.dm index 37ab942ea296..d2ea62be71ff 100644 --- a/code/modules/projectiles/box_magazine.dm +++ b/code/modules/projectiles/box_magazine.dm @@ -96,9 +96,10 @@ /obj/item/ammo_box/attack_self(mob/user) var/obj/item/ammo_casing/A = get_round() if(A) - user.put_in_hands(A) + if(!user.put_in_hands(A)) + A.bounce_away(FALSE, NONE) + playsound(src, 'sound/weapons/bulletinsert.ogg', 60, 1) to_chat(user, "You remove a round from \the [src]!") - playsound(A, 'sound/weapons/bulletremove.ogg', 60, 1) update_icon() /obj/item/ammo_box/update_icon() diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index 29ae8a85222b..252a9cd8c75c 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -31,8 +31,7 @@ if(istype(AC)) //there's a chambered round if(casing_ejector) AC.forceMove(drop_location()) //Eject casing onto ground. - AC.SpinAnimation(10, 1) //next gen special effects - addtimer(CALLBACK(GLOBAL_PROC, .proc/playsound, AC, 'sound/weapons/bulletremove.ogg', 60, 1), 3) + AC.bounce_away(TRUE) chambered = null else if(empty_chamber) chambered = null @@ -125,8 +124,7 @@ to_chat(user, "You pull the magazine out of \the [src].") else if(chambered) AC.forceMove(drop_location()) - AC.SpinAnimation(10, 1) - addtimer(CALLBACK(GLOBAL_PROC, .proc/playsound, AC, 'sound/weapons/bulletremove.ogg', 60, 1), 3) + AC.bounce_away() chambered = null to_chat(user, "You unload the round from \the [src]'s chamber.") playsound(src, "gun_slide_lock", 70, 1) diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm index 14cb4ba3039f..b98bdaf9575b 100644 --- a/code/modules/projectiles/guns/ballistic/revolver.dm +++ b/code/modules/projectiles/guns/ballistic/revolver.dm @@ -40,9 +40,7 @@ CB = magazine.get_round(0) if(CB) CB.forceMove(drop_location()) - CB.SpinAnimation(10, 1) - CB.update_icon() - addtimer(CALLBACK(GLOBAL_PROC, .proc/playsound, CB, 'sound/weapons/bulletremove.ogg', 60, 1), 3) + CB.bounce_away(FALSE, NONE) num_unloaded++ if (num_unloaded) to_chat(user, "You unload [num_unloaded] shell\s from [src].") diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index a25fcd50cfb2..e74b90922d6f 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -57,8 +57,7 @@ /obj/item/gun/ballistic/shotgun/proc/pump_unload(mob/M) if(chambered)//We have a shell in the chamber chambered.forceMove(drop_location())//Eject casing - chambered.SpinAnimation(10, 1) - addtimer(CALLBACK(GLOBAL_PROC, .proc/playsound, chambered, 'sound/weapons/bulletremove.ogg', 60, 1), 3) + chambered.bounce_away() chambered = null /obj/item/gun/ballistic/shotgun/proc/pump_reload(mob/M)