• 注册
  • 攻略教程 攻略教程 关注:887 内容:237

    【Dll简单向编写教程】实体信息扫描(快速完成你的第一份dll mod)

  • 查看作者
  • 打赏作者
  • 当前位置: 七日杀中文网 > 攻略教程 > 正文
  • 攻略教程
  • Lv.5
    萌新驾到

    这个教程不会教大家太高深的语法之类的,从实用方面快速入手,让新手+AI(如deepseek)就能快速制作出你想要的第一份功能

    隐藏内容需要回复可以看见

    回复

    "点赞是美意,打赏是鼓励"

    Lv.9
    萌新驾到

    终于出了 [s-26] [s-63]

    接模组定制 +Q 1079703478

    回复
    Lv.5
    萌新驾到
    // 模组主类,实现IModApi接口以便被游戏识别和加载,重点是实现: IModApi接口
        public class EntityScannerMod : IModApi
        {
            // 模组初始化方法,游戏加载模组时会自动调用
            public void InitMod(Mod _modInstance)
            {
                try
                
                    // 这句话会在模组被初始化时输出,方便查看模组是否载入成功
                    Debug.Log("[实体扫描] 初始化实体扫描系统...");
                    // 创建Harmony实例,使用当前类的完整名称作为唯一标识
                    // 这个标识通常是命名空间+类名,如"EntityScanner.EntityScannerMod"
                    var harmony = new Harmony(GetType().ToString());
                    // 应用所有补丁
                    // 这行代码会扫描当前程序集中所有带有[HarmonyPatch]特性的类和方法
                    // 并自动将它们应用为游戏原始代码的补丁
                    harmony.PatchAll();
                    Debug.Log("[实体扫描] 实体扫描系统已就绪");
                }
                catch (Exception ex)
                {
                    Debug.LogError("[实体扫描] 系统初始化失败: " + ex.Message);
                }
            }
    }


    爱发电https://afdian.com/a/ma2097

  • Ma然后你就可以在初始化方法下面继续编写你的主要功能实现了
    拉黑 11个月前 电脑端回复
  • Ma这是让你的dll模组成功载入的关键,通常不会修改,你可以直接复制我的进去使用
    拉黑 11个月前 电脑端回复
  • 回复
    Lv.5
    萌新驾到

    然后你就可以在初始化方法下面继续编写你的主要功能实现了

    爱发电https://afdian.com/a/ma2097

    回复
    Lv.5
    萌新驾到

    还有一件事忘了,很多萌新第一次复制别人代码发现怎么都是报错,那是因为模块没有引入:按照下面的流程来引入




    选中后添加,你可以参考我的上图进行添加,之后就是缺什么补什么,如果不确定就问ai(注意,一定要看好我的路径,这是两个路径)

    最后就是单机选框然后将全部添加的模块勾选后点右下角确定就添加完成了

    爱发电https://afdian.com/a/ma2097

    回复
    Lv.5
    萌新驾到

    打开VS的教程:

    爱发电https://afdian.com/a/ma2097

    回复
    Lv.5
    萌新驾到

    创建项目教程




    爱发电https://afdian.com/a/ma2097

    回复
    Lv.9
    闪耀星神

    1

    模组制作群720354804

    回复
    Lv.5
    萌新驾到

    好了我们回到代码部分:创建一个功能类,这个类中主要实现我们的功能主题,七日杀dllmod我们实现功能的主要方式是通过对原方法进行补丁,也就是使用Harmony补丁

    这两行代码的意思是:我们要对EntityPlayerLocal类里的Update方法进行补丁
    而补丁又分为两类:

    • 前置补丁(Prefix) - 在原方法执行前运行:

      • 查看或修改原方法的参数

      • 决定是否执行原方法(通过返回false可以跳过原方法)

      • 在原方法执行前准备环境或记录信息

    • 后置补丁(Postfix) - 在原方法执行后运行

      • 检查或修改原方法的返回值

      • 执行一些清理操作

      • 基于原方法的执行结果做额外处理

    可以明显的看到我们的mod使用的是后置补丁,也就是说我们的代码是在源代码运行后才运行我们的代码,这样不会影响到原有功能的正常运行:


    Update是七日杀中每帧都更新的一个方法,我们对他进行补丁就可以实现让mod随时都在运行,到达实时检测的目的,当然还有其他更好的不浪费内存的方法这里就不展开了
    对于补丁方法的寻找,我们的思路应该是:实现什么,寻找什么,官方的源代码都是可以通过dnspy进行反编译查找的(当然你看不懂也可以去我的另一篇帖子看看翻译好的),我们这里只介绍Entitylocal和Entityalive类就能实现出大多数mod想要的功能了,你想要实现其他mod也是一样的原理

    爱发电https://afdian.com/a/ma2097

    回复
    Lv.5
    萌新驾到

    // 这个方法用于记录游戏中所有实体类型的详细信息到日志中(每种类型只记录一次)

    private static void LogEntityInfo(EntityPlayerLocal player)

    {

    // 获取游戏世界实例

    var world = GameManager.Instance.World;

    // 确保世界和实体列表存在

    if (world?.Entities?.list == null) return;


    // 遍历游戏中的所有实体

    foreach (var entity in world.Entities.list)

    {

    // 跳过空实体

    if (entity == null) continue;


    // 获取实体的类型信息

    var entityType = entity.GetType(); // 获取实体的C#类型

    int classType = entity.entityClass; // 获取实体的游戏内类型ID

    // 检查这个类型是否已经记录过(使用HashSet避免重复记录)

    if (!loggedTypes.Contains(classType))

    {

    // 将此类型添加到已记录列表中,防止重复记录

    loggedTypes.Add(classType);

    // 输出实体的基本信息到日志

    Debug.Log($"[实体信息] 发现新实体类型:");

    Debug.Log($" - Entity Type: {entityType.FullName}"); // 完整的C#类名

    爱发电https://afdian.com/a/ma2097

    回复
    Lv.5
    萌新驾到

    Debug.Log($" - Entity Class: {entity.entityClass}"); // 游戏内的实体类ID

    Debug.Log($" - Entity Class Name: {(entity.EntityClass != null ? entity.EntityClass.entityClassName : "null")}"); // 游戏内的实体类名称

    Debug.Log($" - Entity ID: {entity.entityId}"); // 实体的唯一ID


    // 针对生物类型实体,额外记录生命值信息


    if (entity is EntityAlive entityAlive) // 检查是否是活的实体(如丧尸、动物、玩家等)

    {

    Debug.Log($" - Is EntityAlive");=

    Debug.Log($" - Health: {entityAlive.Health}/{entityAlive.GetMaxHealth()}"); // 记录当前生命值和最大生命值

    }


    // 检查是否是NPC类型(非玩家角色)


    if (entity is EntityNPC)

    {

    Debug.Log($" - Is EntityNPC");

    }


    // 检查是否是商人类型


    if (entity is EntityTrader)

    {

    Debug.Log($" - Is EntityTrader");

    }


    // 记录实体在游戏世界中的坐标位置

    Debug.Log($" - 坐标: {entity.position}");

    }

    }

    }


    爱发电https://afdian.com/a/ma2097

    回复
    因恶意刷帖用户过多,本版块已取消回帖金币奖励,请签到获取!>>>金币获取指南<<<

    请登录之后再进行评论

    登录
    • 大版主
    • 小版主
  • yichen
    yichen
    Mod闲聊群762251937
  • 柒月白风清
    柒月白风清
    一只小萌新,万年摸鱼党!已经脱坑了。。。
  • Cure_805
    Cure_805
    晚上在睡觉,白天在工作,不一定能及时回复,有事可以留言!
  • 至善丶丶
    至善丶丶
    群:1050040662 定制/开服/地图制作/价格公道
  • 已重置033
    已重置033
    一只爱折腾七日杀的脆皮大学生
  • 暂没有数据

    赞助广告位

  • 点击展示图片即可一键加入QQ群
    赞助广告:100R/月 目前空缺广告位:0

    分享网站

  • 繁体中文
  • 任务
  • 动态
  • 到底部
  • 帖子间隔 侧栏位置: