81
81
#include " r_utility.h"
82
82
#include " p_blockmap.h"
83
83
#include " p_3dmidtex.h"
84
+ #include " events.h"
84
85
#include " vm.h"
85
86
#include " d_main.h"
86
87
@@ -4627,6 +4628,12 @@ AActor *P_LineAttack(AActor *t1, DAngle angle, double distance,
4627
4628
DAngle pitch, int damage, FName damageType, PClassActor *pufftype, int flags, FTranslatedLineTarget*victim, int *actualdamage,
4628
4629
double sz, double offsetforward, double offsetside)
4629
4630
{
4631
+ if (t1->Level ->localEventManager ->WorldHitscanPreFired (t1, angle, distance, pitch, damage, damageType, pufftype, flags, sz, offsetforward, offsetside))
4632
+ {
4633
+ return nullptr ;
4634
+ }
4635
+
4636
+
4630
4637
bool nointeract = !!(flags & LAF_NOINTERACT);
4631
4638
DVector3 direction;
4632
4639
double shootz;
@@ -4641,6 +4648,7 @@ AActor *P_LineAttack(AActor *t1, DAngle angle, double distance,
4641
4648
if (flags & LAF_NORANDOMPUFFZ)
4642
4649
puffFlags |= PF_NORANDOMZ;
4643
4650
4651
+
4644
4652
if (victim != NULL )
4645
4653
{
4646
4654
memset (victim, 0 , sizeof (*victim));
@@ -4731,6 +4739,7 @@ AActor *P_LineAttack(AActor *t1, DAngle angle, double distance,
4731
4739
// LAF_ABSOFFSET: Ignore the angle.
4732
4740
4733
4741
DVector3 tempos;
4742
+ DVector3 puffpos;
4734
4743
4735
4744
if (flags & LAF_ABSPOSITION)
4736
4745
{
@@ -4766,7 +4775,8 @@ AActor *P_LineAttack(AActor *t1, DAngle angle, double distance,
4766
4775
4767
4776
if (nointeract || (puffDefaults && puffDefaults->flags3 & MF3_ALWAYSPUFF))
4768
4777
{ // Spawn the puff anyway
4769
- puff = P_SpawnPuff (t1, pufftype, trace.HitPos , trace.SrcAngleFromTarget , trace.SrcAngleFromTarget , 2 , puffFlags);
4778
+ puffpos = trace.HitPos ;
4779
+ puff = P_SpawnPuff (t1, pufftype, puffpos, trace.SrcAngleFromTarget , trace.SrcAngleFromTarget , 2 , puffFlags);
4770
4780
4771
4781
if (nointeract)
4772
4782
{
@@ -4796,7 +4806,8 @@ AActor *P_LineAttack(AActor *t1, DAngle angle, double distance,
4796
4806
if (nointeract || trace.HitType != TRACE_HitWall || ((trace.Line ->special != Line_Horizon) || spawnSky))
4797
4807
{
4798
4808
DVector2 pos = t1->Level ->GetPortalOffsetPosition (trace.HitPos .X , trace.HitPos .Y , -trace.HitVector .X * 4 , -trace.HitVector .Y * 4 );
4799
- puff = P_SpawnPuff (t1, pufftype, DVector3 (pos, trace.HitPos .Z - trace.HitVector .Z * 4 ), trace.SrcAngleFromTarget ,
4809
+ puffpos = DVector3 (pos, trace.HitPos .Z - trace.HitVector .Z * 4 );
4810
+ puff = P_SpawnPuff (t1, pufftype, puffpos, trace.SrcAngleFromTarget ,
4800
4811
trace.SrcAngleFromTarget - DAngle::fromDeg (90 ), 0 , puffFlags);
4801
4812
puff->radius = 1 /65536 .;
4802
4813
@@ -4843,6 +4854,7 @@ AActor *P_LineAttack(AActor *t1, DAngle angle, double distance,
4843
4854
{
4844
4855
// Hit a thing, so it could be either a puff or blood
4845
4856
DVector3 bleedpos = trace.HitPos ;
4857
+ puffpos = bleedpos;
4846
4858
// position a bit closer for puffs/blood if using compatibility mode.
4847
4859
if (trace.Actor ->Level ->i_compatflags & COMPATF_HITSCAN)
4848
4860
{
@@ -4935,6 +4947,9 @@ AActor *P_LineAttack(AActor *t1, DAngle angle, double distance,
4935
4947
SpawnDeepSplash (t1, trace, puff);
4936
4948
}
4937
4949
}
4950
+
4951
+ t1->Level ->localEventManager ->WorldHitscanFired (t1, tempos, puffpos, puff, flags);
4952
+
4938
4953
if (killPuff && puff != NULL )
4939
4954
{
4940
4955
puff->Destroy ();
@@ -5385,16 +5400,30 @@ static ETraceStatus ProcessRailHit(FTraceResults &res, void *userdata)
5385
5400
// ==========================================================================
5386
5401
void P_RailAttack (FRailParams *p)
5387
5402
{
5388
- DVector3 start;
5389
- FTraceResults trace;
5403
+ AActor *source = p->source ;
5390
5404
5391
5405
PClassActor *puffclass = p->puff ;
5392
5406
if (puffclass == NULL )
5393
5407
{
5394
5408
puffclass = PClass::FindActor (NAME_BulletPuff);
5395
5409
}
5410
+ assert (puffclass != NULL ); // Because we set it to a default above
5411
+ AActor *puffDefaults = GetDefaultByType (puffclass->GetReplacement (source->Level )); // Contains all the flags such as FOILINVUL, etc.
5412
+ FName damagetype = (puffDefaults == NULL || puffDefaults->DamageType == NAME_None) ? FName (NAME_Railgun) : puffDefaults->DamageType ;
5413
+
5414
+ int flags;
5415
+
5416
+ // disabled because not complete yet.
5417
+ flags = (puffDefaults->flags6 & MF6_NOTRIGGER) ? TRACE_ReportPortals : TRACE_PCross | TRACE_Impact | TRACE_ReportPortals;
5418
+
5419
+ if (source->Level ->localEventManager ->WorldHitscanPreFired (source, source->Angles .Yaw + p->angleoffset , p->distance , source->Angles .Pitch + p->pitchoffset , p->damage , damagetype, puffclass, flags, p->offset_z , 0 , p->offset_xy ))
5420
+ {
5421
+ return ;
5422
+ }
5423
+
5424
+ DVector3 start;
5425
+ FTraceResults trace;
5396
5426
5397
- AActor *source = p->source ;
5398
5427
DAngle pitch = source->Angles .Pitch + p->pitchoffset ;
5399
5428
DAngle angle = source->Angles .Yaw + p->angleoffset ;
5400
5429
@@ -5423,13 +5452,6 @@ void P_RailAttack(FRailParams *p)
5423
5452
start.Y = xy.Y ;
5424
5453
start.Z = shootz;
5425
5454
5426
- int flags;
5427
-
5428
- assert (puffclass != NULL ); // Because we set it to a default above
5429
- AActor *puffDefaults = GetDefaultByType (puffclass->GetReplacement (source->Level )); // Contains all the flags such as FOILINVUL, etc.
5430
-
5431
- // disabled because not complete yet.
5432
- flags = (puffDefaults->flags6 & MF6_NOTRIGGER) ? TRACE_ReportPortals : TRACE_PCross | TRACE_Impact | TRACE_ReportPortals;
5433
5455
rail_data.StopAtInvul = (puffDefaults->flags3 & MF3_FOILINVUL) ? false : true ;
5434
5456
rail_data.MThruSpecies = ((puffDefaults->flags6 & MF6_MTHRUSPECIES)) ? true : false ;
5435
5457
@@ -5466,8 +5488,7 @@ void P_RailAttack(FRailParams *p)
5466
5488
5467
5489
// Hurt anything the trace hit
5468
5490
unsigned int i;
5469
- FName damagetype = (puffDefaults == NULL || puffDefaults->DamageType == NAME_None) ? FName (NAME_Railgun) : puffDefaults->DamageType ;
5470
-
5491
+
5471
5492
for (i = 0 ; i < rail_data.RailHits .Size (); i++)
5472
5493
{
5473
5494
bool spawnpuff;
@@ -5555,6 +5576,9 @@ void P_RailAttack(FRailParams *p)
5555
5576
}
5556
5577
}
5557
5578
}
5579
+
5580
+ source->Level ->localEventManager ->WorldHitscanFired (source, start, trace.HitPos , thepuff, flags);
5581
+
5558
5582
if (thepuff != NULL )
5559
5583
{
5560
5584
if (trace.Crossed3DWater || trace.CrossedWater )
0 commit comments