Interaction/Attack Hand Refactor (#36405)

This commit is contained in:
kevinz000
2018-03-23 11:20:54 +01:00
committed by AnturK
parent 80f6e451fc
commit f300a5c155
347 changed files with 1483 additions and 1186 deletions
+23 -2
View File
@@ -37,8 +37,8 @@
#define EXAMINE_POSITION_BEFORE 2
//End positions
#define COMPONENT_EXNAME_CHANGED 1
#define COMSIG_ATOM_ENTERED "atom_entered" //from base of atom/Entered(): (/atom/movable, /atom)
#define COMSIG_ATOM_EXITED "atom_exited" //from base of atom/Exited(): (/atom/movable)
#define COMSIG_ATOM_ENTERED "atom_entered" //from base of atom/Entered(): (atom/movable/entering, /atom)
#define COMSIG_ATOM_EXITED "atom_exited" //from base of atom/Exited(): (atom/movable/exiting, atom/newloc)
#define COMSIG_ATOM_EX_ACT "atom_ex_act" //from base of atom/ex_act(): (severity, target)
#define COMSIG_ATOM_EMP_ACT "atom_emp_act" //from base of atom/emp_act(): (severity)
#define COMSIG_ATOM_FIRE_ACT "atom_fire_act" //from base of atom/fire_act(): (exposed_temperature, exposed_volume)
@@ -54,19 +54,32 @@
#define COMSIG_ATOM_SET_LIGHT "atom_set_light" //from base of atom/set_light(): (l_range, l_power, l_color)
#define COMSIG_ATOM_ROTATE "atom_rotate" //from base of atom/shuttleRotate(): (rotation, params)
#define COMSIG_ATOM_DIR_CHANGE "atom_dir_change" //from base of atom/setDir(): (old_dir, new_dir)
#define COMSIG_ENTER_AREA "enter_area" //from base of area/Entered(): (/area)
#define COMSIG_EXIT_AREA "exit_area" //from base of area/Exited(): (/area)
#define COMSIG_ATOM_CONTENTS_DEL "atom_contents_del" //from base of atom/handle_atom_del(): (atom/deleted)
/////////////////
#define COMSIG_ATOM_ATTACK_GHOST "atom_attack_ghost" //from base of atom/attack_ghost(): (mob/dead/observer/ghost)
#define COMSIG_ATOM_ATTACK_HAND "atom_attack_hand" //from base of atom/attack_hand(): (mob/user)
#define COMSIG_ATOM_ATTACK_PAW "atom_attack_paw" //from base of atom/attack_paw(): (mob/user)
#define COMPONENT_NO_ATTACK_HAND 1 //works on all 3.
/////////////////
#define COMSIG_CLICK "atom_click" //from base of atom/Click(): (location, control, params)
#define COMSIG_CLICK_SHIFT "shift_click" //from base of atom/ShiftClick(): (/mob)
#define COMSIG_CLICK_CTRL "ctrl_click" //from base of atom/CtrlClickOn(): (/mob)
#define COMSIG_CLICK_ALT "alt_click" //from base of atom/AltClick(): (/mob)
#define COMSIG_CLICK_CTRL_SHIFT "ctrl_shift_click" //from base of atom/CtrlShiftClick(/mob)
#define COMSIG_MOUSEDROP_ONTO "mousedrop_onto" //from base of atom/MouseDrop(): (/atom/over, /mob/user)
#define COMPONENT_NO_MOUSEDROP 1
#define COMSIG_MOUSEDROPPED_ONTO "mousedropped_onto" //from base of atom/MouseDrop_T: (/atom/from, /mob/user)
// /area signals
#define COMSIG_AREA_ENTERED "area_entered" //from base of area/Entered(): (atom/movable/M)
#define COMSIG_AREA_EXITED "area_exited" //from base of area/Exited(): (atom/movable/M)
// /atom/movable signals
#define COMSIG_MOVABLE_MOVED "movable_moved" //from base of atom/movable/Moved(): (/atom, dir)
#define COMSIG_MOVABLE_CROSSED "movable_crossed" //from base of atom/movable/Crossed(): (/atom/movable)
@@ -74,13 +87,21 @@
#define COMSIG_MOVABLE_IMPACT "movable_impact" //from base of atom/movable/throw_impact(): (/atom, throwingdatum)
#define COMSIG_MOVABLE_BUCKLE "buckle" //from base of atom/movable/buckle_mob(): (mob, force)
#define COMSIG_MOVABLE_UNBUCKLE "unbuckle" //from base of atom/movable/unbuckle_mob(): (mob, force)
#define COMSIG_MOVABLE_THROW "movable_throw" //from base of atom/movable/throw_at(): (datum/thrownthing, spin)
// /obj signals
#define COMSIG_OBJ_DECONSTRUCT "obj_deconstruct" //from base of obj/deconstruct(): (disassembled)
// /obj/item signals
#define COMSIG_ITEM_ATTACK "item_attack" //from base of obj/item/attack(): (/mob/living/target, /mob/living/user)
#define COMSIG_ITEM_ATTACK_SELF "item_attack_self" //from base of obj/item/attack_self(): (/mob)
#define COMSIG_ITEM_ATTACK_OBJ "item_attack_obj" //from base of obj/item/attack_obj(): (/obj, /mob)
#define COMPONENT_NO_ATTACK_OBJ 1
#define COMSIG_ITEM_PRE_ATTACK "item_pre_attack" //from base of obj/item/pre_attack(): (atom/target, mob/user, params)
#define COMPONENT_NO_ATTACK 1
#define COMSIG_ITEM_EQUIPPED "item_equip" //from base of obj/item/equipped(): (/mob/equipper, slot)
#define COMSIG_ITEM_DROPPED "item_drop" //from base of obj/item/dropped(): (/mob/dropper)
#define COMSIG_ITEM_PICKUP "item_pickup" //from base of obj/item/pickup(): (/mob/taker)
// /obj/item/clothing signals
#define COMSIG_SHOES_STEP_ACTION "shoes_step_action" //from base of obj/item/clothing/shoes/proc/step_action(): ()
+22
View File
@@ -0,0 +1,22 @@
#define INTERACT_ATOM_REQUIRES_ANCHORED 1 //whether can_interact() checks for anchored. only works on movables.
#define INTERACT_ATOM_ATTACK_HAND 2 //calls try_interact() on attack_hand() and returns that.
#define INTERACT_ATOM_UI_INTERACT 4 //automatically calls and returns ui_interact() on interact().
#define INTERACT_ATOM_REQUIRES_DEXTERITY 8 //user must be dextrous
#define INTERACT_ATOM_IGNORE_INCAPACITATED 16 //ignores incapacitated check
#define INTERACT_ATOM_IGNORE_RESTRAINED 32 //incapacitated check ignores restrained
#define INTERACT_ATOM_CHECK_GRAB 64 //incapacitated check checks grab
#define INTERACT_ATOM_NO_FINGERPRINT_ATTACK_HAND 128//prevents leaving fingerprints automatically on attack_hand
#define INTERACT_ATOM_NO_FINGERPRINT_INTERACT 256 //adds hiddenprints instead of fingerprints on interact
#define INTERACT_ITEM_ATTACK_HAND_PICKUP 1 //attempt pickup on attack_hand for items
#define INTERACT_MACHINE_OPEN 1 //can_interact() while open
#define INTERACT_MACHINE_OFFLINE 2 //can_interact() while offline
#define INTERACT_MACHINE_WIRES_IF_OPEN 4 //try to interact with wires if open
#define INTERACT_MACHINE_ALLOW_SILICON 8 //let silicons interact
#define INTERACT_MACHINE_OPEN_SILICON 16 //let silicons interact while open
#define INTERACT_MACHINE_REQUIRES_SILICON 32 //must be silicon to interact
#define INTERACT_MACHINE_SET_MACHINE 64 //MACHINES HAVE THIS BY DEFAULT, SOMEONE SHOULD RUN THROUGH MACHINES AND REMOVE IT FROM THINGS LIKE LIGHT SWITCHES WHEN POSSIBLE!!--------------------------
//This flag determines if a machine set_machine's the user when the user uses it, making updateUsrDialog make the user re-call interact() on it.
//THIS FLAG IS ON ALL MACHINES BY DEFAULT, NEEDS TO BE RE-EVALUATED LATER!!
+2
View File
@@ -90,6 +90,8 @@
//Silicon mobs
#define issilicon(A) (istype(A, /mob/living/silicon))
#define issiliconoradminghost(A) (istype(A, /mob/living/silicon) || IsAdminGhost(A))
#define iscyborg(A) (istype(A, /mob/living/silicon/robot))
#define isAI(A) (istype(A, /mob/living/silicon/ai))
+1
View File
@@ -8,6 +8,7 @@
#define DANGEROUS_POSSESSION 16 //Admin possession yes/no
#define ON_BLUEPRINTS 32 //Are we visible on the station blueprints at roundstart?
#define UNIQUE_RENAME 64 // can you customize the description/name of the thing?
#define USES_TGUI 128 //put on things that use tgui on ui_interact instead of custom/old UI.
// If you add new ones, be sure to add them to /obj/Initialize as well for complete mapping support
+5
View File
@@ -1,3 +1,8 @@
//retvals for attempt_wires_interaction
#define WIRE_INTERACTION_FAIL 0
#define WIRE_INTERACTION_SUCCESSFUL 1
#define WIRE_INTERACTION_BLOCK 2 //don't do anything else rather than open wires and whatever else.
#define WIRE_DUD_PREFIX "__dud"
#define WIRE_ACTIVATE "Activate"
#define WIRE_AI "AI Connection"
+1 -1
View File
@@ -539,7 +539,7 @@ Turf and target are separate in case you want to teleport some distance from a t
return assembled
/atom/proc/GetAllContentsIgnoring(list/ignore_typecache)
if(!ignore_typecache)
if(!length(ignore_typecache))
return GetAllContents()
var/list/processing = list(src)
var/list/assembled = list()
+7 -1
View File
@@ -9,4 +9,10 @@
var/list/viewrangelist = splittext(view,"x")
viewX = text2num(viewrangelist[1])
viewY = text2num(viewrangelist[2])
return list(viewX, viewY)
return list(viewX, viewY)
/proc/in_view_range(mob/user, atom/A)
var/list/view_range = getviewsize(user.client.view)
var/turf/source = get_turf(user)
var/turf/target = get_turf(A)
return ISINRANGE(target.x, source.x - view_range[1], source.x + view_range[1]) && ISINRANGE(target.y, source.y - view_range[1], source.y + view_range[1])
+4
View File
@@ -1,7 +1,11 @@
//#define TESTING //By using the testing("message") proc you can create debug-feedback for people with this
//uncommented, but not visible in the release version)
//#define DATUMVAR_DEBUGGING_MODE //Enables the ability to cache datum vars and retrieve later for debugging which vars changed.
#ifdef TESTING
#define DATUMVAR_DEBUGGING_MODE
//#define GC_FAILURE_HARD_LOOKUP //makes paths that fail to GC call find_references before del'ing.
//implies FIND_REF_NO_CHECK_TICK
+111
View File
@@ -0,0 +1,111 @@
GLOBAL_LIST_INIT(bitfields, list(
"obj_flags" = list(
"EMAGGED" = EMAGGED,
"IN_USE" = IN_USE,
"CAN_BE_HIT" = CAN_BE_HIT,
"BEING_SHOCKED" = BEING_SHOCKED,
"DANGEROUS_POSSESSION" = DANGEROUS_POSSESSION,
"ON_BLUEPRINTS" = ON_BLUEPRINTS,
"UNIQUE_RENAME" = UNIQUE_RENAME,
"USES_TGUI" = USES_TGUI
),
"datum_flags" = list(
"DF_USE_TAG" = DF_USE_TAG,
"DF_VAR_EDITED" = DF_VAR_EDITED
),
"item_flags" = list(
"BEING_REMOVED" = BEING_REMOVED,
"IN_INVENTORY" = IN_INVENTORY,
"FORCE_STRING_OVERRIDE" = FORCE_STRING_OVERRIDE,
"NEEDS_PERMIT" = NEEDS_PERMIT
),
"admin_flags" = list(
"BUILDMODE" = R_BUILDMODE,
"ADMIN" = R_ADMIN,
"BAN" = R_BAN,
"FUN" = R_FUN,
"SERVER" = R_SERVER,
"DEBUG" = R_DEBUG,
"POSSESS" = R_POSSESS,
"PERMISSIONS" = R_PERMISSIONS,
"STEALTH" = R_STEALTH,
"POLL" = R_POLL,
"VAREDIT" = R_VAREDIT,
"SOUNDS" = R_SOUNDS,
"SPAWN" = R_SPAWN,
"AUTOLOGIN" = R_AUTOLOGIN,
"DBRANKS" = R_DBRANKS
),
"interaction_flags_atom" = list(
"INTERACT_ATOM_REQUIRES_ANCHORED" = INTERACT_ATOM_REQUIRES_ANCHORED,
"INTERACT_ATOM_ATTACK_HAND" = INTERACT_ATOM_ATTACK_HAND,
"INTERACT_ATOM_UI_INTERACT" = INTERACT_ATOM_UI_INTERACT,
"INTERACT_ATOM_REQUIRES_DEXTERITY" = INTERACT_ATOM_REQUIRES_DEXTERITY,
"INTERACT_ATOM_IGNORE_INCAPACITATED" = INTERACT_ATOM_IGNORE_INCAPACITATED,
"INTERACT_ATOM_IGNORE_RESTRAINED" = INTERACT_ATOM_IGNORE_RESTRAINED,
"INTERACT_ATOM_CHECK_GRAB" = INTERACT_ATOM_CHECK_GRAB,
"INTERACT_ATOM_NO_FINGERPRINT_ATTACK_HAND" = INTERACT_ATOM_NO_FINGERPRINT_ATTACK_HAND,
"INTERACT_ATOM_NO_FINGERPRINT_INTERACT" = INTERACT_ATOM_NO_FINGERPRINT_INTERACT
),
"interaction_flags_machine" = list(
"INTERACT_MACHINE_OPEN" = INTERACT_MACHINE_OPEN,
"INTERACT_MACHINE_OFFLINE" = INTERACT_MACHINE_OFFLINE,
"INTERACT_MACHINE_WIRES_IF_OPEN" = INTERACT_MACHINE_WIRES_IF_OPEN,
"INTERACT_MACHINE_ALLOW_SILICON" = INTERACT_MACHINE_ALLOW_SILICON,
"INTERACT_MACHINE_OPEN_SILICON" = INTERACT_MACHINE_OPEN_SILICON,
"INTERACT_MACHINE_REQUIRES_SILICON" = INTERACT_MACHINE_REQUIRES_SILICON
),
"pass_flags" = list(
"PASSTABLE" = PASSTABLE,
"PASSGLASS" = PASSGLASS,
"PASSGRILLE" = PASSGRILLE,
"PASSBLOB" = PASSBLOB,
"PASSMOB" = PASSMOB,
"PASSCLOSEDTURF" = PASSCLOSEDTURF,
"LETPASSTHROW" = LETPASSTHROW
),
"movement_type" = list(
"GROUND" = GROUND,
"FLYING" = FLYING
),
"resistance_flags" = list(
"LAVA_PROOF" = LAVA_PROOF,
"FIRE_PROOF" = FIRE_PROOF,
"FLAMMABLE" = FLAMMABLE,
"ON_FIRE" = ON_FIRE,
"UNACIDABLE" = UNACIDABLE,
"ACID_PROOF" = ACID_PROOF,
"INDESTRUCTIBLE" = INDESTRUCTIBLE,
"FREEZE_PROOF" = FREEZE_PROOF
),
"reagents_holder_flags" = list(
"REAGENT_NOREACT" = REAGENT_NOREACT
),
"flags_1" = list(
"STOPSPRESSUREDMAGE_1 / NOJAUNT_1 (turfs)" = STOPSPRESSUREDMAGE_1,
"NODROP_1 / UNUSED_TRANSIT_TURF_1 (turfs)" = NODROP_1,
"NOBLUDGEON_1 / CAN_BE_DIRTY_1 (turfs)" = NOBLUDGEON_1,
"MASKINTERNALS_1" = MASKINTERNALS_1,
"HEAR_1 / NO_DEATHRATTLE_1 (turfs)" = HEAR_1,
"CHECK_RICOCHET_1 / NO_RUINS_1 (turfs)" = CHECK_RICOCHET_1,
"CONDUCT_1 / NO_LAVA_GEN_1" = CONDUCT_1,
"ABSTRACT_1" = ABSTRACT_1,
"NODECONSTRUCT_1" = NODECONSTRUCT_1,
"OVERLAY_QUEUED_1" = OVERLAY_QUEUED_1,
"NOSLIP_1" = NOSLIP_1
),
"flags_2" = list(
"SLOWS_WHILE_IN_HAND_2" = SLOWS_WHILE_IN_HAND_2,
"NO_EMP_WIRES_2" = NO_EMP_WIRES_2,
"HOLOGRAM_2" = HOLOGRAM_2,
"FRONZE_2" = FROZEN_2,
"STATIONLOVING_2" = STATIONLOVING_2,
"INFORM_ADMINS_ON_RELOCATE_2" = INFORM_ADMINS_ON_RELOCATE_2,
"BANG_PROTECT_2" = BANG_PROTECT_2,
"HEALS_EARS_2" = HEALS_EARS_2,
"OMNITONGUE_2" = OMNITONGUE_2,
"TESLA_IGNORE_2" = TESLA_IGNORE_2,
"NO_MAT_REDEMPTION_2" = NO_MAT_REDEMPTION_2,
"LAVA_PROTECT_2" = LAVA_PROTECT_2
)
))
-7
View File
@@ -18,10 +18,3 @@ GLOBAL_LIST_EMPTY(powernets)
GLOBAL_VAR_INIT(bsa_unlock, FALSE) //BSA unlocked by head ID swipes
GLOBAL_LIST_EMPTY(player_details) // ckey -> /datum/player_details
GLOBAL_LIST_INIT(bitfields, list(
"obj_flags" = list("EMAGGED" = EMAGGED, "IN_USE" = IN_USE, "CAN_BE_HIT" = CAN_BE_HIT, "BEING_SHOCKED" = BEING_SHOCKED, "DANGEROUS_POSSESSION" = DANGEROUS_POSSESSION, "ON_BLUEPRINTS" = ON_BLUEPRINTS, "UNIQUE_RENAME" = UNIQUE_RENAME),
"datum_flags" = list("DF_USE_TAG" = DF_USE_TAG, "DF_VAR_EDITED" = DF_VAR_EDITED),
"item_flags" = list("BEING_REMOVED" = BEING_REMOVED, "IN_INVENTORY" = IN_INVENTORY, "FORCE_STRING_OVERRIDE" = FORCE_STRING_OVERRIDE, "NEEDS_PERMIT" = NEEDS_PERMIT),
"admin_flags" = list("BUILDMODE" = R_BUILDMODE, "ADMIN" = R_ADMIN, "BAN" = R_BAN, "FUN" = R_FUN, "SERVER" = R_SERVER, "DEBUG" = R_DEBUG, "POSSESS" = R_POSSESS, "PERMISSIONS" = R_PERMISSIONS, "STEALTH" = R_STEALTH, "POLL" = R_POLL, "VAREDIT" = R_VAREDIT, "SOUNDS" = R_SOUNDS, "SPAWN" = R_SPAWN, "AUTOLOGIN" = R_AUTOLOGIN, "DBRANKS" = R_DBRANKS)
))
+4 -14
View File
@@ -189,23 +189,13 @@
return FALSE
/atom/movable/proc/DirectAccess(atom/target)
if(target == src)
return TRUE
if(target == loc)
return TRUE
return (target == src || target == loc)
/mob/DirectAccess(atom/target)
if(..())
return TRUE
if(target in contents) //This could probably use moving down and restricting to inventory only
return TRUE
return FALSE
return (..() || (target in contents))
/mob/living/DirectAccess(atom/target)
if(..()) //Lightweight checks first
return TRUE
if(target in GetAllContents())
return TRUE
return (..() || (target in GetAllContents()))
/atom/proc/AllowClick()
return FALSE
@@ -497,7 +487,7 @@
if(client && client.click_intercept)
if(call(client.click_intercept, "InterceptClickOn")(src, params, A))
return TRUE
//Mob level intercept
if(click_intercept)
if(call(click_intercept, "InterceptClickOn")(src, params, A))
+28 -28
View File
@@ -55,35 +55,35 @@
var/obj/item/W = get_active_held_item()
if(!W && get_dist(src,A) <= remote_range)
if(!W && get_dist(src,A) <= interaction_range)
A.attack_robot(src)
return
// buckled cannot prevent machine interlinking but stops arm movement
if( buckled || incapacitated())
return
if(W)
// buckled cannot prevent machine interlinking but stops arm movement
if( buckled || incapacitated())
return
if(W == A)
W.attack_self(src)
return
if(W == A)
W.attack_self(src)
return
// cyborgs are prohibited from using storage items so we can I think safely remove (A.loc in contents)
if(A == loc || (A in loc) || (A in contents))
W.melee_attack_chain(src, A, params)
return
if(!isturf(loc))
return
// cyborgs are prohibited from using storage items so we can I think safely remove (A.loc && isturf(A.loc.loc))
if(isturf(A) || isturf(A.loc))
if(A.Adjacent(src)) // see adjacent.dm
// cyborgs are prohibited from using storage items so we can I think safely remove (A.loc in contents)
if(A == loc || (A in loc) || (A in contents))
W.melee_attack_chain(src, A, params)
return
else
W.afterattack(A, src, 0, params)
if(!isturf(loc))
return
return
// cyborgs are prohibited from using storage items so we can I think safely remove (A.loc && isturf(A.loc.loc))
if(isturf(A) || isturf(A.loc))
if(A.Adjacent(src)) // see adjacent.dm
W.melee_attack_chain(src, A, params)
return
else
W.afterattack(A, src, 0, params)
return
//Middle click cycles through selected modules.
/mob/living/silicon/robot/MiddleClickOn(atom/A)
@@ -105,7 +105,7 @@
CtrlShiftClick(user)
/obj/machinery/door/airlock/BorgCtrlShiftClick(mob/living/silicon/robot/user) // Sets/Unsets Emergency Access Override Forwards to AI code.
if(get_dist(src,user) <= user.remote_range)
if(get_dist(src,user) <= user.interaction_range)
AICtrlShiftClick()
else
..()
@@ -115,7 +115,7 @@
ShiftClick(user)
/obj/machinery/door/airlock/BorgShiftClick(mob/living/silicon/robot/user) // Opens and closes doors! Forwards to AI code.
if(get_dist(src,user) <= user.remote_range)
if(get_dist(src,user) <= user.interaction_range)
AIShiftClick()
else
..()
@@ -125,19 +125,19 @@
CtrlClick(user)
/obj/machinery/door/airlock/BorgCtrlClick(mob/living/silicon/robot/user) // Bolts doors. Forwards to AI code.
if(get_dist(src,user) <= user.remote_range)
if(get_dist(src,user) <= user.interaction_range)
AICtrlClick()
else
..()
/obj/machinery/power/apc/BorgCtrlClick(mob/living/silicon/robot/user) // turns off/on APCs. Forwards to AI code.
if(get_dist(src,user) <= user.remote_range)
if(get_dist(src,user) <= user.interaction_range)
AICtrlClick()
else
..()
/obj/machinery/turretid/BorgCtrlClick(mob/living/silicon/robot/user) //turret control on/off. Forwards to AI code.
if(get_dist(src,user) <= user.remote_range)
if(get_dist(src,user) <= user.interaction_range)
AICtrlClick()
else
..()
@@ -147,13 +147,13 @@
return
/obj/machinery/door/airlock/BorgAltClick(mob/living/silicon/robot/user) // Eletrifies doors. Forwards to AI code.
if(get_dist(src,user) <= user.remote_range)
if(get_dist(src,user) <= user.interaction_range)
AIAltClick()
else
..()
/obj/machinery/turretid/BorgAltClick(mob/living/silicon/robot/user) //turret lethal on/off. Forwards to AI code.
if(get_dist(src,user) <= user.remote_range)
if(get_dist(src,user) <= user.interaction_range)
AIAltClick()
else
..()
+3
View File
@@ -8,6 +8,8 @@
/atom/MouseDrop(atom/over, src_location, over_location, src_control, over_control, params)
if(!usr || !over)
return
if(SendSignal(COMSIG_MOUSEDROP_ONTO, over, usr) & COMPONENT_NO_MOUSEDROP) //Whatever is recieving will verify themselves for adjacency.
return
if(over == src)
return usr.client.Click(src, src_location, src_control, params)
if(!Adjacent(usr) || !over.Adjacent(usr))
@@ -18,4 +20,5 @@
// recieve a mousedrop
/atom/proc/MouseDrop_T(atom/dropping, mob/user)
SendSignal(COMSIG_MOUSEDROPPED_ONTO, dropping, user)
return
+6 -3
View File
@@ -1,6 +1,6 @@
/obj/item/proc/melee_attack_chain(mob/user, atom/target, params)
if(!tool_attack_chain(user, target) && pre_attackby(target, user, params))
if(!tool_attack_chain(user, target) && pre_attack(target, user, params))
// Return 1 in attackby() to prevent afterattack() effects (when safely moving items for example)
var/resolved = target.attackby(src, user, params)
if(!resolved && target && !QDELETED(src))
@@ -20,7 +20,9 @@
SendSignal(COMSIG_ITEM_ATTACK_SELF, user)
interact(user)
/obj/item/proc/pre_attackby(atom/A, mob/living/user, params) //do stuff before attackby!
/obj/item/proc/pre_attack(atom/A, mob/living/user, params) //do stuff before attackby!
if(SendSignal(COMSIG_ITEM_PRE_ATTACK, A, user, params) & COMPONENT_NO_ATTACK)
return FALSE
return TRUE //return FALSE to avoid calling attackby after this proc does stuff
// No comment
@@ -75,7 +77,8 @@
//the equivalent of the standard version of attack() but for object targets.
/obj/item/proc/attack_obj(obj/O, mob/living/user)
SendSignal(COMSIG_ITEM_ATTACK_OBJ, O, user)
if(SendSignal(COMSIG_ITEM_ATTACK_OBJ, O, user) & COMPONENT_NO_ATTACK_OBJ)
return
if(flags_1 & NOBLUDGEON_1)
return
user.changeNext_move(CLICK_CD_MELEE)
+7 -6
View File
@@ -48,17 +48,19 @@
// Oh by the way this didn't work with old click code which is why clicking shit didn't spam you
/atom/proc/attack_ghost(mob/dead/observer/user)
if(SendSignal(COMSIG_ATOM_ATTACK_GHOST, user) & COMPONENT_NO_ATTACK_HAND)
return TRUE
if(user.client)
if(IsAdminGhost(user))
attack_ai(user)
else if(user.client.prefs.inquisitive_ghost)
user.examinate(src)
return FALSE
/mob/living/attack_ghost(mob/dead/observer/user)
if(user.client && user.health_scan)
healthscan(user, src, 1, TRUE)
return
..()
return ..()
// ---------------------------------------
// And here are some good things for free:
@@ -69,17 +71,16 @@
user.forceMove(awaygate.loc)
else
to_chat(user, "[src] has no destination.")
return ..()
/obj/machinery/gateway/centeraway/attack_ghost(mob/user)
if(stationgate)
user.forceMove(stationgate.loc)
else
to_chat(user, "[src] has no destination.")
/obj/item/storage/attack_ghost(mob/user)
orient2hud(user)
show_to(user)
return ..()
/obj/machinery/teleport/hub/attack_ghost(mob/user)
if(power_station && power_station.engaged && power_station.teleporter_console && power_station.teleporter_console.target)
user.forceMove(get_turf(power_station.teleporter_console.target))
return ..()
+46 -4
View File
@@ -27,13 +27,50 @@
SendSignal(COMSIG_HUMAN_MELEE_UNARMED_ATTACK, A)
A.attack_hand(src)
SendSignal(COMSIG_HUMAN_MELEE_UNARMED_ATTACKBY, src)
//Return TRUE to cancel other attack hand effects that respect it.
/atom/proc/attack_hand(mob/user)
return
. = FALSE
if(!(interaction_flags_atom & INTERACT_ATOM_NO_FINGERPRINT_ATTACK_HAND))
add_fingerprint(user)
if(SendSignal(COMSIG_ATOM_ATTACK_HAND, user) & COMPONENT_NO_ATTACK_HAND)
. = TRUE
if(interaction_flags_atom & INTERACT_ATOM_ATTACK_HAND)
. = _try_interact(user)
//Return a non FALSE value to cancel whatever called this from propagating, if it respects it.
/atom/proc/_try_interact(mob/user)
if(IsAdminGhost(user)) //admin abuse
return interact(user)
if(can_interact(user))
return interact(user)
return FALSE
/atom/proc/can_interact(mob/user)
if(!user.can_interact_with(src))
return FALSE
if((interaction_flags_atom & INTERACT_ATOM_REQUIRES_DEXTERITY) && !user.IsAdvancedToolUser())
to_chat(user, "<span class='warning'>You don't have the dexterity to do this!</span>")
return FALSE
if(!(interaction_flags_atom & INTERACT_ATOM_IGNORE_INCAPACITATED) && user.incapacitated((interaction_flags_atom & INTERACT_ATOM_IGNORE_RESTRAINED), !(interaction_flags_atom & INTERACT_ATOM_CHECK_GRAB)))
return FALSE
return TRUE
/atom/movable/can_interact(mob/user)
. = ..()
if(!.)
return
if(!anchored && (interaction_flags_atom & INTERACT_ATOM_REQUIRES_ANCHORED))
return FALSE
/atom/proc/interact(mob/user)
return
if(interaction_flags_atom & INTERACT_ATOM_NO_FINGERPRINT_INTERACT)
add_hiddenprint(user)
else
add_fingerprint(user)
if(interaction_flags_atom & INTERACT_ATOM_UI_INTERACT)
return ui_interact(user)
return FALSE
/*
/mob/living/carbon/human/RestrainedClickOn(var/atom/A) ---carbons will handle this
@@ -72,8 +109,11 @@
*/
/mob/living/carbon/monkey/UnarmedAttack(atom/A)
A.attack_paw(src)
/atom/proc/attack_paw(mob/user)
return
if(SendSignal(COMSIG_ATOM_ATTACK_PAW, user) & COMPONENT_NO_ATTACK_HAND)
return TRUE
return FALSE
/*
Monkey RestrainedClickOn() was apparently the
@@ -115,9 +155,11 @@
*/
/mob/living/carbon/alien/UnarmedAttack(atom/A)
A.attack_alien(src)
/atom/proc/attack_alien(mob/living/carbon/alien/user)
attack_paw(user)
return
/mob/living/carbon/alien/RestrainedClickOn(atom/A)
return
-3
View File
@@ -104,9 +104,6 @@
qdel(src)
return
/obj/item/tk_grab/attack_hand(mob/user)
return
/obj/item/tk_grab/attack_self(mob/user)
if(!focus)
return
+1 -1
View File
@@ -31,4 +31,4 @@ SUBSYSTEM_DEF(npcpool)
if(SA.stat != DEAD)
SA.handle_automated_speech()
if (MC_TICK_CHECK)
return
return
+2 -2
View File
@@ -171,7 +171,7 @@ SUBSYSTEM_DEF(persistence)
/datum/controller/subsystem/persistence/proc/SetUpTrophies(list/trophy_items)
for(var/A in GLOB.trophy_cases)
var/obj/structure/displaycase/trophy/T = A
if (T.showpiece)
if (T.showpiece)
continue
T.added_roundstart = TRUE
@@ -275,7 +275,7 @@ SUBSYSTEM_DEF(persistence)
/datum/controller/subsystem/persistence/proc/CollectAntagReputation()
var/ANTAG_REP_MAXIMUM = CONFIG_GET(number/antag_rep_maximum)
for(var/p_ckey in antag_rep_change)
// var/start = antag_rep[p_ckey]
antag_rep[p_ckey] = max(0, min(antag_rep[p_ckey]+antag_rep_change[p_ckey], ANTAG_REP_MAXIMUM))
+1
View File
@@ -95,6 +95,7 @@
. = ..()
QDEL_IN(src, 300)
//ATTACK HAND IGNORING PARENT RETURN VALUE
/obj/effect/hallucination/simple/bluespace_stream/attack_hand(mob/user)
if(user != seer || !linked_to)
return
+31
View File
@@ -10,6 +10,10 @@
var/last_find_references = 0
#endif
#ifdef DATUMVAR_DEBUGGING_MODE
var/list/cached_vars
#endif
// Default implementation of clean-up code.
// This should be overridden to remove all references pointing to the object being destroyed.
// Return the appropriate QDEL_HINT; in most cases this is QDEL_HINT_QUEUE.
@@ -38,3 +42,30 @@
dc.Cut()
return QDEL_HINT_QUEUE
#ifdef DATUMVAR_DEBUGGING_MODE
/datum/proc/save_vars()
cached_vars = list()
for(var/i in vars)
if(i == "cached_vars")
continue
cached_vars[i] = vars[i]
/datum/proc/check_changed_vars()
. = list()
for(var/i in vars)
if(i == "cached_vars")
continue
if(cached_vars[i] != vars[i])
.[i] = list(cached_vars[i], vars[i])
/datum/proc/txt_changed_vars()
var/list/l = check_changed_vars()
var/t = "[src]([REF(src)]) changed vars:"
for(var/i in l)
t += "\"[i]\" \[[l[i][1]]\] --> \[[l[i][2]]\] "
t += "."
/datum/proc/to_chat_check_changed_vars(target = world)
to_chat(target, txt_changed_vars())
#endif
+1 -1
View File
@@ -87,7 +87,7 @@
var/number = backpack_contents[path]
if(!isnum(number))//Default to 1
number = 1
for(var/i=0,i<number,i++)
for(var/i in 1 to number)
H.equip_to_slot_or_del(new path(H),slot_in_backpack)
if(!H.head && toggle_helmet && istype(H.wear_suit, /obj/item/clothing/suit/space/hardsuit))
@@ -14,6 +14,14 @@
/atom
var/datum/wires/wires = null
/atom/proc/attempt_wire_interaction(mob/user)
if(!wires)
return WIRE_INTERACTION_FAIL
if(!user.CanReach(src))
return WIRE_INTERACTION_FAIL
wires.interact(user)
return WIRE_INTERACTION_BLOCK
/datum/wires
var/atom/holder = null // The holder (atom that contains these wires).
var/holder_type = null // The holder's typepath (used to make wire colors common to all holders).
-9
View File
@@ -19,7 +19,6 @@
var/obj/machinery/rnd/R = holder
var/list/status = list()
status += "The red light is [R.disabled ? "off" : "on"]."
status += "The green light is [R.shocked ? "off" : "on"]."
status += "The blue light is [R.hacked ? "off" : "on"]."
return status
@@ -31,12 +30,6 @@
R.hacked = !R.hacked
if(WIRE_DISABLE)
R.disabled = !R.disabled
if(WIRE_SHOCK)
R.shocked = TRUE
sleep(100)
if(R)
R.shocked = FALSE
/datum/wires/rnd/on_cut(wire, mend)
var/obj/machinery/rnd/R = holder
switch(wire)
@@ -44,5 +37,3 @@
R.hacked = !mend
if(WIRE_DISABLE)
R.disabled = !mend
if(WIRE_SHOCK)
R.shocked = !mend
+3 -2
View File
@@ -3,8 +3,9 @@
plane = GAME_PLANE
var/level = 2
var/flags_1 = 0
var/flags_2 = 0
var/flags_1 = NONE
var/flags_2 = NONE
var/interaction_flags_atom = NONE
var/container_type = NONE
var/admin_spawned = 0 //was this spawned by an admin? used for stat tracking stuff.
var/datum/reagents/reagents = null
+2 -3
View File
@@ -94,10 +94,9 @@
main_cult = C.cult_team
..()
/datum/game_mode/proc/add_cultist(datum/mind/cult_mind, stun , equip = FALSE) //BASE
if (!istype(cult_mind))
return 0
return FALSE
var/datum/antagonist/cult/new_cultist = new()
new_cultist.give_equipment = equip
@@ -105,7 +104,7 @@
if(cult_mind.add_antag_datum(new_cultist))
if(stun)
cult_mind.current.Unconscious(100)
return 1
return TRUE
/datum/game_mode/proc/remove_cultist(datum/mind/cult_mind, silent, stun)
if(cult_mind.current)
+3 -1
View File
@@ -8,7 +8,9 @@
var/datum/airlock_maker/maker = null
/obj/structure/door_assembly/attack_hand()
..()
. = ..()
if(.)
return
if(maker)
maker.interact()
+17 -16
View File
@@ -105,24 +105,25 @@
update_icon()
/obj/machinery/pdapainter/attack_hand(mob/user)
if(!..())
add_fingerprint(user)
. = ..()
if(.)
return
if(storedpda)
var/obj/item/device/pda/P
P = input(user, "Select your color!", "PDA Painting") as null|anything in colorlist
if(!P)
return
if(!in_range(src, user))
return
if(!storedpda)//is the pda still there?
return
storedpda.icon_state = P.icon_state
storedpda.desc = P.desc
ejectpda()
if(storedpda)
var/obj/item/device/pda/P
P = input(user, "Select your color!", "PDA Painting") as null|anything in colorlist
if(!P)
return
if(!in_range(src, user))
return
if(!storedpda)//is the pda still there?
return
storedpda.icon_state = P.icon_state
storedpda.desc = P.desc
ejectpda()
else
to_chat(user, "<span class='notice'>[src] is empty.</span>")
else
to_chat(user, "<span class='notice'>[src] is empty.</span>")
/obj/machinery/pdapainter/verb/ejectpda()
+34 -40
View File
@@ -92,6 +92,8 @@ Class Procs:
pressure_resistance = 15
max_integrity = 200
interaction_flags_atom = INTERACT_ATOM_ATTACK_HAND | INTERACT_ATOM_UI_INTERACT
var/stat = 0
var/use_power = IDLE_POWER_USE
//0 = dont run the auto
@@ -107,11 +109,11 @@ Class Procs:
var/critical_machine = FALSE //If this machine is critical to station operation and should have the area be excempted from power failures.
var/list/occupant_typecache //if set, turned into typecache in Initialize, other wise, defaults to mob/living typecache
var/atom/movable/occupant = null
var/interact_open = FALSE // Can the machine be interacted with when in maint/when the panel is open.
var/interact_offline = FALSE // Can the machine be interacted with while de-powered.
var/speed_process = FALSE // Process as fast as possible?
var/obj/item/circuitboard/circuit // Circuit to be created and inserted when the machinery is created
var/interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON | INTERACT_MACHINE_SET_MACHINE
/obj/machinery/Initialize()
if(!armor)
armor = list("melee" = 25, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 70)
@@ -155,7 +157,7 @@ Class Procs:
new /obj/effect/temp_visual/emp(loc)
..()
/obj/machinery/proc/open_machine(drop = 1)
/obj/machinery/proc/open_machine(drop = TRUE)
state_open = TRUE
density = FALSE
if(drop)
@@ -207,25 +209,29 @@ Class Procs:
/obj/machinery/proc/is_operational()
return !(stat & (NOPOWER|BROKEN|MAINT))
/obj/machinery/proc/is_interactable()
if((stat & (NOPOWER|BROKEN)) && !interact_offline)
/obj/machinery/can_interact(mob/user)
var/silicon = issiliconoradminghost(user)
if((stat & (NOPOWER|BROKEN)) && !(interaction_flags_machine & INTERACT_MACHINE_OFFLINE))
return FALSE
if(panel_open && !interact_open)
if(panel_open && !(interaction_flags_machine & INTERACT_MACHINE_OPEN))
if(!silicon || !(interaction_flags_machine & INTERACT_MACHINE_OPEN_SILICON))
return FALSE
if(!silicon && (interaction_flags_machine & INTERACT_MACHINE_REQUIRES_SILICON))
return FALSE
else if(silicon && !(interaction_flags_machine & INTERACT_MACHINE_ALLOW_SILICON))
return FALSE
return TRUE
////////////////////////////////////////////////////////////////////////////////////////////
//Return a non FALSE value to interrupt attack_hand propagation to subtypes.
/obj/machinery/interact(mob/user, special_state)
add_fingerprint(user)
if(special_state)
ui_interact(user, state = special_state)
else
ui_interact(user)
if(interaction_flags_machine & INTERACT_MACHINE_SET_MACHINE)
user.set_machine(src)
. = ..()
/obj/machinery/ui_status(mob/user)
if(is_interactable())
if(can_interact(user))
return ..()
return UI_CLOSE
@@ -235,18 +241,15 @@ Class Procs:
/obj/machinery/Topic(href, href_list)
..()
if(!is_interactable())
if(!can_interact(usr))
return 1
if(!usr.canUseTopic(src))
return 1
add_fingerprint(usr)
return 0
////////////////////////////////////////////////////////////////////////////////////////////
/obj/machinery/attack_paw(mob/living/user)
if(user.a_intent != INTENT_HARM)
return attack_hand(user)
@@ -256,32 +259,23 @@ Class Procs:
user.visible_message("<span class='danger'>[user.name] smashes against \the [src.name] with its paws.</span>", null, null, COMBAT_MESSAGE_RANGE)
take_damage(4, BRUTE, "melee", 1)
/obj/machinery/attack_robot(mob/user)
if(!(interaction_flags_machine & INTERACT_MACHINE_ALLOW_SILICON) && !IsAdminGhost(user))
return FALSE
return _try_interact(user)
/obj/machinery/attack_ai(mob/user)
if(!(interaction_flags_machine & INTERACT_MACHINE_ALLOW_SILICON) && !IsAdminGhost(user))
return FALSE
if(iscyborg(user))// For some reason attack_robot doesn't work
var/mob/living/silicon/robot/R = user
if(R.client && R.client.eye == R && !R.low_power_mode)// This is to stop robots from using cameras to remotely control machines; and from using machines when the borg has no power.
return attack_hand(user)
return attack_robot(user)
else
return attack_hand(user)
return _try_interact(user)
//set_machine must be 0 if clicking the machinery doesn't bring up a dialog
/obj/machinery/attack_hand(mob/user, check_power = 1, set_machine = 1)
if(..())// unbuckling etc
return 1
if((user.lying || user.stat) && !IsAdminGhost(user))
return 1
if(!user.IsAdvancedToolUser() && !IsAdminGhost(user))
to_chat(usr, "<span class='warning'>You don't have the dexterity to do this!</span>")
return 1
if(!is_interactable())
return 1
if(set_machine)
user.set_machine(src)
interact(user)
add_fingerprint(user)
return 0
/obj/machinery/_try_interact(mob/user)
if((interaction_flags_machine & INTERACT_MACHINE_WIRES_IF_OPEN) && panel_open && (attempt_wire_interaction(user) == WIRE_INTERACTION_BLOCK))
return TRUE
return ..()
/obj/machinery/CheckParts(list/parts_list)
..()
@@ -431,8 +425,8 @@ Class Procs:
display_parts(user)
if(shouldplaysound)
W.play_rped_sound()
return 1
return 0
return TRUE
return FALSE
/obj/machinery/proc/display_parts(mob/user)
to_chat(user, "<span class='notice'>It contains the following parts:</span>")
+1 -6
View File
@@ -30,12 +30,7 @@
else
icon_state = "ai-slipper1"
/obj/machinery/ai_slipper/attack_ai(mob/user)
return attack_hand(user)
/obj/machinery/ai_slipper/attack_hand(mob/user)
if(stat & (NOPOWER|BROKEN))
return
/obj/machinery/ai_slipper/interact(mob/user)
if(!allowed(user))
to_chat(user, "<span class='danger'>Access denied.</span>")
return
+3
View File
@@ -113,6 +113,9 @@
icon_state = "airlock_sensor_off"
/obj/machinery/airlock_sensor/attack_hand(mob/user)
. = ..()
if(.)
return
var/datum/signal/signal = new(list(
"tag" = master_tag,
"command" = "cycle"
+4 -1
View File
@@ -100,7 +100,8 @@ GLOBAL_LIST_EMPTY(announcement_systems)
//config stuff
/obj/machinery/announcement_system/interact(mob/user)
/obj/machinery/announcement_system/ui_interact(mob/user)
. = ..()
if(!user.canUseTopic(src, !issilicon(user)))
return
if(stat & BROKEN)
@@ -117,6 +118,8 @@ GLOBAL_LIST_EMPTY(announcement_systems)
popup.open()
/obj/machinery/announcement_system/Topic(href, href_list)
if(..())
return
if(!usr.canUseTopic(src, !issilicon(usr)))
return
if(stat & BROKEN)
+16 -14
View File
@@ -101,22 +101,24 @@
update_icon()
/obj/machinery/aug_manipulator/attack_hand(mob/user)
if(!..())
add_fingerprint(user)
. = ..()
if(.)
return
add_fingerprint(user)
if(storedpart)
var/augstyle = input(user, "Select style.", "Augment Custom Fitting") as null|anything in style_list_icons
if(!augstyle)
return
if(!in_range(src, user))
return
if(!storedpart)
return
storedpart.icon = style_list_icons[augstyle]
eject_part(user)
if(storedpart)
var/augstyle = input(user, "Select style.", "Augment Custom Fitting") as null|anything in style_list_icons
if(!augstyle)
return
if(!in_range(src, user))
return
if(!storedpart)
return
storedpart.icon = style_list_icons[augstyle]
eject_part(user)
else
to_chat(user, "<span class='notice'>\The [src] is empty.</span>")
else
to_chat(user, "<span class='notice'>\The [src] is empty.</span>")
/obj/machinery/aug_manipulator/proc/eject_part(mob/living/user)
if(storedpart)
+2 -1
View File
@@ -57,7 +57,8 @@
QDEL_NULL(wires)
return ..()
/obj/machinery/autolathe/interact(mob/user)
/obj/machinery/autolathe/ui_interact(mob/user)
. = ..()
if(!is_operational())
return
+2 -4
View File
@@ -55,10 +55,8 @@
/obj/machinery/computer/bank_machine/get_spans()
. = ..() | SPAN_ROBOT
/obj/machinery/computer/bank_machine/attack_hand(mob/user)
if(..())
return
src.add_fingerprint(usr)
/obj/machinery/computer/bank_machine/ui_interact(mob/user)
. = ..()
var/dat = "[station_name()] secure vault. Authorized personnel only.<br>"
dat += "Current Balance: [SSshuttle.points] credits.<br>"
if(!siphoning)
+8 -3
View File
@@ -16,7 +16,6 @@
idle_power_usage = 2
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
/obj/machinery/button/Initialize(mapload, ndir = 0, built = 0)
. = ..()
if(built)
@@ -98,7 +97,7 @@
return
if(user.a_intent != INTENT_HARM && !(W.flags_1 & NOBLUDGEON_1))
return src.attack_hand(user)
return attack_hand(user)
else
return ..()
@@ -114,6 +113,9 @@
if(!panel_open)
return attack_hand(user)
/obj/machinery/button/attack_robot(mob/user)
return attack_ai(user)
/obj/machinery/button/proc/setup_device()
if(id && istype(device, /obj/item/device/assembly/control))
var/obj/item/device/assembly/control/A = device
@@ -121,9 +123,12 @@
initialized_button = 1
/obj/machinery/button/attack_hand(mob/user)
. = ..()
if(.)
return
if(!initialized_button)
setup_device()
src.add_fingerprint(user)
add_fingerprint(user)
if(panel_open)
if(device || board)
if(device)
+3
View File
@@ -79,6 +79,9 @@
updateicon()
/obj/machinery/cell_charger/attack_hand(mob/user)
. = ..()
if(.)
return
if(!charging)
return
+3 -6
View File
@@ -18,12 +18,8 @@
else
return ..()
/obj/machinery/computer/aifixer/attack_hand(mob/user)
if(..())
return
interact(user)
/obj/machinery/computer/aifixer/interact(mob/user)
/obj/machinery/computer/aifixer/ui_interact(mob/user)
. = ..()
var/dat = ""
@@ -104,6 +100,7 @@
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 25, 0)
active = TRUE
add_fingerprint(usr)
updateUsrDialog()
/obj/machinery/computer/aifixer/update_icon()
..()
+3 -2
View File
@@ -46,7 +46,8 @@
/obj/machinery/computer/apc_control/proc/check_apc(obj/machinery/power/apc/APC)
return APC.z == z && !APC.malfhack && !APC.aidisabled && !(APC.obj_flags & EMAGGED) && !APC.stat && !istype(APC.area, /area/ai_monitored) && !APC.area.outdoors
/obj/machinery/computer/apc_control/interact(mob/living/user)
/obj/machinery/computer/apc_control/ui_interact(mob/living/user)
. = ..()
var/dat
if(authenticated)
if(!checking_logs)
@@ -184,7 +185,7 @@
log_activity("checked APCs")
if(href_list["clear_logs"])
logs = list()
interact(usr) //Refresh the UI after a filter changes
ui_interact(usr) //Refresh the UI after a filter changes
/obj/machinery/computer/apc_control/emag_act(mob/user)
if(!authenticated)
+4 -8
View File
@@ -134,10 +134,8 @@
enemy_name = replacetext((name_part1 + name_part2), "the ", "")
name = (name_action + name_part1 + name_part2)
/obj/machinery/computer/arcade/battle/attack_hand(mob/user)
if(..())
return
user.set_machine(src)
/obj/machinery/computer/arcade/battle/ui_interact(mob/user)
. = ..()
var/dat = "<a href='byond://?src=[REF(src)];close=1'>Close</a>"
dat += "<center><h4>[enemy_name]</h4></center>"
@@ -404,13 +402,11 @@
spaceport_freebie = 0
last_spaceport_action = ""
/obj/machinery/computer/arcade/orion_trail/attack_hand(mob/user)
if(..())
return
/obj/machinery/computer/arcade/orion_trail/ui_interact(mob/user)
. = ..()
if(fuel <= 0 || food <=0 || settlers.len == 0)
gameStatus = ORION_STATUS_GAMEOVER
event = null
user.set_machine(src)
var/dat = ""
if(gameStatus == ORION_STATUS_GAMEOVER)
dat = "<center><h1>Game Over</h1></center>"
+3
View File
@@ -51,6 +51,9 @@
return ..()
/obj/machinery/computer/security/attack_hand(mob/user)
. = ..()
if(.)
return
if(stat)
return
if (!network)
@@ -80,14 +80,25 @@
if(M == current_user)
remove_eye_control(M)
/obj/machinery/computer/camera_advanced/proc/can_use(mob/living/user)
return TRUE
/obj/machinery/computer/camera_advanced/abductor/can_use(mob/user)
if(!isabductor(user))
return FALSE
return ..()
/obj/machinery/computer/camera_advanced/attack_hand(mob/user)
. = ..()
if(.)
return
if(current_user)
to_chat(user, "The console is already in use!")
return
if(..())
return
var/mob/living/L = user
if(!can_use(user))
return
if(!eyeobj)
CreateEye()
@@ -126,7 +137,6 @@
/obj/machinery/computer/camera_advanced/attack_ai(mob/user)
return //AIs would need to disable their own camera procs to use the console safely. Bugs happen otherwise.
/obj/machinery/computer/camera_advanced/proc/give_eye_control(mob/user)
GrantActions(user)
current_user = user
@@ -289,7 +299,7 @@
warp_action.target = src
actions += warp_action
/obj/machinery/computer/camera_advanced/ratvar/attack_hand(mob/living/user)
/obj/machinery/computer/camera_advanced/ratvar/can_use(mob/living/user)
if(!is_servant_of_ratvar(user))
to_chat(user, "<span class='warning'>[src]'s keys are in a language foreign to you, and you don't understand anything on its screen.</span>")
return
+11 -7
View File
@@ -133,11 +133,9 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
return -1
return 0
/obj/machinery/computer/card/attack_hand(mob/user)
if(..())
return
/obj/machinery/computer/card/ui_interact(mob/user)
. = ..()
user.set_machine(src)
var/dat
if(!SSticker)
return
@@ -346,8 +344,6 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
popup.set_content(dat)
popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
popup.open()
return
/obj/machinery/computer/card/Topic(href, href_list)
if(..())
@@ -426,9 +422,11 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
var/datum/job/J = new jobtype
if(ckey(J.title) == ckey(t1))
jobdatum = J
updateUsrDialog()
break
if(!jobdatum)
to_chat(usr, "<span class='error'>No log exists for this job.</span>")
updateUsrDialog()
return
modify.access = ( istype(src, /obj/machinery/computer/card/centcom) ? get_centcom_access(t1) : jobdatum.get_access() )
@@ -451,6 +449,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
else
to_chat(usr, "<span class='error'>Invalid name entered.</span>")
updateUsrDialog()
return
if ("mode")
mode = text2num(href_list["mode_target"])
@@ -466,8 +465,10 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
var/edit_job_target = href_list["job"]
var/datum/job/j = SSjob.GetJob(edit_job_target)
if(!j)
updateUsrDialog()
return 0
if(can_open_job(j) != 1)
updateUsrDialog()
return 0
if(opened_positions[edit_job_target] >= 0)
GLOB.time_last_changed_position = world.time / 10
@@ -481,8 +482,10 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
var/edit_job_target = href_list["job"]
var/datum/job/j = SSjob.GetJob(edit_job_target)
if(!j)
updateUsrDialog()
return 0
if(can_close_job(j) != 1)
updateUsrDialog()
return 0
//Allow instant closing without cooldown if a position has been opened before
if(opened_positions[edit_job_target] <= 0)
@@ -497,6 +500,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
var/priority_target = href_list["job"]
var/datum/job/j = SSjob.GetJob(priority_target)
if(!j)
updateUsrDialog()
return 0
var/priority = TRUE
if(j in SSjob.prioritized_jobs)
@@ -504,6 +508,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
priority = FALSE
else if(j.total_positions <= j.current_positions)
to_chat(usr, "<span class='notice'>[j.title] has had all positions filled. Open up more slots before prioritizing it.</span>")
updateUsrDialog()
return
else
SSjob.prioritized_jobs += j
@@ -525,7 +530,6 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
if (modify)
modify.update_label()
updateUsrDialog()
return
/obj/machinery/computer/card/AltClick(mob/user)
if(user.canUseTopic(src))
+2 -11
View File
@@ -143,17 +143,8 @@
else
return ..()
/obj/machinery/computer/cloning/attack_hand(mob/user)
if(..())
return
interact(user)
/obj/machinery/computer/cloning/interact(mob/user)
user.set_machine(src)
add_fingerprint(user)
if(..())
return
/obj/machinery/computer/cloning/ui_interact(mob/user)
. = ..()
updatemodules(TRUE)
@@ -45,7 +45,7 @@
/obj/machinery/computer/communications/process()
if(..())
if(state != STATE_STATUSDISPLAY)
if(state != STATE_STATUSDISPLAY && state != STATE_CALLSHUTTLE)
updateDialog()
@@ -428,14 +428,12 @@
to_chat(user, "<span class='danger'>You scramble the communication routing circuits!</span>")
playsound(src, 'sound/machines/terminal_alert.ogg', 50, 0)
/obj/machinery/computer/communications/attack_hand(mob/user)
if(..())
return
/obj/machinery/computer/communications/ui_interact(mob/user)
. = ..()
if (z > 6)
to_chat(user, "<span class='boldannounce'>Unable to establish a connection</span>: \black You're too far away from the station!")
return
user.set_machine(src)
var/dat = ""
if(SSshuttle.emergency.mode == SHUTTLE_CALL)
var/timeleft = SSshuttle.emergency.timeLeft()
@@ -517,7 +515,7 @@
else
aistate = STATE_MESSAGELIST
attack_hand(user)
return null
return
if(STATE_DELMESSAGE)
if (currmsg)
dat += "Are you sure you want to delete this message? \[ <A HREF='?src=[REF(src)];operation=delmessage2'>OK</A> | <A HREF='?src=[REF(src)];operation=viewmessage'>Cancel</A> \]"
+3 -12
View File
@@ -15,16 +15,7 @@
/obj/machinery/computer/crew/syndie
icon_keyboard = "syndie_key"
/obj/machinery/computer/crew/attack_ai(mob/user)
if(stat & (BROKEN|NOPOWER))
return
GLOB.crewmonitor.show(user,src)
/obj/machinery/computer/crew/attack_hand(mob/user)
if(..())
return
if(stat & (BROKEN|NOPOWER))
return
/obj/machinery/computer/crew/interact(mob/user)
GLOB.crewmonitor.show(user,src)
GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new)
@@ -181,10 +172,10 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new)
pos_y = null
results[++results.len] = list("name" = name, "assignment" = assignment, "ijob" = ijob, "life_status" = life_status, "oxydam" = oxydam, "toxdam" = toxdam, "burndam" = burndam, "brutedam" = brutedam, "area" = area, "pos_x" = pos_x, "pos_y" = pos_y, "can_track" = H.can_track(null))
data_by_z["[z]"] = results
last_update["[z]"] = world.time
return results
/datum/crewmonitor/ui_act(action,params)
+4 -8
View File
@@ -60,12 +60,8 @@
break
injectorready = world.time + INJECTOR_TIMEOUT
/obj/machinery/computer/scan_consolenew/attack_hand(mob/user)
if(..())
return
ShowInterface(user)
/obj/machinery/computer/scan_consolenew/proc/ShowInterface(mob/user, last_change)
/obj/machinery/computer/scan_consolenew/ui_interact(mob/user, last_change)
. = ..()
if(!user)
return
var/datum/browser/popup = new(user, "scannernew", "DNA Modifier Console", 800, 630) // Set up the popup browser window
@@ -461,7 +457,7 @@
connected.locked = TRUE
current_screen = "working"
ShowInterface(usr)
ui_interact(usr)
sleep(radduration*10)
current_screen = "mainmenu"
@@ -507,7 +503,7 @@
if(connected)
connected.locked = locked_state
ShowInterface(usr,last_change)
ui_interact(usr,last_change)
/obj/machinery/computer/scan_consolenew/proc/scramble(input,rs,rd)
var/length = length(input)
@@ -30,14 +30,6 @@
else
return ..()
/obj/machinery/computer/launchpad/attack_ai(mob/user)
attack_hand(user)
/obj/machinery/computer/launchpad/attack_hand(mob/user)
if(..())
return
interact(user)
/obj/machinery/computer/launchpad/proc/pad_exists(number)
var/obj/machinery/launchpad/pad = launchpads[number]
if(QDELETED(pad))
@@ -48,7 +40,8 @@
var/obj/machinery/launchpad/pad = launchpads[number]
return pad
/obj/machinery/computer/launchpad/interact(mob/user)
/obj/machinery/computer/launchpad/ui_interact(mob/user)
. = ..()
var/list/t = list()
if(!LAZYLEN(launchpads))
obj_flags &= ~IN_USE //Yeah so if you deconstruct teleporter while its in the process of shooting it wont disable the console
+4 -2
View File
@@ -36,7 +36,8 @@
circuit = /obj/item/circuitboard/computer/aiupload
/obj/machinery/computer/upload/ai/attack_hand(mob/user)
if(..())
. = ..()
if(.)
return
src.current = select_active_ai(user)
@@ -60,7 +61,8 @@
circuit = /obj/item/circuitboard/computer/borgupload
/obj/machinery/computer/upload/borg/attack_hand(mob/user)
if(..())
. = ..()
if(.)
return
src.current = select_active_free_borg(user)
+2 -4
View File
@@ -34,9 +34,8 @@
else
return ..()
/obj/machinery/computer/med_data/attack_hand(mob/user)
if(..())
return
/obj/machinery/computer/med_data/interact(mob/user)
. = ..()
var/dat
if(src.temp)
dat = text("<TT>[src.temp]</TT><BR><BR><A href='?src=[REF(src)];temp=1'>Clear Screen</A>")
@@ -192,7 +191,6 @@
popup.set_content(dat)
popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
popup.open()
return
/obj/machinery/computer/med_data/Topic(href, href_list)
. = ..()
+4 -14
View File
@@ -39,12 +39,13 @@
if(M.id == id)
M.close()
/obj/machinery/computer/pod/attack_hand(mob/user)
if(..())
/obj/machinery/computer/pod/ui_interact(mob/user)
. = ..()
if(!allowed(user))
to_chat(user, "<span class='warning'>Access denied.</span>")
return
var/dat = ""
user.set_machine(src)
if(connected)
var/d2
if(timing) //door controls do not need timers.
@@ -69,7 +70,6 @@
popup.set_title_image(user.browse_rsc_icon(icon, icon_state))
popup.open()
/obj/machinery/computer/pod/process()
if(!..())
return
@@ -115,7 +115,6 @@
M.drive()
updateUsrDialog()
/obj/machinery/computer/pod/old
name = "\improper DoorMex control console"
title = "Door Controls"
@@ -123,21 +122,12 @@
icon_screen = "library"
icon_keyboard = null
/obj/machinery/computer/pod/old/syndicate
name = "\improper ProComp Executive IIc"
desc = "The Syndicate operate on a tight budget. Operates external airlocks."
title = "External Airlock Controls"
req_access = list(ACCESS_SYNDICATE)
/obj/machinery/computer/pod/old/syndicate/attack_hand(mob/user)
if(!allowed(user))
to_chat(user, "<span class='notice'>Access denied.</span>")
return
else
..()
/obj/machinery/computer/pod/old/swf
name = "\improper Magix System IV"
desc = "An arcane artifact that holds much magic. Running E-Knock 2.2: Sorceror's Edition."
+2 -4
View File
@@ -15,10 +15,8 @@
light_color = LIGHT_COLOR_RED
/obj/machinery/computer/prisoner/attack_hand(mob/user)
if(..())
return
user.set_machine(src)
/obj/machinery/computer/prisoner/ui_interact(mob/user)
. = ..()
var/dat = ""
if(screen == 0)
dat += "<HR><A href='?src=[REF(src)];lock=1'>Unlock Console</A>"
+2 -6
View File
@@ -22,12 +22,8 @@
return 0
return 1
/obj/machinery/computer/robotics/attack_hand(mob/user)
if(..())
return
interact(user)
/obj/machinery/computer/robotics/interact(mob/user)
/obj/machinery/computer/robotics/ui_interact(mob/user)
. = ..()
if (src.z > 6)
to_chat(user, "<span class='boldannounce'>Unable to establish a connection</span>: \black You're too far away from the station!")
return
+2 -3
View File
@@ -54,9 +54,8 @@
return ..()
//Someone needs to break down the dat += into chunks instead of long ass lines.
/obj/machinery/computer/secure_data/attack_hand(mob/user)
if(..())
return
/obj/machinery/computer/secure_data/ui_interact(mob/user)
. = ..()
if(src.z > 6)
to_chat(user, "<span class='boldannounce'>Unable to establish a connection</span>: \black You're too far away from the station!")
return
@@ -85,12 +85,8 @@ GLOBAL_LIST_INIT(possible_uplinker_IDs, list("Alfa","Bravo","Charlie","Delta","E
///////
/obj/machinery/computer/telecrystals/uplinker/attack_hand(mob/user)
if(..())
return
src.add_fingerprint(user)
user.set_machine(src)
/obj/machinery/computer/telecrystals/uplinker/ui_interact(mob/user)
. = ..()
var/dat = ""
if(linkedboss)
dat += "[linkedboss] has [linkedboss.storedcrystals] telecrystals available for distribution. <BR><BR>"
@@ -109,7 +105,6 @@ GLOBAL_LIST_INIT(possible_uplinker_IDs, list("Alfa","Bravo","Charlie","Delta","E
popup.set_content(dat)
popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
popup.open()
return
/obj/machinery/computer/telecrystals/uplinker/Topic(href, href_list)
if(..())
@@ -164,13 +159,8 @@ GLOBAL_LIST_INIT(possible_uplinker_IDs, list("Alfa","Bravo","Charlie","Delta","E
/////////
/obj/machinery/computer/telecrystals/boss/attack_hand(mob/user)
if(..())
return
src.add_fingerprint(user)
user.set_machine(src)
/obj/machinery/computer/telecrystals/boss/ui_interact(mob/user)
. = ..()
var/dat = ""
dat += "<a href='byond://?src=[REF(src)];scan=1'>Scan for TC stations.</a><BR>"
dat += "[storedcrystals] telecrystals are available for distribution. <BR>"
@@ -198,7 +188,6 @@ GLOBAL_LIST_INIT(possible_uplinker_IDs, list("Alfa","Bravo","Charlie","Delta","E
popup.set_content(dat)
popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
popup.open()
return
/obj/machinery/computer/telecrystals/boss/Topic(href, href_list)
if(..())
+2 -9
View File
@@ -45,15 +45,8 @@
else
return ..()
/obj/machinery/computer/teleporter/attack_ai(mob/user)
return attack_hand(user)
/obj/machinery/computer/teleporter/attack_hand(mob/user)
if(..())
return
interact(user)
/obj/machinery/computer/teleporter/interact(mob/user)
/obj/machinery/computer/teleporter/ui_interact(mob/user)
. = ..()
var/data = "<h3>Teleporter Status</h3>"
if(!power_station)
data += "<div class='statusDisplay'>No power station linked.</div>"
+2 -2
View File
@@ -87,7 +87,8 @@
..()
/obj/machinery/disco/interact(mob/user)
/obj/machinery/disco/ui_interact(mob/user)
. = ..()
if (!anchored)
to_chat(user,"<span class='warning'>This device must be anchored by a wrench!</span>")
return
@@ -97,7 +98,6 @@
return
if(!Adjacent(user) && !isAI(user))
return
user.set_machine(src)
var/list/dat = list()
dat +="<div class='statusDisplay' style='text-align:center'>"
dat += "<b><A href='?src=[REF(src)];action=toggle'>[!active ? "BREAK IT DOWN" : "SHUT IT DOWN"]<b></A><br>"
+1 -4
View File
@@ -144,10 +144,7 @@
return ..()
/obj/machinery/dna_scannernew/attack_hand(mob/user)
if(..(user,1,0)) //don't set the machine, since there's no dialog
return
/obj/machinery/dna_scannernew/interact(mob/user)
toggle_open(user)
/obj/machinery/dna_scannernew/MouseDrop_T(mob/target, mob/user)
+15 -13
View File
@@ -49,7 +49,6 @@
var/normal_integrity = AIRLOCK_INTEGRITY_N
integrity_failure = 70
damage_deflection = AIRLOCK_DAMAGE_DEFLECTION_N
interact_open = TRUE
autoclose = TRUE
secondsElectrified = 0 //How many seconds remain until the door is no longer electrified. -1 if it is permanently electrified until someone fixes it.
assemblytype = /obj/structure/door_assembly
@@ -57,6 +56,8 @@
explosion_block = 1
hud_possible = list(DIAG_AIRLOCK_HUD)
interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON | INTERACT_MACHINE_REQUIRES_SILICON | INTERACT_MACHINE_OPEN
var/security_level = 0 //How much are wires secured
var/aiControlDisabled = 0 //If 1, AI control is disabled until the AI hacks back in and disables the lock. If 2, the AI has bypassed the lock. If -1, the control is enabled but the AI had bypassed it earlier, so if it is disabled again the AI would have no trouble getting back in.
var/hackProof = FALSE // if true, this door can't be hacked by the AI
@@ -730,9 +731,12 @@
shock(user, 100)
/obj/machinery/door/airlock/attack_paw(mob/user)
return src.attack_hand(user)
return attack_hand(user)
/obj/machinery/door/airlock/attack_hand(mob/user)
. = ..()
if(.)
return
if(!(issilicon(user) || IsAdminGhost(user)))
if(src.isElectrified())
if(src.shock(user, 100))
@@ -749,16 +753,12 @@
H.apply_damage(10, BRUTE, BODY_ZONE_HEAD)
else
visible_message("<span class='danger'>[user] headbutts the airlock. Good thing [user.p_theyre()] wearing a helmet.</span>")
return
if(panel_open)
if(security_level)
to_chat(user, "<span class='warning'>Wires are protected!</span>")
return
wires.interact(user)
else
..()
return
/obj/machinery/door/airlock/attempt_wire_interaction(mob/user)
if(security_level)
to_chat(user, "<span class='warning'>Wires are protected!</span>")
return WIRE_INTERACTION_FAIL
return ..()
/obj/machinery/door/airlock/proc/electrified_loop()
while (secondsElectrified > 0)
@@ -931,8 +931,9 @@
note.forceMove(get_turf(user))
note = null
update_icon()
else if(is_wire_tool(C))
return attack_hand(user)
else if(is_wire_tool(C) && panel_open)
attempt_wire_interaction(user)
return
else if(istype(C, /obj/item/pai_cable))
var/obj/item/pai_cable/cable = C
cable.plugin(src, user)
@@ -1411,6 +1412,7 @@
if(!ui)
ui = new(user, src, ui_key, "ai_airlock", name, 550, 456, master_ui, state)
ui.open()
return TRUE
/obj/machinery/door/airlock/ui_data()
var/list/data = list()
+5 -5
View File
@@ -13,6 +13,8 @@
CanAtmosPass = ATMOS_PASS_DENSITY
flags_1 = PREVENT_CLICK_UNDER_1
interaction_flags_atom = INTERACT_ATOM_UI_INTERACT
var/secondsElectrified = 0
var/shockedby = list()
var/visible = TRUE
@@ -133,14 +135,12 @@
do_animate("deny")
return
/obj/machinery/door/attack_ai(mob/user)
return src.attack_hand(user)
/obj/machinery/door/attack_hand(mob/user)
. = ..()
if(.)
return
return try_to_activate_door(user)
/obj/machinery/door/attack_tk(mob/user)
if(requiresID() && !allowed(null))
return
+9 -2
View File
@@ -23,6 +23,7 @@
closingLayer = CLOSED_FIREDOOR_LAYER
assemblytype = /obj/structure/firelock_frame
armor = list("melee" = 30, "bullet" = 30, "laser" = 20, "energy" = 20, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 95, "acid" = 70)
interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON | INTERACT_MACHINE_REQUIRES_SILICON | INTERACT_MACHINE_OPEN
var/boltslocked = TRUE
var/list/affecting_areas
@@ -82,6 +83,9 @@
stat |= NOPOWER
/obj/machinery/door/firedoor/attack_hand(mob/user)
. = ..()
if(.)
return
if(operating || !density)
return
user.changeNext_move(CLICK_CD_MELEE)
@@ -140,14 +144,17 @@
else
close()
/obj/machinery/door/firedoor/attack_ai(mob/user)
/obj/machinery/door/firedoor/interact(mob/user)
if(!issilicon(user))
return TRUE
add_fingerprint(user)
if(welded || operating || stat & NOPOWER)
return
return TRUE
if(density)
open()
else
close()
return TRUE
/obj/machinery/door/firedoor/attack_alien(mob/user)
add_fingerprint(user)
-4
View File
@@ -201,10 +201,6 @@
take_damage(round(exposed_volume / 200), BURN, 0, 0)
..()
/obj/machinery/door/window/attack_ai(mob/user)
return src.attack_hand(user)
/obj/machinery/door/window/emag_act(mob/user)
if(!operating && density && !(obj_flags & EMAGGED))
obj_flags |= EMAGGED
@@ -14,7 +14,7 @@
var/idSelf
/obj/machinery/doorButtons/attackby(obj/O, mob/user)
attack_hand(user)
return attack_hand(user)
/obj/machinery/doorButtons/proc/findObjsByTag()
return
@@ -59,7 +59,8 @@
break
/obj/machinery/doorButtons/access_button/attack_hand(mob/user)
if(..())
. = ..()
if(.)
return
if(busy)
return
@@ -260,7 +261,8 @@
icon_state = "access_control_standby"
/obj/machinery/doorButtons/airlock_controller/attack_hand(mob/user)
if(..())
. = ..()
if(.)
return
var/datum/browser/popup = new(user, "computer", name)
popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
@@ -26,16 +26,14 @@
var/on = TRUE
/obj/machinery/embedded_controller/interact(mob/user)
/obj/machinery/embedded_controller/ui_interact(mob/user)
. = ..()
user.set_machine(src)
var/datum/browser/popup = new(user, "computer", name) // Set up the popup browser window
popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
popup.set_content(return_text())
popup.open()
/obj/machinery/embedded_controller/attack_hand(mob/user)
interact(user)
/obj/machinery/embedded_controller/update_icon()
/obj/machinery/embedded_controller/proc/return_text()
+1
View File
@@ -47,6 +47,7 @@ The console is located at computer/gulag_teleporter.dm
update_icon()
/obj/machinery/gulag_teleporter/interact(mob/user)
. = ..()
if(locked)
to_chat(user, "<span class='warning'>[src] is locked!</span>")
return
+2 -1
View File
@@ -172,7 +172,8 @@ Possible to do for anyone motivated enough:
return ..()
/obj/machinery/holopad/interact(mob/living/carbon/human/user) //Carn: Hologram requests.
/obj/machinery/holopad/ui_interact(mob/living/carbon/human/user) //Carn: Hologram requests.
. = ..()
if(!istype(user))
return
+4 -10
View File
@@ -17,21 +17,15 @@
on = FALSE
icon_state = "igniter0"
/obj/machinery/igniter/attack_ai(mob/user)
return src.attack_hand(user)
/obj/machinery/igniter/attack_paw(mob/user)
return src.attack_hand(user)
/obj/machinery/igniter/attack_hand(mob/user)
if(..())
. = ..()
if(.)
return
add_fingerprint(user)
use_power(50)
src.on = !( src.on )
src.icon_state = text("igniter[]", src.on)
return
on = !( on )
icon_state = "igniter[on]"
/obj/machinery/igniter/process() //ugh why is this even in process()?
if (src.on && !(stat & NOPOWER) )
+4
View File
@@ -66,6 +66,7 @@
add_overlay(filling_overlay)
/obj/machinery/iv_drip/MouseDrop(mob/living/target)
. = ..()
if(!ishuman(usr) || !usr.canUseTopic(src, BE_CLOSE) || !isliving(target))
return
@@ -150,6 +151,9 @@
update_icon()
/obj/machinery/iv_drip/attack_hand(mob/user)
. = ..()
if(.)
return
if(!ishuman(user))
return
if(attached)
+2 -6
View File
@@ -37,12 +37,8 @@
..()
to_chat(user, "It is [on? "on" : "off"].")
/obj/machinery/light_switch/attack_paw(mob/user)
src.attack_hand(user)
/obj/machinery/light_switch/attack_hand(mob/user)
/obj/machinery/light_switch/interact(mob/user)
. = ..()
on = !on
for(var/area/A in area.related)
+2 -1
View File
@@ -37,7 +37,8 @@
stored_research = new /datum/techweb/specialized/autounlocking/limbgrower
. = ..()
/obj/machinery/limbgrower/interact(mob/user)
/obj/machinery/limbgrower/ui_interact(mob/user)
. = ..()
if(!is_operational())
return
+2 -8
View File
@@ -238,14 +238,8 @@
if(M.freq == frequency && M.code == code)
magnets.Add(M)
/obj/machinery/magnetic_controller/attack_ai(mob/user)
return src.attack_hand(user)
/obj/machinery/magnetic_controller/attack_hand(mob/user)
if(stat & (BROKEN|NOPOWER))
return
user.set_machine(src)
/obj/machinery/magnetic_controller/ui_interact(mob/user)
. = ..()
var/dat = "<B>Magnetic Control Console</B><BR><BR>"
if(!autolink)
dat += {"
+3 -4
View File
@@ -108,10 +108,9 @@
/obj/machinery/navbeacon/attack_paw()
return
/obj/machinery/navbeacon/attack_hand(mob/user)
interact(user, 0)
/obj/machinery/navbeacon/interact(mob/user, ai = 0)
/obj/machinery/navbeacon/ui_interact(mob/user)
. = ..()
var/ai = isAI(user)
var/turf/T = loc
if(T.intact)
return // prevent intraction when T-scanner revealed
+2 -6
View File
@@ -263,12 +263,8 @@ GLOBAL_LIST_EMPTY(allCasters)
. = ..()
update_icon()
/obj/machinery/newscaster/attack_ai(mob/user)
return attack_hand(user)
/obj/machinery/newscaster/attack_hand(mob/user)
if(stat & (NOPOWER|BROKEN))
return
/obj/machinery/newscaster/ui_interact(mob/user)
. = ..()
if(ishuman(user) || issilicon(user))
var/mob/living/human_or_robot_user = user
var/dat
+5 -9
View File
@@ -5,15 +5,15 @@
desc = "Dispenses countless types of pipes. Very useful if you need pipes."
density = TRUE
anchored = TRUE
interaction_flags_machine = INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON | INTERACT_MACHINE_OFFLINE
var/wait = 0
var/piping_layer = PIPING_LAYER_DEFAULT
/obj/machinery/pipedispenser/attack_paw(mob/user)
return attack_hand(user)
/obj/machinery/pipedispenser/attack_hand(mob/user)
if(..())
return 1
/obj/machinery/pipedispenser/ui_interact(mob/user)
. = ..()
var/dat = "PIPING LAYER: <A href='?src=[REF(src)];layer_down=1'>--</A><b>[piping_layer]</b><A href='?src=[REF(src)];layer_up=1'>++</A><BR>"
var/recipes = GLOB.atmos_pipe_recipes
@@ -99,9 +99,7 @@
qdel(pipe)
/obj/machinery/pipedispenser/disposal/attack_hand(mob/user)
if(..())
return 1
/obj/machinery/pipedispenser/disposal/interact(mob/user)
var/dat = ""
var/recipes = GLOB.disposal_pipe_recipes
@@ -151,9 +149,7 @@
desc = "Dispenses pipes that will move beings around."
anchored = TRUE
/obj/machinery/pipedispenser/disposal/transit_tube/attack_hand(mob/user)
if(..())
return 1
/obj/machinery/pipedispenser/disposal/transit_tube/interact(mob/user)
var/dat = {"<B>Transit Tubes:</B><BR>
<A href='?src=[REF(src)];tube=[TRANSIT_TUBE_STRAIGHT]'>Straight Tube</A><BR>
@@ -162,18 +162,8 @@
remove_control()
return ..()
/obj/machinery/porta_turret/attack_ai(mob/user)
return attack_hand(user)
/obj/machinery/porta_turret/attack_hand(mob/user)
/obj/machinery/porta_turret/ui_interact(mob/user)
. = ..()
if(.)
return
interact(user)
/obj/machinery/porta_turret/interact(mob/user)
var/dat
dat += "Status: <a href='?src=[REF(src)];power=1'>[on ? "On" : "Off"]</a><br>"
dat += "Behaviour controls are [locked ? "locked" : "unlocked"]<br>"
@@ -832,7 +822,7 @@
user << browse(null, "window=turretid")
else
if (user.machine==src)
src.attack_hand(user)
attack_hand(user)
else
to_chat(user, "<span class='warning'>Access denied.</span>")
@@ -851,7 +841,8 @@
else
to_chat(user, "<span class='notice'>There seems to be a firewall preventing you from accessing this device.</span>")
/obj/machinery/turretid/attack_hand(mob/user as mob)
/obj/machinery/turretid/ui_interact(mob/user)
. = ..()
if ( get_dist(src, user) > 0 )
if ( !(issilicon(user) || IsAdminGhost(user)) )
to_chat(user, "<span class='notice'>You are too far away.</span>")
@@ -859,7 +850,6 @@
user << browse(null, "window=turretid")
return
user.set_machine(src)
var/t = ""
if(locked && !(issilicon(user) || IsAdminGhost(user)))
@@ -886,7 +876,7 @@
toggle_on()
else if (href_list["toggleLethal"])
toggle_lethal()
src.attack_hand(usr)
attack_hand(usr)
/obj/machinery/turretid/proc/toggle_lethal()
lethal = !lethal
@@ -1013,7 +1003,8 @@
if(properties["team_color"])
team_color = properties["team_color"]
/obj/machinery/porta_turret/lasertag/interact(mob/user)
/obj/machinery/porta_turret/lasertag/ui_interact(mob/user)
. = ..()
if(ishuman(user))
var/mob/living/carbon/human/H = user
if(team_color == "blue" && istype(H.wear_suit, /obj/item/clothing/suit/redtag))
@@ -168,6 +168,9 @@
/obj/machinery/porta_turret_construct/attack_hand(mob/user)
. = ..()
if(.)
return
switch(build_step)
if(PTURRET_GUN_EQUIPPED)
build_step = PTURRET_INTERNAL_ARMOUR_ON
+6
View File
@@ -69,6 +69,9 @@
return ..()
/obj/machinery/quantumpad/attack_hand(mob/user)
. = ..()
if(.)
return
if(panel_open)
to_chat(user, "<span class='warning'>The panel must be closed before operating this machine!</span>")
return
@@ -102,6 +105,9 @@
s.start()
/obj/machinery/quantumpad/attack_ghost(mob/dead/observer/ghost)
. = ..()
if(.)
return
if(!linked_pad && map_pad_link_id)
initMappedLink()
if(linked_pad)
+2 -4
View File
@@ -73,7 +73,8 @@
return ..()
/obj/machinery/recharger/attack_hand(mob/user)
if(issilicon(user))
. = ..()
if(.)
return
add_fingerprint(user)
@@ -85,9 +86,6 @@
use_power = IDLE_POWER_USE
update_icon()
/obj/machinery/recharger/attack_paw(mob/user)
return attack_hand(user)
/obj/machinery/recharger/attack_tk(mob/user)
if(charging)
charging.update_icon()
+11 -23
View File
@@ -10,6 +10,7 @@
req_access = list(ACCESS_ROBOTICS)
state_open = TRUE
circuit = /obj/item/circuitboard/machine/cyborgrecharger
occupant_typecache = list(/mob/living/silicon/robot)
var/recharge_speed
var/repairs
@@ -47,12 +48,6 @@
open_machine()
..()
/obj/machinery/recharge_station/attack_paw(mob/user)
return attack_hand(user)
/obj/machinery/recharge_station/attack_ai(mob/user)
return attack_hand(user)
/obj/machinery/recharge_station/attackby(obj/item/P, mob/user, params)
if(state_open)
if(default_deconstruction_screwdriver(user, "borgdecon2", "borgcharger0", P))
@@ -68,12 +63,9 @@
return
return ..()
/obj/machinery/recharge_station/attack_hand(mob/user)
if(..(user,1,set_machine = 0))
return
/obj/machinery/recharge_station/interact(mob/user)
toggle_open()
add_fingerprint(user)
return TRUE
/obj/machinery/recharge_station/proc/toggle_open()
if(state_open)
@@ -82,20 +74,16 @@
open_machine()
/obj/machinery/recharge_station/open_machine()
..()
use_power = IDLE_POWER_USE
. = ..()
if(iscyborg(occupant))
use_power = IDLE_POWER_USE
/obj/machinery/recharge_station/close_machine()
if(!panel_open)
for(var/mob/living/silicon/robot/R in loc)
R.forceMove(src)
occupant = R
. = ..()
if(occupant)
if(iscyborg(occupant))
use_power = ACTIVE_POWER_USE
add_fingerprint(R)
break
state_open = FALSE
density = TRUE
update_icon()
add_fingerprint(occupant)
/obj/machinery/recharge_station/update_icon()
if(is_operational())
@@ -111,7 +99,7 @@
update_icon()
/obj/machinery/recharge_station/proc/process_occupant()
if(occupant)
if(occupant && iscyborg(occupant))
var/mob/living/silicon/robot/R = occupant
restock_modules()
if(repairs)
+2 -3
View File
@@ -129,9 +129,8 @@ GLOBAL_LIST_EMPTY(allConsoles)
GLOB.allConsoles -= src
return ..()
/obj/machinery/requests_console/attack_hand(mob/user)
if(..())
return
/obj/machinery/requests_console/ui_interact(mob/user)
. = ..()
var/dat = ""
if(!open)
switch(screen)
+2 -6
View File
@@ -40,13 +40,9 @@
else
stat |= NOPOWER
/obj/machinery/robotic_fabricator/attack_paw(mob/user)
return src.attack_hand(user)
/obj/machinery/robotic_fabricator/attack_hand(mob/user)
/obj/machinery/robotic_fabricator/ui_interact(mob/user)
. = ..()
var/dat
if (..())
return
if (src.operating)
dat = {"
+6 -3
View File
@@ -120,6 +120,9 @@
update_icon()
/obj/machinery/shieldgen/attack_hand(mob/user)
. = ..()
if(.)
return
if(locked)
to_chat(user, "<span class='warning'>The machine is locked, you are unable to use it!</span>")
return
@@ -358,6 +361,9 @@
return ..()
/obj/machinery/shieldwallgen/attack_hand(mob/user)
. = ..()
if(.)
return
if(!anchored)
to_chat(user, "<span class='warning'>\The [src] needs to be firmly secured to the floor first!</span>")
return
@@ -421,9 +427,6 @@
gen_secondary = null
return ..()
/obj/machinery/shieldwall/attack_hand(mob/user)
return
/obj/machinery/shieldwall/process()
if(needs_power)
if(!gen_primary || !gen_primary.active || !gen_secondary || !gen_secondary.active)
+2 -8
View File
@@ -108,14 +108,8 @@
spark_system.start()
playsound(src, "sparks", 50, 1)
/obj/machinery/computer/slot_machine/attack_hand(mob/living/user)
. = ..() //Sanity checks.
if(.)
return .
interact(user)
/obj/machinery/computer/slot_machine/interact(mob/living/user)
/obj/machinery/computer/slot_machine/ui_interact(mob/living/user)
. = ..()
var/reeltext = {"<center><font face=\"courier new\">
/*****^*****^*****^*****^*****\\<BR>
| \[[reels[1][1]]\] | \[[reels[2][1]]\] | \[[reels[3][1]]\] | \[[reels[4][1]]\] | \[[reels[5][1]]\] |<BR>
+1 -1
View File
@@ -5,7 +5,7 @@
/obj/machinery/space_heater
anchored = FALSE
density = TRUE
interact_open = TRUE
interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN
icon = 'icons/obj/atmos.dmi'
icon_state = "sheater-off"
name = "space heater"
+3 -2
View File
@@ -47,12 +47,13 @@
/obj/machinery/power/singularity_beacon/attack_hand(mob/user)
. = ..()
if(.)
return
if(anchored)
return active ? Deactivate(user) : Activate(user)
else
to_chat(user, "<span class='warning'>You need to screw the beacon to the floor first!</span>")
return
/obj/machinery/power/singularity_beacon/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/screwdriver))
+2 -6
View File
@@ -12,6 +12,8 @@
layer = BELOW_MOB_LAYER //so people can't hide it and it's REALLY OBVIOUS
resistance_flags = FIRE_PROOF | ACID_PROOF
interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_OFFLINE
var/minimum_timer = 90
var/timer_set = 90
var/maximum_timer = 60000
@@ -174,12 +176,6 @@
if((old_integ > obj_integrity) && active && !defused && (payload in src))
to_chat(user, "<span class='warning'>That seems like a really bad idea...</span>")
/obj/machinery/syndicatebomb/attack_hand(mob/user)
interact(user)
/obj/machinery/syndicatebomb/attack_ai()
return
/obj/machinery/syndicatebomb/interact(mob/user)
wires.interact(user)
if(!open_panel)
@@ -17,10 +17,8 @@
req_access = list(ACCESS_TCOMSAT)
circuit = /obj/item/circuitboard/computer/comm_server
/obj/machinery/computer/telecomms/server/attack_hand(mob/user)
if(..())
return
user.set_machine(src)
/obj/machinery/computer/telecomms/server/ui_interact(mob/user)
. = ..()
var/dat = "<TITLE>Telecommunication Server Monitor</TITLE><center><b>Telecommunications Server Monitor</b></center>"
switch(screen)
@@ -77,9 +77,8 @@
GLOB.telecomms_list -= src
. = ..()
/obj/machinery/computer/message_monitor/attack_hand(mob/living/user)
if(..())
return
/obj/machinery/computer/message_monitor/ui_interact(mob/living/user)
. = ..()
//If the computer is being hacked or is emagged, display the reboot message.
if(hacking || (obj_flags & EMAGGED))
message = rebootmsg
@@ -236,7 +235,6 @@
popup.set_content(dat)
popup.set_title_image(user.browse_rsc_icon(icon, icon_state))
popup.open()
return
/obj/machinery/computer/message_monitor/proc/BruteForce(mob/user)
if(isnull(linkedServer))
@@ -19,10 +19,8 @@
var/temp = "" // temporary feedback messages
circuit = /obj/item/circuitboard/computer/comm_monitor
/obj/machinery/computer/telecomms/monitor/attack_hand(mob/user)
if(..())
return
user.set_machine(src)
/obj/machinery/computer/telecomms/monitor/ui_interact(mob/user)
. = ..()
var/dat = "<TITLE>Telecommunications Monitor</TITLE><center><b>Telecommunications Monitor</b></center>"
switch(screen)
@@ -31,24 +31,14 @@
else
return ..()
/obj/machinery/telecomms/attack_ai(mob/user)
attack_hand(user)
/obj/machinery/telecomms/attack_hand(mob/user)
/obj/machinery/telecomms/ui_interact(mob/user)
. = ..()
// You need a multitool to use this, or be silicon
if(!issilicon(user))
// istype returns false if the value is null
if(!istype(user.get_active_held_item(), /obj/item/device/multitool))
return
if(stat & (BROKEN|NOPOWER))
return
var/obj/item/device/multitool/P = get_multitool(user)
user.set_machine(src)
var/dat
dat = "<font face = \"Courier\"><HEAD><TITLE>[name]</TITLE></HEAD><center><H3>[name] Access</H3></center>"
dat += "<br>[temp]<br>"
@@ -38,4 +38,4 @@
/obj/machinery/telecomms/allinone/attackby(obj/item/P, mob/user, params)
if(istype(P, /obj/item/device/multitool))
attack_hand(user)
return attack_hand(user)
+8 -16
View File
@@ -183,32 +183,24 @@
else
return ..()
/obj/machinery/teleport/station/attack_paw()
src.attack_hand()
/obj/machinery/teleport/station/attack_ai()
src.attack_hand()
/obj/machinery/teleport/station/attack_hand(mob/user)
if(!panel_open)
toggle(user)
/obj/machinery/teleport/station/interact(mob/user)
toggle(user)
/obj/machinery/teleport/station/proc/toggle(mob/user)
if(stat & (BROKEN|NOPOWER) || !teleporter_hub || !teleporter_console )
return
if (teleporter_console.target)
if(teleporter_hub.panel_open || teleporter_hub.stat & (BROKEN|NOPOWER))
visible_message("<span class='alert'>The teleporter hub isn't responding.</span>")
to_chat(user, "<span class='alert'>The teleporter hub isn't responding.</span>")
else
src.engaged = !src.engaged
engaged = !engaged
use_power(5000)
visible_message("<span class='notice'>Teleporter [engaged ? "" : "dis"]engaged!</span>")
to_chat(user, "<span class='notice'>Teleporter [engaged ? "" : "dis"]engaged!</span>")
else
visible_message("<span class='alert'>No target detected.</span>")
src.engaged = 0
to_chat(user, "<span class='alert'>No target detected.</span>")
engaged = FALSE
teleporter_hub.update_icon()
src.add_fingerprint(user)
return
add_fingerprint(user)
/obj/machinery/teleport/station/power_change()
..()
+3
View File
@@ -220,6 +220,9 @@
return ..()
/obj/machinery/washing_machine/attack_hand(mob/user)
. = ..()
if(.)
return
if(busy)
to_chat(user, "<span class='warning'>[src] is busy.</span>")
return
+3
View File
@@ -12,6 +12,9 @@
var/insisting = 0
/obj/machinery/wish_granter/attack_hand(mob/living/carbon/user)
. = ..()
if(.)
return
if(charges <= 0)
to_chat(user, "The Wish Granter lies silent.")
return
-8
View File
@@ -78,14 +78,6 @@
var/obj/machinery/mech_bay_recharge_port/recharge_port
light_color = LIGHT_COLOR_PINK
/obj/machinery/computer/mech_bay_power_console/attack_ai(mob/user)
return interact(user)
/obj/machinery/computer/mech_bay_power_console/attack_hand(mob/user)
if(..())
return
interact(user)
/obj/machinery/computer/mech_bay_power_console/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
+2 -7
View File
@@ -247,14 +247,9 @@
/obj/machinery/mecha_part_fabricator/proc/get_construction_time_w_coeff(datum/design/D, roundto = 1) //aran
return round(initial(D.construction_time)*time_coeff, roundto)
/obj/machinery/mecha_part_fabricator/attack_hand(mob/user)
if(!(..()))
return interact(user)
/obj/machinery/mecha_part_fabricator/interact(mob/user as mob)
/obj/machinery/mecha_part_fabricator/ui_interact(mob/user as mob)
. = ..()
var/dat, left_part
if (..())
return
user.set_machine(src)
var/turf/exit = get_step(src,(dir))
if(exit.density)
+2 -5
View File
@@ -9,10 +9,8 @@
var/screen = 0
var/stored_data
/obj/machinery/computer/mecha/attack_hand(mob/user)
if(..())
return
user.set_machine(src)
/obj/machinery/computer/mecha/ui_interact(mob/user)
. = ..()
var/dat = "<html><head><title>[src.name]</title><style>h3 {margin: 0px; padding: 0px;}</style></head><body>"
if(screen == 0)
dat += "<h3>Tracking beacons data</h3>"
@@ -36,7 +34,6 @@
user << browse(dat, "window=computer;size=400x500")
onclose(user, "computer")
return
/obj/machinery/computer/mecha/Topic(href, href_list)
if(..())
+3
View File
@@ -55,6 +55,9 @@
/obj/mecha/attack_hand(mob/living/user)
. = ..()
if(.)
return
user.changeNext_move(CLICK_CD_MELEE) // Ugh. Ideally we shouldn't be setting cooldowns outside of click code.
user.do_attack_animation(src, ATTACK_EFFECT_PUNCH)
playsound(loc, 'sound/weapons/tap.ogg', 40, 1, -1)
+1 -3
View File
@@ -12,6 +12,7 @@
/obj/item/mecha_parts/chassis
name = "Mecha Chassis"
icon_state = "backbone"
interaction_flags_item = NONE //Don't pick us up!!
var/construct_type
/obj/item/mecha_parts/chassis/Initialize()
@@ -19,9 +20,6 @@
if(construct_type)
AddComponent(construct_type)
/obj/item/mecha_parts/chassis/attack_hand()
return
/////////// Ripley
/obj/item/mecha_parts/chassis/ripley
+2
View File
@@ -11,6 +11,8 @@
//Interaction
/atom/movable/attack_hand(mob/living/user)
. = ..()
if(.)
return
if(can_buckle && has_buckled_mobs())
if(buckled_mobs.len > 1)
var/unbuckled = input(user, "Who do you wish to unbuckle?","Unbuckle Who?") as null|mob in buckled_mobs

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