EVENT scripts: Difference between revisions

Added some more information about GAMEEVENT_ACTOR_SPAWNED and GAMEEVENT_ACTOR_DAMAGED, and added an example.
(Added the new event types in 3.1-alpha and a section that covers more information about GAMEEVENT_ACTOR_SPAWNED and GAMEEVENT_ACTOR_DAMAGED.)
(Added some more information about GAMEEVENT_ACTOR_SPAWNED and GAMEEVENT_ACTOR_DAMAGED, and added an example.)
Line 44: Line 44:
*AAPTR_DAMAGE_TARGET: Accesses the "victim" taking the damage. By default, this actor is already the activator of the script.
*AAPTR_DAMAGE_TARGET: Accesses the "victim" taking the damage. By default, this actor is already the activator of the script.
You may use these in ACS functions that deal with actor pointers, such as [https://zdoom.org/wiki/IsPointerEqual IsPointerEqual], [https://zdoom.org/wiki/SetActivator SetActivator], [https://zdoom.org/wiki/SetPointer SetPointer], or [https://zdoom.org/wiki/Warp Warp].
You may use these in ACS functions that deal with actor pointers, such as [https://zdoom.org/wiki/IsPointerEqual IsPointerEqual], [https://zdoom.org/wiki/SetActivator SetActivator], [https://zdoom.org/wiki/SetPointer SetPointer], or [https://zdoom.org/wiki/Warp Warp].
It's recommended not to use '''GAMEEVENT_ACTOR_SPAWNED''' or '''GAMEEVENT_ACTOR_DAMAGED''' in conjunction with <tt>CLIENTSIDE</tt> scripts, since the server must tell clients to execute the scripts every time the events are fired. Due to their frequent occurrence, this can create lots of network traffic, resulting in a huge drop in performance. Furthermore, the extra actor pointers available in the latter, along with the damage type stored in <tt>arg2</tt>, do not work properly in <tt>CLIENTSIDE</tt> scripts.
[[Category:Level Development]]
[[Category:Level Development]]
== Examples ==
Let's say we want to use '''GAMEEVENT_ACTOR_SPAWNED''' and '''GAMEEVENT_ACTOR_DAMAGED''' for our mod. For the sake of simplicity, we want the events to be triggered by all actors, so we'll create a <tt>MAPINFO</tt> lump in our WAD file and add the following:
<syntaxhighlight lang="c" line="1">
GameInfo
{
    ForceSpawnEventScripts = true
    ForceDamageEventScripts = true
}
</syntaxhighlight>
Next, we'll create an ACS EVENT script that prints a message whenever an actor is spawned or takes damage. '''GAMEEVENT_ACTOR_DAMAGED''' gives us access to a lot of information about how an actor takes damage, so let's also print that stuff.
<syntaxhighlight lang="c" line="1">
script "ActorEvent" (int type, int arg1, int arg2) EVENT
{
    if (type == GAMEEVENT_ACTOR_SPAWNED)
    {
        // This prints every time an actor is spawned.
        PrintBold(s:GetActorClass(0), s:" has spawned!");
    }
    else if (type == GAMEEVENT_ACTOR_DAMAGED)
    {
        // This event is called just before the actor's health is reduced. We can get
        // their new health by subtracting their current health by arg1.
        int oldHealth = GetActorProperty(0, APROP_HEALTH);
        int newHealth = oldHealth - arg1;
        // Construct a string that displays everything.
        str message = StrParam(s:GetActorClass(0), s: " got damaged by ", d:arg1, s:" points! The damage type is: ", s:arg2);
        message = StrParam(s:message, s:"\nTheir health was ", d:oldHealth, s:", now it's ", d:newHealth);
        // Print the names of the source and inflictor classes, if they exist.
        if (SetActivator(0, AAPTR_DAMAGE_SOURCE));
            message = StrParam(s:message, s:"\nThe source was ", s:GetActorClass(0));
        if (SetActivator(0, AAPTR_DAMAGE_INFLICTOR));
            message = StrParam(s:message, s:"\nThe inflictor was ", s:GetActorClass(0));
        // Set the activator back to the target.
        SetActivator(0, AAPTR_DAMAGE_TARGET);
        // Print the message!
        PrintBold(s:message);
    }
}
</syntaxhighlight>
[[Category:ACS Functions]]
[[Category:ACS Functions]]