Merge branch 'master' of https://github.com/tgstation/-tg-station into dragnet

Conflicts:
	icons/effects/effects.dmi
	icons/obj/items.dmi
This commit is contained in:
Cheridan
2015-06-22 22:57:53 -05:00
359 changed files with 4341 additions and 2639 deletions
+5 -4
View File
@@ -66,8 +66,9 @@
/obj/item/areaeditor/permit/create_area()
..()
qdel(src)
var/success = ..()
if(success)
qdel(src)
//Station blueprints!!!
@@ -84,7 +85,7 @@
var/area/A = get_area()
if(get_area_type() == AREA_STATION)
. += "<p>According to \the [src], you are now in <b>\"[html_encode(A.name)]\"</b>.</p>"
. += "<p>You may <a href='?src=\ref[src];edit_area=1'>move an amendment</a> to the drawing.</p>"
. += "<p>You may <a href='?src=\ref[src];edit_area=1'>make an amendment</a> to the drawing.</p>"
var/datum/browser/popup = new(user, "blueprints", "[src]", 700, 500)
popup.set_content(.)
popup.open()
@@ -162,7 +163,7 @@
A.addSorted()
interact()
return
return 1
/obj/item/areaeditor/proc/move_turfs_to_area(var/list/turf/turfs, var/area/A)
+21 -6
View File
@@ -50,6 +50,8 @@ var/global/list/obj/item/device/pda/PDAs = list()
var/list/ntrclog = list() //NTRC message log
var/new_ntrc_msg = 0
var/image/photo = null //Scanned photo
var/noreturn = 0 //whether the PDA can use the Return button, used for the aiPDA chatroom
/obj/item/device/pda/medical
@@ -815,13 +817,15 @@ var/global/list/obj/item/device/pda/PDAs = list()
if(useTC != 2) // Does our recipient have a broadcaster on their level?
U << "ERROR: Cannot reach recipient."
return
useMS.send_pda_message("[P.owner]","[owner]","[t]")
tnote += "<i><b>&rarr; To [P.owner]:</b></i><br>[t]<br>"
P.tnote += "<i><b>&larr; From <a href='byond://?src=\ref[P];choice=Message;target=\ref[src]'>[owner]</a> ([ownjob]):</b></i><br>[t]<br>"
var/msg_ref = useMS.send_pda_message("[P.owner]","[owner]","[t]",photo)
var/photo_ref = ""
if(photo)
photo_ref = "<a href='byond://?src=\ref[msg_ref];photo=1'>(Photo)</a>"
tnote += "<i><b>&rarr; To [P.owner]:</b></i><br>[t][photo_ref]<br>"
P.tnote += "<i><b>&larr; From <a href='byond://?src=\ref[P];choice=Message;target=\ref[src]'>[owner]</a> ([ownjob]):</b></i><br>[t][photo_ref]<br>"
for(var/mob/M in player_list)
if(isobserver(M) && M.client && (M.client.prefs.chat_toggles & CHAT_GHOSTPDA))
M.show_message("<span class='game say'>PDA Message - <span class='name'>[owner]</span> -> <span class='name'>[P.owner]</span>: <span class='message'>[t]</span></span>")
M.show_message("<span class='game say'>PDA Message - <span class='name'>[owner]</span> -> <span class='name'>[P.owner]</span>: <span class='message'>[t][photo_ref]</span></span>")
if (!P.silent)
playsound(P.loc, 'sound/machines/twobeep.ogg', 50, 1)
@@ -835,9 +839,10 @@ var/global/list/obj/item/device/pda/PDAs = list()
L = get(P, /mob/living/silicon)
if(L)
L << "\icon[P] <b>Message from [src.owner] ([ownjob]), </b>\"[t]\" (<a href='byond://?src=\ref[P];choice=Message;skiprefresh=1;target=\ref[src]'>Reply</a>)"
L << "\icon[P] <b>Message from [src.owner] ([ownjob]), </b>\"[t]\"[photo_ref] (<a href='byond://?src=\ref[P];choice=Message;skiprefresh=1;target=\ref[src]'>Reply</a>)"
log_pda("[usr] (PDA: [src.name]) sent \"[t]\" to [P.name]")
photo = null
P.overlays.Cut()
P.overlays += image('icons/obj/pda.dmi', "pda-r")
else
@@ -967,6 +972,10 @@ var/global/list/obj/item/device/pda/PDAs = list()
return
C.loc = src
user << "<span class='notice'>You slide \the [C] into \the [src].</span>"
else if(istype(C, /obj/item/weapon/photo))
var/obj/item/weapon/photo/P = C
photo = P.img
user << "<span class='notice'>You scan \the [C].</span>"
return
/obj/item/device/pda/attack(mob/living/carbon/C, mob/living/user as mob)
@@ -1104,6 +1113,12 @@ var/global/list/obj/item/device/pda/PDAs = list()
return
var/selected = plist[c]
if(aicamera.aipictures.len>0)
var/add_photo = input(user,"Do you want to attach a photo?","Photo","No") as null|anything in list("Yes","No")
if(add_photo=="Yes")
var/datum/picture/Pic = aicamera.selectpicture(aicamera)
src.aiPDA.photo = Pic.fields["img"]
src.aiPDA.create_message(src, selected)
+25 -6
View File
@@ -6,18 +6,37 @@
item_state = "electronic"
w_class = 2.0
slot_flags = SLOT_BELT
flags = NOBLUDGEON
var/flush = null
origin_tech = "programming=4;materials=4"
/obj/item/device/aicard/attack(mob/living/silicon/ai/M as mob, mob/user as mob)
if(!istype(M, /mob/living/silicon/ai))//If target is not an AI.
return ..()
/obj/item/device/aicard/afterattack(atom/target, mob/user, proximity)
..()
if(!proximity || !target)
return
var/mob/living/silicon/ai/AI = locate(/mob/living/silicon/ai) in src
if(AI) //AI is on the card, implies user wants to upload it.
target.transfer_ai(AI_TRANS_FROM_CARD, user, AI, src)
add_logs(user, AI, "carded", object="[name]")
else //No AI on the card, therefore the user wants to download one.
target.transfer_ai(AI_TRANS_TO_CARD, user, null, src)
update_state() //Whatever happened, update the card's state (icon, name) to match.
add_logs(user, M, "carded", object="[src.name]")
transfer_ai("AICORE", "AICARD", M, user)
return
/obj/item/device/aicard/proc/update_state()
var/mob/living/silicon/ai/AI = locate(/mob/living/silicon/ai) in src //AI is inside.
if(AI)
name = "intelliCard - [AI.name]"
if (AI.stat == DEAD)
icon_state = "aicard-404"
else
icon_state = "aicard-full"
AI.cancel_camera() //AI are forced to move when transferred, so do this whenver one is downloaded.
else
icon_state = "aicard"
name = "intelliCard"
overlays.Cut()
/obj/item/device/aicard/attack_self(mob/user)
if (!in_range(src, user))
@@ -349,8 +349,9 @@
for(var/entry in expandables)
if(istype(W,entry))
if(!user.unEquip(W))
return
bugtype = expandables[entry]
user.drop_item()
W.loc = src
expansion = W
user << "<span class='notice'>You add [W] to [src].</span>"
@@ -0,0 +1,32 @@
/obj/item/device/doorCharge
name = "airlock charge"
desc = null //Different examine for traitors
item_state = "electronic"
icon_state = "doorCharge"
w_class = 2
throw_range = 4
throw_speed = 1
force = 3
attack_verb = list("blown up", "exploded", "detonated")
m_amt = 50
g_amt = 30
/obj/item/device/doorCharge/ex_act(severity, target)
switch(severity)
if(1)
visible_message("<span class='warning'>[src] detonates!</span>")
explosion(src.loc,0,2,1,flame_range = 4)
qdel(src)
if(2)
if(prob(50))
ex_act(1)
if(3)
if(prob(25))
ex_act(1)
/obj/item/device/doorCharge/examine(mob/user)
..()
if(user.mind in ticker.mode.traitors) //No nuke ops because the device is excluded from nuclear
user << "A small explosive device that can be used to sabotage airlocks to cause an explosion upon opening. To apply, remove the airlock's maintenance panel and place it within."
else
user << "A small, suspicious object that feels lukewarm when held."
@@ -47,7 +47,8 @@
/obj/item/device/laser_pointer/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/weapon/stock_parts/micro_laser))
if(!diode)
user.drop_item()
if(!user.unEquip(W))
return
W.loc = src
diode = W
user << "<span class='notice'>You install a [diode.name] in [src].</span>"
@@ -88,9 +88,10 @@
var/obj/item/weapon/light/L = W
if(L.status == 0) // LIGHT OKAY
if(uses < max_uses)
if(!user.unEquip(W))
return
AddUses(1)
user << "<span class='notice'>You insert the [L.name] into the [src.name]. You have [uses] lights remaining.</span>"
user.drop_item()
qdel(L)
return
else
@@ -11,6 +11,12 @@
var/correct_wire
var/armer //Used for admin purposes
/obj/item/device/pizza_bomb/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] is opening [src]! It looks like \he's hungry and looking for pizza.</span>")
sleep(10)
go_boom()
return(BRUTELOSS)
/obj/item/device/pizza_bomb/attack_self(mob/user)
if(disarmed)
user << "<span class='notice'>\The [src] is disarmed.</span>"
@@ -30,7 +36,7 @@
timer = Clamp(timer, 10, 100)
icon_state = "pizzabox1"
user << "<span class='notice'>You set the timer to [timer / 10] before activating the payload and closing \the [src]."
message_admins("[key_name(usr)]<A HREF='?_src_=holder;adminmoreinfo=\ref[usr]'>?</A> has set a timer on a pizza bomb to [timer/10] seconds at <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[loc.x];Y=[loc.y];Z=[loc.z]'>(JMP)</a>.")
message_admins("[key_name_admin(usr)]<A HREF='?_src_=holder;adminmoreinfo=\ref[usr]'>?</A> (<A HREF='?_src_=holder;adminplayerobservefollow=\ref[usr]'>FLW</A>) has set a timer on a pizza bomb to [timer/10] seconds at <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[loc.x];Y=[loc.y];Z=[loc.z]'>(JMP)</a>.")
log_game("[key_name(usr)] has set the timer on a pizza bomb to [timer/10] seconds ([loc.x],[loc.y],[loc.z]).")
armer = usr
name = "pizza box"
@@ -42,8 +48,8 @@
icon_state = "pizzabox_bomb"
audible_message("<span class='warning'>\icon[src] *beep* *beep*</span>")
user << "<span class='danger'>That's no pizza! That's a bomb!</span>"
message_admins("[key_name(usr)]<A HREF='?_src_=holder;adminmoreinfo=\ref[usr]'>?</A> has triggered a pizza bomb armed by [armer] at <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[loc.x];Y=[loc.y];Z=[loc.z]'>(JMP)</a>.")
log_game("[key_name(usr)] has triggered a pizza bomb armed by [armer] ([loc.x],[loc.y],[loc.z]).")
message_admins("[key_name_admin(usr)]<A HREF='?_src_=holder;adminmoreinfo=\ref[usr]'>?</A> (<A HREF='?_src_=holder;adminplayerobservefollow=\ref[usr]'>FLW</A>) has triggered a pizza bomb armed by [key_name_admin(armer)] at <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[loc.x];Y=[loc.y];Z=[loc.z]'>(JMP)</a>.")
log_game("[key_name(usr)] has triggered a pizza bomb armed by [key_name(armer)] ([loc.x],[loc.y],[loc.z]).")
primed = 1
sleep(timer)
return go_boom()
+1 -1
View File
@@ -95,7 +95,7 @@
"[user] activates \the [src]!", \
"<span class='notice'>You activate \the [src].</span>",
"<span class='italics'>You hear a click.</span>")
message_admins("Power sink activated by [key_name(user, user.client)](<A HREF='?_src_=holder;adminmoreinfo=\ref[user]'>?</A>) at ([x],[y],[z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)")
message_admins("Power sink activated by [key_name_admin(user)](<A HREF='?_src_=holder;adminmoreinfo=\ref[user]'>?</A>) (<A HREF='?_src_=holder;adminplayerobservefollow=\ref[user]'>FLW</A>) at ([x],[y],[z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)")
log_game("Power sink activated by [key_name(user)] at ([x],[y],[z])")
set_mode(OPERATING)
@@ -253,12 +253,14 @@
return
if(!keyslot)
user.drop_item()
if(!user.unEquip(W))
return
W.loc = src
keyslot = W
else
user.drop_item()
if(!user.unEquip(W))
return
W.loc = src
keyslot2 = W
@@ -608,7 +608,8 @@
return
if(!keyslot)
user.drop_item()
if(!user.unEquip(W))
return
W.loc = src
keyslot = W
@@ -191,6 +191,13 @@ MASS SPECTROMETER
else
user << "<span class='info'>Blood level [blood_percent] %, [blood_volume] cl, type: [blood_type]</span>"
var/implant_detect
for(var/obj/item/cybernetic_implant/CI in H.internal_organs)
implant_detect += "[H.name] is modified with a [CI.name].<br>"
if(implant_detect)
user.show_message("<span class='notice'>Detected cybernetic modifications:</span>")
user.show_message("<span class='notice'>[implant_detect]</span>")
/proc/chemscan(var/mob/living/user, var/mob/living/M)
if(ishuman(M))
var/mob/living/carbon/human/H = M
@@ -33,7 +33,8 @@
/obj/item/device/taperecorder/attackby(obj/item/I, mob/user, params)
if(!mytape && istype(I, /obj/item/device/tape))
user.drop_item()
if(!user.unEquip(I))
return
I.loc = src
mytape = I
user << "<span class='notice'>You insert [I] into [src].</span>"
@@ -20,15 +20,17 @@
return
if(!tank_one)
if(!user.unEquip(item))
return
tank_one = item
user.drop_item()
item.loc = src
user << "<span class='notice'>You attach the tank to the transfer valve.</span>"
if(item.w_class > w_class)
w_class = item.w_class
else if(!tank_two)
if(!user.unEquip(item))
return
tank_two = item
user.drop_item()
item.loc = src
user << "<span class='notice'>You attach the tank to the transfer valve.</span>"
if(item.w_class > w_class)
@@ -174,21 +176,21 @@
if(!attacher)
attacher_name = "Unknown"
else
attacher_name = "[attacher.name]([attacher.ckey])"
attacher_name = "[key_name_admin(attacher)]"
var/log_str1 = "Bomb valve opened in "
var/log_str2 = "with [attachment] attacher: [attacher_name]"
var/log_attacher = ""
if(attacher)
log_attacher = "(<A HREF='?_src_=holder;adminmoreinfo=\ref[attacher]'>?</A>)"
log_attacher = "(<A HREF='?_src_=holder;adminmoreinfo=\ref[attacher]'>?</A>) (<A HREF='?_src_=holder;adminplayerobservefollow=\ref[attacher]'>FLW</A>)"
var/mob/mob = get_mob_by_key(src.fingerprintslast)
var/last_touch_info = ""
if(mob)
last_touch_info = "(<A HREF='?_src_=holder;adminmoreinfo=\ref[mob]'>?</A>)"
last_touch_info = "(<A HREF='?_src_=holder;adminmoreinfo=\ref[mob]'>?</A>) (<A HREF='?_src_=holder;adminplayerobservefollow=\ref[mob]'>FLW</A>)"
var/log_str3 = " Last touched by: [src.fingerprintslast]"
var/log_str3 = " Last touched by: [key_name_admin(mob)]"
var/bomb_message = "[log_str1] <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[bombturf.x];Y=[bombturf.y];Z=[bombturf.z]'>[A.name]</a> [log_str2][log_attacher] [log_str3][last_touch_info]"
+1 -2
View File
@@ -216,7 +216,6 @@
/obj/item/holotape/hitby(AM as mob|obj)
..()
visible_message("<span class='danger'>[src] was hit by [AM].</span>")
var/tforce = 0
if(ismob(AM))
tforce = 5
@@ -251,4 +250,4 @@
del(src)
return
#undef MAX_TAPE_RANGE
#undef MAX_TAPE_RANGE
+18 -9
View File
@@ -102,28 +102,32 @@
return
if(istype(W, /obj/item/robot_parts/l_leg))
if(src.l_leg) return
user.drop_item()
if(!user.unEquip(W))
return
W.loc = src
src.l_leg = W
src.updateicon()
if(istype(W, /obj/item/robot_parts/r_leg))
if(src.r_leg) return
user.drop_item()
if(!user.unEquip(W))
return
W.loc = src
src.r_leg = W
src.updateicon()
if(istype(W, /obj/item/robot_parts/l_arm))
if(src.l_arm) return
user.drop_item()
if(!user.unEquip(W))
return
W.loc = src
src.l_arm = W
src.updateicon()
if(istype(W, /obj/item/robot_parts/r_arm))
if(src.r_arm) return
user.drop_item()
if(!user.unEquip(W))
return
W.loc = src
src.r_arm = W
src.updateicon()
@@ -131,7 +135,8 @@
if(istype(W, /obj/item/robot_parts/chest))
if(src.chest) return
if(W:wires && W:cell)
user.drop_item()
if(!user.unEquip(W))
return
W.loc = src
src.chest = W
src.updateicon()
@@ -143,7 +148,8 @@
if(istype(W, /obj/item/robot_parts/head))
if(src.head) return
if(W:flash2 && W:flash1)
user.drop_item()
if(!user.unEquip(W))
return
W.loc = src
src.head = W
src.updateicon()
@@ -190,7 +196,8 @@
var/mob/living/silicon/robot/O = new /mob/living/silicon/robot(get_turf(loc))
if(!O) return
user.drop_item()
if(!user.unEquip(W))
return
O.invisibility = 0
//Transfer debug settings to new mob
@@ -297,7 +304,8 @@
user << "<span class='warning'>You have already inserted a cell!</span>"
return
else
user.drop_item()
if(!user.unEquip(W))
return
W.loc = src
src.cell = W
user << "<span class='notice'>You insert the cell.</span>"
@@ -324,7 +332,8 @@
user << "<span class='warning'>You can't use a broken flash!</span>"
return
else
user.drop_item()
if(!user.unEquip(W))
return
F.loc = src
if(src.flash1)
src.flash2 = F
+1 -1
View File
@@ -474,7 +474,7 @@
return
for(var/obj/effect/decal/cleanable/crayon/old_marking in target)
qdel(old_marking)
new /obj/effect/decal/cleanable/crayon/gang(target,gangID,temp,graf_rot)
new /obj/effect/decal/cleanable/crayon/gang(target,gangID,"graffiti",graf_rot)
user << "<span class='notice'>You tagged [territory] for your gang!</span>"
else
+3 -2
View File
@@ -112,7 +112,8 @@ RCD
if((matter + R.ammoamt) > max_matter)
user << "<span class='warning'>The RCD can't hold any more matter-units!</span>"
return
user.drop_item()
if(!user.unEquip(W))
return
qdel(W)
matter += R.ammoamt
playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
@@ -210,7 +211,7 @@ RCD
if(3)
if(istype(A, /turf/simulated/wall))
var/turf/simulated/wall/W
var/turf/simulated/wall/W = A
if(istype(W, /turf/simulated/wall/r_wall) && !canRwall)
return 0
if(checkResource(5, user))
+3 -3
View File
@@ -25,7 +25,7 @@ RPD
var/categoryId = CATEGORY_ATMOS
var/dir=SOUTH
var/dirtype=PIPE_BINARY
var/icon = 'icons/obj/pipe-item.dmi'
var/icon = 'icons/obj/atmospherics/pipes/pipe_item.dmi'
var/icon_state=""
var/selected=0
@@ -39,7 +39,7 @@ RPD
return "<li><a href='?src=\ref[dispenser];makepipe=[id];dir=[dir];type=[dirtype]'>[label]</a></li>"
/datum/pipe_info/meter
icon = 'icons/obj/pipes.dmi'
icon = 'icons/obj/atmospherics/pipes/simple.dmi'
icon_state = "meterX"
/datum/pipe_info/meter/New()
@@ -64,7 +64,7 @@ var/global/list/disposalpipeID2State=list(
/datum/pipe_info/disposal
categoryId = CATEGORY_DISPOSALS
icon = 'icons/obj/pipes/disposal.dmi'
icon = 'icons/obj/atmospherics/pipes/disposal.dmi'
icon_state = "meterX"
/datum/pipe_info/disposal/New(var/pid,var/dt)
@@ -63,7 +63,8 @@
if(ink)
user << "<span class='notice'>\the [name] already contains \a [ink].</span>"
return
user.drop_item()
if(!user.unEquip(W))
return
W.loc = src
user << "<span class='notice'>You install \the [W] into \the [name].</span>"
ink = W
+2 -1
View File
@@ -112,7 +112,8 @@
if(C.maxcharge < paddles.revivecost)
user << "<span class='notice'>[src] requires a higher capacity cell.</span>"
return
user.drop_item()
if(!user.unEquip(W))
return
W.loc = src
bcell = W
user << "<span class='notice'>You install a cell in [src].</span>"
@@ -37,7 +37,8 @@
message_say = "VIVA LA REVOLUTION!"
user.say(message_say)
target = user
message_admins("[key_name(user, user.client)](<A HREF='?_src_=holder;adminmoreinfo=\ref[user]'>?</A>) suicided with [src.name] at ([x],[y],[z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)",0,1)
message_admins("[key_name_admin(user)](<A HREF='?_src_=holder;adminmoreinfo=\ref[user]'>?</A>) (<A HREF='?_src_=holder;adminplayerobservefollow=\ref[user]'>FLW</A>) suicided with [src.name] at ([x],[y],[z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)",0,1)
message_admins("[key_name(user)] suicided with [src.name] at ([x],[y],[z])")
sleep(10)
explode(get_turf(user))
user.gib()
@@ -69,18 +70,19 @@
user << "<span class='notice'>You start planting the bomb...</span>"
if(do_after(user, 50) && in_range(user, target))
user.drop_item()
if(!user.unEquip(src))
return
src.target = target
loc = null
if (ismob(target))
add_logs(user, target, "planted [name] on")
user.visible_message("<span class='warning'>[user.name] finished planting an explosive on [target.name].</span>", "<span class='notice'>You finish planting an explosive on [target.name].</span>")
message_admins("[key_name(user, user.client)](<A HREF='?_src_=holder;adminmoreinfo=\ref[user]'>?</A>) planted [src.name] on [key_name(target)](<A HREF='?_src_=holder;adminmoreinfo=\ref[target]'>?</A>) with [timer] second fuse",0,1)
message_admins("[key_name_admin(user)](<A HREF='?_src_=holder;adminmoreinfo=\ref[user]'>?</A>) (<A HREF='?_src_=holder;adminplayerobservefollow=\ref[user]'>FLW</A>) planted [src.name] on [key_name_admin(target)](<A HREF='?_src_=holder;adminmoreinfo=\ref[target]'>?</A>) (<A HREF='?_src_=holder;adminplayerobservefollow=\ref[target]'>FLW</A>) with [timer] second fuse",0,1)
log_game("[key_name(user)] planted [src.name] on [key_name(target)] with [timer] second fuse")
else
message_admins("[key_name(user, user.client)](<A HREF='?_src_=holder;adminmoreinfo=\ref[user]'>?</A>) planted [src.name] on [target.name] at ([target.x],[target.y],[target.z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[target.x];Y=[target.y];Z=[target.z]'>JMP</a>) with [timer] second fuse",0,1)
message_admins("[key_name_admin(user)](<A HREF='?_src_=holder;adminmoreinfo=\ref[user]'>?</A>) (<A HREF='?_src_=holder;adminplayerobservefollow=\ref[user]'>FLW</A>) planted [src.name] on [target.name] at ([target.x],[target.y],[target.z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[target.x];Y=[target.y];Z=[target.z]'>JMP</a>) with [timer] second fuse",0,1)
log_game("[key_name(user)] planted [src.name] on [target.name] at ([target.x],[target.y],[target.z]) with [timer] second fuse")
target.overlays += image_overlay
@@ -65,6 +65,7 @@
var/turf/target_turf = get_turf(target)
if(target_turf)
var/turflist = getline(user, target_turf)
add_logs(user, target, "flamethrowered", admin=0, addition="at [target.x],[target.y],[target.z]")
flame_turf(turflist)
/obj/item/weapon/flamethrower/attackby(obj/item/W as obj, mob/user as mob, params)
@@ -94,7 +95,8 @@
var/obj/item/device/assembly/igniter/I = W
if(I.secured) return
if(igniter) return
user.drop_item()
if(!user.unEquip(W))
return
I.loc = src
igniter = I
update_icon()
@@ -104,7 +106,8 @@
if(ptank)
user << "<span class='notice'>There appears to already be a plasma tank loaded in [src]!</span>"
return
user.drop_item()
if(!user.unEquip(W))
return
ptank = W
W.loc = src
update_icon()
@@ -55,6 +55,7 @@
/obj/item/weapon/storage/belt/utility/full,
/obj/item/clothing/tie/horrible,
/obj/item/clothing/suit/jacket/leather,
/obj/item/clothing/suit/jacket/leather/overcoat,
/obj/item/clothing/suit/poncho,
/obj/item/clothing/suit/poncho/green,
/obj/item/clothing/suit/poncho/red)
@@ -33,7 +33,7 @@
else if(clown_check(user))
var/turf/bombturf = get_turf(src)
var/area/A = get_area(bombturf)
message_admins("[key_name(usr)]<A HREF='?_src_=holder;adminmoreinfo=\ref[usr]'>?</A> has primed a [name] for detonation at <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[bombturf.x];Y=[bombturf.y];Z=[bombturf.z]'>[A.name] (JMP)</a>.")
message_admins("[key_name_admin(usr)]<A HREF='?_src_=holder;adminmoreinfo=\ref[usr]'>?</A> (<A HREF='?_src_=holder;adminplayerobservefollow=\ref[usr]'>FLW</A>) has primed a [name] for detonation at <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[bombturf.x];Y=[bombturf.y];Z=[bombturf.z]'>[A.name] (JMP)</a>.")
log_game("[key_name(usr)] has primed a [name] for detonation at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z]).")
user << "<span class='warning'>You prime the [name]! [det_time / 10] second\s!</span>"
playsound(user.loc, 'sound/weapons/armbomb.ogg', 60, 1)
@@ -68,8 +68,9 @@
return
else
if(I.reagents.total_volume)
if(!user.unEquip(I))
return
user << "<span class='notice'>You add [I] to the [initial(name)] assembly.</span>"
user.drop_item()
I.loc = src
beakers += I
else
@@ -79,8 +80,9 @@
var/obj/item/device/assembly_holder/A = I
if(isigniter(A.a_left) == isigniter(A.a_right)) //Check if either part of the assembly has an igniter, but if both parts are igniters, then fuck it
return
if(!user.unEquip(I))
return
user.drop_item()
nadeassembly = A
A.master = src
A.loc = src
@@ -171,8 +173,8 @@
var/mob/last = get_mob_by_ckey(nadeassembly.fingerprintslast)
var/turf/T = get_turf(src)
var/area/A = get_area(T)
message_admins("grenade primed by an assembly, attached by [M.key]/[M]<A HREF='?_src_=holder;adminmoreinfo=\ref[M]'>(?)</A> and last touched by [last.key]/[last]<A HREF='?_src_=holder;adminmoreinfo=\ref[last]'>(?)</A> ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>[A.name] (JMP)</a>.")
log_game("grenade primed by an assembly, attached by [M.key]/[M] and last touched by [last.key]/[last] ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] ([T.x], [T.y], [T.z])")
message_admins("grenade primed by an assembly, attached by [key_name_admin(M)]<A HREF='?_src_=holder;adminmoreinfo=\ref[M]'>(?)</A> (<A HREF='?_src_=holder;adminplayerobservefollow=\ref[M]'>FLW</A>) and last touched by [key_name_admin(last)]<A HREF='?_src_=holder;adminmoreinfo=\ref[last]'>(?)</A> (<A HREF='?_src_=holder;adminplayerobservefollow=\ref[last]'>FLW</A>) ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>[A.name] (JMP)</a>.")
log_game("grenade primed by an assembly, attached by [key_name(M)] and last touched by [key_name(last)] ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] ([T.x], [T.y], [T.z])")
playsound(loc, 'sound/effects/bamf.ogg', 50, 1)
@@ -263,8 +265,9 @@
//make a special case you might as well do it explicitly. -Sayu
/obj/item/weapon/grenade/chem_grenade/large/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/slime_extract) && stage == WIRED)
if(!user.unEquip(I))
return
user << "<span class='notice'>You add [I] to the [initial(name)] assembly.</span>"
user.drop_item()
I.loc = src
beakers += I
else
@@ -49,7 +49,7 @@
var/turf/bombturf = get_turf(src)
var/area/A = get_area(bombturf)
message_admins("[key_name(usr)]<A HREF='?_src_=holder;adminmoreinfo=\ref[usr]'>?</A> has primed a [name] for detonation at <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[bombturf.x];Y=[bombturf.y];Z=[bombturf.z]'>[A.name] (JMP)</a>.")
message_admins("[key_name_admin(usr)]<A HREF='?_src_=holder;adminmoreinfo=\ref[usr]'>?</A> (<A HREF='?_src_=holder;adminplayerobservefollow=\ref[usr]'>FLW</A>) has primed a [name] for detonation at <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[bombturf.x];Y=[bombturf.y];Z=[bombturf.z]'>[A.name] (JMP)</a>.")
log_game("[key_name(usr)] has primed a [name] for detonation at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z]).")
if(iscarbon(user))
var/mob/living/carbon/C = user
@@ -64,7 +64,7 @@
add_fingerprint(user)
var/turf/bombturf = get_turf(src)
var/area/A = get_area(bombturf)
message_admins("[key_name(usr)]<A HREF='?_src_=holder;adminmoreinfo=\ref[usr]'>?</A> has primed a [name] for detonation at <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[bombturf.x];Y=[bombturf.y];Z=[bombturf.z]'>[A.name] (JMP)</a>.")
message_admins("[key_name_admin(usr)]<A HREF='?_src_=holder;adminmoreinfo=\ref[usr]'>?</A> (<A HREF='?_src_=holder;adminplayerobservefollow=\ref[usr]'>FLW</A>) has primed a [name] for detonation at <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[bombturf.x];Y=[bombturf.y];Z=[bombturf.z]'>[A.name] (JMP)</a>.")
log_game("[key_name(usr)] has primed a [name] for detonation at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z]).")
if(iscarbon(user))
var/mob/living/carbon/C = user
+3 -2
View File
@@ -49,7 +49,8 @@
/obj/item/weapon/restraints/handcuffs/proc/apply_cuffs(mob/living/carbon/target, mob/user)
if(!target.handcuffed)
user.drop_item()
if(!user.drop_item())
return
//target.throw_alert("handcuffed", src) // Can't do this because escaping cuffs isn't standardized. Also zipties.
if(trashtype)
target.handcuffed = new trashtype(target)
@@ -227,4 +228,4 @@
qdel(src)
/obj/item/weapon/restraints/legcuffs/beartrap/energy/attack_hand(mob/user)
Crossed(user) //honk
Crossed(user) //honk
@@ -174,15 +174,15 @@
/obj/item/weapon/implant/loyalty/implanted(mob/target)
..()
if((target.mind in (ticker.mode.head_revolutionaries | ticker.mode.A_bosses | ticker.mode.B_bosses)) || is_shadow_or_thrall(target))
if((target.mind in ticker.mode.head_revolutionaries) || is_shadow_or_thrall(target))
target.visible_message("<span class='warning'>[target] seems to resist the implant!</span>", "<span class='warning'>You feel the corporate tendrils of Nanotrasen try to invade your mind!</span>")
return 0
if(target.mind in (ticker.mode.A_gang | ticker.mode.B_gang))
ticker.mode.remove_gangster(target.mind, exclude_bosses=0)
return 0
if(target.mind in ticker.mode.revolutionaries)
ticker.mode.remove_revolutionary(target.mind)
target << "<span class='notice'>You feel a surge of loyalty towards Nanotrasen.</span>"
if(target.mind in (ticker.mode.cult| ticker.mode.A_bosses | ticker.mode.B_bosses | ticker.mode.A_gang | ticker.mode.B_gang))
target << "<span class='warning'>You feel the corporate tendrils of Nanotrasen try to invade your mind!</span>"
else
target << "<span class='notice'>You feel a surge of loyalty towards Nanotrasen.</span>"
return 1
@@ -36,7 +36,8 @@
..()
if(istype(C, /obj/item/weapon/implantcase))
if(!case)
user.drop_item()
if(!user.unEquip(C))
return
C.loc = src
case = C
else
@@ -185,8 +185,5 @@
/obj/item/weapon/melee/energy/blade/dropped()
qdel(src)
/obj/item/weapon/melee/energy/blade/proc/throw()
qdel(src)
/obj/item/weapon/melee/energy/blade/attack_self(mob/user)
return
+2 -1
View File
@@ -8,8 +8,9 @@
/obj/item/weapon/pai_cable/proc/plugin(obj/machinery/M as obj, mob/user as mob)
if(istype(M, /obj/machinery/door) || istype(M, /obj/machinery/camera))
if(!user.drop_item())
return
user.visible_message("[user] inserts [src] into a data port on [M].", "<span class='notice'>You insert [src] into a data port on [M].</span>", "<span class='italics'>You hear the satisfying click of a wire jack fastening into place.</span>")
user.drop_item()
src.loc = M
src.machine = M
else
@@ -61,8 +61,9 @@
if(IW.w_class > src.w_class)
user << "<span class='warning'>\The [IW] is too large to fit into \the [src]!</span>"
return
if(!user.unEquip(W))
return
user << "<span class='notice'>You load \the [IW] into \the [src].</span>"
user.drop_item()
loadedItems.Add(IW)
loadedWeightClass += IW.w_class
IW.loc = src
@@ -127,9 +128,10 @@
if(src.tank)
user << "<span class='warning'>\The [src] already has a tank.</span>"
return
if(!user.unEquip(thetank))
return
user << "<span class='notice'>You hook \the [thetank] up to \the [src].</span>"
src.tank = thetank
user.drop_item()
thetank.loc = src
src.update_icons()
@@ -35,6 +35,15 @@
max_w_class = 5
max_combined_w_class = 35
/obj/item/weapon/storage/backpack/holding/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] is jumping into [src]! It looks like \he's trying to commit suicide.</span>")
user.drop_item()
user.Stun(5)
sleep(20)
playsound(src, "rustle", 50, 1, -5)
qdel(user)
return
/obj/item/weapon/storage/backpack/holding/can_be_inserted(obj/item/W, stop_messages = 0, mob/user)
if(crit_fail)
user << "<span class='danger'>The Bluespace generator isn't working.</span>"
@@ -278,6 +287,24 @@
item_state = "duffle-syndieammo"
slowdown = 0
/obj/item/weapon/storage/backpack/dufflebag/syndieammo/loaded
desc = "A large dufflebag, packed to the brim with Bulldog shotgun ammo."
/obj/item/weapon/storage/backpack/dufflebag/syndieammo/loaded/New()
..()
contents = list()
new /obj/item/ammo_box/magazine/m12g(src)
new /obj/item/ammo_box/magazine/m12g(src)
new /obj/item/ammo_box/magazine/m12g(src)
new /obj/item/ammo_box/magazine/m12g(src)
new /obj/item/ammo_box/magazine/m12g(src)
new /obj/item/ammo_box/magazine/m12g(src)
new /obj/item/ammo_box/magazine/m12g/buckshot(src)
new /obj/item/ammo_box/magazine/m12g/stun(src)
new /obj/item/ammo_box/magazine/m12g/dragon(src)
return
/obj/item/weapon/storage/backpack/dufflebag/captain
name = "captain's dufflebag"
desc = "A large dufflebag for holding extra captainly goods."
@@ -41,6 +41,13 @@
user << "<span class='danger'>It's locked!</span>"
return
/obj/item/weapon/storage/lockbox/MouseDrop(over_object, src_location, over_location)
if (locked)
src.add_fingerprint(usr)
usr << "<span class='warning'>It's locked!</span>"
return 0
..()
/obj/item/weapon/storage/lockbox/emag_act(mob/user as mob)
if(!broken)
broken = 1
@@ -57,6 +64,13 @@
..()
return
//Check the destination item type for contentto.
/obj/item/weapon/storage/lockbox/storage_contents_dump_act(obj/item/weapon/storage/src_object, mob/user)
if(locked)
user << "<span class='warning'>It's locked!</span>"
return 0
return ..()
/obj/item/weapon/storage/lockbox/can_be_inserted(obj/item/W, stop_messages = 0)
if(locked)
return 0
@@ -75,10 +75,10 @@
/obj/item/weapon/storage/secure/MouseDrop(over_object, src_location, over_location)
if (locked)
src.add_fingerprint(usr)
return
usr << "<span class='warning'>It's locked!</span>"
return 0
..()
/obj/item/weapon/storage/secure/attack_self(mob/user as mob)
user.set_machine(src)
var/dat = text("<TT><B>[]</B><BR>\n\nLock Status: []",src, (src.locked ? "LOCKED" : "UNLOCKED"))
@@ -128,6 +128,12 @@
return
return
/obj/item/weapon/storage/secure/storage_contents_dump_act(obj/item/weapon/storage/src_object, mob/user)
if(locked)
user << "<span class='warning'>It's locked!</span>"
return 0
return ..()
/obj/item/weapon/storage/secure/can_be_inserted(obj/item/W, stop_messages = 0)
if(locked)
return 0
@@ -25,10 +25,13 @@
var/preposition = "in" // You put things 'in' a bag, but trays need 'on'.
/obj/item/weapon/storage/MouseDrop(obj/over_object)
/obj/item/weapon/storage/MouseDrop(atom/over_object)
if(iscarbon(usr) || isdrone(usr)) //all the check for item manipulation are in other places, you can safely open any storages as anything and its not buggy, i checked
var/mob/M = usr
if(!over_object)
return
if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech
return
@@ -39,13 +42,14 @@
show_to(M)
return
if(!( istype(over_object, /obj/screen) ))
return ..()
if(!(loc == usr) || (loc && loc.loc == usr))
return
playsound(loc, "rustle", 50, 1, -5)
if(!( M.restrained() ) && !( M.stat ))
if(!( istype(over_object, /obj/screen) ))
return content_can_dump(over_object, M)
if(!(loc == usr) || (loc && loc.loc == usr))
return
playsound(loc, "rustle", 50, 1, -5)
switch(over_object.name)
if("r_hand")
if(!M.unEquip(src))
@@ -56,8 +60,26 @@
return
M.put_in_l_hand(src)
add_fingerprint(usr)
return
//Check if this storage can dump the items
/obj/item/weapon/storage/proc/content_can_dump(atom/dest_object, mob/user)
if(Adjacent(user) && dest_object.Adjacent(user))
if(dest_object.storage_contents_dump_act(src, user))
playsound(loc, "rustle", 50, 1, -5)
return 1
return 0
//Object behaviour on storage dump
/obj/item/weapon/storage/storage_contents_dump_act(obj/item/weapon/storage/src_object, mob/user)
for(var/obj/item/I in src_object)
if(can_be_inserted(I,0,user))
src_object.remove_from_storage(I, src)
orient2hud(user)
src_object.orient2hud(user)
if(user.s_active) //refresh the HUD to show the transfered contents
user.s_active.close(user)
user.s_active.show_to(user)
return 1
/obj/item/weapon/storage/proc/return_inv()
var/list/L = list()
+2 -1
View File
@@ -71,7 +71,8 @@
if(C.maxcharge < hitcost)
user << "<span class='notice'>[src] requires a higher capacity cell.</span>"
return
user.drop_item()
if(!user.unEquip(W))
return
W.loc = src
bcell = W
user << "<span class='notice'>You install a cell in [src].</span>"
+10 -19
View File
@@ -96,7 +96,13 @@
ui_interact(user)
/obj/item/weapon/tank/ui_interact(mob/user, ui_key = "main")
/obj/item/weapon/tank/interact(mob/user, ui_key = "main")
SSnano.try_update_ui(user, src, ui_key, null, src.get_ui_data())
/obj/item/weapon/tank/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null)
ui = SSnano.push_open_or_new_ui(user, src, ui_key, ui, "tanks.tmpl", "Tank", 500, 300, 0)
/obj/item/weapon/tank/get_ui_data()
var/mob/living/carbon/location = null
if(istype(loc, /mob/living/carbon))
@@ -104,19 +110,12 @@
else if(istype(loc.loc, /mob/living/carbon))
location = loc.loc
var/using_internal
if(istype(location))
if(location.internal==src)
using_internal = 1
// this is the data which will be sent to the ui
var/data = list()
data["tankPressure"] = round(air_contents.return_pressure() ? air_contents.return_pressure() : 0)
data["releasePressure"] = round(distribute_pressure ? distribute_pressure : 0)
data["defaultReleasePressure"] = round(TANK_DEFAULT_RELEASE_PRESSURE)
data["maxReleasePressure"] = round(TANK_MAX_RELEASE_PRESSURE)
data["valveOpen"] = using_internal ? 1 : 0
data["valveOpen"] = 0
data["maskConnected"] = 0
if(istype(location))
@@ -124,6 +123,7 @@
if(location.internal == src) // if tank is current internal
mask_check = 1
data["valveOpen"] = 1
else if(src in location) // or if tank is in the mobs possession
if(!location.internal) // and they do not have any active internals
mask_check = 1
@@ -131,16 +131,7 @@
if(mask_check)
if(location.wear_mask && (location.wear_mask.flags & MASKINTERNALS))
data["maskConnected"] = 1
var/datum/nanoui/ui = SSnano.get_open_ui(user, src, ui_key)
if (!ui)
ui = new /datum/nanoui(user, src, ui_key, "tanks.tmpl", "Tank", 500, 300)
ui.set_initial_data(data)
ui.open()
ui.set_auto_update(1)
else
ui.push_data(data)
return data
/obj/item/weapon/tank/Topic(href, href_list)
..()
+3 -1
View File
@@ -128,8 +128,10 @@
/obj/item/weapon/twohanded/required/attack_hand(mob/user)//Can't even pick it up without both hands empty
var/obj/item/weapon/twohanded/required/H = user.get_inactive_hand()
if(get_dist(src,user) > 1)
return 0
if(H != null)
user.visible_message("<span class='notice'>[src.name] is too cumbersome to carry in one hand!</span>")
user << "<span class='notice'>[src.name] is too cumbersome to carry in one hand!</span>"
return
var/obj/item/weapon/twohanded/offhand/O = new(user)
user.put_in_inactive_hand(O)