mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-08-22 11:38:12 +01:00
Merge branch 'master' of https://github.com/PolarisSS13/Polaris
Conflicts: html/changelogs/Hubblenaut-dev.yml
This commit is contained in:
@@ -0,0 +1,15 @@
|
||||
|
||||
/client/New()
|
||||
..()
|
||||
dir = NORTH
|
||||
|
||||
/client/verb/spinleft()
|
||||
set name = "Spin View CCW"
|
||||
set category = "OOC"
|
||||
dir = turn(dir, 90)
|
||||
|
||||
/client/verb/spinright()
|
||||
set name = "Spin View CW"
|
||||
set category = "OOC"
|
||||
dir = turn(dir, -90)
|
||||
|
||||
@@ -773,6 +773,13 @@ var/global/list/gear_datums = list()
|
||||
cost = 1
|
||||
allowed_roles = list("Captain")
|
||||
|
||||
/datum/gear/corpdetsuit
|
||||
display_name = "uniform, corporate (Detective)"
|
||||
path = /obj/item/clothing/under/det/corporate
|
||||
cost = 1
|
||||
slot = slot_w_uniform
|
||||
allowed_roles = list("Detective","Head of Security")
|
||||
|
||||
/datum/gear/corpsecsuit
|
||||
display_name = "uniform, corporate (Security)"
|
||||
path = /obj/item/clothing/under/rank/security/corp
|
||||
@@ -1008,7 +1015,7 @@ var/global/list/gear_datums = list()
|
||||
|
||||
/datum/gear/leather_coat
|
||||
display_name = "leather coat"
|
||||
path = /obj/item/clothing/suit/leathercoat/alt
|
||||
path = /obj/item/clothing/suit/leathercoat
|
||||
cost = 2
|
||||
slot = slot_wear_suit
|
||||
|
||||
@@ -1504,6 +1511,12 @@ var/global/list/gear_datums = list()
|
||||
sort_category = "utility"
|
||||
cost = 1
|
||||
|
||||
/datum/gear/communicator
|
||||
display_name = "personal communicator"
|
||||
path = /obj/item/device/communicator
|
||||
sort_category = "utility"
|
||||
cost = 1
|
||||
|
||||
/datum/gear/folder_blue
|
||||
display_name = "folder, blue"
|
||||
path = /obj/item/weapon/folder/blue
|
||||
|
||||
@@ -7,14 +7,13 @@
|
||||
icon_state = "space"
|
||||
desc = "A special helmet designed for work in a hazardous, low-pressure environment."
|
||||
item_flags = STOPPRESSUREDAMAGE | THICKMATERIAL | AIRTIGHT
|
||||
flags_inv = BLOCKHAIR
|
||||
item_state_slots = list(
|
||||
slot_l_hand_str = "s_helmet",
|
||||
slot_r_hand_str = "s_helmet",
|
||||
)
|
||||
permeability_coefficient = 0.01
|
||||
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 50)
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|BLOCKHAIR
|
||||
body_parts_covered = HEAD|FACE|EYES
|
||||
cold_protection = HEAD
|
||||
min_cold_protection_temperature = SPACE_HELMET_MIN_COLD_PROTECTION_TEMPERATURE
|
||||
|
||||
@@ -122,7 +122,7 @@
|
||||
name = "black medical space helmet"
|
||||
desc = "A black helmet sporting a medical cross and durable plating. Hopefully the wearer abides by space geneva."
|
||||
icon_state = "syndicate-helm-black-med"
|
||||
item_state_slots = list(slot_head_str = "syndicate-black-med")
|
||||
item_state_slots = list(slot_head_str = "syndicate-helm-black-med")
|
||||
|
||||
/obj/item/clothing/suit/space/syndicate/black/med
|
||||
name = "black medical space suit"
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 35, bio = 100, rad = 20)
|
||||
max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE
|
||||
|
||||
flags_inv = HIDEEARS | BLOCKHAIR
|
||||
// flags_inv = HIDEEARS|BLOCKHAIR
|
||||
|
||||
//Species-specific stuff.
|
||||
species_restricted = list("Human")
|
||||
|
||||
@@ -212,18 +212,12 @@
|
||||
//coats
|
||||
|
||||
/obj/item/clothing/suit/leathercoat
|
||||
name = "leather coat"
|
||||
desc = "A long, thick black leather coat."
|
||||
icon_state = "leathercoat"
|
||||
item_state = "leathercoat"
|
||||
|
||||
/obj/item/clothing/suit/leathercoat/alt
|
||||
name = "leather coat"
|
||||
desc = "A long, thick black leather coat."
|
||||
icon_state = "leathercoat_alt"
|
||||
item_state = "leathercoat_alt"
|
||||
|
||||
/obj/item/clothing/suit/leathercoat/alt/sec
|
||||
/obj/item/clothing/suit/leathercoat/sec
|
||||
name = "leather coat"
|
||||
desc = "A long, thick black leather coat."
|
||||
icon_state = "leathercoat_sec"
|
||||
@@ -397,11 +391,8 @@
|
||||
body_parts_covered = UPPER_TORSO|ARMS
|
||||
|
||||
/obj/item/clothing/suit/storage/leather_jacket/alt
|
||||
name = "leather jacket"
|
||||
desc = "A black leather coat."
|
||||
icon_state = "leather_jacket_alt"
|
||||
item_state = "leather_jacket_alt"
|
||||
body_parts_covered = UPPER_TORSO|ARMS
|
||||
icon_state = "leatherjacket_alt"
|
||||
item_state = "leatherjacket_alt"
|
||||
|
||||
/obj/item/clothing/suit/storage/leather_jacket/nanotrasen
|
||||
desc = "A black leather coat. A corporate logo is proudly displayed on the back."
|
||||
@@ -409,7 +400,7 @@
|
||||
|
||||
//This one has buttons for some reason
|
||||
/obj/item/clothing/suit/storage/toggle/brown_jacket
|
||||
name = "leather jacket"
|
||||
name = "brown jacket"
|
||||
desc = "A brown leather coat."
|
||||
icon_state = "brown_jacket"
|
||||
item_state = "brown_jacket"
|
||||
|
||||
@@ -53,6 +53,7 @@ var/list/ai_verbs_default = list(
|
||||
var/viewalerts = 0
|
||||
var/icon/holo_icon//Default is assigned when AI is created.
|
||||
var/obj/item/device/pda/ai/aiPDA = null
|
||||
var/obj/item/device/communicator/aiCommunicator = null
|
||||
var/obj/item/device/multitool/aiMulti = null
|
||||
var/obj/item/device/radio/headset/heads/ai_integrated/aiRadio = null
|
||||
var/camera_light_on = 0 //Defines if the AI toggled the light on the camera it's looking through.
|
||||
@@ -114,6 +115,9 @@ var/list/ai_verbs_default = list(
|
||||
density = 1
|
||||
loc = loc
|
||||
|
||||
aiCommunicator = new /obj/item/device/communicator/integrated(src)
|
||||
|
||||
|
||||
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo1"))
|
||||
|
||||
proc_holder_list = new()
|
||||
@@ -243,6 +247,9 @@ var/list/ai_verbs_default = list(
|
||||
aiPDA.owner = pickedName
|
||||
aiPDA.name = pickedName + " (" + aiPDA.ownjob + ")"
|
||||
|
||||
if(aiCommunicator)
|
||||
aiCommunicator.register_device(src)
|
||||
|
||||
/*
|
||||
The AI Power supply is a dummy object used for powering the AI since only machinery should be using power.
|
||||
The alternative was to rewrite a bunch of AI code instead here we are.
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
var/userDNA // The DNA string of our assigned user
|
||||
var/obj/item/device/paicard/card // The card we inhabit
|
||||
var/obj/item/device/radio/radio // Our primary radio
|
||||
var/obj/item/device/communicator/integrated/communicator // Our integrated communicator.
|
||||
|
||||
var/chassis = "repairbot" // A record of your chosen chassis.
|
||||
var/global/list/possible_chassis = list(
|
||||
@@ -75,6 +76,7 @@
|
||||
src.loc = paicard
|
||||
card = paicard
|
||||
sradio = new(src)
|
||||
communicator = new(src)
|
||||
if(card)
|
||||
if(!card.radio)
|
||||
card.radio = new /obj/item/device/radio(src.card)
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
var/module_state_3 = null
|
||||
|
||||
var/obj/item/device/radio/borg/radio = null
|
||||
var/obj/item/device/communicator/integrated/communicator = null
|
||||
var/mob/living/silicon/ai/connected_ai = null
|
||||
var/obj/item/weapon/cell/cell = null
|
||||
var/obj/machinery/camera/camera = null
|
||||
@@ -110,6 +111,8 @@
|
||||
updateicon()
|
||||
|
||||
radio = new /obj/item/device/radio/borg(src)
|
||||
// communicator = new /obj/item/device/communicator/integrated(src)
|
||||
// communicator.register_device(src)
|
||||
common_radio = radio
|
||||
|
||||
if(!scrambledcodes && !camera)
|
||||
@@ -199,6 +202,11 @@
|
||||
rbPDA = new/obj/item/device/pda/ai(src)
|
||||
rbPDA.set_name_and_job(custom_name,"[modtype] [braintype]")
|
||||
|
||||
/mob/living/silicon/robot/proc/setup_communicator()
|
||||
if (!communicator)
|
||||
communicator = new/obj/item/device/communicator/integrated(src)
|
||||
communicator.register_device(src, "[modtype] [braintype]")
|
||||
|
||||
//If there's an MMI in the robot, have it ejected when the mob goes away. --NEO
|
||||
//Improved /N
|
||||
/mob/living/silicon/robot/Destroy()
|
||||
@@ -279,6 +287,9 @@
|
||||
// if we've changed our name, we also need to update the display name for our PDA
|
||||
setup_PDA()
|
||||
|
||||
// as well as our communicator registration
|
||||
setup_communicator()
|
||||
|
||||
//We also need to update name of internal camera.
|
||||
if (camera)
|
||||
camera.c_tag = changed_name
|
||||
|
||||
@@ -0,0 +1,94 @@
|
||||
//A very, very simple mob that exists inside other objects to talk and has zero influence on the world.
|
||||
/mob/living/voice
|
||||
name = "unknown"
|
||||
desc = "How are you examining me?"
|
||||
// default_language = "Galactic Common"
|
||||
var/obj/item/device/communicator/comm = null
|
||||
|
||||
emote_type = 2 //This lets them emote through containers. The communicator has a image feed of the person calling them so...
|
||||
var/stable_connection = 0 //If set to zero, makes the mob effectively deaf, mute, and blind, due to interferance.
|
||||
|
||||
|
||||
/mob/living/voice/New(loc)
|
||||
add_language("Galactic Common")
|
||||
for(var/datum/language/L in languages) //This is needed to get around some saycode problems.
|
||||
if(L.name == "Galactic Common")
|
||||
set_default_language(L)
|
||||
break
|
||||
|
||||
if(istype(loc, /obj/item/device/communicator))
|
||||
comm = loc
|
||||
..()
|
||||
|
||||
/mob/living/voice/proc/transfer_identity(mob/speaker)
|
||||
if(ismob(speaker))
|
||||
icon = speaker.icon
|
||||
icon_state = speaker.icon_state
|
||||
overlays = speaker.overlays
|
||||
|
||||
alpha = 127 //Maybe we'll have hologram calls later.
|
||||
if(speaker.client && speaker.client.prefs)
|
||||
var/datum/preferences/p = speaker.client.prefs
|
||||
name = p.real_name
|
||||
real_name = name
|
||||
gender = p.gender
|
||||
|
||||
for(var/language in p.alternate_languages)
|
||||
add_language(language)
|
||||
|
||||
/mob/living/voice/Login()
|
||||
var/obj/screen/static_effect = new() //Since what the player sees is essentially a video feed, from a vast distance away, the view isn't going to be perfect.
|
||||
static_effect.screen_loc = ui_entire_screen
|
||||
static_effect.icon = 'icons/effects/static.dmi'
|
||||
static_effect.icon_state = "1 light"
|
||||
static_effect.mouse_opacity = 0 //So the static doesn't get in the way of clicking.
|
||||
client.screen.Add(static_effect)
|
||||
|
||||
/mob/living/voice/Destroy()
|
||||
comm = null
|
||||
..()
|
||||
|
||||
/mob/living/voice/verb/hang_up()
|
||||
set name = "Hang Up"
|
||||
set category = "Communicator"
|
||||
set desc = "Disconnects you from whoever you're talking to."
|
||||
set src = usr
|
||||
|
||||
if(comm)
|
||||
comm.close_connection(src, "[src] hung up")
|
||||
else
|
||||
src << "You appear to not be inside a communicator. This is a bug and you should report it."
|
||||
|
||||
/mob/living/voice/Life()
|
||||
if(comm && comm.server && !comm.server.active)
|
||||
comm.close_connection(src,"Connection to telecommunications array timed out")
|
||||
..()
|
||||
|
||||
/mob/living/voice/say(var/message, var/datum/language/speaking = null, var/verb="says", var/alt_name="")
|
||||
// world << "say() was called. Arguments: ([message], [speaking], [verb], [alt_name])."
|
||||
if(!stable_connection)
|
||||
return 0
|
||||
|
||||
//Speech bubbles.
|
||||
if(comm)
|
||||
var/speech_bubble_test = say_test(message)
|
||||
var/image/speech_bubble = image('icons/mob/talk.dmi',src,"h[speech_bubble_test]")
|
||||
spawn(30)
|
||||
qdel(speech_bubble)
|
||||
|
||||
for(var/mob/M in hearers(world.view,comm)) //simplifed since it's just a speech bubble
|
||||
M << speech_bubble
|
||||
src << speech_bubble
|
||||
|
||||
..(message, speaking, verb, alt_name) //mob/living/say() can do the actual talking.
|
||||
/*
|
||||
/mob/verb/test_voice_mob()
|
||||
set name = "Make Voice Mob"
|
||||
set category = "Debug"
|
||||
set desc = "For testing only!"
|
||||
set src = usr
|
||||
|
||||
var/turf/T = get_turf(src)
|
||||
var/obj/item/device/communicator/comm = new(T)
|
||||
comm.open_connection(src, src)
|
||||
*/
|
||||
@@ -733,8 +733,8 @@
|
||||
if(istype(buckled, /obj/vehicle))
|
||||
var/obj/vehicle/V = buckled
|
||||
if(cannot_stand())
|
||||
lying = 1
|
||||
canmove = 0
|
||||
lying = 0
|
||||
canmove = 1
|
||||
pixel_y = V.mob_offset_y - 5
|
||||
else
|
||||
if(buckled.buckle_lying != -1) lying = buckled.buckle_lying
|
||||
|
||||
@@ -206,6 +206,14 @@
|
||||
name = "Bun"
|
||||
icon_state = "hair_bun"
|
||||
|
||||
bun2
|
||||
name = "Bun 2"
|
||||
icon_state = "hair_bun2"
|
||||
|
||||
bun3
|
||||
name = "Bun 3"
|
||||
icon_state = "hair_bun3"
|
||||
|
||||
bowl
|
||||
name = "Bowl"
|
||||
icon_state = "hair_bowlcut"
|
||||
@@ -267,6 +275,14 @@
|
||||
name = "Long Emo"
|
||||
icon_state = "hair_emolong"
|
||||
|
||||
fringeemo
|
||||
name = "Emo Fringe"
|
||||
icon_state = "hair_emofringe"
|
||||
|
||||
veryshortovereyealternate
|
||||
name = "Overeye Very Short, Alternate"
|
||||
icon_state = "hair_veryshortovereyealternate"
|
||||
|
||||
veryshortovereye
|
||||
name = "Overeye Very Short"
|
||||
icon_state = "hair_veryshortovereye"
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
/datum/proc/nano_host()
|
||||
return src
|
||||
|
||||
/datum/proc/nano_container()
|
||||
return src
|
||||
|
||||
/datum/proc/CanUseTopic(var/mob/user, var/datum/topic_state/state)
|
||||
var/src_object = nano_host()
|
||||
return state.can_use_topic(src_object, user)
|
||||
|
||||
@@ -9,10 +9,12 @@
|
||||
/mob/proc/default_can_use_topic(var/src_object)
|
||||
return STATUS_CLOSE // By default no mob can do anything with NanoUI
|
||||
|
||||
/mob/dead/observer/default_can_use_topic()
|
||||
/mob/dead/observer/default_can_use_topic(var/src_object)
|
||||
if(can_admin_interact())
|
||||
return STATUS_INTERACTIVE // Admins are more equal
|
||||
return STATUS_UPDATE // Ghosts can view updates
|
||||
return STATUS_INTERACTIVE // Admins are more equal
|
||||
if(!client || get_dist(src_object, src) > client.view) // Preventing ghosts from having a million windows open by limiting to objects in range
|
||||
return STATUS_CLOSE
|
||||
return STATUS_UPDATE // Ghosts can view updates
|
||||
|
||||
/mob/living/silicon/pai/default_can_use_topic(var/src_object)
|
||||
if((src_object == src || src_object == radio) && !stat)
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
/*
|
||||
This state always returns STATUS_INTERACTIVE
|
||||
*/
|
||||
/var/global/datum/topic_state/interactive/interactive_state = new()
|
||||
|
||||
/datum/topic_state/interactive/can_use_topic(var/src_object, var/mob/user)
|
||||
return STATUS_INTERACTIVE
|
||||
@@ -0,0 +1,39 @@
|
||||
/*
|
||||
This state checks that user is capable, within range of the remoter, etc. and that src_object meets the basic requirements for interaction (being powered, non-broken, etc.
|
||||
Whoever initializes this state is also responsible for deleting it properly.
|
||||
*/
|
||||
/datum/topic_state/remote
|
||||
var/datum/remoter
|
||||
var/datum/remote_target
|
||||
var/datum/topic_state/remoter_state
|
||||
|
||||
/datum/topic_state/remote/New(var/remoter, var/remote_target, var/datum/topic_state/remoter_state = default_state)
|
||||
src.remoter = remoter
|
||||
src.remote_target = remote_target
|
||||
src.remoter_state = remoter_state
|
||||
..()
|
||||
|
||||
/datum/topic_state/remote/Destroy()
|
||||
src.remoter = null
|
||||
src.remoter_state = null
|
||||
|
||||
// Force an UI update before we go, ensuring that any windows we may have opened for the remote target closes.
|
||||
nanomanager.update_uis(remote_target.nano_container())
|
||||
remote_target = null
|
||||
return ..()
|
||||
|
||||
/datum/topic_state/remote/can_use_topic(var/datum/src_object, var/mob/user)
|
||||
if(!(remoter && remoter_state)) // The remoter is gone, let us leave
|
||||
return STATUS_CLOSE
|
||||
|
||||
if(src_object != remote_target)
|
||||
error("remote - Unexpected src_object: Expected '[remote_target]'/[remote_target.type], was '[src_object]'/[src_object.type]")
|
||||
|
||||
// This checks if src_object is powered, etc.
|
||||
// The interactive state is otherwise simplistic and only returns STATUS_INTERACTIVE and never checks distances, etc.
|
||||
. = src_object.CanUseTopic(user, interactive_state)
|
||||
if(. == STATUS_CLOSE)
|
||||
return
|
||||
|
||||
// This is the (generally) heavy checking, making sure the user is capable, within range of the remoter source, etc.
|
||||
return min(., remoter.CanUseTopic(user, remoter_state))
|
||||
@@ -47,7 +47,7 @@
|
||||
// Allows us to process UI clicks, which are relayed in form of hrefs.
|
||||
/datum/nano_module/power_monitor/Topic(href, href_list)
|
||||
if(..())
|
||||
return
|
||||
return 1
|
||||
if( href_list["clear"] )
|
||||
active_sensor = null
|
||||
if( href_list["refresh"] )
|
||||
|
||||
@@ -140,7 +140,8 @@ nanoui is used to open and update nano browser uis
|
||||
* @return nothing
|
||||
*/
|
||||
/datum/nanoui/proc/update_status(var/push_update = 0)
|
||||
var/new_status = src_object.CanUseTopic(user, state)
|
||||
var/obj/host = src_object.nano_host()
|
||||
var/new_status = host.CanUseTopic(user, state)
|
||||
if(master_ui)
|
||||
new_status = min(new_status, master_ui.status)
|
||||
|
||||
@@ -428,6 +429,9 @@ nanoui is used to open and update nano browser uis
|
||||
user << browse(null, "window=[window_id]")
|
||||
for(var/datum/nanoui/child in children)
|
||||
child.close()
|
||||
children.Cut()
|
||||
state = null
|
||||
master_ui = null
|
||||
|
||||
/**
|
||||
* Set the UI window to call the nanoclose verb when the window is closed
|
||||
|
||||
+14
-12
@@ -720,11 +720,6 @@
|
||||
// do APC interaction
|
||||
src.interact(user)
|
||||
|
||||
/obj/machinery/power/apc/attack_ghost(user as mob)
|
||||
if(stat & (BROKEN|MAINT))
|
||||
return
|
||||
return ui_interact(user)
|
||||
|
||||
/obj/machinery/power/apc/interact(mob/user)
|
||||
if(!user)
|
||||
return
|
||||
@@ -749,7 +744,7 @@
|
||||
"totalLoad" = round(lastused_total),
|
||||
"totalCharging" = round(lastused_charging),
|
||||
"coverLocked" = coverlocked,
|
||||
"siliconUser" = istype(user, /mob/living/silicon),
|
||||
"siliconUser" = issilicon(user) || isobserver(user), //I add observer here so admins can have more control, even if it makes 'siliconUser' seem inaccurate.
|
||||
|
||||
"powerChannels" = list(
|
||||
list(
|
||||
@@ -822,11 +817,13 @@
|
||||
|
||||
|
||||
/obj/machinery/power/apc/proc/can_use(mob/user as mob, var/loud = 0) //used by attack_hand() and Topic()
|
||||
if(!user.client)
|
||||
return 0
|
||||
if(isobserver(user) && is_admin(user) ) //This is to allow nanoUI interaction by ghost admins.
|
||||
return 1
|
||||
if (user.stat)
|
||||
user << "<span class='warning'>You must be conscious to use [src]!</span>"
|
||||
return 0
|
||||
if(!user.client)
|
||||
return 0
|
||||
if(inoperable())
|
||||
return 0
|
||||
if(!user.IsAdvancedToolUser())
|
||||
@@ -872,10 +869,15 @@
|
||||
if(!can_use(usr, 1))
|
||||
return 1
|
||||
|
||||
if(!istype(usr, /mob/living/silicon) && locked)
|
||||
// Shouldn't happen, this is here to prevent href exploits
|
||||
usr << "You must unlock the panel to use this!"
|
||||
return 1
|
||||
if(locked && !issilicon(usr) )
|
||||
if(isobserver(usr) )
|
||||
var/mob/dead/observer/O = usr //Added to allow admin nanoUI interactions.
|
||||
if(!O.can_admin_interact() ) //NanoUI /should/ make this not needed, but better safe than sorry.
|
||||
usr << "Try as you might, your ghostly fingers can't press the buttons."
|
||||
return 1
|
||||
else
|
||||
usr << "You must unlock the panel to use this!"
|
||||
return 1
|
||||
|
||||
if (href_list["lock"])
|
||||
coverlocked = !coverlocked
|
||||
|
||||
@@ -107,7 +107,7 @@
|
||||
continue
|
||||
if(O.invisibility == 101)
|
||||
O.singularity_act(src, current_size)
|
||||
ChangeTurf(get_base_turf(src.z))
|
||||
ChangeTurf(get_base_turf_by_area(src))
|
||||
return 2
|
||||
|
||||
/turf/simulated/wall/singularity_pull(S, current_size)
|
||||
|
||||
@@ -223,10 +223,7 @@
|
||||
|
||||
|
||||
/obj/machinery/power/smes/attack_ai(mob/user)
|
||||
add_fingerprint(user)
|
||||
ui_interact(user)
|
||||
|
||||
/obj/machinery/power/smes/attack_ghost(mob/user)
|
||||
add_hiddenprint(user)
|
||||
ui_interact(user)
|
||||
|
||||
/obj/machinery/power/smes/attack_hand(mob/user)
|
||||
|
||||
@@ -309,6 +309,14 @@
|
||||
|
||||
return !P.launch_from_gun(target, user, src, target_zone, x_offset, y_offset)
|
||||
|
||||
//apart of reskins that have two sprites, touching may result in frustration and breaks
|
||||
/obj/item/weapon/gun/projectile/colt/detective/attack_hand(var/mob/living/user)
|
||||
if(!unique_reskin && loc == user)
|
||||
reskin_gun(user)
|
||||
return
|
||||
..()
|
||||
|
||||
|
||||
//Suicide handling.
|
||||
/obj/item/weapon/gun/var/mouthshoot = 0 //To stop people from suiciding twice... >.>
|
||||
/obj/item/weapon/gun/proc/handle_suicide(mob/living/user)
|
||||
@@ -389,5 +397,4 @@
|
||||
return new_mode
|
||||
|
||||
/obj/item/weapon/gun/attack_self(mob/user)
|
||||
switch_firemodes(user)
|
||||
|
||||
switch_firemodes(user)
|
||||
@@ -30,7 +30,7 @@
|
||||
|
||||
/obj/item/weapon/gun/projectile/automatic/c20r
|
||||
name = "submachine gun"
|
||||
desc = "The C-20r is a lightweight and rapid firing SMG, for when you REALLY need someone dead. Uses 12mm rounds. Has a 'Scarborough Arms - Per falcis, per pravitas' buttstamp."
|
||||
desc = "The C-20r is a lightweight and rapid firing SMG, for when you REALLY need someone dead. Uses 10mm rounds. Has a 'Scarborough Arms - Per falcis, per pravitas' buttstamp."
|
||||
icon_state = "c20r"
|
||||
item_state = "c20r"
|
||||
w_class = 3
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
/obj/item/weapon/gun/projectile/colt
|
||||
var/unique_reskin
|
||||
name = "vintage .45 pistol"
|
||||
desc = "A cheap Martian knock-off of a Colt M1911. Uses .45 rounds."
|
||||
magazine_type = /obj/item/ammo_magazine/c45m
|
||||
@@ -12,6 +13,18 @@
|
||||
desc = "A Martian recreation of an old Terran pistol. Uses .45 rounds."
|
||||
magazine_type = /obj/item/ammo_magazine/c45m/rubber
|
||||
|
||||
/obj/item/weapon/gun/projectile/colt/detective/update_icon()
|
||||
if(ammo_magazine)
|
||||
if(unique_reskin)
|
||||
icon_state = unique_reskin
|
||||
else
|
||||
icon_state = initial(icon_state)
|
||||
else
|
||||
if(unique_reskin)
|
||||
icon_state = "[unique_reskin]-e"
|
||||
else
|
||||
icon_state = "[initial(icon_state)]-e"
|
||||
|
||||
/obj/item/weapon/gun/projectile/colt/detective/verb/rename_gun()
|
||||
set name = "Name Gun"
|
||||
set category = "Object"
|
||||
@@ -40,9 +53,14 @@
|
||||
options["NT Mk. 58"] = "secguncomp"
|
||||
options["NT Mk. 58 Custom"] = "secgundark"
|
||||
options["Colt M1911"] = "colt"
|
||||
options["USP"] = "usp"
|
||||
options["H&K VP"] = "VP78"
|
||||
options["P08 Luger"] = "p08"
|
||||
options["P08 Luger, Brown"] = "p08b"
|
||||
var/choice = input(M,"What do you want to skin the gun to?","Reskin Gun") in options
|
||||
if(src && choice && !M.stat && in_range(M,src))
|
||||
icon_state = options[choice]
|
||||
unique_reskin = options[choice]
|
||||
M << "Your gun is now skinned as [choice]. Say hello to your new friend."
|
||||
return 1
|
||||
|
||||
@@ -56,6 +74,13 @@
|
||||
fire_sound = 'sound/weapons/Gunshot_light.ogg'
|
||||
load_method = MAGAZINE
|
||||
|
||||
/obj/item/weapon/gun/projectile/sec/update_icon()
|
||||
..()
|
||||
if(ammo_magazine)
|
||||
icon_state = "secguncomp"
|
||||
else
|
||||
icon_state = "secguncomp-e"
|
||||
|
||||
/obj/item/weapon/gun/projectile/sec/flash
|
||||
name = ".45 signal pistol"
|
||||
magazine_type = /obj/item/ammo_magazine/c45m/flash
|
||||
@@ -65,6 +90,13 @@
|
||||
name = "custom .45 Pistol"
|
||||
icon_state = "secgundark"
|
||||
|
||||
/obj/item/weapon/gun/projectile/sec/wood/update_icon()
|
||||
..()
|
||||
if(ammo_magazine)
|
||||
icon_state = "secgundark"
|
||||
else
|
||||
icon_state = "secgundark-e"
|
||||
|
||||
/obj/item/weapon/gun/projectile/silenced
|
||||
name = "silenced pistol"
|
||||
desc = "A small, quiet, easily concealable gun. Uses .45 rounds."
|
||||
|
||||
@@ -73,6 +73,26 @@
|
||||
qdel(src)
|
||||
return B
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/verb/smash_bottle()
|
||||
set name = "Smash Bottle"
|
||||
set category = "Object"
|
||||
|
||||
var/list/things_to_smash_on = list()
|
||||
for(var/atom/A in range (1, usr))
|
||||
if(A.density && usr.Adjacent(A) && !istype(A, /mob))
|
||||
things_to_smash_on += A
|
||||
|
||||
var/atom/choice = input("Select what you want to smash the bottle on.") as null|anything in things_to_smash_on
|
||||
if(!choice)
|
||||
return
|
||||
if(!(choice.density && usr.Adjacent(choice)))
|
||||
usr << "<span class='warning'>You must stay close to your target! You moved away from \the [choice]</span>"
|
||||
return
|
||||
|
||||
usr.put_in_hands(src.smash(usr.loc, choice))
|
||||
usr.visible_message("<span class='danger'>\The [usr] smashed \the [src] on \the [choice]!</span>")
|
||||
usr << "<span class='danger'>You smash \the [src] on \the [choice]!</span>"
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/attackby(obj/item/W, mob/user)
|
||||
if(!rag && istype(W, /obj/item/weapon/reagent_containers/glass/rag))
|
||||
insert_rag(W, user)
|
||||
@@ -452,6 +472,4 @@
|
||||
center_of_mass = list("x"=16, "y"=10)
|
||||
New()
|
||||
..()
|
||||
reagents.add_reagent("ale", 30)
|
||||
|
||||
|
||||
reagents.add_reagent("ale", 30)
|
||||
Reference in New Issue
Block a user