Adds a GPS tracking collar (#1726)

## About The Pull Request
Adds a GPS tracking collar to the game. It can be found in the LustWish
premium section. The collar broadcasts a GPS signal with the name of the
collar. Tracking can be toggled on and off with alt-right-click. The
tracking collar can be locked, not only preventing removal but also
preventing toggling the tracking. The collar cannot receive GPS signals,
only send one.

## Why It's Good For The Game
Requested by Aeri on the Discord. Pre-approved by @projectkepler-ru. 

## Proof Of Testing
https://youtu.be/iFcZotyVUuQ

## Changelog

🆑
add: Added a GPS tracking collar to the LustWish
/🆑

---------

Co-authored-by: projectkepler-RU <99981766+projectkepler-ru@users.noreply.github.com>
Co-authored-by: Waterpig <49160555+Majkl-J@users.noreply.github.com>
This commit is contained in:
Shroopy
2024-07-21 21:00:19 +02:00
committed by GitHub
co-authored by projectkepler-RU Waterpig
parent 3b180ed645
commit 46f58058dc
13 changed files with 176 additions and 6 deletions
@@ -1,2 +1,4 @@
// Signal sent when the morgue tray throws its alarm
#define COMSIG_MORGUE_ALARM "morgue_alarm"
// Can be sent whenever an object's name is changed so components can be properly updated as well
#define COMSIG_NAME_CHANGED "name_changed"
+1
View File
@@ -297,6 +297,7 @@ GLOBAL_LIST_INIT(all_loadout_categories, init_loadout_categories())
renamed = 1
if(renamed)
ADD_TRAIT(equipped_item, TRAIT_WAS_RENAMED, "Loadout")
SEND_SIGNAL(equipped_item, COMSIG_NAME_CHANGED) // BUBBER EDIT
// SKYRAT EDIT END
if(can_be_reskinned && item_details?[INFO_RESKIN])
@@ -0,0 +1,22 @@
{
"gps": [
{
"type": "icon_state",
"icon_state": "collar_band_gray",
"blend_mode": "overlay",
"color_ids": [ 1 ]
},
{
"type": "icon_state",
"icon_state": "collar_tracker_gray",
"blend_mode": "overlay",
"color_ids": [ 2 ]
},
{
"type": "icon_state",
"icon_state": "collar_screen",
"blend_mode": "overlay"
}
]
}
@@ -0,0 +1,16 @@
{
"gps": [
{
"type": "icon_state",
"icon_state": "collar_inhand_tracker_l_gray",
"blend_mode": "overlay",
"color_ids": [ 2 ]
},
{
"type": "icon_state",
"icon_state": "collar_inhand_band_l_gray",
"blend_mode": "overlay",
"color_ids": [ 1 ]
}
]
}
@@ -0,0 +1,16 @@
{
"gps": [
{
"type": "icon_state",
"icon_state": "collar_inhand_tracker_r_gray",
"blend_mode": "overlay",
"color_ids": [ 2 ]
},
{
"type": "icon_state",
"icon_state": "collar_inhand_band_r_gray",
"blend_mode": "overlay",
"color_ids": [ 1 ]
}
]
}
@@ -0,0 +1,16 @@
{
"gps": [
{
"type": "icon_state",
"icon_state": "collar_mob_tracker_gray",
"blend_mode": "overlay",
"color_ids": [ 2 ]
},
{
"type": "icon_state",
"icon_state": "collar_mob_band_gray",
"blend_mode": "overlay",
"color_ids": [ 1 ]
}
]
}
@@ -11,6 +11,24 @@
name = "Ring Bell Collar (Worn)"
json_config = 'modular_skyrat/modules/GAGS/json_configs/collar/ringbell_worn.json'
/datum/greyscale_config/collar/gps
name = "GPS Collar"
icon_file = 'modular_zubbers/code/modules/GAGS/icons/collar.dmi'
json_config = 'modular_skyrat/modules/GAGS/json_configs/collar/gps.json'
/datum/greyscale_config/collar/gps/worn
name = "GPS Collar (Worn)"
json_config = 'modular_skyrat/modules/GAGS/json_configs/collar/gps_worn.json'
/datum/greyscale_config/collar/gps/lefthand
name = "GPS Collar (Left hand)"
json_config = 'modular_skyrat/modules/GAGS/json_configs/collar/gps_lefthand.json'
/datum/greyscale_config/collar/gps/righthand
name = "GPS Collar (Right hand)"
json_config = 'modular_skyrat/modules/GAGS/json_configs/collar/gps_righthand.json'
//Bunny stuff, sprites from MonkieStation
/datum/greyscale_config/bunnysuit
@@ -62,3 +80,4 @@
name = "Worn Playbunny Ears"
icon_file = 'modular_zubbers/icons/mob/clothing/head/bunnyears.dmi'
json_config = 'modular_skyrat/modules/GAGS/json_configs/bunny_stuff/playbunny_ears_worn.json'
Binary file not shown.

Before

Width:  |  Height:  |  Size: 929 B

After

Width:  |  Height:  |  Size: 3.3 KiB

@@ -9,3 +9,71 @@
/obj/item/clothing/neck/human_petcollar/locked/ringbell/Initialize(mapload)
. = ..()
AddComponent(/datum/component/squeak, list('modular_zubbers/sound/misc/collarbell1.ogg'=1,'modular_zubbers/sound/misc/collarbell2.ogg'=1), 50, 100, 8)
/obj/item/clothing/neck/kink_collar/locked/gps
name = "tracking collar"
desc = "A collar that lets you find your pet anywhere with GPS!"
var/datum/component/gps/gps
icon_state = "gps"
greyscale_config = /datum/greyscale_config/collar/gps
greyscale_config_worn = /datum/greyscale_config/collar/gps/worn
greyscale_config_inhand_left = /datum/greyscale_config/collar/gps/lefthand
greyscale_config_inhand_right = /datum/greyscale_config/collar/gps/righthand
greyscale_colors = "#8B96B7#505665"
flags_1 = IS_PLAYER_COLORABLE_1
unique_reskin = null
resistance_flags = FIRE_PROOF
/obj/item/clothing/neck/kink_collar/locked/gps/Initialize(mapload)
. = ..()
atom_storage.click_alt_open = FALSE
gps = AddComponent(/datum/component/gps, name)
register_context()
update_icon(UPDATE_OVERLAYS)
RegisterSignal(src, COMSIG_NAME_CHANGED, PROC_REF(on_update_name))
/obj/item/clothing/neck/kink_collar/locked/gps/proc/on_update_name()
SIGNAL_HANDLER
gps.gpstag = name
/obj/item/clothing/neck/kink_collar/locked/gps/attack_self(mob/user)
. = ..()
gps.gpstag = tagname
/obj/item/clothing/neck/kink_collar/locked/gps/examine(mob/user)
. = ..()
. += span_notice("Alt-click to [gps.tracking ? "disable":"enable"] tracking.")
///Calls toggletracking
/obj/item/clothing/neck/kink_collar/locked/gps/click_alt(mob/user)
if(locked)
balloon_alert(user, "it's locked!")
playsound(src, 'sound/items/click.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
else
toggletracking(user)
balloon_alert(user, "tracking [gps.tracking ? "enabled":"disabled"]")
playsound(src, 'sound/machines/click.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
return CLICK_ACTION_SUCCESS
/obj/item/clothing/neck/kink_collar/locked/gps/proc/toggletracking(mob/user)
gps.tracking = !gps.tracking
update_icon(UPDATE_OVERLAYS)
user.update_worn_neck()
/obj/item/clothing/neck/kink_collar/locked/gps/add_context(atom/source, list/context, obj/item/held_item, mob/user)
. = ..()
if(!locked)
context[SCREENTIP_CONTEXT_ALT_LMB] = "[gps.tracking ? "Disable":"Enable"] tracking"
return CONTEXTUAL_SCREENTIP_SET
/obj/item/clothing/neck/kink_collar/locked/gps/update_overlays()
. = ..()
if(gps.tracking)
. += mutable_appearance('modular_zubbers/code/modules/GAGS/icons/collar.dmi', "light")
. += emissive_appearance('modular_zubbers/code/modules/GAGS/icons/collar.dmi', "light", src, alpha = src.alpha)
/obj/item/clothing/neck/kink_collar/locked/gps/worn_overlays(mutable_appearance/standing, isinhands = FALSE)
. = ..()
if(gps.tracking && !isinhands)
. += mutable_appearance('modular_zubbers/code/modules/GAGS/icons/collar.dmi', "collar_mob_tracker_light")
. += emissive_appearance('modular_zubbers/code/modules/GAGS/icons/collar.dmi', "collar_mob_tracker_light", src, alpha = src.alpha)
@@ -7,6 +7,10 @@
name = "Ringing Bell Collar"
item_path = /obj/item/clothing/neck/human_petcollar/locked/ringbell
/datum/loadout_item/neck/gps
name = "Tracking Collar"
item_path = /obj/item/clothing/neck/kink_collar/locked/gps
/datum/loadout_item/neck/binary
name = "Crow Feather Cloak"
item_path = /obj/item/clothing/neck/binary
@@ -0,0 +1,4 @@
/obj/machinery/vending/security
zubbers_contraband = list(
/obj/item/clothing/neck/kink_collar/locked/gps = 3,
)
@@ -23,10 +23,11 @@
)
zubbers_premium = list(
/obj/item/holosign_creator/sex = 6,
/obj/item/clothing/under/mikubikini = 3,
/obj/item/clothing/suit/mikujacket = 3,
/obj/item/clothing/head/mikuhair = 3,
/obj/item/clothing/gloves/mikugloves = 3,
/obj/item/clothing/shoes/sneakers/mikuleggings = 3,
/obj/item/clothing/neck/kink_collar/locked/gps = 3,
/obj/item/holosign_creator/sex = 6,
/obj/item/clothing/under/mikubikini = 3,
/obj/item/clothing/suit/mikujacket = 3,
/obj/item/clothing/head/mikuhair = 3,
/obj/item/clothing/gloves/mikugloves = 3,
/obj/item/clothing/shoes/sneakers/mikuleggings = 3,
)
+1
View File
@@ -9052,6 +9052,7 @@
#include "modular_zubbers\code\modules\uplink\uplink_items\dangerous.dm"
#include "modular_zubbers\code\modules\uplink\uplink_items\device_tools.dm"
#include "modular_zubbers\code\modules\uplink\uplink_items\job.dm"
#include "modular_zubbers\code\modules\vending\armadyne.dm"
#include "modular_zubbers\code\modules\vending\clothmate.dm"
#include "modular_zubbers\code\modules\vending\comdrobe.dm"
#include "modular_zubbers\code\modules\vending\games.dm"