Skip to content

fix: look at explosion on suicide, fix FF for mine - #66

Merged
ec- merged 1 commit into
ec-:masterfrom
WofWca:fix-look-at-missile-on-suicide
Mar 4, 2026
Merged

ec- merged 1 commit into
ec-:masterfrom
WofWca:fix-look-at-missile-on-suicide

Conversation

@WofWca

@WofWca WofWca commented Jan 26, 2026

Copy link
Copy Markdown
Contributor
  1. When killing self with a missile, look at the explosion instead of looking at the center of the world.
  2. Make proximity mines not damage teammates, even with g_friendlyFire 1. This makes sense since proximity mines already don't damage self.

I have checked through all the usages of inflictor inside of G_Damage:

  • player_die() -> Team_FragBonuses: unused.
  • player_die -> LookAtKiller: used, and it's the point of this commit.
  • targ->use: none of the use functions utilize inflictor.
  • mod == MOD_PROXIMITY_MINE: also fixes a bug.

1. When killing self with a missile, look at the explosion
   instead of looking at the center of the world.
2. Make proximity mines not damage teammates,
   even with `g_friendlyFire 1`.
   This makes sense since proximity mines already don't damage self.

I have checked through all the usages of `inflictor`
inside of `G_Damage`:
- `player_die() -> Team_FragBonuses`: unused.
- `player_die -> LookAtKiller`: used,
  and it's the point of this commit.
- `targ->use`: none of the `use` functions utilize `inflictor`.
- `mod == MOD_PROXIMITY_MINE`: also fixes a bug.
@ec-
ec- merged commit 4cb93e3 into ec-:master Mar 4, 2026
WofWca added a commit to WofWca/baseq3a that referenced this pull request Jul 15, 2026
This saves ~0.34% (~1KiB), of traffic and demo size
for a ~3-minute match with 4 players,
by sending less data when a player or a dead body
is seen by another player for the first time in a while.

This will increase the size of the initial connection message
(`svc_gamestate`, which now needs to send the entities
for which we set the baseline state),
but it pays off in the long run.

How to test this change:
1. `./quake +set cg_autoRecordDemo 1 +set jorunal 1`
   to record a jorunal file and a demo.
2. Play a game.
3. Build the mod with this patch and install the mod.
4. `./quake +set cg_autoRecordDemo 1 +set jorunal 2`
   to play back the journal file and record another demo
   given the very same inputs.

Then compare the demo sizes.

One can also utilize `cl_shownet 3`.
Below is an example of how the "delta from baseline" entries look
on vanilla Quake. First two player entries,
then two body queue entries:

```
 50:  baseline: 2
 51: ec-#2   pos.trBase[0]:1024 pos.trBase[1]:1000 pos.trBase[2]:24 apos.trBase[1]:27 eType:1 torsoAnim:11 legsAnim:22 groundEntityNum:1022 pos.trType:1 eFlags:4 weapon:2 clientNum:2 angles[1]:90 apos.trType:1 solid:4200463  (418 bits)

 70:  baseline: 5
 71: ec-#5   pos.trBase[0]:216 pos.trBase[1]:1328 pos.trBase[2]:24 eType:1 torsoAnim:11 legsAnim:22 groundEntityNum:1022 pos.trType:1 eFlags:4 weapon:2 clientNum:5 angles[1]:360 apos.trType:1 solid:4200463  (398 bits)

 23:  baseline: 65
 24: ec-#65  pos.trBase[0]:678 pos.trBase[1]:1446 pos.trBase[2]:24 apos.trBase[1]:135 eType:1 torsoAnim:3 legsAnim:3 groundEntityNum:1022 eFlags:1 clientNum:3  (278 bits)

 46:  baseline: 66
 47: ec-#66  pos.trBase[0]:894 pos.trBase[1]:832 pos.trBase[2]:-15 apos.trBase[1]:225 eType:1 torsoAnim:5 legsAnim:5 groundEntityNum:1022 eFlags:1 clientNum:1  (279 bits)
```

As you can see, basically every field is transmitted,
including e.g. `eType`, which is almost always `ET_PLAYER`
for players and dead bodies.
Now let's see how this patch makes it look:

```
 33:  baseline: 3
 35: ec-#3   pos.trBase[0]:1024 pos.trBase[1]:1000 pos.trBase[2]:24 apos.trBase[1]:90 eventParm:10 legsAnim:22 angles[1]:90  (255 bits)

 84:  baseline: 5
 86: ec-#5   pos.trBase[0]:1028 pos.trBase[1]:1094 pos.trBase[2]:24 apos.trBase[1]:107 angles2[1]:7 legsAnim:22 eFlags:4 angles[1]:90  (284 bits)

 23:  baseline: 64
 24: ec-#64  pos.trBase[0]:698 pos.trBase[1]:1460 pos.trBase[2]:24 apos.trBase[1]:135  (149 bits)

 22:  baseline: 65
 24: ec-#65  pos.trBase[0]:471 pos.trBase[1]:807 pos.trBase[2]:-15 apos.trBase[1]:315 torsoAnim:3 legsAnim:3  (208 bits)
```

This is much shorter. Sometimes we even don't transmit
anything but coordinates and angles.

I have tested this on Quake3e and ioq3 engine.
The latter still has a bug in `SV_CreateBaseline`
which never sends entity numbered 0.
But this doesn't cause anything game-breaking,
only that this optimization will not be applied to entity 0.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants