From 3fb3c7add26c7e5e715c8fc940b842d7c40585c7 Mon Sep 17 00:00:00 2001 From: Paxilmaniac <82386923+Paxilmaniac@users.noreply.github.com> Date: Sat, 4 Mar 2023 14:53:15 -0500 Subject: [PATCH] Gun code override unshittening part like, two by this point (#18957) * this code is so fucking funny it makes me want to merge w/o looking * safety component stuff * safeties should be finished * I loooove safety component * I swear that's all for gun safety * manufacturer component * cant forget this * this is so awful * 1100 line long gun file * ok it actually compiles now * that should not be an addition of any sort * these defines should not be used anymore * why?? the fuck??? are there var edited fire modes on black mesa????? * how did that even happen * maybe ci will shut up now * oh man so many guns are lacking autofire now * probably fixes safety toggling * that should reference the gun not the component * that should probably return * makes it replicate current behavior, defaults safeties to being ON * and that is all i have to say about that * its automagically --- _maps/RandomZLevels/blackmesa.dmm | 5 +- code/__DEFINES/~skyrat_defines/gun.dm | 4 - code/datums/components/fullauto.dm | 2 - code/modules/projectiles/gun.dm | 4 +- .../projectiles/guns/ballistic/automatic.dm | 2 - .../projectiles/guns/ballistic/launchers.dm | 2 - .../projectiles/guns/ballistic/pistol.dm | 1 - .../projectiles/guns/ballistic/shotgun.dm | 1 - .../projectiles/guns/energy/laser_gatling.dm | 4 +- .../projectiles/guns/energy/special.dm | 2 +- .../projectiles/guns/special/syringe_gun.dm | 1 - code/modules/unit_tests/mecha_damage.dm | 4 +- code/modules/unit_tests/projectiles.dm | 4 +- .../code/datums/components/fullauto.dm | 320 -------- .../modules/projectiles/guns/ballistic.dm | 6 - .../projectiles/guns/ballistic/automatic.dm | 348 --------- .../code/modules/projectiles/guns/gun.dm | 738 ------------------ .../modules/aesthetics/guns/code/guns.dm | 21 +- .../modules/aesthetics/guns/icons/guns.dmi | Bin 43037 -> 38843 bytes .../code/equipment_items/guns.dm | 32 +- .../modules/black_mesa/code/guns.dm | 7 +- .../modules/black_mesa/code/m16_variations.dm | 5 +- .../modules/blueshield/code/blueshield.dm | 4 +- .../modules/cellguns/code/cellguns.dm | 4 +- .../company_imports/code/datums/cargo_pack.dm | 3 +- .../company_imports/code/gun_companies.dm | 132 ---- .../code/objects/nri_surplus/ak25.dm | 4 +- .../gun_safety/code/safety_additions.dm | 48 ++ .../gun_safety/code/safety_component.dm | 86 ++ .../icons/actions.dmi | Bin .../{gunsafety => gun_safety}/readme.md | 1 + .../modules/gunhud/code/gun_hud_component.dm | 11 - .../modules/gunsafety/code/gun_safety.dm | 32 - .../modules/gunsgalore/code/guns/akm.dm | 10 +- .../modules/gunsgalore/code/guns/fg42.dm | 7 +- .../modules/gunsgalore/code/guns/luger.dm | 4 +- .../modules/gunsgalore/code/guns/m16.dm | 5 + .../modules/gunsgalore/code/guns/mg34.dm | 8 +- .../modules/gunsgalore/code/guns/mp40.dm | 10 +- .../modules/gunsgalore/code/guns/p90.dm | 6 +- .../modules/gunsgalore/code/guns/pps.dm | 10 +- .../modules/gunsgalore/code/guns/ppsh.dm | 10 +- .../modules/gunsgalore/code/guns/scar.dm | 6 +- .../modules/gunsgalore/code/guns/stg.dm | 10 +- .../icons/guns/gunsgalore_guns40x32.dmi | Bin 11734 -> 10517 bytes .../code/gun_company_additions.dm | 141 ++++ .../code/manufacturer_component.dm | 53 ++ .../modules/manufacturer_examine/readme.md | 25 + modular_skyrat/modules/marines/code/gear.dm | 13 +- .../modules/marines/code/smartgun.dm | 8 +- .../modules/medical/code/smartdarts.dm | 4 +- .../modules/microfusion/code/gun_types.dm | 4 +- .../code/microfusion_energy_master.dm | 5 +- .../modules/modular_weapons/code/automatic.dm | 20 +- .../modules/modular_weapons/code/energy.dm | 24 +- .../modules/modular_weapons/code/pistol.dm | 16 +- .../modules/modular_weapons/code/revolver.dm | 3 +- .../modules/modular_weapons/code/rifle.dm | 11 +- .../moretraitoritems/code/ocelot_revolver.dm} | 0 .../code/syndicate_loadout.dm | 2 +- .../modules/novaya_ert/code/automatic.dm | 8 +- .../modules/sec_haul/code/guns/guns.dm | 126 ++- .../sec_haul/code/guns/pepperball_gun.dm | 4 +- .../tribal_extended/code/weapons/bow.dm | 4 +- tgstation.dme | 12 +- 65 files changed, 684 insertions(+), 1723 deletions(-) delete mode 100644 modular_skyrat/master_files/code/datums/components/fullauto.dm delete mode 100644 modular_skyrat/master_files/code/modules/projectiles/guns/ballistic.dm delete mode 100644 modular_skyrat/master_files/code/modules/projectiles/guns/ballistic/automatic.dm delete mode 100644 modular_skyrat/master_files/code/modules/projectiles/guns/gun.dm delete mode 100644 modular_skyrat/modules/company_imports/code/gun_companies.dm create mode 100644 modular_skyrat/modules/gun_safety/code/safety_additions.dm create mode 100644 modular_skyrat/modules/gun_safety/code/safety_component.dm rename modular_skyrat/modules/{gunsafety => gun_safety}/icons/actions.dmi (100%) rename modular_skyrat/modules/{gunsafety => gun_safety}/readme.md (87%) delete mode 100644 modular_skyrat/modules/gunsafety/code/gun_safety.dm create mode 100644 modular_skyrat/modules/manufacturer_examine/code/gun_company_additions.dm create mode 100644 modular_skyrat/modules/manufacturer_examine/code/manufacturer_component.dm create mode 100644 modular_skyrat/modules/manufacturer_examine/readme.md rename modular_skyrat/{master_files/code/modules/projectiles/guns/ballistic/revolver.dm => modules/moretraitoritems/code/ocelot_revolver.dm} (100%) diff --git a/_maps/RandomZLevels/blackmesa.dmm b/_maps/RandomZLevels/blackmesa.dmm index 6b38dda3e8f..8c2d300c788 100644 --- a/_maps/RandomZLevels/blackmesa.dmm +++ b/_maps/RandomZLevels/blackmesa.dmm @@ -3998,9 +3998,7 @@ /area/awaymission/black_mesa/security_outpost) "aYe" = ( /obj/structure/rack/gunrack, -/obj/item/gun/ballistic/revolver/mateba{ - fire_select_modes = list(1,2) - }, +/obj/item/gun/ballistic/revolver/mateba, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/awaymission/black_mesa/security_outpost) @@ -5153,7 +5151,6 @@ /obj/item/gun/ballistic/automatic/pistol/g17/mesa{ burst_size = 3; desc = "A weapon from bygone times, and this is the exact 21st century version. In fact, even more reliable, but it also can run full automatic fire mode. Chambered in 9mm."; - fire_select_modes = list(1,2,3); firing_burst = 1; name = "\improper Glock-18" }, diff --git a/code/__DEFINES/~skyrat_defines/gun.dm b/code/__DEFINES/~skyrat_defines/gun.dm index 6d2d4adcbaa..626b27a4522 100644 --- a/code/__DEFINES/~skyrat_defines/gun.dm +++ b/code/__DEFINES/~skyrat_defines/gun.dm @@ -1,7 +1,3 @@ -#define SELECT_SEMI_AUTOMATIC 1 -#define SELECT_BURST_SHOT 2 -#define SELECT_FULLY_AUTOMATIC 3 - // Bitflags for what company produces the gun #define COMPANY_CANTALAN (1<<0) #define COMPANY_ARMADYNE (1<<1) diff --git a/code/datums/components/fullauto.dm b/code/datums/components/fullauto.dm index 279a9e473cf..28009784233 100644 --- a/code/datums/components/fullauto.dm +++ b/code/datums/components/fullauto.dm @@ -1,4 +1,3 @@ -/* SKYRAT EDIT REMOVAL - MOVED TO MODULAR FULLAUTO.DM #define AUTOFIRE_MOUSEUP 0 #define AUTOFIRE_MOUSEDOWN 1 @@ -313,4 +312,3 @@ #undef AUTOFIRE_MOUSEUP #undef AUTOFIRE_MOUSEDOWN -*/ diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 5ffd0cb9562..b73ba371644 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -1,4 +1,3 @@ -/* SKYRAT EDIT REMOVAL - MOVED TO MODULAR GUN.DM #define DUALWIELD_PENALTY_EXTRA_MULTIPLIER 1.4 #define FIRING_PIN_REMOVAL_DELAY 50 @@ -75,6 +74,8 @@ pin = new pin(src) add_seclight_point() + give_gun_safeties() // SKYRAT EDIT ADDITION - GUN SAFETIES + give_manufacturer_examine() // SKYRAT EDIT ADDITON - MANUFACTURER EXAMINE /obj/item/gun/Destroy() if(isobj(pin)) //Can still be the initial path, then we skip @@ -577,4 +578,3 @@ #undef FIRING_PIN_REMOVAL_DELAY #undef DUALWIELD_PENALTY_EXTRA_MULTIPLIER -*/ diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm index d006e3e4138..1e3870b063e 100644 --- a/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/code/modules/projectiles/guns/ballistic/automatic.dm @@ -1,4 +1,3 @@ -/* SKYRAT EDIT REMOVAL - MOVED TO MODULAR AUTOMATIC.DM /obj/item/gun/ballistic/automatic w_class = WEIGHT_CLASS_NORMAL can_suppress = TRUE @@ -398,4 +397,3 @@ actions_types = list() fire_sound = 'sound/weapons/laser.ogg' casing_ejector = FALSE -*/ diff --git a/code/modules/projectiles/guns/ballistic/launchers.dm b/code/modules/projectiles/guns/ballistic/launchers.dm index 7e58f2ddacd..36cefffc478 100644 --- a/code/modules/projectiles/guns/ballistic/launchers.dm +++ b/code/modules/projectiles/guns/ballistic/launchers.dm @@ -11,7 +11,6 @@ w_class = WEIGHT_CLASS_NORMAL pin = /obj/item/firing_pin/implant/pindicate bolt_type = BOLT_TYPE_NO_BOLT - has_gun_safety = FALSE //SKYRAT EDIT /obj/item/gun/ballistic/revolver/grenadelauncher/unrestricted pin = /obj/item/firing_pin @@ -40,7 +39,6 @@ mag_type = /obj/item/ammo_box/magazine/m75 burst_size = 1 fire_delay = 0 - fire_select_modes = list(SELECT_SEMI_AUTOMATIC) //SKYRAT EDIT CHANGE casing_ejector = FALSE /obj/item/gun/ballistic/rocketlauncher diff --git a/code/modules/projectiles/guns/ballistic/pistol.dm b/code/modules/projectiles/guns/ballistic/pistol.dm index 661ad6dad4c..fed8df4d2c7 100644 --- a/code/modules/projectiles/guns/ballistic/pistol.dm +++ b/code/modules/projectiles/guns/ballistic/pistol.dm @@ -8,7 +8,6 @@ can_suppress = TRUE burst_size = 1 fire_delay = 0 - fire_select_modes = list(SELECT_SEMI_AUTOMATIC) //SKYRAT EDIT CHANGE bolt_type = BOLT_TYPE_LOCKING fire_sound = 'sound/weapons/gun/pistol/shot.ogg' dry_fire_sound = 'sound/weapons/gun/pistol/dry_fire.ogg' diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index f6ba97d06ab..8728e924f81 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -142,7 +142,6 @@ fire_delay = 10 //Skyrat edit - Original: 0 pin = /obj/item/firing_pin/implant/pindicate fire_sound = 'sound/weapons/gun/shotgun/shot_alt.ogg' - fire_select_modes = list(SELECT_SEMI_AUTOMATIC) //SKYRAT EDIT CHANGE mag_display = TRUE empty_indicator = TRUE empty_alarm = TRUE diff --git a/code/modules/projectiles/guns/energy/laser_gatling.dm b/code/modules/projectiles/guns/energy/laser_gatling.dm index 9a965f02692..f12a62d2c26 100644 --- a/code/modules/projectiles/guns/energy/laser_gatling.dm +++ b/code/modules/projectiles/guns/energy/laser_gatling.dm @@ -113,15 +113,13 @@ item_flags = NEEDS_PERMIT | SLOWS_WHILE_IN_HAND can_charge = FALSE var/obj/item/minigunpack/ammo_pack - fire_select_modes = list(SELECT_SEMI_AUTOMATIC, SELECT_FULLY_AUTOMATIC)//SKYRAT EDIT ADDITION - /obj/item/gun/energy/minigun/Initialize(mapload) if(!istype(loc, /obj/item/minigunpack)) //We should spawn inside an ammo pack so let's use that one. return INITIALIZE_HINT_QDEL //No pack, no gun ammo_pack = loc AddElement(/datum/element/update_icon_blocker) - //AddComponent(/datum/component/automatic_fire, 0.2 SECONDS) SKYRAT EDIT REMOVAL + AddComponent(/datum/component/automatic_fire, 0.2 SECONDS) return ..() /obj/item/gun/energy/minigun/Destroy() diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 12212dd9b9b..630b02d40e9 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -381,7 +381,7 @@ /obj/item/gun/energy/tesla_cannon/Initialize(mapload) . = ..() - //AddComponent(/datum/component/automatic_fire, 0.1 SECONDS) SKYRAT EDIT REMOVAL + AddComponent(/datum/component/automatic_fire, 0.1 SECONDS) /obj/item/gun/energy/marksman_revolver name = "marksman revolver" diff --git a/code/modules/projectiles/guns/special/syringe_gun.dm b/code/modules/projectiles/guns/special/syringe_gun.dm index 1911d139f53..cf79da9dfca 100644 --- a/code/modules/projectiles/guns/special/syringe_gun.dm +++ b/code/modules/projectiles/guns/special/syringe_gun.dm @@ -194,7 +194,6 @@ pixel_x = 0 force = 4 trigger_guard = TRIGGER_GUARD_ALLOW_ALL - has_gun_safety = FALSE // SKYRAT EDIT /obj/item/gun/syringe/blowgun/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) visible_message(span_danger("[user] starts aiming with a blowgun!")) diff --git a/code/modules/unit_tests/mecha_damage.dm b/code/modules/unit_tests/mecha_damage.dm index e3ca7566e90..55081e9365c 100644 --- a/code/modules/unit_tests/mecha_damage.dm +++ b/code/modules/unit_tests/mecha_damage.dm @@ -30,7 +30,7 @@ // Get a sample laser weapon. // The captain's laser gun here is chosen primarily because it deals more damage than normal lasers. var/obj/item/gun/energy/laser/dummy_laser = allocate(/obj/item/gun/energy/laser/captain) - dummy_laser.safety = FALSE // SKYRAT EDIT - Safeties on guns make them impossible to shoot :) + qdel(dummy_laser.GetComponent(/datum/component/gun_safety)) // SKYRAT EDIT - Safeties on guns make them impossible to shoot :) var/obj/item/ammo_casing/laser_ammo = dummy_laser.ammo_type[1] var/obj/projectile/beam/laser_fired = initial(laser_ammo.projectile_type) var/expected_laser_damage = round(dummy_laser.projectile_damage_multiplier * initial(laser_fired.damage) * (1 - expected_laser_armor / 100), DAMAGE_PRECISION) @@ -38,7 +38,7 @@ // Get a sample ballistic weapon. // The syndicate .357 here is chosen because it does a lot of damage. var/obj/item/gun/ballistic/dummy_gun = allocate(/obj/item/gun/ballistic/revolver) - dummy_gun.safety = FALSE // SKYRAT EDIT - Safeties on guns make them impossible to shoot :) + qdel(dummy_gun.GetComponent(/datum/component/gun_safety)) // SKYRAT EDIT - Safeties on guns make them impossible to shoot :) var/obj/item/ammo_casing/ballistic_ammo = dummy_gun.magazine.ammo_type var/obj/projectile/bullet_fired = initial(ballistic_ammo.projectile_type) var/expected_bullet_damage = round(dummy_gun.projectile_damage_multiplier * initial(bullet_fired.damage) * (1 - expected_bullet_armor / 100), DAMAGE_PRECISION) diff --git a/code/modules/unit_tests/projectiles.dm b/code/modules/unit_tests/projectiles.dm index e0c04f0ce9e..8f0872d0e89 100644 --- a/code/modules/unit_tests/projectiles.dm +++ b/code/modules/unit_tests/projectiles.dm @@ -18,8 +18,8 @@ gunner.put_in_hands(test_gun, forced=TRUE) //SKYRAT EDIT ADDITION BEGIN - if(test_gun.has_gun_safety) - test_gun.toggle_safety(gunner) + if(test_gun.GetComponent(/datum/component/gun_safety)) + qdel(test_gun.GetComponent(/datum/component/gun_safety)) loaded_bullet.wound_bonus = CANT_WOUND //Baseline wounding makes things weird //SKYRAT EDIT ADDITION END gunner.set_combat_mode(FALSE) // just to make sure we know we're not trying to pistol-whip them diff --git a/modular_skyrat/master_files/code/datums/components/fullauto.dm b/modular_skyrat/master_files/code/datums/components/fullauto.dm deleted file mode 100644 index 4ecd620fac4..00000000000 --- a/modular_skyrat/master_files/code/datums/components/fullauto.dm +++ /dev/null @@ -1,320 +0,0 @@ -#define AUTOFIRE_MOUSEUP 0 -#define AUTOFIRE_MOUSEDOWN 1 - -/datum/component/automatic_fire - var/client/clicker - var/mob/living/shooter - var/atom/target - var/turf/target_loc // For dealing with locking on targets due to BYOND engine limitations (the mouse input only happening when mouse moves). - var/autofire_stat = AUTOFIRE_STAT_IDLE - var/mouse_parameters - var/autofire_shot_delay = 0.3 SECONDS // Time between individual shots. - var/mouse_status = AUTOFIRE_MOUSEUP // This seems hacky but there can be two MouseDown() without a MouseUp() in between if the user holds click and uses alt+tab, printscreen or similar. - - ///windup autofire vars - ///Whether the delay between shots increases over time, simulating a spooling weapon - var/windup_autofire = FALSE - ///the reduction to shot delay for windup - var/current_windup_reduction = 0 - ///the percentage of autfire_shot_delay that is added to current_windup_reduction - var/windup_autofire_reduction_multiplier = 0.3 - ///How high of a reduction that current_windup_reduction can reach - var/windup_autofire_cap = 0.3 - ///How long it takes for weapons that have spooled-up to reset back to the original firing speed - var/windup_spindown = 3 SECONDS - ///Timer for tracking the spindown reset timings - var/timerid - COOLDOWN_DECLARE(next_shot_cd) - -/datum/component/automatic_fire/Initialize(autofire_shot_delay, windup_autofire, windup_autofire_reduction_multiplier, windup_autofire_cap, windup_spindown) - . = ..() - if(!isgun(parent)) - return COMPONENT_INCOMPATIBLE - var/obj/item/gun = parent - RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(wake_up)) - RegisterSignal(parent, COMSIG_GUN_AUTOFIRE_SELECTED, PROC_REF(wake_up)) - RegisterSignals(parent, list(COMSIG_PARENT_PREQDELETED, COMSIG_ITEM_DROPPED, COMSIG_GUN_AUTOFIRE_DESELECTED), PROC_REF(autofire_off)) - RegisterSignal(parent, COMSIG_GUN_JAMMED, PROC_REF(stop_autofiring)) - if(autofire_shot_delay) - src.autofire_shot_delay = autofire_shot_delay - if(windup_autofire) - src.windup_autofire = windup_autofire - src.windup_autofire_reduction_multiplier = windup_autofire_reduction_multiplier - src.windup_autofire_cap = windup_autofire_cap - src.windup_spindown = windup_spindown - if(ismob(gun.loc)) - var/mob/user = gun.loc - wake_up(src, user) - - -/datum/component/automatic_fire/Destroy() - UnregisterSignal(parent, list(COMSIG_PARENT_PREQDELETED, COMSIG_ITEM_DROPPED, COMSIG_GUN_AUTOFIRE_DESELECTED, COMSIG_GUN_JAMMED, \ - COMSIG_GUN_AUTOFIRE_SELECTED, COMSIG_ITEM_EQUIPPED)) - autofire_off() - return ..() - -/datum/component/automatic_fire/process(delta_time) - if(!(autofire_stat & AUTOFIRE_STAT_FIRING)) - STOP_PROCESSING(SSprojectiles, src) - return - - if(!COOLDOWN_FINISHED(src, next_shot_cd)) - return - - process_shot() - -/datum/component/automatic_fire/proc/wake_up(datum/source, mob/user, slot) - SIGNAL_HANDLER - if(autofire_stat & (AUTOFIRE_STAT_ALERT)) - return // We've updated the firemode. No need for more. - if(autofire_stat & AUTOFIRE_STAT_FIRING) - stop_autofiring() // Let's stop shooting to avoid issues. - return - - var/obj/item/gun/parent_gun = parent - - if(iscarbon(user)) - var/mob/living/carbon/shooter = user - if(shooter.is_holding(parent) && parent_gun.fire_select == SELECT_FULLY_AUTOMATIC) - autofire_on(shooter.client) - else - autofire_off() - -// There is a gun and there is a user wielding it. The component now waits for the mouse click. -/datum/component/automatic_fire/proc/autofire_on(client/usercli) - SIGNAL_HANDLER - if(autofire_stat & (AUTOFIRE_STAT_ALERT|AUTOFIRE_STAT_FIRING)) - return - autofire_stat = AUTOFIRE_STAT_ALERT - clicker = usercli - shooter = clicker.mob - RegisterSignal(clicker, COMSIG_CLIENT_MOUSEDOWN, PROC_REF(on_mouse_down)) - RegisterSignal(shooter, COMSIG_MOB_LOGOUT, PROC_REF(autofire_off)) - if(!QDELETED(shooter)) - UnregisterSignal(shooter, COMSIG_MOB_LOGIN) - parent.RegisterSignal(src, COMSIG_AUTOFIRE_ONMOUSEDOWN, TYPE_PROC_REF(/obj/item/gun, autofire_bypass_check)) - parent.RegisterSignal(parent, COMSIG_AUTOFIRE_SHOT, TYPE_PROC_REF(/obj/item/gun, do_autofire)) - - -/datum/component/automatic_fire/proc/autofire_off(datum/source) - SIGNAL_HANDLER - if(autofire_stat & (AUTOFIRE_STAT_IDLE)) - return - if(autofire_stat & AUTOFIRE_STAT_FIRING) - stop_autofiring() - - autofire_stat = AUTOFIRE_STAT_IDLE - - if(!QDELETED(clicker)) - UnregisterSignal(clicker, list(COMSIG_CLIENT_MOUSEDOWN, COMSIG_CLIENT_MOUSEUP, COMSIG_CLIENT_MOUSEDRAG)) - mouse_status = AUTOFIRE_MOUSEUP // In regards to the component there's no click anymore to care about. - clicker = null - RegisterSignal(shooter, COMSIG_MOB_LOGIN, PROC_REF(on_client_login)) - if(!QDELETED(shooter)) - UnregisterSignal(shooter, COMSIG_MOB_LOGOUT) - shooter = null - parent.UnregisterSignal(src, COMSIG_AUTOFIRE_ONMOUSEDOWN) - parent.UnregisterSignal(parent, COMSIG_AUTOFIRE_SHOT) - - -/datum/component/automatic_fire/proc/on_client_login(mob/source) - SIGNAL_HANDLER - if(!source.client) - return - if(source.is_holding(parent)) - autofire_on(source.client) - -/datum/component/automatic_fire/proc/on_mouse_down(client/source, atom/_target, turf/location, control, params) - SIGNAL_HANDLER - var/list/modifiers = params2list(params) // If they're shift+clicking, for example, let's not have them accidentally shoot. - - if(LAZYACCESS(modifiers, SHIFT_CLICK)) - return - if(LAZYACCESS(modifiers, CTRL_CLICK)) - return - if(LAZYACCESS(modifiers, MIDDLE_CLICK)) - return - if(LAZYACCESS(modifiers, RIGHT_CLICK)) - return - if(LAZYACCESS(modifiers, ALT_CLICK)) - return - if(source.mob.throw_mode) - return - if(!isturf(source.mob.loc)) // No firing inside lockers and stuff. - return - if(get_dist(source.mob, _target) < 2) // Adjacent clicking. - return - - if(isnull(location) || istype(_target, /atom/movable/screen)) // Clicking on a screen object. - if(_target.plane != CLICKCATCHER_PLANE) // The clickcatcher is a special case. We want the click to trigger then, under it. - return // If we click and drag on our worn backpack, for example, we want it to open instead. - _target = parse_caught_click_modifiers(modifiers, get_turf(source.eye), source) - params = list2params(modifiers) - if(!_target) - CRASH("Failed to get the turf under clickcatcher") - - if(SEND_SIGNAL(src, COMSIG_AUTOFIRE_ONMOUSEDOWN, source, _target, location, control, params) & COMPONENT_AUTOFIRE_ONMOUSEDOWN_BYPASS) - return - - source.click_intercept_time = world.time // From this point onwards Click() will no longer be triggered. - - if(autofire_stat & (AUTOFIRE_STAT_IDLE)) - CRASH("on_mouse_down() called with [autofire_stat] autofire_stat") - if(autofire_stat & AUTOFIRE_STAT_FIRING) - stop_autofiring() // This can happen if we click and hold and then alt+tab, printscreen or other such action. MouseUp won't be called then and it will keep autofiring. - - target = _target - target_loc = get_turf(target) - mouse_parameters = params - start_autofiring() - - -// Dakka-dakka -/datum/component/automatic_fire/proc/start_autofiring() - if(autofire_stat == AUTOFIRE_STAT_FIRING) - return // Already pew-pewing. - - autofire_stat = AUTOFIRE_STAT_FIRING - - clicker.mouse_override_icon = 'icons/effects/mouse_pointers/weapon_pointer.dmi' - clicker.mouse_pointer_icon = clicker.mouse_override_icon - - if(mouse_status == AUTOFIRE_MOUSEUP) // See mouse_status definition for the reason for this. - RegisterSignal(clicker, COMSIG_CLIENT_MOUSEUP, PROC_REF(on_mouse_up)) - mouse_status = AUTOFIRE_MOUSEDOWN - - RegisterSignal(shooter, COMSIG_MOB_SWAP_HANDS, PROC_REF(stop_autofiring)) - - if(isgun(parent)) - var/obj/item/gun/shoota = parent - if(!shoota.on_autofire_start(shooter)) // This is needed because the minigun has a do_after before firing and signals are async. - stop_autofiring() - return - if(autofire_stat != AUTOFIRE_STAT_FIRING) - return // Things may have changed while on_autofire_start() was being processed, due to do_after's sleep. - - if(!process_shot()) // First shot is processed instantly. - return // If it fails, such as when the gun is empty, then there's no need to schedule a second shot. - - START_PROCESSING(SSprojectiles, src) - RegisterSignal(clicker, COMSIG_CLIENT_MOUSEDRAG, PROC_REF(on_mouse_drag)) - - -/datum/component/automatic_fire/proc/on_mouse_up(datum/source, atom/object, turf/location, control, params) - SIGNAL_HANDLER - UnregisterSignal(clicker, COMSIG_CLIENT_MOUSEUP) - mouse_status = AUTOFIRE_MOUSEUP - if(autofire_stat == AUTOFIRE_STAT_FIRING) - stop_autofiring() - return COMPONENT_CLIENT_MOUSEUP_INTERCEPT - - -/datum/component/automatic_fire/proc/stop_autofiring(datum/source, atom/object, turf/location, control, params) - SIGNAL_HANDLER - switch(autofire_stat) - if(AUTOFIRE_STAT_IDLE, AUTOFIRE_STAT_ALERT) - return - STOP_PROCESSING(SSprojectiles, src) - autofire_stat = AUTOFIRE_STAT_ALERT - if(clicker) - clicker.mouse_override_icon = null - clicker.mouse_pointer_icon = clicker.mouse_override_icon - UnregisterSignal(clicker, COMSIG_CLIENT_MOUSEDRAG) - if(!QDELETED(shooter)) - UnregisterSignal(shooter, COMSIG_MOB_SWAP_HANDS) - target = null - target_loc = null - mouse_parameters = null - -/datum/component/automatic_fire/proc/on_mouse_drag(client/source, atom/src_object, atom/over_object, turf/src_location, turf/over_location, src_control, over_control, params) - SIGNAL_HANDLER - if(isnull(over_location)) // This happens when the mouse is over an inventory or screen object, or on entering deep darkness, for example. - var/list/modifiers = params2list(params) - var/new_target = parse_caught_click_modifiers(modifiers, get_turf(source.eye), source) - params = list2params(modifiers) - mouse_parameters = params - if(!new_target) - if(QDELETED(target)) // No new target acquired, and old one was deleted, get us out of here. - stop_autofiring() - CRASH("on_mouse_drag failed to get the turf under screen object [over_object.type]. Old target was incidentally QDELETED.") - target = get_turf(target) // If previous target wasn't a turf, let's turn it into one to avoid locking onto a potentially moving target. - target_loc = target - CRASH("on_mouse_drag failed to get the turf under screen object [over_object.type]") - target = new_target - target_loc = new_target - return - target = over_object - target_loc = get_turf(over_object) - mouse_parameters = params - - -/datum/component/automatic_fire/proc/process_shot() - if(autofire_stat != AUTOFIRE_STAT_FIRING) - return - if(QDELETED(target) || get_turf(target) != target_loc) // Target moved or got destroyed since we last aimed. - target = target_loc // So we keep firing on the emptied tile until we move our mouse and find a new target. - if(get_dist(shooter, target) <= 0) - target = get_step(shooter, shooter.dir) // Shoot in the direction faced if the mouse is on the same tile as we are. - target_loc = target - else if(!in_view_range(shooter, target)) - stop_autofiring() // Elvis has left the building. - return FALSE - shooter.face_atom(target) - var/next_delay = autofire_shot_delay - if(windup_autofire) - next_delay = clamp(next_delay - current_windup_reduction, round(autofire_shot_delay * windup_autofire_cap), autofire_shot_delay) - current_windup_reduction = (current_windup_reduction + round(autofire_shot_delay * windup_autofire_reduction_multiplier)) - timerid = addtimer(CALLBACK(src, PROC_REF(windup_reset), FALSE), windup_spindown, TIMER_UNIQUE|TIMER_OVERRIDE|TIMER_STOPPABLE) - if(HAS_TRAIT(shooter, TRAIT_DOUBLE_TAP)) - next_delay = round(next_delay * 0.5) - COOLDOWN_START(src, next_shot_cd, next_delay) - if(SEND_SIGNAL(parent, COMSIG_AUTOFIRE_SHOT, target, shooter, mouse_parameters) & COMPONENT_AUTOFIRE_SHOT_SUCCESS) - return TRUE - stop_autofiring() - return FALSE - -/// Reset for our windup, resetting everything back to initial values after a variable set amount of time (determined by var/windup_spindown). -/datum/component/automatic_fire/proc/windup_reset(deltimer) - current_windup_reduction = initial(current_windup_reduction) - if(deltimer && timerid) - deltimer(timerid) - -// Gun procs. - -/obj/item/gun/proc/on_autofire_start(mob/living/shooter) - if(!can_shoot(shooter) || !can_trigger_gun(shooter) || shooter.incapacitated() || semicd) - return FALSE - var/obj/item/bodypart/other_hand = shooter.has_hand_for_held_index(shooter.get_inactive_hand_index()) - if(weapon_weight == WEAPON_HEAVY && (shooter.get_inactive_held_item() || !other_hand)) - balloon_alert(shooter, "need two hands!") - return FALSE - return TRUE - - -/obj/item/gun/proc/autofire_bypass_check(datum/source, client/clicker, atom/target, turf/location, control, params) - SIGNAL_HANDLER - if(clicker.mob.get_active_held_item() != src) - return COMPONENT_AUTOFIRE_ONMOUSEDOWN_BYPASS - -/obj/item/gun/proc/do_autofire(datum/source, atom/target, mob/living/shooter, params) - SIGNAL_HANDLER - if(shooter.incapacitated()) - return FALSE - if(!can_shoot()) - shoot_with_empty_chamber(shooter) - return FALSE - INVOKE_ASYNC(src, PROC_REF(do_autofire_shot), source, target, shooter, params) - return COMPONENT_AUTOFIRE_SHOT_SUCCESS - -/obj/item/gun/proc/do_autofire_shot(datum/source, atom/target, mob/living/shooter, params) - var/obj/item/gun/akimbo_gun = shooter.get_inactive_held_item() - var/bonus_spread = 0 - if(istype(akimbo_gun) && weapon_weight < WEAPON_MEDIUM) - if(akimbo_gun.weapon_weight < WEAPON_MEDIUM && akimbo_gun.can_trigger_gun(shooter)) - bonus_spread = dual_wield_spread - addtimer(CALLBACK(akimbo_gun, TYPE_PROC_REF(/obj/item/gun, process_fire), target, shooter, TRUE, params, null, bonus_spread), 1) - process_fire(target, shooter, TRUE, params, null, bonus_spread) - - -#undef AUTOFIRE_MOUSEUP -#undef AUTOFIRE_MOUSEDOWN diff --git a/modular_skyrat/master_files/code/modules/projectiles/guns/ballistic.dm b/modular_skyrat/master_files/code/modules/projectiles/guns/ballistic.dm deleted file mode 100644 index bc49ab26cf3..00000000000 --- a/modular_skyrat/master_files/code/modules/projectiles/guns/ballistic.dm +++ /dev/null @@ -1,6 +0,0 @@ -// A file for overrides to ballistic weapons that don't have a special Skyrat icon. -/obj/item/gun/ballistic/rifle/lionhunter - icon = 'icons/obj/weapons/guns/ballistic.dmi' - -/obj/item/gun/ballistic/rifle/boltaction/brand_new/prime - icon = 'icons/obj/weapons/guns/ballistic.dmi' diff --git a/modular_skyrat/master_files/code/modules/projectiles/guns/ballistic/automatic.dm b/modular_skyrat/master_files/code/modules/projectiles/guns/ballistic/automatic.dm deleted file mode 100644 index 6864d0611b6..00000000000 --- a/modular_skyrat/master_files/code/modules/projectiles/guns/ballistic/automatic.dm +++ /dev/null @@ -1,348 +0,0 @@ -/obj/item/gun/ballistic/automatic - w_class = WEIGHT_CLASS_NORMAL - can_suppress = TRUE - burst_size = 3 - fire_delay = 2 - semi_auto = TRUE - fire_sound = 'sound/weapons/gun/smg/shot.ogg' - fire_sound_volume = 90 - rack_sound = 'sound/weapons/gun/smg/smgrack.ogg' - suppressed_sound = 'sound/weapons/gun/smg/shot_suppressed.ogg' - fire_select_modes = list(SELECT_SEMI_AUTOMATIC, SELECT_BURST_SHOT, SELECT_FULLY_AUTOMATIC) - -/obj/item/gun/ballistic/automatic/proto - name = "\improper Nanotrasen Saber SMG" - desc = "A prototype three-round burst 9mm submachine gun, designated 'SABR'. Has a threaded barrel for suppressors." - icon_state = "saber" - selector_switch_icon = TRUE - mag_display = TRUE - empty_indicator = TRUE - mag_type = /obj/item/ammo_box/magazine/smgm9mm - pin = null - bolt_type = BOLT_TYPE_LOCKING - show_bolt_icon = FALSE - company_flag = COMPANY_NANOTRASEN - -/obj/item/gun/ballistic/automatic/proto/unrestricted - pin = /obj/item/firing_pin - -/obj/item/gun/ballistic/automatic/c20r - name = "\improper C-20r SMG" - desc = "A bullpup three-round burst .45 SMG, designated 'C-20r'." - icon_state = "c20r" - inhand_icon_state = "c20r" - selector_switch_icon = TRUE - mag_type = /obj/item/ammo_box/magazine/smgm45 - fire_delay = 2 - burst_size = 3 - pin = /obj/item/firing_pin/implant/pindicate - can_bayonet = TRUE - knife_x_offset = 26 - knife_y_offset = 12 - mag_display = TRUE - mag_display_ammo = TRUE - empty_indicator = TRUE - company_flag = COMPANY_SCARBOROUGH - -/obj/item/gun/ballistic/automatic/c20r/update_overlays() - . = ..() - if(!chambered && empty_indicator) - . += "[icon_state]_empty" - -/obj/item/gun/ballistic/automatic/c20r/unrestricted - pin = /obj/item/firing_pin - -/obj/item/gun/ballistic/automatic/c20r/Initialize(mapload) - . = ..() - update_appearance() - -/obj/item/gun/ballistic/automatic/wt550 - name = "security auto rifle" - desc = "An outdated personal defence weapon. Uses 4.6x30mm rounds and is designated the WT-550 Automatic Rifle." - icon_state = "wt550" - w_class = WEIGHT_CLASS_BULKY - inhand_icon_state = "arg" - mag_type = /obj/item/ammo_box/magazine/wt550m9 - fire_delay = 2 - can_suppress = FALSE - burst_size = 1 - fire_select_modes = list(SELECT_SEMI_AUTOMATIC, SELECT_FULLY_AUTOMATIC) - can_bayonet = TRUE - knife_x_offset = 25 - knife_y_offset = 12 - mag_display = TRUE - mag_display_ammo = TRUE - empty_indicator = TRUE - company_flag = COMPANY_NANOTRASEN - -/obj/item/gun/ballistic/automatic/plastikov - name = "\improper PP-95 SMG" - desc = "An ancient 9mm submachine gun pattern updated and simplified to lower costs, though perhaps simplified too much." - icon_state = "plastikov" - inhand_icon_state = "plastikov" - mag_type = /obj/item/ammo_box/magazine/plastikov9mm - burst_size = 5 - spread = 15 - can_suppress = FALSE - projectile_damage_multiplier = 0.35 // It's like 10.5 damage per bullet, it's close enough to 10 shots - mag_display = TRUE - empty_indicator = TRUE - fire_sound = 'sound/weapons/gun/smg/shot_alt.ogg' - company_flag = COMPANY_IZHEVSK - -/obj/item/gun/ballistic/automatic/mini_uzi - name = "\improper type U3 uzi" - desc = "A lightweight, burst-fire submachine gun, for when you really want someone dead. Uses 9mm rounds." - icon_state = "miniuzi" - mag_type = /obj/item/ammo_box/magazine/uzim9mm - burst_size = 2 - bolt_type = BOLT_TYPE_OPEN - show_bolt_icon = FALSE - mag_display = TRUE - rack_sound = 'sound/weapons/gun/pistol/slide_lock.ogg' - company_flag = COMPANY_OLDARMS - -/obj/item/gun/ballistic/automatic/m90 - name = "\improper M-90gl carbine" - desc = "A three-round burst 5.56 toploading carbine, designated 'M-90gl'. Has an attached underbarrel grenade launcher which can be fired using right click." - icon_state = "m90" - w_class = WEIGHT_CLASS_BULKY - inhand_icon_state = "m90" - selector_switch_icon = TRUE - mag_type = /obj/item/ammo_box/magazine/m556 - can_suppress = FALSE - var/obj/item/gun/ballistic/revolver/grenadelauncher/underbarrel - burst_size = 3 - fire_delay = 2 - spread = 5 - pin = /obj/item/firing_pin/implant/pindicate - mag_display = TRUE - empty_indicator = TRUE - fire_sound = 'sound/weapons/gun/smg/shot_alt.ogg' - company_flag = COMPANY_SCARBOROUGH - -/obj/item/gun/ballistic/automatic/m90/Initialize(mapload) - . = ..() - underbarrel = new /obj/item/gun/ballistic/revolver/grenadelauncher(src) - update_appearance() - -/obj/item/gun/ballistic/automatic/m90/Destroy() - QDEL_NULL(underbarrel) - return ..() - -/obj/item/gun/ballistic/automatic/m90/unrestricted - pin = /obj/item/firing_pin - -/obj/item/gun/ballistic/automatic/m90/unrestricted/Initialize(mapload) - . = ..() - underbarrel = new /obj/item/gun/ballistic/revolver/grenadelauncher/unrestricted(src) - update_appearance() - -/obj/item/gun/ballistic/automatic/m90/afterattack_secondary(atom/target, mob/living/user, flag, params) - underbarrel.afterattack(target, user, flag, params) - return SECONDARY_ATTACK_CONTINUE_CHAIN - -/obj/item/gun/ballistic/automatic/m90/attackby(obj/item/attacking_item, mob/user, params) - if(istype(attacking_item, /obj/item/ammo_casing)) - if(istype(attacking_item, underbarrel.magazine.ammo_type)) - underbarrel.attack_self(user) - underbarrel.attackby(attacking_item, user, params) - else - ..() - -/obj/item/gun/ballistic/automatic/tommygun - name = "\improper Thompson SMG" - desc = "Based on the classic 'Chicago Typewriter'." - icon_state = "tommygun" - inhand_icon_state = "shotgun" - selector_switch_icon = TRUE - w_class = WEIGHT_CLASS_BULKY - slot_flags = 0 - mag_type = /obj/item/ammo_box/magazine/tommygunm45 - can_suppress = FALSE - burst_size = 1 - fire_select_modes = list(SELECT_SEMI_AUTOMATIC, SELECT_FULLY_AUTOMATIC) - fire_delay = 1 - bolt_type = BOLT_TYPE_OPEN - empty_indicator = TRUE - show_bolt_icon = FALSE - company_flag = COMPANY_OLDARMS - -/obj/item/gun/ballistic/automatic/tommygun/therealtommy - name = "Tommy gun" - desc = "The classic 'Chicago Typewriter'." - company_flag = null // This is the real deal, you hear? - -/obj/item/gun/ballistic/automatic/ar - name = "\improper NT-ARG 'Boarder'" - desc = "A robust assault rifle used by Nanotrasen fighting forces." - icon_state = "arg" - inhand_icon_state = "arg" - slot_flags = 0 - mag_type = /obj/item/ammo_box/magazine/m556 - can_suppress = FALSE - burst_size = 3 - fire_delay = 1 - company_flag = COMPANY_NANOTRASEN - - -// L6 SAW // - -/obj/item/gun/ballistic/automatic/l6_saw - name = "\improper L6 SAW" - desc = "A large light machine gun chambered for the 7.12x82mm cartridge." - icon_state = "l6" - inhand_icon_state = "l6closedmag" - base_icon_state = "l6" - w_class = WEIGHT_CLASS_HUGE - slot_flags = 0 - mag_type = /obj/item/ammo_box/magazine/mm712x82 - weapon_weight = WEAPON_HEAVY - burst_size = 1 - fire_select_modes = list(SELECT_SEMI_AUTOMATIC, SELECT_FULLY_AUTOMATIC) - can_suppress = FALSE - spread = 7 - pin = /obj/item/firing_pin/implant/pindicate - bolt_type = BOLT_TYPE_OPEN - show_bolt_icon = FALSE - mag_display = TRUE - mag_display_ammo = TRUE - tac_reloads = FALSE - fire_sound = 'sound/weapons/gun/l6/shot.ogg' - rack_sound = 'sound/weapons/gun/l6/l6_rack.ogg' - suppressed_sound = 'sound/weapons/gun/general/heavy_shot_suppressed.ogg' - var/cover_open = FALSE - company_flag = COMPANY_SCARBOROUGH - -/obj/item/gun/ballistic/automatic/l6_saw/unrestricted - pin = /obj/item/firing_pin - -/obj/item/gun/ballistic/automatic/l6_saw/Initialize(mapload) - . = ..() - AddElement(/datum/element/update_icon_updates_onmob) - -/obj/item/gun/ballistic/automatic/l6_saw/examine(mob/user) - . = ..() - . += "alt + click to [cover_open ? "close" : "open"] the dust cover." - if(cover_open && magazine) - . += span_notice("It seems like you could use an empty hand to remove the magazine.") - - -/obj/item/gun/ballistic/automatic/l6_saw/AltClick(mob/user) - if(!user.canUseTopic(src)) - return - cover_open = !cover_open - balloon_alert(user, "cover [cover_open ? "open" : "closed"]") - playsound(src, 'sound/weapons/gun/l6/l6_door.ogg', 60, TRUE) - update_appearance() - -/obj/item/gun/ballistic/automatic/l6_saw/update_icon_state() - . = ..() - inhand_icon_state = "[base_icon_state][cover_open ? "open" : "closed"][magazine ? "mag":"nomag"]" - -/obj/item/gun/ballistic/automatic/l6_saw/update_overlays() - . = ..() - . += "l6_door_[cover_open ? "open" : "closed"]" - - -/obj/item/gun/ballistic/automatic/l6_saw/afterattack(atom/target as mob|obj|turf, mob/living/user as mob|obj, flag, params) - if(cover_open) - balloon_alert(user, "cover open!") - return - else - . = ..() - update_appearance() - -// ATTACK HAND IGNORING PARENT RETURN VALUE -/obj/item/gun/ballistic/automatic/l6_saw/attack_hand(mob/user, list/modifiers) - if (loc != user) - ..() - return - if (!cover_open) - balloon_alert(user, "cover closed!") - return - ..() - -/obj/item/gun/ballistic/automatic/l6_saw/attackby(obj/item/attacking_item, mob/user, params) - if(!cover_open && istype(attacking_item, mag_type)) - balloon_alert(user, "dust closed!") - return - ..() - -// SNIPER // - -/obj/item/gun/ballistic/automatic/sniper_rifle - name = "sniper rifle" - desc = "A long ranged weapon that does significant damage. No, you can't quickscope." - icon_state = "sniper" - w_class = WEIGHT_CLASS_BULKY - inhand_icon_state = "sniper" - worn_icon_state = null - fire_sound = 'sound/weapons/gun/sniper/shot.ogg' - fire_sound_volume = 90 - vary_fire_sound = FALSE - load_sound = 'sound/weapons/gun/sniper/mag_insert.ogg' - rack_sound = 'sound/weapons/gun/sniper/rack.ogg' - suppressed_sound = 'sound/weapons/gun/general/heavy_shot_suppressed.ogg' - recoil = 2 - weapon_weight = WEAPON_HEAVY - mag_type = /obj/item/ammo_box/magazine/sniper_rounds - fire_delay = 40 - burst_size = 1 - w_class = WEIGHT_CLASS_NORMAL - slot_flags = ITEM_SLOT_BACK - fire_select_modes = list(SELECT_SEMI_AUTOMATIC) - mag_display = TRUE - suppressor_x_offset = 3 - suppressor_y_offset = 3 - -/obj/item/gun/ballistic/automatic/sniper_rifle/Initialize(mapload) - . = ..() - AddComponent(/datum/component/scope, range_modifier = 2) - -/obj/item/gun/ballistic/automatic/sniper_rifle/syndicate - name = "syndicate sniper rifle" - desc = "An illegally modified .50 cal sniper rifle with suppression compatibility. Quickscoping still doesn't work." - can_suppress = TRUE - can_unsuppress = TRUE - pin = /obj/item/firing_pin/implant/pindicate - company_flag = COMPANY_SCARBOROUGH - -// Old Semi-Auto Rifle // - -/obj/item/gun/ballistic/automatic/surplus - name = "surplus rifle" - desc = "One of countless obsolete ballistic rifles that still sees use as a cheap deterrent. Uses 10mm ammo and its bulky frame prevents one-hand firing." - icon_state = "surplus" - inhand_icon_state = "moistnugget" - worn_icon_state = null - weapon_weight = WEAPON_HEAVY - mag_type = /obj/item/ammo_box/magazine/m10mm/rifle - fire_delay = 30 - burst_size = 1 - can_unsuppress = TRUE - can_suppress = TRUE - w_class = WEIGHT_CLASS_HUGE - slot_flags = ITEM_SLOT_BACK - fire_select_modes = list(SELECT_SEMI_AUTOMATIC) - mag_display = TRUE - company_flag = COMPANY_IZHEVSK - -// Laser rifle (rechargeable magazine) // - -/obj/item/gun/ballistic/automatic/laser - name = "laser rifle" - desc = "Though sometimes mocked for the relatively weak firepower of their energy weapons, the logistic miracle of rechargeable ammunition has given Nanotrasen a decisive edge over many a foe." - icon_state = "oldrifle" - w_class = WEIGHT_CLASS_BULKY - inhand_icon_state = "arg" - mag_type = /obj/item/ammo_box/magazine/recharge - empty_indicator = TRUE - fire_delay = 2 - can_suppress = FALSE - burst_size = 0 - // actions_types = list() SKYRAT EDIT REMOVAL - fire_select_modes = list(SELECT_SEMI_AUTOMATIC) - fire_sound = 'sound/weapons/laser.ogg' - casing_ejector = FALSE - company_flag = COMPANY_NANOTRASEN diff --git a/modular_skyrat/master_files/code/modules/projectiles/guns/gun.dm b/modular_skyrat/master_files/code/modules/projectiles/guns/gun.dm deleted file mode 100644 index c7787f8c33f..00000000000 --- a/modular_skyrat/master_files/code/modules/projectiles/guns/gun.dm +++ /dev/null @@ -1,738 +0,0 @@ - -#define DUALWIELD_PENALTY_EXTRA_MULTIPLIER 1.4 -#define FIRING_PIN_REMOVAL_DELAY 50 - -/obj/item/gun - name = "gun" - desc = "It's a gun. It's pretty terrible, though." - icon = 'icons/obj/weapons/guns/ballistic.dmi' - icon_state = "revolver" - inhand_icon_state = "gun" - worn_icon_state = "gun" - flags_1 = CONDUCT_1 - slot_flags = ITEM_SLOT_BELT - custom_materials = list(/datum/material/iron = 2000) - w_class = WEIGHT_CLASS_NORMAL - throwforce = 5 - throw_speed = 3 - throw_range = 5 - force = 5 - item_flags = NEEDS_PERMIT - attack_verb_continuous = list("strikes", "hits", "bashes") - attack_verb_simple = list("strike", "hit", "bash") - - var/gun_flags = NONE - var/fire_sound = 'sound/weapons/gun/pistol/shot.ogg' - var/vary_fire_sound = TRUE - var/fire_sound_volume = 50 - var/dry_fire_sound = 'sound/weapons/gun/general/dry_fire.ogg' - var/suppressed = null // whether or not a message is displayed when fired - var/can_suppress = FALSE - var/suppressed_sound = 'sound/weapons/gun/general/heavy_shot_suppressed.ogg' - var/suppressed_volume = 60 - var/can_unsuppress = TRUE - var/recoil = 0 // boom boom shake the room - var/clumsy_check = TRUE - var/obj/item/ammo_casing/chambered = null - trigger_guard = TRIGGER_GUARD_NORMAL // trigger guard on the weapon, hulks can't fire them with their big meaty fingers - var/sawn_desc = null // description change if weapon is sawn-off - var/sawn_off = FALSE - var/burst_size = 1 // how large a burst is - var/fire_delay = 0 // rate of fire for burst firing and semi auto - var/firing_burst = 0 // Prevent the weapon from firing again while already firing - var/semicd = 0 // cooldown handler - var/weapon_weight = WEAPON_LIGHT - var/dual_wield_spread = 24 // additional spread when dual wielding - ///Can we hold up our target with this? Default to yes - var/can_hold_up = TRUE - - /// Just 'slightly' snowflakey way to modify projectile damage for projectiles fired from this gun. - var/projectile_damage_multiplier = 1 - - var/spread = 0 // Spread induced by the gun itself. - var/randomspread = 1 // Set to 0 for shotguns. This is used for weapons that don't fire all their bullets at once. - - lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' - - var/obj/item/firing_pin/pin = /obj/item/firing_pin // standard firing pin for most guns - - var/pinless = FALSE - - var/can_bayonet = FALSE // if a bayonet can be added or removed if it already has one. - var/bayonet_state = "bayonet" - var/bayonet_icon = 'icons/obj/weapons/guns/bayonets.dmi' - var/obj/item/knife/bayonet - var/knife_x_offset = 0 - var/knife_y_offset = 0 - - var/ammo_x_offset = 0 // used for positioning ammo count overlay on sprite - var/ammo_y_offset = 0 - - // Zooming - var/pb_knockback = 0 - - var/safety = FALSE /// Internal variable for keeping track whether the safety is on or off - var/has_gun_safety = FALSE /// Whether the gun actually has a gun safety - var/datum/action/item_action/toggle_safety/toggle_safety_action - - var/datum/action/item_action/toggle_firemode/firemode_action - /// Current fire selection, can choose between burst, single, and full auto. - var/fire_select = SELECT_SEMI_AUTOMATIC - var/fire_select_index = 1 - /// What modes does this weapon have? Put SELECT_FULLY_AUTOMATIC in here to enable fully automatic behaviours. - var/list/fire_select_modes = list(SELECT_SEMI_AUTOMATIC) - /// if i`1t has an icon for a selector switch indicating current firemode. - var/selector_switch_icon = FALSE - /// Bitflags for the company that produces the gun, do not give more than one company. - var/company_flag - -/datum/action/item_action/toggle_safety - name = "Toggle Safety" - button_icon = 'modular_skyrat/modules/gunsafety/icons/actions.dmi' - button_icon_state = "safety_on" - -/obj/item/gun/ui_action_click(mob/user, actiontype) - if(istype(actiontype, /datum/action/item_action/toggle_firemode)) - fire_select() - else if(istype(actiontype, toggle_safety_action)) - toggle_safety(user) - else - ..() - -/obj/item/gun/Initialize(mapload) - . = ..() - if(pin && !pinless) - pin = new pin(src) - - add_seclight_point() - - if(has_gun_safety) - safety = TRUE - toggle_safety_action = new(src) - add_item_action(toggle_safety_action) - - if(burst_size > 1 && !(SELECT_BURST_SHOT in fire_select_modes)) - fire_select_modes.Add(SELECT_BURST_SHOT) - else if(burst_size <= 1 && (SELECT_BURST_SHOT in fire_select_modes)) - fire_select_modes.Remove(SELECT_BURST_SHOT) - - burst_size = 1 - - sort_list(fire_select_modes, GLOBAL_PROC_REF(cmp_numeric_asc)) - - if(fire_select_modes.len > 1) - firemode_action = new(src) - firemode_action.button_icon_state = "fireselect_[fire_select]" - firemode_action.build_all_button_icons() - add_item_action(firemode_action) - - if(SELECT_FULLY_AUTOMATIC in fire_select_modes) - AddComponent(/datum/component/automatic_fire, fire_delay) - -/obj/item/gun/Destroy() - if(isobj(pin)) // Can still be the initial path, then we skip - QDEL_NULL(pin) - if(bayonet) - QDEL_NULL(bayonet) - if(chambered) // Not all guns are chambered (EMP'ed energy guns etc) - QDEL_NULL(chambered) - if(isatom(suppressed)) - QDEL_NULL(suppressed) - if(toggle_safety_action) - QDEL_NULL(toggle_safety_action) - if(firemode_action) - QDEL_NULL(firemode_action) - . = ..() - -/// Handles adding [the seclite mount component][/datum/component/seclite_attachable] to the gun. -/// If the gun shouldn't have a seclight mount, override this with a return. -/// Or, if a child of a gun with a seclite mount has slightly different behavior or icons, extend this. -/obj/item/gun/proc/add_seclight_point() - return - -/obj/item/gun/handle_atom_del(atom/gun_atom) - if(gun_atom == pin) - pin = null - if(gun_atom == chambered) - chambered = null - update_appearance() - if(gun_atom == bayonet) - clear_bayonet() - if(gun_atom == suppressed) - clear_suppressor() - . = ..() - -/// Clears var and updates icon. In the case of ballistic weapons, also updates the gun's weight. -/obj/item/gun/proc/clear_suppressor() - if(!can_unsuppress) - return - suppressed = null - update_appearance() - -/obj/item/gun/examine(mob/user) - . = ..() - if(!pinless) - if(pin) - . += "It has \a [pin] installed." - . += span_info("[pin] looks like it could be removed with some tools.") - else - . += "It doesn't have a firing pin installed, and won't fire." - - if(bayonet) - . += "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. - . += span_info("[bayonet] looks like it can be unscrewed from [src].") - if(can_bayonet) - . += "It has a bayonet lug on it." - if(has_gun_safety) - . += "The safety is [safety ? "ON" : "OFF"]." - - switch(company_flag) - if(COMPANY_CANTALAN) - . += "
It has [span_purple("Cantalan Federal Arms")] etched into the grip." - if(COMPANY_ARMADYNE) - . += "
It has [span_red("Armadyne Corporation")] etched into the barrel." - if(COMPANY_SCARBOROUGH) - . += "
It has [span_orange("Scarborough Arms")] stamped onto the grip." - if(COMPANY_DONK) - . += "
It has a [span_green("Donk Corporation")] label visible in the plastic." - if(COMPANY_BOLT) - . += "
It has [span_yellow("Bolt Fabrications")] stamped onto the reciever." - if(COMPANY_OLDARMS) - . += "
It has [span_red("Armadyne Oldarms")] etched into the barrel." - if(COMPANY_IZHEVSK) - . += "
It has [span_brown("Izhevsk Coalition")] cut in above the magwell." - if(COMPANY_NANOTRASEN) - . += "
It has [span_blue("Nanotrasen Armories")] etched into the reciever." - if(COMPANY_ALLSTAR) - . += "
It has [span_red("Allstar Lasers Inc.")] stamped on the front grip." - if(COMPANY_MICRON) - . += "
It has [span_cyan("Micron Control Sys.")] cut in above the cell slot." - if(COMPANY_INTERDYNE) - . += "
It has [span_cyan("Interdyne Pharmaceuticals")] stamped onto the barrel." - if(COMPANY_ABDUCTOR) - . += "
It has [span_abductor("✌︎︎♌︎︎♎︎︎◆︎︎♍︎︎⧫︎︎❄︎♏︎♍︎♒︎")] engraved into the photon accelerator." - if(COMPANY_REMOVED) - . += "
It has had [span_grey("all identifying marks scrubbed off")]." - -/obj/item/gun/proc/fire_select() - var/mob/living/carbon/human/user = usr - - var/max_mode = fire_select_modes.len - - if(max_mode <= 1) - balloon_alert(user, "only one firemode!") - return - - fire_select_index = 1 + fire_select_index % max_mode // Magic math to cycle through this shit! - - fire_select = fire_select_modes[fire_select_index] - - switch(fire_select) - if(SELECT_SEMI_AUTOMATIC) - burst_size = 1 - fire_delay = 0 - SEND_SIGNAL(src, COMSIG_GUN_AUTOFIRE_DESELECTED, user) - balloon_alert(user, "semi-automatic") - if(SELECT_BURST_SHOT) - burst_size = initial(burst_size) - fire_delay = initial(fire_delay) - SEND_SIGNAL(src, COMSIG_GUN_AUTOFIRE_DESELECTED, user) - balloon_alert(user, "[burst_size]-round burst") - if(SELECT_FULLY_AUTOMATIC) - burst_size = 1 - SEND_SIGNAL(src, COMSIG_GUN_AUTOFIRE_SELECTED, user) - balloon_alert(user, "automatic") - - playsound(user, 'sound/weapons/empty.ogg', 100, TRUE) - update_appearance() - firemode_action.button_icon_state = "fireselect_[fire_select]" - firemode_action.build_all_button_icons() - SEND_SIGNAL(src, COMSIG_UPDATE_AMMO_HUD) - return TRUE - -// called after the gun has successfully fired its chambered ammo. -/obj/item/gun/proc/process_chamber(empty_chamber = TRUE, from_firing = TRUE, chamber_next_round = TRUE) - handle_chamber(empty_chamber, from_firing, chamber_next_round) - SEND_SIGNAL(src, COMSIG_GUN_CHAMBER_PROCESSED) - -/obj/item/gun/proc/handle_chamber(empty_chamber = TRUE, from_firing = TRUE, chamber_next_round = TRUE) - return - - -// check if there's enough ammo/energy/whatever to shoot one time -// i.e if clicking would make it shoot -/obj/item/gun/proc/can_shoot() - return TRUE - -/obj/item/gun/proc/tk_firing(mob/living/user) - return !user.contains(src) - -/obj/item/gun/proc/shoot_with_empty_chamber(mob/living/user as mob|obj) - balloon_alert_to_viewers("*click*") - playsound(src, dry_fire_sound, 30, TRUE) - -/obj/item/gun/proc/fire_sounds() - if(suppressed) - playsound(src, suppressed_sound, suppressed_volume, vary_fire_sound, ignore_walls = FALSE, extrarange = SILENCED_SOUND_EXTRARANGE, falloff_distance = 0) - else - playsound(src, fire_sound, fire_sound_volume, vary_fire_sound) - -/obj/item/gun/proc/shoot_live_shot(mob/living/user, pointblank = 0, atom/pbtarget = null, message = 1) - if(recoil && !tk_firing(user)) - shake_camera(user, recoil + 1, recoil) - fire_sounds() - if(!suppressed) - if(message) - if(tk_firing(user)) - visible_message( - span_danger("[src] fires itself[pointblank ? " point blank at [pbtarget]!" : "!"]"), - blind_message = span_hear("You hear a gunshot!"), - vision_distance = COMBAT_MESSAGE_RANGE - ) - else if(pointblank) - user.visible_message( - span_danger("[user] fires [src] point blank at [pbtarget]!"), - span_danger("You fire [src] point blank at [pbtarget]!"), - span_hear("You hear a gunshot!"), COMBAT_MESSAGE_RANGE, pbtarget - ) - to_chat(pbtarget, span_userdanger("[user] fires [src] point blank at you!")) - if(pb_knockback > 0 && ismob(pbtarget)) - var/mob/PBT = pbtarget - var/atom/throw_target = get_edge_target_turf(PBT, user.dir) - PBT.throw_at(throw_target, pb_knockback, 2) - else if(!tk_firing(user)) - user.visible_message( - span_danger("[user] fires [src]!"), - blind_message = span_hear("You hear a gunshot!"), - vision_distance = COMBAT_MESSAGE_RANGE, - ignored_mobs = user - ) - if(user.resting) // SKYRAT EDIT ADD - no crawlshooting - user.Immobilize(20, TRUE) // SKYRAT EDIT END - -/obj/item/gun/emp_act(severity) - . = ..() - if(!(. & EMP_PROTECT_CONTENTS)) - for(var/obj/iterated_object in contents) - iterated_object.emp_act(severity) - -/obj/item/gun/afterattack_secondary(mob/living/victim, mob/living/user, params) - if(!isliving(victim) || !IN_GIVEN_RANGE(user, victim, GUNPOINT_SHOOTER_STRAY_RANGE)) - return ..() //if they're out of range, just shootem. - if(!can_hold_up) - return ..() - var/datum/component/gunpoint/gunpoint_component = user.GetComponent(/datum/component/gunpoint) - if (gunpoint_component) - if(gunpoint_component.target == victim) - return ..() //we're already holding them up, shoot that mans instead of complaining - balloon_alert(user, "already holding someone up!") - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - if(user == victim) - balloon_alert(user, "can't hold yourself up!") - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - - user.AddComponent(/datum/component/gunpoint, victim, src) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - -/obj/item/gun/afterattack(atom/target, mob/living/user, flag, params) - . = ..() - return fire_gun(target, user, flag, params) - -/obj/item/gun/proc/fire_gun(atom/target, mob/living/user, flag, params) - if(QDELETED(target)) - return - if(firing_burst) - return - if(SEND_SIGNAL(src, COMSIG_GUN_TRY_FIRE, user, target, flag, params) & COMPONENT_CANCEL_GUN_FIRE) - return - if(flag) // It's adjacent, is the user, or is on the user's person - if(target in user.contents) // can't shoot stuff inside us. - return - if(!ismob(target) || user.combat_mode) // melee attack - return - if(target == user && user.zone_selected != BODY_ZONE_PRECISE_MOUTH) // so we can't shoot ourselves (unless mouth selected) - return - if(iscarbon(target)) - var/mob/living/carbon/carbon_target = target - for(var/i in carbon_target.all_wounds) - var/datum/wound/target_wound = i - if(target_wound.try_treating(src, user)) - return // another coward cured! - - if(istype(user))// Check if the user can use the gun, if the user isn't alive(turrets) assume it can. - var/mob/living/living_user = user - if(!can_trigger_gun(living_user)) - return - if(flag) - if(user.zone_selected == BODY_ZONE_PRECISE_MOUTH) - handle_suicide(user, target, params) - return - - if(!can_shoot()) // Just because you can pull the trigger doesn't mean it can shoot. - shoot_with_empty_chamber(user) - return - - if(check_botched(user)) - return - - var/obj/item/bodypart/other_hand = user.has_hand_for_held_index(user.get_inactive_hand_index()) // returns non-disabled inactive hands - if(weapon_weight == WEAPON_HEAVY && (user.get_inactive_held_item() || !other_hand)) - balloon_alert(user, "need two hands!") - return - // DUAL (or more!) WIELDING - var/bonus_spread = 0 - var/loop_counter = 0 - if(ishuman(user) && user.combat_mode) - var/mob/living/carbon/human/human_user = user - for(var/obj/item/gun/held_gun in human_user.held_items) - if(held_gun == src || held_gun.weapon_weight >= WEAPON_MEDIUM) - continue - else if(held_gun.can_trigger_gun(user)) - bonus_spread += dual_wield_spread - loop_counter++ - addtimer(CALLBACK(held_gun, TYPE_PROC_REF(/obj/item/gun, process_fire), target, user, TRUE, params, null, bonus_spread), loop_counter) - - return process_fire(target, user, TRUE, params, null, bonus_spread) - -/obj/item/gun/proc/check_botched(mob/living/user, params) - if(clumsy_check) - if(istype(user)) - if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(40)) - to_chat(user, span_userdanger("You shoot yourself in the foot with [src]!")) - var/shot_leg = pick(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) - process_fire(user, user, FALSE, params, shot_leg) - SEND_SIGNAL(user, COMSIG_MOB_CLUMSY_SHOOT_FOOT) - if(!tk_firing(user) && !HAS_TRAIT(src, TRAIT_NODROP)) - user.dropItemToGround(src, TRUE) - return TRUE - -/obj/item/gun/can_trigger_gun(mob/living/user) - . = ..() - if(!handle_pins(user)) - return FALSE - if(has_gun_safety && safety) - balloon_alert(user, "safety on!") - return FALSE - -/obj/item/gun/proc/toggle_safety(mob/user, override) - if(!has_gun_safety) - return - if(override) - if(override == "off") - safety = FALSE - else - safety = TRUE - else - safety = !safety - toggle_safety_action.button_icon_state = "safety_[safety ? "on" : "off"]" - toggle_safety_action.build_all_button_icons() - playsound(src, 'sound/weapons/empty.ogg', 100, TRUE) - user.visible_message( - span_notice("[user] toggles [src]'s safety [safety ? "ON" : "OFF"]."), - span_notice("You toggle [src]'s safety [safety ? "ON" : "OFF"].") - ) - SEND_SIGNAL(src, COMSIG_UPDATE_AMMO_HUD) - -/obj/item/gun/proc/handle_pins(mob/living/user) - if(pinless) - return TRUE - if(pin) - if(pin.pin_auth(user) || (pin.obj_flags & EMAGGED)) - return TRUE - else - pin.auth_fail(user) - return FALSE - else - balloon_alert(user, "no firing pin!") - return FALSE - -/obj/item/gun/proc/recharge_newshot() - return - -/obj/item/gun/proc/process_burst(mob/living/user, atom/target, message = TRUE, params = null, zone_override = "", sprd = 0, randomized_gun_spread = 0, randomized_bonus_spread = 0, rand_spr = 0, iteration = 0) - if(!user || !firing_burst) - firing_burst = FALSE - return FALSE - if(!issilicon(user)) - if(iteration > 1 && !(user.is_holding(src))) // for burst firing - firing_burst = FALSE - return FALSE - if(chambered?.loaded_projectile) - if(HAS_TRAIT(user, TRAIT_PACIFISM)) // If the user has the pacifist trait, then they won't be able to fire [src] if the round chambered inside of [src] is lethal. - if(chambered.harmful) // Is the bullet chambered harmful? - balloon_alert(user, "lethally chambered!") - return - if(randomspread) - sprd = round((rand(0, 1) - 0.5) * DUALWIELD_PENALTY_EXTRA_MULTIPLIER * (randomized_gun_spread + randomized_bonus_spread)) - else // Smart spread - sprd = round((((rand_spr/burst_size) * iteration) - (0.5 + (rand_spr * 0.25))) * (randomized_gun_spread + randomized_bonus_spread)) - before_firing(target, user) - if(!chambered.fire_casing(target, user, params, , suppressed, zone_override, sprd, src)) - shoot_with_empty_chamber(user) - firing_burst = FALSE - return FALSE - else - if(get_dist(user, target) <= 1) // Making sure whether the target is in vicinity for the pointblank shot - shoot_live_shot(user, 1, target, message) - else - shoot_live_shot(user, 0, target, message) - if (iteration >= burst_size) - firing_burst = FALSE - else - shoot_with_empty_chamber(user) - firing_burst = FALSE - return FALSE - process_chamber() - update_appearance() - SEND_SIGNAL(src, COMSIG_UPDATE_AMMO_HUD) - return TRUE - -/obj/item/gun/proc/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) - if(user) - SEND_SIGNAL(user, COMSIG_MOB_FIRED_GUN, user, target, params, zone_override) - - SEND_SIGNAL(src, COMSIG_GUN_FIRED, user, target, params, zone_override) - - add_fingerprint(user) - - if(semicd) - return - - // Vary by at least this much - var/base_bonus_spread = 0 - var/sprd = 0 - var/randomized_gun_spread = 0 - var/rand_spr = rand() - if(user && HAS_TRAIT(user, TRAIT_POOR_AIM)) // Nice job hotshot - bonus_spread += 35 - base_bonus_spread += 10 - - if(spread) - randomized_gun_spread = rand(0, spread) - var/randomized_bonus_spread = rand(base_bonus_spread, bonus_spread) - - if(burst_size > 1) - firing_burst = TRUE - for(var/i = 1 to burst_size) - addtimer(CALLBACK(src, PROC_REF(process_burst), user, target, message, params, zone_override, sprd, randomized_gun_spread, randomized_bonus_spread, rand_spr, i), fire_delay * (i - 1)) - else - if(chambered) - if(HAS_TRAIT(user, TRAIT_PACIFISM)) // If the user has the pacifist trait, then they won't be able to fire [src] if the round chambered inside of [src] is lethal. - if(chambered.harmful) // Is the bullet chambered harmful? - balloon_alert(user, "lethally chambered!") - return - sprd = round((rand(0, 1) - 0.5) * DUALWIELD_PENALTY_EXTRA_MULTIPLIER * (randomized_gun_spread + randomized_bonus_spread)) - before_firing(target, user) - if(!chambered.fire_casing(target, user, params, , suppressed, zone_override, sprd, src)) - shoot_with_empty_chamber(user) - return - else - if(get_dist(user, target) <= 1) // Making sure whether the target is in vicinity for the pointblank shot - shoot_live_shot(user, 1, target, message) - else - shoot_live_shot(user, 0, target, message) - else - shoot_with_empty_chamber(user) - return - process_chamber() - update_appearance() - semicd = TRUE - addtimer(CALLBACK(src, PROC_REF(reset_semicd)), fire_delay) - - if(user) - user.update_held_items() - SSblackbox.record_feedback("tally", "gun_fired", 1, type) - - SEND_SIGNAL(src, COMSIG_UPDATE_AMMO_HUD) - - return TRUE - -/obj/item/gun/proc/reset_semicd() - semicd = FALSE - -/obj/item/gun/attack(mob/target, mob/living/user) - if(user.combat_mode) // Flogging - if(bayonet) - target.attackby(bayonet, user) - return - else - return ..() - return - -/obj/item/gun/attack_atom(obj/target, mob/living/user, params) - if(user.combat_mode) - if(bayonet) - target.attackby(bayonet, user) - return - return ..() - -/obj/item/gun/attackby(obj/item/attacking_item, mob/living/user, params) - if(user.combat_mode) - return ..() - else if(istype(attacking_item, /obj/item/knife)) - var/obj/item/knife/attaching_knife = attacking_item - if(!can_bayonet || !attaching_knife.bayonet || bayonet) // ensure the gun has an attachment point available, and that the knife is compatible with it. - return ..() - if(!user.transferItemToLoc(attacking_item, src)) - return - balloon_alert(user, "[attaching_knife] attached") - bayonet = attaching_knife - update_appearance() - - else - return ..() - -/obj/item/gun/screwdriver_act(mob/living/user, obj/item/tool) - . = ..() - if(.) - return - if(!user.canUseTopic(src, be_close = TRUE, no_dexterity = FALSE, no_tk = TRUE)) - return - if(bayonet && can_bayonet) //if it has a bayonet, and the bayonet can be removed - return remove_bayonet(user, tool) - - else if(pin && user.is_holding(src)) - if(!pin.can_remove) - balloon_alert(user, "pin can't be removed!") - return - user.visible_message(span_warning("[user] attempts to remove [pin] from [src] with [tool]."), - span_notice("You attempt to remove [pin] from [src]. (It will take [DisplayTimeText(FIRING_PIN_REMOVAL_DELAY)].)"), null, 3) - if(tool.use_tool(src, user, FIRING_PIN_REMOVAL_DELAY, volume = 50)) - if(!pin) // check to see if the pin is still there, or we can spam messages by clicking multiple times during the tool delay - return - user.visible_message(span_notice("[pin] is pried out of [src] by [user], destroying the pin in the process."), - span_warning("You pry [pin] out with [tool], destroying the pin in the process."), null, 3) - QDEL_NULL(pin) - return TRUE - -/obj/item/gun/welder_act(mob/living/user, obj/item/tool) - . = ..() - if(.) - return - if(!pin.can_remove) - balloon_alert(user, "pin can't be removed!") - return - if(!user.canUseTopic(src, be_close = TRUE, no_dexterity = FALSE, no_tk = TRUE)) - return - if(pin && user.is_holding(src)) - user.visible_message(span_warning("[user] attempts to remove [pin] from [src] with [tool]."), - span_notice("You attempt to remove [pin] from [src]. (It will take [DisplayTimeText(FIRING_PIN_REMOVAL_DELAY)].)"), null, 3) - if(tool.use_tool(src, user, FIRING_PIN_REMOVAL_DELAY, 5, volume = 50)) - if(!pin) // check to see if the pin is still there, or we can spam messages by clicking multiple times during the tool delay - return - user.visible_message(span_notice("[pin] is spliced out of [src] by [user], melting part of the pin in the process."), - span_warning("You splice [pin] out of [src] with [tool], melting part of the pin in the process."), null, 3) - QDEL_NULL(pin) - return TRUE - -/obj/item/gun/wirecutter_act(mob/living/user, obj/item/tool) - . = ..() - if(.) - return - if(!user.canUseTopic(src, be_close = TRUE, no_dexterity = FALSE, no_tk = TRUE)) - return - if(!pin.can_remove) - balloon_alert(user, "pin can't be removed!") - return - if(pin && user.is_holding(src)) - user.visible_message(span_warning("[user] attempts to remove [pin] from [src] with [tool]."), - span_notice("You attempt to remove [pin] from [src]. (It will take [DisplayTimeText(FIRING_PIN_REMOVAL_DELAY)].)"), null, 3) - if(tool.use_tool(src, user, FIRING_PIN_REMOVAL_DELAY, volume = 50)) - if(!pin) // check to see if the pin is still there, or we can spam messages by clicking multiple times during the tool delay - return - user.visible_message(span_notice("[pin] is ripped out of [src] by [user], mangling the pin in the process."), - span_warning("You rip [pin] out of [src] with [tool], mangling the pin in the process."), null, 3) - QDEL_NULL(pin) - return TRUE - -/obj/item/gun/proc/remove_bayonet(mob/living/user, obj/item/tool_item) - tool_item?.play_tool_sound(src) - balloon_alert(user, "[bayonet] removed") - bayonet.forceMove(drop_location()) - - if(Adjacent(user) && !issilicon(user)) - user.put_in_hands(bayonet) - - return clear_bayonet() - -/obj/item/gun/proc/clear_bayonet() - if(!bayonet) - return - bayonet = null - update_appearance() - return TRUE - -/obj/item/gun/update_overlays() - . = ..() - - if(bayonet) - var/mutable_appearance/knife_overlay - var/state = bayonet_state - if(bayonet.icon_state in icon_states(bayonet_icon)) // Snowflake state? - state = bayonet.icon_state - knife_overlay = mutable_appearance(bayonet_icon, state) - knife_overlay.pixel_x = knife_x_offset - knife_overlay.pixel_y = knife_y_offset - . += knife_overlay - -/obj/item/gun/proc/handle_suicide(mob/living/carbon/human/user, mob/living/carbon/human/target, params, bypass_timer) - if(!ishuman(user) || !ishuman(target)) - return - - if(semicd) - return - - if(user == target) - target.visible_message(span_warning("[user] sticks [src] in [user.p_their()] mouth, ready to pull the trigger..."), \ - span_userdanger("You stick [src] in your mouth, ready to pull the trigger...")) - else - target.visible_message(span_warning("[user] points [src] at [target]'s head, ready to pull the trigger..."), \ - span_userdanger("[user] points [src] at your head, ready to pull the trigger...")) - - semicd = TRUE - - if(!bypass_timer && (!do_after(user, 12 SECONDS, target) || user.zone_selected != BODY_ZONE_PRECISE_MOUTH)) - if(user) - if(user == target) - user.visible_message(span_notice("[user] decided not to shoot.")) - else if(target?.Adjacent(user)) - target.visible_message(span_notice("[user] has decided to spare [target]"), span_notice("[user] has decided to spare your life!")) - semicd = FALSE - return - - semicd = FALSE - - target.visible_message(span_warning("[user] pulls the trigger!"), span_userdanger("[(user == target) ? "You pull" : "[user] pulls"] the trigger!")) - - if(chambered?.loaded_projectile) - chambered.loaded_projectile.damage *= 5 - if(chambered.loaded_projectile.wound_bonus != CANT_WOUND) - chambered.loaded_projectile.wound_bonus += 5 // much more dramatic on multiple pellet'd projectiles really - - var/fired = process_fire(target, user, TRUE, params, BODY_ZONE_HEAD) - if(!fired && chambered?.loaded_projectile) - chambered.loaded_projectile.damage /= 5 - if(chambered.loaded_projectile.wound_bonus != CANT_WOUND) - chambered.loaded_projectile.wound_bonus -= 5 - -/obj/item/gun/proc/unlock() // used in summon guns and as a convience for admins - if(pin) - qdel(pin) - pin = new /obj/item/firing_pin - -// Happens before the actual projectile creation -/obj/item/gun/proc/before_firing(atom/target, mob/user) - return - -/obj/item/gun/emag_act(mob/user, obj/item/card/emag/emag_card) - . = ..() - if(!pin.can_remove) - balloon_alert(user, "firing pin shorted!") - pin.can_remove = TRUE - if(!(pin.obj_flags & EMAGGED)) - pin.obj_flags |= EMAGGED - -#undef FIRING_PIN_REMOVAL_DELAY -#undef DUALWIELD_PENALTY_EXTRA_MULTIPLIER diff --git a/modular_skyrat/modules/aesthetics/guns/code/guns.dm b/modular_skyrat/modules/aesthetics/guns/code/guns.dm index 63e651ed1ff..60e2bf23903 100644 --- a/modular_skyrat/modules/aesthetics/guns/code/guns.dm +++ b/modular_skyrat/modules/aesthetics/guns/code/guns.dm @@ -71,7 +71,9 @@ inhand_icon_state = "riot_shotgun_syndie" can_be_sawn_off = FALSE can_suppress = FALSE - company_flag = COMPANY_SCARBOROUGH + +/obj/item/gun/ballistic/shotgun/riot/syndicate/give_manufacturer_examine() + AddComponent(/datum/component/manufacturer_examine, COMPANY_SCARBOROUGH) /obj/item/gun/ballistic/shotgun/automatic/combat name = "\improper Peacekeeper combat shotgun" @@ -227,7 +229,9 @@ can_suppress = TRUE can_unsuppress = TRUE weapon_weight = WEAPON_LIGHT - company_flag = COMPANY_SCARBOROUGH + +/obj/item/gun/ballistic/automatic/sniper_rifle/modular/syndicate/give_manufacturer_examine() + AddComponent(/datum/component/manufacturer_examine, COMPANY_SCARBOROUGH) /obj/item/gun/ballistic/automatic/sniper_rifle/modular/blackmarket //Normal sniper but epic name = "SA-107 anti-materiel rifle" @@ -248,7 +252,6 @@ fire_delay = 55 //Slightly smaller than standard sniper burst_size = 1 slot_flags = ITEM_SLOT_BACK - fire_select_modes = list(SELECT_SEMI_AUTOMATIC) //SKYRAT EDIT CHANGE mag_display = TRUE /obj/item/gun/ballistic/automatic/ar/modular @@ -276,7 +279,9 @@

\ BRAND NEW: Cannot be sawn off." icon = 'modular_skyrat/modules/aesthetics/guns/icons/guns.dmi' - company_flag = COMPANY_NANOTRASEN + +/obj/item/gun/ballistic/rifle/boltaction/brand_new/give_manufacturer_examine() + AddComponent(/datum/component/manufacturer_examine, COMPANY_NANOTRASEN) /obj/item/gun/ballistic/rifle/boltaction/brand_new/quartermaster name = "\improper FTU 'Archangel' precision rifle" @@ -289,7 +294,9 @@ worn_icon_state = "bubba" mag_type = /obj/item/ammo_box/magazine/internal/boltaction/bubba can_be_sawn_off = FALSE - company_flag = null //Cargonia's own + +/obj/item/gun/ballistic/rifle/boltaction/brand_new/quartermaster/give_manufacturer_examine() + return /obj/item/ammo_box/magazine/internal/boltaction/bubba name = "sportiv extended internal magazine" @@ -313,7 +320,9 @@ fire_delay = 5 fire_sound_volume = 90 mag_type = /obj/item/ammo_box/magazine/multi_sprite/ostwind/arg75 - company_flag = COMPANY_NANOTRASEN + +/obj/item/gun/ballistic/automatic/ar/modular/model75/give_manufacturer_examine() + AddComponent(/datum/component/manufacturer_examine, COMPANY_NANOTRASEN) /obj/item/ammo_box/magazine/multi_sprite/ostwind/arg75 name = "\improper ARG-75 magazine" diff --git a/modular_skyrat/modules/aesthetics/guns/icons/guns.dmi b/modular_skyrat/modules/aesthetics/guns/icons/guns.dmi index 013281c9e262c10f6d0c9b80c47770a172ccac6e..5accb648846ca2178dce9e9e97313b364c35ba2f 100644 GIT binary patch literal 38843 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

)RN`;!0c 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 literal 43037 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 diff --git a/modular_skyrat/modules/assault_operatives/code/equipment_items/guns.dm b/modular_skyrat/modules/assault_operatives/code/equipment_items/guns.dm index 3cb5d2f8e90..1bda73090df 100644 --- a/modular_skyrat/modules/assault_operatives/code/equipment_items/guns.dm +++ b/modular_skyrat/modules/assault_operatives/code/equipment_items/guns.dm @@ -3,11 +3,15 @@ /obj/item/gun/ballistic/automatic/pistol/clandestine/assault_ops name = "\improper IGE-040 pistol" desc = "A pistol chambered in 10mm magnum and painted in an ominous matte black. Strangely, the gun also seems to lack any form of manufacturer markings." - company_flag = COMPANY_REMOVED + +/obj/item/gun/ballistic/automatic/pistol/clandestine/assault_ops/give_manufacturer_examine() + AddComponent(/datum/component/manufacturer_examine, COMPANY_REMOVED) /obj/item/gun/energy/e_gun/advtaser/assault_ops w_class = WEIGHT_CLASS_NORMAL - company_flag = COMPANY_REMOVED + +/obj/item/gun/energy/e_gun/advtaser/assault_ops/give_manufacturer_examine() + AddComponent(/datum/component/manufacturer_examine, COMPANY_REMOVED) // Rifle @@ -33,17 +37,18 @@ can_suppress = TRUE suppressor_x_offset = 4 suppressed_sound = 'sound/weapons/gun/general/heavy_shot_suppressed.ogg' - fire_select_modes = list(SELECT_SEMI_AUTOMATIC, SELECT_BURST_SHOT) burst_size = 2 fire_delay = 3 pin = /obj/item/firing_pin/implant/pindicate - company_flag = COMPANY_REMOVED /obj/item/gun/ballistic/automatic/assault_ops_rifle/Initialize(mapload) . = ..() AddComponent(/datum/component/scope, range_modifier = 1.5) +/obj/item/gun/ballistic/automatic/assault_ops_rifle/give_manufacturer_examine() + AddComponent(/datum/component/manufacturer_examine, COMPANY_REMOVED) + /obj/item/ammo_box/magazine/multi_sprite/assault_ops_rifle name = "\improper IGE-110 magazine" desc = "A twenty round magazine built for 5.6x40mm, intended for use in the IGE-110 rifle." @@ -85,12 +90,18 @@ mag_type = /obj/item/ammo_box/magazine/multi_sprite/assault_ops_smg fire_sound = 'modular_skyrat/modules/sec_haul/sound/smg_fire.ogg' can_suppress = TRUE - fire_select_modes = list(SELECT_SEMI_AUTOMATIC, SELECT_FULLY_AUTOMATIC) burst_size = 1 fire_delay = 0.8 projectile_damage_multiplier = 0.6 pin = /obj/item/firing_pin/implant/pindicate - company_flag = COMPANY_REMOVED + +/obj/item/gun/ballistic/automatic/assault_ops_smg/Initialize(mapload) + . = ..() + + AddComponent(/datum/component/automatic_fire, fire_delay) + +/obj/item/gun/ballistic/automatic/assault_ops_smg/give_manufacturer_examine() + AddComponent(/datum/component/manufacturer_examine, COMPANY_REMOVED) /obj/item/ammo_box/magazine/multi_sprite/assault_ops_smg name = "\improper IGE-260 magazine" @@ -135,11 +146,12 @@ can_suppress = TRUE suppressor_x_offset = 4 suppressed_sound = 'sound/weapons/gun/general/heavy_shot_suppressed.ogg' - fire_select_modes = list(SELECT_SEMI_AUTOMATIC) burst_size = 1 fire_delay = 1.5 pin = /obj/item/firing_pin/implant/pindicate - company_flag = COMPANY_REMOVED + +/obj/item/gun/ballistic/automatic/assault_ops_shotgun/give_manufacturer_examine() + AddComponent(/datum/component/manufacturer_examine, COMPANY_REMOVED) /obj/item/ammo_box/magazine/multi_sprite/assault_ops_shotgun name = "\improper IGE-340 magazine" @@ -203,13 +215,15 @@ can_be_sawn_off = FALSE can_jam = FALSE pin = /obj/item/firing_pin/implant/pindicate - company_flag = COMPANY_REMOVED /obj/item/gun/ballistic/rifle/boltaction/assault_ops_sniper/Initialize(mapload) . = ..() AddComponent(/datum/component/scope, range_modifier = 2.5) +/obj/item/gun/ballistic/rifle/boltaction/assault_ops_sniper/give_manufacturer_examine() + AddComponent(/datum/component/manufacturer_examine, COMPANY_REMOVED) + /obj/item/ammo_box/magazine/multi_sprite/assault_ops_sniper name = "\improper IGE-410 magazine" desc = "A five round magazine built for .416 Stabilis, intended for use in the IGE-410 sniper." diff --git a/modular_skyrat/modules/black_mesa/code/guns.dm b/modular_skyrat/modules/black_mesa/code/guns.dm index d4ee8099139..331d7a69539 100644 --- a/modular_skyrat/modules/black_mesa/code/guns.dm +++ b/modular_skyrat/modules/black_mesa/code/guns.dm @@ -42,11 +42,9 @@ righthand_file ='modular_skyrat/modules/gunsgalore/icons/guns/gunsgalore_righthand.dmi' icon_state = "mp5" inhand_icon_state = "mp5" - selector_switch_icon = TRUE mag_type = /obj/item/ammo_box/magazine/mp5 bolt_type = BOLT_TYPE_LOCKING can_suppress = TRUE - burst_size = 3 fire_delay = 1.25 spread = 2.5 mag_display = TRUE @@ -65,6 +63,11 @@ w_class = WEIGHT_CLASS_NORMAL projectile_damage_multiplier = 0.7 +/obj/item/gun/ballistic/automatic/mp5/Initialize(mapload) + . = ..() + + AddComponent(/datum/component/automatic_fire, fire_delay) + /obj/item/ammo_box/magazine/mp5 name = "MP5 magazine (10mm Auto)" desc = "Magazines taking 10mm ammunition; it fits in the MP5." diff --git a/modular_skyrat/modules/black_mesa/code/m16_variations.dm b/modular_skyrat/modules/black_mesa/code/m16_variations.dm index e7c0ed91cbd..c6880490811 100644 --- a/modular_skyrat/modules/black_mesa/code/m16_variations.dm +++ b/modular_skyrat/modules/black_mesa/code/m16_variations.dm @@ -21,8 +21,11 @@ load_empty_sound = 'modular_skyrat/modules/gunsgalore/sound/guns/interact/sfrifle_magin.ogg' eject_sound = 'modular_skyrat/modules/gunsgalore/sound/guns/interact/sfrifle_magout.ogg' alt_icons = TRUE - fire_select_modes = list(SELECT_SEMI_AUTOMATIC, SELECT_FULLY_AUTOMATIC) +/obj/item/gun/ballistic/automatic/m16/oldarms/Initialize(mapload) + . = ..() + + AddComponent(/datum/component/automatic_fire, fire_delay) /obj/item/ammo_box/magazine/m16/vintage/oldarms name = "old-fashioned mk-11.4 rifle magazine" diff --git a/modular_skyrat/modules/blueshield/code/blueshield.dm b/modular_skyrat/modules/blueshield/code/blueshield.dm index 89af99f28a0..c6174928395 100644 --- a/modular_skyrat/modules/blueshield/code/blueshield.dm +++ b/modular_skyrat/modules/blueshield/code/blueshield.dm @@ -106,4 +106,6 @@ icon_state = "hellfirepdw" worn_icon_state = "hellfirepdw" ammo_type = list(/obj/item/ammo_casing/energy/laser/hellfire/bs) - company_flag = COMPANY_ALLSTAR + +/obj/item/gun/energy/laser/hellgun/blueshield/give_manufacturer_examine() + AddComponent(/datum/component/manufacturer_examine, COMPANY_ALLSTAR) diff --git a/modular_skyrat/modules/cellguns/code/cellguns.dm b/modular_skyrat/modules/cellguns/code/cellguns.dm index cc3a9425832..eaeaee29cc2 100644 --- a/modular_skyrat/modules/cellguns/code/cellguns.dm +++ b/modular_skyrat/modules/cellguns/code/cellguns.dm @@ -10,7 +10,9 @@ var/list/installedcells = list() automatic_charge_overlays = FALSE //This is needed because Cell based guns use their own custom overlay system. - has_gun_safety = TRUE + +/obj/item/gun/energy/cell_loaded/give_gun_safeties() + return /obj/item/gun/energy/cell_loaded/examine(mob/user) . = ..() diff --git a/modular_skyrat/modules/company_imports/code/datums/cargo_pack.dm b/modular_skyrat/modules/company_imports/code/datums/cargo_pack.dm index 63e860a2ab4..040eaa2c4df 100644 --- a/modular_skyrat/modules/company_imports/code/datums/cargo_pack.dm +++ b/modular_skyrat/modules/company_imports/code/datums/cargo_pack.dm @@ -10,7 +10,8 @@ return var/obj/structure/container = . for(var/obj/item/gun/gun_actually in container.contents) - if(gun_actually.company_flag & COMPANY_SCARBOROUGH) //illegal company doesn't care about pins + var/datum/component/manufacturer_examine/gun_company_examine_component = gun_actually.GetComponent(/datum/component/manufacturer_examine) + if((gun_company_examine_component) && (gun_company_examine_component.company_flag & COMPANY_SCARBOROUGH)) continue QDEL_NULL(gun_actually.pin) var/obj/item/firing_pin/permit_pin/new_pin = new(gun_actually) diff --git a/modular_skyrat/modules/company_imports/code/gun_companies.dm b/modular_skyrat/modules/company_imports/code/gun_companies.dm deleted file mode 100644 index db459f69641..00000000000 --- a/modular_skyrat/modules/company_imports/code/gun_companies.dm +++ /dev/null @@ -1,132 +0,0 @@ -/obj/item/gun/ballistic/automatic/pistol/m1911 - company_flag = COMPANY_BOLT - -/obj/item/gun/ballistic/automatic/pistol/aps - company_flag = COMPANY_SCARBOROUGH - -/obj/item/gun/ballistic/revolver - company_flag = COMPANY_SCARBOROUGH - -/obj/item/gun/ballistic/revolver/nagant - company_flag = COMPANY_OLDARMS - -/obj/item/gun/ballistic/rifle/boltaction - company_flag = COMPANY_IZHEVSK - -/obj/item/gun/ballistic/shotgun/riot - company_flag = COMPANY_NANOTRASEN - -/obj/item/gun/ballistic/shotgun/bulldog - company_flag = COMPANY_SCARBOROUGH - -/obj/item/gun/energy/e_gun - company_flag = COMPANY_ALLSTAR - -/obj/item/gun/energy/laser - company_flag = COMPANY_ALLSTAR - -/obj/item/gun/energy/pulse - company_flag = COMPANY_NANOTRASEN - -/obj/item/gun/ballistic/shotgun/automatic/combat - company_flag = COMPANY_NANOTRASEN - -/obj/item/gun/syringe - company_flag = COMPANY_INTERDYNE - -/obj/item/gun/ballistic/automatic/pistol - company_flag = COMPANY_SCARBOROUGH - -/obj/item/gun/ballistic/revolver/c38/detective - company_flag = COMPANY_NANOTRASEN - -/obj/item/gun/ballistic/shotgun/doublebarrel - company_flag = COMPANY_IZHEVSK - -/obj/item/gun/ballistic/shotgun/automatic/dual_tube - company_flag = COMPANY_NANOTRASEN - -/obj/item/gun/ballistic/rifle/boltaction/brand_new - company_flag = COMPANY_IZHEVSK - -/obj/item/gun/ballistic/shotgun/toy - company_flag = COMPANY_DONK - -/obj/item/gun/ballistic/rifle/boltaction/brand_new/prime - company_flag = null - -/obj/item/gun/ballistic/rifle/boltaction/pipegun - company_flag = null - -/obj/item/gun/ballistic/automatic/c20r/toy - company_flag = COMPANY_DONK - -/obj/item/gun/ballistic/automatic/pistol/clandestine - company_flag = COMPANY_SCARBOROUGH - -/obj/item/gun/ballistic/automatic/pistol/pdh/pulse - company_flag = null - -/obj/item/gun/ballistic/automatic/l6_saw/toy - company_flag = COMPANY_DONK - -/obj/item/gun/ballistic/automatic/cmg - company_flag = COMPANY_NANOTRASEN - -/obj/item/gun/ballistic/revolver/mateba - company_flag = null - -/obj/item/gun/ballistic/revolver/russian - company_flag = null - -/obj/item/gun/energy/laser/redtag - company_flag = null - -/obj/item/gun/energy/laser/bluetag - company_flag = null - -/obj/item/gun/energy/laser/instakill - company_flag = null - -/obj/item/gun/energy/laser/chameleon - company_flag = null - -/obj/item/gun/energy/laser/captain - company_flag = COMPANY_NANOTRASEN - -/obj/item/gun/energy/laser/retro - company_flag = COMPANY_REMOVED - -/obj/item/gun/energy/laser/retro/old - company_flag = COMPANY_NANOTRASEN - -/obj/item/gun/energy/e_gun/old - company_flag = COMPANY_NANOTRASEN - -/obj/item/gun/energy/e_gun/advtaser/cyborg - company_flag = null - -/obj/item/gun/energy/recharge/ebow - company_flag = COMPANY_SCARBOROUGH - -/obj/item/gun/energy/lasercannon - company_flag = COMPANY_ALLSTAR - -/obj/item/gun/energy/ionrifle - company_flag = COMPANY_ALLSTAR - -/obj/item/gun/energy/temperature - company_flag = COMPANY_ALLSTAR - -/obj/item/gun/syringe/blowgun - company_flag = null - -/obj/item/gun/syringe/syndicate/prototype - company_flag = null - -/obj/item/gun/energy/shrink_ray - company_flag = COMPANY_ABDUCTOR - -/obj/item/gun/energy/alien - company_flag = COMPANY_ABDUCTOR - diff --git a/modular_skyrat/modules/company_imports/code/objects/nri_surplus/ak25.dm b/modular_skyrat/modules/company_imports/code/objects/nri_surplus/ak25.dm index 66b6611b8fd..a5b6193de1e 100644 --- a/modular_skyrat/modules/company_imports/code/objects/nri_surplus/ak25.dm +++ b/modular_skyrat/modules/company_imports/code/objects/nri_surplus/ak25.dm @@ -21,10 +21,12 @@ load_empty_sound = 'modular_skyrat/modules/gunsgalore/sound/guns/interact/ltrifle_magin.ogg' eject_sound = 'modular_skyrat/modules/gunsgalore/sound/guns/interact/ltrifle_magout.ogg' alt_icons = TRUE - company_flag = COMPANY_IZHEVSK spread = 29 recoil = 0.1 +/obj/item/gun/ballistic/automatic/ak25/give_manufacturer_examine() + AddComponent(/datum/component/manufacturer_examine, COMPANY_IZHEVSK) + /obj/item/ammo_box/magazine/ak25 name = "\improper AK-25 magazine" desc = "A banana-shaped double-stack magazine able to hold 30 rounds of 7.32x29mm ammunition." diff --git a/modular_skyrat/modules/gun_safety/code/safety_additions.dm b/modular_skyrat/modules/gun_safety/code/safety_additions.dm new file mode 100644 index 00000000000..013fc022ec2 --- /dev/null +++ b/modular_skyrat/modules/gun_safety/code/safety_additions.dm @@ -0,0 +1,48 @@ +/// Proc that is overridden in /gun/ballistic and /gun/energy to attach the gun safety component to a gun +/obj/item/gun/proc/give_gun_safeties() + return + +// Ballistic Weapons + +/obj/item/gun/ballistic/give_gun_safeties() + AddComponent(/datum/component/gun_safety) + +/obj/item/gun/ballistic/bow/give_gun_safeties() + return + +/obj/item/gun/ballistic/rifle/enchanted/give_gun_safeties() + return + +/obj/item/gun/ballistic/automatic/laser/ctf/give_gun_safeties() + return + +/obj/item/gun/ballistic/shotgun/ctf/give_gun_safeties() + return + +/obj/item/gun/ballistic/automatic/laser/ctf/marksman/give_gun_safeties() + return + +/obj/item/gun/ballistic/automatic/pistol/deagle/ctf/give_gun_safeties() + return + +/obj/item/gun/ballistic/automatic/pistol/g17/mesa/give_gun_safeties() + return + +/obj/item/gun/ballistic/revolver/grenadelauncher/give_gun_safeties() + return + +// Energy Weapons + +/obj/item/gun/energy/give_gun_safeties() + AddComponent(/datum/component/gun_safety) + +/obj/item/gun/energy/plasmacutter/give_gun_safeties() + return + +/obj/item/gun/energy/kinetic_accelerator/give_gun_safeties() + return + +// Syringe Guns + +/obj/item/gun/syringe/blowgun/give_gun_safeties() + return diff --git a/modular_skyrat/modules/gun_safety/code/safety_component.dm b/modular_skyrat/modules/gun_safety/code/safety_component.dm new file mode 100644 index 00000000000..3338b5347ae --- /dev/null +++ b/modular_skyrat/modules/gun_safety/code/safety_component.dm @@ -0,0 +1,86 @@ +/// Component that will prevent a gun from firing if the safety is turned on +/datum/component/gun_safety + /// Is the safety actually on? + var/safety_currently_on = TRUE + /// Holder for the toggle safety action + var/datum/action/item_action/gun_safety_toggle/toggle_safety_action + +/datum/component/gun_safety/Initialize(safety_currently_on = TRUE) + . = ..() + + // Obviously gun safety should only apply to guns + if(!isgun(parent)) + return COMPONENT_INCOMPATIBLE + + src.safety_currently_on = safety_currently_on + + var/obj/item/item_parent = parent + toggle_safety_action = item_parent.add_item_action(/datum/action/item_action/gun_safety_toggle) + + update_action_button_state() + +/datum/component/gun_safety/Destroy() + if(toggle_safety_action) + QDEL_NULL(toggle_safety_action) + return ..() + +/datum/component/gun_safety/RegisterWithParent() + RegisterSignal(parent, COMSIG_GUN_TRY_FIRE, PROC_REF(check_if_we_can_actually_shooty)) + RegisterSignal(parent, COMSIG_ITEM_UI_ACTION_CLICK, PROC_REF(we_may_be_toggling_safeties)) + RegisterSignal(parent, COMSIG_PARENT_EXAMINE, PROC_REF(on_examine)) + +/datum/component/gun_safety/UnregisterFromParent() + UnregisterSignal(parent, list( + COMSIG_GUN_TRY_FIRE, + COMSIG_ITEM_UI_ACTION_CLICK, + COMSIG_PARENT_EXAMINE, + )) + +/// Checks if the safety is currently on, if it is then stops the gun from firing +/datum/component/gun_safety/proc/check_if_we_can_actually_shooty(obj/item/gun/source, mob/living/user, atom/target, flag, params) + SIGNAL_HANDLER + + if(safety_currently_on) + user.balloon_alert(user, "safety on!") + return COMPONENT_CANCEL_GUN_FIRE + +/// Calls toggle_safeties if the action type for doing so is used +/datum/component/gun_safety/proc/we_may_be_toggling_safeties(source, user, datum/actiontype) + SIGNAL_HANDLER + + if(istype(actiontype, toggle_safety_action)) + toggle_safeties(user) + + return COMPONENT_ACTION_HANDLED + +/// Toggles the safeties on or off +/datum/component/gun_safety/proc/toggle_safeties(mob/user) + safety_currently_on = !safety_currently_on + + update_action_button_state() + + playsound(parent, 'sound/weapons/empty.ogg', 100, TRUE) + user.visible_message( + span_notice("[user] toggles [parent]'s safety [safety_currently_on ? "ON" : "OFF"]."), + span_notice("You toggle [parent]'s safety [safety_currently_on ? "ON" : "OFF"].") + ) + +/// Adds the gun safety's current status to the gun's examine +/datum/component/gun_safety/proc/on_examine(obj/item/source, mob/examiner, list/examine_list) + SIGNAL_HANDLER + + examine_list += "The safety is [safety_currently_on ? "ON" : "OFF"]." + +/// Small proc to update the actio button's icon, just so I can not have to copypaste the same thing several times. +/datum/component/gun_safety/proc/update_action_button_state() + if(!toggle_safety_action) + return + + toggle_safety_action.button_icon_state = "safety_[safety_currently_on ? "on" : "off"]" + toggle_safety_action.build_all_button_icons() + +// The actual action, used by the component +/datum/action/item_action/gun_safety_toggle + name = "Toggle Gun Safety" + button_icon = 'modular_skyrat/modules/gun_safety/icons/actions.dmi' + button_icon_state = "safety_on" diff --git a/modular_skyrat/modules/gunsafety/icons/actions.dmi b/modular_skyrat/modules/gun_safety/icons/actions.dmi similarity index 100% rename from modular_skyrat/modules/gunsafety/icons/actions.dmi rename to modular_skyrat/modules/gun_safety/icons/actions.dmi diff --git a/modular_skyrat/modules/gunsafety/readme.md b/modular_skyrat/modules/gun_safety/readme.md similarity index 87% rename from modular_skyrat/modules/gunsafety/readme.md rename to modular_skyrat/modules/gun_safety/readme.md index d929b682bac..dc0634151ea 100644 --- a/modular_skyrat/modules/gunsafety/readme.md +++ b/modular_skyrat/modules/gun_safety/readme.md @@ -24,3 +24,4 @@ Adds a huge QOL feature, GUN SAFTIES. ### Credits: Gandalf2k15 - OG code +Paxilmaniac - Turned it into a component diff --git a/modular_skyrat/modules/gunhud/code/gun_hud_component.dm b/modular_skyrat/modules/gunhud/code/gun_hud_component.dm index dda48fe37a1..f32981b01e4 100644 --- a/modular_skyrat/modules/gunhud/code/gun_hud_component.dm +++ b/modular_skyrat/modules/gunhud/code/gun_hud_component.dm @@ -62,17 +62,6 @@ var/oth_t var/oth_h - switch(pew.fire_select) - if(SELECT_SEMI_AUTOMATIC) - indicator = "semi" - if(SELECT_BURST_SHOT) - indicator = "burst" - if(SELECT_FULLY_AUTOMATIC) - indicator = "auto" - - if(pew.safety) - indicator = "safe" - switch(length(rounds)) if(1) oth_o = "o[rounds[1]]" diff --git a/modular_skyrat/modules/gunsafety/code/gun_safety.dm b/modular_skyrat/modules/gunsafety/code/gun_safety.dm deleted file mode 100644 index d4012fc32b7..00000000000 --- a/modular_skyrat/modules/gunsafety/code/gun_safety.dm +++ /dev/null @@ -1,32 +0,0 @@ -/obj/item/gun/ballistic - has_gun_safety = TRUE - -/obj/item/gun/ballistic/bow - has_gun_safety = FALSE - -/obj/item/gun/energy - has_gun_safety = TRUE - -/obj/item/gun/energy/plasmacutter - has_gun_safety = FALSE - -/obj/item/gun/energy/kinetic_accelerator - has_gun_safety = FALSE - -/obj/item/gun/ballistic/rifle/enchanted - has_gun_safety = FALSE - -/obj/item/gun/ballistic/automatic/laser/ctf - has_gun_safety = FALSE - -/obj/item/gun/ballistic/shotgun/ctf - has_gun_safety = FALSE - -/obj/item/gun/ballistic/automatic/laser/ctf/marksman - has_gun_safety = FALSE - -/obj/item/gun/ballistic/automatic/pistol/deagle/ctf - has_gun_safety = FALSE - -/obj/item/gun/ballistic/automatic/pistol/g17/mesa - has_gun_safety = FALSE diff --git a/modular_skyrat/modules/gunsgalore/code/guns/akm.dm b/modular_skyrat/modules/gunsgalore/code/guns/akm.dm index d0d111a9eb1..3c73de359d7 100644 --- a/modular_skyrat/modules/gunsgalore/code/guns/akm.dm +++ b/modular_skyrat/modules/gunsgalore/code/guns/akm.dm @@ -21,7 +21,14 @@ load_empty_sound = 'modular_skyrat/modules/gunsgalore/sound/guns/interact/ltrifle_magin.ogg' eject_sound = 'modular_skyrat/modules/gunsgalore/sound/guns/interact/ltrifle_magout.ogg' alt_icons = TRUE - company_flag = COMPANY_IZHEVSK + +/obj/item/gun/ballistic/automatic/akm/Initialize(mapload) + . = ..() + + AddComponent(/datum/component/automatic_fire, fire_delay) + +/obj/item/gun/ballistic/automatic/akm/give_manufacturer_examine() + AddComponent(/datum/component/manufacturer_examine, COMPANY_IZHEVSK) /obj/item/ammo_box/magazine/akm name = "\improper Krinkov magazine" @@ -88,7 +95,6 @@ desc = "A timeless human design of a carbine chambered in the NRI's 5.6mm ammo. The internal modifications made to the firearm in order to accommodate for non-military use made it incompatible with conventional munitions and gave it the inability to fire fully automatic. It's purpose-built to fire low-grade civilian ammo, anything stronger would obliterate the rifling and render the firearm useless." icon_state = "akm_civ" inhand_icon_state = "akm_civ" - fire_select_modes = list(SELECT_SEMI_AUTOMATIC) mag_type = /obj/item/ammo_box/magazine/akm/civvie burst_size = 1 fire_delay = 5 diff --git a/modular_skyrat/modules/gunsgalore/code/guns/fg42.dm b/modular_skyrat/modules/gunsgalore/code/guns/fg42.dm index 67e9566fc04..c5066404f96 100644 --- a/modular_skyrat/modules/gunsgalore/code/guns/fg42.dm +++ b/modular_skyrat/modules/gunsgalore/code/guns/fg42.dm @@ -23,12 +23,17 @@ load_empty_sound = 'modular_skyrat/modules/gunsgalore/sound/guns/interact/batrifle_magin.ogg' eject_sound = 'modular_skyrat/modules/gunsgalore/sound/guns/interact/batrifle_magout.ogg' eject_empty_sound = 'modular_skyrat/modules/gunsgalore/sound/guns/interact/batrifle_magout.ogg' - company_flag = COMPANY_OLDARMS /obj/item/gun/ballistic/automatic/fg42/Initialize(mapload) . = ..() + AddComponent(/datum/component/scope, range_modifier = 1) + AddComponent(/datum/component/automatic_fire, fire_delay) + +/obj/item/gun/ballistic/automatic/fg42/give_manufacturer_examine() + AddComponent(/datum/component/manufacturer_examine, COMPANY_OLDARMS) + /obj/item/ammo_box/magazine/fg42 name = "fg42 magazine (7.92x57mm)" icon = 'modular_skyrat/modules/gunsgalore/icons/guns/gunsgalore_items.dmi' diff --git a/modular_skyrat/modules/gunsgalore/code/guns/luger.dm b/modular_skyrat/modules/gunsgalore/code/guns/luger.dm index 8f50e0191cd..cb0deda1c27 100644 --- a/modular_skyrat/modules/gunsgalore/code/guns/luger.dm +++ b/modular_skyrat/modules/gunsgalore/code/guns/luger.dm @@ -14,4 +14,6 @@ rack_sound = 'modular_skyrat/modules/gunsgalore/sound/guns/fire/luger_rack.ogg' fire_sound_volume = 100 suppressor_x_offset = 14 - company_flag = COMPANY_OLDARMS + +/obj/item/gun/ballistic/automatic/pistol/luger/give_manufacturer_examine() + AddComponent(/datum/component/manufacturer_examine, COMPANY_OLDARMS) diff --git a/modular_skyrat/modules/gunsgalore/code/guns/m16.dm b/modular_skyrat/modules/gunsgalore/code/guns/m16.dm index 431056f1916..75e4a5fa144 100644 --- a/modular_skyrat/modules/gunsgalore/code/guns/m16.dm +++ b/modular_skyrat/modules/gunsgalore/code/guns/m16.dm @@ -53,6 +53,11 @@ burst_size = 3 fire_delay = 1.90 +/obj/item/gun/ballistic/automatic/m16/modern/Initialize(mapload) + . = ..() + + AddComponent(/datum/component/automatic_fire, fire_delay) + /obj/item/gun/ballistic/automatic/m16/modern/v2 name = "\improper XM-2537 'Amans Patriae' rifle" desc = "An expertly modified, super-compact XM-2537 rifle designed for operating in tight corridors and fields full of Bethlehem flowers. You're a soldier, finish your mission!" diff --git a/modular_skyrat/modules/gunsgalore/code/guns/mg34.dm b/modular_skyrat/modules/gunsgalore/code/guns/mg34.dm index 02641b6fae0..152c98d1933 100644 --- a/modular_skyrat/modules/gunsgalore/code/guns/mg34.dm +++ b/modular_skyrat/modules/gunsgalore/code/guns/mg34.dm @@ -13,7 +13,6 @@ rack_sound = 'sound/weapons/gun/l6/l6_rack.ogg' suppressed_sound = 'sound/weapons/gun/general/heavy_shot_suppressed.ogg' fire_sound_volume = 70 - fire_select_modes = list(SELECT_SEMI_AUTOMATIC, SELECT_FULLY_AUTOMATIC) weapon_weight = WEAPON_HEAVY slot_flags = ITEM_SLOT_BACK w_class = WEIGHT_CLASS_HUGE @@ -24,13 +23,18 @@ bolt_type = BOLT_TYPE_OPEN show_bolt_icon = FALSE tac_reloads = FALSE - company_flag = COMPANY_OLDARMS var/cover_open = FALSE /obj/item/gun/ballistic/automatic/mg34/Initialize(mapload) . = ..() + + AddComponent(/datum/component/automatic_fire, fire_delay) + AddElement(/datum/element/update_icon_updates_onmob) +/obj/item/gun/ballistic/automatic/mg34/give_manufacturer_examine() + AddComponent(/datum/component/manufacturer_examine, COMPANY_OLDARMS) + /obj/item/gun/ballistic/automatic/mg34/examine(mob/user) . = ..() . += "RMB with an empty hand to [cover_open ? "close" : "open"] the dust cover." diff --git a/modular_skyrat/modules/gunsgalore/code/guns/mp40.dm b/modular_skyrat/modules/gunsgalore/code/guns/mp40.dm index 21904008a9f..46ab724c3b8 100644 --- a/modular_skyrat/modules/gunsgalore/code/guns/mp40.dm +++ b/modular_skyrat/modules/gunsgalore/code/guns/mp40.dm @@ -20,8 +20,14 @@ load_empty_sound = 'modular_skyrat/modules/gunsgalore/sound/guns/interact/smg_magin.ogg' eject_sound = 'modular_skyrat/modules/gunsgalore/sound/guns/interact/smg_magout.ogg' alt_icons = TRUE - fire_select_modes = list(SELECT_SEMI_AUTOMATIC, SELECT_FULLY_AUTOMATIC) - company_flag = COMPANY_OLDARMS + +/obj/item/gun/ballistic/automatic/mp40/Initialize(mapload) + . = ..() + + AddComponent(/datum/component/automatic_fire, fire_delay) + +/obj/item/gun/ballistic/automatic/mp40/give_manufacturer_examine() + AddComponent(/datum/component/manufacturer_examine, COMPANY_OLDARMS) /obj/item/ammo_box/magazine/mp40 name = "mp40 magazine (9mmx19)" diff --git a/modular_skyrat/modules/gunsgalore/code/guns/p90.dm b/modular_skyrat/modules/gunsgalore/code/guns/p90.dm index 405aacc8cbc..5d8b81ae2dd 100644 --- a/modular_skyrat/modules/gunsgalore/code/guns/p90.dm +++ b/modular_skyrat/modules/gunsgalore/code/guns/p90.dm @@ -11,7 +11,6 @@ slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_BACK mag_type = /obj/item/ammo_box/magazine/p90 can_suppress = FALSE - burst_size = 5 fire_delay = 1 fire_sound = 'modular_skyrat/modules/gunsgalore/sound/guns/fire/p90_fire.ogg' fire_sound_volume = 100 @@ -21,6 +20,11 @@ eject_sound = 'modular_skyrat/modules/gunsgalore/sound/guns/interact/p90_magout.ogg' alt_icons = TRUE +/obj/item/gun/ballistic/automatic/p90/Initialize(mapload) + . = ..() + + AddComponent(/datum/component/automatic_fire, fire_delay) + /obj/item/ammo_box/magazine/p90 name = "\improper P90-02 magazine" icon = 'modular_skyrat/modules/gunsgalore/icons/guns/gunsgalore_items.dmi' diff --git a/modular_skyrat/modules/gunsgalore/code/guns/pps.dm b/modular_skyrat/modules/gunsgalore/code/guns/pps.dm index d3d383a34c5..6e2646ebaa2 100644 --- a/modular_skyrat/modules/gunsgalore/code/guns/pps.dm +++ b/modular_skyrat/modules/gunsgalore/code/guns/pps.dm @@ -9,7 +9,6 @@ slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_BACK mag_type = /obj/item/ammo_box/magazine/pps can_suppress = FALSE - burst_size = 3 fire_delay = 3 worn_icon = 'modular_skyrat/modules/gunsgalore/icons/guns/gunsgalore_back.dmi' worn_icon_state = "pps" @@ -20,7 +19,14 @@ load_sound = 'modular_skyrat/modules/gunsgalore/sound/guns/interact/smg_magin.ogg' load_empty_sound = 'modular_skyrat/modules/gunsgalore/sound/guns/interact/smg_magin.ogg' eject_sound = 'modular_skyrat/modules/gunsgalore/sound/guns/interact/smg_magout.ogg' - company_flag = COMPANY_OLDARMS + +/obj/item/gun/ballistic/automatic/pps/Initialize(mapload) + . = ..() + + AddComponent(/datum/component/automatic_fire, fire_delay) + +/obj/item/gun/ballistic/automatic/pps/give_manufacturer_examine() + AddComponent(/datum/component/manufacturer_examine, COMPANY_OLDARMS) /obj/item/ammo_box/magazine/pps name = "pps magazine (7.62x25mm)" diff --git a/modular_skyrat/modules/gunsgalore/code/guns/ppsh.dm b/modular_skyrat/modules/gunsgalore/code/guns/ppsh.dm index 6cf7b6eb9bf..227e3784642 100644 --- a/modular_skyrat/modules/gunsgalore/code/guns/ppsh.dm +++ b/modular_skyrat/modules/gunsgalore/code/guns/ppsh.dm @@ -13,7 +13,6 @@ mag_type = /obj/item/ammo_box/magazine/ppsh can_suppress = FALSE spread = 20 - burst_size = 6 fire_delay = 0.5 fire_sound = 'modular_skyrat/modules/gunsgalore/sound/guns/fire/ppsh_fire.ogg' fire_sound_volume = 80 @@ -22,7 +21,14 @@ load_sound = 'modular_skyrat/modules/gunsgalore/sound/guns/interact/smg_magin.ogg' load_empty_sound = 'modular_skyrat/modules/gunsgalore/sound/guns/interact/smg_magin.ogg' eject_sound = 'modular_skyrat/modules/gunsgalore/sound/guns/interact/smg_magout.ogg' - company_flag = COMPANY_OLDARMS + +/obj/item/gun/ballistic/automatic/ppsh/Initialize(mapload) + . = ..() + + AddComponent(/datum/component/automatic_fire, fire_delay) + +/obj/item/gun/ballistic/automatic/ppsh/give_manufacturer_examine() + AddComponent(/datum/component/manufacturer_examine, COMPANY_OLDARMS) /obj/item/ammo_box/magazine/ppsh name = "Asha 76 magazine (7.62x25mm)" diff --git a/modular_skyrat/modules/gunsgalore/code/guns/scar.dm b/modular_skyrat/modules/gunsgalore/code/guns/scar.dm index 17d268ac995..62f6bbf6888 100644 --- a/modular_skyrat/modules/gunsgalore/code/guns/scar.dm +++ b/modular_skyrat/modules/gunsgalore/code/guns/scar.dm @@ -13,7 +13,6 @@ weapon_weight = WEAPON_HEAVY mag_type = /obj/item/ammo_box/magazine/m16 can_suppress = FALSE - burst_size = 3 fire_delay = 1.90 fire_sound = 'modular_skyrat/modules/gunsgalore/sound/guns/fire/scar_fire.ogg' fire_sound_volume = 50 @@ -22,3 +21,8 @@ load_empty_sound = 'modular_skyrat/modules/gunsgalore/sound/guns/interact/scar_mag_in.ogg' eject_sound = 'modular_skyrat/modules/gunsgalore/sound/guns/interact/scar_mag_out.ogg' alt_icons = TRUE + +/obj/item/gun/ballistic/automatic/scar/Initialize(mapload) + . = ..() + + AddComponent(/datum/component/automatic_fire, fire_delay) diff --git a/modular_skyrat/modules/gunsgalore/code/guns/stg.dm b/modular_skyrat/modules/gunsgalore/code/guns/stg.dm index db857c4e116..95a7c6f913c 100644 --- a/modular_skyrat/modules/gunsgalore/code/guns/stg.dm +++ b/modular_skyrat/modules/gunsgalore/code/guns/stg.dm @@ -18,12 +18,18 @@ fire_sound = 'modular_skyrat/modules/gunsgalore/sound/guns/fire/stg_fire.ogg' fire_sound_volume = 70 alt_icons = TRUE - fire_select_modes = list(SELECT_SEMI_AUTOMATIC, SELECT_FULLY_AUTOMATIC) rack_sound = 'modular_skyrat/modules/gunsgalore/sound/guns/interact/ltrifle_cock.ogg' load_sound = 'modular_skyrat/modules/gunsgalore/sound/guns/interact/ltrifle_magin.ogg' load_empty_sound = 'modular_skyrat/modules/gunsgalore/sound/guns/interact/ltrifle_magin.ogg' eject_sound = 'modular_skyrat/modules/gunsgalore/sound/guns/interact/ltrifle_magout.ogg' - company_flag = COMPANY_OLDARMS + +/obj/item/gun/ballistic/automatic/stg/Initialize(mapload) + . = ..() + + AddComponent(/datum/component/automatic_fire, fire_delay) + +/obj/item/gun/ballistic/automatic/stg/give_manufacturer_examine() + AddComponent(/datum/component/manufacturer_examine, COMPANY_OLDARMS) /obj/item/ammo_box/magazine/stg name = "stg magazine (7.92x33mm)" diff --git a/modular_skyrat/modules/gunsgalore/icons/guns/gunsgalore_guns40x32.dmi b/modular_skyrat/modules/gunsgalore/icons/guns/gunsgalore_guns40x32.dmi index 4e9e6d62d62ddcd1eb267ce36f38cdee4e7feb7f..2a9b53ba7f9beb1f41ebb99bd4092c6ec1c53f60 100644 GIT binary patch literal 10517 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 literal 11734 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 etched into the grip." + if(COMPANY_ARMADYNE) + examine_list += "
It has [span_red("Armadyne Corporation")] etched into the barrel." + if(COMPANY_SCARBOROUGH) + examine_list += "
It has [span_orange("Scarborough Arms")] stamped onto the grip." + if(COMPANY_DONK) + examine_list += "
It has a [span_green("Donk Corporation")] label visible in the plastic." + if(COMPANY_BOLT) + examine_list += "
It has [span_yellow("Bolt Fabrications")] stamped onto the reciever." + if(COMPANY_OLDARMS) + examine_list += "
It has [span_red("Armadyne Oldarms")] etched into the barrel." + if(COMPANY_IZHEVSK) + examine_list += "
It has [span_brown("Izhevsk Coalition")] cut in above the magwell." + if(COMPANY_NANOTRASEN) + examine_list += "
It has [span_blue("Nanotrasen Armories")] etched into the reciever." + if(COMPANY_ALLSTAR) + examine_list += "
It has [span_red("Allstar Lasers Inc.")] stamped on the front grip." + if(COMPANY_MICRON) + examine_list += "
It has [span_cyan("Micron Control Sys.")] cut in above the cell slot." + if(COMPANY_INTERDYNE) + examine_list += "
It has [span_cyan("Interdyne Pharmaceuticals")] stamped onto the barrel." + if(COMPANY_ABDUCTOR) + examine_list += "
It has [span_abductor("✌︎︎♌︎︎♎︎︎◆︎︎♍︎︎⧫︎︎❄︎♏︎♍︎♒︎")] engraved into the photon accelerator." + if(COMPANY_REMOVED) + examine_list += "
It has had [span_grey("all identifying marks scrubbed off")]." diff --git a/modular_skyrat/modules/manufacturer_examine/readme.md b/modular_skyrat/modules/manufacturer_examine/readme.md new file mode 100644 index 00000000000..4e27e204550 --- /dev/null +++ b/modular_skyrat/modules/manufacturer_examine/readme.md @@ -0,0 +1,25 @@ +## Title: Manufacturer Examine + +### Description: + +Tells you what company made what item this component is attached to, originally for guns + +### TG Proc Changes: + +- N/A + +### Defines: + +- N/A + +### Master file additions + +- N/A + +### Included files that are not contained in this module: + +- N/A + +### Credits: +Zonespace - Did the whole manufacturer thing originally I think +Paxilmaniac - Turned it into a component diff --git a/modular_skyrat/modules/marines/code/gear.dm b/modular_skyrat/modules/marines/code/gear.dm index 4dd460c6b4e..2b1cad54540 100644 --- a/modular_skyrat/modules/marines/code/gear.dm +++ b/modular_skyrat/modules/marines/code/gear.dm @@ -18,7 +18,14 @@ mag_type = /obj/item/ammo_box/magazine/m44a w_class = WEIGHT_CLASS_BULKY slot_flags = ITEM_SLOT_BELT - company_flag = COMPANY_NANOTRASEN + +/obj/item/gun/ballistic/automatic/ar/modular/m44a/Initialize(mapload) + . = ..() + + AddComponent(/datum/component/automatic_fire, fire_delay) + +/obj/item/gun/ballistic/automatic/ar/modular/m44a/give_manufacturer_examine() + AddComponent(/datum/component/manufacturer_examine, COMPANY_NANOTRASEN) /obj/item/ammo_box/magazine/m44a name = "m44a magazine (.300 compressed)" @@ -57,9 +64,11 @@ name = "\improper M2 auto-shotgun underbarrel" desc = "This shouldn't be heeere!" can_suppress = FALSE - has_gun_safety = FALSE mag_type = /obj/item/ammo_box/magazine/internal/shot/as2/ubsg +/obj/item/gun/ballistic/shotgun/automatic/as2/ubsg/give_gun_safeties() + return + /obj/item/ammo_box/magazine/internal/shot/as2/ubsg max_ammo = 3 ammo_type = /obj/item/ammo_casing/shotgun/buckshot diff --git a/modular_skyrat/modules/marines/code/smartgun.dm b/modular_skyrat/modules/marines/code/smartgun.dm index 269e7c39a65..592750d6b95 100644 --- a/modular_skyrat/modules/marines/code/smartgun.dm +++ b/modular_skyrat/modules/marines/code/smartgun.dm @@ -13,7 +13,6 @@ rack_sound = 'sound/weapons/gun/l6/l6_rack.ogg' suppressed_sound = 'sound/weapons/gun/general/heavy_shot_suppressed.ogg' fire_sound_volume = 70 - fire_select_modes = list(SELECT_SEMI_AUTOMATIC, SELECT_FULLY_AUTOMATIC) weapon_weight = WEAPON_HEAVY slot_flags = ITEM_SLOT_BACK w_class = WEIGHT_CLASS_HUGE @@ -28,7 +27,6 @@ pin = /obj/item/firing_pin/implant/mindshield mag_display_ammo = FALSE mag_display = FALSE - company_flag = COMPANY_NANOTRASEN fire_sound_volume = 30 /// If the gun's dustcover is open or not var/cover_open = FALSE @@ -37,8 +35,14 @@ /obj/item/gun/ballistic/automatic/smart_machine_gun/Initialize(mapload) . = ..() + + AddComponent(/datum/component/automatic_fire, fire_delay) + AddElement(/datum/element/update_icon_updates_onmob) +/obj/item/gun/ballistic/automatic/smart_machine_gun/give_manufacturer_examine() + AddComponent(/datum/component/manufacturer_examine, COMPANY_NANOTRASEN) + /obj/item/gun/ballistic/automatic/smart_machine_gun/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) . = ..() if(chambered) diff --git a/modular_skyrat/modules/medical/code/smartdarts.dm b/modular_skyrat/modules/medical/code/smartdarts.dm index 558d9a84f2d..c36caa3f1eb 100644 --- a/modular_skyrat/modules/medical/code/smartdarts.dm +++ b/modular_skyrat/modules/medical/code/smartdarts.dm @@ -47,13 +47,15 @@ icon = 'modular_skyrat/modules/medical/icons/obj/dartguns.dmi' icon_state = "smartdartgun" worn_icon_state = "medicalsyringegun" - has_gun_safety = TRUE item_flags = null /obj/item/gun/syringe/smartdart/Initialize(mapload) . = ..() chambered = new /obj/item/ammo_casing/syringegun/dart(src) +/obj/item/gun/syringe/smartdart/give_gun_safeties() + return + /obj/item/gun/syringe/smartdart/attackby(obj/item/container, mob/user, params, show_msg = TRUE) if(istype(container, /obj/item/reagent_containers/syringe/smartdart)) ..() diff --git a/modular_skyrat/modules/microfusion/code/gun_types.dm b/modular_skyrat/modules/microfusion/code/gun_types.dm index c62d6338099..788ec1fb62b 100644 --- a/modular_skyrat/modules/microfusion/code/gun_types.dm +++ b/modular_skyrat/modules/microfusion/code/gun_types.dm @@ -4,7 +4,9 @@ icon_state = "mcr01" inhand_icon_state = "mcr01" shaded_charge = TRUE - company_flag = COMPANY_MICRON + +/obj/item/gun/microfusion/mcr01/give_manufacturer_examine() + AddComponent(/datum/component/manufacturer_examine, COMPANY_MICRON) /// Gun for cargo crates. /obj/item/gun/microfusion/mcr01/advanced diff --git a/modular_skyrat/modules/microfusion/code/microfusion_energy_master.dm b/modular_skyrat/modules/microfusion/code/microfusion_energy_master.dm index 0a01217264e..d87390d8a4c 100644 --- a/modular_skyrat/modules/microfusion/code/microfusion_energy_master.dm +++ b/modular_skyrat/modules/microfusion/code/microfusion_energy_master.dm @@ -9,10 +9,8 @@ icon = 'modular_skyrat/modules/microfusion/icons/microfusion_gun40x32.dmi' icon_state = "mcr01" inhand_icon_state = "mcr01" - bayonet_icon = 'modular_skyrat/modules/microfusion/icons/microfusion_gun40x32.dmi' lefthand_file = 'modular_skyrat/modules/microfusion/icons/guns_lefthand.dmi' righthand_file = 'modular_skyrat/modules/microfusion/icons/guns_righthand.dmi' - has_gun_safety = TRUE can_bayonet = FALSE weapon_weight = WEAPON_HEAVY w_class = WEIGHT_CLASS_BULKY @@ -113,6 +111,9 @@ RegisterSignal(src, COMSIG_ITEM_RECHARGED, PROC_REF(instant_recharge)) base_fire_delay = fire_delay +/obj/item/gun/microfusion/give_gun_safeties() + AddComponent(/datum/component/gun_safety) + /obj/item/gun/microfusion/add_weapon_description() AddElement(/datum/element/weapon_description, attached_proc = PROC_REF(add_notes_energy)) diff --git a/modular_skyrat/modules/modular_weapons/code/automatic.dm b/modular_skyrat/modules/modular_weapons/code/automatic.dm index 7025c25fffe..1ee0c4c2874 100644 --- a/modular_skyrat/modules/modular_weapons/code/automatic.dm +++ b/modular_skyrat/modules/modular_weapons/code/automatic.dm @@ -43,7 +43,6 @@ selector_switch_icon = TRUE mag_type = /obj/item/ammo_box/magazine/multi_sprite/cfa_wildcat can_suppress = FALSE - burst_size = 3 fire_delay = 1.25 spread = 5 mag_display = TRUE @@ -51,7 +50,14 @@ fire_sound = 'sound/weapons/gun/smg/shot_alt.ogg' weapon_weight = WEAPON_MEDIUM w_class = WEIGHT_CLASS_BULKY - company_flag = COMPANY_CANTALAN + +/obj/item/gun/ballistic/automatic/cfa_wildcat/Initialize(mapload) + . = ..() + + AddComponent(/datum/component/automatic_fire, fire_delay) + +/obj/item/gun/ballistic/automatic/cfa_wildcat/give_manufacturer_examine() + AddComponent(/datum/component/manufacturer_examine, COMPANY_CANTALAN) /obj/item/gun/ballistic/automatic/cfa_wildcat/no_mag spawnwithmagazine = FALSE @@ -69,7 +75,6 @@ selector_switch_icon = FALSE mag_type = /obj/item/ammo_box/magazine/multi_sprite/cfa_lynx can_suppress = FALSE - burst_size = 3 fire_delay = 1.90 //Previously 0.5. Changed due to it being the Blueshield's default firearm. spread = 2 mag_display = TRUE @@ -77,7 +82,14 @@ fire_sound = 'sound/weapons/gun/smg/shot_alt.ogg' weapon_weight = WEAPON_MEDIUM w_class = WEIGHT_CLASS_BULKY - company_flag = COMPANY_CANTALAN + +/obj/item/gun/ballistic/automatic/cfa_lynx/Initialize(mapload) + . = ..() + + AddComponent(/datum/component/automatic_fire, fire_delay) + +/obj/item/gun/ballistic/automatic/cfa_lynx/give_manufacturer_examine() + AddComponent(/datum/component/manufacturer_examine, COMPANY_CANTALAN) /obj/item/gun/ballistic/automatic/cfa_lynx/no_mag spawnwithmagazine = FALSE diff --git a/modular_skyrat/modules/modular_weapons/code/energy.dm b/modular_skyrat/modules/modular_weapons/code/energy.dm index 1d6264e95db..ed6abe76ba0 100644 --- a/modular_skyrat/modules/modular_weapons/code/energy.dm +++ b/modular_skyrat/modules/modular_weapons/code/energy.dm @@ -17,8 +17,12 @@ cell_type = /obj/item/stock_parts/cell/mini_egun ammo_x_offset = 2 charge_sections = 3 - has_gun_safety = FALSE - company_flag = COMPANY_BOLT + +/obj/item/gun/energy/disabler/give_manufacturer_examine() + AddComponent(/datum/component/manufacturer_examine, COMPANY_BOLT) + +/obj/item/gun/energy/disabler/bolt_disabler/give_gun_safeties() + return /obj/item/gun/energy/disabler/bolt_disabler/add_seclight_point() return @@ -39,9 +43,13 @@ ammo_type = list(/obj/item/ammo_casing/energy/disabler/bounce, /obj/item/ammo_casing/energy/laser/bounce, /obj/item/ammo_casing/energy/electrode/knockdown) ammo_x_offset = 1 charge_sections = 5 - has_gun_safety = FALSE cell_type = /obj/item/stock_parts/cell/hos_gun - company_flag = COMPANY_CANTALAN + +/obj/item/gun/energy/e_gun/cfa_phalanx/give_manufacturer_examine() + AddComponent(/datum/component/manufacturer_examine, COMPANY_CANTALAN) + +/obj/item/gun/energy/e_gun/cfa_phalanx/give_gun_safeties() + return /* * CFA PALADIN @@ -57,8 +65,12 @@ force = 10 ammo_type = list(/obj/item/ammo_casing/energy/laser/double) charge_sections = 5 - has_gun_safety = FALSE - company_flag = COMPANY_CANTALAN + +/obj/item/gun/energy/laser/cfa_paladin/give_manufacturer_examine() + AddComponent(/datum/component/manufacturer_examine, COMPANY_CANTALAN) + +/obj/item/gun/energy/laser/cfa_paladin/give_gun_safeties() + return /* * BOUNCE DISABLER diff --git a/modular_skyrat/modules/modular_weapons/code/pistol.dm b/modular_skyrat/modules/modular_weapons/code/pistol.dm index c496114c037..668233fa327 100644 --- a/modular_skyrat/modules/modular_weapons/code/pistol.dm +++ b/modular_skyrat/modules/modular_weapons/code/pistol.dm @@ -11,8 +11,12 @@ can_suppress = TRUE fire_sound_volume = 30 w_class = WEIGHT_CLASS_SMALL - has_gun_safety = FALSE - company_flag = COMPANY_CANTALAN + +/obj/item/gun/ballistic/automatic/pistol/cfa_snub/give_manufacturer_examine() + AddComponent(/datum/component/manufacturer_examine, COMPANY_CANTALAN) + +/obj/item/gun/ballistic/automatic/pistol/cfa_snub/give_gun_safeties() + return /obj/item/gun/ballistic/automatic/pistol/cfa_snub/empty spawnwithmagazine = FALSE @@ -26,8 +30,12 @@ can_suppress = FALSE fire_sound_volume = 120 w_class = WEIGHT_CLASS_NORMAL - has_gun_safety = FALSE - company_flag = COMPANY_CANTALAN + +/obj/item/gun/ballistic/automatic/pistol/cfa_ruby/give_manufacturer_examine() + AddComponent(/datum/component/manufacturer_examine, COMPANY_CANTALAN) + +/obj/item/gun/ballistic/automatic/pistol/cfa_ruby/give_gun_safeties() + return /obj/item/gun/ballistic/automatic/pistol/cfa_ruby/empty spawnwithmagazine = FALSE diff --git a/modular_skyrat/modules/modular_weapons/code/revolver.dm b/modular_skyrat/modules/modular_weapons/code/revolver.dm index ff800272a37..132bfed2da0 100644 --- a/modular_skyrat/modules/modular_weapons/code/revolver.dm +++ b/modular_skyrat/modules/modular_weapons/code/revolver.dm @@ -20,8 +20,9 @@ lefthand_file = 'modular_skyrat/modules/modular_weapons/icons/mob/inhands/weapons/64x_guns_left.dmi' righthand_file = 'modular_skyrat/modules/modular_weapons/icons/mob/inhands/weapons/64x_guns_right.dmi' inhand_icon_state = "revolving" - company_flag = COMPANY_IZHEVSK +/obj/item/gun/ballistic/revolver/rifle/give_manufacturer_examine() + AddComponent(/datum/component/manufacturer_examine, COMPANY_IZHEVSK) /obj/item/gun/ballistic/revolver/rifle/gold name = "\improper .45 revolving rifle" desc = "A gold trimmed revolving rifle! It fires .45 bullets." diff --git a/modular_skyrat/modules/modular_weapons/code/rifle.dm b/modular_skyrat/modules/modular_weapons/code/rifle.dm index 9eca675ce73..6f26f8bab0b 100644 --- a/modular_skyrat/modules/modular_weapons/code/rifle.dm +++ b/modular_skyrat/modules/modular_weapons/code/rifle.dm @@ -16,22 +16,25 @@ mag_type = /obj/item/ammo_box/magazine/cm68 fire_delay = 5 can_suppress = FALSE - burst_size = 0 - fire_select_modes = list(SELECT_SEMI_AUTOMATIC) + burst_size = 1 mag_display = FALSE mag_display_ammo = FALSE empty_indicator = FALSE recoil = 1 weapon_weight = WEAPON_HEAVY pixel_x = -8 - has_gun_safety = FALSE w_class = WEIGHT_CLASS_BULKY - company_flag = COMPANY_CANTALAN /obj/item/gun/ballistic/automatic/cfa_rifle/Initialize(mapload) . = ..() AddComponent(/datum/component/scope, range_modifier = 1.5) +/obj/item/gun/ballistic/automatic/cfa_rifle/give_manufacturer_examine() + AddComponent(/datum/component/manufacturer_examine, COMPANY_CANTALAN) + +/obj/item/gun/ballistic/automatic/cfa_rifle/give_gun_safeties() + return + /obj/item/gun/ballistic/automatic/cfa_rifle/empty spawnwithmagazine = FALSE diff --git a/modular_skyrat/master_files/code/modules/projectiles/guns/ballistic/revolver.dm b/modular_skyrat/modules/moretraitoritems/code/ocelot_revolver.dm similarity index 100% rename from modular_skyrat/master_files/code/modules/projectiles/guns/ballistic/revolver.dm rename to modular_skyrat/modules/moretraitoritems/code/ocelot_revolver.dm diff --git a/modular_skyrat/modules/moretraitoritems/code/syndicate_loadout.dm b/modular_skyrat/modules/moretraitoritems/code/syndicate_loadout.dm index 5070736c2ad..d756ff42810 100644 --- a/modular_skyrat/modules/moretraitoritems/code/syndicate_loadout.dm +++ b/modular_skyrat/modules/moretraitoritems/code/syndicate_loadout.dm @@ -185,7 +185,7 @@ new /obj/item/storage/box/donkpockets(src) /obj/item/storage/backpack/duffelbag/syndie/loadout/downtownspecial/PopulateContents() - new /obj/item/gun/ballistic/automatic/tommygun/therealtommy(src) + new /obj/item/gun/ballistic/automatic/tommygun(src) new /obj/item/ammo_box/magazine/tommygunm45(src) new /obj/item/clothing/suit/jacket/det_suit/noir/mafioso(src) new /obj/item/clothing/under/suit/blacktwopiece/armoured(src) diff --git a/modular_skyrat/modules/novaya_ert/code/automatic.dm b/modular_skyrat/modules/novaya_ert/code/automatic.dm index 200b68710dd..ea7eb69b19f 100644 --- a/modular_skyrat/modules/novaya_ert/code/automatic.dm +++ b/modular_skyrat/modules/novaya_ert/code/automatic.dm @@ -16,7 +16,9 @@ mag_display = TRUE empty_indicator = TRUE fire_sound = 'sound/weapons/gun/smg/shot_alt.ogg' - company_flag = COMPANY_IZHEVSK + +/obj/item/gun/ballistic/automatic/plastikov/nri/give_manufacturer_examine() + AddComponent(/datum/component/manufacturer_examine, COMPANY_IZHEVSK) /obj/item/gun/ballistic/automatic/plastikov/nri_pirate name = "\improper PP-105 SMG" @@ -43,4 +45,6 @@ mag_type = /obj/item/ammo_box/magazine/m9mm_aps burst_size = 3 fire_delay = 3 - company_flag = COMPANY_IZHEVSK + +/obj/item/gun/ballistic/automatic/pistol/ladon/nri/give_manufacturer_examine() + AddComponent(/datum/component/manufacturer_examine, COMPANY_IZHEVSK) diff --git a/modular_skyrat/modules/sec_haul/code/guns/guns.dm b/modular_skyrat/modules/sec_haul/code/guns/guns.dm index 95ac8ae711a..bf1f6abf203 100644 --- a/modular_skyrat/modules/sec_haul/code/guns/guns.dm +++ b/modular_skyrat/modules/sec_haul/code/guns/guns.dm @@ -15,9 +15,11 @@ lock_back_sound = 'sound/weapons/gun/pistol/slide_lock.ogg' bolt_drop_sound = 'sound/weapons/gun/pistol/slide_drop.ogg' fire_delay = 1.90 - company_flag = COMPANY_CANTALAN projectile_damage_multiplier = 0.5 +/obj/item/gun/ballistic/automatic/pistol/g17/give_manufacturer_examine() + AddComponent(/datum/component/manufacturer_examine, COMPANY_CANTALAN) + /obj/item/gun/ballistic/automatic/pistol/g17/add_seclight_point() return @@ -60,9 +62,11 @@ spread = 8 mag_display = FALSE mag_display_ammo = FALSE - company_flag = COMPANY_CANTALAN projectile_damage_multiplier = 0.5 +/obj/item/gun/ballistic/automatic/pistol/g18/give_manufacturer_examine() + AddComponent(/datum/component/manufacturer_examine, COMPANY_CANTALAN) + /obj/item/gun/ballistic/automatic/pistol/g18/add_seclight_point() AddComponent(/datum/component/seclite_attachable, light_overlay_icon = 'icons/obj/weapons/guns/flashlights.dmi', light_overlay = "flight") @@ -100,7 +104,9 @@ lock_back_sound = 'sound/weapons/gun/pistol/slide_lock.ogg' bolt_drop_sound = 'sound/weapons/gun/pistol/slide_drop.ogg' fire_delay = 0.9 - company_flag = null + +/obj/item/gun/ballistic/automatic/pistol/g17/mesa/give_manufacturer_examine() + return /obj/item/gun/ballistic/automatic/pistol/g17/mesa/add_seclight_point() AddComponent(/datum/component/seclite_attachable, light_overlay_icon = 'icons/obj/weapons/guns/flashlights.dmi', light_overlay = "flight") @@ -124,7 +130,9 @@ rack_sound = 'sound/weapons/gun/pistol/rack.ogg' lock_back_sound = 'sound/weapons/gun/pistol/slide_lock.ogg' bolt_drop_sound = 'sound/weapons/gun/pistol/slide_drop.ogg' - company_flag = COMPANY_ARMADYNE + +/obj/item/gun/ballistic/automatic/pistol/pdh/give_manufacturer_examine() + AddComponent(/datum/component/manufacturer_examine, COMPANY_ARMADYNE) /obj/item/gun/ballistic/automatic/pistol/pdh/add_seclight_point() AddComponent(/datum/component/seclite_attachable, light_overlay_icon = 'icons/obj/weapons/guns/flashlights.dmi', light_overlay = "flight") @@ -175,7 +183,6 @@ burst_size = 3 fire_delay = 2 spread = 5 - company_flag = COMPANY_ARMADYNE /obj/item/ammo_box/magazine/multi_sprite/pdh_corpo name = "\improper PDH-6M magazine" @@ -206,7 +213,6 @@ burst_size = 3 fire_delay = 2 spread = 9 - company_flag = COMPANY_ARMADYNE /obj/item/ammo_box/magazine/multi_sprite/pdh_striker name = "\improper PDH-6M magazine" @@ -232,7 +238,6 @@ icon_state = "pdh_peacekeeper" mag_type = /obj/item/ammo_box/magazine/multi_sprite/pdh_peacekeeper fire_sound = 'modular_skyrat/modules/sec_haul/sound/pistol_fire.ogg' - company_flag = COMPANY_ARMADYNE projectile_damage_multiplier = 0.5 /obj/item/ammo_box/magazine/multi_sprite/pdh_peacekeeper @@ -277,9 +282,11 @@ lock_back_sound = 'sound/weapons/gun/pistol/slide_lock.ogg' bolt_drop_sound = 'sound/weapons/gun/pistol/slide_drop.ogg' fire_delay = 4.20 - company_flag = COMPANY_ARMADYNE projectile_damage_multiplier = 0.7 +/obj/item/gun/ballistic/automatic/pistol/ladon/give_manufacturer_examine() + AddComponent(/datum/component/manufacturer_examine, COMPANY_ARMADYNE) + /obj/item/gun/ballistic/automatic/pistol/ladon/add_seclight_point() AddComponent(/datum/component/seclite_attachable, light_overlay_icon = 'icons/obj/weapons/guns/flashlights.dmi', light_overlay = "flight") @@ -320,9 +327,11 @@ rack_sound = 'sound/weapons/gun/pistol/rack.ogg' lock_back_sound = 'sound/weapons/gun/pistol/slide_lock.ogg' bolt_drop_sound = 'sound/weapons/gun/pistol/slide_drop.ogg' - company_flag = COMPANY_IZHEVSK projectile_damage_multiplier = 0.6 +/obj/item/gun/ballistic/automatic/pistol/makarov/give_manufacturer_examine() + AddComponent(/datum/component/manufacturer_examine, COMPANY_IZHEVSK) + /obj/item/ammo_box/magazine/multi_sprite/makarov name = "\improper R-C Makarov magazine" desc = "A tiny magazine for the R-C Makarov pocket pistol, chambered in 10mm Auto." @@ -361,9 +370,11 @@ rack_sound = 'sound/weapons/gun/pistol/rack.ogg' lock_back_sound = 'sound/weapons/gun/pistol/slide_lock.ogg' bolt_drop_sound = 'sound/weapons/gun/pistol/slide_drop.ogg' - company_flag = COMPANY_ARMADYNE projectile_damage_multiplier = 0.5 +/obj/item/gun/ballistic/automatic/pistol/mk58/give_manufacturer_examine() + AddComponent(/datum/component/manufacturer_examine, COMPANY_ARMADYNE) + /obj/item/ammo_box/magazine/multi_sprite/mk58 name = "\improper MK-58 magazine" desc = "A flimsy double-stack polymer magazine for the MK-58 handgun, chambered for 9x25mm." @@ -402,9 +413,11 @@ w_class = WEIGHT_CLASS_NORMAL mag_type = /obj/item/ammo_box/magazine/multi_sprite/firefly can_suppress = FALSE - company_flag = COMPANY_ARMADYNE projectile_damage_multiplier = 0.5 +/obj/item/gun/ballistic/automatic/pistol/firefly/give_manufacturer_examine() + AddComponent(/datum/component/manufacturer_examine, COMPANY_ARMADYNE) + /obj/item/gun/ballistic/automatic/pistol/firefly/add_seclight_point() AddComponent(/datum/component/seclite_attachable, light_overlay_icon = 'icons/obj/weapons/guns/flashlights.dmi', light_overlay = "flight") @@ -454,8 +467,9 @@ spread = 25 mag_display = FALSE mag_display_ammo = FALSE - fire_select_modes = list(SELECT_SEMI_AUTOMATIC, SELECT_BURST_SHOT) - company_flag = COMPANY_IZHEVSK + +/obj/item/gun/ballistic/automatic/croon/give_manufacturer_examine() + AddComponent(/datum/component/manufacturer_examine, COMPANY_IZHEVSK) /obj/item/ammo_box/magazine/multi_sprite/croon name = "\improper Croon magazine" @@ -495,12 +509,13 @@ mag_display_ammo = FALSE burst_size = 2 fire_delay = 1.90 - fire_select_modes = list(SELECT_SEMI_AUTOMATIC, SELECT_BURST_SHOT) fire_sound = 'sound/weapons/gun/rifle/shot.ogg' rack_sound = 'sound/weapons/gun/smg/smgrack.ogg' lock_back_sound = 'sound/weapons/gun/pistol/slide_lock.ogg' bolt_drop_sound = 'sound/weapons/gun/pistol/slide_drop.ogg' - company_flag = COMPANY_ARMADYNE + +/obj/item/gun/ballistic/automatic/dozer/give_manufacturer_examine() + AddComponent(/datum/component/manufacturer_examine, COMPANY_ARMADYNE) /obj/item/ammo_box/magazine/multi_sprite/dozer name = "\improper Dozer magazine" @@ -544,12 +559,18 @@ mag_type = /obj/item/ammo_box/magazine/dmr fire_delay = 1.7 can_suppress = FALSE - burst_size = 3 can_bayonet = FALSE mag_display = TRUE fire_sound_volume = 60 fire_sound = 'modular_skyrat/modules/sec_haul/sound/sniper_fire.ogg' - company_flag = COMPANY_ARMADYNE + +/obj/item/gun/ballistic/automatic/dmr/Initialize(mapload) + . = ..() + + AddComponent(/datum/component/automatic_fire, fire_delay) + +/obj/item/gun/ballistic/automatic/dmr/give_manufacturer_examine() + AddComponent(/datum/component/manufacturer_examine, COMPANY_ARMADYNE) /obj/item/ammo_box/magazine/dmr name = "\improper Gen-2 Ripper magazine" @@ -576,7 +597,9 @@ mag_type = /obj/item/ammo_box/magazine/internal/cylinder/zeta fire_sound = 'modular_skyrat/modules/sec_haul/sound/revolver_fire.ogg' fire_delay = 3 - company_flag = COMPANY_BOLT + +/obj/item/gun/ballistic/revolver/zeta/give_manufacturer_examine() + AddComponent(/datum/component/manufacturer_examine, COMPANY_BOLT) /obj/item/ammo_box/magazine/internal/cylinder/zeta name = "\improper Zeta-6 cylinder" @@ -613,9 +636,11 @@ mag_type = /obj/item/ammo_box/magazine/internal/cylinder/revolution fire_sound = 'modular_skyrat/modules/sec_haul/sound/revolver_fire.ogg' fire_delay = 1.90 - company_flag = COMPANY_BOLT projectile_damage_multiplier = 0.5 +/obj/item/gun/ballistic/revolver/revolution/give_manufacturer_examine() + AddComponent(/datum/component/manufacturer_examine, COMPANY_BOLT) + /obj/item/ammo_box/magazine/internal/cylinder/revolution name = "\improper Revolution-8 cylinder" desc = "If you see this, you should call a Bluespace Technician. Unless you're that Bluespace Technician." @@ -673,7 +698,9 @@ load_empty_sound = 'modular_skyrat/modules/sec_haul/sound/chaingun_magout.ogg' var/recharge_time = 5 SECONDS var/recharging = FALSE - company_flag = COMPANY_ARMADYNE + +/obj/item/gun/ballistic/automatic/smartgun/give_manufacturer_examine() + AddComponent(/datum/component/manufacturer_examine, COMPANY_ARMADYNE) /obj/item/gun/ballistic/automatic/smartgun/process_chamber() . = ..() @@ -750,14 +777,20 @@ slot_flags = ITEM_SLOT_BACK | ITEM_SLOT_BELT | ITEM_SLOT_OCLOTHING mag_type = /obj/item/ammo_box/magazine/multi_sprite/g11 can_suppress = FALSE - burst_size = 3 fire_delay = 0.5 spread = 10 mag_display = TRUE mag_display_ammo = TRUE fire_sound = 'modular_skyrat/modules/sec_haul/sound/ltrifle_fire.ogg' can_bayonet = TRUE - company_flag = COMPANY_OLDARMS + +/obj/item/gun/ballistic/auotmatic/g11/Initialize(mapload) + . = ..() + + AddComponent(/datum/component/automatic_fire, fire_delay) + +/obj/item/gun/ballistic/automatic/g11/give_manufacturer_examine() + AddComponent(/datum/component/manufacturer_examine, COMPANY_OLDARMS) /obj/item/ammo_box/magazine/multi_sprite/g11 name = "\improper G-11 magazine" @@ -790,7 +823,9 @@ mag_type = /obj/item/ammo_box/magazine/internal/shot/m23 w_class = WEIGHT_CLASS_BULKY slot_flags = ITEM_SLOT_BACK | ITEM_SLOT_BELT | ITEM_SLOT_OCLOTHING - company_flag = COMPANY_BOLT + +/obj/item/gun/ballistic/shotgun/m23/give_manufacturer_examine() + AddComponent(/datum/component/manufacturer_examine, COMPANY_BOLT) /obj/item/ammo_box/magazine/internal/shot/m23 name = "m23 shotgun internal magazine" @@ -819,7 +854,9 @@ mag_type = /obj/item/ammo_box/magazine/internal/shot/as2 w_class = WEIGHT_CLASS_BULKY slot_flags = ITEM_SLOT_BACK | ITEM_SLOT_BELT | ITEM_SLOT_OCLOTHING - company_flag = COMPANY_ARMADYNE + +/obj/item/gun/ballistic/shotgun/automatic/as2/give_manufacturer_examine() + AddComponent(/datum/component/manufacturer_examine, COMPANY_ARMADYNE) /obj/item/ammo_box/magazine/internal/shot/as2 name = "shotgun internal magazine" @@ -853,15 +890,16 @@ mag_display_ammo = TRUE actions_types = null fire_sound = 'modular_skyrat/modules/sec_haul/sound/ltrifle_fire.ogg' - fire_select_modes = list(SELECT_SEMI_AUTOMATIC) burst_size = 1 fire_delay = 10 - company_flag = COMPANY_ARMADYNE /obj/item/gun/ballistic/automatic/norwind/Initialize(mapload) . = ..() AddComponent(/datum/component/scope, range_modifier = 1.75) +/obj/item/gun/ballistic/automatic/norwind/give_manufacturer_examine() + AddComponent(/datum/component/manufacturer_examine, COMPANY_ARMADYNE) + /obj/item/gun/ballistic/automatic/norwind/add_seclight_point() AddComponent(/datum/component/seclite_attachable, light_overlay_icon = 'icons/obj/weapons/guns/flashlights.dmi', light_overlay = "flight") @@ -908,17 +946,21 @@ can_bayonet = FALSE mag_display = FALSE mag_display_ammo = FALSE - burst_size = 2 fire_delay = 4 spread = 10 fire_sound = 'sound/weapons/gun/smg/shot_suppressed.ogg' - company_flag = COMPANY_OLDARMS projectile_damage_multiplier = 0.5 /obj/item/gun/ballistic/automatic/vintorez/Initialize(mapload) . = ..() + AddComponent(/datum/component/scope, range_modifier = 1.5) + AddComponent(/datum/component/automatic_fire, fire_delay) + +/obj/item/gun/ballistic/automatic/vintorez/give_manufacturer_examine() + AddComponent(/datum/component/manufacturer_examine, COMPANY_OLDARMS) + /obj/item/ammo_box/magazine/multi_sprite/vintorez name = "\improper VKC magazine" desc = "A twenty-round magazine for the VKC marksman rifle, chambered in 9x25mm." @@ -960,15 +1002,21 @@ mag_type = /obj/item/ammo_box/magazine/multi_sprite/pcr fire_delay = 1.80 can_suppress = FALSE - burst_size = 5 spread = 10 can_bayonet = FALSE mag_display = TRUE mag_display_ammo = TRUE fire_sound = 'modular_skyrat/modules/sec_haul/sound/smg_fire.ogg' - company_flag = COMPANY_BOLT projectile_damage_multiplier = 0.5 +/obj/item/gun/ballistic/automatic/pcr/Initialize(mapload) + . = ..() + + AddComponent(/datum/component/automatic_fire, fire_delay) + +/obj/item/gun/ballistic/automatic/pcr/give_manufacturer_examine() + AddComponent(/datum/component/manufacturer_examine, COMPANY_BOLT) + /obj/item/gun/ballistic/automatic/pcr/add_seclight_point() AddComponent(/datum/component/seclite_attachable, light_overlay_icon = 'icons/obj/weapons/guns/flashlights.dmi', light_overlay = "flight") @@ -1015,9 +1063,16 @@ mag_display_ammo = TRUE fire_sound = 'modular_skyrat/modules/sec_haul/sound/sfrifle_fire.ogg' can_bayonet = TRUE - company_flag = COMPANY_BOLT projectile_damage_multiplier = 0.7 +/obj/item/gun/ballistic/automatic/pitbull/Initialize(mapload) + . = ..() + + AddComponent(/datum/component/automatic_fire, fire_delay) + +/obj/item/gun/ballistic/automatic/pitbull/give_manufacturer_examine() + AddComponent(/datum/component/manufacturer_examine, COMPANY_BOLT) + /obj/item/gun/ballistic/automatic/pitbull/add_seclight_point() AddComponent(/datum/component/seclite_attachable, light_overlay_icon = 'icons/obj/weapons/guns/flashlights.dmi', light_overlay = "flight") @@ -1070,7 +1125,14 @@ mag_display_ammo = TRUE fire_sound = 'sound/weapons/gun/smg/shot.ogg' can_bayonet = TRUE - company_flag = COMPANY_ARMADYNE + +/obj/item/gun/ballistic/automatic/ostwind/Initialize(mapload) + . = ..() + + AddComponent(/datum/component/automatic_fire, fire_delay) + +/obj/item/gun/ballistic/automatic/ostwind/give_manufacturer_examine() + AddComponent(/datum/component/manufacturer_examine, COMPANY_ARMADYNE) /obj/item/ammo_box/magazine/multi_sprite/ostwind name = "\improper DTR-6 magazine" diff --git a/modular_skyrat/modules/sec_haul/code/guns/pepperball_gun.dm b/modular_skyrat/modules/sec_haul/code/guns/pepperball_gun.dm index e76a3a83919..63854a4893f 100644 --- a/modular_skyrat/modules/sec_haul/code/guns/pepperball_gun.dm +++ b/modular_skyrat/modules/sec_haul/code/guns/pepperball_gun.dm @@ -11,7 +11,9 @@ lock_back_sound = 'sound/weapons/gun/pistol/slide_lock.ogg' bolt_drop_sound = 'sound/weapons/gun/pistol/slide_drop.ogg' fire_sound_volume = 50 - company_flag = COMPANY_BOLT + +/obj/item/gun/ballistic/automatic/pistol/pepperball/give_manufacturer_examine() + AddComponent(/datum/component/manufacturer_examine, COMPANY_BOLT) /obj/item/gun/ballistic/automatic/pistol/pepperball/add_seclight_point() AddComponent(/datum/component/seclite_attachable, light_overlay_icon = 'icons/obj/weapons/guns/flashlights.dmi', light_overlay = "flight") diff --git a/modular_skyrat/modules/tribal_extended/code/weapons/bow.dm b/modular_skyrat/modules/tribal_extended/code/weapons/bow.dm index 8bfac93c25f..665e7d27044 100644 --- a/modular_skyrat/modules/tribal_extended/code/weapons/bow.dm +++ b/modular_skyrat/modules/tribal_extended/code/weapons/bow.dm @@ -19,7 +19,9 @@ casing_ejector = FALSE internal_magazine = TRUE trigger_guard = TRIGGER_GUARD_ALLOW_ALL //so ashwalkers can use it - has_gun_safety = FALSE + +/obj/item/gun/ballistic/tribalbow/give_gun_safeties() + return /obj/item/gun/ballistic/tribalbow/shoot_with_empty_chamber() return diff --git a/tgstation.dme b/tgstation.dme index 024422e83b6..c7d84007b5e 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -5164,7 +5164,6 @@ #include "modular_skyrat\master_files\code\datums\ert.dm" #include "modular_skyrat\master_files\code\datums\outfits.dm" #include "modular_skyrat\master_files\code\datums\components\crafting.dm" -#include "modular_skyrat\master_files\code\datums\components\fullauto.dm" #include "modular_skyrat\master_files\code\datums\components\shielded_suit.dm" #include "modular_skyrat\master_files\code\datums\components\tippable.dm" #include "modular_skyrat\master_files\code\datums\id_trim\jobs.dm" @@ -5336,10 +5335,6 @@ #include "modular_skyrat\master_files\code\modules\power\singularity\containment_field.dm" #include "modular_skyrat\master_files\code\modules\projectiles\boxes_magazines\external\shotgun.dm" #include "modular_skyrat\master_files\code\modules\projectiles\boxes_magazines\external\smg.dm" -#include "modular_skyrat\master_files\code\modules\projectiles\guns\ballistic.dm" -#include "modular_skyrat\master_files\code\modules\projectiles\guns\gun.dm" -#include "modular_skyrat\master_files\code\modules\projectiles\guns\ballistic\automatic.dm" -#include "modular_skyrat\master_files\code\modules\projectiles\guns\ballistic\revolver.dm" #include "modular_skyrat\master_files\code\modules\reagents\bottle.dm" #include "modular_skyrat\master_files\code\modules\reagents\reagent_containers.dm" #include "modular_skyrat\master_files\code\modules\reagents\chemistry\colors.dm" @@ -5637,7 +5632,6 @@ #include "modular_skyrat\modules\company_imports\code\armament_component.dm" #include "modular_skyrat\modules\company_imports\code\company_datums.dm" #include "modular_skyrat\modules\company_imports\code\company_subsystem.dm" -#include "modular_skyrat\modules\company_imports\code\gun_companies.dm" #include "modular_skyrat\modules\company_imports\code\armament_datums\bolt_nanotrasen_firearms.dm" #include "modular_skyrat\modules\company_imports\code\armament_datums\deforest_medical.dm" #include "modular_skyrat\modules\company_imports\code\armament_datums\jarnsmiour.dm" @@ -5974,12 +5968,13 @@ #include "modular_skyrat\modules\goofsec\code\hud.dm" #include "modular_skyrat\modules\goofsec\code\sec_clothing_overrides.dm" #include "modular_skyrat\modules\goofsec\code\sol_fed.dm" +#include "modular_skyrat\modules\gun_safety\code\safety_additions.dm" +#include "modular_skyrat\modules\gun_safety\code\safety_component.dm" #include "modular_skyrat\modules\gunhud\code\gun_hud.dm" #include "modular_skyrat\modules\gunhud\code\gun_hud_component.dm" #include "modular_skyrat\modules\gunpoint\code\gunpoint.dm" #include "modular_skyrat\modules\gunpoint\code\gunpoint_datum.dm" #include "modular_skyrat\modules\gunpoint\code\gunpoint_radial.dm" -#include "modular_skyrat\modules\gunsafety\code\gun_safety.dm" #include "modular_skyrat\modules\gunsgalore\code\projectile.dm" #include "modular_skyrat\modules\gunsgalore\code\ammo\ammo.dm" #include "modular_skyrat\modules\gunsgalore\code\guns\akm.dm" @@ -6087,6 +6082,8 @@ #include "modular_skyrat\modules\lorecaster\code\archive_viewer.dm" #include "modular_skyrat\modules\lorecaster\code\config.dm" #include "modular_skyrat\modules\lorecaster\code\subsystem.dm" +#include "modular_skyrat\modules\manufacturer_examine\code\gun_company_additions.dm" +#include "modular_skyrat\modules\manufacturer_examine\code\manufacturer_component.dm" #include "modular_skyrat\modules\mapping\code\airless.dm" #include "modular_skyrat\modules\mapping\code\color.dm" #include "modular_skyrat\modules\mapping\code\doors.dm" @@ -6383,6 +6380,7 @@ #include "modular_skyrat\modules\moretraitoritems\code\glue.dm" #include "modular_skyrat\modules\moretraitoritems\code\headset.dm" #include "modular_skyrat\modules\moretraitoritems\code\mafioso.dm" +#include "modular_skyrat\modules\moretraitoritems\code\ocelot_revolver.dm" #include "modular_skyrat\modules\moretraitoritems\code\smuggling_gear.dm" #include "modular_skyrat\modules\moretraitoritems\code\spawnergrenade.dm" #include "modular_skyrat\modules\moretraitoritems\code\syndicate_loadout.dm"