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
|
@@ -2779,6 +2779,7 @@ var Entity = class {
|
|
|
2779
2779
|
this.svflags = 0;
|
|
2780
2780
|
this.monsterinfo = { ...DEFAULT_MONSTER_INFO, last_sighting: copyVec32() };
|
|
2781
2781
|
this.hackflags = 0;
|
|
2782
|
+
this.fov = 0;
|
|
2782
2783
|
this.show_hostile = 0;
|
|
2783
2784
|
this.light_level = 0;
|
|
2784
2785
|
this.owner = null;
|
|
@@ -3032,7 +3033,8 @@ var ENTITY_FIELD_METADATA = [
|
|
|
3032
3033
|
{ name: "beam2", type: "entity", save: true },
|
|
3033
3034
|
{ name: "chain", type: "entity", save: true },
|
|
3034
3035
|
{ name: "alpha", type: "float", save: true },
|
|
3035
|
-
{ name: "hackflags", type: "int", save: true }
|
|
3036
|
+
{ name: "hackflags", type: "int", save: true },
|
|
3037
|
+
{ name: "fov", type: "float", save: true }
|
|
3036
3038
|
];
|
|
3037
3039
|
|
|
3038
3040
|
// src/entities/system.ts
|
|
@@ -3321,6 +3323,24 @@ function classifyClientVisibility(self, other, level, trace) {
|
|
|
3321
3323
|
}
|
|
3322
3324
|
return true;
|
|
3323
3325
|
}
|
|
3326
|
+
function AI_GetSightClient(self, context, trace) {
|
|
3327
|
+
if ((self.monsterinfo.aiflags & 1024 /* NoStep */) !== 0) {
|
|
3328
|
+
return null;
|
|
3329
|
+
}
|
|
3330
|
+
for (let i = 1; i <= context.maxClients; i++) {
|
|
3331
|
+
const ent = context.entities[i];
|
|
3332
|
+
if (!ent || !ent.inUse || ent.health <= 0) {
|
|
3333
|
+
continue;
|
|
3334
|
+
}
|
|
3335
|
+
if ((ent.flags & FL_NOTARGET) !== 0) {
|
|
3336
|
+
continue;
|
|
3337
|
+
}
|
|
3338
|
+
if (visible(self, ent, trace, { throughGlass: false })) {
|
|
3339
|
+
return ent;
|
|
3340
|
+
}
|
|
3341
|
+
}
|
|
3342
|
+
return null;
|
|
3343
|
+
}
|
|
3324
3344
|
function updateSoundChase(self, client, level, hearability, trace) {
|
|
3325
3345
|
if ((self.spawnflags & SPAWNFLAG_MONSTER_AMBUSH) !== 0) {
|
|
3326
3346
|
if (!visible(self, client, trace)) return false;
|
|
@@ -4773,6 +4793,18 @@ var EntitySystem = class {
|
|
|
4773
4793
|
get game() {
|
|
4774
4794
|
return this._game;
|
|
4775
4795
|
}
|
|
4796
|
+
get maxClients() {
|
|
4797
|
+
return 32;
|
|
4798
|
+
}
|
|
4799
|
+
get entities() {
|
|
4800
|
+
const arr = new Array(this.pool.capacity + 1).fill(null);
|
|
4801
|
+
for (const ent of this.pool) {
|
|
4802
|
+
if (ent.index >= 0 && ent.index < arr.length) {
|
|
4803
|
+
arr[ent.index] = ent;
|
|
4804
|
+
}
|
|
4805
|
+
}
|
|
4806
|
+
return arr;
|
|
4807
|
+
}
|
|
4776
4808
|
get world() {
|
|
4777
4809
|
return this.pool.world;
|
|
4778
4810
|
}
|
|
@@ -9853,11 +9885,35 @@ var FLAG_ITEMS = {
|
|
|
9853
9885
|
}
|
|
9854
9886
|
};
|
|
9855
9887
|
|
|
9856
|
-
// src/entities/items/
|
|
9857
|
-
|
|
9858
|
-
|
|
9888
|
+
// src/entities/items/common.ts
|
|
9889
|
+
init_esm();
|
|
9890
|
+
function handleItemPickup(game, self, other, respawnTime = 30) {
|
|
9891
|
+
if (!game.deathmatch) {
|
|
9892
|
+
game.entities.free(self);
|
|
9893
|
+
return;
|
|
9894
|
+
}
|
|
9895
|
+
self.solid = 0 /* Not */;
|
|
9896
|
+
self.modelindex = 0;
|
|
9897
|
+
self.svflags |= 1 /* NoClient */;
|
|
9898
|
+
self.nextthink = game.time + respawnTime;
|
|
9899
|
+
game.entities.scheduleThink(self, self.nextthink);
|
|
9900
|
+
}
|
|
9901
|
+
function createItemRespawnFunction(game, originalModel) {
|
|
9902
|
+
let cachedIndex = 0;
|
|
9903
|
+
return (self) => {
|
|
9904
|
+
if (!cachedIndex) {
|
|
9905
|
+
cachedIndex = game.entities.modelIndex(originalModel);
|
|
9906
|
+
}
|
|
9859
9907
|
self.solid = 1 /* Trigger */;
|
|
9908
|
+
self.modelindex = cachedIndex;
|
|
9909
|
+
self.svflags &= ~1 /* NoClient */;
|
|
9910
|
+
game.multicast(self.origin, 1 /* Pvs */, ServerCommand.sound, 0, "items/respawn.wav", 1, 0, 0);
|
|
9860
9911
|
};
|
|
9912
|
+
}
|
|
9913
|
+
|
|
9914
|
+
// src/entities/items/weapons.ts
|
|
9915
|
+
function createWeaponPickupEntity(game, weaponItem) {
|
|
9916
|
+
const modelName = `models/items/${weaponItem.id.replace("weapon_", "")}/tris.md2`;
|
|
9861
9917
|
return {
|
|
9862
9918
|
classname: weaponItem.id,
|
|
9863
9919
|
solid: 1 /* Trigger */,
|
|
@@ -9868,22 +9924,16 @@ function createWeaponPickupEntity(game, weaponItem) {
|
|
|
9868
9924
|
if (pickupWeapon(other.client.inventory, weaponItem, game.time * 1e3)) {
|
|
9869
9925
|
game.sound?.(other, 0, "items/pkup.wav", 1, 1, 0);
|
|
9870
9926
|
game.centerprintf?.(other, `You got the ${weaponItem.name}`);
|
|
9871
|
-
self
|
|
9872
|
-
if (game.deathmatch) {
|
|
9873
|
-
self.nextthink = game.time + 30;
|
|
9874
|
-
game.entities.scheduleThink(self, self.nextthink);
|
|
9875
|
-
}
|
|
9927
|
+
handleItemPickup(game, self, other);
|
|
9876
9928
|
}
|
|
9877
9929
|
},
|
|
9878
|
-
think:
|
|
9930
|
+
think: createItemRespawnFunction(game, modelName)
|
|
9879
9931
|
};
|
|
9880
9932
|
}
|
|
9881
9933
|
|
|
9882
9934
|
// src/entities/items/health.ts
|
|
9883
9935
|
function createHealthPickupEntity(game, healthItem) {
|
|
9884
|
-
const
|
|
9885
|
-
self.solid = 1 /* Trigger */;
|
|
9886
|
-
};
|
|
9936
|
+
const modelName = `models/items/healing/${healthItem.id.replace("item_health_", "")}/tris.md2`;
|
|
9887
9937
|
return {
|
|
9888
9938
|
classname: healthItem.id,
|
|
9889
9939
|
solid: 1 /* Trigger */,
|
|
@@ -9898,22 +9948,16 @@ function createHealthPickupEntity(game, healthItem) {
|
|
|
9898
9948
|
}
|
|
9899
9949
|
game.sound?.(other, 0, "items/pkup.wav", 1, 1, 0);
|
|
9900
9950
|
game.centerprintf?.(other, `You got the ${healthItem.name}`);
|
|
9901
|
-
self
|
|
9902
|
-
if (game.deathmatch) {
|
|
9903
|
-
self.nextthink = game.time + 30;
|
|
9904
|
-
game.entities.scheduleThink(self, self.nextthink);
|
|
9905
|
-
}
|
|
9951
|
+
handleItemPickup(game, self, other);
|
|
9906
9952
|
}
|
|
9907
9953
|
},
|
|
9908
|
-
think:
|
|
9954
|
+
think: createItemRespawnFunction(game, modelName)
|
|
9909
9955
|
};
|
|
9910
9956
|
}
|
|
9911
9957
|
|
|
9912
9958
|
// src/entities/items/armor.ts
|
|
9913
9959
|
function createArmorPickupEntity(game, armorItem) {
|
|
9914
|
-
const
|
|
9915
|
-
self.solid = 1 /* Trigger */;
|
|
9916
|
-
};
|
|
9960
|
+
const modelName = `models/items/armor/${armorItem.id.replace("item_armor_", "")}/tris.md2`;
|
|
9917
9961
|
return {
|
|
9918
9962
|
classname: armorItem.id,
|
|
9919
9963
|
solid: 1 /* Trigger */,
|
|
@@ -9924,22 +9968,17 @@ function createArmorPickupEntity(game, armorItem) {
|
|
|
9924
9968
|
if (pickupArmor(other.client.inventory, armorItem, game.time * 1e3)) {
|
|
9925
9969
|
game.sound?.(other, 0, "items/pkup.wav", 1, 1, 0);
|
|
9926
9970
|
game.centerprintf?.(other, `You got the ${armorItem.name}`);
|
|
9927
|
-
self
|
|
9928
|
-
if (game.deathmatch) {
|
|
9929
|
-
self.nextthink = game.time + 30;
|
|
9930
|
-
game.entities.scheduleThink(self, self.nextthink);
|
|
9931
|
-
}
|
|
9971
|
+
handleItemPickup(game, self, other);
|
|
9932
9972
|
}
|
|
9933
9973
|
},
|
|
9934
|
-
think:
|
|
9974
|
+
think: createItemRespawnFunction(game, modelName)
|
|
9935
9975
|
};
|
|
9936
9976
|
}
|
|
9937
9977
|
|
|
9938
9978
|
// src/entities/items/powerups.ts
|
|
9939
9979
|
function createPowerupPickupEntity(game, powerupItem) {
|
|
9940
|
-
const
|
|
9941
|
-
|
|
9942
|
-
};
|
|
9980
|
+
const respawnTime = powerupItem.id === "item_quad" || powerupItem.id === "item_invulnerability" ? 60 : 30;
|
|
9981
|
+
const modelName = `models/items/powerups/${powerupItem.id.replace("item_", "")}/tris.md2`;
|
|
9943
9982
|
return {
|
|
9944
9983
|
classname: powerupItem.id,
|
|
9945
9984
|
solid: 1 /* Trigger */,
|
|
@@ -9950,14 +9989,10 @@ function createPowerupPickupEntity(game, powerupItem) {
|
|
|
9950
9989
|
if (pickupPowerup(other.client, powerupItem, game.time * 1e3)) {
|
|
9951
9990
|
game.sound?.(other, 0, "items/pkup.wav", 1, 1, 0);
|
|
9952
9991
|
game.centerprintf?.(other, `You got the ${powerupItem.name}`);
|
|
9953
|
-
self
|
|
9954
|
-
if (game.deathmatch) {
|
|
9955
|
-
self.nextthink = game.time + 30;
|
|
9956
|
-
game.entities.scheduleThink(self, self.nextthink);
|
|
9957
|
-
}
|
|
9992
|
+
handleItemPickup(game, self, other, respawnTime);
|
|
9958
9993
|
}
|
|
9959
9994
|
},
|
|
9960
|
-
think:
|
|
9995
|
+
think: createItemRespawnFunction(game, modelName)
|
|
9961
9996
|
};
|
|
9962
9997
|
}
|
|
9963
9998
|
|
|
@@ -10003,9 +10038,7 @@ var AMMO_DISPLAY_NAMES = {
|
|
|
10003
10038
|
};
|
|
10004
10039
|
function createAmmoPickupEntity(game, itemId) {
|
|
10005
10040
|
const def = getAmmoItemDefinition(itemId);
|
|
10006
|
-
const
|
|
10007
|
-
self.solid = 1 /* Trigger */;
|
|
10008
|
-
};
|
|
10041
|
+
const modelName = `models/items/ammo/${itemId.replace("ammo_", "")}/tris.md2`;
|
|
10009
10042
|
return {
|
|
10010
10043
|
classname: itemId,
|
|
10011
10044
|
solid: 1 /* Trigger */,
|
|
@@ -10018,14 +10051,10 @@ function createAmmoPickupEntity(game, itemId) {
|
|
|
10018
10051
|
game.sound?.(other, 0, "items/pkup.wav", 1, 1, 0);
|
|
10019
10052
|
const name = AMMO_DISPLAY_NAMES[itemId] || itemId.replace("ammo_", "");
|
|
10020
10053
|
game.centerprintf?.(other, `You got ${def.quantity} ${name}`);
|
|
10021
|
-
self
|
|
10022
|
-
if (game.deathmatch) {
|
|
10023
|
-
self.nextthink = game.time + 30;
|
|
10024
|
-
game.entities.scheduleThink(self, self.nextthink);
|
|
10025
|
-
}
|
|
10054
|
+
handleItemPickup(game, self, other);
|
|
10026
10055
|
}
|
|
10027
10056
|
},
|
|
10028
|
-
think:
|
|
10057
|
+
think: createItemRespawnFunction(game, modelName)
|
|
10029
10058
|
};
|
|
10030
10059
|
}
|
|
10031
10060
|
|
|
@@ -10862,6 +10891,53 @@ var func_plat = (entity, context) => {
|
|
|
10862
10891
|
}
|
|
10863
10892
|
};
|
|
10864
10893
|
};
|
|
10894
|
+
var func_plat2 = (entity, context) => {
|
|
10895
|
+
func_plat(entity, context);
|
|
10896
|
+
};
|
|
10897
|
+
function pendulum_swing(ent, context) {
|
|
10898
|
+
let nextThink = ent.nextthink + 0.1;
|
|
10899
|
+
const freq = ent.speed || 0.1;
|
|
10900
|
+
const time = context.timeSeconds;
|
|
10901
|
+
const speed = ent.speed || 1;
|
|
10902
|
+
const dist = ent.distance || 90;
|
|
10903
|
+
const baseAngle = ent.move_angles?.z || 0;
|
|
10904
|
+
const angleDelta = Math.sin(time * speed) * dist;
|
|
10905
|
+
ent.angles = {
|
|
10906
|
+
x: ent.angles.x,
|
|
10907
|
+
y: ent.angles.y,
|
|
10908
|
+
z: baseAngle + angleDelta
|
|
10909
|
+
};
|
|
10910
|
+
context.linkentity(ent);
|
|
10911
|
+
context.scheduleThink(ent, time + 0.1);
|
|
10912
|
+
}
|
|
10913
|
+
var func_pendulum = (entity, context) => {
|
|
10914
|
+
entity.solid = 3 /* Bsp */;
|
|
10915
|
+
entity.movetype = 2 /* Push */;
|
|
10916
|
+
if (!entity.speed) entity.speed = 30;
|
|
10917
|
+
entity.move_angles = { ...entity.angles };
|
|
10918
|
+
entity.distance = entity.dmg || 90;
|
|
10919
|
+
const distKey = context.keyValues.distance;
|
|
10920
|
+
if (distKey) {
|
|
10921
|
+
entity.distance = parseFloat(distKey);
|
|
10922
|
+
}
|
|
10923
|
+
if (entity.targetname) {
|
|
10924
|
+
entity.use = (self) => {
|
|
10925
|
+
self.use = void 0;
|
|
10926
|
+
self.think = (e) => pendulum_swing(e, context.entities);
|
|
10927
|
+
context.entities.scheduleThink(self, context.entities.timeSeconds + 0.1);
|
|
10928
|
+
};
|
|
10929
|
+
} else {
|
|
10930
|
+
entity.think = (e) => pendulum_swing(e, context.entities);
|
|
10931
|
+
context.entities.scheduleThink(entity, context.entities.timeSeconds + 0.1);
|
|
10932
|
+
}
|
|
10933
|
+
if (entity.dmg) {
|
|
10934
|
+
entity.blocked = (self, other) => {
|
|
10935
|
+
if (other && other.takedamage) {
|
|
10936
|
+
other.health -= self.dmg;
|
|
10937
|
+
}
|
|
10938
|
+
};
|
|
10939
|
+
}
|
|
10940
|
+
};
|
|
10865
10941
|
var func_rotating = (entity, context) => {
|
|
10866
10942
|
entity.solid = 3 /* Bsp */;
|
|
10867
10943
|
entity.movetype = 2 /* Push */;
|
|
@@ -11232,7 +11308,9 @@ function registerFuncSpawns(registry) {
|
|
|
11232
11308
|
registry.register("func_button", func_button);
|
|
11233
11309
|
registry.register("func_train", func_train);
|
|
11234
11310
|
registry.register("func_plat", func_plat);
|
|
11311
|
+
registry.register("func_plat2", func_plat2);
|
|
11235
11312
|
registry.register("func_rotating", func_rotating);
|
|
11313
|
+
registry.register("func_pendulum", func_pendulum);
|
|
11236
11314
|
registry.register("func_conveyor", func_conveyor);
|
|
11237
11315
|
registry.register("func_water", func_water);
|
|
11238
11316
|
registry.register("func_explosive", func_explosive);
|
|
@@ -23795,6 +23873,21 @@ function spawnEntitiesFromText(text, options) {
|
|
|
23795
23873
|
}
|
|
23796
23874
|
return spawned;
|
|
23797
23875
|
}
|
|
23876
|
+
function SelectDeathmatchSpawnPoint(entities) {
|
|
23877
|
+
const spots = entities.findByClassname("info_player_deathmatch");
|
|
23878
|
+
if (spots.length === 0) {
|
|
23879
|
+
return void 0;
|
|
23880
|
+
}
|
|
23881
|
+
const index = Math.floor(entities.rng.frandom() * spots.length);
|
|
23882
|
+
return spots[index];
|
|
23883
|
+
}
|
|
23884
|
+
function SelectSpawnPoint(entities) {
|
|
23885
|
+
if (entities.deathmatch) {
|
|
23886
|
+
const spot = SelectDeathmatchSpawnPoint(entities);
|
|
23887
|
+
if (spot) return spot;
|
|
23888
|
+
}
|
|
23889
|
+
return findPlayerStart(entities);
|
|
23890
|
+
}
|
|
23798
23891
|
function findPlayerStart(entities) {
|
|
23799
23892
|
return entities.find(
|
|
23800
23893
|
(entity) => entity.classname === "info_player_start"
|
|
@@ -24962,26 +25055,37 @@ function ClientObituary(self, inflictor, attacker, mod, sys) {
|
|
|
24962
25055
|
}
|
|
24963
25056
|
if (mod === 24 /* SUICIDE */) {
|
|
24964
25057
|
message = `${friendlyName} suicides.`;
|
|
25058
|
+
if (self.client) self.client.score = (self.client.score || 0) - 1;
|
|
24965
25059
|
} else if (mod === 23 /* FALLING */) {
|
|
24966
25060
|
message = `${friendlyName} cratered.`;
|
|
25061
|
+
if (self.client) self.client.score = (self.client.score || 0) - 1;
|
|
24967
25062
|
} else if (mod === 20 /* CRUSH */) {
|
|
24968
25063
|
message = `${friendlyName} was squished.`;
|
|
25064
|
+
if (self.client) self.client.score = (self.client.score || 0) - 1;
|
|
24969
25065
|
} else if (mod === 17 /* WATER */) {
|
|
24970
25066
|
message = `${friendlyName} sank like a rock.`;
|
|
25067
|
+
if (self.client) self.client.score = (self.client.score || 0) - 1;
|
|
24971
25068
|
} else if (mod === 18 /* SLIME */) {
|
|
24972
25069
|
message = `${friendlyName} melted.`;
|
|
25070
|
+
if (self.client) self.client.score = (self.client.score || 0) - 1;
|
|
24973
25071
|
} else if (mod === 19 /* LAVA */) {
|
|
24974
25072
|
message = `${friendlyName} does a back flip into the lava.`;
|
|
25073
|
+
if (self.client) self.client.score = (self.client.score || 0) - 1;
|
|
24975
25074
|
} else if (mod === 26 /* EXPLOSIVE */) {
|
|
24976
25075
|
message = `${friendlyName} blew up.`;
|
|
25076
|
+
if (self.client) self.client.score = (self.client.score || 0) - 1;
|
|
24977
25077
|
} else if (mod === 31 /* TARGET_LASER */) {
|
|
24978
25078
|
message = `${friendlyName} saw the light.`;
|
|
25079
|
+
if (self.client) self.client.score = (self.client.score || 0) - 1;
|
|
24979
25080
|
} else if (mod === 34 /* TARGET_BLASTER */) {
|
|
24980
25081
|
message = `${friendlyName} got blasted.`;
|
|
25082
|
+
if (self.client) self.client.score = (self.client.score || 0) - 1;
|
|
24981
25083
|
} else if (mod === 28 /* BOMB */) {
|
|
24982
25084
|
message = `${friendlyName} was bombed.`;
|
|
25085
|
+
if (self.client) self.client.score = (self.client.score || 0) - 1;
|
|
24983
25086
|
} else if (attacker && attacker.classname === "player") {
|
|
24984
25087
|
if (self === attacker) {
|
|
25088
|
+
if (self.client) self.client.score = (self.client.score || 0) - 1;
|
|
24985
25089
|
switch (mod) {
|
|
24986
25090
|
case 6 /* GRENADE */:
|
|
24987
25091
|
case 7 /* G_SPLASH */:
|
|
@@ -25010,6 +25114,9 @@ function ClientObituary(self, inflictor, attacker, mod, sys) {
|
|
|
25010
25114
|
break;
|
|
25011
25115
|
}
|
|
25012
25116
|
} else {
|
|
25117
|
+
if (attacker.client) {
|
|
25118
|
+
attacker.client.score = (attacker.client.score || 0) + 1;
|
|
25119
|
+
}
|
|
25013
25120
|
const attackerName = "Enemy";
|
|
25014
25121
|
switch (mod) {
|
|
25015
25122
|
case 1 /* BLASTER */:
|
|
@@ -25242,6 +25349,18 @@ function player_die(self, inflictor, attacker, damage, point, mod, sys) {
|
|
|
25242
25349
|
}
|
|
25243
25350
|
function player_think(self, sys) {
|
|
25244
25351
|
if (!self.client) return;
|
|
25352
|
+
if (self.deadflag) {
|
|
25353
|
+
if (self.client.buttons) {
|
|
25354
|
+
if (sys.game && sys.game.respawn) {
|
|
25355
|
+
sys.game.respawn(self);
|
|
25356
|
+
return;
|
|
25357
|
+
}
|
|
25358
|
+
}
|
|
25359
|
+
P_PlayerThink(self, sys);
|
|
25360
|
+
self.nextthink = sys.timeSeconds + 0.1;
|
|
25361
|
+
sys.scheduleThink(self, self.nextthink);
|
|
25362
|
+
return;
|
|
25363
|
+
}
|
|
25245
25364
|
const nowMs = sys.timeSeconds * 1e3;
|
|
25246
25365
|
const quadTime = self.client.quad_time || 0;
|
|
25247
25366
|
const doubleTime = self.client.double_time || 0;
|
|
@@ -25912,17 +26031,9 @@ function createGame(imports, engine, options) {
|
|
|
25912
26031
|
return true;
|
|
25913
26032
|
},
|
|
25914
26033
|
clientBegin(client) {
|
|
25915
|
-
const playerStart = findPlayerStart(entities);
|
|
25916
26034
|
const player = entities.spawn();
|
|
25917
|
-
player.classname = "player";
|
|
25918
|
-
player.origin = playerStart ? { ...playerStart.origin } : { x: 0, y: 0, z: 0 };
|
|
25919
|
-
player.angles = playerStart ? { ...playerStart.angles } : { x: 0, y: 0, z: 0 };
|
|
25920
|
-
player.health = 100;
|
|
25921
|
-
player.takedamage = true;
|
|
25922
|
-
player.movetype = 7 /* Toss */;
|
|
25923
|
-
player.mins = { x: -16, y: -16, z: -24 };
|
|
25924
|
-
player.maxs = { x: 16, y: 16, z: 32 };
|
|
25925
26035
|
player.client = client;
|
|
26036
|
+
this.respawn(player);
|
|
25926
26037
|
player.die = (self, inflictor, attacker, damage, point, mod) => {
|
|
25927
26038
|
player_die(self, inflictor, attacker, damage, point, mod, entities);
|
|
25928
26039
|
};
|
|
@@ -25934,10 +26045,37 @@ function createGame(imports, engine, options) {
|
|
|
25934
26045
|
};
|
|
25935
26046
|
player.nextthink = entities.timeSeconds + 0.1;
|
|
25936
26047
|
entities.scheduleThink(player, player.nextthink);
|
|
25937
|
-
entities.finalizeSpawn(player);
|
|
25938
|
-
origin = { ...player.origin };
|
|
25939
26048
|
return player;
|
|
25940
26049
|
},
|
|
26050
|
+
respawn(ent) {
|
|
26051
|
+
if (!ent.client) return;
|
|
26052
|
+
const spawnPoint = SelectSpawnPoint(entities);
|
|
26053
|
+
ent.classname = "player";
|
|
26054
|
+
ent.origin = spawnPoint ? { ...spawnPoint.origin } : { x: 0, y: 0, z: 0 };
|
|
26055
|
+
ent.angles = spawnPoint ? { ...spawnPoint.angles } : { x: 0, y: 0, z: 0 };
|
|
26056
|
+
ent.health = 100;
|
|
26057
|
+
ent.takedamage = true;
|
|
26058
|
+
ent.movetype = 7 /* Toss */;
|
|
26059
|
+
ent.mins = { x: -16, y: -16, z: -24 };
|
|
26060
|
+
ent.maxs = { x: 16, y: 16, z: 32 };
|
|
26061
|
+
ent.solid = 2 /* BoundingBox */;
|
|
26062
|
+
ent.deadflag = 0;
|
|
26063
|
+
ent.modelindex = engine.modelIndex?.("players/male/tris.md2") || 0;
|
|
26064
|
+
ent.client.damage_alpha = 0;
|
|
26065
|
+
ent.client.damage_blend = [0, 0, 0];
|
|
26066
|
+
ent.client.anim_priority = 0;
|
|
26067
|
+
ent.client.anim_end = 0;
|
|
26068
|
+
ent.frame = 0;
|
|
26069
|
+
if (deathmatch) {
|
|
26070
|
+
ent.client.inventory = createPlayerInventory({
|
|
26071
|
+
weapons: [WeaponId.Blaster],
|
|
26072
|
+
currentWeapon: WeaponId.Blaster
|
|
26073
|
+
});
|
|
26074
|
+
} else {
|
|
26075
|
+
}
|
|
26076
|
+
entities.finalizeSpawn(ent);
|
|
26077
|
+
origin = { ...ent.origin };
|
|
26078
|
+
},
|
|
25941
26079
|
clientDisconnect(ent) {
|
|
25942
26080
|
if (ent && ent.inUse) {
|
|
25943
26081
|
entities.free(ent);
|
|
@@ -26035,6 +26173,7 @@ function createGame(imports, engine, options) {
|
|
|
26035
26173
|
}
|
|
26036
26174
|
export {
|
|
26037
26175
|
AIFlags,
|
|
26176
|
+
AI_GetSightClient,
|
|
26038
26177
|
AMMO_TYPE_COUNT,
|
|
26039
26178
|
ARMOR_INFO,
|
|
26040
26179
|
ARMOR_ITEMS,
|