Merge branch 'master' into tgui-alerts-and-what-not
This commit is contained in:
@@ -187,3 +187,6 @@
|
||||
var/list/block_parry_hinted = list()
|
||||
/// moused over objects, currently capped at 7. this is awful, and should be replaced with a component to track it using signals for parrying at some point.
|
||||
var/list/moused_over_objects = list()
|
||||
|
||||
/// AFK tracking
|
||||
var/last_activity = 0
|
||||
|
||||
@@ -83,6 +83,8 @@ GLOBAL_LIST_INIT(blacklisted_builds, list(
|
||||
log_href("[src] (usr:[usr]\[[COORD(usr)]\]) : [hsrc ? "[hsrc] " : ""][href]")
|
||||
return
|
||||
|
||||
last_activity = world.time
|
||||
|
||||
//Logs all hrefs
|
||||
log_href("[src] (usr:[usr]\[[COORD(usr)]\]) : [hsrc ? "[hsrc] " : ""][href]")
|
||||
|
||||
@@ -222,6 +224,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list(
|
||||
///////////
|
||||
|
||||
/client/New(TopicData)
|
||||
last_activity = world.time
|
||||
world.SetConfig("APP/admin", ckey, "role=admin")
|
||||
var/tdata = TopicData //save this for later use
|
||||
TopicData = null //Prevent calls to client.Topic from connect
|
||||
@@ -578,9 +581,10 @@ GLOBAL_LIST_INIT(blacklisted_builds, list(
|
||||
//If we aren't an admin, and the flag is set
|
||||
if(CONFIG_GET(flag/panic_bunker) && !holder && !GLOB.deadmins[ckey] && !(ckey in GLOB.bunker_passthrough))
|
||||
var/living_recs = CONFIG_GET(number/panic_bunker_living)
|
||||
var/vpn_living_recs = CONFIG_GET(number/panic_bunker_living_vpn)
|
||||
//Relies on pref existing, but this proc is only called after that occurs, so we're fine.
|
||||
var/minutes = get_exp_living(pure_numeric = TRUE)
|
||||
if(minutes <= living_recs) // && !CONFIG_GET(flag/panic_bunker_interview)
|
||||
if((minutes <= living_recs) || (IsVPN() && (minutes < vpn_living_recs)))
|
||||
var/reject_message = "Failed Login: [key] - Account attempting to connect during panic bunker, but they do not have the required living time [minutes]/[living_recs]"
|
||||
log_access(reject_message)
|
||||
message_admins("<span class='adminnotice'>[reject_message]</span>")
|
||||
@@ -850,6 +854,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list(
|
||||
/client/Click(atom/object, atom/location, control, params, ignore_spam = FALSE, extra_info)
|
||||
if(last_click > world.time - world.tick_lag)
|
||||
return
|
||||
last_activity = world.time
|
||||
last_click = world.time
|
||||
var/ab = FALSE
|
||||
var/list/L = params2list(params)
|
||||
@@ -922,6 +927,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list(
|
||||
//checks if a client is afk
|
||||
//3000 frames = 5 minutes
|
||||
/client/proc/is_afk(duration = CONFIG_GET(number/inactivity_period))
|
||||
var/inactivity = world.time - last_activity
|
||||
if(inactivity > duration)
|
||||
return inactivity
|
||||
return FALSE
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
/client/proc/IsVPN()
|
||||
var/datum/ipintel/res = get_ip_intel(address)
|
||||
return res.intel >= CONFIG_GET(number/ipintel_rating_bad)
|
||||
@@ -15,6 +15,6 @@
|
||||
var/indelay = stripped_input(usr, "Enter the tooltip delay in milliseconds (default: 500)", "Enter tooltip delay", "", 10)
|
||||
indelay = text2num(indelay)
|
||||
if(usr)//is this what you mean?
|
||||
prefs.tip_delay = indelay
|
||||
prefs.tip_delay = max(indelay, 0.01)
|
||||
prefs.save_preferences()
|
||||
to_chat(usr, "<span class='danger'>Tooltip delay set to [indelay] milliseconds.</span>")
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
var/pirate_type = PIRATES_ROGUES //pick(PIRATES_ROGUES, PIRATES_SILVERSCALES, PIRATES_DUTCHMAN)
|
||||
var/datum/comm_message/threat_msg = new
|
||||
var/payoff = 0
|
||||
var/payoff_min = 10000
|
||||
var/payoff_min = 1000
|
||||
var/ship_template
|
||||
var/ship_name = "Space Privateers Association"
|
||||
var/initial_send_time = world.time
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
set hidden = TRUE
|
||||
|
||||
client_keysend_amount += 1
|
||||
last_activity = world.time
|
||||
|
||||
var/cache = client_keysend_amount
|
||||
|
||||
@@ -89,6 +90,7 @@
|
||||
set hidden = TRUE
|
||||
|
||||
keys_held -= _key
|
||||
last_activity = world.time
|
||||
var/movement = movement_keys[_key]
|
||||
if(!(next_move_dir_add & movement))
|
||||
next_move_dir_sub |= movement
|
||||
|
||||
@@ -312,12 +312,14 @@ Key procs
|
||||
/datum/language/machine = list(LANGUAGE_ATOM),
|
||||
/datum/language/draconic = list(LANGUAGE_ATOM),
|
||||
/datum/language/slime = list(LANGUAGE_ATOM),
|
||||
/datum/language/dwarf = list(LANGUAGE_ATOM))
|
||||
/datum/language/dwarf = list(LANGUAGE_ATOM),
|
||||
/datum/language/neokanji = list(LANGUAGE_ATOM))
|
||||
spoken_languages = list(/datum/language/common = list(LANGUAGE_ATOM),
|
||||
/datum/language/machine = list(LANGUAGE_ATOM),
|
||||
/datum/language/draconic = list(LANGUAGE_ATOM),
|
||||
/datum/language/slime = list(LANGUAGE_ATOM),
|
||||
/datum/language/dwarf = list(LANGUAGE_ATOM))
|
||||
/datum/language/dwarf = list(LANGUAGE_ATOM),
|
||||
/datum/language/neokanji = list(LANGUAGE_ATOM))
|
||||
|
||||
/datum/language_holder/venus
|
||||
understood_languages = list(/datum/language/common = list(LANGUAGE_ATOM),
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
/datum/language/neokanji
|
||||
name = "Neo-Kanji"
|
||||
desc = "A bastardized mixture of many old Earth asian dialects. Famously known as the official language of the spider clan."
|
||||
speech_verb = "proclaims"
|
||||
ask_verb = "queries"
|
||||
exclaim_verb = "declares"
|
||||
whisper_verb = "hushes"
|
||||
key = "k"
|
||||
space_chance = 40
|
||||
default_priority = 94
|
||||
flags = TONGUELESS_SPEECH
|
||||
chooseable_roundstart = TRUE
|
||||
syllables = list("ka", "ki", "ku", "ke", "ko", "ta",
|
||||
"chi", "tsu", "te", "to", "sa", "shi",
|
||||
"su", "se", "so", "na","ni","nu","ne",
|
||||
"no","n","ha","hi","fu","he","ho","ma",
|
||||
"mi","mu","me","mo","ya","yu","yo","ra",
|
||||
"ri","ru","re","ro","wa","wo", "an", "ang",
|
||||
"ao", "ba", "bai", "ban", "bang", "bao",
|
||||
"bei", "beng", "chuai", "xing", "xong", "zhao",
|
||||
"zhong", "xil", "ping", "dang", "guang", "guan",
|
||||
"jing", "jiao", "kung", "fu", "lo", "wang",
|
||||
"liu", "ling", "mang", "nong", "peng", "qiong",
|
||||
"san","tiao", "wan","xiong", "men")
|
||||
icon_state = "neokanji"
|
||||
@@ -1055,10 +1055,10 @@
|
||||
return
|
||||
if(!HAS_TRAIT(src, TRAIT_IGNOREDAMAGESLOWDOWN)) //if we want to ignore slowdown from damage, but not from equipment
|
||||
var/scaling = maxHealth / 100
|
||||
var/health_deficiency = max(((maxHealth / scaling) - (health / scaling)), (getStaminaLoss()*0.75))
|
||||
var/health_deficiency = max(((maxHealth / scaling) - (health / scaling)), max(0, getStaminaLoss() - 39))
|
||||
if(health_deficiency >= 40)
|
||||
add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown, TRUE, (health_deficiency - 15) / 75)
|
||||
add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown_flying, TRUE, (health_deficiency - 15) / 25)
|
||||
add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown, TRUE, health_deficiency / 75)
|
||||
add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown_flying, TRUE, health_deficiency / 25)
|
||||
else
|
||||
remove_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown)
|
||||
remove_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown_flying)
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
set name = "say_indicator"
|
||||
set hidden = TRUE
|
||||
set category = "IC"
|
||||
client?.last_activity = world.time
|
||||
display_typing_indicator()
|
||||
var/message = tgui_input_text(usr, null, "say")
|
||||
// If they don't type anything just drop the message.
|
||||
@@ -21,12 +22,16 @@
|
||||
to_chat(usr, "<span class='danger'>Speech is currently admin-disabled.</span>")
|
||||
return
|
||||
clear_typing_indicator() // clear it immediately!
|
||||
|
||||
client?.last_activity = world.time
|
||||
|
||||
say(message)
|
||||
|
||||
/mob/verb/me_typing_indicator()
|
||||
set name = "me_indicator"
|
||||
set hidden = TRUE
|
||||
set category = "IC"
|
||||
client?.last_activity = world.time
|
||||
display_typing_indicator()
|
||||
var/message = tgui_input_message(usr, null, "me")
|
||||
// If they don't type anything just drop the message.
|
||||
@@ -52,6 +57,8 @@
|
||||
message = trim(copytext_char(sanitize(message), 1, MAX_MESSAGE_LEN))
|
||||
clear_typing_indicator() // clear it immediately!
|
||||
|
||||
client?.last_activity = world.time
|
||||
|
||||
usr.emote("me",1,message,TRUE)
|
||||
|
||||
/mob/say_mod(input, message_mode)
|
||||
@@ -73,6 +80,7 @@
|
||||
return lowertext(copytext_char(input, 1, customsayverb))
|
||||
|
||||
/mob/proc/whisper_keybind()
|
||||
client?.last_activity = world.time
|
||||
var/message = tgui_input_text(src, "", "whisper")
|
||||
if(!length(message))
|
||||
return
|
||||
@@ -89,6 +97,7 @@
|
||||
whisper(message)
|
||||
|
||||
/mob/proc/whisper(message, datum/language/language=null)
|
||||
client?.last_activity = world.time
|
||||
say(message, language) //only living mobs actually whisper, everything else just talks
|
||||
|
||||
/mob/proc/say_dead(var/message)
|
||||
@@ -132,6 +141,7 @@
|
||||
message = emoji_parse(message)
|
||||
var/rendered = "<span class='game deadsay'><span class='prefix'>DEAD:</span> <span class='name'>[name]</span>[alt_name] <span class='message'>[emoji_parse(spanned)]</span></span>"
|
||||
log_talk(message, LOG_SAY, tag="DEAD")
|
||||
client?.last_activity = world.time
|
||||
deadchat_broadcast(rendered, follow_target = src, speaker_key = key)
|
||||
|
||||
/mob/proc/check_emote(message)
|
||||
|
||||
@@ -21,3 +21,6 @@
|
||||
var/obj/item/clothing/suit/space/space_ninja/S = H.wear_suit
|
||||
if(istype(H.belt, belt))
|
||||
S.energyKatana = H.belt
|
||||
H.grant_language(/datum/language/neokanji)
|
||||
var/datum/language_holder/LH = H.get_language_holder()
|
||||
LH.selected_language = /datum/language/neokanji
|
||||
|
||||
@@ -246,15 +246,15 @@
|
||||
mag_type = /obj/item/ammo_box/magazine/internal/shot/com
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
var/stock = FALSE
|
||||
var/extend_sound = 'sound/weapons/batonextend.ogg'
|
||||
recoil = 5
|
||||
spread = 2
|
||||
|
||||
/obj/item/gun/ballistic/shotgun/automatic/combat/compact/AltClick(mob/living/user)
|
||||
. = ..()
|
||||
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)) || item_flags && IN_STORAGE)
|
||||
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)) || item_flags & IN_STORAGE)
|
||||
return
|
||||
toggle_stock(user)
|
||||
return TRUE
|
||||
. = ..()
|
||||
|
||||
/obj/item/gun/ballistic/shotgun/automatic/combat/compact/examine(mob/user)
|
||||
. = ..()
|
||||
@@ -272,6 +272,7 @@
|
||||
to_chat(user, "You fold the stock.")
|
||||
recoil = 5
|
||||
spread = 2
|
||||
playsound(src.loc, extend_sound, 50, 1)
|
||||
update_icon()
|
||||
|
||||
/obj/item/gun/ballistic/shotgun/automatic/combat/compact/update_icon_state()
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
/datum/language/vampiric,
|
||||
/datum/language/dwarf,
|
||||
/datum/language/signlanguage,
|
||||
/datum/language/neokanji,
|
||||
))
|
||||
healing_factor = STANDARD_ORGAN_HEALING*5 //Fast!!
|
||||
decay_factor = STANDARD_ORGAN_DECAY/2
|
||||
@@ -253,7 +254,8 @@
|
||||
/datum/language/beachbum,
|
||||
/datum/language/aphasia,
|
||||
/datum/language/sylvan,
|
||||
/datum/language/voltaic
|
||||
/datum/language/voltaic,
|
||||
/datum/language/neokanji,
|
||||
))
|
||||
|
||||
/obj/item/organ/tongue/ethereal/Initialize(mapload)
|
||||
|
||||
@@ -300,6 +300,7 @@
|
||||
process_status()
|
||||
if(src_object.ui_act(act_type, payload, src, state))
|
||||
SStgui.update_uis(src_object)
|
||||
usr?.client?.last_activity = world.time
|
||||
return FALSE
|
||||
switch(type)
|
||||
if("ready")
|
||||
|
||||
@@ -119,15 +119,18 @@ Notes:
|
||||
//Includes sanity checks.
|
||||
/proc/closeToolTip(mob/user)
|
||||
if(istype(user))
|
||||
if(user.client && user.client.tooltips)
|
||||
user.client.tooltips.hide()
|
||||
if(user.client)
|
||||
var/client/client = user.client
|
||||
if(client.tooltips)
|
||||
client.tooltips.hide()
|
||||
deltimer(client.tip_timer) //delete any in-progress timer if the mouse is moved off the item before it finishes
|
||||
client.tip_timer = null
|
||||
|
||||
/**
|
||||
* # `get_tooltip_data()`
|
||||
*
|
||||
* If set, will return a list for the tooltip (that will also be put together in a `Join()`)
|
||||
* However, if returning `null`, falls back to default behavior, which is `examine(src)`, and it will definitely include
|
||||
* images since it is the default behavior
|
||||
* However, if returning `null`, the tooltip will not be shown as #14942 changed it.
|
||||
*
|
||||
* Though no tooltips will be created for atoms that have `tooltips = FALSE`
|
||||
*/
|
||||
@@ -137,11 +140,12 @@ Notes:
|
||||
/atom/movable/MouseEntered(location, control, params)
|
||||
. = ..()
|
||||
if(tooltips)
|
||||
if(!QDELETED(src) && usr.client.prefs.enable_tips)
|
||||
if(!QDELETED(src) && usr?.client.prefs.enable_tips)
|
||||
var/list/tooltip_data = get_tooltip_data()
|
||||
if(length(tooltip_data))
|
||||
var/examine_data = tooltip_data.Join("<br />")
|
||||
openToolTip(usr, src, params, title = name, content = examine_data)
|
||||
var/timedelay = max(usr.client.prefs.tip_delay * 0.01, 0.01) // I heard multiplying is faster, also runtimes from very low/negative numbers
|
||||
usr.client.tip_timer = addtimer(CALLBACK(GLOBAL_PROC, .proc/openToolTip, usr, src, params, name, examine_data), timedelay, TIMER_STOPPABLE)
|
||||
|
||||
/atom/movable/MouseExited(location, control, params)
|
||||
. = ..()
|
||||
@@ -150,3 +154,7 @@ Notes:
|
||||
/client/MouseDown(object, location, control, params)
|
||||
closeToolTip(usr)
|
||||
. = ..()
|
||||
|
||||
/client
|
||||
/// Timers are now handled by clients, not by doing a mess on the item and multiple people overwriting a single timer on the object, have fun.
|
||||
var/tip_timer = null
|
||||
|
||||
Reference in New Issue
Block a user