quake2ts 0.0.485 → 0.0.487

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1878,6 +1878,13 @@ var DamageFlags = /* @__PURE__ */ ((DamageFlags2) => {
1878
1878
  DamageFlags2[DamageFlags2["NO_DAMAGE_EFFECTS"] = 1024] = "NO_DAMAGE_EFFECTS";
1879
1879
  return DamageFlags2;
1880
1880
  })(DamageFlags || {});
1881
+ var EntityDamageFlags = /* @__PURE__ */ ((EntityDamageFlags2) => {
1882
+ EntityDamageFlags2[EntityDamageFlags2["GODMODE"] = 1] = "GODMODE";
1883
+ EntityDamageFlags2[EntityDamageFlags2["IMMORTAL"] = 2] = "IMMORTAL";
1884
+ EntityDamageFlags2[EntityDamageFlags2["NO_KNOCKBACK"] = 4] = "NO_KNOCKBACK";
1885
+ EntityDamageFlags2[EntityDamageFlags2["NO_DAMAGE_EFFECTS"] = 8] = "NO_DAMAGE_EFFECTS";
1886
+ return EntityDamageFlags2;
1887
+ })(EntityDamageFlags || {});
1881
1888
  function hasAnyDamageFlag(flags, mask) {
1882
1889
  return (flags & mask) !== 0;
1883
1890
  }
@@ -3864,13 +3871,6 @@ var MulticastType = /* @__PURE__ */ ((MulticastType2) => {
3864
3871
  })(MulticastType || {});
3865
3872
 
3866
3873
  // src/combat/damage.ts
3867
- var EntityDamageFlags = /* @__PURE__ */ ((EntityDamageFlags2) => {
3868
- EntityDamageFlags2[EntityDamageFlags2["GODMODE"] = 1] = "GODMODE";
3869
- EntityDamageFlags2[EntityDamageFlags2["IMMORTAL"] = 2] = "IMMORTAL";
3870
- EntityDamageFlags2[EntityDamageFlags2["NO_KNOCKBACK"] = 4] = "NO_KNOCKBACK";
3871
- EntityDamageFlags2[EntityDamageFlags2["NO_DAMAGE_EFFECTS"] = 8] = "NO_DAMAGE_EFFECTS";
3872
- return EntityDamageFlags2;
3873
- })(EntityDamageFlags || {});
3874
3874
  function getDamageModifier(attacker, time) {
3875
3875
  if (!attacker) {
3876
3876
  return 1;
@@ -3934,6 +3934,18 @@ function T_Damage(targ, inflictor, attacker, dir, point, normal, damage, knockba
3934
3934
  if (!targ.takedamage) {
3935
3935
  return null;
3936
3936
  }
3937
+ const client = targ.client;
3938
+ if (client && client.enviro_time && client.enviro_time > time) {
3939
+ if (mod === 18 /* SLIME */ || mod === 19 /* LAVA */) {
3940
+ return {
3941
+ take: 0,
3942
+ psave: 0,
3943
+ asave: 0,
3944
+ knocked: { x: 0, y: 0, z: 0 },
3945
+ killed: false
3946
+ };
3947
+ }
3948
+ }
3937
3949
  const modifier = getDamageModifier(attacker, time);
3938
3950
  const modifiedDamage = damage * modifier;
3939
3951
  const modifiedKnockback = knockback * modifier;
@@ -5115,8 +5127,14 @@ var EntitySystem = class {
5115
5127
  linkentity(ent) {
5116
5128
  this.imports.linkentity(ent);
5117
5129
  }
5118
- multicast(origin, type, event, ...args) {
5119
- this.imports.multicast(origin, type, event, ...args);
5130
+ link(ent) {
5131
+ this.linkentity(ent);
5132
+ }
5133
+ unlink(ent) {
5134
+ this.spatialGrid.remove(ent);
5135
+ }
5136
+ multicast(origin, type, ServerCommand6, ...args) {
5137
+ this.imports.multicast(origin, type, ServerCommand6, ...args);
5120
5138
  }
5121
5139
  unicast(ent, reliable, event, ...args) {
5122
5140
  this.imports.unicast(ent, reliable, event, ...args);
@@ -10092,6 +10110,64 @@ var FLAG_ITEMS = {
10092
10110
  }
10093
10111
  };
10094
10112
 
10113
+ // src/inventory/give.ts
10114
+ function giveItem(entity, classname) {
10115
+ if (!entity.client) return false;
10116
+ const client = entity.client;
10117
+ const inventory = client.inventory;
10118
+ const time = 0;
10119
+ const weapon = WEAPON_ITEMS[classname];
10120
+ if (weapon) {
10121
+ return pickupWeapon(inventory, weapon, time);
10122
+ }
10123
+ const isAmmo = Object.values(AmmoItemId).includes(classname);
10124
+ if (isAmmo) {
10125
+ const res = giveAmmoItem(inventory, classname);
10126
+ return res.pickedUp;
10127
+ }
10128
+ const healthItem = HEALTH_ITEMS[classname];
10129
+ if (healthItem) {
10130
+ if (canPickupHealth(inventory, entity.health, healthItem)) {
10131
+ const count = healthItem.amount;
10132
+ const max = healthItem.max;
10133
+ if (entity.health < max) {
10134
+ entity.health += count;
10135
+ if (entity.health > max) entity.health = max;
10136
+ return true;
10137
+ }
10138
+ if (classname === "item_health_mega") {
10139
+ if (entity.health < max) {
10140
+ entity.health += count;
10141
+ return true;
10142
+ }
10143
+ return false;
10144
+ }
10145
+ }
10146
+ return false;
10147
+ }
10148
+ const armorItem = ARMOR_ITEMS[classname];
10149
+ if (armorItem) {
10150
+ return pickupArmor(inventory, armorItem, time);
10151
+ }
10152
+ const powerupItem = POWERUP_ITEMS[classname];
10153
+ if (powerupItem) {
10154
+ return pickupPowerup(client, powerupItem, time);
10155
+ }
10156
+ const powerArmorItem = POWER_ARMOR_ITEMS[classname];
10157
+ if (powerArmorItem) {
10158
+ return pickupPowerArmor(inventory, powerArmorItem, time);
10159
+ }
10160
+ const keyItem = KEY_ITEMS[classname];
10161
+ if (keyItem) {
10162
+ return pickupKey(inventory, keyItem, time);
10163
+ }
10164
+ const flagItem = FLAG_ITEMS[classname];
10165
+ if (flagItem) {
10166
+ return pickupFlag(client, flagItem, time);
10167
+ }
10168
+ return false;
10169
+ }
10170
+
10095
10171
  // src/entities/items/common.ts
10096
10172
  function handleItemPickup(game, self, other, respawnTime = 30) {
10097
10173
  if (!game.deathmatch) {
@@ -25848,6 +25924,11 @@ function player_think(self, sys) {
25848
25924
  return;
25849
25925
  }
25850
25926
  const nowMs = sys.timeSeconds * 1e3;
25927
+ if (self.client.invincible_time && self.client.invincible_time > sys.timeSeconds) {
25928
+ self.flags = (self.flags || 0) | 1 /* GODMODE */;
25929
+ } else {
25930
+ self.flags = (self.flags || 0) & ~1 /* GODMODE */;
25931
+ }
25851
25932
  const quadTime = self.client.quad_time || 0;
25852
25933
  const doubleTime = self.client.double_time || 0;
25853
25934
  const soundTime = self.client.quadsound_time || 0;
@@ -25952,106 +26033,6 @@ function populatePlayerStats(player, timeSeconds) {
25952
26033
  return statArray;
25953
26034
  }
25954
26035
 
25955
- // src/save/adapter.ts
25956
- function createSerializedGameState(context) {
25957
- const { entitySystem, levelClock, random: random5 } = context;
25958
- const player = entitySystem.find((e) => e.classname === "player");
25959
- const sysSnapshot = entitySystem.createSnapshot();
25960
- const playerState = {
25961
- origin: player ? { ...player.origin } : { x: 0, y: 0, z: 0 },
25962
- velocity: player ? { ...player.velocity } : { x: 0, y: 0, z: 0 },
25963
- viewAngles: player ? { ...player.angles } : { x: 0, y: 0, z: 0 },
25964
- onGround: player ? player.groundentity !== null : false,
25965
- waterLevel: player ? player.waterlevel : 0,
25966
- mins: player ? { ...player.mins } : { x: -16, y: -16, z: -24 },
25967
- maxs: player ? { ...player.maxs } : { x: 16, y: 16, z: 32 },
25968
- damageAlpha: player?.client?.damage_alpha ?? 0,
25969
- damageIndicators: [],
25970
- // Transient
25971
- blend: [0, 0, 0, 0],
25972
- // Transient
25973
- stats: player ? populatePlayerStats(player, levelClock.current.timeSeconds) : [],
25974
- kick_angles: player?.client?.kick_angles ?? { x: 0, y: 0, z: 0 },
25975
- kick_origin: player?.client?.kick_origin ?? { x: 0, y: 0, z: 0 },
25976
- gunoffset: { x: 0, y: 0, z: 0 },
25977
- gunangles: { x: 0, y: 0, z: 0 },
25978
- gunindex: 0,
25979
- // Q2 Network Compatibility
25980
- pm_type: player?.client?.pm_type ?? 0,
25981
- pm_time: player?.client?.pm_time ?? 0,
25982
- pm_flags: player?.client?.pm_flags ?? 0,
25983
- gun_frame: player?.client?.gun_frame ?? 0,
25984
- rdflags: player?.client?.rdflags ?? 0,
25985
- fov: player?.client?.fov ?? 90,
25986
- renderfx: player?.renderfx ?? 0
25987
- };
25988
- return {
25989
- mapName: entitySystem.level.mapname || "unknown",
25990
- playerState,
25991
- entities: sysSnapshot.entities,
25992
- levelState: sysSnapshot.level,
25993
- time: levelClock.current.timeSeconds,
25994
- playerInventory: player?.client?.inventory ? serializePlayerInventory(player.client.inventory) : void 0,
25995
- rngState: random5?.getState(),
25996
- _internalSnapshot: sysSnapshot
25997
- };
25998
- }
25999
- function applySerializedGameState(state, context) {
26000
- const { entitySystem, levelClock, random: random5 } = context;
26001
- levelClock.restore({
26002
- frameNumber: 0,
26003
- // Unknown in this format, reset to 0
26004
- timeSeconds: state.time,
26005
- previousTimeSeconds: state.time,
26006
- deltaSeconds: 0
26007
- });
26008
- if (random5 && state.rngState) {
26009
- random5.setState(state.rngState);
26010
- }
26011
- if (state._internalSnapshot) {
26012
- entitySystem.restore(state._internalSnapshot);
26013
- } else {
26014
- console.warn("Restoring from partial SerializedGameState. Thinks and Pool state may be lost.");
26015
- const partialSnapshot = {
26016
- timeSeconds: state.time,
26017
- pool: {
26018
- capacity: state.entities.length + 32,
26019
- // Estimate
26020
- activeOrder: state.entities.map((e) => e.index),
26021
- // Naive
26022
- freeList: [],
26023
- // Assume none
26024
- pendingFree: []
26025
- },
26026
- entities: state.entities,
26027
- thinks: [],
26028
- // LOST
26029
- awareness: {
26030
- frameNumber: 0,
26031
- sightEntityIndex: null,
26032
- sightEntityFrame: 0,
26033
- soundEntityIndex: null,
26034
- soundEntityFrame: 0,
26035
- sound2EntityIndex: null,
26036
- sound2EntityFrame: 0,
26037
- sightClientIndex: null
26038
- },
26039
- crossLevelFlags: 0,
26040
- crossUnitFlags: 0,
26041
- level: state.levelState
26042
- };
26043
- entitySystem.restore(partialSnapshot);
26044
- }
26045
- const player = entitySystem.find((e) => e.classname === "player");
26046
- if (player && state.playerInventory) {
26047
- const inventory = deserializePlayerInventory(state.playerInventory);
26048
- player.client = player.client || {};
26049
- if (player.client) {
26050
- player.client.inventory = inventory;
26051
- }
26052
- }
26053
- }
26054
-
26055
26036
  // src/combat/weapon.ts
26056
26037
  var WeaponType = /* @__PURE__ */ ((WeaponType2) => {
26057
26038
  WeaponType2[WeaponType2["BLASTER"] = 0] = "BLASTER";
@@ -26159,6 +26140,106 @@ var WEAPONS = {
26159
26140
  }
26160
26141
  };
26161
26142
 
26143
+ // src/save/adapter.ts
26144
+ function createSerializedGameState(context) {
26145
+ const { entitySystem, levelClock, random: random5 } = context;
26146
+ const player = entitySystem.find((e) => e.classname === "player");
26147
+ const sysSnapshot = entitySystem.createSnapshot();
26148
+ const playerState = {
26149
+ origin: player ? { ...player.origin } : { x: 0, y: 0, z: 0 },
26150
+ velocity: player ? { ...player.velocity } : { x: 0, y: 0, z: 0 },
26151
+ viewAngles: player ? { ...player.angles } : { x: 0, y: 0, z: 0 },
26152
+ onGround: player ? player.groundentity !== null : false,
26153
+ waterLevel: player ? player.waterlevel : 0,
26154
+ mins: player ? { ...player.mins } : { x: -16, y: -16, z: -24 },
26155
+ maxs: player ? { ...player.maxs } : { x: 16, y: 16, z: 32 },
26156
+ damageAlpha: player?.client?.damage_alpha ?? 0,
26157
+ damageIndicators: [],
26158
+ // Transient
26159
+ blend: [0, 0, 0, 0],
26160
+ // Transient
26161
+ stats: player ? populatePlayerStats(player, levelClock.current.timeSeconds) : [],
26162
+ kick_angles: player?.client?.kick_angles ?? { x: 0, y: 0, z: 0 },
26163
+ kick_origin: player?.client?.kick_origin ?? { x: 0, y: 0, z: 0 },
26164
+ gunoffset: { x: 0, y: 0, z: 0 },
26165
+ gunangles: { x: 0, y: 0, z: 0 },
26166
+ gunindex: 0,
26167
+ // Q2 Network Compatibility
26168
+ pm_type: player?.client?.pm_type ?? 0,
26169
+ pm_time: player?.client?.pm_time ?? 0,
26170
+ pm_flags: player?.client?.pm_flags ?? 0,
26171
+ gun_frame: player?.client?.gun_frame ?? 0,
26172
+ rdflags: player?.client?.rdflags ?? 0,
26173
+ fov: player?.client?.fov ?? 90,
26174
+ renderfx: player?.renderfx ?? 0
26175
+ };
26176
+ return {
26177
+ mapName: entitySystem.level.mapname || "unknown",
26178
+ playerState,
26179
+ entities: sysSnapshot.entities,
26180
+ levelState: sysSnapshot.level,
26181
+ time: levelClock.current.timeSeconds,
26182
+ playerInventory: player?.client?.inventory ? serializePlayerInventory(player.client.inventory) : void 0,
26183
+ rngState: random5?.getState(),
26184
+ _internalSnapshot: sysSnapshot
26185
+ };
26186
+ }
26187
+ function applySerializedGameState(state, context) {
26188
+ const { entitySystem, levelClock, random: random5 } = context;
26189
+ levelClock.restore({
26190
+ frameNumber: 0,
26191
+ // Unknown in this format, reset to 0
26192
+ timeSeconds: state.time,
26193
+ previousTimeSeconds: state.time,
26194
+ deltaSeconds: 0
26195
+ });
26196
+ if (random5 && state.rngState) {
26197
+ random5.setState(state.rngState);
26198
+ }
26199
+ if (state._internalSnapshot) {
26200
+ entitySystem.restore(state._internalSnapshot);
26201
+ } else {
26202
+ console.warn("Restoring from partial SerializedGameState. Thinks and Pool state may be lost.");
26203
+ const partialSnapshot = {
26204
+ timeSeconds: state.time,
26205
+ pool: {
26206
+ capacity: state.entities.length + 32,
26207
+ // Estimate
26208
+ activeOrder: state.entities.map((e) => e.index),
26209
+ // Naive
26210
+ freeList: [],
26211
+ // Assume none
26212
+ pendingFree: []
26213
+ },
26214
+ entities: state.entities,
26215
+ thinks: [],
26216
+ // LOST
26217
+ awareness: {
26218
+ frameNumber: 0,
26219
+ sightEntityIndex: null,
26220
+ sightEntityFrame: 0,
26221
+ soundEntityIndex: null,
26222
+ soundEntityFrame: 0,
26223
+ sound2EntityIndex: null,
26224
+ sound2EntityFrame: 0,
26225
+ sightClientIndex: null
26226
+ },
26227
+ crossLevelFlags: 0,
26228
+ crossUnitFlags: 0,
26229
+ level: state.levelState
26230
+ };
26231
+ entitySystem.restore(partialSnapshot);
26232
+ }
26233
+ const player = entitySystem.find((e) => e.classname === "player");
26234
+ if (player && state.playerInventory) {
26235
+ const inventory = deserializePlayerInventory(state.playerInventory);
26236
+ player.client = player.client || {};
26237
+ if (player.client) {
26238
+ player.client.inventory = inventory;
26239
+ }
26240
+ }
26241
+ }
26242
+
26162
26243
  // src/index.ts
26163
26244
  var ZERO_VEC312 = { x: 0, y: 0, z: 0 };
26164
26245
  function createGame(imports, engine, options) {
@@ -26619,6 +26700,57 @@ function createGame(imports, engine, options) {
26619
26700
  velocity = { ...ZERO_VEC312 };
26620
26701
  }
26621
26702
  frameLoop.reset(state.time * 1e3);
26703
+ },
26704
+ setGodMode(enabled) {
26705
+ const player = entities.find((e) => e.classname === "player");
26706
+ if (player) {
26707
+ if (enabled) {
26708
+ player.flags |= 16 /* GodMode */;
26709
+ } else {
26710
+ player.flags &= ~16 /* GodMode */;
26711
+ }
26712
+ }
26713
+ },
26714
+ setNoclip(enabled) {
26715
+ const player = entities.find((e) => e.classname === "player");
26716
+ if (player) {
26717
+ if (enabled) {
26718
+ player.movetype = 1 /* Noclip */;
26719
+ } else {
26720
+ player.movetype = 4 /* Walk */;
26721
+ }
26722
+ }
26723
+ },
26724
+ setNotarget(enabled) {
26725
+ const player = entities.find((e) => e.classname === "player");
26726
+ if (player) {
26727
+ if (enabled) {
26728
+ player.flags |= 32 /* NoTarget */;
26729
+ } else {
26730
+ player.flags &= ~32 /* NoTarget */;
26731
+ }
26732
+ }
26733
+ },
26734
+ giveItem(itemClassname) {
26735
+ const player = entities.find((e) => e.classname === "player");
26736
+ if (player) {
26737
+ giveItem(player, itemClassname);
26738
+ }
26739
+ },
26740
+ damage(amount) {
26741
+ const player = entities.find((e) => e.classname === "player");
26742
+ if (player) {
26743
+ T_Damage(player, null, null, ZERO_VEC312, player.origin, ZERO_VEC312, amount, 0, 0 /* NONE */, 0 /* UNKNOWN */, levelClock.current.timeSeconds);
26744
+ }
26745
+ },
26746
+ teleport(origin2) {
26747
+ const player = entities.find((e) => e.classname === "player");
26748
+ if (player) {
26749
+ entities.unlink(player);
26750
+ player.origin = { ...origin2 };
26751
+ player.velocity = { ...ZERO_VEC312 };
26752
+ entities.link(player);
26753
+ }
26622
26754
  }
26623
26755
  };
26624
26756
  registerDefaultSpawns(spawnRegistry, gameExports);
@@ -26760,6 +26892,7 @@ export {
26760
26892
  getAmmoItemDefinition,
26761
26893
  getWeaponState,
26762
26894
  giveAmmoItem,
26895
+ giveItem,
26763
26896
  giveWeapon,
26764
26897
  hasAnyDamageFlag,
26765
26898
  hasItem,