mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-02-07 14:59:13 +00:00
## About The Pull Request this PR does 2 things, firstly it allows u to directly feed animals from ur hand instead of having to drop it on the floor and relying on their AI to go eat it. So you can now directly feed ore to raptors or wheat to cows by simply clicking on them with the item. secondly, it links the tameable component and the eating element together, as now the former relies on signals sent by the latter. ## Why It's Good For The Game Small QOL for pet owners when it comes to feeding their animals. ## Changelog 🆑 qol: u can now directly feed animals from ur hands, like raptors or cats, by clicking on them with their preferred food. balance: u can now heal ur raptors mid or post battles by hand feeding them ores /🆑
104 lines
3.4 KiB
Plaintext
104 lines
3.4 KiB
Plaintext
/**
|
|
* ## basic eating element!
|
|
*
|
|
* Small behavior for non-carbons to eat certain stuff they interact with
|
|
*/
|
|
/datum/element/basic_eating
|
|
element_flags = ELEMENT_BESPOKE
|
|
argument_hash_start_idx = 2
|
|
/// Amount to heal
|
|
var/heal_amt
|
|
/// Amount to hurt
|
|
var/damage_amount
|
|
/// Type of hurt to apply
|
|
var/damage_type
|
|
/// Whether to flavor it as drinking rather than eating.
|
|
var/drinking
|
|
/// Types the animal can eat.
|
|
var/list/food_types
|
|
|
|
/datum/element/basic_eating/Attach(datum/target, heal_amt = 0, damage_amount = 0, damage_type = null, drinking = FALSE, food_types = list())
|
|
. = ..()
|
|
|
|
if(!isliving(target))
|
|
return ELEMENT_INCOMPATIBLE
|
|
|
|
ADD_TRAIT(target, TRAIT_MOB_EATER, REF(src))
|
|
src.heal_amt = heal_amt
|
|
src.damage_amount = damage_amount
|
|
src.damage_type = damage_type
|
|
src.drinking = drinking
|
|
src.food_types = food_types
|
|
|
|
RegisterSignal(target, COMSIG_ATOM_ITEM_INTERACTION, PROC_REF(try_feed))
|
|
RegisterSignal(target, COMSIG_LIVING_UNARMED_ATTACK, PROC_REF(on_unarm_attack))
|
|
|
|
/datum/element/basic_eating/Detach(datum/target)
|
|
REMOVE_TRAIT(target, TRAIT_MOB_EATER, REF(src))
|
|
|
|
UnregisterSignal(target, list(
|
|
COMSIG_LIVING_UNARMED_ATTACK,
|
|
COMSIG_ATOM_ITEM_INTERACTION,
|
|
))
|
|
return ..()
|
|
|
|
/datum/element/basic_eating/proc/try_feed(atom/source, mob/living/user, atom/possible_food)
|
|
SIGNAL_HANDLER
|
|
if(user.combat_mode || !is_type_in_list(possible_food, food_types))
|
|
return NONE
|
|
|
|
try_eating(source, possible_food, user)
|
|
|
|
/datum/element/basic_eating/proc/on_unarm_attack(mob/living/eater, atom/target, proximity, modifiers)
|
|
SIGNAL_HANDLER
|
|
if(!proximity)
|
|
return NONE
|
|
|
|
if(try_eating(eater, target))
|
|
return COMPONENT_CANCEL_ATTACK_CHAIN
|
|
return NONE
|
|
|
|
/datum/element/basic_eating/proc/try_eating(mob/living/eater, atom/target, mob/living/feeder)
|
|
if(!is_type_in_list(target, food_types))
|
|
return FALSE
|
|
if(SEND_SIGNAL(eater, COMSIG_MOB_PRE_EAT, target, feeder) & COMSIG_MOB_CANCEL_EAT)
|
|
return FALSE
|
|
var/eat_verb
|
|
if(drinking)
|
|
eat_verb = pick("slurp","sip","guzzle","drink","quaff","suck")
|
|
else
|
|
eat_verb = pick("bite","chew","nibble","gnaw","gobble","chomp")
|
|
|
|
if (heal_amt > 0)
|
|
var/healed = heal_amt && eater.health < eater.maxHealth
|
|
if(heal_amt)
|
|
eater.heal_overall_damage(heal_amt)
|
|
eater.visible_message(span_notice("[eater] [eat_verb]s [target]."), span_notice("You [eat_verb] [target][healed ? ", restoring some health" : ""]."))
|
|
finish_eating(eater, target)
|
|
return TRUE
|
|
|
|
if (damage_amount > 0 && damage_type)
|
|
eater.apply_damage(damage_amount, damage_type)
|
|
eater.visible_message(span_notice("[eater] [eat_verb]s [target], and seems to hurt itself."), span_notice("You [eat_verb] [target], hurting yourself in the process."))
|
|
finish_eating(eater, target, feeder)
|
|
return TRUE
|
|
|
|
eater.visible_message(span_notice("[eater] [eat_verb]s [target]."), span_notice("You [eat_verb] [target]."))
|
|
finish_eating(eater, target, feeder)
|
|
return TRUE
|
|
|
|
/datum/element/basic_eating/proc/finish_eating(mob/living/eater, atom/target, mob/living/feeder)
|
|
set waitfor = FALSE
|
|
if(drinking)
|
|
playsound(eater.loc,'sound/items/drink.ogg', rand(10,50), TRUE)
|
|
else
|
|
playsound(eater.loc,'sound/items/eatfood.ogg', rand(10,50), TRUE)
|
|
var/atom/final_target = target
|
|
if(SEND_SIGNAL(eater, COMSIG_MOB_ATE, final_target, feeder) & COMSIG_MOB_TERMINATE_EAT)
|
|
return
|
|
if(isstack(target)) //if stack, only consume 1
|
|
var/obj/item/stack/food_stack = target
|
|
final_target = food_stack.split_stack(eater, 1)
|
|
eater.log_message("has eaten [target]!", LOG_ATTACK)
|
|
qdel(final_target)
|