5 Commits

Author SHA1 Message Date
chompstation-ci[bot]
50d9481fa2 Automatic changelog compile [ci skip] 2025-12-07 01:38:29 +00:00
chompstation-ci[bot]
3beef0f44a Automatic changelog for PR #12069 [ci skip] 2025-12-06 20:16:56 +00:00
FluffMedic
7e3b3aa8a9 Desert Planet Alterations (#12069) 2025-12-06 21:16:17 +01:00
chompstation-ci[bot]
f746678620 Automatic changelog for PR #12071 [ci skip] 2025-12-06 08:19:12 +00:00
CHOMPStation2StaffMirrorBot
f7de0bb70b [MIRROR] Start of TG Click Code Port (#12071)
Co-authored-by: Cameron Lennox <killer65311@gmail.com>
2025-12-06 03:18:32 -05:00
121 changed files with 10859 additions and 10106 deletions

View File

@@ -256,7 +256,7 @@ Thus, the two variables affect pump operation are set in New():
deconstruct()
//CHOMPEdit Start - Adds TGStation keybinds to save our engineers some time.
/obj/machinery/atmospherics/binary/pump/AltClick(mob/user)
/obj/machinery/atmospherics/binary/pump/click_alt(mob/user)
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
if(allowed(user))
to_chat(user, span_notice("You set the [name] to max output"))
@@ -265,7 +265,7 @@ Thus, the two variables affect pump operation are set in New():
else
to_chat(user, span_warning("Access denied."))
/obj/machinery/atmospherics/binary/pump/CtrlClick(mob/user)
/obj/machinery/atmospherics/binary/pump/click_ctrl(mob/user)
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
if(allowed(user))
update_use_power(!use_power)
@@ -301,4 +301,3 @@ Thus, the two variables affect pump operation are set in New():
icon_state = "off"
else
icon_state = "[use_power ? "on" : "off"]"

View File

@@ -303,7 +303,7 @@
return null
//CHOMPEdit Start - Keybinds for EVEEERYTHING
/obj/machinery/atmospherics/omni/CtrlClick(mob/user)
/obj/machinery/atmospherics/omni/click_ctrl(mob/user)
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
if(allowed(user))
update_use_power(!use_power)

View File

@@ -39,7 +39,7 @@ GLOBAL_LIST_EMPTY(shutoff_valves)
return TRUE
// Alt+Click now toggles the open/close function, when the autoseal is disabled
/obj/machinery/atmospherics/valve/shutoff/AltClick(var/mob/user)
/obj/machinery/atmospherics/valve/shutoff/click_alt(var/mob/user)
if(isliving(user))
if(close_on_leaks)
to_chat(user, "You try to manually [open ? "close" : "open"] the valve, but it [open ? "opens" : "closes"] automatically again.")

View File

@@ -248,7 +248,7 @@
return list(node1_connect, node2_connect, node3_connect)
//CHOMPEdit Start - Keybinds for EVEEERYTHING
/obj/machinery/atmospherics/trinary/CtrlClick(mob/user)
/obj/machinery/atmospherics/trinary/click_ctrl(mob/user)
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
if(allowed(user))
update_use_power(!use_power)

View File

@@ -200,7 +200,7 @@
"You hear a ratchet.")
deconstruct()
/obj/machinery/atmospherics/unary/outlet_injector/CtrlClick(mob/user)
/obj/machinery/atmospherics/unary/outlet_injector/click_ctrl(mob/user)
if (volume_rate == ATMOS_DEFAULT_VOLUME_PUMP + 500 || use_power == USE_POWER_OFF)
return ..()

View File

@@ -116,7 +116,7 @@
return FALSE
//CHOMPEdit Start - Keybinds for EVEEERYTHING* (* = not everything))
/obj/machinery/atmospherics/unary/CtrlClick(mob/user)
/obj/machinery/atmospherics/unary/click_ctrl(mob/user)
if((power_rating != null) && !(pipe_state in list("scrubber", "uvent", "injector"))) //TODO: Add compatibility with air alarm. When not disabled, overrides air alarm state and doesn't tell the air alarm that. Injectors have their own, different bind for enabling.
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
if(allowed(user))

View File

@@ -5,6 +5,8 @@
#define RIGHT_CLICK "right"
#define MIDDLE_CLICK "middle"
#define LEFT_CLICK "left"
#define BUTTON4 "xbutton1"
#define BUTTON5 "xbutton2"
///Mouse button that was just clicked/released
///if(modifiers[BUTTON] == LEFT_CLICK)

View File

@@ -1 +1,9 @@
#define TK_MAXRANGE 15
/// Action has succeeded, preventing further alt click interaction
#define CLICK_ACTION_SUCCESS (1<<0)
/// Action failed, preventing further alt click interaction
#define CLICK_ACTION_BLOCKING (1<<1)
/// Either return state
#define CLICK_ACTION_ANY (CLICK_ACTION_SUCCESS | CLICK_ACTION_BLOCKING)
/// Use NONE for continue interaction

View File

@@ -225,25 +225,6 @@
#define COMSIG_ENTER_AREA "enter_area"
///from base of area/Exited(): (/area)
#define COMSIG_EXIT_AREA "exit_area"
///from base of client/Click(): (atom/target, atom/location, control, params, mob/user)
#define COMSIG_CLIENT_CLICK "atom_client_click"
///from base of atom/Click(): (location, control, params, mob/user)
#define COMSIG_CLICK "atom_click"
///from base of atom/ShiftClick(): (/mob)
#define COMSIG_CLICK_SHIFT "shift_click"
#define COMPONENT_ALLOW_EXAMINATE (1<<0) //Allows the user to examinate regardless of client.eye.
///from base of atom/CtrlClickOn(): (/mob)
#define COMSIG_CLICK_CTRL "ctrl_click"
///from base of atom/AltClick(): (/mob)
#define COMSIG_CLICK_ALT "alt_click"
#define COMPONENT_CANCEL_CLICK_ALT (1<<0)
///from base of atom/CtrlShiftClick(/mob)
#define COMSIG_CLICK_CTRL_SHIFT "ctrl_shift_click"
///from base of atom/MouseDrop(): (/atom/over, /mob/user)
#define COMSIG_MOUSEDROP_ONTO "mousedrop_onto"
#define COMPONENT_NO_MOUSEDROP (1<<0)
///from base of atom/MouseDrop_T: (/atom/from, /mob/user)
#define COMSIG_MOUSEDROPPED_ONTO "mousedropped_onto"
///from base of atom/MouseDrop_T: do_after(mob/user, delay, atom/target, needhand, progress, incapacitation_flags, ignore_movement, max_distance, exclusive)
#define COMSIG_DO_AFTER_BEGAN "do_after_began"
@@ -332,13 +313,6 @@
#define COMSIG_MOB_DEATH "mob_death"
///from base of mob/set_stat(): (new_stat)
#define COMSIG_MOB_STATCHANGE "mob_statchange"
///from base of mob/clickon(): (atom/A, params)
#define COMSIG_MOB_CLICKON "mob_clickon"
///from base of mob/MiddleClickOn(): (atom/A)
#define COMSIG_MOB_MIDDLECLICKON "mob_middleclickon"
///from base of mob/AltClickOn(): (atom/A)
#define COMSIG_MOB_ALTCLICKON "mob_altclickon"
#define COMSIG_MOB_CANCEL_CLICKON (1<<0)
///from base of /obj/item/dice/proc/rollDice(mob/user as mob, var/silent = 0). Has the arguments of 'src, silent, result'
#define COMSIG_MOB_ROLLED_DICE "mob_rolled_dice" //can give a return value if we want it to make the dice roll a specific number!

View File

@@ -0,0 +1,32 @@
// mouse signals. Format:
// When the signal is called: (signal arguments)
// All signals send the source datum of the signal as the first argument
///from base of client/Click(): (atom/target, atom/location, control, params, mob/user)
#define COMSIG_CLIENT_CLICK "atom_client_click"
///from base of atom/Click(): (atom/location, control, params, mob/user)
#define COMSIG_CLICK "atom_click"
///from base of atom/ShiftClick(): (/mob)
#define COMSIG_CLICK_SHIFT "shift_click"
// #define COMSIG_MOB_CANCEL_CLICKON (1<<0) //shared with other forms of click, this is so you're aware it exists here too.
///from base of atom/ShiftClick()
#define COMSIG_SHIFT_CLICKED_ON "shift_clicked_on"
///from base of atom/click_ctrlOn(): (/mob)
#define COMSIG_CLICK_CTRL "ctrl_click"
///from base of atom/click_alt(): (/mob)
#define COMSIG_CLICK_ALT "alt_click"
///from base of atom/base_click_alt_secondary(): (/mob)
#define COMSIG_CLICK_ALT_SECONDARY "click_alt_secondary"
#define COMPONENT_CANCEL_CLICK_ALT_SECONDARY (1<<0)
///from base of atom/click_ctrl_shift(/mob)
#define COMSIG_CLICK_CTRL_SHIFT "ctrl_shift_click"
///from base of atom/MouseDrop(): (/atom/over, /mob/user)
#define COMSIG_MOUSEDROP_ONTO "mousedrop_onto"
#define COMPONENT_CANCEL_MOUSEDROP_ONTO (1<<0)
///from base of atom/handle_mouse_drop_receive: (/atom/from, /mob/user)
#define COMSIG_MOUSEDROPPED_ONTO "mousedropped_onto"
#define COMPONENT_CANCEL_MOUSEDROPPED_ONTO (1<<0)
///from base of mob/MouseWheelOn(): (/atom, delta_x, delta_y, params)
#define COMSIG_MOUSE_SCROLL_ON "mousescroll_on"
/// From /atom/movable/screen/click(): (atom/target, atom/location, control, params, mob/user)
#define COMSIG_SCREEN_ELEMENT_CLICK "screen_element_click"

View File

@@ -21,3 +21,17 @@
///from /datum/species/handle_fire. Called when the human is set on fire and burning clothes and stuff
#define COMSIG_HUMAN_BURNING "human_burning"
///from base of mob/clickon(): (atom/A, list/modifiers)
#define COMSIG_MOB_CLICKON "mob_clickon"
///from base of mob/MiddleClickOn(): (atom/A)
#define COMSIG_MOB_MIDDLECLICKON "mob_middleclickon"
///from base of mob/AltClickOn(): (atom/A)
#define COMSIG_MOB_ALTCLICKON "mob_altclickon"
#define COMSIG_MOB_CANCEL_CLICKON (1<<0)
///From base of /mob/base_click_ctrl: (atom/A)
#define COMSIG_MOB_CTRL_CLICKED "mob_ctrl_clicked"
///From base of /mob/base_click_ctrl_shift: (atom/A)
#define COMSIG_MOB_CTRL_SHIFT_CLICKED "mob_ctrl_shift_clicked"
///from base of mob/alt_click_on_secodary(): (atom/A)
#define COMSIG_MOB_ALTCLICKON_SECONDARY "mob_altclickon_secondary"

View File

@@ -13,7 +13,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
/// Climbable trait, given and taken by the climbable element when added or removed. Exists to be easily checked via HAS_TRAIT().
#define TRAIT_CLIMBABLE "trait_climbable"
/// Prevents the affected object from opening a loot window via alt click. See atom/AltClick()
/// Prevents the affected object from opening a loot window via alt click. See atom/click_alt()
#define TRAIT_ALT_CLICK_BLOCKER "no_alt_click"
/// Unlucky trait. Given by the 'unlucky' trait in character select. Checked by various things to cause unlucky interactions.

View File

@@ -100,8 +100,8 @@
return
..()
/mob/living/silicon/ai/CtrlClickOn(var/atom/A)
if(!control_disabled && A.AICtrlClick(src))
/mob/living/silicon/ai/CtrlClickOn(atom/A)
if(!control_disabled && A.ctrl_click_ai(src))
return
..()
@@ -120,7 +120,7 @@
I have no idea why it was in atoms.dm instead of respective files.
*/
/atom/proc/AICtrlShiftClick()
/atom/proc/AIclick_ctrl_shift()
return
/atom/proc/AIShiftClick()
@@ -131,26 +131,26 @@
user_toggle_open(user)
return 1
/atom/proc/AICtrlClick(mob/user)
/atom/proc/ctrl_click_ai(mob/user)
return
/obj/machinery/door/airlock/AICtrlClick(mob/user) // Bolts doors
/obj/machinery/door/airlock/ctrl_click_ai(mob/user) // Bolts doors
add_fingerprint(user)
toggle_bolt(user)
return 1
/obj/machinery/power/apc/AICtrlClick(mob/user) // turns off/on APCs.
/obj/machinery/power/apc/ctrl_click_ai(mob/user) // turns off/on APCs.
add_fingerprint(user)
toggle_breaker()
return 1
/obj/machinery/turretid/AICtrlClick() //turns off/on Turrets
/obj/machinery/turretid/ctrl_click_ai() //turns off/on Turrets
enabled = !enabled
updateTurrets()
return TRUE
/atom/proc/AIAltClick(var/atom/A)
return AltClick(A)
return click_alt(A)
/obj/machinery/door/airlock/AIAltClick(mob/user) // Electrifies doors.
add_fingerprint(user)

View File

@@ -25,6 +25,10 @@
if(src)
usr.DblClickOn(src, params)
/atom/MouseWheel(delta_x,delta_y,location,control,params)
if(src)
usr.MouseWheelOn(src, delta_x, delta_y, params)
/*
Standard mob ClickOn()
Handles exceptions: Buildmode, middle click, modified clicks, mech actions
@@ -38,37 +42,49 @@
* item/afterattack(atom,user,adjacent,params) - used both ranged and adjacent
* mob/RangedAttack(atom,params) - used only ranged, only used for tk and laser eyes but could be changed
*/
/mob/proc/ClickOn(var/atom/A, var/params)
if(!checkClickCooldown()) // Hard check, before anything else, to avoid crashing
/mob/proc/ClickOn(atom/A, params)
if(world.time <= next_click)
return
setClickCooldown(1)
next_click = world.time + 1
if(client && client.buildmode)
build_click(src, client.buildmode, params, A)
return
var/list/modifiers = params2list(params)
if(modifiers["shift"] && modifiers["ctrl"])
CtrlShiftClickOn(A)
return 1
if(modifiers["shift"] && modifiers["middle"])
ShiftMiddleClickOn(A)
return 1
if(modifiers["middle"])
MiddleClickOn(A)
return 1
if(modifiers["shift"])
ShiftClickOn(A)
return 0
if(modifiers["alt"]) // alt and alt-gr (rightalt)
AltClickOn(A)
return 1
if(modifiers["ctrl"])
CtrlClickOn(A)
return 1
if(stat || paralysis || stunned) //CHOMPedit, removed weakened to allow item use while crawling
if(LAZYACCESS(modifiers, BUTTON4) || LAZYACCESS(modifiers, BUTTON5))
return
if(LAZYACCESS(modifiers, SHIFT_CLICK))
if(LAZYACCESS(modifiers, MIDDLE_CLICK))
ShiftMiddleClickOn(A)
return
if(LAZYACCESS(modifiers, CTRL_CLICK))
CtrlShiftClickOn(A)
return
if (LAZYACCESS(modifiers, ALT_CLICK))
alt_shift_click_on(A)
return
ShiftClickOn(A)
return
if(LAZYACCESS(modifiers, MIDDLE_CLICK))
if(LAZYACCESS(modifiers, CTRL_CLICK))
CtrlMiddleClickOn(A)
else
MiddleClickOn(A, params)
return
if(LAZYACCESS(modifiers, ALT_CLICK)) // alt and alt-gr (rightalt)
if(LAZYACCESS(modifiers, RIGHT_CLICK))
AltClickSecondaryOn(A)
else
AltClickOn(A)
return
if(LAZYACCESS(modifiers, CTRL_CLICK))
CtrlClickOn(A)
return
if(stat || paralysis || stunned)
return
face_atom(A) // change direction to face what you clicked on
@@ -173,7 +189,7 @@
return TRUE
// Default behavior: ignore double clicks, the second click that makes the doubleclick call already calls for a normal click
/mob/proc/DblClickOn(var/atom/A, var/params)
/mob/proc/DblClickOn(atom/A, var/params)
return
/*
@@ -237,107 +253,33 @@
Middle click
Only used for swapping hands
*/
/mob/proc/MiddleClickOn(var/atom/A)
/mob/proc/MiddleClickOn(atom/A)
swap_hand()
return
// In case of use break glass
/*
/atom/proc/MiddleClick(var/mob/M as mob)
return
*/
/*
Shift middle click
Used for pointing.
*/
/mob/proc/ShiftMiddleClickOn(atom/A)
pointed(A)
return
/*
Shift click
For most mobs, examine.
This is overridden in ai.dm
*/
/mob/proc/ShiftClickOn(var/atom/A)
/mob/proc/ShiftClickOn(atom/A)
A.ShiftClick(src)
return
/atom/proc/ShiftClick(var/mob/user)
/atom/proc/ShiftClick(mob/user)
SEND_SIGNAL(src, COMSIG_SHIFT_CLICKED_ON, user)
var/shiftclick_flags = SEND_SIGNAL(user, COMSIG_CLICK_SHIFT, src)
if(shiftclick_flags & COMSIG_MOB_CANCEL_CLICKON)
return
if(user.client && !user.is_remote_viewing())
user.examinate(src)
return
/*
Ctrl click
For most objects, pull
*/
/mob/proc/CtrlClickOn(var/atom/A)
A.CtrlClick(src)
return
/atom/proc/CtrlClick(var/mob/user)
return
/mob/proc/TurfAdjacent(turf/tile)
return tile.Adjacent(src)
/atom/movable/CtrlClick(var/mob/user)
if(Adjacent(user))
user.start_pulling(src)
/turf/CtrlClick(var/mob/user)
user.stop_pulling()
/*
Alt click
Unused except for AI
*/
/mob/proc/AltClickOn(var/atom/A)
A.AltClick(src)
return
/**
* Alt click on an atom.
* Performs alt-click actions before attempting to open a loot window.
* Returns TRUE if successful, FALSE if not.
*/
/atom/proc/AltClick(var/mob/user)
// if(!user.can_interact_with(src))
// return FALSE
if(SEND_SIGNAL(src, COMSIG_CLICK_ALT, user) & COMPONENT_CANCEL_CLICK_ALT)
return TRUE
if(HAS_TRAIT(src, TRAIT_ALT_CLICK_BLOCKER) && !isobserver(user))
return TRUE
var/turf/tile = get_turf(src)
if(isnull(tile))
return FALSE
if(!isturf(loc) && !isturf(src))
return FALSE
if(!user.TurfAdjacent(tile))
return FALSE
var/datum/lootpanel/panel = user.client?.loot_panel
if(isnull(panel))
return FALSE
panel.open(tile)
return TRUE
/mob/proc/TurfAdjacent(var/turf/T)
return T.AdjacentQuick(src)
/*
Control+Shift click
Unused except for AI
*/
/mob/proc/CtrlShiftClickOn(var/atom/A)
A.CtrlShiftClick(src)
return
/atom/proc/CtrlShiftClick(var/mob/user)
/mob/proc/ShiftMiddleClickOn(atom/A)
src.pointed(A)
return
/*
@@ -401,15 +343,19 @@
/atom/movable/screen/click_catcher/Click(location, control, params)
var/list/modifiers = params2list(params)
if(modifiers["middle"] && istype(usr, /mob/living/carbon))
if(LAZYACCESS(modifiers, MIDDLE_CLICK) && istype(usr, /mob/living/carbon))
var/mob/living/carbon/C = usr
C.swap_hand()
else
var/list/P = params2list(params)
var/turf/T = screen_loc2turf(P["screen-loc"], get_turf(usr))
if(T)
if(modifiers["shift"])
if(LAZYACCESS(modifiers, SHIFT_CLICK))
usr.face_atom(T)
return 1
T.Click(location, control, params)
return 1
/// MouseWheelOn
/mob/proc/MouseWheelOn(atom/A, delta_x, delta_y, params)
SEND_SIGNAL(src, COMSIG_MOUSE_SCROLL_ON, A, delta_x, delta_y, params)

175
code/_onclick/click_alt.dm Normal file
View File

@@ -0,0 +1,175 @@
///Main proc for primary alt click
/mob/proc/AltClickOn(atom/target)
base_click_alt(target)
/**
* ### Base proc for alt click interaction left click. Returns if the click was intercepted & handled
*
* If you wish to add custom `click_alt` behavior for a single type, use that proc.
*/
/mob/proc/base_click_alt(atom/target)
SHOULD_NOT_OVERRIDE(TRUE)
// Check if they've hooked in to prevent src from alt clicking anything
if(SEND_SIGNAL(src, COMSIG_MOB_ALTCLICKON, target) & COMSIG_MOB_CANCEL_CLICKON)
return TRUE
// If it has a signal handler that returns a click action, done.
if(SEND_SIGNAL(target, COMSIG_CLICK_ALT, src) & CLICK_ACTION_ANY)
return TRUE
// If it has a custom click_alt that returns success/block, done.
return target.click_alt(src) & CLICK_ACTION_ANY
/* //NYI Start
if(can_perform_action(target, (target.interaction_flags_click | SILENT_ADJACENCY)))
return target.click_alt(src) & CLICK_ACTION_ANY
return FALSE
*/ //NYI Start
/mob/living/base_click_alt(atom/target)
SHOULD_NOT_OVERRIDE(TRUE)
. = ..()
if(.)
return
return try_open_loot_panel_on(target)
/**
* ## Custom alt click interaction
* Override this to change default alt click behavior. Return `CLICK_ACTION_SUCCESS`, `CLICK_ACTION_BLOCKING` or `NONE`.
*
* ### Guard clauses
* Consider adding `interaction_flags_click` before adding unique guard clauses.
*
* ### Return flags
* Forgetting your return will cause the default alt click behavior to occur thereafter.
*
* The difference between NONE and BLOCKING can get hazy, but I like to keep NONE limited to guard clauses and "never" cases.
*
* A good usage for BLOCKING over NONE is when it's situational for the item and there's some feedback indicating this.
*
* ### Examples:
* User is a ghost, alt clicks on item with special disk eject: NONE
*
* Machine broken, no feedback: NONE
*
* Alt click a pipe to max output but its already max: BLOCKING
*
* Alt click a gun that normally works, but is out of ammo: BLOCKING
*
* User unauthorized, machine beeps: BLOCKING
*
* @param {mob} user - The person doing the alt clicking.
*/
/atom/proc/click_alt(mob/user)
SHOULD_CALL_PARENT(FALSE)
// if(!user.can_interact_with(src))
// return FALSE
if(SEND_SIGNAL(src, COMSIG_CLICK_ALT, user) & COMSIG_MOB_CANCEL_CLICKON)
return TRUE
if(HAS_TRAIT(src, TRAIT_ALT_CLICK_BLOCKER) && !isobserver(user))
return TRUE
var/turf/tile = get_turf(src)
if(isnull(tile))
return FALSE
if(!isturf(loc) && !isturf(src))
return FALSE
if(!user.TurfAdjacent(tile))
return FALSE
var/datum/lootpanel/panel = user.client?.loot_panel
if(isnull(panel))
return FALSE
panel.open(tile)
return TRUE
///Main proc for secondary alt click
/mob/proc/AltClickSecondaryOn(atom/target)
base_click_alt_secondary(target)
/**
* ### Base proc for alt click interaction right click.
*
* If you wish to add custom `click_alt_secondary` behavior for a single type, use that proc.
*/
/mob/proc/base_click_alt_secondary(atom/target)
SHOULD_NOT_OVERRIDE(TRUE)
//Hook on the mob to intercept the click
if(SEND_SIGNAL(src, COMSIG_MOB_ALTCLICKON_SECONDARY, target) & COMSIG_MOB_CANCEL_CLICKON)
return
//Hook on the atom to intercept the click
if(SEND_SIGNAL(target, COMSIG_CLICK_ALT_SECONDARY, src) & COMPONENT_CANCEL_CLICK_ALT_SECONDARY)
return
// If it has a custom click_alt_secondary then do that
target.click_alt_secondary(src)
/* //NYI
if(can_perform_action(target, target.interaction_flags_click | SILENT_ADJACENCY))
target.click_alt_secondary(src)
*/
/**
* ## Custom alt click secondary interaction
* Override this to change default alt right click behavior.
*
* ### Guard clauses
* Consider adding `interaction_flags_click` before adding unique guard clauses.
**/
/atom/proc/click_alt_secondary(mob/user)
SHOULD_CALL_PARENT(FALSE)
return NONE
/**
* ## No-op for unambiguous loot panel bind as a non-living mob.
**/
/mob/proc/alt_shift_click_on(atom/target)
SHOULD_NOT_OVERRIDE(TRUE)
return FALSE
/**
* ## Bind for unambiguously opening the loot panel as a living mob.
* This raises no signals and is not meant to have its behavior overridden.
**/
/mob/living/alt_shift_click_on(atom/target)
SHOULD_NOT_OVERRIDE(TRUE)
return try_open_loot_panel_on(target)
///Helper for determining if a living mob may open the loot panel for some target, since it is shared between
///alt and alt-shift click.
///Returns FALSE if the mob is unable to open the loot panel at the target and TRUE if the loot panel was opened.
/mob/living/proc/try_open_loot_panel_on(atom/target)
//Just a copy past of /mob/living/MouseDrop until we get the loot panel.
var/mob/living/living_target = target
if(living_target.is_incorporeal())
return
if(istype(living_target) && living_target != src && Adjacent(living_target))
living_target.show_inventory_panel(src) //We don't have the loot panel, so...We'll use our inventory panel for now.
/* //NYI
if(!CAN_I_SEE(target) || (is_blind() && !IN_GIVEN_RANGE(src, target, 1)))
return FALSE
// No alt clicking to view turf from beneath
if(HAS_TRAIT(src, TRAIT_MOVE_VENTCRAWLING))
return FALSE
/// No loot panel if it's on our person
if(isobj(target) && (target in get_all_gear(INCLUDE_PROSTHETICS|INCLUDE_ABSTRACT|INCLUDE_ACCESSORIES)))
to_chat(src, span_warning("You can't search for this item, it's already in your inventory![!HAS_TRAIT(target, TRAIT_NODROP) ? " Take it off first." : ""]"))
return FALSE
client.loot_panel.open(get_turf(target))
return TRUE
*/

117
code/_onclick/click_ctrl.dm Normal file
View File

@@ -0,0 +1,117 @@
/**
* Ctrl click
*/
/mob/proc/CtrlClickOn(atom/A)
base_click_ctrl(A)
/**
* ### Base proc for ctrl click interaction left click.
*
* If you wish to add custom `click_ctrl` behavior for a single type, use that proc.
*/
/mob/proc/base_click_ctrl(atom/target)
SHOULD_NOT_OVERRIDE(TRUE)
// Check if they've hooked in to prevent src from ctrl clicking anything
if(SEND_SIGNAL(src, COMSIG_MOB_CTRL_CLICKED, target) & COMSIG_MOB_CANCEL_CLICKON)
return TRUE
// If it has a signal handler that returns a click action, done.
if(SEND_SIGNAL(target, COMSIG_CLICK_CTRL, src) & CLICK_ACTION_ANY)
return TRUE
target.click_ctrl(src)
/* //NYI
// If it has a custom click_alt that returns success/block, done.
if(can_perform_action(target, target.interaction_flags_click | SILENT_ADJACENCY))
return target.click_ctrl(src) & CLICK_ACTION_ANY
*/
return
/**
* Ctrl click
* For most objects, pull
*/
/mob/living/base_click_ctrl(atom/target)
SHOULD_NOT_OVERRIDE(TRUE)
. = ..()
if(. || world.time < next_move) // || !can_perform_action(target, NOT_INSIDE_TARGET | SILENT_ADJACENCY | ALLOW_RESTING | FORBID_TELEKINESIS_REACH))
return
. = TRUE
/*
if(grab(target))
changeNext_move(CLICK_CD_MELEE)
return
*/
pulled(target)
/**
* Ctrl mouse wheel click
* Except for tagging datumns same as control click
*/
/mob/proc/CtrlMiddleClickOn(atom/A)
if(check_rights_for(client, R_ADMIN))
client.toggle_tag_datum(A)
return
CtrlClickOn(A)
/**
* ## Custom ctrl click interaction
* Override this to change default ctrl click behavior. Return `CLICK_ACTION_SUCCESS`, `CLICK_ACTION_BLOCKING` or `NONE`.
*
* ### Guard clauses
* Consider adding `interaction_flags_click` before adding unique guard clauses.
*
* ### Return flags
* Forgetting your return will cause the default ctrl click behavior to occur thereafter.
*
* Returning any value besides NONE will stop the attack chain and thus stop the object from getting pulled/grabbed
**/
/atom/proc/click_ctrl(mob/user)
SHOULD_CALL_PARENT(FALSE)
return NONE
/turf/click_ctrl(mob/user)
user.stop_pulling()
/**
* Control+Shift click
* Unused except for AI
*/
/mob/proc/CtrlShiftClickOn(atom/A)
base_click_ctrl_shift(A)
/**
* ### Base proc for ctrl shift click interaction left click.
*
* If you wish to add custom `click_ctrl_shift` behavior for a single type, use that proc.
*/
/mob/proc/base_click_ctrl_shift(atom/target)
SHOULD_NOT_OVERRIDE(TRUE)
// Check if they've hooked in to prevent src from ctrl clicking anything
if(SEND_SIGNAL(src, COMSIG_MOB_CTRL_SHIFT_CLICKED, target) & COMSIG_MOB_CANCEL_CLICKON)
return
// If it has a signal handler that returns a click action, done.
if(SEND_SIGNAL(target, COMSIG_CLICK_CTRL_SHIFT, src) & CLICK_ACTION_ANY)
return
target.click_ctrl_shift(src)
/* //NYI
// Proceed with ctrl shift click
if(can_perform_action(target, target.interaction_flags_click | SILENT_ADJACENCY))
target.click_ctrl_shift(src)
*/
/**
* ## Custom ctrl shift click interaction
*
* ### Guard clauses
* Consider adding `interaction_flags_click` before adding unique guard clauses.
**/
/atom/proc/click_ctrl_shift(mob/user)
SHOULD_CALL_PARENT(FALSE)
return NONE

View File

@@ -17,22 +17,35 @@
return
var/list/modifiers = params2list(params)
if(modifiers["shift"] && modifiers["ctrl"])
CtrlShiftClickOn(A)
if(LAZYACCESS(modifiers, BUTTON4) || LAZYACCESS(modifiers, BUTTON5))
return
if(modifiers["shift"] && modifiers["middle"])
if(LAZYACCESS(modifiers, SHIFT_CLICK))
if(LAZYACCESS(modifiers, MIDDLE_CLICK))
ShiftMiddleClickOn(A)
return
if(modifiers["middle"])
MiddleClickOn(A)
if(LAZYACCESS(modifiers, CTRL_CLICK))
CtrlShiftClickOn(A)
return
if (LAZYACCESS(modifiers, ALT_CLICK))
alt_shift_click_on(A)
return
if(modifiers["shift"])
ShiftClickOn(A)
return
if(modifiers["alt"]) // alt and alt-gr (rightalt)
if(LAZYACCESS(modifiers, MIDDLE_CLICK))
if(LAZYACCESS(modifiers, CTRL_CLICK))
CtrlMiddleClickOn(A)
else
MiddleClickOn(A, params)
return
if(LAZYACCESS(modifiers, ALT_CLICK)) // alt and alt-gr (rightalt)
if(LAZYACCESS(modifiers, RIGHT_CLICK))
AltClickSecondaryOn(A)
else
AltClickOn(A)
return
if(modifiers["ctrl"])
if(LAZYACCESS(modifiers, CTRL_CLICK))
CtrlClickOn(A)
return
@@ -106,26 +119,26 @@
//Give cyborgs hotkey clicks without breaking existing uses of hotkey clicks
// for non-doors/apcs
/mob/living/silicon/robot/CtrlShiftClickOn(var/atom/A)
A.BorgCtrlShiftClick(src)
/mob/living/silicon/robot/CtrlShiftClickOn(atom/target)
target.BorgCtrlShiftClick(src)
/mob/living/silicon/robot/ShiftClickOn(var/atom/A)
A.BorgShiftClick(src)
/mob/living/silicon/robot/ShiftClickOn(atom/target)
target.BorgShiftClick(src)
/mob/living/silicon/robot/CtrlClickOn(var/atom/A)
A.BorgCtrlClick(src)
/mob/living/silicon/robot/CtrlClickOn(atom/target)
target.BorgCtrlClick(src)
/mob/living/silicon/robot/AltClickOn(var/atom/A)
A.BorgAltClick(src)
/mob/living/silicon/robot/AltClickOn(atom/target)
target.BorgAltClick(src)
/atom/proc/BorgCtrlShiftClick(var/mob/living/silicon/robot/user) //forward to human click if not overriden
CtrlShiftClick(user)
/atom/proc/BorgCtrlShiftClick(mob/living/silicon/robot/user) //forward to human click if not overriden
user.click_ctrl_shift(user)
/obj/machinery/door/airlock/BorgCtrlShiftClick(var/mob/living/silicon/robot/user)
if(user.bolt && !user.bolt.malfunction)
return
AICtrlShiftClick(user)
AIclick_ctrl_shift(user)
/atom/proc/BorgShiftClick(var/mob/living/silicon/robot/user) //forward to human click if not overriden
ShiftClick(user)
@@ -137,28 +150,28 @@
AIShiftClick(user)
/atom/proc/BorgCtrlClick(var/mob/living/silicon/robot/user) //forward to human click if not overriden
CtrlClick(user)
user.base_click_ctrl(src)
/obj/machinery/door/airlock/BorgCtrlClick(var/mob/living/silicon/robot/user) // Bolts doors. Forwards to AI code.
if(user.bolt && !user.bolt.malfunction)
return
AICtrlClick(user)
ctrl_click_ai(user)
/obj/machinery/power/apc/BorgCtrlClick(var/mob/living/silicon/robot/user) // turns off/on APCs. Forwards to AI code.
if(user.bolt && !user.bolt.malfunction)
return
AICtrlClick(user)
ctrl_click_ai(user)
/obj/machinery/turretid/BorgCtrlClick(var/mob/living/silicon/robot/user) //turret control on/off. Forwards to AI code.
if(user.bolt && !user.bolt.malfunction)
return
AICtrlClick(user)
ctrl_click_ai(user)
/atom/proc/BorgAltClick(var/mob/living/silicon/robot/user)
AltClick(user)
click_alt(user)
return
/obj/machinery/door/airlock/BorgAltClick(var/mob/living/silicon/robot/user) // Eletrifies doors. Forwards to AI code.

View File

@@ -41,7 +41,7 @@
if(modifiers["alt"]) // alt and alt-gr (rightalt)
var/turf/T = get_turf(A)
if(T && TurfAdjacent(T))
T.AltClick(src)
T.click_alt(src)
return
// You are responsible for checking config.ghost_interaction when you override this function
// Not all of them require checking, see below

View File

@@ -24,7 +24,7 @@
remembered = null
. = ..()
/obj/item/stack/hose/CtrlClick(mob/user)
/obj/item/stack/hose/item_ctrl_click(mob/user)
if(remembered)
to_chat(user, span_notice("You wind \the [src] back up."))
remembered = null

View File

@@ -873,7 +873,7 @@
to_chat(user, span_warning("Access denied."))
return
/obj/machinery/alarm/AltClick(mob/user)
/obj/machinery/alarm/click_alt(mob/user)
..()
togglelock(user)

View File

@@ -503,7 +503,7 @@ About the new airlock wires panel:
. = ..()
/obj/machinery/door/airlock/CtrlClick(mob/user) //Hold door open
/obj/machinery/door/airlock/click_ctrl(mob/user) //Hold door open
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
if(user.is_incorporeal())
return

View File

@@ -101,7 +101,7 @@
// inserted = null
// return ..()
/obj/machinery/gear_painter/AltClick(mob/user)
/obj/machinery/gear_painter/click_alt(mob/user)
. = ..()
drop_item(user)

View File

@@ -42,7 +42,7 @@
. = ..()
/obj/machinery/washing_machine/AltClick()
/obj/machinery/washing_machine/click_alt()
start()
/obj/machinery/washing_machine/verb/start_washing()

View File

@@ -2044,7 +2044,7 @@
else//Everyone else gets the normal noise
who << sound('sound/mecha/nominal.ogg',volume=50)
/obj/mecha/AltClick(mob/living/user)
/obj/mecha/click_alt(mob/living/user)
if(user == occupant)
strafing()

View File

@@ -185,6 +185,19 @@
return ..()
/obj/item/click_ctrl(mob/user)
SHOULD_NOT_OVERRIDE(TRUE)
//If the item is on the ground & not anchored we allow the player to drag it
. = item_ctrl_click(user)
if(. & CLICK_ACTION_ANY)
return (isturf(loc) && !anchored) ? NONE : . //allow the object to get dragged on the floor
/// Subtypes only override this proc for ctrl click purposes. obeys same principles as ctrl_click()
/obj/item/proc/item_ctrl_click(mob/user)
SHOULD_CALL_PARENT(FALSE)
return NONE
/// Called when an action associated with our item is deleted
/obj/item/proc/on_action_deleted(datum/source)
SIGNAL_HANDLER

View File

@@ -108,7 +108,7 @@
// Description: Checks if the user is made of silicon and returns if they are. If the user is not made of silicon and can use the communicator,
// removes the ID from the communicator if it has one, or sends a chat message indicating that the communicator does not have an ID.
/obj/item/communicator/AltClick()
/obj/item/communicator/click_alt()
if(issilicon(usr))
return

View File

@@ -132,7 +132,7 @@ GLOBAL_LIST_EMPTY(GPS_list)
compass.show_waypoint("\ref[gps]")
compass.rebuild_overlay_lists(update_compass_icon)
/obj/item/gps/AltClick(mob/user)
/obj/item/gps/click_alt(mob/user)
toggletracking(user)
/obj/item/gps/proc/toggletracking(mob/living/user)

View File

@@ -147,7 +147,7 @@
else
..()
/obj/item/personal_shield_generator/AltClick(mob/living/user)
/obj/item/personal_shield_generator/click_alt(mob/living/user)
weapon_toggle()
/obj/item/personal_shield_generator/MouseDrop()

View File

@@ -209,7 +209,7 @@
set_light_on(TRUE)
//VOREStation Add Start
/obj/item/radio/intercom/AICtrlClick(var/mob/user)
/obj/item/radio/intercom/ctrl_click_ai(var/mob/user)
ToggleBroadcast()
to_chat(user, span_notice("\The [src]'s microphone is now <b>[broadcasting ? "enabled" : "disabled"]</b>."))

View File

@@ -30,5 +30,5 @@
if(ismob(loc))
loc.runechat_message("\[TTS Voice\] [message]")
/obj/item/text_to_speech/AltClick(mob/user) // QOL Change
/obj/item/text_to_speech/click_alt(mob/user) // QOL Change
attack_self(user)

View File

@@ -47,7 +47,7 @@
add_overlay(corptag_icon_state)
/obj/structure/closet/body_bag/cryobag/robobag/AltClick(mob/user)
/obj/structure/closet/body_bag/cryobag/robobag/click_alt(mob/user)
if(!Adjacent(user))
..()
if(corptag)

View File

@@ -62,7 +62,7 @@ var/list/marker_beacon_colors = list(
var/obj/structure/marker_beacon/M = new(user.loc, picked_color)
transfer_fingerprints_to(M)
/obj/item/stack/marker_beacon/AltClick(mob/living/user)
/obj/item/stack/marker_beacon/click_alt(mob/living/user)
if(user.incapacitated() || !istype(user))
to_chat(user, span_warning("You can't do that right now!"))
return
@@ -138,7 +138,7 @@ var/list/marker_beacon_colors = list(
else
return ..()
/obj/structure/marker_beacon/AltClick(mob/living/user)
/obj/structure/marker_beacon/click_alt(mob/living/user)
..()
if(perma)
return

View File

@@ -181,7 +181,7 @@
adjusted_name = sane_name
return TRUE
/obj/item/toy/plushie/customizable/AltClick(mob/user)
/obj/item/toy/plushie/customizable/click_alt(mob/user)
tgui_interact(user)
/obj/item/toy/plushie/customizable/dragon

View File

@@ -191,7 +191,7 @@
H.update_inv_l_hand()
H.update_inv_r_hand()
/obj/item/toy/sword/AltClick(mob/living/user)
/obj/item/toy/sword/click_alt(mob/living/user)
if(!in_range(src, user)) //Basic checks to prevent abuse
return
if(user.incapacitated() || !istype(user))

View File

@@ -106,7 +106,7 @@
icon = 'icons/obj/drakietoy.dmi'
var/lights_glowing = FALSE
/obj/item/toy/plushie/borgplushie/drake/AltClick(mob/living/user)
/obj/item/toy/plushie/borgplushie/drake/click_alt(mob/living/user)
. = ..()
var/turf/T = get_turf(src)
if(!T.AdjacentQuick(user)) // So people aren't messing with these from across the room
@@ -1033,7 +1033,7 @@
/obj/item/toy/desk/attack_self(mob/user)
activate(user)
/obj/item/toy/desk/AltClick(mob/user)
/obj/item/toy/desk/click_alt(mob/user)
activate(user)
/obj/item/toy/desk/MouseDrop(mob/user as mob) // Code from Paper bin, so you can still pick up the deck

View File

@@ -54,7 +54,7 @@ GLOBAL_LIST_INIT(robot_glass_options, list(
balloon_alert(user,"the fabricator now holds [stored_matter]/30 fabrication-units.")
return
/obj/item/rsf/CtrlClick(mob/living/user)
/obj/item/rsf/item_ctrl_click(mob/living/user)
if(!Adjacent(user) || !istype(user))
balloon_alert(user,"you are too far away.")
return

View File

@@ -177,7 +177,7 @@
/obj/item/melee/energy/AltClick(mob/living/user)
/obj/item/melee/energy/click_alt(mob/living/user)
if(!colorable) //checks if is not colorable
return
if(!in_range(src, user)) //Basic checks to prevent abuse

View File

@@ -202,7 +202,7 @@
H.update_inv_l_hand()
H.update_inv_r_hand()
/obj/item/shield/energy/AltClick(mob/living/user)
/obj/item/shield/energy/click_alt(mob/living/user)
if(!in_range(src, user)) //Basic checks to prevent abuse
return
if(user.incapacitated() || !istype(user))

View File

@@ -44,7 +44,7 @@
if(0)
to_chat(usr, "[src] now opens as a container.")
/obj/item/storage/quickdraw/AltClick(mob/user)
/obj/item/storage/quickdraw/click_alt(mob/user)
..()
if(src.loc == user) //Are they carrying us?
toggle_quickdraw()

View File

@@ -80,7 +80,7 @@
return
..()
/obj/item/storage/secure/AltClick(mob/user as mob)
/obj/item/storage/secure/click_alt(mob/user as mob)
if (isliving(user) && Adjacent(user) && (src.locked == 1))
to_chat(user, span_warning("[src] is locked and cannot be opened!"))
else if (isliving(user) && Adjacent(user) && (!src.locked))

View File

@@ -159,7 +159,7 @@
usr.put_in_l_hand(src)
src.add_fingerprint(usr)
/obj/item/storage/AltClick(mob/user)
/obj/item/storage/click_alt(mob/user)
if(user in is_seeing)
src.close(user)
// I would think there should be some incap check here or something

View File

@@ -117,7 +117,7 @@
initialize_for_recipient(recipient_mob.mind, preset_goodies = TRUE)
return TRUE
/obj/item/mail/blank/AltClick(mob/user)
/obj/item/mail/blank/click_alt(mob/user)
if(sealed)
return

View File

@@ -116,7 +116,7 @@
else
toggle(user)
/obj/structure/closet/secure_closet/AltClick()
/obj/structure/closet/secure_closet/click_alt()
..()
verb_togglelock()

View File

@@ -90,7 +90,7 @@
if(health <= 0)
puncture()
/obj/structure/inflatable/CtrlClick()
/obj/structure/inflatable/click_ctrl()
hand_deflate()
/obj/item/inflatable/proc/inflate(var/mob/user,var/location)

View File

@@ -190,7 +190,7 @@ GLOBAL_LIST_BOILERPLATE(all_janitorial_carts, /obj/structure/janitorialcart)
//New Altclick functionality!
//Altclick the cart with a mop to stow the mop away
//Altclick the cart with a reagent container to pour things into the bucket without putting the bottle in trash
/obj/structure/janitorialcart/AltClick(mob/living/user)
/obj/structure/janitorialcart/click_alt(mob/living/user)
if(user.incapacitated() || !Adjacent(user)) return
var/obj/I = user.get_active_hand()
if(istype(I, /obj/item/mop))

View File

@@ -177,7 +177,7 @@
setAngle(SIMPLIFY_DEGREES(new_angle))
return TRUE
/obj/structure/reflector/AltClick(mob/user)
/obj/structure/reflector/click_alt(mob/user)
if(!CanUseTopic(user))
return
else if(finished)

View File

@@ -80,7 +80,7 @@
return TryToSwitchState(user)
/* // CHOMPEDIT: disabling becaue alt-clicking to view a turf is pretty important.
/obj/structure/simple_door/AltClick(mob/user as mob)
/obj/structure/simple_door/click_alt(mob/user as mob)
. = ..()
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
if(!Adjacent(user))

View File

@@ -157,7 +157,7 @@
user_unbuckle_mob(A, user)
return
/obj/structure/bed/chair/wheelchair/CtrlClick(var/mob/user)
/obj/structure/bed/chair/wheelchair/click_ctrl(mob/user)
if(in_range(src, user))
if(!ishuman(user)) return
if(has_buckled_mobs() && (user in buckled_mobs))

View File

@@ -179,7 +179,7 @@
ChangeTurf(/turf/simulated/floor/cult, preserve_outdoors = TRUE)
return TRUE
/turf/simulated/floor/AltClick(mob/user)
/turf/simulated/floor/click_alt(mob/user)
if(isliving(user))
var/mob/living/livingUser = user
if(try_graffiti(livingUser, livingUser.get_active_hand()))

View File

@@ -347,7 +347,7 @@
ChangeTurf(/turf/simulated/wall/cult, preserve_outdoors = TRUE)
return TRUE
/turf/simulated/wall/AltClick(mob/user)
/turf/simulated/wall/click_alt(mob/user)
if(isliving(user))
var/mob/living/livingUser = user
if(try_graffiti(livingUser, livingUser.get_active_hand()))

View File

@@ -6,7 +6,7 @@
info = {"<font face="Comic Sans MS" color=#DA0000><b><center></center><BR><center><I><B>Form - Inventory Requisition r10.7.1E</I></B></center><BR><center><font size="4">General Request Form</font></center><BR><BR><center><B>General</B></center><BR><BR>Name: <span class="paper_field"></span><BR>Department: <span class="paper_field"></span><BR>Departmental Rank: <span class="paper_field"></span><BR>Organization(If not Nanotrasen): <span class="paper_field"></span><BR>Date: <span class="paper_field"></span><BR><BR><BR><BR>Requested Item(s): <span class="paper_field"></span><BR>Quantity: <span class="paper_field"></span><BR>Reason for request: <span class="paper_field"></span><BR>Is this replacement equipment?: <span class="paper_field"></span><BR>If `Yes`; above, specify equiment and reason for replacement: <span class="paper_field"></span><BR><BR><BR><center><B>Authorization</B></center><BR><BR>Authorizing Department: <span class="paper_field"></span><BR>Authorizing Dept. Head: <span class="paper_field"></span><BR><BR><BR><center><B>Contact and Delivery</B></center><BR><BR>EPv2 Address of requesting party(Do not leave blank): <span class="paper_field"></span><BR>Delivery location or department: <span class="paper_field"></span><BR><BR><BR>Nanotrasen Employee Identification Number: <span class="paper_field"></span><BR><U>Signature of Requester and Date</U><BR><BR><span class="paper_field"></span><BR><BR><BR><BR>Authorizor`s Nanotrasen Employee Identification Number: <span class="paper_field"></span><BR><U>Authorizing Signature and Date(Include authorizing department`s stamp below)</U><BR><BR><span class="paper_field"></span><BR><BR><BR><center><B>Shipping Department Only</B></center><BR><center><I>(Do not write below this line)</I></center><BR>Nanotrasen Purchasing Approval Code: <span class="paper_field"></span><BR>Nanotrasen Employee Identification Number: <span class="paper_field"></span><BR>Receiving Shipping Employee: <span class="paper_field"></span><BR><U>Signature and Date</U><BR><BR><span class="paper_field"></span><BR></b></font>"}
info_links = {"<font face="Comic Sans MS" color=#FF9300><b><center></center><BR><center><I><B>Form - Inventory Requisition r10.7.1E</I></B></center><BR><center><font size="4">General Request Form</font></center><BR><BR><center><B>General</B></center><BR><BR>Name: <span class="paper_field"><font face="Verdana"><A href='byond://?src=[0x2057e0c];write=1'>write</A></font></span><BR>Department: <span class="paper_field"><font face="Verdana"><A href='byond://?src=[0x2057e0c];write=2'>write</A></font></span><BR>Departmental Rank: <span class="paper_field"><font face="Verdana"><A href='byond://?src=[0x2057e0c];write=3'>write</A></font></span><BR>Organization(If not Nanotrasen): <span class="paper_field"><font face="Verdana"><A href='byond://?src=[0x2057e0c];write=4'>write</A></font></span><BR>Date: <span class="paper_field"><font face="Verdana"><A href='byond://?src=[0x2057e0c];write=5'>write</A></font></span><BR><BR><BR><BR>Requested Item(s): <span class="paper_field"><font face="Verdana"><A href='byond://?src=[0x2057e0c];write=6'>write</A></font></span><BR>Quantity: <span class="paper_field"><font face="Verdana"><A href='byond://?src=[0x2057e0c];write=7'>write</A></font></span><BR>Reason for request: <span class="paper_field"><font face="Verdana"><A href='byond://?src=[0x2057e0c];write=8'>write</A></font></span><BR>Is this replacement equipment?: <span class="paper_field"><font face="Verdana"><A href='byond://?src=[0x2057e0c];write=9'>write</A></font></span><BR>If `Yes` above, specify equiment and reason for replacement: <span class="paper_field"><font face="Verdana"><A href='byond://?src=[0x2057e0c];write=10'>write</A></font></span><BR><BR><BR><center><B>Authorization</B></center><BR><BR>Authorizing Department: <span class="paper_field"><font face="Verdana"><A href='byond://?src=[0x2057e0c];write=11'>write</A></font></span><BR>Authorizing Dept. Head: <span class="paper_field"><font face="Verdana"><A href='byond://?src=[0x2057e0c];write=12'>write</A></font></span><BR><BR><BR><center><B>Contact and Delivery</B></center><BR><BR>EPv2 Address of requesting party(Do not leave blank): <span class="paper_field"><font face="Verdana"><A href='byond://?src=[0x2057e0c];write=13'>write</A></font></span><BR>Delivery location or department: <span class="paper_field"><font face="Verdana"><A href='byond://?src=[0x2057e0c];write=14'>write</A></font></span><BR><BR><BR>Nanotrasen Employee Identification Number: <span class="paper_field"><font face="Verdana"><A href='byond://?src=[0x2057e0c];write=15'>write</A></font></span><BR><U>Signature of Requester and Date</U><BR><BR><span class="paper_field"><font face="Verdana"><A href='byond://?src=[0x2057e0c];write=16'>write</A></font></span><BR><BR><BR><BR>Authorizor`s Nanotrasen Employee Identification Number: <span class="paper_field"><font face="Verdana"><A href='byond://?src=[0x2057e0c];write=17'>write</A></font></span><BR><U>Authorizing Signature and Date(Include authorizing department`s stamp below)</U><BR><BR><span class="paper_field"><font face="Verdana"><A href='byond://?src=[0x2057e0c];write=18'>write</A></font></span><BR><BR><BR><center><B>Shipping Department Only</B></center><BR><center><I>(Do not write below this line)</I></center><BR>Nanotrasen Purchasing Approval Code: <span class="paper_field"><font face="Verdana"><A href='byond://?src=[0x2057e0c];write=19'>write</A></font></span><BR>Nanotrasen Employee Identification Number: <span class="paper_field"><font face="Verdana"><A href='byond://?src=[0x2057e0c];write=20'>write</A></font></span><BR>Receiving Shipping Employee: <span class="paper_field"><font face="Verdana"><A href='byond://?src=[0x2057e0c];write=21'>write</A></font></span><BR><U>Signature and Date</U><BR><BR><span class="paper_field"><font face="Verdana"><A href='byond://?src=[0x2057e0c];write=22'>write</A></font></span><BR></b></font><font face="Verdana"><A href='byond://?src=[0x2057e0c];write=end'>write</A></font>"}
/obj/item/paper/carbon/cursedform/AltClick() // No fun.
/obj/item/paper/carbon/cursedform/click_alt() // No fun.
return
/obj/item/paper/carbon/cursedform/burnpaper(obj/item/flame/P, mob/user)

View File

@@ -226,11 +226,11 @@
sleep(5)
target.filters -= filter(type="blur", size = 0)
/obj/item/telecube/CtrlClick(mob/user)
/obj/item/telecube/item_ctrl_click(mob/user)
if(Adjacent(user) && teleport_to_mate(user))
cooldown(mate_too = FALSE)
/obj/item/telecube/AltClick(mob/user)
/obj/item/telecube/click_alt(mob/user)
if(Adjacent(user) && swap_with_mate())
cooldown(mate_too = TRUE)

View File

@@ -98,7 +98,7 @@
last_passive_use = world.time
blob_type.on_chunk_tick(src)
/obj/item/blobcore_chunk/AltClick(mob/living/carbon/user)
/obj/item/blobcore_chunk/click_alt(mob/living/carbon/user)
if(blob_type && blob_type.chunk_active_type == BLOB_CHUNK_TOGGLE)
should_tick = !should_tick

View File

@@ -191,7 +191,7 @@ GLOBAL_LIST_EMPTY(all_cataloguers)
/obj/item/cataloguer/AltClick(mob/user)
/obj/item/cataloguer/click_alt(mob/user)
pulse_scan(user)
// Gives everything capable of being scanned an outline for a brief moment.

View File

@@ -60,6 +60,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list(
// Rate limiting
var/mtl = CONFIG_GET(number/minute_topic_limit)
if(href_list["window_id"] != "statbrowser") //Deviation from TG. Our statbrowser has so many commands that logging in as a borg can cause it to rate limit you. This needs fixing eventually.
if (!check_rights_for(src, R_HOLDER) && mtl)
var/minute = round(world.time, 600)
if (!topiclimiter)
@@ -67,6 +68,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list(
if (minute != topiclimiter[CURRENT_MINUTE])
topiclimiter[CURRENT_MINUTE] = minute
topiclimiter[MINUTE_COUNT] = 0
if(href_list["window_id"] != "statbrowser")
topiclimiter[MINUTE_COUNT] += 1
if (topiclimiter[MINUTE_COUNT] > mtl)
var/msg = "Your previous action was ignored because you've done too many in a minute."
@@ -79,7 +81,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list(
return
var/stl = CONFIG_GET(number/second_topic_limit)
if (!check_rights_for(src, R_HOLDER) && stl && href_list["window_id"] != "statbrowser")
if (!check_rights_for(src, R_HOLDER) && stl)
var/second = round(world.time, 10)
if (!topiclimiter)
topiclimiter = new(LIMITER_SIZE)

View File

@@ -510,7 +510,7 @@
item_flags &= ~FLEXIBLEMATERIAL
. = ..()
/obj/item/clothing/accessory/gaiter/AltClick(mob/user)
/obj/item/clothing/accessory/gaiter/click_alt(mob/user)
. = ..()
if(breath_masked && breathmask)
to_chat(user, span_notice("You pull [breathmask] out from behind [src], and it drops to your feet."))

View File

@@ -65,7 +65,7 @@
/obj/item/gps/watch
gps_tag = "SRV-WTCH"
/obj/item/clothing/accessory/watch/survival/AltClick(mob/user)
/obj/item/clothing/accessory/watch/survival/click_alt(mob/user)
. = ..()
if(Adjacent(user))

View File

@@ -365,7 +365,7 @@ BLIND // can't see anything
. = ..()
. += to_chat(user, span_notice("Alt-click to toggle modes."))
/obj/item/clothing/glasses/sunglasses/bigshot/AltClick(mob/user)
/obj/item/clothing/glasses/sunglasses/bigshot/click_alt(mob/user)
set src in usr
if(user.canmove && !user.stat && !user.restrained())
if(src.ar)

View File

@@ -56,7 +56,7 @@
/obj/item/clothing/mask/gas/sechailer/ui_action_click(mob/user, actiontype)
halt()
/obj/item/clothing/mask/gas/sechailer/AltClick(mob/user)
/obj/item/clothing/mask/gas/sechailer/click_alt(mob/user)
selectphrase()
/obj/item/clothing/mask/gas/sechailer/verb/selectphrase()

View File

@@ -190,7 +190,7 @@
to_chat(H, span_info("You deploy your suit helmet, sealing you off from the world."))
playsound(src.loc, 'sound/machines/click2.ogg', 75, 1)
/obj/item/clothing/suit/space/void/AltClick(mob/living/user)
/obj/item/clothing/suit/space/void/click_alt(mob/living/user)
eject_tank()
/obj/item/clothing/suit/space/void/verb/eject_tank()

View File

@@ -1063,7 +1063,7 @@
/obj/item/clothing/suit/caution/attack_self()
toggle()
/obj/item/clothing/suit/caution/AltClick()
/obj/item/clothing/suit/caution/click_alt()
toggle()
/obj/item/clothing/suit/caution/proc/toggle()

View File

@@ -97,7 +97,7 @@
sample = null
update_icon()
/obj/machinery/microscope/AltClick()
/obj/machinery/microscope/click_alt()
remove_sample(usr)
/obj/machinery/microscope/MouseDrop(var/atom/other)

View File

@@ -62,7 +62,7 @@
interact(user)
/obj/machinery/cash_register/AltClick(mob/user)
/obj/machinery/cash_register/click_alt(mob/user)
if(Adjacent(user))
open_cash_box()

View File

@@ -56,7 +56,7 @@
interact(user)
/obj/item/retail_scanner/AltClick(var/mob/user)
/obj/item/retail_scanner/click_alt(var/mob/user)
if(Adjacent(user))
user.set_machine(src)
interact(user)

View File

@@ -371,7 +371,7 @@
src.visible_message(span_notice("[user] slides the [W] over to [result]!"))
next_result = 0
/obj/item/entrepreneur/spirit_board/AltClick(mob/living/carbon/user)
/obj/item/entrepreneur/spirit_board/click_alt(mob/living/carbon/user)
if(!istype(user)) //admins can be cheeky
return 0
next_result = tgui_input_list(user, "What should it land on next?", "Next result", possible_results)
@@ -427,7 +427,7 @@
rollertype = /obj/item/roller/massage
bedtype = /obj/structure/bed/roller/massage
/obj/structure/bed/roller/massage/AltClick(mob/living/carbon/user)
/obj/structure/bed/roller/massage/click_alt(mob/living/carbon/user)
if(anchored)
anchored = 0
src.visible_message(span_notice("[user] turns the breaks off on the [src]!"))

View File

@@ -38,7 +38,7 @@
. += span_notice("It has [Bait] hanging on its hook: ")
. += Bait.examine(user)
/obj/item/material/fishing_rod/CtrlClick(mob/user)
/obj/item/material/fishing_rod/item_ctrl_click(mob/user)
if((src.loc == user || Adjacent(user)) && Bait)
Bait.forceMove(get_turf(user))
to_chat(user, span_notice("You remove the bait from \the [src]."))

View File

@@ -172,7 +172,7 @@
playsound(src, 'sound/machines/click.ogg', 40, 1)
update_icon()
/obj/machinery/appliance/AICtrlClick(mob/user)
/obj/machinery/appliance/ctrl_click_ai(mob/user)
attempt_toggle_power(user)
/obj/machinery/appliance/proc/choose_output()

View File

@@ -106,7 +106,7 @@
return 1//Contains only a single object which can be extracted alone
return 2//Contains multiple objects and/or reagents
/obj/item/reagent_containers/cooking_container/AltClick(var/mob/user)
/obj/item/reagent_containers/cooking_container/click_alt(var/mob/user)
do_empty(user)
//Deletes contents of container.

View File

@@ -72,7 +72,7 @@
oven_loop.stop(src)
..()
/obj/machinery/appliance/cooker/oven/AltClick(var/mob/user)
/obj/machinery/appliance/cooker/oven/click_alt(var/mob/user)
try_toggle_door(user)
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)

View File

@@ -253,10 +253,10 @@
user.visible_message(span_notice("\The [user] searches for specific cards in \the [src], and draws [cards_to_draw.len]."))
/obj/item/deck/CtrlClick(mob/user)
/obj/item/deck/item_ctrl_click(mob/user)
deal_card()
/obj/item/deck/CtrlShiftClick(mob/user)
/obj/item/deck/click_ctrl_shift(mob/user)
deal_card_multi()
/obj/item/deck/proc/deal_at(mob/user, mob/target, dcard) // Take in the no. of card to be dealt
@@ -329,7 +329,7 @@
else
return
/obj/item/deck/AltClick(mob/user)
/obj/item/deck/click_alt(mob/user)
if(user.stat || !Adjacent(user))
return
shuffle(user)
@@ -569,10 +569,10 @@
..()
src.update_icon()
/obj/item/hand/CtrlClick(mob/user)
/obj/item/hand/item_ctrl_click(mob/user)
if(user.stat || !Adjacent(user))
return
discard()
/obj/item/hand/AltClick(mob/user)
/obj/item/hand/click_alt(mob/user)
Removecard()

View File

@@ -31,7 +31,7 @@
desc = "[initial(desc)] It looks a little misshapen, somehow..."
loaded = to_weight
/obj/item/dice/AltClick(mob/user)
/obj/item/dice/click_alt(mob/user)
..()
if(cheater)
if(!loaded)
@@ -141,7 +141,7 @@
icon_state = "[name][result]"
user.visible_message(span_notice("\The [user] turned \the [src] to the face reading [result] manually."))
/obj/item/dice/CtrlClick(mob/user)
/obj/item/dice/item_ctrl_click(mob/user)
set_dice(user)

View File

@@ -140,7 +140,7 @@
REAGENT_ID_PITCHERNECTAR = 1
)
/obj/machinery/portable_atmospherics/hydroponics/AltClick(var/mob/living/user)
/obj/machinery/portable_atmospherics/hydroponics/click_alt(var/mob/living/user)
if(!istype(user))
return
if(mechanical && !user.incapacitated() && Adjacent(user))

View File

@@ -43,7 +43,7 @@
if(IC)
. += IC.examine(user)
/obj/item/clothing/CtrlShiftClick(mob/user)
/obj/item/clothing/click_ctrl_shift(mob/user)
var/turf/T = get_turf(src)
if(!T.AdjacentQuick(user)) // So people aren't messing with these from across the room
return FALSE

View File

@@ -69,7 +69,7 @@
/obj/item/walkpod/proc/update_music()
listener?.force_music(media_url, media_start_time, volume) // Calling this with "" url (when we aren't playing) helpfully disables forced music
/obj/item/walkpod/AltClick(mob/living/L)
/obj/item/walkpod/click_alt(mob/living/L)
if(L == listener && check_listener())
tgui_interact(L)
else if(loc == L) // at least they're holding it

View File

@@ -101,7 +101,7 @@
scan_time = 0.5 SECONDS
exact = TRUE
/obj/item/mining_scanner/advanced/AltClick(mob/user)
/obj/item/mining_scanner/advanced/click_alt(mob/user)
change_size()
/obj/item/mining_scanner/advanced/verb/change_size()

View File

@@ -153,7 +153,7 @@
var/digspeed = 40
var/grave_mode = FALSE
/obj/item/shovel/AltClick(mob/user)
/obj/item/shovel/click_alt(mob/user)
grave_mode = !grave_mode
to_chat(user, span_notice("You'll now dig [grave_mode ? "out graves" : "for loot"]."))
. = ..()

View File

@@ -22,7 +22,7 @@
/obj/item/robotanalyzer/attack(mob/living/M as mob, mob/living/user as mob)
do_scan(M, user)
/obj/item/robotanalyzer/AltClick(mob/user)
/obj/item/robotanalyzer/click_alt(mob/user)
mode = !mode
user.show_message(span_blue("[mode ? "Toggled to cyborg analyzing mode." : "Toggled to cyborg upgrade scan mode."]"), 1)

View File

@@ -19,7 +19,7 @@
/obj/item/borg/cloak/attack_self(mob/user)
set_cloak_level(user)
/obj/item/borg/cloak/CtrlClick(mob/user)
/obj/item/borg/cloak/item_ctrl_click(mob/user)
toggle_cloak(user)
return

View File

@@ -525,7 +525,7 @@
exact = TRUE
to_chat(user, span_notice("You've upgraded the mining scanner for [upgrade_cost] points."))
/obj/item/mining_scanner/robot/AltClick(mob/user)
/obj/item/mining_scanner/robot/click_alt(mob/user)
change_size(user)
/obj/item/mining_scanner/robot/proc/change_size(mob/user)

View File

@@ -29,7 +29,7 @@
var/list/integrated_tool_images
/obj/item/robotic_multibelt/CtrlClick(mob/user)
/obj/item/robotic_multibelt/item_ctrl_click(mob/user)
if(selected_item)
selected_item.attack_self(user)
return
@@ -597,13 +597,13 @@
. += span_notice("\The [src] is holding \the [wrapped].")
. += wrapped.examine(user)
/obj/item/gripper/CtrlClick(mob/user)
/obj/item/gripper/item_ctrl_click(mob/user)
var/obj/item/wrapped = get_current_pocket()
if(wrapped && !is_in_use())
wrapped.attack_self(user)
return
/obj/item/gripper/AltClick(mob/user)
/obj/item/gripper/click_alt(mob/user)
if(!is_in_use())
drop_item()
return

View File

@@ -16,7 +16,7 @@
w_class = ITEMSIZE_NORMAL
var/icon_state_closed = "laptop-closed"
/obj/item/modular_computer/laptop/AltClick(mob/living/carbon/user)
/obj/item/modular_computer/laptop/click_alt(mob/living/carbon/user)
// We need to be close to it to open it
if((!in_range(src, user)) || user.stat || user.restrained())
return

View File

@@ -48,7 +48,7 @@
icon_state = "greetingcard"
slot_flags = null //no fun allowed!!!!
/obj/item/paper/card/AltClick() //No fun allowed
/obj/item/paper/card/click_alt() //No fun allowed
return
/obj/item/paper/card/update_icon()
@@ -89,7 +89,7 @@
/obj/item/paper/alien/burnpaper()
return
/obj/item/paper/alien/AltClick() // No airplanes for me.
/obj/item/paper/alien/click_alt() // No airplanes for me.
return

View File

@@ -93,7 +93,7 @@
E.damage += 2.5
H.emote("scream")
/obj/item/paper/AltClick(mob/living/carbon/user, obj/item/I)
/obj/item/paper/click_alt(mob/living/carbon/user, obj/item/I)
if ( istype(user) )
if( (!in_range(src, user)) || user.stat || user.restrained() )
return

View File

@@ -100,7 +100,7 @@
var/selectedColor = 1
var/colors = list("black","blue","red")
/obj/item/pen/AltClick(mob/user)
/obj/item/pen/click_alt(mob/user)
if(!Adjacent(user))
return
to_chat(user, span_notice("Click."))
@@ -181,7 +181,7 @@
active_icon_state = "[icon_state]-x"
default_icon_state = icon_state
/obj/item/pen/blade/AltClick(mob/user)
/obj/item/pen/blade/click_alt(mob/user)
..()
if(active)
deactivate(user)

View File

@@ -60,13 +60,13 @@
if(Adjacent(user))
. += "The time [stationtime2text()] is displayed in the corner of the screen."
/obj/item/pda/CtrlClick(mob/user)
/obj/item/pda/item_ctrl_click(mob/user)
if(can_use(user) && !issilicon(user))
remove_pen()
return
..()
/obj/item/pda/AltClick(mob/user)
/obj/item/pda/click_alt(mob/user)
if(issilicon(user))
return

View File

@@ -702,7 +702,7 @@ GLOBAL_LIST_EMPTY(apcs)
else
to_chat(user, span_warning("Access denied."))
/obj/machinery/power/apc/AltClick(mob/user)
/obj/machinery/power/apc/click_alt(mob/user)
..()
togglelock(user)

View File

@@ -265,7 +265,7 @@ GLOBAL_LIST_EMPTY(magazine_icondata_states)
drop_sound = 'sound/items/drop/matchbox.ogg'
pickup_sound = 'sound/items/pickup/matchbox.ogg'
/obj/item/ammo_magazine/ammo_box/AltClick(mob/user)
/obj/item/ammo_magazine/ammo_box/click_alt(mob/user)
if(can_remove_ammo)
if(isliving(user) && Adjacent(user))
if(stored_ammo.len)

View File

@@ -109,7 +109,7 @@
var/flight_x_offset = 0
var/flight_y_offset = 0
/obj/item/gun/CtrlClick(mob/user)
/obj/item/gun/item_ctrl_click(mob/user)
if(can_flashlight && ishuman(user) && loc == user && !user.incapacitated(INCAPACITATION_ALL))
toggle_flashlight()
else

View File

@@ -327,7 +327,7 @@
else
set_light(0)
/obj/item/melee/robotic/blade/AltClick(mob/living/user)
/obj/item/melee/robotic/blade/click_alt(mob/living/user)
if(!in_range(src, user)) //Basic checks to prevent abuse
return
if(user.incapacitated() || !istype(user))

View File

@@ -61,7 +61,7 @@
return
return ..()
/obj/item/gun/projectile/smartgun/AltClick(mob/user)
/obj/item/gun/projectile/smartgun/click_alt(mob/user)
if(ishuman(user) && !user.incapacitated() && Adjacent(user))
if(cycling)
to_chat(user, span_warning("[src] is still cycling!"))

View File

@@ -81,7 +81,7 @@
to_chat(user, span_warning("The alembic is already boiling!"))
return
/obj/machinery/alembic/AltClick(mob/user)
/obj/machinery/alembic/click_alt(mob/user)
if(potion_reagent == 0)
to_chat(user, span_warning("There is nothing in the alembic!"))
return

View File

@@ -70,7 +70,7 @@
/obj/structure/reagent_dispensers/blob_act()
qdel(src)
/obj/structure/reagent_dispensers/AltClick(mob/user)
/obj/structure/reagent_dispensers/click_alt(mob/user)
if(!Adjacent(user))
return

View File

@@ -133,7 +133,7 @@
//CHOMPedit end
return 0
/obj/machinery/reagentgrinder/AltClick(mob/user)
/obj/machinery/reagentgrinder/click_alt(mob/user)
. = ..()
if(user.incapacitated() || !Adjacent(user))
return

View File

@@ -112,7 +112,7 @@
update_icon()
/obj/machinery/injector_maker/AltClick(mob/user)
/obj/machinery/injector_maker/click_alt(mob/user)
. = ..()
if(beaker)
if(!user.incapacitated() && Adjacent(user))

View File

@@ -174,7 +174,7 @@
balloon_alert(user, "\The [W] burns the blood in \the [src].")
B.changling_blood_test(reagents)
/obj/item/reagent_containers/AltClick(mob/user)
/obj/item/reagent_containers/click_alt(mob/user)
. = ..()
if(!Adjacent(user))
return

View File

@@ -255,17 +255,15 @@
add_overlay(hose_overlay)
break
/obj/item/reagent_containers/spray/chemsprayer/hosed/AltClick(mob/living/carbon/user)
/obj/item/reagent_containers/spray/chemsprayer/hosed/click_alt(mob/living/carbon/user)
if(++spray_particles > 3) spray_particles = 1
balloon_alert(user, "dial turned to [spray_particles].")
return
/obj/item/reagent_containers/spray/chemsprayer/hosed/CtrlClick(var/mob/user)
/obj/item/reagent_containers/spray/chemsprayer/hosed/item_ctrl_click(mob/user)
if(loc != get_turf(src))
heavy_spray = !heavy_spray
else
. = ..()
/obj/item/reagent_containers/spray/chemsprayer/hosed/Spray_at(atom/A as mob|obj, mob/user)
update_icon()

View File

@@ -35,7 +35,7 @@
if(!reskin_ran)
. += span_notice("[src]'s external casing can be modified via alt-click.")
/obj/item/storage/part_replacer/AltClick(mob/user)
/obj/item/storage/part_replacer/click_alt(mob/user)
. = ..()
if(!reskin_ran)
reskin_radial(user)

View File

@@ -55,7 +55,7 @@
return
..()
/obj/vehicle/bike/CtrlClick(var/mob/user)
/obj/vehicle/bike/click_ctrl(mob/user)
if(Adjacent(user) && anchored)
toggle()
else
@@ -78,7 +78,7 @@
turn_off()
src.visible_message("\The [src] putters before turning off.", "You hear something putter slowly.")
/obj/vehicle/bike/AltClick(var/mob/user)
/obj/vehicle/bike/click_alt(var/mob/user)
if(Adjacent(user))
kickstand(user)
else

View File

@@ -208,7 +208,7 @@
. += "The charge meter reads [cell? round(cell.percent(), 0.01) : 0]%"
/obj/vehicle/train/engine/CtrlClick(var/mob/user)
/obj/vehicle/train/engine/click_ctrl(mob/user)
if(Adjacent(user))
if(on)
stop_engine()
@@ -217,7 +217,7 @@
else
return ..()
/obj/vehicle/train/engine/AltClick(var/mob/user)
/obj/vehicle/train/engine/click_alt(var/mob/user)
if(Adjacent(user))
remove_key()
else

View File

@@ -1929,7 +1929,7 @@ Departamental Swimsuits, for general use
return
..()
/obj/item/clothing/head/fluff/nikki/AltClick(mob/user)
/obj/item/clothing/head/fluff/nikki/click_alt(mob/user)
if (translocator && (user.get_inactive_hand() == src))
translocator_unequip(translocator, user)

Some files were not shown because too many files have changed in this diff Show More