mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-11-10 23:01:50 +00:00
Add worldlineactivated event, triggered after successful line activation.
This commit is contained in:
parent
bd7791ad9c
commit
69c6e95b08
4 changed files with 37 additions and 1 deletions
|
@ -413,6 +413,12 @@ void E_WorldThingDestroyed(AActor* actor)
|
||||||
handler->WorldThingDestroyed(actor);
|
handler->WorldThingDestroyed(actor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void E_WorldLineActivated(line_t* line, AActor* actor)
|
||||||
|
{
|
||||||
|
for (DStaticEventHandler* handler = E_FirstEventHandler; handler; handler = handler->next)
|
||||||
|
handler->WorldLineActivated(line, actor);
|
||||||
|
}
|
||||||
|
|
||||||
void E_PlayerEntered(int num, bool fromhub)
|
void E_PlayerEntered(int num, bool fromhub)
|
||||||
{
|
{
|
||||||
// this event can happen during savegamerestore. make sure that local handlers don't receive it.
|
// this event can happen during savegamerestore. make sure that local handlers don't receive it.
|
||||||
|
@ -540,6 +546,7 @@ DEFINE_FIELD_X(WorldEvent, FWorldEvent, DamageSource);
|
||||||
DEFINE_FIELD_X(WorldEvent, FWorldEvent, DamageType);
|
DEFINE_FIELD_X(WorldEvent, FWorldEvent, DamageType);
|
||||||
DEFINE_FIELD_X(WorldEvent, FWorldEvent, DamageFlags);
|
DEFINE_FIELD_X(WorldEvent, FWorldEvent, DamageFlags);
|
||||||
DEFINE_FIELD_X(WorldEvent, FWorldEvent, DamageAngle);
|
DEFINE_FIELD_X(WorldEvent, FWorldEvent, DamageAngle);
|
||||||
|
DEFINE_FIELD_X(WorldEvent, FWorldEvent, ActivatedLine);
|
||||||
|
|
||||||
DEFINE_FIELD_X(PlayerEvent, FPlayerEvent, PlayerNumber);
|
DEFINE_FIELD_X(PlayerEvent, FPlayerEvent, PlayerNumber);
|
||||||
DEFINE_FIELD_X(PlayerEvent, FPlayerEvent, IsReturn);
|
DEFINE_FIELD_X(PlayerEvent, FPlayerEvent, IsReturn);
|
||||||
|
@ -626,6 +633,7 @@ DEFINE_EMPTY_HANDLER(DStaticEventHandler, WorldThingDied)
|
||||||
DEFINE_EMPTY_HANDLER(DStaticEventHandler, WorldThingRevived)
|
DEFINE_EMPTY_HANDLER(DStaticEventHandler, WorldThingRevived)
|
||||||
DEFINE_EMPTY_HANDLER(DStaticEventHandler, WorldThingDamaged)
|
DEFINE_EMPTY_HANDLER(DStaticEventHandler, WorldThingDamaged)
|
||||||
DEFINE_EMPTY_HANDLER(DStaticEventHandler, WorldThingDestroyed)
|
DEFINE_EMPTY_HANDLER(DStaticEventHandler, WorldThingDestroyed)
|
||||||
|
DEFINE_EMPTY_HANDLER(DStaticEventHandler, WorldLineActivated)
|
||||||
DEFINE_EMPTY_HANDLER(DStaticEventHandler, WorldLightning)
|
DEFINE_EMPTY_HANDLER(DStaticEventHandler, WorldLightning)
|
||||||
DEFINE_EMPTY_HANDLER(DStaticEventHandler, WorldTick)
|
DEFINE_EMPTY_HANDLER(DStaticEventHandler, WorldTick)
|
||||||
|
|
||||||
|
@ -786,6 +794,21 @@ void DStaticEventHandler::WorldThingDestroyed(AActor* actor)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DStaticEventHandler::WorldLineActivated(line_t* line, AActor* actor)
|
||||||
|
{
|
||||||
|
IFVIRTUAL(DStaticEventHandler, WorldLineActivated)
|
||||||
|
{
|
||||||
|
// don't create excessive DObjects if not going to be processed anyway
|
||||||
|
if (func == DStaticEventHandler_WorldLineActivated_VMPtr)
|
||||||
|
return;
|
||||||
|
FWorldEvent e = E_SetupWorldEvent();
|
||||||
|
e.Thing = actor;
|
||||||
|
e.ActivatedLine = line;
|
||||||
|
VMValue params[2] = { (DStaticEventHandler*)this, &e };
|
||||||
|
VMCall(func, params, 2, nullptr, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void DStaticEventHandler::WorldLightning()
|
void DStaticEventHandler::WorldLightning()
|
||||||
{
|
{
|
||||||
IFVIRTUAL(DStaticEventHandler, WorldLightning)
|
IFVIRTUAL(DStaticEventHandler, WorldLightning)
|
||||||
|
|
|
@ -40,6 +40,8 @@ void E_WorldThingRevived(AActor* actor);
|
||||||
void E_WorldThingDamaged(AActor* actor, AActor* inflictor, AActor* source, int damage, FName mod, int flags, DAngle angle);
|
void E_WorldThingDamaged(AActor* actor, AActor* inflictor, AActor* source, int damage, FName mod, int flags, DAngle angle);
|
||||||
// called before AActor::Destroy of each actor.
|
// called before AActor::Destroy of each actor.
|
||||||
void E_WorldThingDestroyed(AActor* actor);
|
void E_WorldThingDestroyed(AActor* actor);
|
||||||
|
// called in P_ActivateLine after successful special execution.
|
||||||
|
void E_WorldLineActivated(line_t* line, AActor* actor);
|
||||||
// same as ACS SCRIPT_Lightning
|
// same as ACS SCRIPT_Lightning
|
||||||
void E_WorldLightning();
|
void E_WorldLightning();
|
||||||
// this executes on every tick, before everything, only when in valid level and not paused
|
// this executes on every tick, before everything, only when in valid level and not paused
|
||||||
|
@ -137,6 +139,7 @@ public:
|
||||||
void WorldThingRevived(AActor*);
|
void WorldThingRevived(AActor*);
|
||||||
void WorldThingDamaged(AActor*, AActor*, AActor*, int, FName, int, DAngle);
|
void WorldThingDamaged(AActor*, AActor*, AActor*, int, FName, int, DAngle);
|
||||||
void WorldThingDestroyed(AActor*);
|
void WorldThingDestroyed(AActor*);
|
||||||
|
void WorldLineActivated(line_t*, AActor*);
|
||||||
void WorldLightning();
|
void WorldLightning();
|
||||||
void WorldTick();
|
void WorldTick();
|
||||||
|
|
||||||
|
@ -192,6 +195,8 @@ struct FWorldEvent
|
||||||
FName DamageType;
|
FName DamageType;
|
||||||
int DamageFlags = 0;
|
int DamageFlags = 0;
|
||||||
DAngle DamageAngle;
|
DAngle DamageAngle;
|
||||||
|
// for lineactivated
|
||||||
|
line_t* ActivatedLine = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct FPlayerEvent
|
struct FPlayerEvent
|
||||||
|
|
|
@ -188,8 +188,10 @@ bool P_ActivateLine (line_t *line, AActor *mo, int side, int activationType, DVe
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool remote = (line->special != 7 && line->special != 8 && (line->special < 11 || line->special > 14));
|
bool remote = (line->special != 7 && line->special != 8 && (line->special < 11 || line->special > 14));
|
||||||
if (line->locknumber > 0 && !P_CheckKeys (mo, line->locknumber, remote)) return false;
|
if (line->locknumber > 0 && !P_CheckKeys (mo, line->locknumber, remote)) return false;
|
||||||
|
|
||||||
lineActivation = line->activation;
|
lineActivation = line->activation;
|
||||||
repeat = line->flags & ML_REPEAT_SPECIAL;
|
repeat = line->flags & ML_REPEAT_SPECIAL;
|
||||||
buttonSuccess = false;
|
buttonSuccess = false;
|
||||||
|
@ -198,6 +200,9 @@ bool P_ActivateLine (line_t *line, AActor *mo, int side, int activationType, DVe
|
||||||
line->args[1], line->args[2],
|
line->args[1], line->args[2],
|
||||||
line->args[3], line->args[4]);
|
line->args[3], line->args[4]);
|
||||||
|
|
||||||
|
// [MK] Fire up WorldLineActivated
|
||||||
|
if ( buttonSuccess ) E_WorldLineActivated(line, mo);
|
||||||
|
|
||||||
special = line->special;
|
special = line->special;
|
||||||
if (!repeat && buttonSuccess)
|
if (!repeat && buttonSuccess)
|
||||||
{ // clear the special on non-retriggerable lines
|
{ // clear the special on non-retriggerable lines
|
||||||
|
|
|
@ -25,6 +25,8 @@ struct WorldEvent native play version("2.4")
|
||||||
native readonly Name DamageType;
|
native readonly Name DamageType;
|
||||||
native readonly EDmgFlags DamageFlags;
|
native readonly EDmgFlags DamageFlags;
|
||||||
native readonly double DamageAngle;
|
native readonly double DamageAngle;
|
||||||
|
// for lineactivated
|
||||||
|
native readonly Line ActivatedLine;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct PlayerEvent native play version("2.4")
|
struct PlayerEvent native play version("2.4")
|
||||||
|
@ -300,6 +302,7 @@ class StaticEventHandler : Object native play version("2.4")
|
||||||
virtual native void WorldThingRevived(WorldEvent e);
|
virtual native void WorldThingRevived(WorldEvent e);
|
||||||
virtual native void WorldThingDamaged(WorldEvent e);
|
virtual native void WorldThingDamaged(WorldEvent e);
|
||||||
virtual native void WorldThingDestroyed(WorldEvent e);
|
virtual native void WorldThingDestroyed(WorldEvent e);
|
||||||
|
virtual native void WorldLineActivated(WorldEvent e);
|
||||||
virtual native void WorldLightning(WorldEvent e); // for the sake of completeness.
|
virtual native void WorldLightning(WorldEvent e); // for the sake of completeness.
|
||||||
virtual native void WorldTick();
|
virtual native void WorldTick();
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue