Skip to content

Commit

Permalink
Merge branch 'staging' of github.com:NebulaSS13/Nebula into feature/a…
Browse files Browse the repository at this point in the history
…nima
  • Loading branch information
MistakeNot4892 committed Jan 25, 2025
2 parents ead9e47 + 01133c3 commit 52b0efc
Show file tree
Hide file tree
Showing 17 changed files with 188 additions and 114 deletions.
4 changes: 2 additions & 2 deletions code/_onclick/click.dm
Original file line number Diff line number Diff line change
Expand Up @@ -282,10 +282,10 @@
return A.CtrlClick(src)

/atom/proc/CtrlClick(var/mob/user)
if(loc == user)
if(get_recursive_loc_of_type(/mob) == user)
var/decl/interaction_handler/handler = get_quick_interaction_handler(user)
if(handler)
var/using_item = user.get_active_held_item() || user.get_usable_hand_slot_organ()
var/using_item = user.get_active_held_item()
if(handler.is_possible(src, user, using_item))
return handler.invoked(src, user, using_item)
return FALSE
Expand Down
63 changes: 61 additions & 2 deletions code/datums/extensions/holster/holster.dm
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@
to_chat(user, "It is empty.")

/datum/extension/holster/proc/check_holster()
if(holstered.loc != storage)
if(holstered.loc != storage.holder)
clear_holster()

/atom/proc/holster_verb(var/holster_name in get_holsters())
Expand Down Expand Up @@ -154,4 +154,63 @@
else
for(var/i = 1 to holster_accessories.len)
var/holster_name = "[accessory_name] [i]"
.[holster_name] = get_extension(holster_accessories[i], /datum/extension/holster)
.[holster_name] = get_extension(holster_accessories[i], /datum/extension/holster)

// Basic unholster for an item at the top level.
/decl/interaction_handler/unholster
name = "Unholster"

/decl/interaction_handler/unholster/is_possible(atom/target, mob/user, obj/item/prop)
. = ..() && !prop
if(.)
var/datum/extension/holster/holster = get_extension(target, /datum/extension/holster)
return !!holster?.holstered

/decl/interaction_handler/unholster/invoked(atom/target, mob/user, obj/item/prop)
var/datum/extension/holster/holster = get_extension(target, /datum/extension/holster)
return holster?.unholster(user, avoid_intent = TRUE)

// Interaction procs for getting this interaction for basic items.
/obj/item/get_quick_interaction_handler(mob/user)
if(!(. = ..()))
var/datum/extension/holster/holster = get_extension(src, /datum/extension/holster)
if(holster?.holstered)
return GET_DECL(/decl/interaction_handler/unholster)

// More complex version of the above that iterates clothing accessories.
/decl/interaction_handler/unholster_accessory
name = "Unholster From Accessory"
expected_target_type = /obj/item/clothing

/decl/interaction_handler/unholster_accessory/is_possible(atom/target, mob/user, obj/item/prop)
. = ..() && !prop
if(.)
var/obj/item/clothing/clothes = target
for(var/obj/item/thing in clothes.accessories)
var/datum/extension/holster/holster = get_extension(thing, /datum/extension/holster)
if(holster?.holstered)
return TRUE
return FALSE

/decl/interaction_handler/unholster_accessory/invoked(atom/target, mob/user, obj/item/prop)
var/obj/item/clothing/clothes = target
for(var/obj/item/thing in clothes.accessories)
var/datum/extension/holster/holster = get_extension(thing, /datum/extension/holster)
if(holster?.unholster(user, avoid_intent = TRUE))
return TRUE
return FALSE

// Interaction procs for getting this interaction for clothing accessories.
/obj/item/clothing/get_alt_interactions(mob/user)
. = ..()
for(var/obj/item/thing in accessories)
var/datum/extension/holster/holster = get_extension(thing, /datum/extension/holster)
if(holster?.holstered)
LAZYADD(., GET_DECL(/decl/interaction_handler/unholster_accessory))

/obj/item/clothing/get_quick_interaction_handler(mob/user)
if(!(. = ..()))
for(var/obj/item/thing in accessories)
var/datum/extension/holster/holster = get_extension(thing, /datum/extension/holster)
if(holster?.holstered)
return GET_DECL(/decl/interaction_handler/unholster_accessory)
37 changes: 15 additions & 22 deletions code/game/objects/items/weapons/storage/belt.dm
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,11 @@
. = ..()
if(overlay_flags & BELT_OVERLAY_ITEMS)
var/list/cur_overlays
for(var/obj/item/I in contents)
if(I.use_single_icon)
LAZYADD(cur_overlays, I.get_on_belt_overlay())
for(var/obj/item/thing in contents)
if(thing.use_single_icon)
LAZYADD(cur_overlays, thing.get_on_belt_overlay())
else
LAZYADD(cur_overlays, overlay_image('icons/obj/clothing/obj_belt_overlays.dmi', I.icon_state))
LAZYADD(cur_overlays, overlay_image('icons/obj/clothing/obj_belt_overlays.dmi', thing.icon_state))

if(LAZYLEN(cur_overlays))
add_overlay(cur_overlays)
Expand All @@ -37,8 +37,8 @@
/obj/item/belt/get_mob_overlay(mob/user_mob, slot, bodypart, use_fallback_if_icon_missing = TRUE, skip_adjustment = FALSE)
var/image/ret = ..()
if(ret && slot == slot_belt_str && length(contents))
for(var/obj/item/I in contents)
var/image/new_overlay = I.get_mob_overlay(user_mob, slot, bodypart, use_fallback_if_icon_missing, TRUE)
for(var/obj/item/thing in contents)
var/image/new_overlay = thing.get_mob_overlay(user_mob, slot, bodypart, use_fallback_if_icon_missing, TRUE)
if(new_overlay)
ret.overlays += new_overlay
return ret
Expand All @@ -57,13 +57,6 @@
. = ..()
set_extension(src, /datum/extension/holster, storage, sound_in, sound_out, can_holster)

/obj/item/belt/holster/get_stored_inventory()
. = ..()
if(length(.))
var/datum/extension/holster/holster = get_extension(src, /datum/extension/holster)
if(holster.holstered)
. -= holster.holstered

/obj/item/belt/holster/attackby(obj/item/used_item, mob/user)
var/datum/extension/holster/holster = get_extension(src, /datum/extension/holster)
if(holster?.holster(used_item, user))
Expand All @@ -73,27 +66,27 @@
/obj/item/belt/holster/attack_hand(mob/user)
if(!user.check_dexterity(DEXTERITY_HOLD_ITEM, TRUE))
return ..()
var/datum/extension/holster/H = get_extension(src, /datum/extension/holster)
if(H.unholster(user))
var/datum/extension/holster/holster = get_extension(src, /datum/extension/holster)
if(holster?.unholster(user))
return TRUE
return ..()

/obj/item/belt/holster/examine(mob/user)
. = ..()
var/datum/extension/holster/H = get_extension(src, /datum/extension/holster)
H.examine_holster(user)
var/datum/extension/holster/holster = get_extension(src, /datum/extension/holster)
holster.examine_holster(user)

/obj/item/belt/holster/on_update_icon()
. = ..()
var/datum/extension/holster/H = get_extension(src, /datum/extension/holster)
var/datum/extension/holster/holster = get_extension(src, /datum/extension/holster)
if(overlay_flags)
var/list/cur_overlays
for(var/obj/item/I in contents)
if(I == H.holstered)
for(var/obj/item/thing in contents)
if(thing == holster.holstered)
if(overlay_flags & BELT_OVERLAY_HOLSTER)
LAZYADD(cur_overlays, overlay_image('icons/obj/clothing/obj_belt_overlays.dmi', I.icon_state))
LAZYADD(cur_overlays, overlay_image('icons/obj/clothing/obj_belt_overlays.dmi', thing.icon_state))
else if(overlay_flags & BELT_OVERLAY_ITEMS)
LAZYADD(cur_overlays, overlay_image('icons/obj/clothing/obj_belt_overlays.dmi', I.icon_state))
LAZYADD(cur_overlays, overlay_image('icons/obj/clothing/obj_belt_overlays.dmi', thing.icon_state))

if(LAZYLEN(cur_overlays))
add_overlay(cur_overlays)
Expand Down
2 changes: 1 addition & 1 deletion code/game/turfs/turf_fluids.dm
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@
create_reagents(FLUID_MAX_DEPTH)
return ..()

/turf/add_to_reagents(reagent_type, amount, data, safety = FALSE, defer_update = FALSE, phase)
/turf/add_to_reagents(reagent_type, amount, data, safety = FALSE, defer_update = FALSE, phase = null)
if(!reagents)
create_reagents(FLUID_MAX_DEPTH)
return ..()
Expand Down
8 changes: 4 additions & 4 deletions code/modules/clothing/_clothing.dm
Original file line number Diff line number Diff line change
Expand Up @@ -302,12 +302,12 @@
update_clothing_icon()

/obj/item/clothing/get_examine_name()
var/list/ensemble = list(name)
var/list/ensemble = list(..())
for(var/obj/item/clothing/accessory in accessories)
if(accessory.accessory_visibility == ACCESSORY_VISIBILITY_ENSEMBLE)
LAZYADD(ensemble, accessory.get_examine_name())
if(length(ensemble) <= 1)
return ..()
ensemble += accessory.get_examine_name()
if(length(ensemble) == 1) // don't worry about it being empty, we always have a minimum of one
return ensemble[1]
return english_list(ensemble, summarize = TRUE)

/obj/item/clothing/get_examine_line()
Expand Down
17 changes: 8 additions & 9 deletions code/modules/clothing/webbing/holster.dm
Original file line number Diff line number Diff line change
Expand Up @@ -12,25 +12,24 @@
. = ..()
set_extension(src, /datum/extension/holster, storage, sound_in, sound_out, can_holster)

/obj/item/clothing/webbing/holster/attackby(obj/item/W, mob/user)
var/datum/extension/holster/H = get_extension(src, /datum/extension/holster)
if(H.holster(W, user))
/obj/item/clothing/webbing/holster/attackby(obj/item/used_item, mob/user)
var/datum/extension/holster/holster = get_extension(src, /datum/extension/holster)
if(holster.holster(used_item, user))
return TRUE
else
. = ..(W, user)
return ..(used_item, user)

/obj/item/clothing/webbing/holster/attack_hand(mob/user)
if(!user.check_dexterity(DEXTERITY_HOLD_ITEM, TRUE))
return ..()
var/datum/extension/holster/H = get_extension(src, /datum/extension/holster)
if(H.unholster(user))
var/datum/extension/holster/holster = get_extension(src, /datum/extension/holster)
if(holster.unholster(user))
return TRUE
return ..()

/obj/item/clothing/webbing/holster/examine(mob/user)
. = ..(user)
var/datum/extension/holster/H = get_extension(src, /datum/extension/holster)
H.examine_holster(user)
var/datum/extension/holster/holster = get_extension(src, /datum/extension/holster)
holster.examine_holster(user)

/obj/item/clothing/webbing/holster/on_attached(var/obj/item/clothing/holder, var/mob/user)
. = ..()
Expand Down
2 changes: 1 addition & 1 deletion code/modules/mob/living/brain/brain.dm
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@
container.queue_icon_update()

/mob/living/brain/proc/get_container()
. = loc?.loc
return get_recursive_loc_of_type(/obj/item/organ/internal)

/mob/living/brain/Login()
. = ..()
Expand Down
6 changes: 6 additions & 0 deletions code/modules/mob/living/death.dm
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,9 @@
stop_aiming(no_message=1)
if(istype(ai))
ai.handle_death(gibbed)

var/decl/species/my_species = get_species()
if(my_species)
if(!gibbed && my_species.death_sound)
playsound(loc, my_species.death_sound, 80, 1, 1)
my_species.handle_death(src)
3 changes: 0 additions & 3 deletions code/modules/mob/living/human/death.dm
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,8 @@
if(!gibbed)
set_tail_animation_state(null, TRUE)
handle_organs()
if(species.death_sound)
playsound(loc, species.death_sound, 80, 1, 1)
if(SSticker.mode)
SSticker.mode.check_win()
species.handle_death(src)

/mob/living/human/physically_destroyed(var/skip_qdel, var/droplimb_type = DISMEMBER_METHOD_BLUNT)
for(var/obj/item/organ/external/limb in get_external_organs())
Expand Down
14 changes: 0 additions & 14 deletions code/modules/mob/living/human/human_defense.dm
Original file line number Diff line number Diff line change
Expand Up @@ -85,20 +85,6 @@ meteor_act
// Add inherent armor to the end of list so that protective equipment is checked first
. += ..()

/mob/living/human/proc/check_head_coverage()
for(var/slot in global.standard_headgear_slots)
var/obj/item/clothing/clothes = get_equipped_item(slot)
if(istype(clothes) && (clothes.body_parts_covered & SLOT_HEAD))
return TRUE
return FALSE

//Used to check if they can be fed food/drinks/pills
/mob/living/human/check_mouth_coverage()
for(var/slot in global.standard_headgear_slots)
var/obj/item/gear = get_equipped_item(slot)
if(istype(gear) && (gear.body_parts_covered & SLOT_FACE) && !(gear.item_flags & ITEM_FLAG_FLEXIBLEMATERIAL))
return gear

/mob/living/human/resolve_item_attack(obj/item/I, mob/living/user, var/target_zone)

for (var/obj/item/grab/grab as anything in grabbed_by)
Expand Down
40 changes: 26 additions & 14 deletions code/modules/mob/living/silicon/robot/robot.dm
Original file line number Diff line number Diff line change
Expand Up @@ -183,14 +183,7 @@
return 0

/mob/living/silicon/robot/Destroy()
if(central_processor)
central_processor.dropInto(loc)
var/mob/living/brainmob = central_processor.get_brainmob()
if(mind && brainmob)
mind.transfer_to(brainmob)
else
ghostize()
central_processor = null
QDEL_NULL(central_processor)
if(connected_ai)
connected_ai.connected_robots -= src
connected_ai = null
Expand Down Expand Up @@ -511,8 +504,8 @@
SPAN_NOTICE("\The [user] begins ripping \the [central_processor] out of \the [src]."),
SPAN_NOTICE("You jam the crowbar into the robot and begin levering out \the [central_processor]."))

if(do_after(user, 50, src))
dismantle(user)
if(do_after(user, 5 SECONDS, src))
dismantle_robot(user)
else
// Okay we're not removing the cell or a CPU, but maybe something else?
var/list/removable_components = list()
Expand Down Expand Up @@ -1033,10 +1026,29 @@
return 1
return ..()

/mob/living/silicon/robot/proc/dismantle(var/mob/user)
to_chat(user, SPAN_NOTICE("You damage some parts of the chassis, but eventually manage to rip out the central processor."))
var/obj/item/robot_parts/robot_suit/C = new dismantle_type(loc)
C.dismantled_from(src)
/mob/living/silicon/robot/gib(do_gibs)
SHOULD_CALL_PARENT(FALSE)
var/lastloc = loc
dismantle_robot()
if(lastloc && do_gibs)
spawn_gibber(lastloc)

/mob/living/silicon/robot/proc/dismantle_robot(var/mob/user)

if(central_processor)
if(user)
to_chat(user, SPAN_NOTICE("You damage some parts of the chassis, but eventually manage to rip out \the [central_processor]."))
central_processor.dropInto(loc)
var/mob/living/brainmob = central_processor.get_brainmob(create_if_missing = TRUE)
if(mind && brainmob)
mind.transfer_to(brainmob)
else
ghostize()
central_processor.update_icon()
central_processor = null

var/obj/item/robot_parts/robot_suit/chassis = new dismantle_type(loc)
chassis.dismantled_from(src)
qdel(src)

/mob/living/silicon/robot/try_stock_parts_install(obj/item/stock_parts/W, mob/user)
Expand Down
11 changes: 5 additions & 6 deletions code/modules/mob/mob.dm
Original file line number Diff line number Diff line change
Expand Up @@ -1387,12 +1387,11 @@

/// THIS DOES NOT RELATE TO HELD ITEM SLOTS. It is very specifically a functional BP_L_HAND or BP_R_HAND organ, not necessarily a gripper.
/mob/proc/get_usable_hand_slot_organ()
var/obj/item/organ/external/paw = GET_EXTERNAL_ORGAN(src, BP_L_HAND)
if(!istype(paw) && !paw.is_usable())
paw = GET_EXTERNAL_ORGAN(src, BP_R_HAND)
if(istype(paw) && paw.is_usable())
return paw

var/static/list/hand_slots = list(BP_L_HAND, BP_R_HAND)
for(var/slot in shuffle(hand_slots))
var/obj/item/organ/external/hand = GET_EXTERNAL_ORGAN(src, slot)
if(istype(hand) && hand.is_usable())
return hand
// Called when using the shredding behavior.
/mob/proc/can_shred(var/mob/living/human/H, var/ignore_intent, var/ignore_antag)
if((!ignore_intent && !check_intent(I_FLAG_HARM)) || pulling_punches)
Expand Down
13 changes: 11 additions & 2 deletions code/modules/mob/mob_eating.dm
Original file line number Diff line number Diff line change
@@ -1,6 +1,15 @@
// mobs do not have blocked mouths by default
// overridden in human_defense.dm
//Used to check if they can be fed food/drinks/pills
/mob/proc/check_mouth_coverage()
return get_covering_head_item(SLOT_FACE)

/mob/proc/check_head_coverage()
return !!get_covering_head_item(SLOT_HEAD)

/mob/proc/get_covering_head_item(slot_flags)
for(var/slot in global.standard_headgear_slots)
var/obj/item/clothes = get_equipped_item(slot)
if(istype(clothes) && (clothes.body_parts_covered & slot_flags) && !(clothes.item_flags & ITEM_FLAG_FLEXIBLEMATERIAL))
return clothes
return null

/mob/proc/get_eaten_transfer_amount(var/default)
Expand Down
4 changes: 2 additions & 2 deletions code/modules/reagents/Chemistry-Holder.dm
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
var/global/obj/temp_reagents_holder = new
var/global/datum/reagents/sink/infinite_reagent_sink = new

/atom/proc/add_to_reagents(reagent_type, amount, data, safety = FALSE, defer_update = FALSE)
return reagents?.add_reagent(reagent_type, amount, data, safety, defer_update)
/atom/proc/add_to_reagents(reagent_type, amount, data, safety = FALSE, defer_update = FALSE, phase = null)
return reagents?.add_reagent(reagent_type, amount, data, safety, defer_update, phase)

/atom/proc/remove_from_reagents(reagent_type, amount, safety = FALSE, defer_update = FALSE)
return reagents?.remove_reagent(reagent_type, amount, safety, defer_update)
Expand Down
Loading

0 comments on commit 52b0efc

Please sign in to comment.