quake2ts 0.0.445 → 0.0.448
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.
- package/package.json +1 -1
- package/packages/client/dist/browser/index.global.js +16 -16
- package/packages/client/dist/browser/index.global.js.map +1 -1
- package/packages/client/dist/tsconfig.tsbuildinfo +1 -1
- package/packages/engine/dist/tsconfig.tsbuildinfo +1 -1
- package/packages/engine/dist/types/editor/bsp-inspector.d.ts +11 -1
- package/packages/engine/dist/types/editor/bsp-inspector.d.ts.map +1 -1
- package/packages/engine/dist/types/render/renderer.d.ts +2 -0
- package/packages/engine/dist/types/render/renderer.d.ts.map +1 -1
- package/packages/game/dist/browser/index.global.js +4 -4
- package/packages/game/dist/browser/index.global.js.map +1 -1
- package/packages/game/dist/cjs/index.cjs +197 -57
- package/packages/game/dist/cjs/index.cjs.map +1 -1
- package/packages/game/dist/esm/index.js +196 -57
- package/packages/game/dist/esm/index.js.map +1 -1
- package/packages/game/dist/tsconfig.tsbuildinfo +1 -1
- package/packages/game/dist/types/ai/targeting.d.ts +1 -0
- package/packages/game/dist/types/ai/targeting.d.ts.map +1 -1
- package/packages/game/dist/types/combat/obituary.d.ts.map +1 -1
- package/packages/game/dist/types/entities/entity.d.ts +1 -0
- package/packages/game/dist/types/entities/entity.d.ts.map +1 -1
- package/packages/game/dist/types/entities/funcs.d.ts.map +1 -1
- package/packages/game/dist/types/entities/items/ammo.d.ts.map +1 -1
- package/packages/game/dist/types/entities/items/armor.d.ts.map +1 -1
- package/packages/game/dist/types/entities/items/common.d.ts +5 -0
- package/packages/game/dist/types/entities/items/common.d.ts.map +1 -0
- package/packages/game/dist/types/entities/items/health.d.ts.map +1 -1
- package/packages/game/dist/types/entities/items/powerups.d.ts.map +1 -1
- package/packages/game/dist/types/entities/items/weapons.d.ts.map +1 -1
- package/packages/game/dist/types/entities/player.d.ts.map +1 -1
- package/packages/game/dist/types/entities/projectiles/prox.d.ts.map +1 -1
- package/packages/game/dist/types/entities/spawn.d.ts +2 -0
- package/packages/game/dist/types/entities/spawn.d.ts.map +1 -1
- package/packages/game/dist/types/entities/system.d.ts +2 -0
- package/packages/game/dist/types/entities/system.d.ts.map +1 -1
- package/packages/game/dist/types/entities/triggers/look.d.ts +3 -0
- package/packages/game/dist/types/entities/triggers/look.d.ts.map +1 -0
- package/packages/game/dist/types/entities/triggers/secret.d.ts +3 -0
- package/packages/game/dist/types/entities/triggers/secret.d.ts.map +1 -0
- package/packages/game/dist/types/index.d.ts +1 -0
- package/packages/game/dist/types/index.d.ts.map +1 -1
|
@@ -2462,6 +2462,7 @@ var init_switching = __esm({
|
|
|
2462
2462
|
var index_exports = {};
|
|
2463
2463
|
__export(index_exports, {
|
|
2464
2464
|
AIFlags: () => AIFlags,
|
|
2465
|
+
AI_GetSightClient: () => AI_GetSightClient,
|
|
2465
2466
|
AMMO_TYPE_COUNT: () => AMMO_TYPE_COUNT,
|
|
2466
2467
|
ARMOR_INFO: () => ARMOR_INFO,
|
|
2467
2468
|
ARMOR_ITEMS: () => ARMOR_ITEMS,
|
|
@@ -2966,6 +2967,7 @@ var Entity = class {
|
|
|
2966
2967
|
this.svflags = 0;
|
|
2967
2968
|
this.monsterinfo = { ...DEFAULT_MONSTER_INFO, last_sighting: copyVec32() };
|
|
2968
2969
|
this.hackflags = 0;
|
|
2970
|
+
this.fov = 0;
|
|
2969
2971
|
this.show_hostile = 0;
|
|
2970
2972
|
this.light_level = 0;
|
|
2971
2973
|
this.owner = null;
|
|
@@ -3219,7 +3221,8 @@ var ENTITY_FIELD_METADATA = [
|
|
|
3219
3221
|
{ name: "beam2", type: "entity", save: true },
|
|
3220
3222
|
{ name: "chain", type: "entity", save: true },
|
|
3221
3223
|
{ name: "alpha", type: "float", save: true },
|
|
3222
|
-
{ name: "hackflags", type: "int", save: true }
|
|
3224
|
+
{ name: "hackflags", type: "int", save: true },
|
|
3225
|
+
{ name: "fov", type: "float", save: true }
|
|
3223
3226
|
];
|
|
3224
3227
|
|
|
3225
3228
|
// src/entities/system.ts
|
|
@@ -3508,6 +3511,24 @@ function classifyClientVisibility(self, other, level, trace) {
|
|
|
3508
3511
|
}
|
|
3509
3512
|
return true;
|
|
3510
3513
|
}
|
|
3514
|
+
function AI_GetSightClient(self, context, trace) {
|
|
3515
|
+
if ((self.monsterinfo.aiflags & 1024 /* NoStep */) !== 0) {
|
|
3516
|
+
return null;
|
|
3517
|
+
}
|
|
3518
|
+
for (let i = 1; i <= context.maxClients; i++) {
|
|
3519
|
+
const ent = context.entities[i];
|
|
3520
|
+
if (!ent || !ent.inUse || ent.health <= 0) {
|
|
3521
|
+
continue;
|
|
3522
|
+
}
|
|
3523
|
+
if ((ent.flags & FL_NOTARGET) !== 0) {
|
|
3524
|
+
continue;
|
|
3525
|
+
}
|
|
3526
|
+
if (visible(self, ent, trace, { throughGlass: false })) {
|
|
3527
|
+
return ent;
|
|
3528
|
+
}
|
|
3529
|
+
}
|
|
3530
|
+
return null;
|
|
3531
|
+
}
|
|
3511
3532
|
function updateSoundChase(self, client, level, hearability, trace) {
|
|
3512
3533
|
if ((self.spawnflags & SPAWNFLAG_MONSTER_AMBUSH) !== 0) {
|
|
3513
3534
|
if (!visible(self, client, trace)) return false;
|
|
@@ -4960,6 +4981,18 @@ var EntitySystem = class {
|
|
|
4960
4981
|
get game() {
|
|
4961
4982
|
return this._game;
|
|
4962
4983
|
}
|
|
4984
|
+
get maxClients() {
|
|
4985
|
+
return 32;
|
|
4986
|
+
}
|
|
4987
|
+
get entities() {
|
|
4988
|
+
const arr = new Array(this.pool.capacity + 1).fill(null);
|
|
4989
|
+
for (const ent of this.pool) {
|
|
4990
|
+
if (ent.index >= 0 && ent.index < arr.length) {
|
|
4991
|
+
arr[ent.index] = ent;
|
|
4992
|
+
}
|
|
4993
|
+
}
|
|
4994
|
+
return arr;
|
|
4995
|
+
}
|
|
4963
4996
|
get world() {
|
|
4964
4997
|
return this.pool.world;
|
|
4965
4998
|
}
|
|
@@ -10040,11 +10073,35 @@ var FLAG_ITEMS = {
|
|
|
10040
10073
|
}
|
|
10041
10074
|
};
|
|
10042
10075
|
|
|
10043
|
-
// src/entities/items/
|
|
10044
|
-
|
|
10045
|
-
|
|
10076
|
+
// src/entities/items/common.ts
|
|
10077
|
+
init_esm();
|
|
10078
|
+
function handleItemPickup(game, self, other, respawnTime = 30) {
|
|
10079
|
+
if (!game.deathmatch) {
|
|
10080
|
+
game.entities.free(self);
|
|
10081
|
+
return;
|
|
10082
|
+
}
|
|
10083
|
+
self.solid = 0 /* Not */;
|
|
10084
|
+
self.modelindex = 0;
|
|
10085
|
+
self.svflags |= 1 /* NoClient */;
|
|
10086
|
+
self.nextthink = game.time + respawnTime;
|
|
10087
|
+
game.entities.scheduleThink(self, self.nextthink);
|
|
10088
|
+
}
|
|
10089
|
+
function createItemRespawnFunction(game, originalModel) {
|
|
10090
|
+
let cachedIndex = 0;
|
|
10091
|
+
return (self) => {
|
|
10092
|
+
if (!cachedIndex) {
|
|
10093
|
+
cachedIndex = game.entities.modelIndex(originalModel);
|
|
10094
|
+
}
|
|
10046
10095
|
self.solid = 1 /* Trigger */;
|
|
10096
|
+
self.modelindex = cachedIndex;
|
|
10097
|
+
self.svflags &= ~1 /* NoClient */;
|
|
10098
|
+
game.multicast(self.origin, 1 /* Pvs */, ServerCommand.sound, 0, "items/respawn.wav", 1, 0, 0);
|
|
10047
10099
|
};
|
|
10100
|
+
}
|
|
10101
|
+
|
|
10102
|
+
// src/entities/items/weapons.ts
|
|
10103
|
+
function createWeaponPickupEntity(game, weaponItem) {
|
|
10104
|
+
const modelName = `models/items/${weaponItem.id.replace("weapon_", "")}/tris.md2`;
|
|
10048
10105
|
return {
|
|
10049
10106
|
classname: weaponItem.id,
|
|
10050
10107
|
solid: 1 /* Trigger */,
|
|
@@ -10055,22 +10112,16 @@ function createWeaponPickupEntity(game, weaponItem) {
|
|
|
10055
10112
|
if (pickupWeapon(other.client.inventory, weaponItem, game.time * 1e3)) {
|
|
10056
10113
|
game.sound?.(other, 0, "items/pkup.wav", 1, 1, 0);
|
|
10057
10114
|
game.centerprintf?.(other, `You got the ${weaponItem.name}`);
|
|
10058
|
-
self
|
|
10059
|
-
if (game.deathmatch) {
|
|
10060
|
-
self.nextthink = game.time + 30;
|
|
10061
|
-
game.entities.scheduleThink(self, self.nextthink);
|
|
10062
|
-
}
|
|
10115
|
+
handleItemPickup(game, self, other);
|
|
10063
10116
|
}
|
|
10064
10117
|
},
|
|
10065
|
-
think:
|
|
10118
|
+
think: createItemRespawnFunction(game, modelName)
|
|
10066
10119
|
};
|
|
10067
10120
|
}
|
|
10068
10121
|
|
|
10069
10122
|
// src/entities/items/health.ts
|
|
10070
10123
|
function createHealthPickupEntity(game, healthItem) {
|
|
10071
|
-
const
|
|
10072
|
-
self.solid = 1 /* Trigger */;
|
|
10073
|
-
};
|
|
10124
|
+
const modelName = `models/items/healing/${healthItem.id.replace("item_health_", "")}/tris.md2`;
|
|
10074
10125
|
return {
|
|
10075
10126
|
classname: healthItem.id,
|
|
10076
10127
|
solid: 1 /* Trigger */,
|
|
@@ -10085,22 +10136,16 @@ function createHealthPickupEntity(game, healthItem) {
|
|
|
10085
10136
|
}
|
|
10086
10137
|
game.sound?.(other, 0, "items/pkup.wav", 1, 1, 0);
|
|
10087
10138
|
game.centerprintf?.(other, `You got the ${healthItem.name}`);
|
|
10088
|
-
self
|
|
10089
|
-
if (game.deathmatch) {
|
|
10090
|
-
self.nextthink = game.time + 30;
|
|
10091
|
-
game.entities.scheduleThink(self, self.nextthink);
|
|
10092
|
-
}
|
|
10139
|
+
handleItemPickup(game, self, other);
|
|
10093
10140
|
}
|
|
10094
10141
|
},
|
|
10095
|
-
think:
|
|
10142
|
+
think: createItemRespawnFunction(game, modelName)
|
|
10096
10143
|
};
|
|
10097
10144
|
}
|
|
10098
10145
|
|
|
10099
10146
|
// src/entities/items/armor.ts
|
|
10100
10147
|
function createArmorPickupEntity(game, armorItem) {
|
|
10101
|
-
const
|
|
10102
|
-
self.solid = 1 /* Trigger */;
|
|
10103
|
-
};
|
|
10148
|
+
const modelName = `models/items/armor/${armorItem.id.replace("item_armor_", "")}/tris.md2`;
|
|
10104
10149
|
return {
|
|
10105
10150
|
classname: armorItem.id,
|
|
10106
10151
|
solid: 1 /* Trigger */,
|
|
@@ -10111,22 +10156,17 @@ function createArmorPickupEntity(game, armorItem) {
|
|
|
10111
10156
|
if (pickupArmor(other.client.inventory, armorItem, game.time * 1e3)) {
|
|
10112
10157
|
game.sound?.(other, 0, "items/pkup.wav", 1, 1, 0);
|
|
10113
10158
|
game.centerprintf?.(other, `You got the ${armorItem.name}`);
|
|
10114
|
-
self
|
|
10115
|
-
if (game.deathmatch) {
|
|
10116
|
-
self.nextthink = game.time + 30;
|
|
10117
|
-
game.entities.scheduleThink(self, self.nextthink);
|
|
10118
|
-
}
|
|
10159
|
+
handleItemPickup(game, self, other);
|
|
10119
10160
|
}
|
|
10120
10161
|
},
|
|
10121
|
-
think:
|
|
10162
|
+
think: createItemRespawnFunction(game, modelName)
|
|
10122
10163
|
};
|
|
10123
10164
|
}
|
|
10124
10165
|
|
|
10125
10166
|
// src/entities/items/powerups.ts
|
|
10126
10167
|
function createPowerupPickupEntity(game, powerupItem) {
|
|
10127
|
-
const
|
|
10128
|
-
|
|
10129
|
-
};
|
|
10168
|
+
const respawnTime = powerupItem.id === "item_quad" || powerupItem.id === "item_invulnerability" ? 60 : 30;
|
|
10169
|
+
const modelName = `models/items/powerups/${powerupItem.id.replace("item_", "")}/tris.md2`;
|
|
10130
10170
|
return {
|
|
10131
10171
|
classname: powerupItem.id,
|
|
10132
10172
|
solid: 1 /* Trigger */,
|
|
@@ -10137,14 +10177,10 @@ function createPowerupPickupEntity(game, powerupItem) {
|
|
|
10137
10177
|
if (pickupPowerup(other.client, powerupItem, game.time * 1e3)) {
|
|
10138
10178
|
game.sound?.(other, 0, "items/pkup.wav", 1, 1, 0);
|
|
10139
10179
|
game.centerprintf?.(other, `You got the ${powerupItem.name}`);
|
|
10140
|
-
self
|
|
10141
|
-
if (game.deathmatch) {
|
|
10142
|
-
self.nextthink = game.time + 30;
|
|
10143
|
-
game.entities.scheduleThink(self, self.nextthink);
|
|
10144
|
-
}
|
|
10180
|
+
handleItemPickup(game, self, other, respawnTime);
|
|
10145
10181
|
}
|
|
10146
10182
|
},
|
|
10147
|
-
think:
|
|
10183
|
+
think: createItemRespawnFunction(game, modelName)
|
|
10148
10184
|
};
|
|
10149
10185
|
}
|
|
10150
10186
|
|
|
@@ -10190,9 +10226,7 @@ var AMMO_DISPLAY_NAMES = {
|
|
|
10190
10226
|
};
|
|
10191
10227
|
function createAmmoPickupEntity(game, itemId) {
|
|
10192
10228
|
const def = getAmmoItemDefinition(itemId);
|
|
10193
|
-
const
|
|
10194
|
-
self.solid = 1 /* Trigger */;
|
|
10195
|
-
};
|
|
10229
|
+
const modelName = `models/items/ammo/${itemId.replace("ammo_", "")}/tris.md2`;
|
|
10196
10230
|
return {
|
|
10197
10231
|
classname: itemId,
|
|
10198
10232
|
solid: 1 /* Trigger */,
|
|
@@ -10205,14 +10239,10 @@ function createAmmoPickupEntity(game, itemId) {
|
|
|
10205
10239
|
game.sound?.(other, 0, "items/pkup.wav", 1, 1, 0);
|
|
10206
10240
|
const name = AMMO_DISPLAY_NAMES[itemId] || itemId.replace("ammo_", "");
|
|
10207
10241
|
game.centerprintf?.(other, `You got ${def.quantity} ${name}`);
|
|
10208
|
-
self
|
|
10209
|
-
if (game.deathmatch) {
|
|
10210
|
-
self.nextthink = game.time + 30;
|
|
10211
|
-
game.entities.scheduleThink(self, self.nextthink);
|
|
10212
|
-
}
|
|
10242
|
+
handleItemPickup(game, self, other);
|
|
10213
10243
|
}
|
|
10214
10244
|
},
|
|
10215
|
-
think:
|
|
10245
|
+
think: createItemRespawnFunction(game, modelName)
|
|
10216
10246
|
};
|
|
10217
10247
|
}
|
|
10218
10248
|
|
|
@@ -11049,6 +11079,53 @@ var func_plat = (entity, context) => {
|
|
|
11049
11079
|
}
|
|
11050
11080
|
};
|
|
11051
11081
|
};
|
|
11082
|
+
var func_plat2 = (entity, context) => {
|
|
11083
|
+
func_plat(entity, context);
|
|
11084
|
+
};
|
|
11085
|
+
function pendulum_swing(ent, context) {
|
|
11086
|
+
let nextThink = ent.nextthink + 0.1;
|
|
11087
|
+
const freq = ent.speed || 0.1;
|
|
11088
|
+
const time = context.timeSeconds;
|
|
11089
|
+
const speed = ent.speed || 1;
|
|
11090
|
+
const dist = ent.distance || 90;
|
|
11091
|
+
const baseAngle = ent.move_angles?.z || 0;
|
|
11092
|
+
const angleDelta = Math.sin(time * speed) * dist;
|
|
11093
|
+
ent.angles = {
|
|
11094
|
+
x: ent.angles.x,
|
|
11095
|
+
y: ent.angles.y,
|
|
11096
|
+
z: baseAngle + angleDelta
|
|
11097
|
+
};
|
|
11098
|
+
context.linkentity(ent);
|
|
11099
|
+
context.scheduleThink(ent, time + 0.1);
|
|
11100
|
+
}
|
|
11101
|
+
var func_pendulum = (entity, context) => {
|
|
11102
|
+
entity.solid = 3 /* Bsp */;
|
|
11103
|
+
entity.movetype = 2 /* Push */;
|
|
11104
|
+
if (!entity.speed) entity.speed = 30;
|
|
11105
|
+
entity.move_angles = { ...entity.angles };
|
|
11106
|
+
entity.distance = entity.dmg || 90;
|
|
11107
|
+
const distKey = context.keyValues.distance;
|
|
11108
|
+
if (distKey) {
|
|
11109
|
+
entity.distance = parseFloat(distKey);
|
|
11110
|
+
}
|
|
11111
|
+
if (entity.targetname) {
|
|
11112
|
+
entity.use = (self) => {
|
|
11113
|
+
self.use = void 0;
|
|
11114
|
+
self.think = (e) => pendulum_swing(e, context.entities);
|
|
11115
|
+
context.entities.scheduleThink(self, context.entities.timeSeconds + 0.1);
|
|
11116
|
+
};
|
|
11117
|
+
} else {
|
|
11118
|
+
entity.think = (e) => pendulum_swing(e, context.entities);
|
|
11119
|
+
context.entities.scheduleThink(entity, context.entities.timeSeconds + 0.1);
|
|
11120
|
+
}
|
|
11121
|
+
if (entity.dmg) {
|
|
11122
|
+
entity.blocked = (self, other) => {
|
|
11123
|
+
if (other && other.takedamage) {
|
|
11124
|
+
other.health -= self.dmg;
|
|
11125
|
+
}
|
|
11126
|
+
};
|
|
11127
|
+
}
|
|
11128
|
+
};
|
|
11052
11129
|
var func_rotating = (entity, context) => {
|
|
11053
11130
|
entity.solid = 3 /* Bsp */;
|
|
11054
11131
|
entity.movetype = 2 /* Push */;
|
|
@@ -11419,7 +11496,9 @@ function registerFuncSpawns(registry) {
|
|
|
11419
11496
|
registry.register("func_button", func_button);
|
|
11420
11497
|
registry.register("func_train", func_train);
|
|
11421
11498
|
registry.register("func_plat", func_plat);
|
|
11499
|
+
registry.register("func_plat2", func_plat2);
|
|
11422
11500
|
registry.register("func_rotating", func_rotating);
|
|
11501
|
+
registry.register("func_pendulum", func_pendulum);
|
|
11423
11502
|
registry.register("func_conveyor", func_conveyor);
|
|
11424
11503
|
registry.register("func_water", func_water);
|
|
11425
11504
|
registry.register("func_explosive", func_explosive);
|
|
@@ -23982,6 +24061,21 @@ function spawnEntitiesFromText(text, options) {
|
|
|
23982
24061
|
}
|
|
23983
24062
|
return spawned;
|
|
23984
24063
|
}
|
|
24064
|
+
function SelectDeathmatchSpawnPoint(entities) {
|
|
24065
|
+
const spots = entities.findByClassname("info_player_deathmatch");
|
|
24066
|
+
if (spots.length === 0) {
|
|
24067
|
+
return void 0;
|
|
24068
|
+
}
|
|
24069
|
+
const index = Math.floor(entities.rng.frandom() * spots.length);
|
|
24070
|
+
return spots[index];
|
|
24071
|
+
}
|
|
24072
|
+
function SelectSpawnPoint(entities) {
|
|
24073
|
+
if (entities.deathmatch) {
|
|
24074
|
+
const spot = SelectDeathmatchSpawnPoint(entities);
|
|
24075
|
+
if (spot) return spot;
|
|
24076
|
+
}
|
|
24077
|
+
return findPlayerStart(entities);
|
|
24078
|
+
}
|
|
23985
24079
|
function findPlayerStart(entities) {
|
|
23986
24080
|
return entities.find(
|
|
23987
24081
|
(entity) => entity.classname === "info_player_start"
|
|
@@ -25149,26 +25243,37 @@ function ClientObituary(self, inflictor, attacker, mod, sys) {
|
|
|
25149
25243
|
}
|
|
25150
25244
|
if (mod === 24 /* SUICIDE */) {
|
|
25151
25245
|
message = `${friendlyName} suicides.`;
|
|
25246
|
+
if (self.client) self.client.score = (self.client.score || 0) - 1;
|
|
25152
25247
|
} else if (mod === 23 /* FALLING */) {
|
|
25153
25248
|
message = `${friendlyName} cratered.`;
|
|
25249
|
+
if (self.client) self.client.score = (self.client.score || 0) - 1;
|
|
25154
25250
|
} else if (mod === 20 /* CRUSH */) {
|
|
25155
25251
|
message = `${friendlyName} was squished.`;
|
|
25252
|
+
if (self.client) self.client.score = (self.client.score || 0) - 1;
|
|
25156
25253
|
} else if (mod === 17 /* WATER */) {
|
|
25157
25254
|
message = `${friendlyName} sank like a rock.`;
|
|
25255
|
+
if (self.client) self.client.score = (self.client.score || 0) - 1;
|
|
25158
25256
|
} else if (mod === 18 /* SLIME */) {
|
|
25159
25257
|
message = `${friendlyName} melted.`;
|
|
25258
|
+
if (self.client) self.client.score = (self.client.score || 0) - 1;
|
|
25160
25259
|
} else if (mod === 19 /* LAVA */) {
|
|
25161
25260
|
message = `${friendlyName} does a back flip into the lava.`;
|
|
25261
|
+
if (self.client) self.client.score = (self.client.score || 0) - 1;
|
|
25162
25262
|
} else if (mod === 26 /* EXPLOSIVE */) {
|
|
25163
25263
|
message = `${friendlyName} blew up.`;
|
|
25264
|
+
if (self.client) self.client.score = (self.client.score || 0) - 1;
|
|
25164
25265
|
} else if (mod === 31 /* TARGET_LASER */) {
|
|
25165
25266
|
message = `${friendlyName} saw the light.`;
|
|
25267
|
+
if (self.client) self.client.score = (self.client.score || 0) - 1;
|
|
25166
25268
|
} else if (mod === 34 /* TARGET_BLASTER */) {
|
|
25167
25269
|
message = `${friendlyName} got blasted.`;
|
|
25270
|
+
if (self.client) self.client.score = (self.client.score || 0) - 1;
|
|
25168
25271
|
} else if (mod === 28 /* BOMB */) {
|
|
25169
25272
|
message = `${friendlyName} was bombed.`;
|
|
25273
|
+
if (self.client) self.client.score = (self.client.score || 0) - 1;
|
|
25170
25274
|
} else if (attacker && attacker.classname === "player") {
|
|
25171
25275
|
if (self === attacker) {
|
|
25276
|
+
if (self.client) self.client.score = (self.client.score || 0) - 1;
|
|
25172
25277
|
switch (mod) {
|
|
25173
25278
|
case 6 /* GRENADE */:
|
|
25174
25279
|
case 7 /* G_SPLASH */:
|
|
@@ -25197,6 +25302,9 @@ function ClientObituary(self, inflictor, attacker, mod, sys) {
|
|
|
25197
25302
|
break;
|
|
25198
25303
|
}
|
|
25199
25304
|
} else {
|
|
25305
|
+
if (attacker.client) {
|
|
25306
|
+
attacker.client.score = (attacker.client.score || 0) + 1;
|
|
25307
|
+
}
|
|
25200
25308
|
const attackerName = "Enemy";
|
|
25201
25309
|
switch (mod) {
|
|
25202
25310
|
case 1 /* BLASTER */:
|
|
@@ -25429,6 +25537,18 @@ function player_die(self, inflictor, attacker, damage, point, mod, sys) {
|
|
|
25429
25537
|
}
|
|
25430
25538
|
function player_think(self, sys) {
|
|
25431
25539
|
if (!self.client) return;
|
|
25540
|
+
if (self.deadflag) {
|
|
25541
|
+
if (self.client.buttons) {
|
|
25542
|
+
if (sys.game && sys.game.respawn) {
|
|
25543
|
+
sys.game.respawn(self);
|
|
25544
|
+
return;
|
|
25545
|
+
}
|
|
25546
|
+
}
|
|
25547
|
+
P_PlayerThink(self, sys);
|
|
25548
|
+
self.nextthink = sys.timeSeconds + 0.1;
|
|
25549
|
+
sys.scheduleThink(self, self.nextthink);
|
|
25550
|
+
return;
|
|
25551
|
+
}
|
|
25432
25552
|
const nowMs = sys.timeSeconds * 1e3;
|
|
25433
25553
|
const quadTime = self.client.quad_time || 0;
|
|
25434
25554
|
const doubleTime = self.client.double_time || 0;
|
|
@@ -26099,17 +26219,9 @@ function createGame(imports, engine, options) {
|
|
|
26099
26219
|
return true;
|
|
26100
26220
|
},
|
|
26101
26221
|
clientBegin(client) {
|
|
26102
|
-
const playerStart = findPlayerStart(entities);
|
|
26103
26222
|
const player = entities.spawn();
|
|
26104
|
-
player.classname = "player";
|
|
26105
|
-
player.origin = playerStart ? { ...playerStart.origin } : { x: 0, y: 0, z: 0 };
|
|
26106
|
-
player.angles = playerStart ? { ...playerStart.angles } : { x: 0, y: 0, z: 0 };
|
|
26107
|
-
player.health = 100;
|
|
26108
|
-
player.takedamage = true;
|
|
26109
|
-
player.movetype = 7 /* Toss */;
|
|
26110
|
-
player.mins = { x: -16, y: -16, z: -24 };
|
|
26111
|
-
player.maxs = { x: 16, y: 16, z: 32 };
|
|
26112
26223
|
player.client = client;
|
|
26224
|
+
this.respawn(player);
|
|
26113
26225
|
player.die = (self, inflictor, attacker, damage, point, mod) => {
|
|
26114
26226
|
player_die(self, inflictor, attacker, damage, point, mod, entities);
|
|
26115
26227
|
};
|
|
@@ -26121,10 +26233,37 @@ function createGame(imports, engine, options) {
|
|
|
26121
26233
|
};
|
|
26122
26234
|
player.nextthink = entities.timeSeconds + 0.1;
|
|
26123
26235
|
entities.scheduleThink(player, player.nextthink);
|
|
26124
|
-
entities.finalizeSpawn(player);
|
|
26125
|
-
origin = { ...player.origin };
|
|
26126
26236
|
return player;
|
|
26127
26237
|
},
|
|
26238
|
+
respawn(ent) {
|
|
26239
|
+
if (!ent.client) return;
|
|
26240
|
+
const spawnPoint = SelectSpawnPoint(entities);
|
|
26241
|
+
ent.classname = "player";
|
|
26242
|
+
ent.origin = spawnPoint ? { ...spawnPoint.origin } : { x: 0, y: 0, z: 0 };
|
|
26243
|
+
ent.angles = spawnPoint ? { ...spawnPoint.angles } : { x: 0, y: 0, z: 0 };
|
|
26244
|
+
ent.health = 100;
|
|
26245
|
+
ent.takedamage = true;
|
|
26246
|
+
ent.movetype = 7 /* Toss */;
|
|
26247
|
+
ent.mins = { x: -16, y: -16, z: -24 };
|
|
26248
|
+
ent.maxs = { x: 16, y: 16, z: 32 };
|
|
26249
|
+
ent.solid = 2 /* BoundingBox */;
|
|
26250
|
+
ent.deadflag = 0;
|
|
26251
|
+
ent.modelindex = engine.modelIndex?.("players/male/tris.md2") || 0;
|
|
26252
|
+
ent.client.damage_alpha = 0;
|
|
26253
|
+
ent.client.damage_blend = [0, 0, 0];
|
|
26254
|
+
ent.client.anim_priority = 0;
|
|
26255
|
+
ent.client.anim_end = 0;
|
|
26256
|
+
ent.frame = 0;
|
|
26257
|
+
if (deathmatch) {
|
|
26258
|
+
ent.client.inventory = createPlayerInventory({
|
|
26259
|
+
weapons: [WeaponId.Blaster],
|
|
26260
|
+
currentWeapon: WeaponId.Blaster
|
|
26261
|
+
});
|
|
26262
|
+
} else {
|
|
26263
|
+
}
|
|
26264
|
+
entities.finalizeSpawn(ent);
|
|
26265
|
+
origin = { ...ent.origin };
|
|
26266
|
+
},
|
|
26128
26267
|
clientDisconnect(ent) {
|
|
26129
26268
|
if (ent && ent.inUse) {
|
|
26130
26269
|
entities.free(ent);
|
|
@@ -26223,6 +26362,7 @@ function createGame(imports, engine, options) {
|
|
|
26223
26362
|
// Annotate the CommonJS export names for ESM import in node:
|
|
26224
26363
|
0 && (module.exports = {
|
|
26225
26364
|
AIFlags,
|
|
26365
|
+
AI_GetSightClient,
|
|
26226
26366
|
AMMO_TYPE_COUNT,
|
|
26227
26367
|
ARMOR_INFO,
|
|
26228
26368
|
ARMOR_ITEMS,
|