mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-02-02 04:10:42 +00:00
As in, scooped mob holders, like Teshari. If they throw an item, it falls out now rather than being trapped and eventually deleted in their holder object.
172 lines
4.7 KiB
Plaintext
172 lines
4.7 KiB
Plaintext
var/list/holder_mob_icon_cache = list()
|
|
|
|
//Helper object for picking dionaea (and other creatures) up.
|
|
/obj/item/weapon/holder
|
|
name = "holder"
|
|
desc = "You shouldn't ever see this."
|
|
icon = 'icons/obj/objects.dmi'
|
|
slot_flags = SLOT_HEAD | SLOT_HOLSTER
|
|
show_messages = 1
|
|
|
|
sprite_sheets = list(
|
|
"Teshari" = 'icons/mob/species/seromi/head.dmi'
|
|
)
|
|
|
|
origin_tech = null
|
|
item_icons = list(
|
|
slot_l_hand_str = 'icons/mob/items/lefthand_holder.dmi',
|
|
slot_r_hand_str = 'icons/mob/items/righthand_holder.dmi',
|
|
)
|
|
pixel_y = 8
|
|
var/mob/living/held_mob
|
|
|
|
/obj/item/weapon/holder/New()
|
|
..()
|
|
processing_objects.Add(src)
|
|
|
|
/obj/item/weapon/holder/Destroy()
|
|
processing_objects.Remove(src)
|
|
..()
|
|
|
|
/obj/item/weapon/holder/process()
|
|
update_state()
|
|
drop_items()
|
|
|
|
/obj/item/weapon/holder/dropped()
|
|
..()
|
|
spawn(1)
|
|
update_state()
|
|
|
|
/obj/item/weapon/holder/proc/update_state()
|
|
if(istype(loc,/turf) || !(contents.len))
|
|
held_mob = null
|
|
drop_items()
|
|
qdel(src)
|
|
|
|
/obj/item/weapon/holder/proc/drop_items()
|
|
if(contents.len > 1)
|
|
for(var/atom/movable/M in contents)
|
|
if(M == held_mob)
|
|
continue
|
|
M.forceMove(get_turf(src))
|
|
|
|
/obj/item/weapon/holder/GetID()
|
|
for(var/mob/M in contents)
|
|
var/obj/item/I = M.GetIdCard()
|
|
if(I)
|
|
return I
|
|
return null
|
|
|
|
/obj/item/weapon/holder/GetAccess()
|
|
var/obj/item/I = GetID()
|
|
return I ? I.GetAccess() : ..()
|
|
|
|
/obj/item/weapon/holder/proc/sync(var/mob/living/M)
|
|
dir = 2
|
|
overlays.Cut()
|
|
icon = M.icon
|
|
icon_state = M.icon_state
|
|
item_state = M.item_state
|
|
color = M.color
|
|
name = M.name
|
|
desc = M.desc
|
|
overlays |= M.overlays
|
|
var/mob/living/carbon/human/H = loc
|
|
if(istype(H))
|
|
if(H.l_hand == src)
|
|
H.update_inv_l_hand()
|
|
else if(H.r_hand == src)
|
|
H.update_inv_r_hand()
|
|
else
|
|
H.regenerate_icons()
|
|
|
|
//Mob specific holders.
|
|
/obj/item/weapon/holder/diona
|
|
origin_tech = list(TECH_MAGNET = 3, TECH_BIO = 5)
|
|
slot_flags = SLOT_HEAD | SLOT_OCLOTHING | SLOT_HOLSTER
|
|
|
|
/obj/item/weapon/holder/drone
|
|
origin_tech = list(TECH_MAGNET = 3, TECH_ENGINEERING = 5)
|
|
|
|
/obj/item/weapon/holder/mouse
|
|
w_class = 1
|
|
|
|
/obj/item/weapon/holder/borer
|
|
origin_tech = list(TECH_BIO = 6)
|
|
|
|
/obj/item/weapon/holder/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
|
for(var/mob/M in src.contents)
|
|
M.attackby(W,user)
|
|
|
|
//Mob procs and vars for scooping up
|
|
/mob/living/var/holder_type
|
|
|
|
/mob/living/MouseDrop(var/atom/over_object)
|
|
var/mob/living/carbon/human/H = over_object
|
|
if(holder_type && istype(H) && !H.lying && Adjacent(H) && (src.a_intent == I_HELP && H.a_intent == I_HELP))
|
|
if(!issmall(H) || !istype(src, /mob/living/carbon/human))
|
|
get_scooped(H, (usr == src))
|
|
return
|
|
return ..()
|
|
|
|
/mob/living/proc/get_scooped(var/mob/living/carbon/grabber, var/self_grab)
|
|
|
|
if(!holder_type || buckled || pinned.len)
|
|
return
|
|
|
|
var/obj/item/weapon/holder/H = new holder_type(get_turf(src))
|
|
H.held_mob = src
|
|
src.forceMove(H)
|
|
grabber.put_in_hands(H)
|
|
|
|
if(self_grab)
|
|
grabber << "<span class='notice'>\The [src] clambers onto you!</span>"
|
|
src << "<span class='notice'>You climb up onto \the [grabber]!</span>"
|
|
grabber.equip_to_slot_if_possible(H, slot_back, 0, 1)
|
|
else
|
|
grabber << "<span class='notice'>You scoop up \the [src]!</span>"
|
|
src << "<span class='notice'>\The [grabber] scoops you up!</span>"
|
|
|
|
grabber.status_flags |= PASSEMOTES
|
|
H.sync(src)
|
|
return H
|
|
|
|
/obj/item/weapon/holder/human
|
|
icon = 'icons/mob/holder_complex.dmi'
|
|
var/list/generate_for_slots = list(slot_l_hand_str, slot_r_hand_str, slot_back_str)
|
|
slot_flags = SLOT_BACK
|
|
|
|
/obj/item/weapon/holder/human/sync(var/mob/living/M)
|
|
|
|
// Generate appropriate on-mob icons.
|
|
var/mob/living/carbon/human/owner = M
|
|
if(istype(owner) && owner.species)
|
|
|
|
var/skin_colour = rgb(owner.r_skin, owner.g_skin, owner.b_skin)
|
|
var/hair_colour = rgb(owner.r_hair, owner.g_hair, owner.b_hair)
|
|
var/eye_colour = rgb(owner.r_eyes, owner.g_eyes, owner.b_eyes)
|
|
var/species_name = lowertext(owner.species.get_bodytype(owner))
|
|
|
|
for(var/cache_entry in generate_for_slots)
|
|
var/cache_key = "[owner.species]-[cache_entry]-[skin_colour]-[hair_colour]"
|
|
if(!holder_mob_icon_cache[cache_key])
|
|
|
|
// Generate individual icons.
|
|
var/icon/mob_icon = icon(icon, "[species_name]_holder_[cache_entry]_base")
|
|
mob_icon.Blend(skin_colour, ICON_ADD)
|
|
var/icon/hair_icon = icon(icon, "[species_name]_holder_[cache_entry]_hair")
|
|
hair_icon.Blend(hair_colour, ICON_ADD)
|
|
var/icon/eyes_icon = icon(icon, "[species_name]_holder_[cache_entry]_eyes")
|
|
eyes_icon.Blend(eye_colour, ICON_ADD)
|
|
|
|
// Blend them together.
|
|
mob_icon.Blend(eyes_icon, ICON_OVERLAY)
|
|
mob_icon.Blend(hair_icon, ICON_OVERLAY)
|
|
|
|
// Add to the cache.
|
|
holder_mob_icon_cache[cache_key] = mob_icon
|
|
item_icons[cache_entry] = holder_mob_icon_cache[cache_key]
|
|
|
|
// Handle the rest of sync().
|
|
..(M)
|