01f794a153
cl XDTM add: Spraying holy water on tiles will now prevent cult-based teleportation from using them as a destination point. tweak: Quantum, wormhole and magic teleportation is no longer disrupted by bags of holding. /cl Refactors some teleportation code so it uses do_teleport instead of directly forceMove. do_teleport now has a channel argument, to specify the type of teleportation used. This will affect what can and cannot interfere with teleportation. For example, BoHs interfere with bluespace teleportation but not wormhole, quantum or magic teleportation. do_teleport now sends a COMSIG_ATOM_INTERCEPT_TELEPORT signal, allowing the target turf (or anything placing a signal on said turf) to react appropriately. As a proof of concept, blessed tiles use it to prevent teleportation from the cult channel. Intercepting teleportation can have interesting potential uses, from teleport denial fields, to teleport scramblers (teleports you somewhere else instead), telefraggers that gib anyone unlucky enough to teleport in their area of effect, teleport anchors that shunt all teleportations in a wide area to themselves, and so on.
90 lines
3.6 KiB
Plaintext
90 lines
3.6 KiB
Plaintext
//Bluespace crystals, used in telescience and when crushed it will blink you to a random turf.
|
|
/obj/item/stack/ore/bluespace_crystal
|
|
name = "bluespace crystal"
|
|
desc = "A glowing bluespace crystal, not much is known about how they work. It looks very delicate."
|
|
icon = 'icons/obj/telescience.dmi'
|
|
icon_state = "bluespace_crystal"
|
|
singular_name = "bluespace crystal"
|
|
w_class = WEIGHT_CLASS_TINY
|
|
materials = list(MAT_BLUESPACE=MINERAL_MATERIAL_AMOUNT)
|
|
points = 50
|
|
var/blink_range = 8 // The teleport range when crushed/thrown at someone.
|
|
refined_type = /obj/item/stack/sheet/bluespace_crystal
|
|
grind_results = list("bluespace" = 20)
|
|
|
|
/obj/item/stack/ore/bluespace_crystal/refined
|
|
name = "refined bluespace crystal"
|
|
points = 0
|
|
refined_type = null
|
|
|
|
/obj/item/stack/ore/bluespace_crystal/Initialize()
|
|
. = ..()
|
|
pixel_x = rand(-5, 5)
|
|
pixel_y = rand(-5, 5)
|
|
|
|
/obj/item/stack/ore/bluespace_crystal/get_part_rating()
|
|
return 1
|
|
|
|
/obj/item/stack/ore/bluespace_crystal/attack_self(mob/user)
|
|
user.visible_message("<span class='warning'>[user] crushes [src]!</span>", "<span class='danger'>You crush [src]!</span>")
|
|
new /obj/effect/particle_effect/sparks(loc)
|
|
playsound(loc, "sparks", 50, 1)
|
|
blink_mob(user)
|
|
use(1)
|
|
|
|
/obj/item/stack/ore/bluespace_crystal/proc/blink_mob(mob/living/L)
|
|
do_teleport(L, get_turf(L), blink_range, asoundin = 'sound/effects/phasein.ogg', channel = TELEPORT_CHANNEL_BLUESPACE)
|
|
|
|
/obj/item/stack/ore/bluespace_crystal/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
|
|
if(!..()) // not caught in mid-air
|
|
visible_message("<span class='notice'>[src] fizzles and disappears upon impact!</span>")
|
|
var/turf/T = get_turf(hit_atom)
|
|
new /obj/effect/particle_effect/sparks(T)
|
|
playsound(loc, "sparks", 50, 1)
|
|
if(isliving(hit_atom))
|
|
blink_mob(hit_atom)
|
|
use(1)
|
|
|
|
//Artificial bluespace crystal, doesn't give you much research.
|
|
/obj/item/stack/ore/bluespace_crystal/artificial
|
|
name = "artificial bluespace crystal"
|
|
desc = "An artificially made bluespace crystal, it looks delicate."
|
|
materials = list(MAT_BLUESPACE=MINERAL_MATERIAL_AMOUNT*0.5)
|
|
blink_range = 4 // Not as good as the organic stuff!
|
|
points = 0 //nice try
|
|
refined_type = null
|
|
grind_results = list("bluespace" = 10, "silicon" = 20)
|
|
|
|
//Polycrystals, aka stacks
|
|
/obj/item/stack/sheet/bluespace_crystal
|
|
name = "bluespace polycrystal"
|
|
icon = 'icons/obj/telescience.dmi'
|
|
icon_state = "polycrystal"
|
|
item_state = "sheet-polycrystal"
|
|
singular_name = "bluespace polycrystal"
|
|
desc = "A stable polycrystal, made of fused-together bluespace crystals. You could probably break one off."
|
|
materials = list(MAT_BLUESPACE=MINERAL_MATERIAL_AMOUNT)
|
|
attack_verb = list("bluespace polybashed", "bluespace polybattered", "bluespace polybludgeoned", "bluespace polythrashed", "bluespace polysmashed")
|
|
novariants = TRUE
|
|
grind_results = list("bluespace" = 20)
|
|
point_value = 30
|
|
var/crystal_type = /obj/item/stack/ore/bluespace_crystal/refined
|
|
|
|
/obj/item/stack/sheet/bluespace_crystal/attack_self(mob/user)// to prevent the construction menu from ever happening
|
|
to_chat(user, "<span class='warning'>You cannot crush the polycrystal in-hand, try breaking one off.</span>")
|
|
|
|
//ATTACK HAND IGNORING PARENT RETURN VALUE
|
|
/obj/item/stack/sheet/bluespace_crystal/attack_hand(mob/user)
|
|
if(user.get_inactive_held_item() == src)
|
|
if(zero_amount())
|
|
return
|
|
var/BC = new crystal_type(src)
|
|
user.put_in_hands(BC)
|
|
use(1)
|
|
if(!amount)
|
|
to_chat(user, "<span class='notice'>You break the final crystal off.</span>")
|
|
else
|
|
to_chat(user, "<span class='notice'>You break off a crystal.</span>")
|
|
else
|
|
..()
|