• 注册
  • Mod功能提议 Mod功能提议 关注:6312 内容:622

    要亲命了AI跑了一晚上了没成功,求个大神帮帮我

  • 查看作者
  • 打赏作者
  • 当前位置: ODDBA社区 > 离线版交流区 > Mod功能提议 > 正文
  • 4
  • Mod功能提议
  • 炉火纯青
    VIP4
    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] 弹药限制补丁全部执行完毕!");        }
        }}

    自成一派
    VIP4

    看了一下,你这份 AI 生成代码的核心逻辑应该与实际需求写反了。

    你想实现的应该是:

    让一颗自定义弹药在保留原有弹药兼容关系的前提下,额外兼容常规枪械、弹匣、枪膛和左轮弹巢。

    但原代码先执行了:

    filter.Filter.Clear();

    这会把过滤器中原本允许装入的所有原版弹药全部删除,然后再执行:

    filter.Filter.Add(TargetAmmoTpl);

    所以最终效果就变成了:

    所有被修改的弹匣、枪膛和弹巢只能使用这一种目标弹药。

    如果你的需求只是让自定义弹药额外兼容这些武器和弹匣,正确逻辑应该只追加目标弹药:

    filter.Filter.Add(targetAmmoTpl);

    不能执行:

    filter.Filter.Clear();

    Filter 本身是集合结构,直接执行 Add() 即可;目标弹药已经存在时也不会重复加入。

    SPT 4.0.13 API 问题

    这份代码还混用了旧版服务端 Mod 的入口方式和 SPT 4.0.13 的 C# API。

    SPT 4.0.13 的服务端 Mod 应使用:

    Injectable
    IOnLoad
    DatabaseService

    在 C# 数据模型中,应通过以下属性访问物品数据:

    Properties
    Name
    Slots
    Chambers
    Cartridges

    数据库 JSON 中仍然存在 _props、_name 等字段名,但在 C# 模型代码里应通过对应的 Properties、Name 等属性访问,不能继续照搬旧版 TypeScript 的直接字段写法。

    Mod 入口也不应继续使用:

    DependencyContainer
    IPostDBLoadMod

    目标弹药 ID 问题

    旧版 TypeScript SPT 服务端中的物品 ID 主要按普通字符串处理,因此过去使用自定义长度的英文数字 ID,在不少场景下确实可以正常工作。

    但这份代码针对的是 SPT 4.0.13。

    SPT 4.0 的 C# 服务端已经将物品 ID、弹匣过滤器和膛室过滤器改成了 MongoId,要求:

    长度必须恰好为 24 位
    只能包含 0-9、a-f、A-F

    你当前填写的 ID:

    8ef5b2fb20000000000005

    只有 22 位,因此在加入 HashSet<MongoId> 时会转换失败。

    这个 ID 不需要由官方生成,也不需要属于原版物品。你可以自行定义一个唯一的 24 位十六进制 ID。

    但需要注意:

    弹药模板的 _id、兼容补丁配置、商人商品、手册、价格、配方、掉落池和其他相关引用必须统一使用同一个 ID,不能只在兼容代码里单独补两个字符。

    如果目标弹药由另一个 Mod 添加,还需要确保该 Mod 已经先完成物品注册。否则兼容补丁执行时可能找不到目标弹药,需要检查 Mod 加载顺序或声明依赖关系。

    修复版源码

    我帮你重写了一份。

    修复版会将目标弹药追加到:

    • 弹匣和固定弹仓的 Cartridges

    • 枪械膛室的 Chambers

    • 左轮枪的 camora 弹巢

    不会清空原有过滤器,因此会完整保留所有原版弹药兼容关系。

    目标弹药 ID 放在 config.json 中修改即可,不需要每次修改源码。

    需要注意,这份补丁修改的是数据库层面的装填兼容过滤器。它能让目标弹药被弹匣、枪膛和弹巢接受,但如果自定义弹药的口径参数、弹道数据、模型、声音或其他客户端行为与具体武器不匹配,仍可能需要额外适配。

    UniversalAmmoCompatibility_SPT_4.0.13_Source_v1.0.0.zip
    5.18 KB,下载次数:2[记录]

    源码包,使用流程如下:

    1. 解压源码包
    2. 修改 config.json 中的 targetAmmoTpl
    3. 确认该 ID 是唯一的 24 位十六进制 ID
    4. 在源码目录执行 dotnet restore
    5. 执行 dotnet build -c Release
    6. 将编译输出目录放入 SPT\user\mods
    7. 启动 SPT Server 并检查加载日志
    8. 进游戏测试原版弹药和目标弹药是否都能正常装填
  • DIE啊暘我了个次奥啊真大佬啊,万分感谢啊
    拉黑 2星期前 电脑端回复
  • DIE啊暘话说大佬是用什么ai跑的啊
    拉黑 2星期前 电脑端回复
  • Astar@DIE啊暘 gpt
    拉黑 2星期前 手机端回复
  • 回复

    请登录之后再进行评论

    登录
    离线版交流区
  • 今日 2
  • 内容 11835
  • 关注 6312
  • 聊天
    关注 17

    【招募】GRIFFIN TKF项目开工 期待你的加入 || 你是否想加入格里芬书写自己与人形的故事

    捐助我们

    • 微信
    • 支付宝
  • 签到
  • 任务
  • 发布
  • 模式切换
  • 偏好设置
  • 帖子间隔 侧栏位置: