mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-10 10:12:45 +00:00
398 lines
11 KiB
Plaintext
398 lines
11 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'
|
|
randpixel = 0
|
|
center_of_mass = null
|
|
slot_flags = SLOT_HEAD | SLOT_HOLSTER
|
|
show_messages = 1
|
|
|
|
sprite_sheets = list(
|
|
SPECIES_TESHARI = 'icons/inventory/head/mob_teshari.dmi',
|
|
SPECIES_VOX = 'icons/inventory/head/mob_vox.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
|
|
var/matrix/original_transform
|
|
var/original_vis_flags = NONE
|
|
|
|
/obj/item/weapon/holder/Initialize(mapload, mob/held)
|
|
ASSERT(ismob(held))
|
|
. = ..()
|
|
held.forceMove(src)
|
|
held.reset_view(src)
|
|
START_PROCESSING(SSobj, src)
|
|
|
|
//CHOMPEdit Start - Add status so that you can see where you are...
|
|
/mob/living/Stat()
|
|
. = ..()
|
|
if(. && istype(loc, /obj/item/weapon/holder))
|
|
var/location = ""
|
|
var/obj/item/weapon/holder/H = loc
|
|
if(ishuman(H.loc))
|
|
var/mob/living/carbon/human/HH = H.loc
|
|
if(HH.l_hand == H)
|
|
location = "[HH]'s left hand"
|
|
else if(HH.r_hand == H)
|
|
location = "[HH]'s right hand"
|
|
else if(HH.r_store == H || HH.l_store == H)
|
|
location = "[HH]'s pocket"
|
|
else if(HH.head == H)
|
|
location = "[HH]'s head"
|
|
else if(HH.shoes == H)
|
|
location = "[HH]'s feet"
|
|
else
|
|
location = "[HH]"
|
|
else if(ismob(H.loc))
|
|
var/mob/living/M = H.loc
|
|
if(M.l_hand == H)
|
|
location = "[M]'s left hand"
|
|
else if(M.r_hand == H)
|
|
location = "[M]'s right hand"
|
|
else
|
|
location = "[M]"
|
|
else if(ismob(H.loc.loc))
|
|
location = "[H.loc.loc]'s [H.loc]"
|
|
else
|
|
location = "[H.loc]"
|
|
if (location != "" && statpanel("Status"))
|
|
stat("Location", location)
|
|
//CHOMPEdit End
|
|
|
|
/obj/item/weapon/holder/Entered(mob/held, atom/OldLoc)
|
|
if(held_mob)
|
|
held.forceMove(get_turf(src))
|
|
held.reset_view(null)
|
|
return
|
|
ASSERT(ismob(held))
|
|
. = ..()
|
|
held_mob = held
|
|
original_vis_flags = held.vis_flags
|
|
held.vis_flags = VIS_INHERIT_ID|VIS_INHERIT_LAYER|VIS_INHERIT_PLANE
|
|
vis_contents += held
|
|
name = held.name
|
|
original_transform = held.transform
|
|
held.transform = null
|
|
|
|
/obj/item/weapon/holder/Exited(atom/movable/thing, atom/OldLoc)
|
|
if(thing == held_mob)
|
|
held_mob.transform = original_transform
|
|
held_mob.update_transform() //VOREStation edit
|
|
held_mob.vis_flags = original_vis_flags
|
|
held_mob = null
|
|
..()
|
|
|
|
/obj/item/weapon/holder/Destroy()
|
|
STOP_PROCESSING(SSobj, src)
|
|
if(held_mob)
|
|
dump_mob()
|
|
if(ismob(loc))
|
|
var/mob/M = loc
|
|
M.drop_from_inventory(src, get_turf(src))
|
|
return ..()
|
|
|
|
/obj/item/weapon/holder/process()
|
|
if(held_mob?.loc != src || isturf(loc))
|
|
qdel(src)
|
|
|
|
/obj/item/weapon/holder/proc/dump_mob()
|
|
if(!held_mob)
|
|
return
|
|
if (held_mob.loc == src || isnull(held_mob.loc)) //VOREStation edit
|
|
held_mob.transform = original_transform
|
|
held_mob.update_transform() //VOREStation edit
|
|
held_mob.vis_flags = original_vis_flags
|
|
held_mob.forceMove(get_turf(src))
|
|
held_mob.reset_view(null)
|
|
held_mob = null
|
|
invisibility = INVISIBILITY_ABSTRACT //VOREStation edit
|
|
|
|
/obj/item/weapon/holder/throw_at(atom/target, range, speed, thrower)
|
|
if(held_mob)
|
|
var/mob/localref = held_mob
|
|
dump_mob()
|
|
var/thrower_mob_size = 1
|
|
if(ismob(thrower))
|
|
var/mob/M = thrower
|
|
thrower_mob_size = M.mob_size
|
|
var/mob_range = round(range * min(thrower_mob_size / localref.mob_size, 1))
|
|
localref.throw_at(target, mob_range, speed, thrower)
|
|
|
|
/obj/item/weapon/holder/GetID()
|
|
return held_mob?.GetIdCard()
|
|
|
|
/obj/item/weapon/holder/GetAccess()
|
|
var/obj/item/I = GetID()
|
|
return I?.GetAccess() || ..()
|
|
|
|
/obj/item/weapon/holder/container_resist(mob/living/held)
|
|
if(ismob(loc))
|
|
var/mob/M = loc
|
|
M.drop_from_inventory(src) // If it's another item, we can just continue existing, or if it's a turf we'll qdel() in Moved()
|
|
to_chat(M, "<span class='warning'>\The [held] wriggles out of your grip!</span>")
|
|
to_chat(held, "<span class='warning'>You wiggle out of [M]'s grip!</span>")
|
|
else if(istype(loc, /obj/item/clothing/accessory/holster))
|
|
var/obj/item/clothing/accessory/holster/holster = loc
|
|
if(holster.holstered == src)
|
|
holster.clear_holster()
|
|
to_chat(held, "<span class='warning'>You extricate yourself from [holster].</span>")
|
|
forceMove(get_turf(src))
|
|
held.reset_view(null)
|
|
else if(isitem(loc))
|
|
var/obj/item/I = loc
|
|
to_chat(held, "<span class='warning'>You struggle free of [loc].</span>")
|
|
forceMove(get_turf(src))
|
|
held.reset_view(null)
|
|
if(istype(I))
|
|
I.on_holder_escape(src)
|
|
|
|
//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
|
|
item_state = "diona"
|
|
|
|
/obj/item/weapon/holder/drone
|
|
origin_tech = list(TECH_MAGNET = 3, TECH_ENGINEERING = 5)
|
|
item_state = "repairbot"
|
|
|
|
/obj/item/weapon/holder/drone/swarm
|
|
origin_tech = list(TECH_MAGNET = 6, TECH_ENGINEERING = 7, TECH_PRECURSOR = 2, TECH_ARCANE = 1)
|
|
item_state = "constructiondrone"
|
|
|
|
/obj/item/weapon/holder/pai
|
|
origin_tech = list(TECH_DATA = 2)
|
|
|
|
/obj/item/weapon/holder/pai/Initialize(mapload, mob/held)
|
|
. = ..()
|
|
item_state = held.icon_state
|
|
|
|
/obj/item/weapon/holder/mouse
|
|
name = "mouse"
|
|
desc = "It's a small rodent."
|
|
item_state = "mouse_gray"
|
|
slot_flags = SLOT_EARS | SLOT_HEAD | SLOT_ID
|
|
origin_tech = list(TECH_BIO = 2)
|
|
w_class = ITEMSIZE_TINY
|
|
|
|
/obj/item/weapon/holder/mouse/white
|
|
item_state = "mouse_white"
|
|
|
|
/obj/item/weapon/holder/mouse/gray
|
|
item_state = "mouse_gray"
|
|
|
|
/obj/item/weapon/holder/mouse/brown
|
|
item_state = "mouse_brown"
|
|
|
|
/obj/item/weapon/holder/mouse/black
|
|
item_state = "mouse_black"
|
|
|
|
/obj/item/weapon/holder/mouse/operative
|
|
item_state = "mouse_operative"
|
|
|
|
/obj/item/weapon/holder/mouse/rat
|
|
item_state = "mouse_rat"
|
|
|
|
/obj/item/weapon/holder/possum
|
|
origin_tech = list(TECH_BIO = 2)
|
|
item_state = "possum"
|
|
|
|
/obj/item/weapon/holder/possum/poppy
|
|
origin_tech = list(TECH_BIO = 2, TECH_ENGINEERING = 4)
|
|
item_state = "poppy"
|
|
|
|
/obj/item/weapon/holder/cat
|
|
origin_tech = list(TECH_BIO = 2)
|
|
item_state = "cat"
|
|
|
|
/obj/item/weapon/holder/cat/runtime
|
|
|
|
/obj/item/weapon/holder/fennec
|
|
origin_tech = list(TECH_BIO = 2)
|
|
|
|
/obj/item/weapon/holder/cat/runtime
|
|
|
|
origin_tech = list(TECH_BIO = 2, TECH_DATA = 4)
|
|
|
|
/obj/item/weapon/holder/cat/cak
|
|
origin_tech = list(TECH_BIO = 2)
|
|
item_state = "cak"
|
|
|
|
/obj/item/weapon/holder/cat/bluespace
|
|
origin_tech = list(TECH_BIO = 2, TECH_BLUESPACE = 6)
|
|
item_state = "bscat"
|
|
|
|
/obj/item/weapon/holder/cat/spacecat
|
|
origin_tech = list(TECH_BIO = 2, TECH_MATERIAL = 4)
|
|
item_state = "spacecat"
|
|
|
|
/obj/item/weapon/holder/cat/original
|
|
origin_tech = list(TECH_BIO = 2, TECH_BLUESPACE = 4)
|
|
item_state = "original"
|
|
|
|
/obj/item/weapon/holder/cat/breadcat
|
|
origin_tech = list(TECH_BIO = 2)
|
|
item_state = "breadcat"
|
|
|
|
/obj/item/weapon/holder/corgi
|
|
origin_tech = list(TECH_BIO = 2)
|
|
item_state = "corgi"
|
|
|
|
/obj/item/weapon/holder/lisa
|
|
origin_tech = list(TECH_BIO = 2)
|
|
item_state = "lisa"
|
|
|
|
/obj/item/weapon/holder/old_corgi
|
|
origin_tech = list(TECH_BIO = 2)
|
|
item_state = "old_corgi"
|
|
|
|
/obj/item/weapon/holder/void_puppy
|
|
origin_tech = list(TECH_BIO = 2, TECH_BLUESPACE = 3)
|
|
item_state = "void_puppy"
|
|
|
|
/obj/item/weapon/holder/narsian
|
|
origin_tech = list(TECH_BIO = 2, TECH_ILLEGAL = 3)
|
|
item_state = "narsian"
|
|
|
|
/obj/item/weapon/holder/bullterrier
|
|
origin_tech = list(TECH_BIO = 2)
|
|
item_state = "bullterrier"
|
|
|
|
/obj/item/weapon/holder/fox
|
|
origin_tech = list(TECH_BIO = 2)
|
|
item_state = "fox"
|
|
|
|
/obj/item/weapon/holder/pug
|
|
origin_tech = list(TECH_BIO = 2)
|
|
item_state = "pug"
|
|
|
|
/obj/item/weapon/holder/sloth
|
|
origin_tech = list(TECH_BIO = 2)
|
|
item_state = "sloth"
|
|
|
|
/obj/item/weapon/holder/borer
|
|
origin_tech = list(TECH_BIO = 6)
|
|
item_state = "brainslug"
|
|
|
|
/obj/item/weapon/holder/leech
|
|
color = "#003366"
|
|
origin_tech = list(TECH_BIO = 5, TECH_PHORON = 2)
|
|
|
|
/obj/item/weapon/holder/cat/fluff/tabiranth
|
|
name = "Spirit"
|
|
desc = "A small, inquisitive feline, who constantly seems to investigate his surroundings."
|
|
gender = MALE
|
|
icon_state = "kitten"
|
|
w_class = ITEMSIZE_SMALL
|
|
|
|
/obj/item/weapon/holder/cat/kitten
|
|
icon_state = "kitten"
|
|
w_class = ITEMSIZE_SMALL
|
|
|
|
/obj/item/weapon/holder/cat/fluff/bones
|
|
name = "Bones"
|
|
desc = "It's Bones! Meow."
|
|
gender = MALE
|
|
icon_state = "cat3"
|
|
|
|
/obj/item/weapon/holder/bird
|
|
name = "bird"
|
|
desc = "It's a bird!"
|
|
icon_state = null
|
|
item_icons = null
|
|
w_class = ITEMSIZE_SMALL
|
|
|
|
/obj/item/weapon/holder/bird/Initialize()
|
|
. = ..()
|
|
held_mob?.lay_down()
|
|
|
|
/obj/item/weapon/holder/fish
|
|
attack_verb = list("fished", "disrespected", "smacked", "smackereled")
|
|
hitsound = 'sound/effects/slime_squish.ogg'
|
|
slot_flags = SLOT_HOLSTER
|
|
origin_tech = list(TECH_BIO = 3)
|
|
|
|
/obj/item/weapon/holder/fish/afterattack(var/atom/target, var/mob/living/user, proximity)
|
|
if(!target)
|
|
return
|
|
if(!proximity)
|
|
return
|
|
if(isliving(target))
|
|
var/mob/living/L = target
|
|
if(prob(10))
|
|
L.Stun(2)
|
|
|
|
/obj/item/weapon/holder/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
|
//CHOMPADDITION: MicroHandCrush
|
|
if(W == src && user.a_intent == I_HURT)
|
|
for(var/mob/living/M in src.contents)
|
|
if(user.size_multiplier > M.size_multiplier)
|
|
var/dam = (user.size_multiplier - M.size_multiplier)*(rand(2,5))
|
|
to_chat(user, "<span class='danger'>You roughly squeeze [M]!</span>")
|
|
to_chat(M, "<span class='danger'>You are roughly squeezed by [user]!</span>")
|
|
log_and_message_admins("[key_name(M)] has been harmsqueezed by [key_name(user)]")
|
|
M.apply_damage(dam)
|
|
//CHOMPADDITION: MicroHandCrush END
|
|
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 && issmall(src) && istype(H) && !H.lying && Adjacent(H) && (src.a_intent == I_HELP && H.a_intent == I_HELP)) //VOREStation Edit
|
|
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
|
|
|
|
if(self_grab)
|
|
if(src.incapacitated()) return
|
|
else
|
|
if(grabber.incapacitated()) return
|
|
|
|
//YW edit - size diff check
|
|
var/sizediff = grabber.size_multiplier - size_multiplier
|
|
if(sizediff < -0.5)
|
|
if(self_grab)
|
|
to_chat(src, "<span class='warning'>You are too big to fit in \the [grabber]\'s hands!</span>")
|
|
else
|
|
to_chat(grabber, "<span class='warning'>\The [src] is too big to fit in your hands!</span>")
|
|
return
|
|
//end YW edit
|
|
|
|
var/obj/item/weapon/holder/H = new holder_type(get_turf(src), src)
|
|
H.sync(src) //CHOMPEdit - See modular_chomp/code/modules/mob/holder.dm for what this does
|
|
grabber.put_in_hands(H)
|
|
|
|
if(self_grab)
|
|
to_chat(grabber, "<span class='notice'>\The [src] clambers onto you!</span>")
|
|
to_chat(src, "<span class='notice'>You climb up onto \the [grabber]!</span>")
|
|
grabber.equip_to_slot_if_possible(H, slot_back, 0, 1)
|
|
else
|
|
to_chat(grabber, "<span class='notice'>You scoop up \the [src]!</span>")
|
|
to_chat(src, "<span class='notice'>\The [grabber] scoops you up!</span>")
|
|
|
|
add_attack_logs(grabber, H.held_mob, "Scooped up", FALSE) // Not important enough to notify admins, but still helpful.
|
|
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
|