mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-27 17:41:50 +00:00
* Fix paperplanes unfolding into different hand; balloon alerts (#73522) 🆑 coiax fix: Paper planes when unfolded will put the paper in your active hand, rather than a different hand, just like cardboard boxes. /🆑 - Also, use balloon alerts for folded/unfolded to match boxes ## Why It's Good For The Game Generally when you transform items from one form into another while having them in your hand, they generally go into the same hand. Also, people like balloon alerts now for these sorts of very minor transformations. * Fix paperplanes unfolding into different hand; balloon alerts --------- Co-authored-by: Jack Edge <yellowbounder@gmail.com>
172 lines
5.9 KiB
Plaintext
172 lines
5.9 KiB
Plaintext
/obj/item/paperplane
|
|
name = "paper plane"
|
|
desc = "Paper, folded in the shape of a plane."
|
|
icon = 'icons/obj/bureaucracy.dmi'
|
|
icon_state = "paperplane"
|
|
custom_fire_overlay = "paperplane_onfire"
|
|
throw_range = 7
|
|
throw_speed = 1
|
|
throwforce = 0
|
|
w_class = WEIGHT_CLASS_TINY
|
|
resistance_flags = FLAMMABLE
|
|
max_integrity = 50
|
|
|
|
var/hit_probability = 2 //%
|
|
var/obj/item/paper/internalPaper
|
|
|
|
// SKYRAT EDIT START - Better paper planes
|
|
/// How long does getting shot in the eyes knock you down for?
|
|
var/knockdown_duration = 4 SECONDS
|
|
/// How much eye damage does it deal at minimum on eye impact?
|
|
var/impact_eye_damage_lower = 6
|
|
/// How much eye damage does it deal at maximum on eye impact?
|
|
var/impact_eye_damage_higher = 8
|
|
/// Does it get deleted when hitting anything or landing?
|
|
var/delete_on_impact = FALSE
|
|
// SKYRAT EDIT END
|
|
|
|
/obj/item/paperplane/syndicate
|
|
desc = "Paper, masterfully folded in the shape of a plane."
|
|
throwforce = 20 //same as throwing stars, but no chance of embedding.
|
|
hit_probability = 100 //guaranteed to cause eye damage when it hits a mob.
|
|
|
|
/obj/item/paperplane/Initialize(mapload, obj/item/paper/newPaper)
|
|
. = ..()
|
|
pixel_x = base_pixel_x + rand(-9, 9)
|
|
pixel_y = base_pixel_y + rand(-8, 8)
|
|
if(newPaper)
|
|
internalPaper = newPaper
|
|
flags_1 = newPaper.flags_1
|
|
color = newPaper.color
|
|
newPaper.forceMove(src)
|
|
else
|
|
internalPaper = new(src)
|
|
if(internalPaper.icon_state == "cpaper" || internalPaper.icon_state == "cpaper_words")
|
|
icon_state = "paperplane_carbon" // It's the purple carbon copy. Use the purple paper plane
|
|
update_appearance()
|
|
|
|
/obj/item/paperplane/Exited(atom/movable/gone, direction)
|
|
. = ..()
|
|
if (internalPaper == gone)
|
|
internalPaper = null
|
|
if(!QDELETED(src))
|
|
qdel(src)
|
|
|
|
/obj/item/paperplane/Destroy()
|
|
internalPaper = null
|
|
return ..()
|
|
|
|
/obj/item/paperplane/suicide_act(mob/living/user)
|
|
var/obj/item/organ/internal/eyes/eyes = user.getorganslot(ORGAN_SLOT_EYES)
|
|
user.Stun(200)
|
|
user.visible_message(span_suicide("[user] jams [src] in [user.p_their()] nose. It looks like [user.p_theyre()] trying to commit suicide!"))
|
|
user.adjust_eye_blur(12 SECONDS)
|
|
if(eyes)
|
|
eyes.applyOrganDamage(rand(impact_eye_damage_lower, impact_eye_damage_higher)) // SKYRAT EDIT START - Better paper planes
|
|
sleep(1 SECONDS)
|
|
return BRUTELOSS
|
|
|
|
/obj/item/paperplane/update_overlays()
|
|
. = ..()
|
|
for(var/stamp in internalPaper.stamp_cache)
|
|
. += "paperplane_[stamp]"
|
|
|
|
/obj/item/paperplane/attack_self(mob/user)
|
|
balloon_alert(user, "unfolded")
|
|
|
|
var/atom/location = drop_location()
|
|
// Need to keep a reference to the internal paper
|
|
// when we move it out of the plane, our ref gets set to null
|
|
var/obj/item/paper/internal_paper = internalPaper
|
|
internal_paper.forceMove(location)
|
|
// This will as a side effect, qdel the paper plane, making the user's hands empty
|
|
|
|
user.put_in_hands(internal_paper)
|
|
|
|
/obj/item/paperplane/attackby(obj/item/P, mob/living/carbon/human/user, params)
|
|
if(burn_paper_product_attackby_check(P, user))
|
|
return
|
|
if(istype(P, /obj/item/pen) || istype(P, /obj/item/toy/crayon))
|
|
to_chat(user, span_warning("You should unfold [src] before changing it!"))
|
|
return
|
|
|
|
else if(istype(P, /obj/item/stamp)) //we don't randomize stamps on a paperplane
|
|
internalPaper.attackby(P, user) //spoofed attack to update internal paper.
|
|
update_appearance()
|
|
add_fingerprint(user)
|
|
return
|
|
|
|
return ..()
|
|
|
|
|
|
/obj/item/paperplane/throw_at(atom/target, range, speed, mob/thrower, spin=FALSE, diagonals_first = FALSE, datum/callback/callback, quickstart = TRUE)
|
|
. = ..(target, range, speed, thrower, FALSE, diagonals_first, callback, quickstart = quickstart)
|
|
|
|
/obj/item/paperplane/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
|
|
if(iscarbon(hit_atom))
|
|
var/mob/living/carbon/C = hit_atom
|
|
if(C.can_catch_item(TRUE))
|
|
var/datum/action/innate/origami/origami_action = locate() in C.actions
|
|
if(origami_action?.active) //if they're a master of origami and have the ability turned on, force throwmode on so they'll automatically catch the plane.
|
|
C.throw_mode_on(THROW_MODE_TOGGLE)
|
|
|
|
if(..() || !ishuman(hit_atom))//if the plane is caught or it hits a nonhuman
|
|
// SKYRAT EDIT START - Better paper planes
|
|
if(delete_on_impact)
|
|
qdel(src)
|
|
// SKYRAT EDIT END
|
|
return
|
|
var/mob/living/carbon/human/H = hit_atom
|
|
var/obj/item/organ/internal/eyes/eyes = H.getorganslot(ORGAN_SLOT_EYES)
|
|
if(prob(hit_probability))
|
|
if(H.is_eyes_covered())
|
|
// SKYRAT EDIT START - Better paper planes
|
|
if(delete_on_impact)
|
|
qdel(src)
|
|
// SKYRAT EDIT END
|
|
return
|
|
visible_message(span_danger("\The [src] hits [H] in the eye[eyes ? "" : " socket"]!"))
|
|
H.adjust_eye_blur(12 SECONDS)
|
|
// SKYRAT EDIT START - Better paper planes
|
|
eyes?.applyOrganDamage(rand(impact_eye_damage_lower, impact_eye_damage_higher))
|
|
H.Knockdown(knockdown_duration)
|
|
H.emote("scream")
|
|
|
|
if(delete_on_impact)
|
|
qdel(src)
|
|
// SKYRAT EDIT END
|
|
|
|
/obj/item/paper/examine(mob/user)
|
|
. = ..()
|
|
. += span_notice("Alt-click [src] to fold it into a paper plane.")
|
|
|
|
/obj/item/paper/AltClick(mob/living/user, obj/item/I)
|
|
if(!user.canUseTopic(src, be_close = TRUE, no_dexterity = TRUE, no_tk = FALSE, need_hands = TRUE))
|
|
return
|
|
if(istype(src, /obj/item/paper/carbon))
|
|
var/obj/item/paper/carbon/Carbon = src
|
|
if(!Carbon.copied)
|
|
to_chat(user, span_notice("Take off the carbon copy first."))
|
|
return
|
|
//Origami Master
|
|
var/datum/action/innate/origami/origami_action = locate() in user.actions
|
|
if(origami_action?.active)
|
|
make_plane(user, I, /obj/item/paperplane/syndicate)
|
|
else
|
|
make_plane(user, I, /obj/item/paperplane)
|
|
|
|
/**
|
|
* Paper plane folding
|
|
*
|
|
* Arguments:
|
|
* * mob/living/user - who's folding
|
|
* * obj/item/I - what's being folded
|
|
* * obj/item/paperplane/plane_type - what it will be folded into (path)
|
|
*/
|
|
/obj/item/paper/proc/make_plane(mob/living/user, obj/item/I, obj/item/paperplane/plane_type = /obj/item/paperplane)
|
|
balloon_alert(user, "folded into a plane")
|
|
user.temporarilyRemoveItemFromInventory(src)
|
|
I = new plane_type(loc, src)
|
|
if(user.Adjacent(I))
|
|
user.put_in_hands(I)
|