Files
Bubberstation/code/game/objects/items/tongs.dm
MrMelbert 6ae59ebf52 Fixes some fried food exploits (#79789)
## About The Pull Request

I would've been content to leave these, but you guys just haaaad to
overdo it

- Plates now respect weight class of items on top
- Fried food now respect volume of existing items

## Why It's Good For The Game

These exploits are not intended and have potential and, if abused, can
severely detract from rounds.

## Changelog

🆑 Melbert
fix: Plates now respect the weight class of items on top.
fix: Fried items now respect existing volume cap.
fix: Smartfridges now don't accept bulky food items, good thing we have
none of those right guys?
/🆑
2023-11-17 23:52:22 -07:00

102 lines
3.1 KiB
Plaintext

/// Tongs, let you pick up and feed people food from further away.
/obj/item/kitchen/tongs
name = "tongs"
desc = "So you never have to touch anything with your dirty, unwashed hands."
reach = 2
icon_state = "tongs"
base_icon_state = "tongs"
inhand_icon_state = "fork" // close enough
attack_verb_continuous = list("pinches", "tongs", "nips")
attack_verb_simple = list("pinch", "tong", "nip")
/// What are we holding in our tongs?
var/obj/item/tonged
/// Sound to play when we click our tongs together
var/clack_sound = 'sound/items/handling/component_drop.ogg'
/// Time to wait between clacking sounds
var/clack_delay = 2 SECONDS
/// Have we clacked recently?
COOLDOWN_DECLARE(clack_cooldown)
/obj/item/kitchen/tongs/Destroy(force)
QDEL_NULL(tonged)
return ..()
/obj/item/kitchen/tongs/examine(mob/user)
. = ..()
if (!isnull(tonged))
. += span_notice("It is holding [tonged].")
/obj/item/kitchen/tongs/dropped(mob/user, silent)
. = ..()
drop_tonged()
/obj/item/kitchen/tongs/attack_self(mob/user, modifiers)
. = ..()
if(.)
return TRUE
if (!isnull(tonged))
drop_tonged()
return TRUE
if (!COOLDOWN_FINISHED(src, clack_cooldown))
return TRUE
user.visible_message(span_notice("[user] clacks [user.p_their()] [src] together like a crab. Click clack!"))
click_clack()
return TRUE
/// Release the food we are holding
/obj/item/kitchen/tongs/proc/drop_tonged()
if (isnull(tonged))
return
visible_message(span_notice("[tonged] falls to the ground!"))
var/turf/location = drop_location()
tonged.forceMove(location)
tonged.do_drop_animation(location)
/// Play a clacking sound and appear closed, then open again
/obj/item/kitchen/tongs/proc/click_clack()
COOLDOWN_START(src, clack_cooldown, clack_delay)
playsound(src, clack_sound, vol = 100, vary = FALSE)
icon_state = "[base_icon_state]_closed"
var/delay = min(0.5 SECONDS, clack_delay / 2) // Just in case someone's been fucking with the cooldown
addtimer(CALLBACK(src, PROC_REF(clack)), delay, TIMER_DELETE_ME)
/// Plays a clacking sound and appear open
/obj/item/kitchen/tongs/proc/clack()
playsound(src, clack_sound, vol = 100, vary = FALSE)
icon_state = base_icon_state
/obj/item/kitchen/tongs/Exited(atom/movable/leaving, direction)
. = ..()
if (leaving != tonged)
return
tonged = null
update_appearance(UPDATE_ICON)
/obj/item/kitchen/tongs/pre_attack(obj/item/attacked, mob/living/user, params)
if (!isnull(tonged) && tonged.force <= 0) // prevents tongs from giving food-weapons extra range
attacked.attackby(tonged, user)
return TRUE
if (isliving(attacked))
if (COOLDOWN_FINISHED(src, clack_cooldown))
click_clack()
return ..()
if (!IsEdible(attacked) || attacked.w_class > WEIGHT_CLASS_NORMAL || !isnull(tonged))
return ..()
tonged = attacked
attacked.do_pickup_animation(src)
attacked.forceMove(src)
update_appearance(UPDATE_ICON)
return TRUE
/obj/item/kitchen/tongs/update_overlays()
. = ..()
if (isnull(tonged))
return
var/mutable_appearance/held_food = new /mutable_appearance(tonged.appearance)
held_food.layer = layer
held_food.plane = plane
held_food.transform = held_food.transform.Scale(0.7, 0.7)
held_food.pixel_x = 6
held_food.pixel_y = 6
. += held_food