using SPT.Reflection.Utils;using SPT.Server.Core.Models.Spt.Server;using SPT.Server.Core.Servers;using SPT.Server.Core.Utils;using SPTarkov.Server.Core.Servers;using System;using System.Collections.Generic;namespace UniversalSingleAmmoDLL{
public class ModEntry : IPostDBLoadMod {
// 修改这里锁定单一弹药ID
public const string TargetAmmoTpl = "8ef5b2fb20000000000005"; public void PostDBLoad(DependencyContainer container)
{
var logger = container.Resolve<ILogger>(); var databaseServer = container.Resolve<DatabaseServer>(); var tables = databaseServer.GetTables(); var items = tables.templates.items; logger.LogWarning($"[SingleAmmoLock] 启动,强制限定弹匣仅能使用弹药:{TargetAmmoTpl}"); // 武器黑名单(不进行修改)
HashSet<string> blacklistWeapons = new HashSet<string>()
{
"5cdeb229d7f00c000e7ce174", "5d52cc5ba4b9367408500062"
}; foreach (var (itemId, template) in items)
{
try
{
if (blacklistWeapons.Contains(itemId)) continue; if (template._props == null) continue; // 弹匣 Cartridges
if (template._props.Cartridges != null && template._props.Cartridges.Count > 0)
{
var cartridge = template._props.Cartridges[0]; if (cartridge._props?.filters != null && cartridge._props.filters.Count > 0)
{
var filter = cartridge._props.filters[0]; filter.Filter.Clear(); filter.Filter.Add(TargetAmmoTpl); }
}
// 左轮弹巢 camora
if (template._props.Slots != null)
{
foreach (var slot in template._props.Slots)
{
if (slot._name != null && slot._name.StartsWith("camora"))
{
if (slot._props?.filters != null && slot._props.filters.Count > 0)
{
var filter = slot._props.filters[0]; filter.Filter.Clear(); filter.Filter.Add(TargetAmmoTpl); }
}
}
}
// 枪械膛室 Chambers
if (template._props.Chambers != null)
{
foreach (var chamber in template._props.Chambers)
{
if (chamber._props?.filters != null && chamber._props.filters.Count > 0)
{
var filter = chamber._props.filters[0]; filter.Filter.Clear(); filter.Filter.Add(TargetAmmoTpl); }
}
}
}
catch (Exception ex)
{
logger.LogError($"[SingleAmmoLock] {itemId} 处理失败:{ex.Message}"); }
}
logger.LogSuccess("[SingleAmmoLock] 弹药限制补丁全部执行完毕!"); }
}}
要亲命了AI跑了一晚上了没成功,求个大神帮帮我
1.请所有作者在发布作品前进行第三方病毒检测,自2021年4月3日起每个新作品务必随贴附检测链接
这不仅仅是对自己负责对社区负责也是对所有用户负责,玩家也可自行检测
3.如果文中内容有侵权行为、失效下载链接以及争议的金币贴请及时举报 ➩点击下方举报
4.注册用户在发布作品、话题、评论等内容时,请务必遵守国家互联网信息管理办法规定
5.本站所收录的作品、评论、上传内容等均属用户个人行为,如侵害了您的权益,欢迎举报,一经核实,立即删除
请登录之后再进行评论
登录









看了一下,你这份 AI 生成代码的核心逻辑应该与实际需求写反了。
你想实现的应该是:
但原代码先执行了:
这会把过滤器中原本允许装入的所有原版弹药全部删除,然后再执行:
所以最终效果就变成了:
如果你的需求只是让自定义弹药额外兼容这些武器和弹匣,正确逻辑应该只追加目标弹药:
不能执行:
Filter 本身是集合结构,直接执行 Add() 即可;目标弹药已经存在时也不会重复加入。
SPT 4.0.13 API 问题
这份代码还混用了旧版服务端 Mod 的入口方式和 SPT 4.0.13 的 C# API。
SPT 4.0.13 的服务端 Mod 应使用:
在 C# 数据模型中,应通过以下属性访问物品数据:
数据库 JSON 中仍然存在 _props、_name 等字段名,但在 C# 模型代码里应通过对应的 Properties、Name 等属性访问,不能继续照搬旧版 TypeScript 的直接字段写法。
Mod 入口也不应继续使用:
目标弹药 ID 问题
旧版 TypeScript SPT 服务端中的物品 ID 主要按普通字符串处理,因此过去使用自定义长度的英文数字 ID,在不少场景下确实可以正常工作。
但这份代码针对的是 SPT 4.0.13。
SPT 4.0 的 C# 服务端已经将物品 ID、弹匣过滤器和膛室过滤器改成了 MongoId,要求:
你当前填写的 ID:
只有 22 位,因此在加入 HashSet<MongoId> 时会转换失败。
这个 ID 不需要由官方生成,也不需要属于原版物品。你可以自行定义一个唯一的 24 位十六进制 ID。
但需要注意:
如果目标弹药由另一个 Mod 添加,还需要确保该 Mod 已经先完成物品注册。否则兼容补丁执行时可能找不到目标弹药,需要检查 Mod 加载顺序或声明依赖关系。
修复版源码
我帮你重写了一份。
修复版会将目标弹药追加到:
弹匣和固定弹仓的 Cartridges
枪械膛室的 Chambers
左轮枪的 camora 弹巢
不会清空原有过滤器,因此会完整保留所有原版弹药兼容关系。
目标弹药 ID 放在 config.json 中修改即可,不需要每次修改源码。
需要注意,这份补丁修改的是数据库层面的装填兼容过滤器。它能让目标弹药被弹匣、枪膛和弹巢接受,但如果自定义弹药的口径参数、弹道数据、模型、声音或其他客户端行为与具体武器不匹配,仍可能需要额外适配。
源码包,使用流程如下: