disallow bullets to hit the hedgehog that fired them (unless bounced/wrapped/portal'd)
--- a/hedgewars/uGearsHandlersMess.pas Mon Feb 15 23:37:48 2016 +0100
+++ b/hedgewars/uGearsHandlersMess.pas Tue Feb 16 03:19:23 2016 +0100
@@ -1337,6 +1337,11 @@
procedure doStepDEagleShot(Gear: PGear);
begin
+ Gear^.Data:= nil;
+ // remember who fired this
+ if (Gear^.Hedgehog <> nil) and (Gear^.Hedgehog^.Gear <> nil) then
+ Gear^.Data:= Pointer(Gear^.Hedgehog^.Gear);
+
PlaySound(sndGun);
// add 3 initial steps to avoid problem with ammoshove related to calculation of radius + 1 radius as gear widths, and also just plain old weird angles
Gear^.X := Gear^.X + Gear^.dX * 3;
@@ -1349,6 +1354,7 @@
HHGear: PGear;
shell: PVisualGear;
begin
+
cArtillery := true;
HHGear := Gear^.Hedgehog^.Gear;
@@ -1358,6 +1364,9 @@
exit
end;
+ // remember who fired this
+ Gear^.Data:= Pointer(Gear^.Hedgehog^.Gear);
+
HHGear^.State := HHGear^.State or gstNotKickable;
HedgehogChAngle(HHGear);
if not cLaserSighting then
@@ -4357,9 +4366,13 @@
continue;
end;
- // draw bullet trail
if isbullet then
+ begin
+ // draw bullet trail
spawnBulletTrail(iterator);
+ // the bullet can now hurt the hog that fired it
+ iterator^.Data:= nil;
+ end;
// calc gear offset in portal vector direction
ox := (iterator^.X - Gear^.X);
--- a/hedgewars/uGearsUtils.pas Mon Feb 15 23:37:48 2016 +0100
+++ b/hedgewars/uGearsUtils.pas Tue Feb 16 03:19:23 2016 +0100
@@ -1170,6 +1170,8 @@
begin
dec(i);
Gear:= t^.ar[i];
+ if (Ammo^.Data <> nil) and (Ammo^.Kind in [gtShotgunShot, gtDEagleShot, gtSniperRifleShot, gtSineGunShot]) and (PGear(Ammo^.Data) = Gear) then
+ continue;
if ((Ammo^.Kind = gtFlame) or (Ammo^.Kind = gtBlowTorch)) and
(Gear^.Kind = gtHedgehog) and (Gear^.Hedgehog^.Effects[heFrozen] > 255) then
Gear^.Hedgehog^.Effects[heFrozen]:= max(255,Gear^.Hedgehog^.Effects[heFrozen]-10000);
@@ -1510,6 +1512,9 @@
if (hwRound(Gear^.X) < LongInt(leftX)) or
(hwRound(Gear^.X) > LongInt(rightX)) then
begin
+ // bullets can now hurt the hog that fired them
+ if (WorldEdge <> weSea) and (Gear^.Kind in [gtShotgunShot, gtDEagleShot, gtSniperRifleShot, gtSineGunShot]) then
+ Gear^.Data:= nil;
if WorldEdge = weWrap then
begin
if (hwRound(Gear^.X) < LongInt(leftX)) then