Converted a bunch of stuff to the new thing (#27556)

* removed old on_density_change thing

* converted on_resist to lazy events

* Converted on_spellcast to lazy events

* Converted on_uattack to lazy events, breaks spell channeling

* Converted on_ruattack to lazy events, unbreaks channeled spells

* Converted on_logout to lazy events

* Converted on_damaged to lazy_events

* Converted on_death to lazy_events

* Converted on_clickon to lazy_events

* Converted on_attackhand to lazy_events, added on_bumped
This commit is contained in:
DamianX
2020-08-16 18:53:17 +02:00
committed by GitHub
parent 15555e1092
commit 09a73d3c59
31 changed files with 192 additions and 224 deletions

View File

@@ -489,10 +489,8 @@ var/global/list/radial_menus = list()
// Copying atoms is stupid and this is a stupid solution // Copying atoms is stupid and this is a stupid solution
var/list/variables_not_to_be_copied = list( var/list/variables_not_to_be_copied = list(
"type","loc","locs","vars","parent","parent_type","verbs","ckey","key", "type","loc","locs","vars","parent","parent_type","verbs","ckey","key",
"group","on_density_change","registered_events", "group","registered_events",
"on_resist", "on_attackby",
"on_spellcast","on_uattack","on_ruattack","on_logout","on_damaged",
"on_death","on_clickon","on_attackhand","on_attackby",
"on_explode","on_projectile","in_chamber","power_supply","contents", "on_explode","on_projectile","in_chamber","power_supply","contents",
"x","y","z" "x","y","z"
) )

View File

@@ -90,6 +90,68 @@
// atom/atom: the atom whose density changed. // atom/atom: the atom whose density changed.
/lazy_event/on_density_change /lazy_event/on_density_change
// Called whenever a mob uses the "resist" verb.
// Arguments:
// mob/user: the mob that's resisting
/lazy_event/on_resist
// Called whenever a mob casts a spell.
// Arguments:
// spell/spell: the spell that's being cast.
// mob/user: the mob that's casting the spell.
// list/targets: the list of targets the spell is being cast against. May not always be a list.
/lazy_event/on_spellcast
// Called whenever a mob attacks something with an empty hand.
// Arguments:
// atom/atom: The atom that's being attacked.
/lazy_event/on_uattack
// Called whenever a mob attacks something while restrained.
// Arguments:
// atom/atom: The atom that's being attacked.
/lazy_event/on_ruattack
// Called by mob/Logout().
// Arguments:
// mob/user: The mob that's logging out.
/lazy_event/on_logout
// Called whenever a mob takes damage.
// Truthy return values will prevent the damage.
// Arguments:
// kind: the kind of damage the mob is being dealt.
// amount: the amount of damage the mob is being dealt.
/lazy_event/on_damaged
// Called whenever a mob dies.
// Arguments:
// mob/user: The mob that's dying.
// body_destroyed: Whether the mob is about to be gibbed.
/lazy_event/on_death
// Called by /mob/proc/ClickOn.
// The list of modifiers can be changed by the event listeners.
// Arguments:
// mob/user: the user that's doing the clicking.
// list/modifiers: list of key modifiers (shift, alt, etcetera).
// atom/target: the atom that's being clicked on.
/lazy_event/on_clickon
// Called when an atom is attacked with an empty hand.
// Currently only used by xenoarch artifacts, should probably be moved to the base proc.
// Arguments:
// mob/user: the guy who is attacking.
// atom/target: the atom that's being attacked.
/lazy_event/on_attackhand
// Called whenever an atom bumps into another.
// Currently only used by xenoarch artifacts, should probably be moved to the base proc.
// Arguments:
// mob/user: the guy who is bumping.
// atom/target: the atom that's being bumped into.
/lazy_event/on_bumped
/datum /datum
/// Associative list of type path -> list(), /// Associative list of type path -> list(),
/// where the type path is a descendant of /event_type. /// where the type path is a descendant of /event_type.

View File

@@ -63,7 +63,7 @@
RestrainedClickOn(A) RestrainedClickOn(A)
else else
*/ */
if(INVOKE_EVENT(on_uattack,list("atom"=A))) //This returns 1 when doing an action intercept if(lazy_invoke_event(/lazy_event/on_uattack, list("atom" = A))) //This returns 1 when doing an action intercept
return return
A.add_hiddenprint(src) A.add_hiddenprint(src)
A.attack_ai(src) A.attack_ai(src)

View File

@@ -75,7 +75,8 @@
return return
var/list/modifiers = params2list(params) var/list/modifiers = params2list(params)
on_clickon.Invoke(list( lazy_invoke_event(/lazy_event/on_clickon, list(
"user" = src,
"modifiers" = modifiers, "modifiers" = modifiers,
"target" = A "target" = A
)) ))
@@ -151,7 +152,7 @@
else else
if(ismob(A) || istype(held_item, /obj/item/weapon/grab)) if(ismob(A) || istype(held_item, /obj/item/weapon/grab))
delayNextAttack(10) delayNextAttack(10)
if(INVOKE_EVENT(on_uattack,list("atom"=A))) //This returns 1 when doing an action intercept if(lazy_invoke_event(/lazy_event/on_uattack, list("atom" = A))) //This returns 1 when doing an action intercept
return return
UnarmedAttack(A, 1, params) UnarmedAttack(A, 1, params)
@@ -182,7 +183,7 @@
else else
if(ismob(A)) if(ismob(A))
delayNextAttack(10) delayNextAttack(10)
if(INVOKE_EVENT(on_uattack,list("atom"=A))) //This returns 1 when doing an action intercept if(lazy_invoke_event(/lazy_event/on_uattack, list("atom" = A))) //This returns 1 when doing an action intercept
return return
RangedAttack(A, params) RangedAttack(A, params)
@@ -244,8 +245,7 @@
Not currently used by anything but could easily be. Not currently used by anything but could easily be.
*/ */
/mob/proc/RestrainedClickOn(var/atom/A) /mob/proc/RestrainedClickOn(var/atom/A)
if(INVOKE_EVENT(on_ruattack,list("atom"=A))) //This returns 1 when doing an action intercept lazy_invoke_event(/lazy_event/on_ruattack, list("atom" = A))
return
/* /*
Middle click Middle click

View File

@@ -47,7 +47,7 @@
aicamera.captureimage(A, src) aicamera.captureimage(A, src)
return return
if(INVOKE_EVENT(on_uattack,list("atom"=A))) if(lazy_invoke_event(/lazy_event/on_uattack, list("atom" = A)))
return return
var/obj/item/W = get_active_hand() var/obj/item/W = get_active_hand()

View File

@@ -74,9 +74,6 @@
/atom/proc/requires_dexterity(mob/user) /atom/proc/requires_dexterity(mob/user)
return 0 return 0
/mob/living/carbon/human/RestrainedClickOn(var/atom/A)
..()
/mob/living/carbon/human/RangedAttack(var/atom/A) /mob/living/carbon/human/RangedAttack(var/atom/A)
if(!gloves && !mutations.len) if(!gloves && !mutations.len)
return return
@@ -112,9 +109,6 @@
/atom/proc/attack_animal(mob/user as mob) /atom/proc/attack_animal(mob/user as mob)
return return
/mob/living/RestrainedClickOn(var/atom/A)
..()
/* /*
Monkeys Monkeys
*/ */

View File

@@ -3,13 +3,12 @@
var/mob/controller var/mob/controller
var/atom/movable/controlled var/atom/movable/controlled
var/control_flags = 0 var/control_flags = 0
var/damaged_event_key
var/is_controlled = FALSE //Whether we're in strict control var/is_controlled = FALSE //Whether we're in strict control
/datum/control/New(var/mob/new_controller, var/atom/new_controlled) /datum/control/New(var/mob/new_controller, var/atom/new_controlled)
..() ..()
controller = new_controller controller = new_controller
damaged_event_key = controller.on_damaged.Add(src, "user_damaged") controller.lazy_register_event(/lazy_event/on_damaged, src, .proc/user_damaged)
controlled = new_controlled controlled = new_controlled
/datum/control/Destroy() /datum/control/Destroy()
@@ -20,8 +19,7 @@
controlled = null controlled = null
..() ..()
/datum/control/proc/user_damaged(list/arguments) /datum/control/proc/user_damaged(kind, amount)
var/amount = arguments["amount"]
if(amount > 0 && control_flags & REVERT_ON_CONTROLLER_DAMAGED) if(amount > 0 && control_flags & REVERT_ON_CONTROLLER_DAMAGED)
break_control() break_control()

View File

@@ -196,7 +196,6 @@
icon = 'icons/obj/wizard.dmi' icon = 'icons/obj/wizard.dmi'
icon_state = "phylactery_empty_noglow" icon_state = "phylactery_empty_noglow"
var/charges = 0 var/charges = 0
var/soulbound
var/mindbound var/mindbound
var/mob/bound_soul var/mob/bound_soul
var/datum/mind/bound_mind var/datum/mind/bound_mind
@@ -220,11 +219,9 @@
..() ..()
/obj/item/phylactery/Destroy() /obj/item/phylactery/Destroy()
if(bound_soul.on_death)
bound_soul.on_death.Remove(soulbound)
bound_soul.lazy_unregister_event(/lazy_event/on_z_transition, src, .proc/z_block)
soulbound = null
if(bound_soul) if(bound_soul)
bound_soul.lazy_unregister_event(/lazy_event/on_death, src, .proc/revive_soul)
bound_soul.lazy_unregister_event(/lazy_event/on_z_transition, src, .proc/z_block)
to_chat(bound_soul, "<span class = 'warning'><b>You feel your form begin to unwind!</b></span>") to_chat(bound_soul, "<span class = 'warning'><b>You feel your form begin to unwind!</b></span>")
spawn(rand(5 SECONDS, 15 SECONDS)) spawn(rand(5 SECONDS, 15 SECONDS))
bound_soul.dust() bound_soul.dust()
@@ -234,7 +231,7 @@
/obj/item/phylactery/update_icon() /obj/item/phylactery/update_icon()
if(soulbound) if(bound_soul)
if(charges >= 1) if(charges >= 1)
icon_state = "phylactery" icon_state = "phylactery"
else else
@@ -243,7 +240,7 @@
icon_state = "phylactery_empty_noglow" icon_state = "phylactery_empty_noglow"
/obj/item/phylactery/attack_self(mob/user) /obj/item/phylactery/attack_self(mob/user)
if(!soulbound && ishuman(user)) if(!bound_soul && ishuman(user))
var/mob/living/carbon/human/H = user var/mob/living/carbon/human/H = user
var/datum/organ/external/E = H.get_active_hand_organ() var/datum/organ/external/E = H.get_active_hand_organ()
if(locate(/datum/wound) in E.wounds) if(locate(/datum/wound) in E.wounds)
@@ -256,12 +253,12 @@
else else
..() ..()
/obj/item/phylactery/proc/revive_soul(list/arguments) /obj/item/phylactery/proc/revive_soul(mob/user, body_destroyed)
if(charges <= 0) if(charges <= 0)
unbind_mind() unbind_mind()
unbind() unbind()
return return
var/mob/living/original = arguments["user"] var/mob/living/original = user
if(original.mind) if(original.mind)
var/mob/living/carbon/human/H = new /mob/living/carbon/human/lich(src) var/mob/living/carbon/human/H = new /mob/living/carbon/human/lich(src)
H.real_name = original.real_name H.real_name = original.real_name
@@ -275,7 +272,7 @@
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/under/lightpurple(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/clothing/under/lightpurple(H), slot_w_uniform)
original.mind.transfer_to(H) // rebinding on transfer now handled by mind original.mind.transfer_to(H) // rebinding on transfer now handled by mind
if(!arguments["body_destroyed"]) if(!body_destroyed)
original.dust() original.dust()
var/release_time = round(rand(60 SECONDS, 120 SECONDS)/charges, 10) //In deciseconds var/release_time = round(rand(60 SECONDS, 120 SECONDS)/charges, 10) //In deciseconds
H.Paralyse(release_time/20) //Divide by 20 because Paralyse goes down by 1 every Life() tick (roughly every 2 secs) H.Paralyse(release_time/20) //Divide by 20 because Paralyse goes down by 1 every Life() tick (roughly every 2 secs)
@@ -289,14 +286,12 @@
/obj/item/phylactery/proc/unbind() /obj/item/phylactery/proc/unbind()
if(bound_soul) if(bound_soul)
bound_soul.lazy_unregister_event(/lazy_event/on_z_transition, src, .proc/z_block) bound_soul.lazy_unregister_event(/lazy_event/on_z_transition, src, .proc/z_block)
if(bound_soul.on_death) bound_soul.lazy_unregister_event(/lazy_event/on_death, src, .proc/revive_soul)
bound_soul.on_death.Remove(soulbound)
soulbound = null
bound_soul = null bound_soul = null
update_icon() update_icon()
/obj/item/phylactery/proc/bind(var/mob/to_bind) /obj/item/phylactery/proc/bind(var/mob/to_bind)
soulbound = to_bind.on_death.Add(src, "revive_soul") to_bind.lazy_register_event(/lazy_event/on_death, src, .proc/revive_soul)
to_bind.lazy_register_event(/lazy_event/on_z_transition, src, .proc/z_block) to_bind.lazy_register_event(/lazy_event/on_z_transition, src, .proc/z_block)
bound_soul = to_bind bound_soul = to_bind
@@ -380,7 +375,6 @@
var/active = 0 var/active = 0
var/max_steps = 4 var/max_steps = 4
var/current_step = 0 var/current_step = 0
var/spellcast_key = null
var/equip_cooldown = 50 var/equip_cooldown = 50
var/step_cooldown = 1 SECONDS // The step delay. var/step_cooldown = 1 SECONDS // The step delay.
@@ -426,14 +420,14 @@
equip_cooldown = initial(equip_cooldown) equip_cooldown = initial(equip_cooldown)
var/spell/fuckup/F = new var/spell/fuckup/F = new
H.add_spell(/spell/fuckup) H.add_spell(/spell/fuckup)
spellcast_key = H.on_spellcast.Add(F, "on_spellcast") H.lazy_register_event(/lazy_event/on_spellcast, F, /spell/fuckup/proc/on_spellcast)
return ..() return ..()
/obj/item/clothing/shoes/fuckup/unequipped(mob/living/carbon/human/H, equipped_slot) /obj/item/clothing/shoes/fuckup/unequipped(mob/living/carbon/human/H, equipped_slot)
equip_cooldown = initial(equip_cooldown) equip_cooldown = initial(equip_cooldown)
for (var/spell/fuckup/F in H.spell_list) for (var/spell/fuckup/F in H.spell_list)
H.remove_spell(F) H.remove_spell(F)
H.on_spellcast.Remove(spellcast_key) H.lazy_unregister_event(/lazy_event/on_spellcast, F, /spell/fuckup/proc/on_spellcast)
return ..() return ..()
// -- Fuckup boot spell // -- Fuckup boot spell
@@ -476,15 +470,12 @@
if (F) if (F)
F.deactivate() F.deactivate()
/spell/fuckup/proc/on_spellcast(var/list/arguments) /spell/fuckup/proc/on_spellcast(spell/spell, mob/user, list/targets)
var/spell/spell_casted = arguments["spell"] if (!ishuman(user))
var/mob/caster = arguments["user"]
if (!ishuman(caster))
return return
var/mob/living/carbon/human/H = caster var/mob/living/carbon/human/H = user
if (istype(spell_casted, /spell/aoe_turf/blink) || istype(spell_casted, /spell/targeted/ethereal_jaunt)) if (istype(spell, /spell/aoe_turf/blink) || istype(spell, /spell/targeted/ethereal_jaunt))
charge_counter = min(charge_counter, cooldown_min - cooldown_on_blink) charge_counter = min(charge_counter, cooldown_min - cooldown_on_blink)
if (istype(H.shoes, /obj/item/clothing/shoes/fuckup)) if (istype(H.shoes, /obj/item/clothing/shoes/fuckup))
var/obj/item/clothing/shoes/fuckup/F = H.shoes var/obj/item/clothing/shoes/fuckup/F = H.shoes
F.deactivate() F.deactivate()

View File

@@ -22,7 +22,7 @@
//delayer = null //delayer = null
if (viewing) if (viewing)
viewing.mob.on_logout.Remove("\ref[src]:mob_logout") viewing.mob.lazy_unregister_event(/lazy_event/on_logout, src, .proc/mob_logout)
..() ..()
@@ -36,7 +36,7 @@
viewing.images -= showing viewing.images -= showing
showing.Cut() showing.Cut()
to_chat(user, "You turn off \the [src].") to_chat(user, "You turn off \the [src].")
viewing.mob.on_logout.Remove("\ref[src]:mob_logout") viewing.mob.lazy_unregister_event(/lazy_event/on_logout, src, .proc/mob_logout)
viewing = null viewing = null
return return
@@ -47,14 +47,14 @@
showing = get_images(get_turf(user), viewing.view) showing = get_images(get_turf(user), viewing.view)
viewing.images |= showing viewing.images |= showing
//delayer.addDelay(2 SECONDS) // Should be enough to prevent lag due to spam. //delayer.addDelay(2 SECONDS) // Should be enough to prevent lag due to spam.
user.on_logout.Add(src, "mob_logout") user.lazy_register_event(/lazy_event/on_logout, src, .proc/mob_logout)
/obj/item/device/holomap/proc/mob_logout(var/list/args, var/mob/M) /obj/item/device/holomap/proc/mob_logout(mob/user)
if (viewing) if (viewing)
viewing.images -= showing viewing.images -= showing
viewing = null viewing = null
M.on_logout.Remove("\ref[src]:mob_logout") user.lazy_unregister_event(/lazy_event/on_logout, src, .proc/mob_logout)
visible_message("\The [src] turns off.") visible_message("\The [src] turns off.")
showing.Cut() showing.Cut()

View File

@@ -71,25 +71,22 @@
/obj/item/device/rcd/rpd/pickup(var/mob/living/L) /obj/item/device/rcd/rpd/pickup(var/mob/living/L)
..() ..()
L.lazy_register_event(/lazy_event/on_clickon, src, .proc/mob_onclickon)
hook_key = L.on_clickon.Add(src, "mob_onclickon")
/obj/item/device/rcd/rpd/dropped(var/mob/living/L) /obj/item/device/rcd/rpd/dropped(var/mob/living/L)
..() ..()
L.lazy_unregister_event(/lazy_event/on_clickon, src, .proc/mob_onclickon)
L.on_clickon.Remove(hook_key)
hook_key = null hook_key = null
// If the RPD is held, some modifiers are removed. // If the RPD is held, some modifiers are removed.
// This is to prevent the mouse wheel bindings (which require alt and such) // This is to prevent the mouse wheel bindings (which require alt and such)
// From being a pain to use, because alt click intercepts regular clicks. // from being a pain to use, because alt click intercepts regular clicks.
/obj/item/device/rcd/rpd/proc/mob_onclickon(var/list/event_args, var/mob/living/L) /obj/item/device/rcd/rpd/proc/mob_onclickon(mob/user, list/modifiers, atom/target)
if (L.get_active_hand() != src) if (user.get_active_hand() != src)
return return
if(istype(event_args["target"], /mob/living/carbon)) if(istype(target, /mob/living/carbon))
return //If we're alt clicking a carbon, let's assume we want to interact with them. return //If we're alt clicking a carbon, let's assume we want to interact with them.
var/list/modifiers = event_args["modifiers"]
modifiers -= list("alt", "shift", "ctrl") modifiers -= list("alt", "shift", "ctrl")
/obj/item/device/rcd/rpd/mech/Topic(var/href, var/list/href_list) /obj/item/device/rcd/rpd/mech/Topic(var/href, var/list/href_list)

View File

@@ -226,19 +226,19 @@
clear() clear()
if (viewing) if (viewing)
viewing.on_logout.Remove("\ref[src]:mob_logout") viewing.lazy_unregister_event(/lazy_event/on_logout, src, .proc/mob_logout)
viewing = null viewing = null
if (new_mob) if (new_mob)
new_mob.on_logout.Add(src, "mob_logout") new_mob.lazy_register_event(/lazy_event/on_logout, src, .proc/mob_logout)
viewing = new_mob viewing = new_mob
/obj/item/clothing/glasses/scanner/material/proc/mob_logout(var/list/args, var/mob/M) /obj/item/clothing/glasses/scanner/material/proc/mob_logout(mob/user)
if (M != viewing) if (user != viewing)
return return
clear() clear()
viewing.on_logout.Remove("\ref[src]:mob_logout") viewing.lazy_unregister_event(/lazy_event/on_logout, src, .proc/mob_logout)
viewing = null viewing = null
/obj/item/clothing/glasses/scanner/material/proc/get_images(var/turf/T, var/view) /obj/item/clothing/glasses/scanner/material/proc/get_images(var/turf/T, var/view)

View File

@@ -8,7 +8,6 @@
desc = "A vest designed to comfortably hold interchangable armor plates." desc = "A vest designed to comfortably hold interchangable armor plates."
icon_state = "tactical_armor" icon_state = "tactical_armor"
item_state = "tactical_armor" item_state = "tactical_armor"
var/event_key
var/obj/item/weapon/armor_plate/P var/obj/item/weapon/armor_plate/P
/obj/item/clothing/suit/armor/plate_carrier/get_armor(var/type) /obj/item/clothing/suit/armor/plate_carrier/get_armor(var/type)
@@ -26,13 +25,12 @@
/obj/item/clothing/suit/armor/plate_carrier/equipped(var/mob/user, var/slot) /obj/item/clothing/suit/armor/plate_carrier/equipped(var/mob/user, var/slot)
..() ..()
if(slot == slot_wear_suit) if(slot == slot_wear_suit)
event_key = user.on_damaged.Add(src, "handle_user_damage") user.lazy_register_event(/lazy_event/on_damaged, src, .proc/handle_user_damage)
/obj/item/clothing/suit/armor/plate_carrier/unequipped(mob/user, var/from_slot = null) /obj/item/clothing/suit/armor/plate_carrier/unequipped(mob/user, var/from_slot = null)
if(from_slot == slot_wear_suit) if(from_slot == slot_wear_suit)
user.on_damaged.Remove(event_key) user.lazy_unregister_event(/lazy_event/on_damaged, src, .proc/handle_user_damage)
event_key = null
..() ..()
/obj/item/clothing/suit/armor/plate_carrier/attack_self(mob/user) /obj/item/clothing/suit/armor/plate_carrier/attack_self(mob/user)
@@ -55,15 +53,13 @@
if(P) if(P)
to_chat(user, "<span class = 'notice'>It has \a [P] attached to it. <a HREF='?src=\ref[user];lookitem=\ref[P]'>Take a closer look.</a></span>") to_chat(user, "<span class = 'notice'>It has \a [P] attached to it. <a HREF='?src=\ref[user];lookitem=\ref[P]'>Take a closer look.</a></span>")
/obj/item/clothing/suit/armor/plate_carrier/proc/handle_user_damage(list/arguments) /obj/item/clothing/suit/armor/plate_carrier/proc/handle_user_damage(kind, amount)
if(!P) if(!P)
return return
var/amount = arguments["amount"]
if(amount <= 0) if(amount <= 0)
return return
var/type = arguments["type"]
P.receive_damage(type, amount) P.receive_damage(kind, amount)
if(P.gcDestroyed) if(P.gcDestroyed)
P = null P = null

View File

@@ -28,7 +28,6 @@
var/age = 0 var/age = 0
var/limited_growth = 0 var/limited_growth = 0
var/plant_damage_noun = "Thorns" var/plant_damage_noun = "Thorns"
var/tmp/on_resist_key //For resisting out of vines.
/obj/effect/plantsegment/creeper /obj/effect/plantsegment/creeper
limited_growth = 1 limited_growth = 1

View File

@@ -103,7 +103,7 @@
victim.vessel.remove_reagent(BLOOD, drawing) victim.vessel.remove_reagent(BLOOD, drawing)
last_special = world.time last_special = world.time
/obj/effect/plantsegment/proc/manual_unbuckle(mob/user as mob) /obj/effect/plantsegment/proc/manual_unbuckle(mob/user)
var/list/atom/movable/locked = get_locked(/datum/locking_category/plantsegment) var/list/atom/movable/locked = get_locked(/datum/locking_category/plantsegment)
if(locked && locked.len) if(locked && locked.len)
var/mob/M = locked[1] var/mob/M = locked[1]
@@ -137,7 +137,7 @@
if(!istype(M)) if(!istype(M))
return return
on_resist_key = M.on_resist.Add(src, "manual_unbuckle") M.lazy_register_event(/lazy_event/on_resist, src, .proc/manual_unbuckle)
last_special = world.time last_special = world.time
@@ -149,8 +149,7 @@
if(!istype(M)) if(!istype(M))
return return
M.on_resist.Remove(on_resist_key) M.lazy_unregister_event(/lazy_event/on_resist, src, .proc/manual_unbuckle)
on_resist_key = null
/obj/effect/plantsegment/proc/entangle_mob(var/mob/living/victim) /obj/effect/plantsegment/proc/entangle_mob(var/mob/living/victim)
if(!victim || victim.locked_to || !seed || seed.spread != 2 || is_locking(/datum/locking_category/plantsegment)) //How much of this is actually necessary, I wonder if(!victim || victim.locked_to || !seed || seed.spread != 2 || is_locking(/datum/locking_category/plantsegment)) //How much of this is actually necessary, I wonder

View File

@@ -33,7 +33,7 @@
/mob/proc/death(gibbed) /mob/proc/death(gibbed)
timeofdeath = world.time timeofdeath = world.time
INVOKE_EVENT(on_death, list("user" = src,"body_destroyed" = gibbed)) lazy_invoke_event(/lazy_event/on_death, list("user" = src, "body_destroyed" = gibbed))
living_mob_list -= src living_mob_list -= src
dead_mob_list += src dead_mob_list += src
stat_collection.add_death_stat(src) stat_collection.add_death_stat(src)

View File

@@ -55,7 +55,7 @@
amount = amount * brute_damage_modifier amount = amount * brute_damage_modifier
if(INVOKE_EVENT(on_damaged, list("type" = BRUTE, "amount" = amount))) if(lazy_invoke_event(/lazy_event/on_damaged, list("kind" = BRUTE, "amount" = amount)))
return 0 return 0
if(amount > 0) if(amount > 0)
@@ -67,7 +67,7 @@
/mob/living/carbon/human/adjustFireLoss(var/amount) /mob/living/carbon/human/adjustFireLoss(var/amount)
amount = amount * burn_damage_modifier amount = amount * burn_damage_modifier
if(INVOKE_EVENT(on_damaged, list("type" = BURN, "amount" = amount))) if(lazy_invoke_event(/lazy_event/on_damaged, list("kind" = BURN, "amount" = amount)))
return 0 return 0
if(amount > 0) if(amount > 0)
@@ -82,7 +82,7 @@
/mob/living/carbon/human/proc/adjustBruteLossByPart(var/amount, var/organ_name, var/obj/damage_source = null) /mob/living/carbon/human/proc/adjustBruteLossByPart(var/amount, var/organ_name, var/obj/damage_source = null)
amount = amount * brute_damage_modifier amount = amount * brute_damage_modifier
if(INVOKE_EVENT(on_damaged, list("type" = BRUTE, "amount" = amount))) if(lazy_invoke_event(/lazy_event/on_damaged, list("kind" = BRUTE, "amount" = amount)))
return 0 return 0
if (organ_name in organs_by_name) if (organ_name in organs_by_name)
@@ -99,7 +99,7 @@
/mob/living/carbon/human/proc/adjustFireLossByPart(var/amount, var/organ_name, var/obj/damage_source = null) /mob/living/carbon/human/proc/adjustFireLossByPart(var/amount, var/organ_name, var/obj/damage_source = null)
amount = amount * burn_damage_modifier amount = amount * burn_damage_modifier
if(INVOKE_EVENT(on_damaged, list("type" = BURN, "amount" = amount))) if(lazy_invoke_event(/lazy_event/on_damaged, list("kind" = BURN, "amount" = amount)))
return 0 return 0
if (organ_name in organs_by_name) if (organ_name in organs_by_name)
@@ -135,7 +135,7 @@
if(isslimeperson(src)) if(isslimeperson(src))
amount = 0 amount = 0
if(INVOKE_EVENT(on_damaged, list("type" = CLONE, "amount" = amount))) if(lazy_invoke_event(/lazy_event/on_damaged, list("kind" = CLONE, "amount" = amount)))
return 0 return 0
var/heal_prob = max(0, 80 - getCloneLoss()) var/heal_prob = max(0, 80 - getCloneLoss())
@@ -373,7 +373,7 @@ This function restores all organs.
if(blocked) if(blocked)
damage = (damage/100)*(100-blocked) damage = (damage/100)*(100-blocked)
if(!ignore_events && INVOKE_EVENT(on_damaged, list("type" = damagetype, "amount" = damage))) if(!ignore_events && lazy_invoke_event(/lazy_event/on_damaged, list("kind" = damagetype, "amount" = damage)))
return 0 return 0
switch(damagetype) switch(damagetype)

View File

@@ -469,8 +469,8 @@ emp_act
var/damage_blocked = 0 var/damage_blocked = 0
//INVOKE_EVENT may return null sometimes - this doesn't work nice with bitflags (which is what's being done here). Hence the !! operator - it turns a null into a 0. //INVOKE_EVENT may return null sometimes - this doesn't work nice with bitflags (which is what's being done here). Hence the !! operator - it turns a null into a 0.
var/brute_resolved = !!INVOKE_EVENT(on_damaged, list("type" = BRUTE, "amount" = b_loss)) var/brute_resolved = !!lazy_invoke_event(/lazy_event/on_damaged, list("kind" = BRUTE, "amount" = b_loss))
var/burn_resolved = !!INVOKE_EVENT(on_damaged, list("type" = BURN, "amount" = f_loss)) var/burn_resolved = !!lazy_invoke_event(/lazy_event/on_damaged, list("kind" = BURN, "amount" = f_loss))
damage_blocked |= (brute_resolved | burn_resolved) damage_blocked |= (brute_resolved | burn_resolved)
if(damage_blocked) if(damage_blocked)

View File

@@ -18,8 +18,6 @@
immune_system = new (src) immune_system = new (src)
on_resist = new(owner = src)
/mob/living/Destroy() /mob/living/Destroy()
for(var/mob/living/silicon/robot/mommi/MoMMI in player_list) for(var/mob/living/silicon/robot/mommi/MoMMI in player_list)
for(var/image/I in static_overlays) for(var/image/I in static_overlays)
@@ -44,10 +42,6 @@
qdel(immune_system) qdel(immune_system)
immune_system = null immune_system = null
if(on_resist)
qdel(on_resist)
on_resist = null
. = ..() . = ..()
/mob/living/examine(var/mob/user, var/size = "", var/show_name = TRUE, var/show_icon = TRUE) //Show the mob's size and whether it's been butchered /mob/living/examine(var/mob/user, var/size = "", var/show_name = TRUE, var/show_icon = TRUE) //Show the mob's size and whether it's been butchered
@@ -250,7 +244,7 @@
if(status_flags & GODMODE) if(status_flags & GODMODE)
return 0 //godmode return 0 //godmode
if(INVOKE_EVENT(on_damaged, list("type" = BRUTE, "amount" = amount))) if(lazy_invoke_event(/lazy_event/on_damaged, list("kind" = BRUTE, "amount" = amount)))
return 0 return 0
bruteloss = min(max(bruteloss + (amount * brute_damage_modifier), 0),(maxHealth*2)) bruteloss = min(max(bruteloss + (amount * brute_damage_modifier), 0),(maxHealth*2))
@@ -262,7 +256,7 @@
if(status_flags & GODMODE) if(status_flags & GODMODE)
return 0 //godmode return 0 //godmode
if(INVOKE_EVENT(on_damaged, list("type" = OXY, "amount" = amount))) if(lazy_invoke_event(/lazy_event/on_damaged, list("kind" = OXY, "amount" = amount)))
return 0 return 0
oxyloss = min(max(oxyloss + (amount * oxy_damage_modifier), 0),(maxHealth*2)) oxyloss = min(max(oxyloss + (amount * oxy_damage_modifier), 0),(maxHealth*2))
@@ -279,7 +273,7 @@
if(status_flags & GODMODE) if(status_flags & GODMODE)
return 0 //godmode return 0 //godmode
if(INVOKE_EVENT(on_damaged, list("type" = TOX, "amount" = amount))) if(lazy_invoke_event(/lazy_event/on_damaged, list("kind" = TOX, "amount" = amount)))
return 0 return 0
var/mult = 1 var/mult = 1
@@ -303,7 +297,7 @@
return 0 //godmode return 0 //godmode
if(mutations.Find(M_RESIST_HEAT)) if(mutations.Find(M_RESIST_HEAT))
return 0 return 0
if(INVOKE_EVENT(on_damaged, list("type" = BURN, "amount" = amount))) if(lazy_invoke_event(/lazy_event/on_damaged, list("kind" = BURN, "amount" = amount)))
return 0 return 0
fireloss = min(max(fireloss + (amount * burn_damage_modifier), 0),(maxHealth*2)) fireloss = min(max(fireloss + (amount * burn_damage_modifier), 0),(maxHealth*2))
@@ -315,7 +309,7 @@
if(status_flags & GODMODE) if(status_flags & GODMODE)
return 0 //godmode return 0 //godmode
if(INVOKE_EVENT(on_damaged, list("type" = CLONE, "amount" = amount))) if(lazy_invoke_event(/lazy_event/on_damaged, list("kind" = CLONE, "amount" = amount)))
return 0 return 0
if(ishuman(src)) if(ishuman(src))
@@ -337,7 +331,7 @@
if(status_flags & GODMODE) if(status_flags & GODMODE)
return 0 //godmode return 0 //godmode
if(INVOKE_EVENT(on_damaged, list("type" = BRAIN, "amount" = amount))) if(lazy_invoke_event(/lazy_event/on_damaged, list("kind" = BRAIN, "amount" = amount)))
return 0 return 0
brainloss = min(max(brainloss + (amount * brain_damage_modifier), 0),(maxHealth*2)) brainloss = min(max(brainloss + (amount * brain_damage_modifier), 0),(maxHealth*2))
@@ -777,9 +771,6 @@ Thanks.
hook.override_starting_X-- hook.override_starting_X--
hook.override_target_X-- hook.override_target_X--
/mob/living
var/event/on_resist
/mob/living/verb/resist() /mob/living/verb/resist()
set name = "Resist" set name = "Resist"
set category = "IC" set category = "IC"
@@ -787,7 +778,7 @@ Thanks.
if(!isliving(usr) || usr.special_delayer.blocked()) if(!isliving(usr) || usr.special_delayer.blocked())
return return
INVOKE_EVENT(on_resist, list()) lazy_invoke_event(/lazy_event/on_resist, list("user" = src))
delayNextSpecial(10) // Special delay, a cooldown to prevent spamming too much. delayNextSpecial(10) // Special delay, a cooldown to prevent spamming too much.

View File

@@ -39,7 +39,7 @@
return amount return amount
/mob/living/silicon/robot/adjustBruteLoss(var/amount) /mob/living/silicon/robot/adjustBruteLoss(var/amount)
if(INVOKE_EVENT(on_damaged, list("type" = BRUTE, "amount" = amount))) if(lazy_invoke_event(/lazy_event/on_damaged, list("kind" = BRUTE, "amount" = amount)))
return FALSE return FALSE
if(amount > 0) if(amount > 0)
take_overall_damage(amount, 0) take_overall_damage(amount, 0)
@@ -47,7 +47,7 @@
heal_overall_damage(-amount, 0) heal_overall_damage(-amount, 0)
/mob/living/silicon/robot/adjustFireLoss(var/amount) /mob/living/silicon/robot/adjustFireLoss(var/amount)
if(INVOKE_EVENT(on_damaged, list("type" = BURN, "amount" = amount))) if(lazy_invoke_event(/lazy_event/on_damaged, list("kind" = BURN, "amount" = amount)))
return FALSE return FALSE
if(amount > 0) if(amount > 0)
take_overall_damage(0, amount) take_overall_damage(0, amount)

View File

@@ -582,7 +582,7 @@ var/global/list/animal_count = list() //Stores types, and amount of animals of t
/mob/living/simple_animal/adjustBruteLoss(damage) /mob/living/simple_animal/adjustBruteLoss(damage)
if(INVOKE_EVENT(on_damaged, list("type" = BRUTE, "amount" = damage))) if(lazy_invoke_event(/lazy_event/on_damaged, list("kind" = BRUTE, "amount" = damage)))
return 0 return 0
if(skinned()) if(skinned())
damage = damage * 2 damage = damage * 2
@@ -598,7 +598,7 @@ var/global/list/animal_count = list() //Stores types, and amount of animals of t
return 0 return 0
if(mutations.Find(M_RESIST_HEAT)) if(mutations.Find(M_RESIST_HEAT))
return 0 return 0
if(INVOKE_EVENT(on_damaged, list("type" = BURN, "amount" = damage))) if(lazy_invoke_event(/lazy_event/on_damaged, list("kind" = BURN, "amount" = damage)))
return 0 return 0
if(skinned()) if(skinned())
damage = damage * 2 damage = damage * 2

View File

@@ -52,6 +52,6 @@
send2adminirc("[key_name(src, showantag = FALSE)] logged out - no more admins online.") send2adminirc("[key_name(src, showantag = FALSE)] logged out - no more admins online.")
send2admindiscord("[key_name(src, showantag = FALSE)] logged out. **No more non-AFK admins online.** - **[admin_number_afk]** AFK", TRUE) send2admindiscord("[key_name(src, showantag = FALSE)] logged out. **No more non-AFK admins online.** - **[admin_number_afk]** AFK", TRUE)
INVOKE_EVENT(on_logout, list()) lazy_invoke_event(/lazy_event/on_logout, list("user" = src))
..() ..()

View File

@@ -29,16 +29,6 @@
for(var/M in mind.heard_before) for(var/M in mind.heard_before)
if(mind.heard_before[M] == src) if(mind.heard_before[M] == src)
mind.heard_before[M] = null mind.heard_before[M] = null
if(on_spellcast)
on_spellcast.holder = null
if(on_uattack)
on_uattack.holder = null
if(on_ruattack)
on_ruattack.holder = null
if(on_damaged)
on_damaged.holder = null
if(on_death)
on_death.holder = null
if(on_bumping) if(on_bumping)
on_bumping.holder = null on_bumping.holder = null
if(on_bumped) if(on_bumped)
@@ -79,24 +69,10 @@
hud_used = null hud_used = null
for(var/atom/movable/leftovers in src) for(var/atom/movable/leftovers in src)
qdel(leftovers) qdel(leftovers)
qdel(on_logout)
on_logout = null
qdel(on_spellcast)
qdel(on_uattack)
qdel(on_ruattack)
qdel(on_damaged)
qdel(on_clickon)
qdel(on_death)
qdel(on_bumping) qdel(on_bumping)
qdel(on_bumped) qdel(on_bumped)
qdel(on_touched) qdel(on_touched)
on_spellcast = null
on_uattack = null
on_ruattack = null
on_damaged = null
on_clickon = null
on_death = null
on_bumping = null on_bumping = null
on_bumped = null on_bumped = null
on_touched = null on_touched = null
@@ -291,13 +267,6 @@
living_mob_list += src living_mob_list += src
store_position() store_position()
on_spellcast = new(owner = src)
on_uattack = new(owner = src)
on_ruattack = new(owner = src)
on_logout = new(owner = src)
on_damaged = new(owner = src)
on_clickon = new(owner = src)
on_death = new(owner = src)
on_bumping = new(owner = src) on_bumping = new(owner = src)
on_bumped = new(owner = src) on_bumped = new(owner = src)
on_touched = new(owner = src) on_touched = new(owner = src)
@@ -1957,8 +1926,7 @@ mob/proc/on_foot()
//High order proc to remove a mobs spell channeling, removes channeling fully //High order proc to remove a mobs spell channeling, removes channeling fully
/mob/proc/remove_spell_channeling() /mob/proc/remove_spell_channeling()
if(spell_channeling) if(spell_channeling)
var/spell/thespell = on_uattack.handlers[spell_channeling][EVENT_OBJECT_INDEX] spell_channeling.channel_spell(force_remove = 1)
thespell.channel_spell(force_remove = 1)
return 1 return 1
return 0 return 0

View File

@@ -272,20 +272,12 @@
penetration_dampening = 7 penetration_dampening = 7
var/list/languages[0] var/list/languages[0]
var/event/on_spellcast
var/event/on_uattack
var/event/on_ruattack //on restrained unarmed attack
var/event/on_logout
var/event/on_damaged
var/event/on_death
var/event/on_bumping //We bumped someone var/event/on_bumping //We bumped someone
var/event/on_bumped //We got bumped var/event/on_bumped //We got bumped
var/event/on_touched // We got touched by anything var/event/on_touched // We got touched by anything
// Allows overiding click modifiers and such.
var/event/on_clickon
var/list/alphas = list() var/list/alphas = list()
var/spell_channeling var/spell/spell_channeling // The spell that's currently being channeled
var/see_in_dark_override = 0 //for general guaranteed modification of these variables var/see_in_dark_override = 0 //for general guaranteed modification of these variables
var/see_invisible_override = 0 var/see_invisible_override = 0

View File

@@ -4,7 +4,6 @@
icon = 'icons/obj/xenoarchaeology.dmi' icon = 'icons/obj/xenoarchaeology.dmi'
icon_state = "Essence_imprinter_idle" icon_state = "Essence_imprinter_idle"
var/datum/dna2/record/R var/datum/dna2/record/R
var/soulbound
var/mob/bound_soul var/mob/bound_soul
var/ready var/ready
@@ -13,10 +12,9 @@
set_light(3,5,LIGHT_COLOR_RED) set_light(3,5,LIGHT_COLOR_RED)
/obj/structure/essence_printer/Destroy() /obj/structure/essence_printer/Destroy()
if(bound_soul && bound_soul.on_death) if(bound_soul)
bound_soul.on_death.Remove(soulbound) bound_soul.lazy_unregister_event(/lazy_event/on_death, src, .proc/print)
bound_soul = null bound_soul = null
soulbound = null
..() ..()
/obj/structure/essence_printer/proc/bind(var/mob/living/carbon/human/H) /obj/structure/essence_printer/proc/bind(var/mob/living/carbon/human/H)
@@ -34,10 +32,10 @@
R.types=DNA2_BUF_UI|DNA2_BUF_UE|DNA2_BUF_SE R.types=DNA2_BUF_UI|DNA2_BUF_UE|DNA2_BUF_SE
R.languages = H.languages.Copy() R.languages = H.languages.Copy()
R.name=R.dna.real_name R.name=R.dna.real_name
if(bound_soul && bound_soul.on_death) if(bound_soul)
bound_soul.on_death.Remove(soulbound) bound_soul.lazy_unregister_event(/lazy_event/on_death, src, .proc/print)
bound_soul = H bound_soul = H
soulbound = H.on_death.Add(src, "print") H.lazy_register_event(/lazy_event/on_death, src, .proc/print)
/obj/structure/essence_printer/attack_ghost(mob/user) /obj/structure/essence_printer/attack_ghost(mob/user)
if(!ready) if(!ready)
@@ -56,11 +54,11 @@
to_chat(H, "<span class = 'notice'>You bind your essence to \the [src].</span>") to_chat(H, "<span class = 'notice'>You bind your essence to \the [src].</span>")
bind(H) bind(H)
/obj/structure/essence_printer/proc/print(list/arguments) /obj/structure/essence_printer/proc/print(mob/user, body_destroyed)
do_flick(src,"Essence_imprinter_scan_start",10) do_flick(src,"Essence_imprinter_scan_start",10)
ready = FALSE ready = FALSE
icon_state = "Essence_imprinter_scan_loop" icon_state = "Essence_imprinter_scan_loop"
var/mob/living/carbon/human/previous = arguments["user"] var/mob/living/carbon/human/previous = user
var/mob/living/carbon/human/H = new /mob/living/carbon/human(src, R.dna.species, delay_ready_dna = TRUE) var/mob/living/carbon/human/H = new /mob/living/carbon/human(src, R.dna.species, delay_ready_dna = TRUE)
H.dna = R.dna.Clone() H.dna = R.dna.Clone()
H.dna.flavor_text = R.dna.flavor_text H.dna.flavor_text = R.dna.flavor_text

View File

@@ -13,7 +13,6 @@
var/contained = 0 var/contained = 0
var/artifact_id = "" var/artifact_id = ""
anchored = 0 anchored = 0
var/event/on_attackhand
var/event/on_attackby var/event/on_attackby
var/event/on_explode var/event/on_explode
var/event/on_projectile var/event/on_projectile
@@ -25,7 +24,6 @@
else else
artifact_id = "[pick("kappa","sigma","antaeres","beta","omicron","iota","epsilon","omega","gamma","delta","tau","alpha")]-[rand(100,999)]" artifact_id = "[pick("kappa","sigma","antaeres","beta","omicron","iota","epsilon","omega","gamma","delta","tau","alpha")]-[rand(100,999)]"
on_attackhand = new(owner = src)
on_attackby = new(owner = src) on_attackby = new(owner = src)
on_explode = new(owner = src) on_explode = new(owner = src)
on_projectile = new(owner = src) on_projectile = new(owner = src)
@@ -141,7 +139,7 @@
return return
src.add_fingerprint(user) src.add_fingerprint(user)
on_attackhand.Invoke(list(user, "TOUCH")) lazy_invoke_event(/lazy_event/on_attackhand, list("user" = user, "target" = src))
to_chat(user, "<b>You touch [src].</b>") to_chat(user, "<b>You touch [src].</b>")
/obj/machinery/artifact/attackby(obj/item/weapon/W as obj, mob/living/user as mob) /obj/machinery/artifact/attackby(obj/item/weapon/W as obj, mob/living/user as mob)
@@ -157,7 +155,7 @@
var/warn = 0 var/warn = 0
if (prob(50)) if (prob(50))
on_attackhand.Invoke(list(M, "BUMPED")) lazy_invoke_event(/lazy_event/on_bumped, list("user" = M, "target" = src))
warn = 1 warn = 1
if(warn) if(warn)
to_chat(M, "<b>You accidentally touch [src].<b>") to_chat(M, "<b>You accidentally touch [src].<b>")
@@ -191,7 +189,6 @@
/obj/machinery/artifact/Destroy() /obj/machinery/artifact/Destroy()
qdel(primary_effect); primary_effect = null qdel(primary_effect); primary_effect = null
qdel(secondary_effect); secondary_effect = null qdel(secondary_effect); secondary_effect = null
qdel(on_attackhand); on_attackhand = null
qdel(on_attackby); on_attackby = null qdel(on_attackby); on_attackby = null
qdel(on_explode); on_explode = null qdel(on_explode); on_explode = null
qdel(on_projectile); on_projectile = null qdel(on_projectile); on_projectile = null

View File

@@ -13,7 +13,7 @@
/datum/artifact_trigger/pay2use/New() /datum/artifact_trigger/pay2use/New()
..() ..()
key_attackhand = my_artifact.on_attackhand.Add(src, "owner_attackhand") my_artifact.lazy_register_event(/lazy_event/on_attackhand, src, .proc/owner_attackhand)
key_attackby = my_artifact.on_attackby.Add(src, "owner_attackby") key_attackby = my_artifact.on_attackby.Add(src, "owner_attackby")
mode = rand(0,2) mode = rand(0,2)
reconnect_database() reconnect_database()
@@ -190,7 +190,7 @@
payviacard(500, 3600, usr) payviacard(500, 3600, usr)
/datum/artifact_trigger/pay2use/Destroy() /datum/artifact_trigger/pay2use/Destroy()
my_artifact.on_attackhand.Remove(key_attackhand) my_artifact.lazy_unregister_event(/lazy_event/on_attackhand, src, .proc/owner_attackhand)
my_artifact.on_attackby.Remove(key_attackby) my_artifact.on_attackby.Remove(key_attackby)
linked_db = null linked_db = null
..() ..()

View File

@@ -1,25 +1,29 @@
/datum/artifact_trigger/touch /datum/artifact_trigger/touch
triggertype = TRIGGER_TOUCH triggertype = TRIGGER_TOUCH
scanned_trigger = SCAN_PHYSICAL scanned_trigger = SCAN_PHYSICAL
var/key_attackhand
/datum/artifact_trigger/touch/New() /datum/artifact_trigger/touch/New()
..() ..()
key_attackhand = my_artifact.on_attackhand.Add(src, "owner_attackhand") my_artifact.lazy_register_event(/lazy_event/on_attackhand, src, .proc/owner_attackhand)
my_artifact.lazy_register_event(/lazy_event/on_bumped, src, .proc/owner_bumped)
/datum/artifact_trigger/touch/proc/owner_attackhand(var/list/event_args, var/source) /datum/artifact_trigger/touch/proc/activate(mob/user, context)
var/toucher = event_args[1] Triggered(user, "TOUCH", 0)
var/context = event_args[2]
Triggered(toucher, context, 0)
if(my_effect.effect == ARTIFACT_EFFECT_TOUCH) if(my_effect.effect == ARTIFACT_EFFECT_TOUCH)
if (my_effect.IsContained()) if (my_effect.IsContained())
my_effect.Blocked() my_effect.Blocked()
else if(my_effect.IsPrimary() || prob(25)) else if(my_effect.IsPrimary() || prob(25))
my_effect.DoEffectTouch(toucher) my_effect.DoEffectTouch(user)
my_artifact.investigation_log(I_ARTIFACT, "|| effect [my_effect.artifact_id]([my_effect]) triggered by [context] ([my_effect.trigger]) || touched by [key_name(toucher)].") my_artifact.investigation_log(I_ARTIFACT, "|| effect [my_effect.artifact_id]([my_effect]) triggered by [context] ([my_effect.trigger]) || touched by [key_name(user)].")
/datum/artifact_trigger/touch/proc/owner_bumped(mob/user, atom/target)
activate(user, "BUMPED")
/datum/artifact_trigger/touch/proc/owner_attackhand(mob/user, atom/target)
activate(user, "TOUCH")
/datum/artifact_trigger/touch/Destroy() /datum/artifact_trigger/touch/Destroy()
my_artifact.on_attackhand.Remove(key_attackhand) my_artifact.lazy_unregister_event(/lazy_event/on_attackhand, src, .proc/owner_attackhand)
my_artifact.lazy_unregister_event(/lazy_event/on_bumped, src, .proc/owner_bumped)
..() ..()

View File

@@ -33,7 +33,7 @@
/spell/aoe_turf/conjure/arcane_golem/cast(list/targets, mob/user) /spell/aoe_turf/conjure/arcane_golem/cast(list/targets, mob/user)
//Link the golem to its master //Link the golem to its master
newVars = list("master_spell" = src) newVars = list("master_spell" = src)
user.on_spellcast.Add(src, "copy_spellcast") user.lazy_register_event(/lazy_event/on_spellcast, src, .proc/copy_spellcast)
check_golems() check_golems()
@@ -60,9 +60,8 @@
to_chat(user, "<span class='sinister'>You infuse \the [AG] with your mana and knowledge. If it dies, your arcane abilities will be affected.</span>") to_chat(user, "<span class='sinister'>You infuse \the [AG] with your mana and knowledge. If it dies, your arcane abilities will be affected.</span>")
src.golems.Add(AG) src.golems.Add(AG)
/spell/aoe_turf/conjure/arcane_golem/proc/copy_spellcast(list/arguments) /spell/aoe_turf/conjure/arcane_golem/proc/copy_spellcast(spell/spell, mob/user, list/targets)
var/spell/spell_to_copy = arguments["spell"] var/spell/spell_to_copy = spell
var/target = arguments["target"]
if(!istype(spell_to_copy) || !istype(spell_to_copy.holder)) if(!istype(spell_to_copy) || !istype(spell_to_copy.holder))
return return
@@ -76,12 +75,10 @@
var/cast_dir = spell_to_copy.holder.dir var/cast_dir = spell_to_copy.holder.dir
//Convert the target argument to a list of targets //Convert the target argument to a list of targets
var/list/targets if(islist(targets))
if(istype(target, /list)) targets = targets.Copy()
var/list/L = target else if(!isnull(targets))
targets = L.Copy() targets = list(targets)
else if(!isnull(target))
targets = list(target)
for(var/mob/living/simple_animal/hostile/arcane_golem/AG in golems) for(var/mob/living/simple_animal/hostile/arcane_golem/AG in golems)
var/spell/cast_spell = spell_to_copy var/spell/cast_spell = spell_to_copy

View File

@@ -113,7 +113,7 @@ var/global/list/falltempoverlays = list()
if(C.mob) if(C.mob)
C.mob.see_fall() C.mob.see_fall()
INVOKE_EVENT(user.on_spellcast, list("spell" = src, "target" = targets, "user" = user)) user.lazy_invoke_event(/lazy_event/on_spellcast, list("spell" = src, "user" = user, "targets" = targets))
//animate(aoe_underlay, transform = null, time = 2) //animate(aoe_underlay, transform = null, time = 2)
//var/oursound = (invocation == "ZA WARUDO" ? 'sound/effects/theworld.ogg' :'sound/effects/fall.ogg') //var/oursound = (invocation == "ZA WARUDO" ? 'sound/effects/theworld.ogg' :'sound/effects/fall.ogg')

View File

@@ -39,18 +39,17 @@
for(var/mob/living/T in view(L)) for(var/mob/living/T in view(L))
if(!T.isDead() && (T != L)) if(!T.isDead() && (T != L))
to_chat(T, "<span class='sinister'>An unholy charm binds your life to [L]. While the spell is active, any pain \he receive\s will be redirected to you.</span>") to_chat(T, "<span class='sinister'>An unholy charm binds your life to [L]. While the spell is active, any pain \he receive\s will be redirected to you.</span>")
var/event_key = L.on_damaged.Add(src, "reflect") L.lazy_register_event(/lazy_event/on_damaged, src, .proc/reflect)
L.overlays.Add(user_overlay) L.overlays.Add(user_overlay)
playsound(L, 'sound/effects/vampire_intro.ogg', 80, 1, "vary" = 0) playsound(L, 'sound/effects/vampire_intro.ogg', 80, 1, "vary" = 0)
spawn(duration) spawn(duration)
to_chat(L, "<span class='sinister'>Your life essence is no longer bound to this plane. You won't reflect received damage to your enemies anymore.</span>") to_chat(L, "<span class='sinister'>Your life essence is no longer bound to this plane. You won't reflect received damage to your enemies anymore.</span>")
L.on_damaged.Remove(event_key) L.lazy_unregister_event(/lazy_event/on_damaged, src, .proc/reflect)
L.overlays.Remove(user_overlay) L.overlays.Remove(user_overlay)
/spell/mirror_of_pain/proc/reflect(list/arguments) /spell/mirror_of_pain/proc/reflect(kind, amount)
var/damage_type = arguments["type"] var/damage_type = kind
var/amount = arguments["amount"]
if(amount <= 0) if(amount <= 0)
return return

View File

@@ -192,7 +192,7 @@ var/list/spells = typesof(/spell) //needed for the badmin verb for now
invocation(user, targets) invocation(user, targets)
user.attack_log += text("\[[time_stamp()]\] <font color='red'>[user.real_name] ([user.ckey]) cast the spell [name].</font>") user.attack_log += text("\[[time_stamp()]\] <font color='red'>[user.real_name] ([user.ckey]) cast the spell [name].</font>")
INVOKE_EVENT(user.on_spellcast, list("spell" = src, "target" = targets, "user" = user)) user.lazy_invoke_event(/lazy_event/on_spellcast, list("spell" = src, "user" = user, "targets" = targets))
if(prob(critfailchance)) if(prob(critfailchance))
critfail(targets, user) critfail(targets, user)
@@ -210,48 +210,36 @@ var/list/spells = typesof(/spell) //needed for the badmin verb for now
if(!cast_check(skipcharge, user)) if(!cast_check(skipcharge, user))
return 0 return 0
user.remove_spell_channeling() //In case we're swapping from an older spell to this new one user.remove_spell_channeling() //In case we're swapping from an older spell to this new one
user.spell_channeling = user.on_uattack.Add(src, "channeled_spell") user.lazy_register_event(/lazy_event/on_uattack, src, .proc/channeled_spell)
user.spell_channeling = src
if(spell_flags & CAN_CHANNEL_RESTRAINED) if(spell_flags & CAN_CHANNEL_RESTRAINED)
user.spell_channeling = user.on_ruattack.Add(src, "channeled_spell") user.lazy_register_event(/lazy_event/on_ruattack, src, .proc/channeled_spell)
user.spell_channeling = src
connected_button.name = "(Ready) [name]" connected_button.name = "(Ready) [name]"
currently_channeled = 1 currently_channeled = 1
connected_button.add_channeling() connected_button.add_channeling()
else else
var/event/E = user.on_uattack user.lazy_unregister_event(/lazy_event/on_uattack, src, .proc/channeled_spell)
E.handlers.Remove(user.spell_channeling) user.lazy_unregister_event(/lazy_event/on_ruattack, src, .proc/channeled_spell)
var/event/ER = user.on_ruattack
if(ER)
ER.handlers.Remove(user.spell_channeling)
user.spell_channeling = null user.spell_channeling = null
currently_channeled = 0 currently_channeled = 0
connected_button.remove_channeling() connected_button.remove_channeling()
connected_button.name = name connected_button.name = name
return 1 return 1
/spell/proc/channeled_spell(var/list/args) /spell/proc/channeled_spell(atom/atom)
var/event/E = args["event"] var/list/target = list(atom)
if(!currently_channeled)
E.handlers.Remove("\ref[src]:channeled_spell")
return 0
var/atom/A = args["atom"]
if(E.holder != holder)
E.handlers.Remove("\ref[src]:channeled_spell")
return 0
var/list/target = list(A)
var/mob/user = holder var/mob/user = holder
user.attack_delayer.delayNext(0) user.attack_delayer.delayNext(0)
if(cast_check(1, holder) && is_valid_target(A, user)) if(cast_check(1, holder) && is_valid_target(atom, user))
target = before_cast(target, user) //applies any overlays and effects target = before_cast(target, user) //applies any overlays and effects
if(!target.len) //before cast has rechecked what we can target if(!target.len) //before cast has rechecked what we can target
return return
invocation(user, target) invocation(user, target)
user.attack_log += text("\[[time_stamp()]\] <font color='red'>[user.real_name] ([user.ckey]) cast the spell [name].</font>") user.attack_log += text("\[[time_stamp()]\] <font color='red'>[user.real_name] ([user.ckey]) cast the spell [name].</font>")
INVOKE_EVENT(user.on_spellcast, list("spell" = src, "target" = target, "user" = user)) user.lazy_invoke_event(/lazy_event/on_spellcast, list("spell" = src, "user" = user, "targets" = target))
if(prob(critfailchance)) if(prob(critfailchance))
critfail(target, holder) critfail(target, holder)