Merge branch 'master' into development
@@ -270,6 +270,10 @@
|
||||
#include "code\datums\helper_datums\getrev.dm"
|
||||
#include "code\datums\helper_datums\teleport.dm"
|
||||
#include "code\datums\helper_datums\topic_input.dm"
|
||||
#include "code\datums\observation\_debug.dm"
|
||||
#include "code\datums\observation\destroyed.dm"
|
||||
#include "code\datums\observation\moved.dm"
|
||||
#include "code\datums\observation\observation.dm"
|
||||
#include "code\datums\radio\frequency.dm"
|
||||
#include "code\datums\radio\signal.dm"
|
||||
#include "code\datums\repositories\cameras.dm"
|
||||
@@ -370,9 +374,6 @@
|
||||
#include "code\game\area\areas.dm"
|
||||
#include "code\game\area\asteroid_areas.dm"
|
||||
#include "code\game\area\Space Station 13 areas.dm"
|
||||
#include "code\game\datum_events\death.dm"
|
||||
#include "code\game\datum_events\destroyed.dm"
|
||||
#include "code\game\datum_events\moved.dm"
|
||||
#include "code\game\dna\dna2.dm"
|
||||
#include "code\game\dna\dna2_domutcheck.dm"
|
||||
#include "code\game\dna\dna2_helpers.dm"
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
#define LAZYACCESS(L, I) (L ? (isnum(I) ? (I > 0 && I <= L.len ? L[I] : null) : L[I]) : null)
|
||||
#define LAZYLEN(L) length(L)
|
||||
#define LAZYCLEARLIST(L) if(L) L.Cut()
|
||||
#define LAZYSET(L, K, V) if(!L) { L = list(); } L[K] = V;
|
||||
#define LAZYSET(L, K, V) if (!L) { L = list(); } L[K] = V;
|
||||
#define LAZYPICK(L,DEFAULT) (LAZYLEN(L) ? pick(L) : DEFAULT)
|
||||
|
||||
// Shims for some list procs in lists.dm.
|
||||
|
||||
@@ -235,22 +235,19 @@ var/datum/controller/subsystem/garbage_collector/SSgarbage
|
||||
// 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.
|
||||
/datum/proc/Destroy(force=FALSE)
|
||||
if (destroy_listeners)
|
||||
RaiseOnDestroy()
|
||||
|
||||
SSnanoui.close_uis(src)
|
||||
|
||||
weakref = null
|
||||
destroyed_event.raise_event(src)
|
||||
SSnanoui.close_uis(src)
|
||||
tag = null
|
||||
|
||||
var/list/timers = active_timers
|
||||
active_timers = null
|
||||
if (timers)
|
||||
for(var/thing in timers)
|
||||
for (var/thing in timers)
|
||||
var/datum/timedevent/timer = thing
|
||||
if (timer.spent)
|
||||
continue
|
||||
qdel(timer)
|
||||
|
||||
return QDEL_HINT_QUEUE
|
||||
|
||||
/datum/var/gcDestroyed //Time when this object was destroyed.
|
||||
|
||||
@@ -505,6 +505,10 @@
|
||||
H.centcomm_despawn_timer = addtimer(CALLBACK(H, /mob/living/.proc/centcomm_timeout), 10 MINUTES, TIMER_STOPPABLE)
|
||||
|
||||
var/datum/job/job = GetJob(rank)
|
||||
|
||||
if(spawning_at != "Arrivals Shuttle" || job.latejoin_at_spawnpoints)
|
||||
return EquipRank(H, rank, 1)
|
||||
|
||||
var/list/spawn_in_storage = list()
|
||||
H <<"<span class='notice'>You have ten minutes to reach the station before you will be forced there.</span>"
|
||||
|
||||
@@ -771,8 +775,14 @@
|
||||
else
|
||||
permitted = TRUE
|
||||
|
||||
if(G.whitelisted && !is_alien_whitelisted(H, all_species[G.whitelisted]))
|
||||
permitted = FALSE
|
||||
if (G.whitelisted)
|
||||
var/found = FALSE
|
||||
for (var/species in G.whitelisted)
|
||||
if (is_alien_whitelisted(H, global.all_species[species]))
|
||||
found = TRUE
|
||||
break
|
||||
if (!found)
|
||||
permitted = FALSE
|
||||
|
||||
if(!permitted)
|
||||
H << "<span class='warning'>Your current job or whitelist status does not permit you to spawn with [thing]!</span>"
|
||||
|
||||
@@ -11,7 +11,8 @@
|
||||
/var/list/controller_debug_list = list(
|
||||
"Configuration",
|
||||
"Cameras",
|
||||
"Gas Data"
|
||||
"Gas Data",
|
||||
"Observation"
|
||||
)
|
||||
|
||||
/client/proc/debug_controller(controller in controller_debug_list)
|
||||
@@ -30,4 +31,7 @@
|
||||
if("Gas Data")
|
||||
debug_variables(gas_data)
|
||||
feedback_add_details("admin_verb","DGasdata")
|
||||
if("Observation")
|
||||
debug_variables(all_observable_events)
|
||||
feedback_add_details("admin_verb", "DObservation")
|
||||
message_admins("Admin [key_name_admin(usr)] is debugging the [controller] controller.")
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
/****************
|
||||
* Debug Support *
|
||||
****************/
|
||||
var/datum/all_observable_events/all_observable_events = new()
|
||||
|
||||
/datum/all_observable_events
|
||||
var/list/events
|
||||
|
||||
/datum/all_observable_events/New()
|
||||
events = list()
|
||||
..()
|
||||
@@ -0,0 +1,4 @@
|
||||
var/datum/observ/destroyed/destroyed_event = new()
|
||||
|
||||
/datum/observ/destroyed
|
||||
name = "Destroyed"
|
||||
@@ -0,0 +1,41 @@
|
||||
var/datum/observ/moved/moved_event = new()
|
||||
|
||||
/datum/observ/moved
|
||||
name = "Moved"
|
||||
expected_type = /atom/movable
|
||||
|
||||
/datum/observ/moved/register(var/eventSource, var/datum/procOwner, var/proc_call)
|
||||
. = ..()
|
||||
var/atom/movable/child = eventSource
|
||||
if(.)
|
||||
var/atom/movable/parent = child.loc
|
||||
while(istype(parent) && !moved_event.is_listening(parent, child))
|
||||
moved_event.register(parent, child, /atom/movable/proc/recursive_move)
|
||||
child = parent
|
||||
parent = child.loc
|
||||
|
||||
/********************
|
||||
* Movement Handling *
|
||||
********************/
|
||||
|
||||
/atom/movable/proc/move_to_destination(var/atom/movable/am, var/old_loc, var/new_loc)
|
||||
var/turf/T = get_turf(new_loc)
|
||||
if(T && T != loc)
|
||||
forceMove(T)
|
||||
|
||||
/atom/movable/proc/recursive_move(var/atom/movable/am, var/old_loc, var/new_loc)
|
||||
moved_event.raise_event(list(src, old_loc, new_loc))
|
||||
|
||||
/atom/Entered(var/atom/movable/am, atom/old_loc)
|
||||
..()
|
||||
moved_event.raise_event(am, old_loc, am.loc)
|
||||
|
||||
/atom/movable/Entered(var/atom/movable/am, atom/old_loc)
|
||||
..()
|
||||
if(moved_event.has_listeners(am) && !moved_event.is_listening(src, am))
|
||||
moved_event.register(src, am, /atom/movable/proc/recursive_move)
|
||||
|
||||
/atom/movable/Exited(var/atom/movable/am, atom/old_loc)
|
||||
..()
|
||||
if(moved_event.is_listening(src, am, /atom/movable/proc/recursive_move))
|
||||
moved_event.unregister(src, am)
|
||||
@@ -0,0 +1,60 @@
|
||||
/datum/observ
|
||||
var/name = "Unnamed Event"
|
||||
var/expected_type = /datum
|
||||
var/list/listeners_assoc
|
||||
|
||||
/datum/observ/New()
|
||||
all_observable_events.events += src
|
||||
listeners_assoc = list()
|
||||
..()
|
||||
|
||||
/datum/observ/proc/is_listening(var/eventSource, var/datum/procOwner, var/proc_call)
|
||||
var/listeners = listeners_assoc[eventSource]
|
||||
if(!listeners)
|
||||
return FALSE
|
||||
|
||||
var/stored_proc_call = listeners[procOwner]
|
||||
return stored_proc_call && (!proc_call || stored_proc_call == proc_call)
|
||||
|
||||
/datum/observ/proc/has_listeners(var/eventSource)
|
||||
var/list/listeners = listeners_assoc[eventSource]
|
||||
return LAZYLEN(listeners)
|
||||
|
||||
/datum/observ/proc/register(var/eventSource, var/datum/procOwner, var/proc_call)
|
||||
if(!(eventSource && procOwner && procOwner))
|
||||
return FALSE
|
||||
if(istype(eventSource, /datum/observ))
|
||||
return FALSE
|
||||
|
||||
if(!istype(eventSource, expected_type))
|
||||
CRASH("Unexpected type. Expected [expected_type], was [eventSource]")
|
||||
|
||||
LAZYINITLIST(listeners_assoc[eventSource])
|
||||
listeners_assoc[eventSource][procOwner] = proc_call
|
||||
destroyed_event.register(procOwner, src, /datum/observ/proc/unregister)
|
||||
return TRUE
|
||||
|
||||
/datum/observ/proc/unregister(var/eventSource, var/datum/procOwner)
|
||||
if(!(eventSource && procOwner))
|
||||
return FALSE
|
||||
if(istype(eventSource, /datum/observ))
|
||||
return FALSE
|
||||
|
||||
var/list/listeners = listeners_assoc[eventSource]
|
||||
if(!listeners)
|
||||
return FALSE
|
||||
|
||||
listeners -= procOwner
|
||||
if (!listeners.len)
|
||||
listeners_assoc -= eventSource
|
||||
destroyed_event.unregister(procOwner, src)
|
||||
return TRUE
|
||||
|
||||
/datum/observ/proc/raise_event(...)
|
||||
if(!args.len)
|
||||
return
|
||||
var/listeners = listeners_assoc[args[1]]
|
||||
if(!listeners)
|
||||
return
|
||||
for(var/listener in listeners)
|
||||
call(listener, listeners[listener])(arglist(args))
|
||||
@@ -49,7 +49,8 @@
|
||||
possible_trading_items = list(
|
||||
/obj/item/weapon/gun/projectile/dartgun/vox = TRADER_SUBTYPES_ONLY,
|
||||
/obj/item/mecha_parts/mecha_equipment/tool = TRADER_SUBTYPES_ONLY,
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic = TRADER_SUBTYPES_ONLY,
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon = TRADER_SUBTYPES_ONLY,
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic = TRADER_BLACKLIST,
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack = TRADER_BLACKLIST,
|
||||
/obj/item/trash = TRADER_SUBTYPES_ONLY,
|
||||
/obj/item/clothing/accessory = TRADER_ALL,
|
||||
|
||||
@@ -282,8 +282,8 @@
|
||||
. = ..()
|
||||
if (.)
|
||||
// Events.
|
||||
if (move_listeners)
|
||||
RaiseOnMove(src, old_loc, loc)
|
||||
if (moved_event.listeners_assoc[src])
|
||||
moved_event.raise_event(src, old_loc, loc)
|
||||
|
||||
// Parallax.
|
||||
if (contained_mobs)
|
||||
|
||||
@@ -1,37 +0,0 @@
|
||||
/mob/living
|
||||
var/list/death_listeners
|
||||
|
||||
/mob/living/proc/OnDeath(thingtocall, proctocall, ...)
|
||||
.(CALLBACK(thingtocall, proctocall, ...))
|
||||
|
||||
/mob/living/OnDeath(datum/callback/callback)
|
||||
LAZYSET(death_listeners, callback.object, callback)
|
||||
if (callback.object && callback.object != GLOBAL_PROC)
|
||||
callback.object.OnDestroy(CALLBACK(src, .proc/UnregisterOnDeath, callback.object))
|
||||
|
||||
/mob/living/proc/UnregisterOnDeath(object)
|
||||
if (!death_listeners)
|
||||
return FALSE
|
||||
|
||||
death_listeners[object] = null
|
||||
death_listeners -= object
|
||||
|
||||
UNSETEMPTY(death_listeners)
|
||||
. = TRUE
|
||||
|
||||
/mob/living/proc/RaiseOnDeath(gibbed)
|
||||
if (!death_listeners)
|
||||
return FALSE
|
||||
|
||||
for (var/thing in death_listeners)
|
||||
var/datum/callback/cb = death_listeners[thing]
|
||||
cb.InvokeAsync(gibbed)
|
||||
|
||||
/mob/living/Destroy()
|
||||
death_listeners = null
|
||||
return ..()
|
||||
|
||||
/mob/living/death(gibbed, deathmessage = "seizes up and falls limp...")
|
||||
. = ..()
|
||||
if (.)
|
||||
RaiseOnDeath(gibbed)
|
||||
@@ -1,31 +0,0 @@
|
||||
/datum
|
||||
var/list/destroy_listeners
|
||||
|
||||
/**
|
||||
* @param second_link should only ever be passed as TRUE from this proc. It's a
|
||||
* recursion guard. The reverse registration is necessary to clean up hard refs.
|
||||
*/
|
||||
/datum/proc/OnDestroy(datum/callback/callback, second_link = FALSE)
|
||||
LAZYSET(destroy_listeners, callback.object, callback)
|
||||
if (!second_link && callback.object && callback.object != GLOBAL_PROC)
|
||||
callback.object.OnDestroy(CALLBACK(src, .proc/UnregisterOnDestroy, callback.object), TRUE)
|
||||
|
||||
/datum/proc/UnregisterOnDestroy(object)
|
||||
if (!destroy_listeners)
|
||||
return FALSE
|
||||
|
||||
destroy_listeners[object] = null
|
||||
destroy_listeners -= object
|
||||
|
||||
UNSETEMPTY(destroy_listeners)
|
||||
. = TRUE
|
||||
|
||||
/datum/proc/RaiseOnDestroy()
|
||||
if (!destroy_listeners)
|
||||
return FALSE
|
||||
|
||||
. = 0
|
||||
for (var/thing in destroy_listeners)
|
||||
var/datum/callback/cb = destroy_listeners[thing]
|
||||
cb.InvokeAsync()
|
||||
.++
|
||||
@@ -1,60 +0,0 @@
|
||||
/atom/movable
|
||||
var/list/move_listeners
|
||||
|
||||
/atom/movable/proc/OnMove(datum/callback/callback)
|
||||
if (!move_listeners || !move_listeners[callback.object])
|
||||
LAZYSET(move_listeners, callback.object, callback)
|
||||
if (callback.object && callback.object != GLOBAL_PROC)
|
||||
callback.object.OnDestroy(CALLBACK(src, .proc/UnregisterOnMove, callback.object))
|
||||
|
||||
var/atom/movable/parent = loc
|
||||
var/atom/movable/child = src
|
||||
while (istype(parent) && (!parent.move_listeners || !(parent.move_listeners[child])))
|
||||
parent.OnMove(CALLBACK(child, .proc/recursive_move))
|
||||
child = parent
|
||||
parent = child.loc
|
||||
|
||||
/atom/movable/proc/UnregisterOnMove(object)
|
||||
if (!move_listeners)
|
||||
return FALSE
|
||||
|
||||
move_listeners[object] = null
|
||||
move_listeners -= object
|
||||
|
||||
UNSETEMPTY(move_listeners)
|
||||
. = TRUE
|
||||
|
||||
/atom/movable/proc/RaiseOnMove(atom/movable/source, atom/old_loc, atom/new_loc)
|
||||
if (!move_listeners)
|
||||
return FALSE
|
||||
|
||||
. = 0
|
||||
for (var/thing in move_listeners)
|
||||
var/datum/callback/cb = move_listeners[thing]
|
||||
cb.InvokeAsync(source, old_loc, new_loc)
|
||||
.++
|
||||
|
||||
/atom/Entered(atom/movable/AM, atom/old_loc)
|
||||
. = ..()
|
||||
if (AM.move_listeners)
|
||||
AM.RaiseOnMove(AM, old_loc, loc)
|
||||
|
||||
/atom/movable/Entered(atom/movable/AM, atom/old_loc)
|
||||
. = ..()
|
||||
if (AM.move_listeners && !(move_listeners && move_listeners[AM]))
|
||||
OnMove(CALLBACK(AM, .proc/recursive_move))
|
||||
|
||||
/atom/movable/proc/recursive_move(atom/movable/AM, old_loc, new_loc)
|
||||
if (move_listeners)
|
||||
RaiseOnMove(AM, old_loc, new_loc)
|
||||
|
||||
/atom/movable/proc/move_to_destination(atom/movable/AM, old_loc, new_loc)
|
||||
var/turf/T = get_turf(new_loc)
|
||||
if (T && T != loc)
|
||||
forceMove(T)
|
||||
|
||||
/atom/movable/forceMove(atom/dest)
|
||||
var/oldloc = loc
|
||||
. = ..()
|
||||
if (. && move_listeners)
|
||||
RaiseOnMove(src, oldloc, loc)
|
||||
@@ -9,3 +9,4 @@
|
||||
require_all_templates = 1
|
||||
votable = 1
|
||||
antag_tags = list(MODE_MALFUNCTION, MODE_NINJA)
|
||||
disabled_jobs = list("AI")
|
||||
@@ -454,7 +454,7 @@
|
||||
/datum/access/merchant
|
||||
id = access_merchant
|
||||
desc = "Merchant Access"
|
||||
access_type = ACCESS_TYPE_NONE
|
||||
access_type = ACCESS_TYPE_CENTCOM
|
||||
|
||||
/***************
|
||||
* Antag access *
|
||||
|
||||
@@ -114,11 +114,10 @@ var/const/HOLOPAD_MODE = RANGE_BASED
|
||||
activate_holocall(caller_id)
|
||||
|
||||
/obj/machinery/hologram/holopad/proc/end_call(mob/user)
|
||||
caller_id.unset_machine()
|
||||
caller_id.reset_view() //Send the caller back to his body
|
||||
clear_holo(caller_id) // destroy the hologram
|
||||
caller_id = null //Reset caller_id
|
||||
sourcepad.targetpad = null
|
||||
sourcepad = null //Reset source
|
||||
clear_holo(null, caller_id) // destroy the hologram
|
||||
caller_id = null
|
||||
|
||||
/obj/machinery/hologram/holopad/proc/activate_holocall(mob/living/carbon/caller_id)
|
||||
if(caller_id)
|
||||
@@ -217,7 +216,7 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
|
||||
if(caller_id)
|
||||
var/tempicon = 0
|
||||
for(var/datum/data/record/t in data_core.locked)
|
||||
if(t.fields["name"]==caller_id.name)
|
||||
if(t.fields["name"] == caller_id.name)
|
||||
tempicon = t.fields["image"]
|
||||
hologram.name = "[caller_id.name] (Hologram)"
|
||||
hologram.loc = get_step(src,1)
|
||||
@@ -245,14 +244,21 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
|
||||
A.holo = src
|
||||
return 1
|
||||
|
||||
/obj/machinery/hologram/holopad/proc/clear_holo(mob/living/silicon/ai/user)
|
||||
if(user.holo == src)
|
||||
/obj/machinery/hologram/holopad/proc/clear_holo(mob/living/silicon/ai/user, mob/living/carbon/caller_id)
|
||||
if(user)
|
||||
qdel(masters[user])//Get rid of user's hologram
|
||||
user.holo = null
|
||||
qdel(masters[user])//Get rid of user's hologram
|
||||
masters -= user //Discard AI from the list of those who use holopad
|
||||
masters -= user //Discard AI from the list of those who use holopad
|
||||
if(caller_id)
|
||||
qdel(masters[caller_id])//Get rid of user's hologram
|
||||
masters -= caller_id //Discard the caller from the list of those who use holopad
|
||||
if (!masters.len)//If no users left
|
||||
set_light(0) //pad lighting (hologram lighting will be handled automatically since its owner was deleted)
|
||||
icon_state = "holopad0"
|
||||
if(sourcepad)
|
||||
sourcepad.targetpad = null
|
||||
sourcepad = null
|
||||
caller_id = null
|
||||
return 1
|
||||
|
||||
/obj/machinery/hologram/holopad/machinery_process()
|
||||
@@ -267,13 +273,13 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
|
||||
continue
|
||||
|
||||
use_power(power_per_hologram)
|
||||
if(last_request + 200 < world.time&&incoming_connection==1)
|
||||
if(last_request + 200 < world.time && incoming_connection==1)
|
||||
incoming_connection = 0
|
||||
end_call()
|
||||
if(sourcepad)
|
||||
sourcepad.audible_message("<i><span class='game say'>The holopad connection timed out</span></i>")
|
||||
sourcepad = 0
|
||||
if (caller_id&&sourcepad)
|
||||
if (caller_id && sourcepad)
|
||||
if(caller_id.loc!=sourcepad.loc)
|
||||
sourcepad.visible_message("Severing connection to distant holopad.")
|
||||
visible_message("The connection has been terminated by [caller_id].")
|
||||
|
||||
@@ -64,7 +64,7 @@
|
||||
/obj/machinery/icecream_vat/Initialize()
|
||||
. = ..()
|
||||
create_reagents(100)
|
||||
while(product_types.len < 6)
|
||||
while(product_types.len < 8)
|
||||
product_types.Add(5)
|
||||
reagents.add_reagent("milk", 5)
|
||||
reagents.add_reagent("flour", 5)
|
||||
@@ -82,7 +82,7 @@
|
||||
dat += "<b>Vanilla icecream:</b> <a href='?src=\ref[src];select=[ICECREAM_VANILLA]'><b>Select</b></a> <a href='?src=\ref[src];make=[ICECREAM_VANILLA];amount=1'><b>Make</b></a> <a href='?src=\ref[src];make=[ICECREAM_VANILLA];amount=5'><b>x5</b></a> [product_types[ICECREAM_VANILLA]] scoops left. (Ingredients: milk, ice)<br>"
|
||||
dat += "<b>Strawberry icecream:</b> <a href='?src=\ref[src];select=[ICECREAM_STRAWBERRY]'><b>Select</b></a> <a href='?src=\ref[src];make=[ICECREAM_STRAWBERRY];amount=1'><b>Make</b></a> <a href='?src=\ref[src];make=[ICECREAM_STRAWBERRY];amount=5'><b>x5</b></a> [product_types[ICECREAM_STRAWBERRY]] dollops left. (Ingredients: milk, ice, berry juice)<br>"
|
||||
dat += "<b>Chocolate icecream:</b> <a href='?src=\ref[src];select=[ICECREAM_CHOCOLATE]'><b>Select</b></a> <a href='?src=\ref[src];make=[ICECREAM_CHOCOLATE];amount=1'><b>Make</b></a> <a href='?src=\ref[src];make=[ICECREAM_CHOCOLATE];amount=5'><b>x5</b></a> [product_types[ICECREAM_CHOCOLATE]] dollops left. (Ingredients: milk, ice, coco powder)<br>"
|
||||
dat += "<b>Blue icecream:</b> <a href='?src=\ref[src];select=[ICECREAM_BLUE]'><b>Select</b></a> <a href='?src=\ref[src];make=[ICECREAM_BLUE];amount=1'><b>Make</b></a> <a href='?src=\ref[src];make=[ICECREAM_BLUE];amount=5'><b>x5</b></a> [product_types[ICECREAM_BLUE]] dollops left. (Ingredients: milk, ice, singulo)<br></div>"
|
||||
dat += "<b>Blue icecream:</b> <a href='?src=\ref[src];select=[ICECREAM_BLUE]'><b>Select</b></a> <a href='?src=\ref[src];make=[ICECREAM_BLUE];amount=1'><b>Make</b></a> <a href='?src=\ref[src];make=[ICECREAM_BLUE];amount=5'><b>x5</b></a> [product_types[ICECREAM_BLUE]] dollops left. (Ingredients: milk, ice, singulo)<br>"
|
||||
dat += "<b>Cherry icecream:</b> <a href='?src=\ref[src];select=[ICECREAM_CHERRY]'><b>Select</b></a> <a href='?src=\ref[src];make=[ICECREAM_CHERRY];amount=1'><b>Make</b></a> <a href='?src=\ref[src];make=[ICECREAM_CHERRY];amount=5'><b>x5</b></a> [product_types[ICECREAM_CHERRY]] dollops left. (Ingredients: milk, ice, cherry jelly)<br>"
|
||||
dat += "<b>Banana icecream:</b> <a href='?src=\ref[src];select=[ICECREAM_BANANA]'><b>Select</b></a> <a href='?src=\ref[src];make=[ICECREAM_BANANA];amount=1'><b>Make</b></a> <a href='?src=\ref[src];make=[ICECREAM_BANANA];amount=5'><b>x5</b></a> [product_types[ICECREAM_BANANA]] dollops left. (Ingredients: milk, ice, banana)<br></div>"
|
||||
dat += "<br><b>CONES</b><br><div class='statusDisplay'>"
|
||||
|
||||
@@ -82,7 +82,7 @@
|
||||
charging = null
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/recharger/process()
|
||||
/obj/machinery/recharger/machinery_process()
|
||||
if(stat & (NOPOWER|BROKEN) || !anchored)
|
||||
update_use_power(0)
|
||||
icon_state = icon_state_idle
|
||||
|
||||
@@ -54,7 +54,8 @@
|
||||
return
|
||||
user << "<span class='notice'>You link \the [C] to \the [src], it will now ring upon someone using \the [src].</span>"
|
||||
rings_pdas += C
|
||||
C.OnDestroy(CALLBACK(src, .proc/remove_pda, C))
|
||||
// WONT FIX: This requires callbacks fuck my dick.
|
||||
destroyed_event.register(C, src, .proc/remove_pda)
|
||||
update_icon()
|
||||
|
||||
else
|
||||
@@ -100,7 +101,7 @@
|
||||
|
||||
addtimer(CALLBACK(src, .proc/unping), 45 SECONDS)
|
||||
|
||||
/obj/machinery/ringer/proc/unping(var/obj/item/device/pda/pda)
|
||||
/obj/machinery/ringer/proc/unping()
|
||||
pinged = FALSE
|
||||
update_icon()
|
||||
|
||||
@@ -143,4 +144,4 @@
|
||||
var/listener/L = thing
|
||||
var/obj/machinery/ringer/C = L.target
|
||||
if (istype(C))
|
||||
C.ring_pda()
|
||||
C.ring_pda()
|
||||
|
||||
@@ -93,8 +93,8 @@
|
||||
user.client.images |= holomap_datum.station_map
|
||||
|
||||
watching_mob = user
|
||||
watching_mob.OnMove(CALLBACK(src, .proc/checkPosition))
|
||||
watching_mob.OnDestroy(CALLBACK(src, .proc/stopWatching))
|
||||
moved_event.register(watching_mob, src, /obj/machinery/station_map/proc/checkPosition)
|
||||
destroyed_event.register(watching_mob, src, /obj/machinery/station_map/proc/stopWatching)
|
||||
update_use_power(2)
|
||||
|
||||
if(bogus)
|
||||
@@ -120,8 +120,8 @@
|
||||
animate(holomap_datum.station_map, alpha = 0, time = 5, easing = LINEAR_EASING)
|
||||
var/mob/M = watching_mob
|
||||
addtimer(CALLBACK(src, .proc/clear_image, M, holomap_datum.station_map), 5, TIMER_CLIENT_TIME)//we give it time to fade out
|
||||
watching_mob.UnregisterOnMove(src)
|
||||
watching_mob.UnregisterOnDestroy(src)
|
||||
moved_event.unregister(watching_mob, src)
|
||||
destroyed_event.unregister(watching_mob, src)
|
||||
watching_mob = null
|
||||
update_use_power(1)
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
/obj/item/device/multitool/hacktool/Destroy()
|
||||
for(var/T in known_targets)
|
||||
var/atom/target = T
|
||||
target.UnregisterOnDestroy(src)
|
||||
destroyed_event.unregister(target, src)
|
||||
known_targets.Cut()
|
||||
qdel(hack_state)
|
||||
hack_state = null
|
||||
@@ -68,7 +68,7 @@
|
||||
return 0
|
||||
|
||||
known_targets.Insert(1, target) // Insert the newly hacked target first,
|
||||
target.OnDestroy(CALLBACK(src, .proc/on_target_destroy))
|
||||
destroyed_event.register(target, src, /obj/item/device/multitool/hacktool/proc/on_target_destroy)
|
||||
return 1
|
||||
|
||||
/obj/item/device/multitool/hacktool/proc/sanity_check()
|
||||
@@ -77,7 +77,7 @@
|
||||
if(known_targets.len > max_known_targets)
|
||||
for(var/i = (max_known_targets + 1) to known_targets.len)
|
||||
var/atom/A = known_targets[i]
|
||||
A.UnregisterOnDestroy(src)
|
||||
destroyed_event.unregister(A, src)
|
||||
known_targets.Cut(max_known_targets + 1)
|
||||
|
||||
/obj/item/device/multitool/hacktool/proc/on_target_destroy(var/target)
|
||||
|
||||
@@ -50,13 +50,13 @@
|
||||
unregister_buffer(buffer_object)
|
||||
buffer_object = buffer
|
||||
if(buffer_object)
|
||||
buffer_object.OnDestroy(CALLBACK(src, .proc/unregister_buffer))
|
||||
destroyed_event.register(buffer_object, src, /obj/item/device/multitool/proc/unregister_buffer)
|
||||
|
||||
/obj/item/device/multitool/proc/unregister_buffer(var/atom/buffer_to_unregister)
|
||||
// Only remove the buffered object, don't reset the name
|
||||
// This means one cannot know if the buffer has been destroyed until one attempts to use it.
|
||||
if(buffer_to_unregister == buffer_object && buffer_object)
|
||||
buffer_object.UnregisterOnDestroy(src)
|
||||
destroyed_event.unregister(buffer_object, src)
|
||||
buffer_object = null
|
||||
|
||||
/obj/item/device/multitool/resolve_attackby(atom/A, mob/user)
|
||||
|
||||
@@ -65,13 +65,13 @@
|
||||
unset_registered_user()
|
||||
registered_user = user
|
||||
user.set_id_info(src)
|
||||
user.OnDestroy(CALLBACK(src, .proc/unset_registered_user))
|
||||
destroyed_event.register(user, src, /obj/item/weapon/card/id/syndicate/proc/unset_registered_user)
|
||||
return TRUE
|
||||
|
||||
/obj/item/weapon/card/id/syndicate/proc/unset_registered_user(var/mob/user)
|
||||
if(!registered_user || (user && user != registered_user))
|
||||
return
|
||||
registered_user.UnregisterOnDestroy(src)
|
||||
destroyed_event.unregister(registered_user, src)
|
||||
registered_user = null
|
||||
|
||||
/obj/item/weapon/card/id/syndicate/CanUseTopic(mob/user)
|
||||
|
||||
@@ -444,7 +444,7 @@
|
||||
/obj/item/weapon/storage/backpack/messenger/tox
|
||||
name = "research messenger bag"
|
||||
desc = "A backpack worn over one shoulder. Useful for holding science materials."
|
||||
icon_state = "courierbagnt"
|
||||
icon_state = "courierbagtox"
|
||||
|
||||
/obj/item/weapon/storage/backpack/messenger/gen
|
||||
name = "geneticist messenger bag"
|
||||
|
||||
@@ -151,8 +151,8 @@
|
||||
if(!newname || newname == "")
|
||||
var/datum/language/L = all_languages[user.species.default_language]
|
||||
newname = L.get_random_name()
|
||||
user.real_name = newname
|
||||
user.name = user.real_name
|
||||
user.fully_replace_character_name(user.real_name,newname)
|
||||
user.h_style = "Short Vox Quills"
|
||||
user.f_style = "Shaved"
|
||||
user.update_hair(0)
|
||||
..()
|
||||
@@ -1,7 +1,7 @@
|
||||
#ifdef AO_USE_LIGHTING_OPACITY
|
||||
#define AO_TURF_CHECK(T) (!T.has_opaque_atom)
|
||||
#define AO_TURF_CHECK(T) (!T.has_opaque_atom || !T.permit_ao)
|
||||
#else
|
||||
#define AO_TURF_CHECK(T) (!T.density || !T.opacity)
|
||||
#define AO_TURF_CHECK(T) (!T.density || !T.opacity || !T.permit_ao)
|
||||
#endif
|
||||
|
||||
/turf
|
||||
|
||||
@@ -31,7 +31,9 @@
|
||||
"toggles",
|
||||
"asfx_togs",
|
||||
"lastmotd" = "motd_hash",
|
||||
"lastmemo" = "memo_hash"
|
||||
"lastmemo" = "memo_hash",
|
||||
"parallax_toggles" = "parallax_togs",
|
||||
"parallax_speed"
|
||||
),
|
||||
"args" = list("ckey")
|
||||
)
|
||||
|
||||
@@ -64,7 +64,7 @@ var/list/gear_datums = list()
|
||||
continue
|
||||
if(G.whitelisted && preference_mob)
|
||||
for(var/species in G.whitelisted)
|
||||
if(is_alien_whitelisted(preference_mob, species))
|
||||
if(is_alien_whitelisted(preference_mob, global.all_species[species]))
|
||||
. += gear_name
|
||||
break
|
||||
else
|
||||
|
||||
@@ -206,7 +206,7 @@ All custom items with worn sprites must follow the contained sprite system: http
|
||||
contained_sprite = TRUE
|
||||
gender = NEUTER
|
||||
body_parts_covered = null
|
||||
|
||||
fingerprint_chance = 50
|
||||
|
||||
/obj/structure/bed/chair/wheelchair/fluff/nomak_scooter //Mobility Scooter - Dubaku Nomak - demonofthefall
|
||||
name = "mobility scooter"
|
||||
@@ -491,7 +491,7 @@ All custom items with worn sprites must follow the contained sprite system: http
|
||||
species_restricted = null
|
||||
gender = NEUTER
|
||||
body_parts_covered = null
|
||||
|
||||
fingerprint_chance = 100
|
||||
|
||||
/obj/item/clothing/under/dress/fluff/sayyidah_dress //Traditional Jumper Dress - Sayyidah Al-Kateb - alberyk
|
||||
name = "traditional jumper dress"
|
||||
@@ -1403,15 +1403,15 @@ All custom items with worn sprites must follow the contained sprite system: http
|
||||
|
||||
if (use_check(usr)) return
|
||||
|
||||
var/style = input("You change the shirt to;","Change the shirt style") as null|anything in list("Eiffel Tower Diner","Pyramids of Giza Café","Phoenixport","New Parthenon")
|
||||
var/style = input("You change the shirt to;","Change the shirt style") as null|anything in list("Eiffel Tower Diner","Pyramids of Giza Café","Phoenixport","New Parthenon")
|
||||
switch(style)
|
||||
if("Eiffel Tower Diner")
|
||||
item_state = "harley_uniform"
|
||||
desc = "A white t-shirt with the writing \"Eiffel Tower Diner\" on it in a small font, below a recreation of the famous monument in question, the Eiffel Tower."
|
||||
|
||||
if("Pyramids of Giza Café")
|
||||
if("Pyramids of Giza Café")
|
||||
item_state = "harley_uniform_1"
|
||||
desc = "A white t-shirt with \"GIZA CAFÉ\" written in large, retro font, with a small background. It looks slightly well-worn."
|
||||
desc = "A white t-shirt with \"GIZA CAFÉ\" written in large, retro font, with a small background. It looks slightly well-worn."
|
||||
|
||||
if("Phoenixport")
|
||||
item_state = "harley_uniform_2"
|
||||
@@ -1424,3 +1424,25 @@ All custom items with worn sprites must follow the contained sprite system: http
|
||||
usr.update_inv_w_uniform()
|
||||
usr.visible_message("<span class='notice'>[user] fumbles with \the [src], changing the shirt..</span>",
|
||||
"<span class='notice'>You change \the [src]'s style to be '[style]'.</span>")
|
||||
|
||||
|
||||
/obj/item/clothing/gloves/watch/fluff/rex_watch //Engraved Wristwatch - Rex Winters - tailson
|
||||
name = "engraved wristwatch"
|
||||
desc = " A fine gold watch. On the inside is an engraving that reads \"Happy birthday dad, thinking of you always\"."
|
||||
icon = 'icons/obj/custom_items/rex_watch.dmi'
|
||||
icon_state = "rex_watch"
|
||||
|
||||
|
||||
/obj/item/device/camera/fluff/hadley_camera //Hadley's Camera - Hadley Dawson - fekkor
|
||||
name = "customized camera"
|
||||
desc = "A early 2450's Sunny camera with an adjustable lens, this one has a sticker with the name \"Hadley\" on the back."
|
||||
icon = 'icons/obj/custom_items/hadley_camera.dmi'
|
||||
icon_state = "hadley_camera"
|
||||
icon_on = "hadley_camera"
|
||||
icon_off = "hadley_camera_off"
|
||||
|
||||
|
||||
/obj/item/clothing/accessory/medal/silver/fluff/kalren_medal //Silver Star of Merit - Kalren Halstere - brutishcrab51
|
||||
name = "silver star of merit"
|
||||
desc = "The Biesel Silver Star of Merit, rewarded for bravery and professionalism in the line of duty."
|
||||
icon_state = "silver_sword"
|
||||
|
||||
@@ -50,7 +50,7 @@ var/list/ghost_traps
|
||||
/datum/ghosttrap/proc/request_player(var/mob/target, var/request_string, var/request_timeout)
|
||||
if(request_timeout)
|
||||
request_timeouts[target] = world.time + request_timeout
|
||||
target.OnDestroy(CALLBACK(src, .proc/target_destroyed))
|
||||
destroyed_event.register(target, src, /datum/ghosttrap/proc/target_destroyed)
|
||||
else
|
||||
request_timeouts -= target
|
||||
|
||||
|
||||
@@ -91,7 +91,8 @@
|
||||
|
||||
for(var/i = 1 to outputs.len)
|
||||
set_pin_data(IC_OUTPUT, i, i == output_index ? output : null)
|
||||
|
||||
|
||||
push_data()
|
||||
activate_pin(2)
|
||||
|
||||
/obj/item/integrated_circuit/transfer/demultiplexer/medium
|
||||
|
||||
@@ -166,6 +166,7 @@
|
||||
else
|
||||
set_pin_data(IC_OUTPUT, 1, null)
|
||||
|
||||
push_data()
|
||||
activate_pin(2)
|
||||
|
||||
/obj/item/integrated_circuit/input/adjacent_locator
|
||||
@@ -185,6 +186,7 @@
|
||||
var/atom/A = get_pin_data_as_type(IC_INPUT, 1, /atom)
|
||||
if(!A)
|
||||
set_pin_data(IC_OUTPUT, 1, null)
|
||||
push_data()
|
||||
return
|
||||
var/desired_type = A.type
|
||||
|
||||
@@ -197,6 +199,7 @@
|
||||
|
||||
if(valid_things.len)
|
||||
set_pin_data(IC_OUTPUT, 1, pick(valid_things))
|
||||
push_data()
|
||||
|
||||
/obj/item/integrated_circuit/input/signaler
|
||||
name = "integrated signaler"
|
||||
|
||||
@@ -170,14 +170,14 @@
|
||||
// These procs do not relocate the grenade, that's the callers responsibility
|
||||
/obj/item/integrated_circuit/manipulation/grenade/proc/attach_grenade(var/obj/item/weapon/grenade/G)
|
||||
attached_grenade = G
|
||||
attached_grenade.OnDestroy(CALLBACK(src, .proc/detach_grenade))
|
||||
destroyed_event.register(attached_grenade, src, .proc/detach_grenade)
|
||||
size += G.w_class
|
||||
desc += " \An [attached_grenade] is attached to it!"
|
||||
|
||||
/obj/item/integrated_circuit/manipulation/grenade/proc/detach_grenade()
|
||||
if(!attached_grenade)
|
||||
return
|
||||
attached_grenade.UnregisterOnDestroy(src)
|
||||
destroyed_event.unregister(attached_grenade, src)
|
||||
attached_grenade = null
|
||||
size = initial(size)
|
||||
desc = initial(desc)
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
for(var/i = 1 to inputs.len)
|
||||
var/data = get_pin_data(IC_INPUT, i)
|
||||
set_pin_data(IC_OUTPUT, i, data)
|
||||
|
||||
push_data()
|
||||
activate_pin(2)
|
||||
|
||||
/obj/item/integrated_circuit/memory/storage/medium
|
||||
@@ -85,6 +85,7 @@
|
||||
|
||||
/obj/item/integrated_circuit/memory/constant/do_work()
|
||||
set_pin_data(IC_OUTPUT, 1, data)
|
||||
push_data()
|
||||
activate_pin(2)
|
||||
|
||||
/obj/item/integrated_circuit/memory/constant/attack_self(mob/user)
|
||||
|
||||
@@ -272,6 +272,7 @@
|
||||
if(camera)
|
||||
set_camera_status(0)
|
||||
set_pin_data(IC_INPUT, 2, FALSE)
|
||||
push_data()
|
||||
|
||||
/obj/item/integrated_circuit/output/led
|
||||
name = "light-emitting diode"
|
||||
@@ -292,6 +293,7 @@
|
||||
|
||||
/obj/item/integrated_circuit/output/led/power_fail()
|
||||
set_pin_data(IC_INPUT, 1, FALSE)
|
||||
push_data()
|
||||
|
||||
/obj/item/integrated_circuit/output/led/any_examine(mob/user)
|
||||
var/text_output = list()
|
||||
|
||||
@@ -20,11 +20,14 @@
|
||||
set_pin_data(IC_OUTPUT, 1, null)
|
||||
|
||||
if(!isweakref(I.data))
|
||||
push_data()
|
||||
return
|
||||
var/atom/A = I.data.resolve()
|
||||
if(!A)
|
||||
push_data()
|
||||
return
|
||||
if(!(A in view(get_turf(src))))
|
||||
push_data()
|
||||
return // Can't see the target.
|
||||
var/desired_dir = get_dir(get_turf(src), A)
|
||||
|
||||
|
||||
@@ -357,8 +357,8 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
|
||||
stop_following()
|
||||
following = target
|
||||
following.OnMove(CALLBACK(src, /atom/movable/.proc/move_to_destination))
|
||||
following.OnDestroy(CALLBACK(src, .proc/stop_following))
|
||||
moved_event.register(following, src, /atom/movable/proc/move_to_destination)
|
||||
destroyed_event.register(following, src, /mob/dead/observer/proc/stop_following)
|
||||
|
||||
src << "<span class='notice'>Now following \the [following]</span>"
|
||||
move_to_destination(following, following.loc, following.loc)
|
||||
@@ -366,8 +366,8 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
/mob/dead/observer/proc/stop_following()
|
||||
if(following)
|
||||
src << "<span class='notice'>No longer following \the [following]</span>"
|
||||
following.UnregisterOnMove(src)
|
||||
following.UnregisterOnDestroy(src)
|
||||
moved_event.unregister(following, src)
|
||||
destroyed_event.unregister(following, src)
|
||||
following = null
|
||||
|
||||
/mob/dead/observer/move_to_destination(var/atom/movable/am, var/old_loc, var/new_loc)
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
|
||||
/mob/living/death(gibbed, deathmessage="seizes up and falls limp...")
|
||||
. = ..()
|
||||
if (.)
|
||||
if(.)
|
||||
// If true, the mob went from living to dead (assuming everyone has been overriding as they should...)
|
||||
cultnet.updateVisibility(src)
|
||||
|
||||
|
||||
@@ -205,12 +205,8 @@
|
||||
asleep = 1
|
||||
icon_state = "sarlacc_asleep"
|
||||
sarlacc.deployed = 0
|
||||
var/make_loot = loot_count
|
||||
visible_message("<span class='danger'>With a contented heave, \the [src] slides into the earth and begins regurgitating several treasures before shutting tight.</span>")
|
||||
while(make_loot)
|
||||
for(var/turf/simulated/floor/F in orange(1,src))
|
||||
new /obj/random/loot(F)
|
||||
make_loot--
|
||||
new/obj/random/loot(get_turf(src))
|
||||
|
||||
/mob/living/simple_animal/hostile/greatworm/FindTarget()
|
||||
if(eating)
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
|
||||
/mob/living/death(gibbed,deathmessage="seizes up and falls limp...")
|
||||
. = ..()
|
||||
if (.)
|
||||
if(.)
|
||||
stop_aiming(no_message=1)
|
||||
|
||||
/mob/living/update_canmove()
|
||||
|
||||
@@ -173,9 +173,9 @@ obj/aiming_overlay/proc/update_aiming_deferred()
|
||||
locked = 0
|
||||
update_icon()
|
||||
lock_time = world.time + 35
|
||||
owner.OnMove(CALLBACK(src, .proc/update_aiming))
|
||||
aiming_at.OnMove(CALLBACK(src, .proc/target_moved))
|
||||
aiming_at.OnDestroy(CALLBACK(src, .proc/cancel_aiming))
|
||||
moved_event.register(owner, src, /obj/aiming_overlay/proc/update_aiming)
|
||||
moved_event.register(aiming_at, src, /obj/aiming_overlay/proc/target_moved)
|
||||
destroyed_event.register(aiming_at, src, /obj/aiming_overlay/proc/cancel_aiming)
|
||||
|
||||
/obj/aiming_overlay/proc/aim_cooldown(var/seconds)
|
||||
aimcooldown = world.time + seconds SECONDS
|
||||
@@ -213,10 +213,10 @@ obj/aiming_overlay/proc/update_aiming_deferred()
|
||||
if(!no_message)
|
||||
owner.visible_message("<span class='notice'>\The [owner] lowers \the [aiming_with].</span>")
|
||||
|
||||
owner.UnregisterOnMove(src)
|
||||
moved_event.unregister(owner, src)
|
||||
if(aiming_at)
|
||||
aiming_at.UnregisterOnMove(src)
|
||||
aiming_at.UnregisterOnDestroy(src)
|
||||
moved_event.unregister(aiming_at, src)
|
||||
destroyed_event.unregister(aiming_at, src)
|
||||
aiming_at.aimed -= src
|
||||
aiming_at = null
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/proc/is_listening_to_movement(var/atom/movable/listening_to, var/listener)
|
||||
return !!(listening_to.move_listeners && listening_to.move_listeners[listener])
|
||||
return moved_event.is_listening(listening_to, listener)
|
||||
|
||||
datum/unit_test/observation
|
||||
name = "OBSERVATION template"
|
||||
@@ -19,8 +19,8 @@ datum/unit_test/observation/moved_observer_shall_register_on_follow/start_test()
|
||||
else
|
||||
fail("The observer is not following the mob.")
|
||||
|
||||
qdel(H)
|
||||
qdel(O)
|
||||
QDEL_IN(H, 10 SECONDS)
|
||||
QDEL_IN(O, 10 SECONDS)
|
||||
return 1
|
||||
|
||||
datum/unit_test/observation/moved_observer_shall_unregister_on_nofollow
|
||||
@@ -38,8 +38,8 @@ datum/unit_test/observation/moved_observer_shall_unregister_on_nofollow/start_te
|
||||
else
|
||||
fail("The observer is still following the mob.")
|
||||
|
||||
qdel(H)
|
||||
qdel(O)
|
||||
QDEL_IN(H, 10 SECONDS)
|
||||
QDEL_IN(O, 10 SECONDS)
|
||||
return 1
|
||||
|
||||
datum/unit_test/observation/moved_shall_not_register_on_enter_without_listeners
|
||||
@@ -56,8 +56,8 @@ datum/unit_test/observation/moved_shall_not_register_on_enter_without_listeners/
|
||||
else
|
||||
fail("The mob has registered to the closet's moved event.")
|
||||
|
||||
qdel(C)
|
||||
qdel(H)
|
||||
QDEL_IN(C, 10 SECONDS)
|
||||
QDEL_IN(H, 10 SECONDS)
|
||||
return 1
|
||||
|
||||
datum/unit_test/observation/moved_shall_registers_recursively_on_new_listener
|
||||
@@ -78,9 +78,9 @@ datum/unit_test/observation/moved_shall_registers_recursively_on_new_listener/st
|
||||
else
|
||||
fail("Recursive moved registration failed. Human listening to closet: [listening_to_closet] - Observer listening to human: [listening_to_human]")
|
||||
|
||||
qdel(C)
|
||||
qdel(H)
|
||||
qdel(O)
|
||||
QDEL_IN(C, 10 SECONDS)
|
||||
QDEL_IN(H, 10 SECONDS)
|
||||
QDEL_IN(O, 10 SECONDS)
|
||||
return 1
|
||||
|
||||
datum/unit_test/observation/moved_shall_registers_recursively_with_existing_listener
|
||||
@@ -101,8 +101,8 @@ datum/unit_test/observation/moved_shall_registers_recursively_with_existing_list
|
||||
else
|
||||
fail("Recursive moved registration failed. Human listening to closet: [listening_to_closet] - Observer listening to human: [listening_to_human]")
|
||||
|
||||
qdel(C)
|
||||
qdel(H)
|
||||
qdel(O)
|
||||
QDEL_IN(C, 10 SECONDS)
|
||||
QDEL_IN(H, 10 SECONDS)
|
||||
QDEL_IN(O, 10 SECONDS)
|
||||
|
||||
return 1
|
||||
|
||||
@@ -107,12 +107,25 @@ var/list/world_api_rate_limit = list()
|
||||
|
||||
/world/Topic(T, addr, master, key)
|
||||
var/list/response[] = list()
|
||||
var/list/queryparams[] = json_decode(T)
|
||||
var/list/queryparams[]
|
||||
|
||||
try
|
||||
queryparams = json_decode(T)
|
||||
catch()
|
||||
queryparams = list()
|
||||
|
||||
log_debug("API: Request Received - from:[addr], master:[master], key:[key]")
|
||||
diary << "TOPIC: \"[T]\", from:[addr], master:[master], key:[key], auth:[queryparams["auth"] ? queryparams["auth"] : "null"] [log_end]"
|
||||
|
||||
if (!queryparams.len)
|
||||
log_debug("API - Bad Request - Invalid/no JSON data sent.")
|
||||
response["statuscode"] = 400
|
||||
response["response"] = "Bad Request - Invalid/no JSON data sent."
|
||||
return json_encode(response)
|
||||
|
||||
queryparams["addr"] = addr //Add the IP to the queryparams that are passed to the api functions
|
||||
var/query = queryparams["query"]
|
||||
var/auth = queryparams["auth"]
|
||||
log_debug("API: Request Received - from:[addr], master:[master], key:[key]")
|
||||
diary << "TOPIC: \"[T]\", from:[addr], master:[master], key:[key], auth:[auth] [log_end]"
|
||||
|
||||
/*if (!SSticker) //If the game is not started most API Requests would not work because of the throtteling
|
||||
response["statuscode"] = 500
|
||||
|
||||
@@ -56,6 +56,19 @@
|
||||
-->
|
||||
<div class="commit sansserif">
|
||||
|
||||
<h2 class="date">20 October 2017</h2>
|
||||
<h3 class="author">Lohikar updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">Parallax preferences now actually get loaded, because apparently that's important or something.</li>
|
||||
<li class="bugfix">Shuttles should now longer get mysterious square shadows.</li>
|
||||
</ul>
|
||||
<h3 class="author">MoondancerPony updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">Memory chips will no longer automatically overwrite themselves to whatever their outputs are connected to, and will now output properly. An engineer seems to have installed the chip backwards inside the casing. NanoTrasen apologises for this lapse in service.</li>
|
||||
<li class="bugfix">Locators and other scanning devices now properly push data to other devices.</li>
|
||||
<li class="bugfix">Basic pathfinders will now stop moving if they cannot see their target, instead of jamming.</li>
|
||||
</ul>
|
||||
|
||||
<h2 class="date">15 October 2017</h2>
|
||||
<h3 class="author">AgentWhatever updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
|
||||
@@ -4738,3 +4738,16 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
|
||||
booze-o-mat)
|
||||
- rscadd: Added Champagne to the booze dispenser.
|
||||
- rscadd: Added 11 new (moderately thought out) cocktails.
|
||||
2017-10-20:
|
||||
Lohikar:
|
||||
- bugfix: Parallax preferences now actually get loaded, because apparently that's
|
||||
important or something.
|
||||
- bugfix: Shuttles should now longer get mysterious square shadows.
|
||||
MoondancerPony:
|
||||
- bugfix: Memory chips will no longer automatically overwrite themselves to whatever
|
||||
their outputs are connected to, and will now output properly. An engineer seems
|
||||
to have installed the chip backwards inside the casing. NanoTrasen apologises
|
||||
for this lapse in service.
|
||||
- bugfix: Locators and other scanning devices now properly push data to other devices.
|
||||
- bugfix: Basic pathfinders will now stop moving if they cannot see their target,
|
||||
instead of jamming.
|
||||
|
||||
|
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 35 KiB |
|
After Width: | Height: | Size: 627 B |
|
After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 72 KiB After Width: | Height: | Size: 71 KiB |
|
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 33 KiB |
@@ -15,7 +15,6 @@
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "stdafx.h"
|
||||
#include <curl\curl.h>
|
||||
|
||||
#define EXTERN_DLL_EXPORT extern "C" __declspec(dllexport)
|
||||
|
||||
@@ -19,7 +19,6 @@
|
||||
|
||||
#define EXTERN_DLL_EXPORT extern "C" __declspec(dllexport)
|
||||
|
||||
#include "stdafx.h"
|
||||
#include <fstream>
|
||||
|
||||
#include "boost/asio.hpp"
|
||||
@@ -67,4 +66,4 @@ EXTERN_DLL_EXPORT const char *send_udp_data(int argc, char *argv[])
|
||||
myfile.close();
|
||||
return ex.what();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6456,17 +6456,15 @@
|
||||
},
|
||||
/area/turret_protected/ai)
|
||||
"mM" = (
|
||||
/obj/machinery/light/small{
|
||||
base_state = "bulb-broken";
|
||||
dir = 4;
|
||||
icon_state = "bulb-broken"
|
||||
},
|
||||
/obj/structure/window/reinforced{
|
||||
dir = 8
|
||||
},
|
||||
/obj/structure/window/reinforced{
|
||||
dir = 1
|
||||
},
|
||||
/obj/machinery/light/small{
|
||||
dir = 4
|
||||
},
|
||||
/turf/simulated/floor/bluegrid{
|
||||
name = "cooled mainframe floor";
|
||||
temperature = 278
|
||||
@@ -7252,11 +7250,6 @@
|
||||
c_tag = "AI Core - Alpha Core";
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/light/small{
|
||||
base_state = "bulb-broken";
|
||||
dir = 4;
|
||||
icon_state = "bulb-broken"
|
||||
},
|
||||
/obj/structure/window/reinforced{
|
||||
dir = 8
|
||||
},
|
||||
@@ -7265,6 +7258,9 @@
|
||||
d2 = 2;
|
||||
icon_state = "0-2"
|
||||
},
|
||||
/obj/machinery/light/small{
|
||||
dir = 4
|
||||
},
|
||||
/turf/simulated/floor/bluegrid{
|
||||
name = "cooled mainframe floor";
|
||||
temperature = 278
|
||||
@@ -8909,8 +8905,7 @@
|
||||
},
|
||||
/obj/machinery/light/small/emergency,
|
||||
/obj/machinery/camera/network/command{
|
||||
c_tag = "Command - Telecomms Main Level Relay";
|
||||
dir = 1
|
||||
c_tag = "Command - Vault Access"
|
||||
},
|
||||
/turf/simulated/floor/tiled/dark,
|
||||
/area/security/nuke_storage)
|
||||
@@ -18684,13 +18679,6 @@
|
||||
/turf/simulated/floor/tiled/white,
|
||||
/area/rnd/xenobiology)
|
||||
"GS" = (
|
||||
/obj/machinery/door/blast/regular{
|
||||
density = 0;
|
||||
icon_state = "pdoor0";
|
||||
id = "xenobio3";
|
||||
name = "Containment Blast Doors";
|
||||
opacity = 0
|
||||
},
|
||||
/obj/machinery/door/window/westright{
|
||||
name = "Containment Pen";
|
||||
req_access = list(47)
|
||||
@@ -43774,7 +43762,7 @@ As
|
||||
Bf
|
||||
Cg
|
||||
Db
|
||||
SW
|
||||
SQ
|
||||
Ex
|
||||
Ff
|
||||
vt
|
||||
@@ -44031,7 +44019,7 @@ At
|
||||
Bg
|
||||
Ch
|
||||
Dc
|
||||
SX
|
||||
SQ
|
||||
vb
|
||||
uD
|
||||
uD
|
||||
@@ -44802,7 +44790,7 @@ Av
|
||||
Bj
|
||||
Ck
|
||||
De
|
||||
SY
|
||||
SQ
|
||||
Ey
|
||||
vx
|
||||
FQ
|
||||
@@ -45059,7 +45047,7 @@ Aw
|
||||
Bk
|
||||
Cl
|
||||
Df
|
||||
SZ
|
||||
SQ
|
||||
Ez
|
||||
vv
|
||||
vT
|
||||
@@ -45316,7 +45304,7 @@ Ax
|
||||
Bl
|
||||
Cm
|
||||
Dg
|
||||
Ta
|
||||
SQ
|
||||
vb
|
||||
Fg
|
||||
vT
|
||||
@@ -45573,7 +45561,7 @@ SQ
|
||||
Bm
|
||||
Cn
|
||||
Dh
|
||||
Tb
|
||||
SQ
|
||||
EA
|
||||
Fh
|
||||
vT
|
||||
@@ -45826,10 +45814,10 @@ xy
|
||||
xy
|
||||
xy
|
||||
zQ
|
||||
SR
|
||||
ST
|
||||
SU
|
||||
SV
|
||||
SQ
|
||||
SQ
|
||||
SQ
|
||||
SQ
|
||||
Tc
|
||||
EB
|
||||
Fi
|
||||
@@ -46087,7 +46075,7 @@ vt
|
||||
Bn
|
||||
Co
|
||||
Di
|
||||
Td
|
||||
Tc
|
||||
EC
|
||||
Fh
|
||||
FR
|
||||
@@ -46581,10 +46569,10 @@ aa
|
||||
ac
|
||||
rO
|
||||
SC
|
||||
SE
|
||||
SH
|
||||
SC
|
||||
SC
|
||||
tR
|
||||
SK
|
||||
SC
|
||||
rO
|
||||
vc
|
||||
vv
|
||||
@@ -46601,7 +46589,7 @@ uU
|
||||
uE
|
||||
wm
|
||||
Dk
|
||||
Te
|
||||
Tc
|
||||
vb
|
||||
Fk
|
||||
FT
|
||||
@@ -46802,7 +46790,7 @@ gi
|
||||
gU
|
||||
hD
|
||||
Sp
|
||||
Sr
|
||||
Sp
|
||||
cg
|
||||
cg
|
||||
cg
|
||||
@@ -46825,7 +46813,7 @@ jB
|
||||
jB
|
||||
jB
|
||||
pD
|
||||
Sw
|
||||
Sv
|
||||
jB
|
||||
aa
|
||||
aa
|
||||
@@ -47116,8 +47104,8 @@ Bo
|
||||
Cq
|
||||
Dl
|
||||
jB
|
||||
Tf
|
||||
Th
|
||||
Sv
|
||||
Sv
|
||||
FV
|
||||
jB
|
||||
jB
|
||||
@@ -48144,8 +48132,8 @@ Br
|
||||
Ct
|
||||
Do
|
||||
jB
|
||||
Tg
|
||||
Ti
|
||||
Sv
|
||||
Sv
|
||||
FZ
|
||||
jB
|
||||
Dw
|
||||
@@ -48343,8 +48331,8 @@ fJ
|
||||
gn
|
||||
ha
|
||||
hH
|
||||
Sq
|
||||
Ss
|
||||
Sp
|
||||
Sp
|
||||
cg
|
||||
cg
|
||||
cg
|
||||
@@ -48894,7 +48882,7 @@ rv
|
||||
rH
|
||||
rP
|
||||
sp
|
||||
SG
|
||||
SF
|
||||
ts
|
||||
ua
|
||||
uB
|
||||
@@ -49925,7 +49913,7 @@ aa
|
||||
sS
|
||||
SI
|
||||
ue
|
||||
SL
|
||||
SI
|
||||
uV
|
||||
uV
|
||||
vD
|
||||
@@ -51223,7 +51211,7 @@ aa
|
||||
jB
|
||||
zx
|
||||
Ac
|
||||
SS
|
||||
Sv
|
||||
BA
|
||||
jB
|
||||
Du
|
||||
@@ -65089,10 +65077,10 @@ tc
|
||||
tc
|
||||
uk
|
||||
kz
|
||||
SM
|
||||
SN
|
||||
SO
|
||||
SP
|
||||
Sv
|
||||
Sv
|
||||
Sv
|
||||
Sv
|
||||
wF
|
||||
jB
|
||||
xu
|
||||
@@ -76390,7 +76378,7 @@ rh
|
||||
rh
|
||||
rm
|
||||
ry
|
||||
Sz
|
||||
Sx
|
||||
rW
|
||||
sB
|
||||
tg
|
||||
@@ -76647,7 +76635,7 @@ ri
|
||||
ri
|
||||
rn
|
||||
rz
|
||||
SA
|
||||
Sx
|
||||
rX
|
||||
rC
|
||||
rC
|
||||
@@ -77160,13 +77148,13 @@ kj
|
||||
rh
|
||||
rh
|
||||
Sx
|
||||
Sy
|
||||
SB
|
||||
Sx
|
||||
Sx
|
||||
rZ
|
||||
SD
|
||||
Sx
|
||||
ti
|
||||
tL
|
||||
SJ
|
||||
Sx
|
||||
uO
|
||||
rh
|
||||
rh
|
||||
|
||||
@@ -52495,7 +52495,7 @@
|
||||
/obj/item/weapon/pen,
|
||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/holywater,
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
|
||||
/obj/item/weapon/nullrod,
|
||||
/obj/item/weapon/nullrod/itembox,
|
||||
/turf/simulated/floor/carpet,
|
||||
/area/chapel/office)
|
||||
"bMC" = (
|
||||
@@ -57541,10 +57541,6 @@
|
||||
/obj/machinery/atm{
|
||||
pixel_y = -32
|
||||
},
|
||||
/obj/machinery/disposal,
|
||||
/obj/structure/disposalpipe/trunk{
|
||||
dir = 1
|
||||
},
|
||||
/turf/simulated/floor/wood,
|
||||
/area/crew_quarters/bar)
|
||||
"bWw" = (
|
||||
@@ -96722,7 +96718,7 @@ bRk
|
||||
bRk
|
||||
bVr
|
||||
bRH
|
||||
ckb
|
||||
bWa
|
||||
bWv
|
||||
bRi
|
||||
bVN
|
||||
@@ -98520,7 +98516,7 @@ bUl
|
||||
bRH
|
||||
bRH
|
||||
bRi
|
||||
cjY
|
||||
cjX
|
||||
bJp
|
||||
bNO
|
||||
bML
|
||||
@@ -98777,7 +98773,7 @@ bUm
|
||||
bUI
|
||||
bVd
|
||||
bRi
|
||||
cjZ
|
||||
cjX
|
||||
bWd
|
||||
bML
|
||||
bML
|
||||
@@ -99034,7 +99030,7 @@ bRi
|
||||
bRi
|
||||
bRi
|
||||
bRi
|
||||
cka
|
||||
cjX
|
||||
bML
|
||||
bJp
|
||||
bNo
|
||||
|
||||
@@ -3262,11 +3262,6 @@
|
||||
/turf/simulated/floor/tiled/white,
|
||||
/area/derelict/hallway/southeast)
|
||||
"kr" = (
|
||||
/obj/machinery/light/small{
|
||||
icon_state = "bulb-broken";
|
||||
dir = 8;
|
||||
base_state = "bulb-broken"
|
||||
},
|
||||
/obj/structure/table/standard,
|
||||
/obj/item/weapon/scalpel,
|
||||
/obj/item/device/mass_spectrometer,
|
||||
@@ -5147,7 +5142,7 @@
|
||||
"pB" = (
|
||||
/obj/structure/table/glass,
|
||||
/obj/item/device/radio{
|
||||
anchored = 1;
|
||||
anchored = 0;
|
||||
broadcasting = 0;
|
||||
canhear_range = 4;
|
||||
desc = "Are you going to make the call?";
|
||||
@@ -37130,7 +37125,7 @@ aa
|
||||
ac
|
||||
df
|
||||
iu
|
||||
up
|
||||
ac
|
||||
iX
|
||||
uR
|
||||
ir
|
||||
@@ -38897,7 +38892,7 @@ ac
|
||||
aa
|
||||
aa
|
||||
aa
|
||||
nB
|
||||
aa
|
||||
aA
|
||||
ac
|
||||
ac
|
||||
@@ -46596,7 +46591,7 @@ aa
|
||||
ac
|
||||
ir
|
||||
iq
|
||||
jB
|
||||
jz
|
||||
jz
|
||||
jz
|
||||
jz
|
||||
|
||||