Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
187 changes: 187 additions & 0 deletions 2001/ze_hr_dead_center/car_gas.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,187 @@
import { Instance, PointTemplate, Entity } from "cs_script/point_script";

/**
* 油桶收集脚本
* 此脚本由皮皮猫233编写
* 2026/2/23
*/

let gasNumber = 0;
let gasBgm = 1;
const gasMaker = new Map();

Instance.OnScriptInput("Spawn", () => {
const makers = Instance.FindEntitiesByName("scavenge_gascans_spawn_cs2");
const makers1st = Instance.FindEntitiesByName("scavenge_gascans_spawn_1st_floor_cs2");
if (!makers || !makers1st) return;
for (const maker of makers) {
const entities = ForspawnAtMaker(maker);
if (!entities) return;
for (const entity of entities) {
if (entity.GetEntityName() === "item_gascan_atrium_phy") {
gasMaker.set(entity, { maker: maker, floor: 2 });
}
}
}
for (const maker of makers1st) {
const entities = ForspawnAtMaker(maker);
if (!entities) return;
for (const entity of entities) {
if (entity.GetEntityName() === "item_gascan_atrium_phy") {
gasMaker.set(entity, { maker: maker, floor: 1 });
}
}
}
});

Instance.OnScriptInput("Respawn", (inputData) => {
Respawn(inputData.caller);
});

Instance.OnScriptInput("Add", (inputData) => {
Respawn(inputData.activator);
gasNumber ++;
if (gasNumber < 26) {
Instance.ServerCommand("say 当前油量" + gasNumber + "/26");
if (gasBgm === 1) {
if (gasNumber >= 10) {
Instance.EntFireAtName({ name: "bgm_zombat_fadeout", input: "FireUser1" });
gasBgm = 2;
}
} else if (gasBgm === 2) {
if (gasNumber > 21) {
Instance.EntFireAtName({ name: "bgm_final", input: "StartSound" });
gasBgm = 3;
}
}
} else {
Instance.EntFireAtName({ name: "relay_car_escape", input: "Trigger" });
}
});

// 回合重启时重置数量
Instance.OnRoundStart(() => {
gasNumber = 0;
gasMaker.clear();
thinkQueue.length = 0;
gasBgm = 1;
});

/**
* 重复刷新油桶
* @param {Entity|undefined} phy
* @returns
*/
function Respawn(phy) {
if (!phy || !phy.IsValid()) return;
if (gasMaker.has(phy)) {
const value = gasMaker.get(phy);
const maker = value.maker;
const floor = value.floor;
gasMaker.delete(phy);
// 判断油桶所在的不同楼层决定刷新时间
if (floor === 2) {
// 延迟30秒后刷新
Delay(30, () => {
const entities = ForspawnAtMaker(maker);
if (!entities) return;
for (const entity of entities) {
if (entity.GetEntityName() === "item_gascan_atrium_phy") {
gasMaker.set(entity, { maker: maker, floor: 2 });
}
}
});
} else {
// 延迟60秒后刷新
Delay(60, () => {
const entities = ForspawnAtMaker(maker);
if (!entities) return;
for (const entity of entities) {
if (entity.GetEntityName() === "item_gascan_atrium_phy") {
gasMaker.set(entity, { maker: maker, floor: 1 });
}
}
});
}

}
}

/**
* 将模板生成到某个生成器的位置
* @param {Entity} maker
*/
function ForspawnAtMaker(maker) {
const temp = /** @type {PointTemplate} */ (Instance.FindEntityByName("item_gascan_atrium_temp"));
return temp.ForceSpawn(maker.GetAbsOrigin(), maker.GetAbsAngles());
}

/** @type {{ time: number, callback: () => void }[]} */
const thinkQueue = [];

/**
* 延迟执行函数
* @param {number} delaySeconds 延迟的秒数
* @param {() => void} callback 回调函数
*/
function Delay(delaySeconds, callback) {
const executeTime = Instance.GetGameTime() + delaySeconds;
QueueThink(executeTime, callback);
}

/**
* 异步延迟函数,返回Promise
* @param {number} delaySeconds 延迟的秒数
* @returns {Promise<void>}
*/
function DelayAsync(delaySeconds) {
return new Promise((resolve) => {
Delay(delaySeconds, resolve);
});
}

/**
* 将think任务加入队列
* @param {number} time 执行时间
* @param {() => void} callback 回调函数
*/
function QueueThink(time, callback) {
// 查找插入位置(按时间排序)
let insertIndex = 0;
for (let i = thinkQueue.length - 1; i >= 0; i--) {
if (thinkQueue[i].time <= time) {
insertIndex = i + 1;
break;
}
}

// 插入到合适位置
thinkQueue.splice(insertIndex, 0, { time, callback });

// 如果新任务是最早的,则更新think
if (insertIndex === 0) {
Instance.SetNextThink(time);
}
}

/**
* Think循环处理函数
*/
function RunThinkQueue() {
const currentTime = Instance.GetGameTime();

// 执行所有到期的任务
while (thinkQueue.length > 0 && thinkQueue[0].time <= currentTime) {
const task = thinkQueue.shift();
if (!task) continue;
task.callback();
}

// 更新下一次think
if (thinkQueue.length > 0) {
Instance.SetNextThink(thinkQueue[0].time);
}
}

// 设置Think循环
Instance.SetThink(RunThinkQueue);
150 changes: 150 additions & 0 deletions 2001/ze_hr_dead_center/deinfect.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,150 @@
import { Instance, Entity } from "cs_script/point_script";

/**
* 防化脚本
* 此脚本用于实现类似求生之路中的感染者攻击而非ze模式中的直接感染
* 此脚本为针对风云社参数适配后的版本,对比原版,将僵尸低血量时的1000血降为600血
* 此脚本由皮皮猫233编写
* 2026/3/6
*/

let deinfectSwitch = false;
let currentHandler = createDamageHandler(false);

// @ts-ignore
Instance.OnModifyPlayerDamage((event) => currentHandler(event));

Instance.OnScriptInput("Enable", () => {
deinfectSwitch = true;
currentHandler = createDamageHandler(true);
ZombieLowHP();
});

Instance.OnScriptInput("Disable", () => {
deinfectSwitch = false;
currentHandler = createDamageHandler(false);
});

Instance.OnRoundStart(() => {
deinfectSwitch = false;
currentHandler = createDamageHandler(false);
thinkQueue.length = 0;
});

/**
* 创建一个可以切换的处理器
* @param {boolean} enabled
* @returns
*/
function createDamageHandler(enabled) {
if (!enabled) {
return () => {};
}
return (/** @type {import("cs_script/point_script").ModifyPlayerDamageEvent} */ event) => {
const attacker = event.attacker;
if (!attacker || !attacker.IsValid() || attacker.GetClassName() !== "player" || attacker.GetTeamNumber() !== 2) return;

const player = event.player;
if (!player || !player.IsValid() || player.GetTeamNumber() === 2) return;

player.TakeDamage({ damage: 40, damageTypes: 512 });
return { abort: true };
};
}

/**
* 设置僵尸低血量
*/
function ZombieLowHP() {
if (!deinfectSwitch) return;
const players = Instance.FindEntitiesByClass("player");
for (const player of players) {
if (!player || !player.IsValid() || player.GetTeamNumber() !== 2) continue;
SetLowHP(player);
}
// 1秒后再次检测
Delay(1, ZombieLowHP);
}

/**
* 设置低血量
* @param {Entity} player
*/
function SetLowHP(player) {
if (player.GetMaxHealth() > 100) {
Delay(0.5, () => {
player.SetMaxHealth(1);
player.SetHealth(600);
});
}
}

/** @type {{ time: number, callback: () => void }[]} */
const thinkQueue = [];

/**
* 延迟执行函数
* @param {number} delaySeconds 延迟的秒数
* @param {() => void} callback 回调函数
*/
function Delay(delaySeconds, callback) {
const executeTime = Instance.GetGameTime() + delaySeconds;
QueueThink(executeTime, callback);
}

/**
* 异步延迟函数,返回Promise
* @param {number} delaySeconds 延迟的秒数
* @returns {Promise<void>}
*/
function DelayAsync(delaySeconds) {
return new Promise((resolve) => {
Delay(delaySeconds, resolve);
});
}

/**
* 将think任务加入队列
* @param {number} time 执行时间
* @param {() => void} callback 回调函数
*/
function QueueThink(time, callback) {
// 查找插入位置(按时间排序)
let insertIndex = 0;
for (let i = thinkQueue.length - 1; i >= 0; i--) {
if (thinkQueue[i].time <= time) {
insertIndex = i + 1;
break;
}
}

// 插入到合适位置
thinkQueue.splice(insertIndex, 0, { time, callback });

// 如果新任务是最早的,则更新think
if (insertIndex === 0) {
Instance.SetNextThink(time);
}
}

/**
* Think循环处理函数
*/
function RunThinkQueue() {
const currentTime = Instance.GetGameTime();

// 执行所有到期的任务
while (thinkQueue.length > 0 && thinkQueue[0].time <= currentTime) {
const task = thinkQueue.shift();
if (!task) continue;
task.callback();
}

// 更新下一次think
if (thinkQueue.length > 0) {
Instance.SetNextThink(thinkQueue[0].time);
}
}

// 设置Think循环
Instance.SetThink(RunThinkQueue);
Loading