From faa6be903dce41a033db227a8c39bc649ee1bbea Mon Sep 17 00:00:00 2001 From: SandPoot Date: Thu, 4 Jul 2024 21:54:25 -0300 Subject: [PATCH 1/4] fix now! --- .../code/modules/mob/living/simple_animal/bot/hugbot.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modular_sand/code/modules/mob/living/simple_animal/bot/hugbot.dm b/modular_sand/code/modules/mob/living/simple_animal/bot/hugbot.dm index 2a3194445c66..43e7e79f4904 100644 --- a/modular_sand/code/modules/mob/living/simple_animal/bot/hugbot.dm +++ b/modular_sand/code/modules/mob/living/simple_animal/bot/hugbot.dm @@ -294,10 +294,10 @@ return if(patient && path.len == 0 && (get_dist(src,patient) > 1)) - path = get_path_to(src, get_turf(patient), /turf/proc/Distance_cardinal, 0, 30,id=access_card) + path = get_path_to(src, patient, 30, id=access_card) mode = BOT_MOVING if(!path.len) //try to get closer if you can't reach the patient directly - path = get_path_to(src, get_turf(patient), /turf/proc/Distance_cardinal, 0, 30,1,id=access_card) + path = get_path_to(src, patient, 30, 1, id=access_card) if(!path.len) //Do not chase a patient we cannot reach. soft_reset() From bf6fef38c399e65f76f1f87a9b07293037fbd054 Mon Sep 17 00:00:00 2001 From: Sandstorm Bot <85452301+Sandstorm-Bot@users.noreply.github.com> Date: Fri, 5 Jul 2024 02:25:24 +0000 Subject: [PATCH 2/4] Automatic changelog generation for PR #375 [ci skip] --- html/changelogs/AutoChangeLog-pr-375.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-375.yml diff --git a/html/changelogs/AutoChangeLog-pr-375.yml b/html/changelogs/AutoChangeLog-pr-375.yml new file mode 100644 index 000000000000..aec82fbb0aab --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-375.yml @@ -0,0 +1,4 @@ +author: SandPoot +delete-after: true +changes: + - bugfix: Fixed runtimes on hugbot. From aedfd891120bd47a49a932e290d0800eee7d4eb1 Mon Sep 17 00:00:00 2001 From: Sandstorm Bot <85452301+Sandstorm-Bot@users.noreply.github.com> Date: Fri, 5 Jul 2024 02:26:24 +0000 Subject: [PATCH 3/4] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-375.yml | 4 ---- html/changelogs/archive/2024-07.yml | 3 +++ 2 files changed, 3 insertions(+), 4 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-375.yml create mode 100644 html/changelogs/archive/2024-07.yml diff --git a/html/changelogs/AutoChangeLog-pr-375.yml b/html/changelogs/AutoChangeLog-pr-375.yml deleted file mode 100644 index aec82fbb0aab..000000000000 --- a/html/changelogs/AutoChangeLog-pr-375.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: SandPoot -delete-after: true -changes: - - bugfix: Fixed runtimes on hugbot. diff --git a/html/changelogs/archive/2024-07.yml b/html/changelogs/archive/2024-07.yml new file mode 100644 index 000000000000..4ab93f5caed1 --- /dev/null +++ b/html/changelogs/archive/2024-07.yml @@ -0,0 +1,3 @@ +2024-07-05: + SandPoot: + - bugfix: Fixed runtimes on hugbot. From e5a9280ad32fa8a4857b4e3ce246a2a516589a6f Mon Sep 17 00:00:00 2001 From: SandPoot Date: Thu, 4 Jul 2024 23:44:35 -0300 Subject: [PATCH 4/4] push --- code/__DEFINES/vv.dm | 1 + code/datums/changelog/changelog.dm | 2 +- code/modules/mob/living/carbon/human/human.dm | 29 ++++++ code/modules/vehicles/_vehicle.dm | 92 +++++++++++++----- icons/obj/dice.dmi | Bin 7814 -> 3904 bytes interface/interface.dm | 2 +- 6 files changed, 101 insertions(+), 25 deletions(-) diff --git a/code/__DEFINES/vv.dm b/code/__DEFINES/vv.dm index 86a3bd4c31dd..9d0031a80790 100644 --- a/code/__DEFINES/vv.dm +++ b/code/__DEFINES/vv.dm @@ -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" diff --git a/code/datums/changelog/changelog.dm b/code/datums/changelog/changelog.dm index 3ce51c60344c..1b7c76232536 100644 --- a/code/datums/changelog/changelog.dm +++ b/code/datums/changelog/changelog.dm @@ -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"] diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 1539c744d400..d75398a790e1 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -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 = "[key_name_admin(usr)] has removed [key_name(src)] from purrbation." 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: +
+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. +
+ "} + 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 diff --git a/code/modules/vehicles/_vehicle.dm b/code/modules/vehicles/_vehicle.dm index 4925cf40e700..33a868a36297 100644 --- a/code/modules/vehicles/_vehicle.dm +++ b/code/modules/vehicles/_vehicle.dm @@ -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) - . += "It's on fire!" - var/healthpercent = obj_integrity/max_integrity * 100 - switch(healthpercent) + . += span_warning("It's on fire!") + . += generate_integrity_message() + +/// 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) - . += "It looks slightly damaged." + examine_text = "It looks slightly damaged." if(25 to 50) - . += "It appears heavily damaged." + examine_text = "It appears heavily damaged." if(0 to 25) - . += "It's falling apart!" + examine_text = span_warning("It's falling apart!") -/obj/vehicle/proc/is_key(obj/item/I) - return I? (key_type_exact? (I.type == key_type) : istype(I, key_type)) : FALSE + 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, "[src] has no key inserted!") + 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 diff --git a/icons/obj/dice.dmi b/icons/obj/dice.dmi index aecdbde71c614b4ac5aa1d8c777177f014f26ac4..fa5c5abc5fefa9e3c15d506857fa54540fd2c0a1 100644 GIT binary patch delta 3640 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 diff --git a/interface/interface.dm b/interface/interface.dm index 78da9b9ebf3f..44b0456ccea2 100644 --- a/interface/interface.dm +++ b/interface/interface.dm @@ -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()