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
var/list/variables_not_to_be_copied = list(
"type","loc","locs","vars","parent","parent_type","verbs","ckey","key",
"group","on_density_change","registered_events",
"on_resist",
"on_spellcast","on_uattack","on_ruattack","on_logout","on_damaged",
"on_death","on_clickon","on_attackhand","on_attackby",
"group","registered_events",
"on_attackby",
"on_explode","on_projectile","in_chamber","power_supply","contents",
"x","y","z"
)

View File

@@ -90,6 +90,68 @@
// atom/atom: the atom whose density changed.
/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
/// Associative list of type path -> list(),
/// where the type path is a descendant of /event_type.

View File

@@ -63,7 +63,7 @@
RestrainedClickOn(A)
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
A.add_hiddenprint(src)
A.attack_ai(src)
@@ -115,4 +115,4 @@
return
/obj/machinery/door/firedoor/AIShiftClick(var/mob/living/silicon/ai/user) // Allows examining firelocks
examine(user)
examine(user)

View File

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

View File

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

View File

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

View File

@@ -3,13 +3,12 @@
var/mob/controller
var/atom/movable/controlled
var/control_flags = 0
var/damaged_event_key
var/is_controlled = FALSE //Whether we're in strict control
/datum/control/New(var/mob/new_controller, var/atom/new_controlled)
..()
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
/datum/control/Destroy()
@@ -20,8 +19,7 @@
controlled = null
..()
/datum/control/proc/user_damaged(list/arguments)
var/amount = arguments["amount"]
/datum/control/proc/user_damaged(kind, amount)
if(amount > 0 && control_flags & REVERT_ON_CONTROLLER_DAMAGED)
break_control()
@@ -123,4 +121,4 @@
var/total_offset = (60 + (100*(blade.blood/blade.maxblood))) * PIXEL_MULTIPLIER
controller.hud_used.mymob.gui_icons.soulblade_bloodbar.transform = M
controller.hud_used.mymob.gui_icons.soulblade_bloodbar.screen_loc = "WEST,CENTER-[8-round(total_offset/WORLD_ICON_SIZE)]:[total_offset%WORLD_ICON_SIZE]"
controller.hud_used.mymob.gui_icons.soulblade_coverLEFT.maptext = "[blade.blood]"
controller.hud_used.mymob.gui_icons.soulblade_coverLEFT.maptext = "[blade.blood]"

View File

@@ -196,7 +196,6 @@
icon = 'icons/obj/wizard.dmi'
icon_state = "phylactery_empty_noglow"
var/charges = 0
var/soulbound
var/mindbound
var/mob/bound_soul
var/datum/mind/bound_mind
@@ -220,11 +219,9 @@
..()
/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)
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>")
spawn(rand(5 SECONDS, 15 SECONDS))
bound_soul.dust()
@@ -234,7 +231,7 @@
/obj/item/phylactery/update_icon()
if(soulbound)
if(bound_soul)
if(charges >= 1)
icon_state = "phylactery"
else
@@ -243,7 +240,7 @@
icon_state = "phylactery_empty_noglow"
/obj/item/phylactery/attack_self(mob/user)
if(!soulbound && ishuman(user))
if(!bound_soul && ishuman(user))
var/mob/living/carbon/human/H = user
var/datum/organ/external/E = H.get_active_hand_organ()
if(locate(/datum/wound) in E.wounds)
@@ -256,12 +253,12 @@
else
..()
/obj/item/phylactery/proc/revive_soul(list/arguments)
/obj/item/phylactery/proc/revive_soul(mob/user, body_destroyed)
if(charges <= 0)
unbind_mind()
unbind()
return
var/mob/living/original = arguments["user"]
var/mob/living/original = user
if(original.mind)
var/mob/living/carbon/human/H = new /mob/living/carbon/human/lich(src)
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/under/lightpurple(H), slot_w_uniform)
original.mind.transfer_to(H) // rebinding on transfer now handled by mind
if(!arguments["body_destroyed"])
if(!body_destroyed)
original.dust()
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)
@@ -289,14 +286,12 @@
/obj/item/phylactery/proc/unbind()
if(bound_soul)
bound_soul.lazy_unregister_event(/lazy_event/on_z_transition, src, .proc/z_block)
if(bound_soul.on_death)
bound_soul.on_death.Remove(soulbound)
soulbound = null
bound_soul.lazy_unregister_event(/lazy_event/on_death, src, .proc/revive_soul)
bound_soul = null
update_icon()
/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)
bound_soul = to_bind
@@ -380,7 +375,6 @@
var/active = 0
var/max_steps = 4
var/current_step = 0
var/spellcast_key = null
var/equip_cooldown = 50
var/step_cooldown = 1 SECONDS // The step delay.
@@ -426,14 +420,14 @@
equip_cooldown = initial(equip_cooldown)
var/spell/fuckup/F = new
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 ..()
/obj/item/clothing/shoes/fuckup/unequipped(mob/living/carbon/human/H, equipped_slot)
equip_cooldown = initial(equip_cooldown)
for (var/spell/fuckup/F in H.spell_list)
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 ..()
// -- Fuckup boot spell
@@ -476,15 +470,12 @@
if (F)
F.deactivate()
/spell/fuckup/proc/on_spellcast(var/list/arguments)
var/spell/spell_casted = arguments["spell"]
var/mob/caster = arguments["user"]
if (!ishuman(caster))
/spell/fuckup/proc/on_spellcast(spell/spell, mob/user, list/targets)
if (!ishuman(user))
return
var/mob/living/carbon/human/H = caster
if (istype(spell_casted, /spell/aoe_turf/blink) || istype(spell_casted, /spell/targeted/ethereal_jaunt))
var/mob/living/carbon/human/H = user
if (istype(spell, /spell/aoe_turf/blink) || istype(spell, /spell/targeted/ethereal_jaunt))
charge_counter = min(charge_counter, cooldown_min - cooldown_on_blink)
if (istype(H.shoes, /obj/item/clothing/shoes/fuckup))
var/obj/item/clothing/shoes/fuckup/F = H.shoes
F.deactivate()

View File

@@ -22,7 +22,7 @@
//delayer = null
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
showing.Cut()
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
return
@@ -47,14 +47,14 @@
showing = get_images(get_turf(user), viewing.view)
viewing.images |= showing
//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)
viewing.images -= showing
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.")
showing.Cut()

View File

@@ -71,25 +71,22 @@
/obj/item/device/rcd/rpd/pickup(var/mob/living/L)
..()
hook_key = L.on_clickon.Add(src, "mob_onclickon")
L.lazy_register_event(/lazy_event/on_clickon, src, .proc/mob_onclickon)
/obj/item/device/rcd/rpd/dropped(var/mob/living/L)
..()
L.on_clickon.Remove(hook_key)
L.lazy_unregister_event(/lazy_event/on_clickon, src, .proc/mob_onclickon)
hook_key = null
// If the RPD is held, some modifiers are removed.
// 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.
/obj/item/device/rcd/rpd/proc/mob_onclickon(var/list/event_args, var/mob/living/L)
if (L.get_active_hand() != src)
// from being a pain to use, because alt click intercepts regular clicks.
/obj/item/device/rcd/rpd/proc/mob_onclickon(mob/user, list/modifiers, atom/target)
if (user.get_active_hand() != src)
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.
var/list/modifiers = event_args["modifiers"]
modifiers -= list("alt", "shift", "ctrl")
/obj/item/device/rcd/rpd/mech/Topic(var/href, var/list/href_list)

View File

@@ -226,19 +226,19 @@
clear()
if (viewing)
viewing.on_logout.Remove("\ref[src]:mob_logout")
viewing.lazy_unregister_event(/lazy_event/on_logout, src, .proc/mob_logout)
viewing = null
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
/obj/item/clothing/glasses/scanner/material/proc/mob_logout(var/list/args, var/mob/M)
if (M != viewing)
/obj/item/clothing/glasses/scanner/material/proc/mob_logout(mob/user)
if (user != viewing)
return
clear()
viewing.on_logout.Remove("\ref[src]:mob_logout")
viewing.lazy_unregister_event(/lazy_event/on_logout, src, .proc/mob_logout)
viewing = null
/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."
icon_state = "tactical_armor"
item_state = "tactical_armor"
var/event_key
var/obj/item/weapon/armor_plate/P
/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)
..()
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)
if(from_slot == slot_wear_suit)
user.on_damaged.Remove(event_key)
event_key = null
user.lazy_unregister_event(/lazy_event/on_damaged, src, .proc/handle_user_damage)
..()
/obj/item/clothing/suit/armor/plate_carrier/attack_self(mob/user)
@@ -55,15 +53,13 @@
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>")
/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)
return
var/amount = arguments["amount"]
if(amount <= 0)
return
var/type = arguments["type"]
P.receive_damage(type, amount)
P.receive_damage(kind, amount)
if(P.gcDestroyed)
P = null

View File

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

View File

@@ -103,7 +103,7 @@
victim.vessel.remove_reagent(BLOOD, drawing)
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)
if(locked && locked.len)
var/mob/M = locked[1]
@@ -137,7 +137,7 @@
if(!istype(M))
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
@@ -149,8 +149,7 @@
if(!istype(M))
return
M.on_resist.Remove(on_resist_key)
on_resist_key = null
M.lazy_unregister_event(/lazy_event/on_resist, src, .proc/manual_unbuckle)
/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

View File

@@ -33,7 +33,7 @@
/mob/proc/death(gibbed)
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
dead_mob_list += src
stat_collection.add_death_stat(src)

View File

@@ -55,7 +55,7 @@
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
if(amount > 0)
@@ -67,7 +67,7 @@
/mob/living/carbon/human/adjustFireLoss(var/amount)
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
if(amount > 0)
@@ -82,7 +82,7 @@
/mob/living/carbon/human/proc/adjustBruteLossByPart(var/amount, var/organ_name, var/obj/damage_source = null)
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
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)
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
if (organ_name in organs_by_name)
@@ -135,7 +135,7 @@
if(isslimeperson(src))
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
var/heal_prob = max(0, 80 - getCloneLoss())
@@ -373,7 +373,7 @@ This function restores all organs.
if(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
switch(damagetype)

View File

@@ -469,8 +469,8 @@ emp_act
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.
var/brute_resolved = !!INVOKE_EVENT(on_damaged, list("type" = BRUTE, "amount" = b_loss))
var/burn_resolved = !!INVOKE_EVENT(on_damaged, list("type" = BURN, "amount" = f_loss))
var/brute_resolved = !!lazy_invoke_event(/lazy_event/on_damaged, list("kind" = BRUTE, "amount" = b_loss))
var/burn_resolved = !!lazy_invoke_event(/lazy_event/on_damaged, list("kind" = BURN, "amount" = f_loss))
damage_blocked |= (brute_resolved | burn_resolved)
if(damage_blocked)

View File

@@ -18,8 +18,6 @@
immune_system = new (src)
on_resist = new(owner = src)
/mob/living/Destroy()
for(var/mob/living/silicon/robot/mommi/MoMMI in player_list)
for(var/image/I in static_overlays)
@@ -44,10 +42,6 @@
qdel(immune_system)
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
@@ -250,7 +244,7 @@
if(status_flags & 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
bruteloss = min(max(bruteloss + (amount * brute_damage_modifier), 0),(maxHealth*2))
@@ -262,7 +256,7 @@
if(status_flags & 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
oxyloss = min(max(oxyloss + (amount * oxy_damage_modifier), 0),(maxHealth*2))
@@ -279,7 +273,7 @@
if(status_flags & 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
var/mult = 1
@@ -303,7 +297,7 @@
return 0 //godmode
if(mutations.Find(M_RESIST_HEAT))
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
fireloss = min(max(fireloss + (amount * burn_damage_modifier), 0),(maxHealth*2))
@@ -315,7 +309,7 @@
if(status_flags & 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
if(ishuman(src))
@@ -337,7 +331,7 @@
if(status_flags & 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
brainloss = min(max(brainloss + (amount * brain_damage_modifier), 0),(maxHealth*2))
@@ -777,9 +771,6 @@ Thanks.
hook.override_starting_X--
hook.override_target_X--
/mob/living
var/event/on_resist
/mob/living/verb/resist()
set name = "Resist"
set category = "IC"
@@ -787,7 +778,7 @@ Thanks.
if(!isliving(usr) || usr.special_delayer.blocked())
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.

View File

@@ -39,7 +39,7 @@
return 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
if(amount > 0)
take_overall_damage(amount, 0)
@@ -47,7 +47,7 @@
heal_overall_damage(-amount, 0)
/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
if(amount > 0)
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)
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
if(skinned())
damage = damage * 2
@@ -598,7 +598,7 @@ var/global/list/animal_count = list() //Stores types, and amount of animals of t
return 0
if(mutations.Find(M_RESIST_HEAT))
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
if(skinned())
damage = damage * 2

View File

@@ -52,6 +52,6 @@
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)
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)
if(mind.heard_before[M] == src)
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)
on_bumping.holder = null
if(on_bumped)
@@ -79,24 +69,10 @@
hud_used = null
for(var/atom/movable/leftovers in src)
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_bumped)
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_bumped = null
on_touched = null
@@ -291,13 +267,6 @@
living_mob_list += src
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_bumped = 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
/mob/proc/remove_spell_channeling()
if(spell_channeling)
var/spell/thespell = on_uattack.handlers[spell_channeling][EVENT_OBJECT_INDEX]
thespell.channel_spell(force_remove = 1)
spell_channeling.channel_spell(force_remove = 1)
return 1
return 0

View File

@@ -272,20 +272,12 @@
penetration_dampening = 7
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_bumped //We got bumped
var/event/on_touched // We got touched by anything
// Allows overiding click modifiers and such.
var/event/on_clickon
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_invisible_override = 0

View File

@@ -4,7 +4,6 @@
icon = 'icons/obj/xenoarchaeology.dmi'
icon_state = "Essence_imprinter_idle"
var/datum/dna2/record/R
var/soulbound
var/mob/bound_soul
var/ready
@@ -13,10 +12,9 @@
set_light(3,5,LIGHT_COLOR_RED)
/obj/structure/essence_printer/Destroy()
if(bound_soul && bound_soul.on_death)
bound_soul.on_death.Remove(soulbound)
bound_soul = null
soulbound = null
if(bound_soul)
bound_soul.lazy_unregister_event(/lazy_event/on_death, src, .proc/print)
bound_soul = null
..()
/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.languages = H.languages.Copy()
R.name=R.dna.real_name
if(bound_soul && bound_soul.on_death)
bound_soul.on_death.Remove(soulbound)
if(bound_soul)
bound_soul.lazy_unregister_event(/lazy_event/on_death, src, .proc/print)
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)
if(!ready)
@@ -56,11 +54,11 @@
to_chat(H, "<span class = 'notice'>You bind your essence to \the [src].</span>")
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)
ready = FALSE
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)
H.dna = R.dna.Clone()
H.dna.flavor_text = R.dna.flavor_text
@@ -81,4 +79,4 @@
do_flick(src,"Essence_imprinter_scan_complete",8)
icon_state = "Essence_imprinter_idle"
ready = TRUE
bind(H)
bind(H)

View File

@@ -13,7 +13,6 @@
var/contained = 0
var/artifact_id = ""
anchored = 0
var/event/on_attackhand
var/event/on_attackby
var/event/on_explode
var/event/on_projectile
@@ -25,7 +24,6 @@
else
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_explode = new(owner = src)
on_projectile = new(owner = src)
@@ -88,18 +86,18 @@
if(icon == 'icons/obj/xenoarchaeology.dmi') //If its not a goon artifact:
if(primary_effect.activated) // If its active, suffix is 1, otherwise its 0
fx_suffix = 1
else
else
fx_suffix = 0
else if(primary_effect.activated)
if(fx_image)
fx_suffix = ""
overlays += fx_image
else
else
fx_suffix = "fx" //If we're a goon-style artifact and we don't have an fx image, then we're our own fx!
else
fx_suffix = "" //If its an non-active goon artifact, fx suffix is always empty.
icon_state = "[prefix][numsuffix][fx_suffix]"
icon_state = "[prefix][numsuffix][fx_suffix]"
/obj/machinery/artifact/process()
@@ -141,7 +139,7 @@
return
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>")
/obj/machinery/artifact/attackby(obj/item/weapon/W as obj, mob/living/user as mob)
@@ -157,7 +155,7 @@
var/warn = 0
if (prob(50))
on_attackhand.Invoke(list(M, "BUMPED"))
lazy_invoke_event(/lazy_event/on_bumped, list("user" = M, "target" = src))
warn = 1
if(warn)
to_chat(M, "<b>You accidentally touch [src].<b>")
@@ -191,7 +189,6 @@
/obj/machinery/artifact/Destroy()
qdel(primary_effect); primary_effect = null
qdel(secondary_effect); secondary_effect = null
qdel(on_attackhand); on_attackhand = null
qdel(on_attackby); on_attackby = null
qdel(on_explode); on_explode = null
qdel(on_projectile); on_projectile = null

View File

@@ -13,7 +13,7 @@
/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")
mode = rand(0,2)
reconnect_database()
@@ -190,7 +190,7 @@
payviacard(500, 3600, usr)
/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)
linked_db = null
..()
..()

View File

@@ -1,25 +1,29 @@
/datum/artifact_trigger/touch
triggertype = TRIGGER_TOUCH
scanned_trigger = SCAN_PHYSICAL
var/key_attackhand
/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)
var/toucher = event_args[1]
var/context = event_args[2]
Triggered(toucher, context, 0)
/datum/artifact_trigger/touch/proc/activate(mob/user, context)
Triggered(user, "TOUCH", 0)
if(my_effect.effect == ARTIFACT_EFFECT_TOUCH)
if (my_effect.IsContained())
my_effect.Blocked()
else if(my_effect.IsPrimary() || prob(25))
my_effect.DoEffectTouch(toucher)
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_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(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()
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)
//Link the golem to its master
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()
@@ -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>")
src.golems.Add(AG)
/spell/aoe_turf/conjure/arcane_golem/proc/copy_spellcast(list/arguments)
var/spell/spell_to_copy = arguments["spell"]
var/target = arguments["target"]
/spell/aoe_turf/conjure/arcane_golem/proc/copy_spellcast(spell/spell, mob/user, list/targets)
var/spell/spell_to_copy = spell
if(!istype(spell_to_copy) || !istype(spell_to_copy.holder))
return
@@ -76,12 +75,10 @@
var/cast_dir = spell_to_copy.holder.dir
//Convert the target argument to a list of targets
var/list/targets
if(istype(target, /list))
var/list/L = target
targets = L.Copy()
else if(!isnull(target))
targets = list(target)
if(islist(targets))
targets = targets.Copy()
else if(!isnull(targets))
targets = list(targets)
for(var/mob/living/simple_animal/hostile/arcane_golem/AG in golems)
var/spell/cast_spell = spell_to_copy

View File

@@ -113,7 +113,7 @@ var/global/list/falltempoverlays = list()
if(C.mob)
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)
//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))
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>")
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)
playsound(L, 'sound/effects/vampire_intro.ogg', 80, 1, "vary" = 0)
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>")
L.on_damaged.Remove(event_key)
L.lazy_unregister_event(/lazy_event/on_damaged, src, .proc/reflect)
L.overlays.Remove(user_overlay)
/spell/mirror_of_pain/proc/reflect(list/arguments)
var/damage_type = arguments["type"]
var/amount = arguments["amount"]
/spell/mirror_of_pain/proc/reflect(kind, amount)
var/damage_type = kind
if(amount <= 0)
return

View File

@@ -192,7 +192,7 @@ var/list/spells = typesof(/spell) //needed for the badmin verb for now
invocation(user, targets)
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))
critfail(targets, user)
@@ -210,48 +210,36 @@ var/list/spells = typesof(/spell) //needed for the badmin verb for now
if(!cast_check(skipcharge, user))
return 0
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)
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]"
currently_channeled = 1
connected_button.add_channeling()
else
var/event/E = user.on_uattack
E.handlers.Remove(user.spell_channeling)
var/event/ER = user.on_ruattack
if(ER)
ER.handlers.Remove(user.spell_channeling)
user.lazy_unregister_event(/lazy_event/on_uattack, src, .proc/channeled_spell)
user.lazy_unregister_event(/lazy_event/on_ruattack, src, .proc/channeled_spell)
user.spell_channeling = null
currently_channeled = 0
connected_button.remove_channeling()
connected_button.name = name
return 1
/spell/proc/channeled_spell(var/list/args)
var/event/E = args["event"]
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)
/spell/proc/channeled_spell(atom/atom)
var/list/target = list(atom)
var/mob/user = holder
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
if(!target.len) //before cast has rechecked what we can target
return
invocation(user, target)
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))
critfail(target, holder)