mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-27 15:17:01 +01:00
[READY]Adds picking up corgis and pAIs! (#33442)
Some pAI holochassis types can now be picked up by dragging them to yourself, and can be worn on the head! Refactors how drone pickups work so it works for all mobs. Same for corgis. 🆑 add: you can now pick up corgi's and pAIs, how disgustingly cute /🆑
This commit is contained in:
@@ -0,0 +1,84 @@
|
||||
//Generic system for picking up mobs.
|
||||
//Currently works for head and hands.
|
||||
/obj/item/clothing/head/mob_holder
|
||||
name = "bugged mob"
|
||||
desc = "Yell at coderbrush."
|
||||
icon = null
|
||||
icon_state = ""
|
||||
flags_1 = DROPDEL_1
|
||||
var/mob/living/held_mob
|
||||
var/can_head = TRUE
|
||||
var/destroying = FALSE
|
||||
|
||||
/obj/item/clothing/head/mob_holder/Initialize(mapload, mob/living/M, _worn_state, head_icon, lh_icon, rh_icon, _can_head = TRUE)
|
||||
. = ..()
|
||||
can_head = _can_head
|
||||
if(head_icon)
|
||||
alternate_worn_icon = head_icon
|
||||
if(_worn_state)
|
||||
item_state = _worn_state
|
||||
if(lh_icon)
|
||||
lefthand_file = lh_icon
|
||||
if(rh_icon)
|
||||
righthand_file = rh_icon
|
||||
if(!can_head)
|
||||
slot_flags = NONE
|
||||
deposit(M)
|
||||
|
||||
/obj/item/clothing/head/mob_holder/Destroy()
|
||||
destroying = TRUE
|
||||
if(held_mob)
|
||||
release(FALSE)
|
||||
return ..()
|
||||
|
||||
/obj/item/clothing/head/mob_holder/proc/deposit(mob/living/L)
|
||||
if(!istype(L))
|
||||
return FALSE
|
||||
L.setDir(SOUTH)
|
||||
update_visuals(L)
|
||||
held_mob = L
|
||||
L.forceMove(src)
|
||||
name = L.name
|
||||
desc = L.desc
|
||||
return TRUE
|
||||
|
||||
/obj/item/clothing/head/mob_holder/proc/update_visuals(mob/living/L)
|
||||
appearance = L.appearance
|
||||
|
||||
/obj/item/clothing/head/mob_holder/proc/release(del_on_release = TRUE)
|
||||
if(!held_mob)
|
||||
if(del_on_release && !destroying)
|
||||
qdel(src)
|
||||
return FALSE
|
||||
if(isliving(loc))
|
||||
var/mob/living/L = loc
|
||||
to_chat(L, "<span class='warning'>[held_mob] wriggles free!</span>")
|
||||
L.dropItemToGround(src)
|
||||
held_mob.forceMove(get_turf(src))
|
||||
held_mob.reset_perspective()
|
||||
held_mob.setDir(SOUTH)
|
||||
held_mob.visible_message("<span class='warning'>[held_mob] uncurls!</span>")
|
||||
held_mob = null
|
||||
if(del_on_release && !destroying)
|
||||
qdel(src)
|
||||
return TRUE
|
||||
|
||||
/obj/item/clothing/head/mob_holder/relaymove()
|
||||
release()
|
||||
|
||||
/obj/item/clothing/head/mob_holder/container_resist()
|
||||
release()
|
||||
|
||||
/obj/item/clothing/head/mob_holder/drone/deposit(mob/living/L)
|
||||
. = ..()
|
||||
if(!isdrone(L))
|
||||
qdel(src)
|
||||
name = "drone (hiding)"
|
||||
desc = "This drone is scared and has curled up into a ball!"
|
||||
|
||||
/obj/item/clothing/head/mob_holder/drone/update_visuals(mob/living/L)
|
||||
var/mob/living/simple_animal/drone/D = L
|
||||
if(!D)
|
||||
return ..()
|
||||
icon = 'icons/mob/drone.dmi'
|
||||
icon_state = "[D.visualAppearence]_hat"
|
||||
@@ -1057,4 +1057,32 @@
|
||||
|
||||
/mob/living/onTransitZ(old_z,new_z)
|
||||
..()
|
||||
update_z(new_z)
|
||||
update_z(new_z)
|
||||
|
||||
/mob/living/MouseDrop(mob/over)
|
||||
. = ..()
|
||||
var/mob/living/user = usr
|
||||
if(!istype(over) || !istype(user))
|
||||
return
|
||||
if(!over.Adjacent(src) || (user != src) || !canUseTopic(over))
|
||||
return
|
||||
if(can_be_held)
|
||||
mob_try_pickup(over)
|
||||
|
||||
/mob/living/proc/mob_pickup(mob/living/L)
|
||||
return
|
||||
|
||||
/mob/living/proc/mob_try_pickup(mob/living/user)
|
||||
if(!ishuman(user))
|
||||
return
|
||||
if(user.get_active_held_item())
|
||||
to_chat(user, "<span class='warning'>Your hands are full!</span>")
|
||||
return FALSE
|
||||
if(buckled)
|
||||
to_chat(user, "<span class='warning'>[src] is buckled to something!</span>")
|
||||
return FALSE
|
||||
user.visible_message("<span class='notice'>[user] starts trying to scoop up [src]!</span>")
|
||||
if(!do_after(user, 20, target = src))
|
||||
return FALSE
|
||||
mob_pickup(user)
|
||||
return TRUE
|
||||
|
||||
@@ -81,4 +81,5 @@
|
||||
|
||||
var/list/obj/effect/proc_holder/abilities = list()
|
||||
|
||||
var/registered_z
|
||||
var/registered_z
|
||||
var/can_be_held = FALSE //whether this can be picked up and held.
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
health = 500
|
||||
maxHealth = 500
|
||||
layer = BELOW_MOB_LAYER
|
||||
can_be_held = TRUE
|
||||
|
||||
var/network = "SS13"
|
||||
var/obj/machinery/camera/current = null
|
||||
@@ -57,7 +58,10 @@
|
||||
var/canholo = TRUE
|
||||
var/obj/item/card/id/access_card = null
|
||||
var/chassis = "repairbot"
|
||||
var/list/possible_chassis = list("cat", "mouse", "monkey", "corgi", "fox", "repairbot", "rabbit")
|
||||
var/list/possible_chassis = list("cat" = TRUE, "mouse" = TRUE, "monkey" = TRUE, "corgi" = FALSE, "fox" = FALSE, "repairbot" = TRUE, "rabbit" = TRUE) //assoc value is whether it can be picked up.
|
||||
var/static/item_head_icon = 'icons/mob/pai_item_head.dmi'
|
||||
var/static/item_lh_icon = 'icons/mob/pai_item_lh.dmi'
|
||||
var/static/item_rh_icon = 'icons/mob/pai_item_rh.dmi'
|
||||
|
||||
var/emitterhealth = 20
|
||||
var/emittermaxhealth = 20
|
||||
|
||||
@@ -68,9 +68,12 @@
|
||||
lay_down()
|
||||
|
||||
/mob/living/silicon/pai/proc/choose_chassis()
|
||||
if(!isturf(loc) && loc != card)
|
||||
to_chat(src, "<span class='boldwarning'>You can not change your holochassis composite while not on the ground or in your card!</span>")
|
||||
return FALSE
|
||||
var/choice = input(src, "What would you like to use for your holochassis composite?") as null|anything in possible_chassis
|
||||
if(!choice)
|
||||
return 0
|
||||
return FALSE
|
||||
chassis = choice
|
||||
icon_state = "[chassis]"
|
||||
if(resting)
|
||||
@@ -103,3 +106,16 @@
|
||||
/mob/living/silicon/pai/movement_delay()
|
||||
. = ..()
|
||||
. += 1 //A bit slower than humans, so they're easier to smash
|
||||
|
||||
/mob/living/silicon/pai/mob_pickup(mob/living/L)
|
||||
var/obj/item/clothing/head/mob_holder/holder = new(get_turf(src), src, chassis, item_head_icon, item_lh_icon, item_rh_icon)
|
||||
if(!L.put_in_hands(holder))
|
||||
qdel(holder)
|
||||
else
|
||||
L.visible_message("<span class='warning'>[L] scoops up [src]!</span>")
|
||||
|
||||
/mob/living/silicon/pai/mob_try_pickup(mob/living/user)
|
||||
if(!possible_chassis[chassis])
|
||||
to_chat(user, "<span class='wraning'>[src]'s current form isn't able to be carried!</span>")
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
var/obj/item/inventory_back
|
||||
var/nofur = 0 //Corgis that have risen past the material plane of existence.
|
||||
gold_core_spawnable = FRIENDLY_SPAWN
|
||||
can_be_held = TRUE
|
||||
|
||||
/mob/living/simple_animal/pet/dog/pug
|
||||
name = "\improper pug"
|
||||
@@ -119,7 +120,12 @@
|
||||
..()
|
||||
update_corgi_fluff()
|
||||
|
||||
|
||||
/mob/living/simple_animal/pet/dog/corgi/mob_pickup(mob/living/L)
|
||||
var/obj/item/clothing/head/mob_holder/holder = new(get_turf(src), src, "corgi", null, 'icons/mob/pets_held_lh.dmi', 'icons/mob/pets_held_rh.dmi', FALSE)
|
||||
if(!L.put_in_hands(holder))
|
||||
qdel(holder)
|
||||
else
|
||||
L.visible_message("<span class='warning'>[L] scoops up [src]!</span>")
|
||||
|
||||
/mob/living/simple_animal/pet/dog/corgi/Topic(href, href_list)
|
||||
if(usr.stat)
|
||||
|
||||
@@ -49,6 +49,7 @@
|
||||
dextrous = TRUE
|
||||
dextrous_hud_type = /datum/hud/dextrous/drone
|
||||
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
|
||||
can_be_held = TRUE
|
||||
var/staticChoice = "static"
|
||||
var/list/staticChoices = list("static", "blank", "letter", "animal")
|
||||
var/picked = FALSE //Have we picked our visual appearence (+ colour if applicable)
|
||||
@@ -67,7 +68,6 @@
|
||||
var/seeStatic = 1 //Whether we see static instead of mobs
|
||||
var/visualAppearence = MAINTDRONE //What we appear as
|
||||
var/hacked = FALSE //If we have laws to destroy the station
|
||||
var/can_be_held = TRUE //if assholes can pick us up
|
||||
var/flavortext = \
|
||||
"\n<big><span class='warning'>DO NOT INTERFERE WITH THE ROUND AS A DRONE OR YOU WILL BE DRONE BANNED</span></big>\n"+\
|
||||
"<span class='notify'>Drones are a ghost role that are allowed to fix the station and build things. Interfering with the round as a drone is against the rules.</span>\n"+\
|
||||
|
||||
@@ -4,8 +4,6 @@
|
||||
//DRONES AS ITEMS//
|
||||
///////////////////
|
||||
//Drone shells
|
||||
//Drones as hats
|
||||
|
||||
|
||||
//DRONE SHELL
|
||||
/obj/item/drone_shell
|
||||
@@ -62,45 +60,3 @@
|
||||
D.admin_spawned = admin_spawned
|
||||
D.key = user.key
|
||||
qdel(src)
|
||||
|
||||
|
||||
//DRONE HOLDER
|
||||
/obj/item/clothing/head/drone_holder//Only exists in someones hand.or on their head
|
||||
name = "drone (hiding)"
|
||||
desc = "This drone is scared and has curled up into a ball."
|
||||
icon = 'icons/mob/drone.dmi'
|
||||
icon_state = "drone_maint_hat"
|
||||
var/mob/living/simple_animal/drone/drone //stored drone
|
||||
|
||||
/obj/item/clothing/head/drone_holder/proc/uncurl()
|
||||
if(!drone)
|
||||
return
|
||||
|
||||
if(isliving(loc))
|
||||
var/mob/living/L = loc
|
||||
to_chat(L, "<span class='warning'>[drone] is trying to escape!</span>")
|
||||
if(!do_after(drone, 50, target = L))
|
||||
return
|
||||
L.dropItemToGround(src)
|
||||
|
||||
contents -= drone
|
||||
drone.forceMove(drop_location())
|
||||
drone.reset_perspective()
|
||||
drone.setDir(SOUTH )//Looks better
|
||||
drone.visible_message("<span class='warning'>[drone] uncurls!</span>")
|
||||
drone = null
|
||||
qdel(src)
|
||||
|
||||
|
||||
/obj/item/clothing/head/drone_holder/relaymove()
|
||||
uncurl()
|
||||
|
||||
/obj/item/clothing/head/drone_holder/container_resist(mob/living/user)
|
||||
uncurl()
|
||||
|
||||
|
||||
/obj/item/clothing/head/drone_holder/proc/updateVisualAppearence(mob/living/simple_animal/drone/D)
|
||||
if(!D)
|
||||
return
|
||||
icon_state = "[D.visualAppearence]_hat"
|
||||
. = icon_state
|
||||
|
||||
@@ -29,7 +29,6 @@
|
||||
if("Nothing")
|
||||
return
|
||||
|
||||
|
||||
/mob/living/simple_animal/drone/attack_hand(mob/user)
|
||||
if(ishuman(user))
|
||||
if(stat == DEAD || status_flags & GODMODE || !can_be_held)
|
||||
@@ -49,11 +48,8 @@
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You pick [src] up.</span>")
|
||||
drop_all_held_items()
|
||||
var/obj/item/clothing/head/drone_holder/DH = new /obj/item/clothing/head/drone_holder(src)
|
||||
DH.updateVisualAppearence(src)
|
||||
DH.drone = src
|
||||
var/obj/item/clothing/head/mob_holder/drone/DH = new(get_turf(src), src)
|
||||
user.put_in_hands(DH)
|
||||
forceMove(DH)
|
||||
|
||||
/mob/living/simple_animal/drone/proc/try_reactivate(mob/living/user)
|
||||
var/mob/dead/observer/G = get_ghost()
|
||||
|
||||
Reference in New Issue
Block a user