mirror of
https://github.com/SPLURT-Station/S.P.L.U.R.T-Station-13.git
synced 2025-12-09 16:07:40 +00:00
Merge pull request #16093 from SandPoot/bag-of-fixes+feature
A bunch of fixes and a small admin feature
This commit is contained in:
@@ -132,6 +132,7 @@
|
||||
#define VV_HK_MAKE_ALIEN "human_alienify"
|
||||
#define VV_HK_SET_SPECIES "setspecies"
|
||||
#define VV_HK_PURRBATION "purrbation"
|
||||
#define VV_HK_APPLY_PREFS "applyprefs"
|
||||
|
||||
// misc
|
||||
#define VV_HK_SPACEVINE_PURGE "spacevine_purge"
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
var/list/data = list( "dates" = list() )
|
||||
var/regex/ymlRegex = regex(@"\.yml", "g")
|
||||
|
||||
for(var/archive_file in flist("[global.config.directory]/../html/changelogs/archive/"))
|
||||
for(var/archive_file in sort_list(flist("html/changelogs/archive/")))
|
||||
var/archive_date = ymlRegex.Replace(archive_file, "")
|
||||
data["dates"] = list(archive_date) + data["dates"]
|
||||
|
||||
|
||||
@@ -685,6 +685,7 @@
|
||||
VV_DROPDOWN_OPTION(VV_HK_MAKE_ALIEN, "Make Alien")
|
||||
VV_DROPDOWN_OPTION(VV_HK_SET_SPECIES, "Set Species")
|
||||
VV_DROPDOWN_OPTION(VV_HK_PURRBATION, "Toggle Purrbation")
|
||||
VV_DROPDOWN_OPTION(VV_HK_APPLY_PREFS, "Apply preferences")
|
||||
|
||||
/mob/living/carbon/human/vv_do_topic(list/href_list)
|
||||
. = ..()
|
||||
@@ -765,6 +766,34 @@
|
||||
var/msg = "<span class='notice'>[key_name_admin(usr)] has removed [key_name(src)] from purrbation.</span>"
|
||||
message_admins(msg)
|
||||
admin_ticket_log(src, msg)
|
||||
if(href_list[VV_HK_APPLY_PREFS])
|
||||
if(!check_rights(R_SPAWN))
|
||||
return
|
||||
if(!client)
|
||||
var/bigtext = {"This action requires a client, if you need to do anything special, follow this short guide:
|
||||
<blockquote class="info">
|
||||
Mark this mob, then navigate to the preferences of the client you desire and call copy_to() with one argument, when it asks for the argument, browse to the bottom of the list and select marked datum, if you've followed this guide correctly, the mob will be turned into the character from the preferences you used.
|
||||
</blockquote>
|
||||
"}
|
||||
to_chat(usr, bigtext)
|
||||
return
|
||||
|
||||
var/datum/preferences/copying_this_one = client.prefs // turns out that prefs always exist if the client leaves, i'm not checking for client again
|
||||
var/is_this_guy_trolling_the_admin = copying_this_one.default_slot
|
||||
|
||||
if(alert(usr, "Confirm reapply preferences?", "", "I'm sure", "Cancel") != "I'm sure")
|
||||
return
|
||||
|
||||
if(is_this_guy_trolling_the_admin != copying_this_one.default_slot) // why would you do this, broooo
|
||||
if(alert(usr, "The user changed their character slot while you were deciding, are you sure you want to do this? They might change their mind again and i will not protect again this time", "Uh oh", "I'm sure", "They did what?") != "I'm sure")
|
||||
return
|
||||
|
||||
copying_this_one.copy_to(src)
|
||||
var/change_text = "reapplied [key_name(src, TRUE)]'s preferences, [(is_this_guy_trolling_the_admin != copying_this_one.default_slot) ? "changing their character" : "resetting their character"]."
|
||||
to_chat(usr, capitalize(change_text))
|
||||
log_admin("[key_name(usr)] has [change_text]")
|
||||
message_admins(span_notice("[key_name_admin(usr)] has [change_text]"))
|
||||
admin_ticket_log(src, span_notice("[key_name_admin(usr, FALSE)] has [change_text]")) // In case they complained in an ahelp, we'll let them know anything happened
|
||||
|
||||
/mob/living/carbon/human/MouseDrop_T(mob/living/target, mob/living/user)
|
||||
var/GS_needed = istype(target, /mob/living/silicon/pai)? GRAB_PASSIVE : GRAB_AGGRESSIVE
|
||||
|
||||
@@ -8,23 +8,41 @@
|
||||
density = TRUE
|
||||
anchored = FALSE
|
||||
COOLDOWN_DECLARE(cooldown_vehicle_move)
|
||||
var/list/mob/occupants //mob = bitflags of their control level.
|
||||
/// mob = bitflags of their control level.
|
||||
var/list/mob/occupants
|
||||
var/max_occupants = 1
|
||||
/// Maximum amount of drivers
|
||||
var/max_drivers = 1
|
||||
var/movedelay = 2
|
||||
var/lastmove = 0
|
||||
/**
|
||||
* If the driver needs a certain item in hand (or inserted, for vehicles) to drive this. For vehicles, this must be duplicated on their riding component subtype
|
||||
* [/datum/component/riding/var/keytype] variable because only a few specific checks are handled here with this var, and the majority of it is on the riding component
|
||||
* Eventually the remaining checks should be moved to the component and this var removed.
|
||||
*/
|
||||
var/key_type
|
||||
/// The inserted key, needed on some vehicles to start the engine
|
||||
var/obj/item/key/inserted_key
|
||||
var/key_type_exact = TRUE //can subtypes work
|
||||
/// Can subtypes of this key work
|
||||
var/key_type_exact = TRUE
|
||||
/// Whether the vehicle is currently able to move
|
||||
var/canmove = TRUE
|
||||
var/emulate_door_bumps = TRUE //when bumping a door try to make occupants bump them to open them.
|
||||
var/default_driver_move = TRUE //handle driver movement instead of letting something else do it like riding datums.
|
||||
var/enclosed = FALSE // is the rider protected from bullets? assume no
|
||||
var/list/autogrant_actions_passenger //plain list of typepaths
|
||||
var/list/autogrant_actions_controller //assoc list "[bitflag]" = list(typepaths)
|
||||
var/list/mob/occupant_actions //assoc list mob = list(type = action datum assigned to mob)
|
||||
/// When bumping a door try to make occupants bump them to open them.
|
||||
var/emulate_door_bumps = TRUE
|
||||
/// Handle driver movement instead of letting something else do it like riding datums.
|
||||
var/default_driver_move = TRUE
|
||||
/// Is the rider protected from bullets? assume no
|
||||
var/enclosed = FALSE
|
||||
/// Plain list of typepaths
|
||||
var/list/autogrant_actions_passenger
|
||||
/// Assoc list "[bitflag]" = list(typepaths)
|
||||
var/list/autogrant_actions_controller
|
||||
/// Assoc list mob = list(type = action datum assigned to mob)
|
||||
var/list/mob/occupant_actions
|
||||
/// This vehicle will follow us when we move (like atrailer duh)
|
||||
var/obj/vehicle/trailer
|
||||
var/mouse_pointer //do we have a special mouse
|
||||
/// Do we have a special mouse
|
||||
var/mouse_pointer
|
||||
|
||||
/obj/vehicle/Initialize(mapload)
|
||||
. = ..()
|
||||
@@ -37,18 +55,29 @@
|
||||
/obj/vehicle/examine(mob/user)
|
||||
. = ..()
|
||||
if(resistance_flags & ON_FIRE)
|
||||
. += "<span class='warning'>It's on fire!</span>"
|
||||
var/healthpercent = obj_integrity/max_integrity * 100
|
||||
switch(healthpercent)
|
||||
if(50 to 99)
|
||||
. += "It looks slightly damaged."
|
||||
if(25 to 50)
|
||||
. += "It appears heavily damaged."
|
||||
if(0 to 25)
|
||||
. += "<span class='warning'>It's falling apart!</span>"
|
||||
. += span_warning("It's on fire!")
|
||||
. += generate_integrity_message()
|
||||
|
||||
/obj/vehicle/proc/is_key(obj/item/I)
|
||||
return I? (key_type_exact? (I.type == key_type) : istype(I, key_type)) : FALSE
|
||||
/// Returns a readable string of the vehicle's health for examining. Overridden by subtypes who want to be more verbose with their health messages.
|
||||
/obj/vehicle/proc/generate_integrity_message()
|
||||
var/examine_text = ""
|
||||
var/integrity = obj_integrity/max_integrity * 100
|
||||
switch(integrity)
|
||||
if(50 to 99)
|
||||
examine_text = "It looks slightly damaged."
|
||||
if(25 to 50)
|
||||
examine_text = "It appears heavily damaged."
|
||||
if(0 to 25)
|
||||
examine_text = span_warning("It's falling apart!")
|
||||
|
||||
return examine_text
|
||||
|
||||
/obj/vehicle/proc/is_key(obj/item/possible_key)
|
||||
if(possible_key)
|
||||
if(key_type_exact)
|
||||
return possible_key.type == key_type
|
||||
return istype(possible_key, key_type)
|
||||
return FALSE
|
||||
|
||||
/obj/vehicle/proc/return_occupants()
|
||||
return occupants
|
||||
@@ -79,7 +108,7 @@
|
||||
return is_occupant(M) && occupants[M] & VEHICLE_CONTROL_DRIVE
|
||||
|
||||
/obj/vehicle/proc/is_occupant(mob/M)
|
||||
return !isnull(occupants[M])
|
||||
return !isnull(LAZYACCESS(occupants, M))
|
||||
|
||||
/obj/vehicle/proc/add_occupant(mob/M, control_flags)
|
||||
if(!istype(M) || is_occupant(M))
|
||||
@@ -99,6 +128,7 @@
|
||||
add_control_flags(M, VEHICLE_CONTROL_DRIVE)
|
||||
|
||||
/obj/vehicle/proc/remove_occupant(mob/M)
|
||||
SHOULD_CALL_PARENT(TRUE)
|
||||
if(!istype(M))
|
||||
return FALSE
|
||||
remove_control_flags(M, ALL)
|
||||
@@ -111,13 +141,15 @@
|
||||
/obj/vehicle/proc/after_remove_occupant(mob/M)
|
||||
|
||||
/obj/vehicle/relaymove(mob/user, direction)
|
||||
if(!canmove)
|
||||
return FALSE
|
||||
if(is_driver(user))
|
||||
return driver_move(user, direction)
|
||||
return FALSE
|
||||
|
||||
/obj/vehicle/proc/driver_move(mob/user, direction)
|
||||
if(key_type && !is_key(inserted_key))
|
||||
to_chat(user, "<span class='warning'>[src] has no key inserted!</span>")
|
||||
to_chat(user, span_warning("[src] has no key inserted!"))
|
||||
return FALSE
|
||||
if(!default_driver_move)
|
||||
return
|
||||
@@ -127,15 +159,15 @@
|
||||
if(!COOLDOWN_FINISHED(src, cooldown_vehicle_move))
|
||||
return FALSE
|
||||
COOLDOWN_START(src, cooldown_vehicle_move, movedelay)
|
||||
|
||||
if(trailer)
|
||||
var/dir_to_move = get_dir(trailer.loc, loc)
|
||||
var/did_move = step(src, direction)
|
||||
if(did_move)
|
||||
step(trailer, dir_to_move)
|
||||
return did_move
|
||||
else
|
||||
after_move(direction)
|
||||
return step(src, direction)
|
||||
after_move(direction)
|
||||
return step(src, direction)
|
||||
|
||||
/obj/vehicle/proc/after_move(direction)
|
||||
return
|
||||
@@ -165,10 +197,24 @@
|
||||
for(var/m in occupants)
|
||||
M.Bumped(m)
|
||||
|
||||
/// To add a trailer to the vehicle in a manner that allows safe qdels
|
||||
/obj/vehicle/proc/add_trailer(obj/vehicle/added_vehicle)
|
||||
trailer = added_vehicle
|
||||
RegisterSignal(trailer, COMSIG_PARENT_QDELETING, PROC_REF(remove_trailer))
|
||||
|
||||
/// To remove a trailer from the vehicle in a manner that allows safe qdels
|
||||
/obj/vehicle/proc/remove_trailer()
|
||||
SIGNAL_HANDLER
|
||||
UnregisterSignal(trailer, COMSIG_PARENT_QDELETING)
|
||||
trailer = null
|
||||
|
||||
/obj/vehicle/Move(newloc, dir)
|
||||
// It is unfortunate, but this is the way to make it not mess up
|
||||
var/atom/old_loc = loc
|
||||
// When we do this, it will set the loc to the new loc
|
||||
. = ..()
|
||||
if(trailer && .)
|
||||
var/dir_to_move = get_dir(trailer.loc, newloc)
|
||||
var/dir_to_move = get_dir(trailer.loc, old_loc)
|
||||
step(trailer, dir_to_move)
|
||||
|
||||
/obj/vehicle/bullet_act(obj/item/projectile/Proj) //wrapper
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 7.6 KiB After Width: | Height: | Size: 3.8 KiB |
@@ -85,7 +85,7 @@
|
||||
if(!GLOB.changelog_tgui)
|
||||
GLOB.changelog_tgui = new /datum/changelog()
|
||||
|
||||
GLOB.changelog_tgui.ui_interact(usr)
|
||||
GLOB.changelog_tgui.ui_interact(mob)
|
||||
if(prefs.lastchangelog != GLOB.changelog_hash)
|
||||
prefs.lastchangelog = GLOB.changelog_hash
|
||||
prefs.save_preferences()
|
||||
|
||||
Reference in New Issue
Block a user