fbef0102 / L4D1_2-Plugins

L4D1/2 help server to record, make server more fun, and more useful plugins for adm.
GNU General Public License v3.0
156 stars 67 forks source link

我弄了个以VScript的SpawnEntityFromTable格式来生成实体的l4d2_spawn_props #48

Closed LN5005 closed 8 months ago

LN5005 commented 9 months ago
2023年12月16日04点09分

l4d2_spawn_props_vscript.zip

用3.6的旧版本做的,因为我印象里新版本所生成的实体的Vector数值有小数点,而我又看不懂代码,大概没办法把代码调整成没有小数点的形状,所以索性用自己一直用的3.6旧版本随便改了下。用没有小数点的版本的主要原因是我感觉要改navmesh的话最好把实体的角度改成45*n,小数点不太方便。

幸好你把sp文件拍scripting文件夹里了,要不然真不知道该怎么弄。

我简单说一下我把插件改成这样的原因:

把地图弄成VScript的版本然后发到workshop上去

引擎的实体数量上限非常烦人。我在c5m4因为这方面的原因把放的所有装饰性实体都删掉了,因为实体数量太多直接把服务器弄崩了。

我之前编辑c5m1时又意外地发现某些关键实体(梯子之类的)在客户端上隐形(invisible),而且每个玩家看不到的实体都各不相同。我猜这可能是因为客户端上的实体数量太多了,然后游戏引擎在客户端上随机挑选了一个幸运实体当场击毙

我试了一下在c5m1上用filter删掉桌子和凳子之类的小玩意(prop_physics),不过这样并没有缓解与关键实体不可见有关的问题,结果我不得不把自己加的各种装饰性实体、补给品乃至手动添加的空气墙从stripper里的配置文件中删除,以最小化关键实体不可见的问题发生的概率。

我不太确定Stripper是否会在生成实体之前执行 filter 的操作,如果Stripper在生成实体之后才执行 filter 操作的话,那么就没办法用filter删官图实体以节约“实体数量”的资源了。

于是我就想,要是有方法把Stripper的“add”的加载顺序延后到filter之后就好了。我不知道stripper是怎么工作的,所以没有在这方面上解决问题的头猪。

后来我发现可以用 VScript 的 SpawnEntityFromTable 来生成实体。虽然这么做有一些性能方面上的问题,不过显然可以先用stripper删掉官图上的实体,然后用vscript脚本在此之后生成实体,以期以可控的形式来缓解与实体数量上限有关的问题。

此外,用vscript生成实体的另一个好处是可以动态地生成实体。例如,弄个检查点(trigger_once之类的)在c1m2的枪店里,当玩家进入枪店时删除游戏开始时(group 1)生成的实体(从spawnpoint到枪店检查点之间的所有实体,因为用不到了),再生成接下来的escape route上应该存在的实体(group 2),这样的话也许能够生成比正常情况下(使用Stripper生成所有实体时)多得多的实体;为此我还让生成的实体具有 targetname 属性,好批量删除用不到的实体。

Stripper的实体格式与 SpawnEntityFromTable 的格式有很大的差异(虽然代码看起来差不多一个意思),把Stripper的实体格式转成 SpawnEntityFromTable 格式有点麻烦,所以我干脆直接修改用来生成实体的 l4d2_spawn_props 好让它能够生成能在 VScript 上直接用的代码,结果就是这个我乱改改出来的插件了。

不知道有没有什么乱七八糟的bug,总之这个vscript版的我就自己先凑合用了,以后遇到 'ED_alloc: no free edicts' 或者客户端实体不显示之类的问题我就直接 kill 掉官图上的装饰性实体(或者弄个检查点什么的),再用VScript延后生成实体,乐观点的话也许能够一劳永逸地教这个面向土豆的游戏引擎怎么做人。

QQ图片20231216051429 遇到困难睡大觉

以及储存的档案位于 Left 4 Dead 2\left4dead2\scripts\vscripts\

fbef0102 commented 9 months ago

做得很好 我本人篇習慣用stripper

你可以自己創建一個github增加曝光率

fbef0102 commented 9 months ago

Stripper 的順序為global_filters.cfg優先 再來是maps/xxxx.cfg,然後依序執行 譬如filter先寫移除car,後寫add car是沒有問題的,不會移除後寫的car 先寫add car,後寫移除car,會把先寫的car給移除掉

然後我覺得就算用VScript增加物件或梯子,也是會占用一個實體空間 把伺服器佔滿後會觸發"no free edicts"的提示 所以最好的方法還是你說的把所有装饰性实体都删掉

之所以我偏向使用stripper因為大部分開服的服主都有安裝Stripper 不懂VScript的使用方式