From 38f8f57f0d0f10c01bd4f6a93b49169180cdcee5 Mon Sep 17 00:00:00 2001 From: xTrainx Date: Tue, 4 Jun 2024 02:26:22 -0400 Subject: [PATCH] Port vehicle changes (#187) --- code/__HELPERS/icon_smoothing.dm | 1 + code/_onclick/drag_drop.dm | 12 +- code/controllers/subsystem/jukeboxes.dm | 13 +- code/controllers/subsystem/throwing.dm | 9 +- .../crafting/recipes/recipes_tools.dm | 24 ++ .../recipes/recipes_weapon_and_ammo.dm | 46 ++++ code/game/mecha/equipment/tools/work_tools.dm | 217 ++++++++++++++++++ .../mecha/equipment/weapons/mecha_ammo.dm | 7 + code/game/mecha/equipment/weapons/weapons.dm | 166 ++++++++++++++ code/game/sound.dm | 3 + code/modules/keybindings/keybind/carbon.dm | 36 +++ code/modules/mob/inventory.dm | 2 + code/modules/mob/living/living.dm | 71 +++++- code/modules/mob/mob.dm | 2 +- code/modules/projectiles/projectile.dm | 5 + icons/mecha/mecha_equipment.dmi | Bin 18986 -> 20493 bytes 16 files changed, 608 insertions(+), 6 deletions(-) diff --git a/code/__HELPERS/icon_smoothing.dm b/code/__HELPERS/icon_smoothing.dm index 5db8ea4c612..20aa9e00036 100644 --- a/code/__HELPERS/icon_smoothing.dm +++ b/code/__HELPERS/icon_smoothing.dm @@ -422,6 +422,7 @@ /atom var/icon_type_smooth var/junction + var/bypass_interactions = FALSE /atom/proc/recalculate_junction() junction = 0 diff --git a/code/_onclick/drag_drop.dm b/code/_onclick/drag_drop.dm index 05a9ba6a7c7..0eae9aca64d 100644 --- a/code/_onclick/drag_drop.dm +++ b/code/_onclick/drag_drop.dm @@ -65,8 +65,18 @@ GLOBAL_VAR_INIT(use_experimental_clickdrag_thing, TRUE) if(!object.IsAutoclickable()) return var/obj/item/h = get_active_held_item() - if(h) + if(istype(loc, /obj/mecha)) + var/obj/mecha/piloting = loc + if(piloting.selected && istype(piloting.selected, /obj/item/mecha_parts/mecha_equipment/weapon)) + var/obj/item/mecha_parts/mecha_equipment/weapon/selectedweapon = piloting.selected + . = selectedweapon.is_automatic + else if(h) . = h.CanItemAutoclick(object, location, params) + if(istype(loc, /obj/mecha)) + var/obj/mecha/piloting = loc + if(piloting.selected && istype(piloting.selected, /obj/item/mecha_parts/mecha_equipment/weapon)) + var/obj/item/mecha_parts/mecha_equipment/weapon/selectedweapon = piloting.selected + . = selectedweapon.is_automatic /mob/proc/canMobMousedown(atom/object, location, params) diff --git a/code/controllers/subsystem/jukeboxes.dm b/code/controllers/subsystem/jukeboxes.dm index db1e2d19e4a..aae9b1f0105 100644 --- a/code/controllers/subsystem/jukeboxes.dm +++ b/code/controllers/subsystem/jukeboxes.dm @@ -106,9 +106,18 @@ SUBSYSTEM_DEF(jukeboxes) if(!(M.client.prefs.toggles & SOUND_INSTRUMENTS) || !M.can_hear()) M.stop_sound_channel(jukeinfo[2]) continue - - if(jukebox.z == M.z) //todo - expand this to work with mining planet z-levels when robust jukebox audio gets merged to master + var/turf/juketurf = get_turf(jukebox) + var/turf/mturf = get_turf(M) + if(juketurf.z == mturf.z) //todo - expand this to work with mining planet z-levels when robust jukebox audio gets merged to master song_played.status = SOUND_UPDATE + else if(juketurf.z == mturf.z -1) + var/turf/juketurf_above = SSmapping.get_turf_above(juketurf) + if(istype(juketurf_above, /turf/open/transparent)) + song_played.status = SOUND_UPDATE + else if(juketurf.z == mturf.z +1) + var/turf/mturf_above = SSmapping.get_turf_above(mturf) + if(istype(mturf_above, /turf/open/transparent) || istype(juketurf,/turf/open/transparent)) + song_played.status = SOUND_UPDATE else song_played.status = SOUND_MUTE | SOUND_UPDATE //Setting volume = 0 doesn't let the sound properties update at all, which is lame. diff --git a/code/controllers/subsystem/throwing.dm b/code/controllers/subsystem/throwing.dm index 9798b513ca9..87e6f68bbb0 100644 --- a/code/controllers/subsystem/throwing.dm +++ b/code/controllers/subsystem/throwing.dm @@ -147,7 +147,14 @@ SUBSYSTEM_DEF(throwing) if (obstacle == actual_target || (obstacle.density && !(obstacle.flags_1 & ON_BORDER_1))) finalize(TRUE, obstacle) return - + var/turf/starting_turf = get_turf(AM) + if(AM.z < target_turf.z) + var/turf/new_turf = SSmapping.get_turf_above(starting_turf) + AM.forceMove(new_turf) + if(starting_turf.z > target_turf.z) + var/turf/new_turf = SSmapping.get_turf_below(starting_turf) + AM.forceMove(new_turf) + var/atom/step last_move = world.time diff --git a/code/datums/components/crafting/recipes/recipes_tools.dm b/code/datums/components/crafting/recipes/recipes_tools.dm index 99b72a1febd..110448fb210 100644 --- a/code/datums/components/crafting/recipes/recipes_tools.dm +++ b/code/datums/components/crafting/recipes/recipes_tools.dm @@ -130,3 +130,27 @@ /obj/item/stack/rods = 2) category = CAT_CRAFTING subcategory = CAT_TOOL + +/datum/crafting_recipe/cellupgrade + name = "High cell to Ultra cell convertion" + result = /obj/item/stock_parts/cell/bluespace + time = 80 + reqs = list(/obj/item/stock_parts/cell/high = 4, + /obj/item/stack/cable_coil = 10, + /obj/item/toy/crayon/spraycan = 1) + tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) + category = CAT_CRAFTING + subcategory = CAT_TOOL + +/datum/crafting_recipe/carpart/stereo + name = "Mounted Stereo" + result = /obj/item/mecha_parts/mecha_equipment/stereo + reqs = list(/obj/item/stack/sheet/metal = 5, + /obj/item/stack/crafting/metalparts = 10, + /obj/item/circuitboard/machine/jukebox = 1, + /obj/item/stack/rods = 5) + tools = list(TOOL_WORKBENCH) + time = 90 + category = CAT_VEHICLES + subcategory = CAT_VEHICLEPARTS + diff --git a/code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm b/code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm index cafcfd35d4c..072bf2ecd21 100644 --- a/code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm +++ b/code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm @@ -681,6 +681,52 @@ category = CAT_WEAPONRY subcategory = CAT_WEAPON +/*/datum/crafting_recipe/gun/minigunVehicle + name = "Minigun" + result = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/minigun + reqs = list(/obj/item/stack/crafting/metalparts = 10, + /obj/item/stack/crafting/goodparts = 5, + /obj/item/stack/crafting/electronicparts = 5, + /obj/item/stack/sheet/metal = 10, + /obj/item/stack/sheet/mineral/titanium = 20, + /obj/item/stack/rods = 6, + /obj/item/advanced_crafting_components/assembly = 1, + /obj/item/advanced_crafting_components/receiver = 1, + /obj/item/advanced_crafting_components/alloys = 1) + tools = list(TOOL_WORKBENCH) + time = 180 + category = CAT_WEAPONRY + subcategory = CAT_WEAPON*/ + +/datum/crafting_recipe/gun/PheumonicLauncherVehicle + name = "Mounted Pheumonic launcher" + result = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/anykind + reqs = list(/obj/item/stack/crafting/metalparts = 20, + /obj/item/stack/crafting/goodparts = 10, + /obj/item/stack/crafting/electronicparts = 5, + /obj/item/stack/sheet/metal = 30, + /obj/item/stack/sheet/mineral/titanium = 20, + /obj/item/stack/rods = 8, + /obj/item/advanced_crafting_components/assembly = 1, + /obj/item/advanced_crafting_components/receiver = 1) + tools = list(TOOL_WORKBENCH) + time = 180 + category = CAT_WEAPONRY + subcategory = CAT_WEAPON + +/*/datum/crafting_recipe/mech_ammo/brm8_missiles + name = "Minigun Ammo Pack" + result = /obj/item/mecha_ammo/minigun + reqs = list(/obj/item/ammo_box/magazine/ammobelt/m1919 = 3, + /obj/item/stack/sheet/metal = 10, + /obj/item/stack/sheet/mineral/titanium = 20, + /obj/item/stack/crafting/powder = 30) + tools = list(TOOL_WORKBENCH) + time = 180 + category = CAT_WEAPONRY + subcategory = CAT_AMMO*/ + + /datum/crafting_recipe/gun/HMGvehicle name = "Improvised HMG (for vehicles)" result = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg/hobo diff --git a/code/game/mecha/equipment/tools/work_tools.dm b/code/game/mecha/equipment/tools/work_tools.dm index b7dc7d07eb9..a8b913fe805 100644 --- a/code/game/mecha/equipment/tools/work_tools.dm +++ b/code/game/mecha/equipment/tools/work_tools.dm @@ -479,3 +479,220 @@ //NC.mergeConnectedNetworksOnTurf() last_piece = NC return 1 + + +/obj/item/mecha_parts/mecha_equipment/stereo + name = "exosuit Stereo System" + desc = "a stereo system hooked up a jukebox, modified for easy transport." + icon_state = "mecha_stereo" + range = MELEE + var/active = FALSE + var/list/rangers = list() + var/stop = 0 + var/volume = 70 + var/datum/track/selection = null + var/open_tray = TRUE + var/list/obj/item/record_disk/record_disks = list() + var/obj/item/record_disk/selected_disk = null + +/obj/item/mecha_parts/mecha_equipment/stereo/attach(obj/mecha/M) + . = ..() + bypass_interactions = TRUE + +/obj/item/mecha_parts/mecha_equipment/stereo/detach(obj/mecha/M) + . = ..() + bypass_interactions = FALSE + +/obj/item/mecha_parts/mecha_equipment/stereo/attackby(obj/item/O, mob/user, params) + . = ..() + if(!active) + if(istype(O, /obj/item/record_disk)) //this one checks for a record disk and if the jukebox is open, it adds it to the machine + if(open_tray == FALSE) + to_chat(usr, "The Disk Tray is not open!") + return + var/obj/item/record_disk/I = O + if(!I.R.song_associated_id) + to_chat(user, span_warning("This record is empty!")) + return + for(var/datum/track/RT in SSjukeboxes.songs) + if(I.R.song_associated_id == RT.song_associated_id) + to_chat(user, span_warning("this track is already added to the jukebox!")) + return + record_disks += I + O.forceMove(src) + playsound(src, 'sound/effects/plastic_click.ogg', 100, 0) + if(I.R.song_path) + SSjukeboxes.add_song(I.R) + return + +/obj/item/mecha_parts/mecha_equipment/stereo/proc/eject_record(obj/item/record_disk/M) //BIG IRON EDIT -start- ejects a record as defined and removes it's song from the list + if(!M) + visible_message("no disk to eject") + return + playsound(src, 'sound/effects/disk_tray.ogg', 100, 0) + src.visible_message(" ejected the [selected_disk] from the [src]!") + M.forceMove(get_turf(src)) + SSjukeboxes.remove_song(M.R) + record_disks -= M + selected_disk = null + +/obj/item/mecha_parts/mecha_equipment/stereo/ui_status(mob/user) + if(!SSjukeboxes.songs.len && !isobserver(user)) + to_chat(user,"Error: No music tracks have been authorized for your station. Petition Central Command to resolve this issue.") + playsound(src, 'sound/misc/compiler-failure.ogg', 25, TRUE) + return UI_CLOSE + return ..() + +/obj/item/mecha_parts/mecha_equipment/stereo/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "Jukebox", name) + ui.open() + +/obj/item/mecha_parts/mecha_equipment/stereo/ui_data(mob/user) + var/list/data = list() + data["active"] = active + data["songs"] = list() + for(var/datum/track/S in SSjukeboxes.songs) + var/list/track_data = list( + name = S.song_name + ) + data["songs"] += list(track_data) + data["track_selected"] = null + data["track_length"] = null + data["track_beat"] = null + data["disks"] = list() + for(var/obj/item/record_disk/RD in record_disks) + var/list/tracks_data = list( + name = RD.name + ) + data["disks"] += list(tracks_data) + data["disk_selected"] = null //BIG IRON EDIT- start more tracks data + data["disk_selected_lenght"] = null + data["disk_beat"] = null //BIG IRON EDIT -end + if(selection) + data["track_selected"] = selection.song_name + data["track_length"] = DisplayTimeText(selection.song_length) + data["track_beat"] = selection.song_beat + if(selected_disk) + data["disk_selected"] = selected_disk + data["disk_selected_length"] = DisplayTimeText(selected_disk.R.song_length) + data["disk_selected_beat"] = selected_disk.R.song_beat + data["volume"] = volume + return data + +/obj/item/mecha_parts/mecha_equipment/stereo/ui_act(action, list/params) + . = ..() + if(.) + return + + switch(action) + if("toggle") + if(QDELETED(src)) + return + if(!active) + if(stop > world.time) + to_chat(usr, "Error: The device is still resetting from the last activation, it will be ready again in [DisplayTimeText(stop-world.time)].") + playsound(src, 'sound/misc/compiler-failure.ogg', 50, TRUE) + return + activate_music() + START_PROCESSING(SSobj, src) + return TRUE + else + stop = 0 + return TRUE + if("select_track") + if(active) + to_chat(usr, "Error: You cannot change the song until the current one is over.") + return + var/list/available = list() + for(var/datum/track/S in SSjukeboxes.songs) + available[S.song_name] = S + var/selected = params["track"] + if(QDELETED(src) || !selected || !istype(available[selected], /datum/track)) + return + selection = available[selected] + return TRUE + if("select_record") + if(!record_disks.len) + to_chat(usr, "Error: no tracks on the bin!.") + return + var/list/obj/item/record_disk/availabledisks = list() + for(var/obj/item/record_disk/RR in record_disks) + availabledisks[RR.name] = RR + var/selecteddisk = params["record"] + if(QDELETED(src) || !selecteddisk) + return + selected_disk = availabledisks[selecteddisk] + updateUsrDialog() + if("eject_disk") // sanity check for the disk ejection + if(!record_disks.len) + to_chat(usr, "Error: no disks in trays.") + return + if(!selected_disk) + to_chat(usr,"Error: no disk chosen." ) + return + if(selection == selected_disk.R) + selection = null + eject_record(selected_disk) + return TRUE + if("set_volume") + var/new_volume = params["volume"] + if(new_volume == "reset") + volume = initial(volume) + return TRUE + else if(new_volume == "min") + volume = 0 + return TRUE + else if(new_volume == "max") + volume = 100 + return TRUE + else if(text2num(new_volume) != null) + volume = text2num(new_volume) + return TRUE + +/obj/item/mecha_parts/mecha_equipment/stereo/proc/activate_music() + if(!selection) + visible_message("Track is no longer avaible") + return + var/jukeboxslottotake = SSjukeboxes.addjukebox(src, selection, 2) + if(jukeboxslottotake) + active = TRUE + update_icon() + START_PROCESSING(SSobj, src) + stop = world.time + selection.song_length + return TRUE + else + return FALSE + +/obj/item/mecha_parts/mecha_equipment/stereo/get_equip_info() + var/output = ..() + if(output) + var/temp = "" + temp = "Dashboard" + return "[output] [temp]" + return + +/obj/item/mecha_parts/mecha_equipment/stereo/Topic(href,href_list) + ..() + if(href_list["dashboard"]) + var/mob/user = chassis.occupant + ui_interact(user) + return + +/obj/item/mecha_parts/mecha_equipment/stereo/process() + if(active && world.time >= stop) + active = FALSE + dance_over() + playsound(src,'sound/machines/terminal_off.ogg',50,1) + update_icon() + stop = world.time + 100 + +/obj/item/mecha_parts/mecha_equipment/stereo/proc/dance_over() + var/position = SSjukeboxes.findjukeboxindex(src) + if(!position) + return + SSjukeboxes.removejukebox(position) + STOP_PROCESSING(SSobj, src) + rangers = list() + diff --git a/code/game/mecha/equipment/weapons/mecha_ammo.dm b/code/game/mecha/equipment/weapons/mecha_ammo.dm index f5844ec5e61..3128e8f912f 100644 --- a/code/game/mecha/equipment/weapons/mecha_ammo.dm +++ b/code/game/mecha/equipment/weapons/mecha_ammo.dm @@ -99,3 +99,10 @@ round_term = "cluster" direct_load = TRUE ammo_type = "clusterbang" + +/obj/item/mecha_ammo/minigun + name = "Minigun ammo pack" + desc = "A box of high caliber ammo, ready to be consumed in nano seconds. Cannot be primed by hand." + icon_state = "lmg" + rounds = 600 + ammo_type = "minigun" diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index 5865e2f3b7f..f7b91b53f0b 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -268,6 +268,7 @@ projectiles_cache = 300 projectiles_cache_max = 1200 projectiles_per_shot = 3 + is_automatic = TRUE variance = 6 randomspread = 1 projectile_delay = 2 @@ -308,6 +309,88 @@ harmful = TRUE ammo_type = "lmg" +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/minigun + name = "\improper Minigun" + desc = "A heavy machine gun capable of rapidly firing 7.62mm rounds. ready for vehicle mounting, with internal ammo box." + icon_state = "mecha_uac2" + fire_sound = 'sound/f13weapons/antimaterielfire.ogg' + equip_cooldown = 1 + projectile = /obj/item/projectile/bullet/a762 + projectiles = 300 + projectiles_cache = 300 + projectiles_cache_max = 600 + projectiles_per_shot = 1 + variance = 6 + is_automatic = TRUE + randomspread = 112 + harmful = TRUE + ammo_type = "minigun" + var/overheat = 0 + var/overheat_max = 160 + var/heat_diffusion = 2.5 //How much heat is lost per tick + var/damage = 25 + + + +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/minigun/Initialize() + . = ..() + START_PROCESSING(SSobj, src) + +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/minigun/Destroy() + STOP_PROCESSING(SSobj, src) + return ..() + +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/minigun/process() + overheat = max(0, overheat - heat_diffusion) + +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/minigun/action(atom/target, params) + if(!action_checks(target)) + return 0 + var/turf/curloc = get_turf(chassis) + var/turf/targloc = get_turf(target) + if (!targloc || !istype(targloc) || !curloc) + return 0 + if (targloc == curloc) + return 0 + if(overheat < overheat_max) + overheat += projectiles_per_shot + else + chassis.occupant_message("The gun's heat sensor locked the trigger to prevent barrel damage.") + return + chassis.occupant.DelayNextAction(3) + set_ready_state(0) + for(var/i=1 to get_shot_amount()) + var/obj/item/projectile/A = new projectile(curloc) + A.firer = chassis.occupant + A.original = target + A.damage = damage + if(!A.suppressed && firing_effect_type) + new firing_effect_type(get_turf(src), chassis.dir) + + var/spread = 0 + if(variance) + if(randomspread) + spread = round((rand() - 0.5) * variance) + else + spread = round((i / projectiles_per_shot - 0.5) * variance) + A.preparePixelProjectile(target, chassis.occupant, params, spread) + + A.fire() + overheat++ + projectiles-- + playsound(chassis, fire_sound, 50, 1) + chassis.occupant.DelayNextAction(1) + + if(kickback) + chassis.newtonian_move(turn(chassis.dir,180)) + + return 1 + + + + + + /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack name = "\improper SRM-8 missile rack" desc = "A weapon for combat exosuits. Launches light explosive missiles." @@ -356,6 +439,89 @@ /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/proc/proj_init(obj/O) return +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/anykind + name = "\improper Pheumonic launcher" + desc = "A weapon for combat exosuits. anything loaded in it." + icon_state = "mecha_grenadelnchr" + projectile = null + fire_sound = 'sound/weapons/grenadelaunch.ogg' + projectiles = 0 + projectiles_cache = 15 + projectiles_cache_max = 20 + missile_speed = 1.5 + equip_cooldown = 10 + var/det_time = 20 + ammo_type = "Anything" + var/list/obj/stuffs = new + var/open = FALSE + +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/anykind/action(target) + if(!action_checks(target)) + return + if(!stuffs.len) + chassis.occupant_message("Nothing to shoot!") + return + var/obj/O = stuffs[1] + playsound(chassis, fire_sound, 50, 1) + mecha_log_message("Launched a [O.name] from [name], targeting [target].") + stuffs -= stuffs[1] + proj_init(O) + var/turf/nextt = (get_turf(src)) + O.forceMove(nextt) + O.throw_at(target, missile_range, missile_speed, chassis.occupant, FALSE, diagonals_first = diags_first) + return 1 + +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/anykind/proj_init(obj/ammo) + var/turf/T = get_turf(src) + message_admins("[ADMIN_LOOKUPFLW(chassis.occupant)] fired a [src] in [ADMIN_VERBOSEJMP(T)]") + log_game("[key_name(chassis.occupant)] fired a [src] in [AREACOORD(T)]") + if(istype(ammo, /obj/item/grenade/)) + var/obj/item/grenade/payload = ammo + addtimer(CALLBACK(payload, TYPE_PROC_REF(/obj/item/grenade, prime)), det_time) + +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/anykind/attackby(obj/item/W, mob/user, params) + if(open) + if(stuffs.len < projectiles_cache_max) + W.forceMove(src) + stuffs += W + projectiles++ + else + to_chat(user, "The [src] is full!") + return + . = ..() + +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/anykind/screwdriver_act(mob/living/carbon/user, obj/item/I) + if(user.a_intent != INTENT_DISARM) + if(open) + to_chat(user, "You close the [src]!.") + else + to_chat(user, "You open the [src]!.") + open = !open + return TRUE + . = ..() + +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/anykind/attack_self(mob/user) + if(open && stuffs.len) + var/obj/selectedthing = input(user, "Chosee an item to take out.", "Stuffs inside") as null|anything in stuffs + if(!selectedthing) + return + stuffs -= selectedthing + projectiles-- + selectedthing.forceMove(get_turf(src)) + user.put_in_hand(selectedthing) + return + . = ..() + +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/anykind/AltClick(mob/user) + if(open && stuffs.len) + for(var/obj/I in stuffs) + I.forceMove(get_turf(src)) + stuffs -= I + projectiles-- + to_chat(user, "You empty the [src]!.") + return + . = ..() + /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/flashbang name = "\improper SGL-6 grenade launcher" diff --git a/code/game/sound.dm b/code/game/sound.dm index 98466a6e6ce..095da3cc606 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -43,6 +43,9 @@ if(below_turf && istransparentturf(turf_source)) listeners += hearers(maxdistance,below_turf) + if(ismecha(source)) + var/obj/mecha/mechasound = source + listeners += mechasound?.occupant else if(above_turf && istransparentturf(above_turf)) diff --git a/code/modules/keybindings/keybind/carbon.dm b/code/modules/keybindings/keybind/carbon.dm index bd0e073826d..e7c736c4193 100644 --- a/code/modules/keybindings/keybind/carbon.dm +++ b/code/modules/keybindings/keybind/carbon.dm @@ -72,3 +72,39 @@ var/mob/living/carbon/C = user.mob C.do_wield() return TRUE + +/datum/keybinding/carbon/lookup + hotkey_keys = list(",") + name = "Look_up" + full_name = "Look up" + description = "looks up" + category = CATEGORY_CARBON + +/datum/keybinding/carbon/lookup/down(client/user) + var/mob/living/carbon/C = user.mob + C.lookup() + return TRUE + +/datum/keybinding/carbon/lookdown + hotkey_keys = list(".") + name = "Look_down" + full_name = "looks down" + description = "looks down your feet" + category = CATEGORY_CARBON + +/datum/keybinding/carbon/lookdown/down(client/user) + var/mob/living/carbon/C = user.mob + C.lookdown() + return TRUE + +/datum/keybinding/carbon/lookstop + hotkey_keys = list("-") + name = "Look_stop" + full_name = "stop looking" + description = "stop looking around and see foward" + category = CATEGORY_CARBON + +/datum/keybinding/carbon/lookstop/down(client/user) + var/mob/living/carbon/C = user.mob + C.stop_looking() + return TRUE diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 3692d46be44..5e888b9fe61 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -329,6 +329,8 @@ if(!no_move && !(I.item_flags & DROPDEL)) //item may be moved/qdel'd immedietely, don't bother moving it if (isnull(newloc)) I.moveToNullspace() + if(ismecha(loc)) + I.forceMove(loc) else I.forceMove(newloc) on_item_dropped(I) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index f5cb6cff257..becd3945fbf 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -432,6 +432,9 @@ set category = "IC" if(src.incapacitated()) to_chat(src, span_warning("You can't look up right now!")) + if(client.eye != src && !istype(client.eye, /obj/mecha)) + stop_looking() + return var/turf/T = SSmapping.get_turf_above(get_turf(src)) if(!istype(T, /turf/open/transparent/openspace)) if(istype(T, /turf/open) || istype(T, /turf/closed)) @@ -440,16 +443,82 @@ else src.reset_perspective(T) RegisterSignal(src, COMSIG_MOB_CLIENT_CHANGE_VIEW, PROC_REF(stop_looking_up)) //no binos/scops - RegisterSignal(src, COMSIG_MOVABLE_MOVED, PROC_REF(stop_looking_up)) + RegisterSignal(src, COMSIG_MOVABLE_MOVED,PROC_REF(followcameraup)) + if(istype(loc, /obj/mecha)) + RegisterSignal(loc, COMSIG_MOVABLE_MOVED,PROC_REF(followcameraup)) RegisterSignal(src, COMSIG_LIVING_STATUS_KNOCKDOWN, PROC_REF(stop_looking_up)) RegisterSignal(src, COMSIG_LIVING_STATUS_PARALYZE, PROC_REF(stop_looking_up)) RegisterSignal(src, COMSIG_LIVING_STATUS_UNCONSCIOUS, PROC_REF(stop_looking_up)) RegisterSignal(src, COMSIG_LIVING_STATUS_SLEEP, PROC_REF(stop_looking_up)) +/mob/living/verb/stop_looking() + set name = "Stop Looking" + set category = "IC" + src.stop_looking_up(null) + /mob/living/proc/stop_looking_up() + if(istype(loc, /obj/mecha)) + UnregisterSignal(loc, COMSIG_MOVABLE_MOVED) reset_perspective(null) UnregisterSignal(src, list(COMSIG_LIVING_STATUS_PARALYZE, COMSIG_LIVING_STATUS_UNCONSCIOUS, COMSIG_LIVING_STATUS_SLEEP, COMSIG_LIVING_STATUS_KNOCKDOWN, COMSIG_MOVABLE_MOVED, COMSIG_MOB_CLIENT_CHANGE_VIEW)) +/mob/living/verb/lookdown() + set name = "Look down" + set category = "IC" + if(src.incapacitated()) + to_chat(src, "You can't look down right now!") + if(client.eye != src && !istype(client.eye, /obj/mecha)) + stop_looking() + return + var/turf/T = get_turf(src) + if(!istype(T, /turf/open/transparent/openspace)) + var/turf/nt = get_step(T, dir) + if(!istype(nt, /turf/open/transparent/openspace)) + if(istype(nt, /turf/open) || istype(nt, /turf/closed)) + to_chat(src, "You look up at the floor. You can see floor.") + return + else + var/turf/nl = SSmapping.get_turf_below(nt) + src.reset_perspective(nl) + RegisterSignal(src, COMSIG_MOB_CLIENT_CHANGE_VIEW,PROC_REF(stop_looking_down)) //no binos/scops + RegisterSignal(src, COMSIG_MOVABLE_MOVED,PROC_REF(followcameradown)) + if(istype(loc, /obj/mecha)) + RegisterSignal(loc, COMSIG_MOVABLE_MOVED,PROC_REF(followcameradown)) + RegisterSignal(src, COMSIG_LIVING_STATUS_KNOCKDOWN,PROC_REF(stop_looking_down)) + RegisterSignal(src, COMSIG_LIVING_STATUS_PARALYZE,PROC_REF(stop_looking_down)) + RegisterSignal(src, COMSIG_LIVING_STATUS_UNCONSCIOUS,PROC_REF(stop_looking_down)) + RegisterSignal(src, COMSIG_LIVING_STATUS_SLEEP,PROC_REF(stop_looking_down)) + else + var/turf/nl = SSmapping.get_turf_below(T) + src.reset_perspective(nl) + RegisterSignal(src, COMSIG_MOB_CLIENT_CHANGE_VIEW,PROC_REF(stop_looking_down)) //no binos/scops + RegisterSignal(src, COMSIG_MOVABLE_MOVED,PROC_REF(followcameradown)) + if(istype(loc, /obj/mecha)) + RegisterSignal(loc, COMSIG_MOVABLE_MOVED,PROC_REF(followcameradown)) + RegisterSignal(src, COMSIG_LIVING_STATUS_KNOCKDOWN,PROC_REF(stop_looking_down)) + RegisterSignal(src, COMSIG_LIVING_STATUS_PARALYZE,PROC_REF(stop_looking_down)) + RegisterSignal(src, COMSIG_LIVING_STATUS_UNCONSCIOUS,PROC_REF(stop_looking_down)) + RegisterSignal(src, COMSIG_LIVING_STATUS_SLEEP,PROC_REF(stop_looking_down)) + +/mob/living/proc/stop_looking_down() + reset_perspective(null) + UnregisterSignal(src, list(COMSIG_LIVING_STATUS_PARALYZE, COMSIG_LIVING_STATUS_UNCONSCIOUS, COMSIG_LIVING_STATUS_SLEEP, COMSIG_LIVING_STATUS_KNOCKDOWN, COMSIG_MOVABLE_MOVED, COMSIG_MOB_CLIENT_CHANGE_VIEW)) + +/mob/living/proc/followcameraup() + var/turf/T = get_turf(src) + var/turf/nl = SSmapping.get_turf_above(T) + if(istype(nl, /turf/open/transparent/openspace)) + reset_perspective(nl) + else + reset_perspective(null) + +/mob/living/proc/followcameradown() + var/turf/T = get_turf(src) + var/turf/nl = SSmapping.get_turf_below(T) + if(istype(T, /turf/open/transparent/openspace)) + reset_perspective(nl) + else + reset_perspective(null) /mob/living/incapacitated(ignore_restraints = FALSE, ignore_grab = FALSE, check_immobilized = FALSE) if(stat || IsUnconscious() || IsStun() || IsParalyzed() || (combat_flags & COMBAT_FLAG_HARD_STAMCRIT) || (check_immobilized && IsImmobilized()) || (!ignore_restraints && restrained(ignore_grab))) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 52e8c0fa40b..087cde342a0 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -898,7 +898,7 @@ GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0) //Can the mob interact() with an atom? /mob/proc/can_interact_with(atom/A) - return IsAdminGhost(src) || Adjacent(A) || A.hasSiliconAccessInArea(src) + return IsAdminGhost(src) || Adjacent(A) || A.hasSiliconAccessInArea(src) || A.bypass_interactions //Can the mob use Topic to interact with machines /mob/proc/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE, no_tk=FALSE) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 62729a2835f..41a6ce0b5ea 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -562,6 +562,11 @@ if(spread_override) setAngle(Angle + rand(-spread_override, spread_override)) var/turf/starting = get_turf(src) + if(original) + if(starting.z > original?.z) + starting = SSmapping.get_turf_below(starting) + if(starting.z < original?.z) + starting = SSmapping.get_turf_above(starting) if(isnull(Angle)) //Try to resolve through offsets if there's no angle set. if(isnull(xo) || isnull(yo)) stack_trace("WARNING: Projectile [type] deleted due to being unable to resolve a target after angle was null!") diff --git a/icons/mecha/mecha_equipment.dmi b/icons/mecha/mecha_equipment.dmi index 5e277af7cca24ff5dd27461498a83fda915123ff..90929fff46c4edca95c3ae85659d061a9044d519 100644 GIT binary patch literal 20493 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 (IAfF`yLDn;nVOh{ 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