• 注册
  • 玩家交流 玩家交流 关注:1841 内容:13416
    悬赏666金币

    求大佬做个挑战任务mod(或帮忙看看代码怎么改)

  • 查看作者
  • 打赏作者
  • 当前位置: 七日杀中文网 > 玩家交流 > 正文
  • 玩家交流
  • Lv.3

    mod名称为挑战任务。 这个mod的功能是在各个商人的对话框中追加一个挑战任务选项,点击该选项直接弹出任务接取界面(即这个选项相当于一个任务)。
    挑战任务设定:
    1.挑战任务等级高于玩家目前任务等级,挑战任务等级限制为 玩家当前任务等级+1 ~ 玩家当前任务等级+1+地形加成。其中地形加成为绿地+4,火烧地+3,沙漠+2,雪地+1,废墟+0(这个设定的意义是难度低的地区可以挑战更高级的建筑)
    2.挑战任务内容是随机的(随机任务+随机挑战等级)
    3.挑战任务上限不超过游戏设定任务上限(如果可以动态获取任务上限则使用动态上限,否则使用配置文件并设定上限为6)
    4.玩家达到最大任务等级后,不再出现挑战任务
    5.挑战任务默认每日只有一个。(提供xml配置可修改上限)

    6.挑战任务奖励为该任务奖励+跨级奖励公爵币。其中跨级公爵币的计算如下:

    首先基础设定跨级基础奖励(下面是默认设置,提供xml配置文件方便自定义)为1级任务500公爵币,2级1000,3级1500,4级2000,5级2500,六级3000。

    然后,每跨一级公爵币数*2(可配置倍率)

    例如当前玩家任务等级为2,完成等级4任务,则额外给予500*2*2=2000公爵币


    萌新尝试通过ai辅助写了cs代码,但编译dll后进入游戏没有任何效果……

    ChallengeTask.cs
    using System;

    using System.Collections.Generic;

    using System.Reflection;

    using System.Xml;

    using HarmonyLib;

    using UnityEngine;


    // 入口类,负责注入 Harmony Patch

    public class ChallengeQuestModEntry : IModApi

    {

        public void InitMod(Mod modInstance)

        {

            Debug.Log(“[ChallengeQuestMod] Initializing mod and applying Harmony patches…”);

            Harmony harmony = new Harmony(“com.example.challengequestmod”);

            harmony.PatchAll(Assembly.GetExecutingAssembly());


            // 初始化配置文件

            ChallengeQuestMod.Init(modInstance);

        }

    }


    // 核心逻辑类

    public static class ChallengeQuestMod

    {

        public static ChallengeQuestModConfig Config = new ChallengeQuestModConfig();

        public static Dictionary<int, ChallengeQuestData> PlayerQuestMap = new Dictionary<int, ChallengeQuestData>();


        public class ChallengeQuestData

        {

            public string QuestId;

            public int DayGiven;

        }


        public static void Init(Mod mod)

        {

            string configPath = $”{mod.Path}/ChallengeQuestConfig.xml”;

            Config.Load(configPath);

            Debug.Log(“[ChallengeQuestMod] Config loaded from ” + configPath);

        }


        public static void GiveChallengeQuest(EntityPlayer player, EntityTrader trader)

        {

            if (!(player is EntityPlayerLocal localPlayer) || trader == null) return;


            int baseTier = localPlayer.QuestJournal.GetCurrentFactionTier(trader.NPCInfo.QuestFaction, 0, false);

            if (baseTier <= 0) return;


            int maxTier = Config.MaxTier;

            if (baseTier >= maxTier) return;


            int terrainBonus = GetTerrainBonus(localPlayer);

            int targetTier = Math.Min(baseTier + 1 + terrainBonus, maxTier);


            if (!trader.questDictionary.TryGetValue(targetTier, out List<QuestEntry> quests) || quests.Count == 0)

                return;


            QuestEntry entry = quests[UnityEngine.Random.Range(0, quests.Count)];

            Quest quest = entry.QuestClass.CreateQuest();


            quest.QuestGiverID = trader.entityId;

            quest.QuestFaction = trader.NPCInfo.QuestFaction;

            quest.SetPositionData(Quest.PositionDataTypes.QuestGiver, trader.position);

            quest.SetPositionData(Quest.PositionDataTypes.TraderPosition, trader.traderArea?.Position ?? trader.position);

            localPlayer.QuestJournal.AddQuest(quest, true);


            int baseReward = Config.GetBaseReward(targetTier);

            int tierGap = targetTier – baseTier;

            int bonusReward = (int)(Config.CrossTierMultiplier * Config.GetBaseReward(baseTier) * tierGap);

            int totalReward = baseReward + bonusReward;


            ItemStack rewardStack = new ItemStack(ItemClass.GetItem(“casinoCoin”), totalReward);

            localPlayer.bag.AddItem(rewardStack);


            ulong worldTime = GameManager.Instance.World.GetWorldTime();

            PlayerQuestMap[localPlayer.entityId] = new ChallengeQuestData

            {

                QuestId = quest.ID,

                DayGiven = (int)(worldTime / 24000UL)

            };


            GameManager.ShowTooltip(localPlayer, $”§eAccepted Challenge Quest: {quest.ID}\n+{totalReward} Dukes§r”);


            Debug.Log($”[ChallengeQuestMod] Player {localPlayer.entityId} accepted challenge quest {quest.ID} (Tier {targetTier}, +{totalReward} Dukes)”);

        }


        private static int GetTerrainBonus(EntityPlayerLocal player)

        {

            Vector3i pos = World.worldToBlockPos(player.GetPosition());

            BiomeDefinition biomeDef = GameManager.Instance.World.GetBiome(pos.x, pos.z);

            if (biomeDef == null) return 0;


            switch (biomeDef.m_BiomeType)

            {

                case BiomeDefinition.BiomeType.PineForest: return 4;

                case BiomeDefinition.BiomeType.burnt_forest: return 3;

                case BiomeDefinition.BiomeType.Desert: return 2;

                case BiomeDefinition.BiomeType.Snow: return 1;

                case BiomeDefinition.BiomeType.Wasteland: return 0;

                default: return 0;

            }

        }

    }


    // 配置读取类

    public class ChallengeQuestModConfig

    {

        public Dictionary<int, int> BaseDukeRewardPerTier = new Dictionary<int, int>();

        public float CrossTierMultiplier = 2f;

        public int MaxTier = 6;


        public void Load(string path)

        {

            XmlDocument doc = new XmlDocument();

            doc.Load(path);

            XmlNode root = doc.DocumentElement;


            XmlNode maxTierNode = root.SelectSingleNode(“MaxTier”);

            if (maxTierNode != null)

                MaxTier = int.Parse(maxTierNode.InnerText);


            XmlNode multNode = root.SelectSingleNode(“CrossTierMultiplier”);

            if (multNode != null)

                CrossTierMultiplier = float.Parse(multNode.InnerText);


            foreach (XmlNode node in root.SelectNodes(“Tier”))

            {

                int level = int.Parse(node.Attributes[“Level”].Value);

                int reward = int.Parse(node.Attributes[“Reward”].Value);

                BaseDukeRewardPerTier[level] = reward;

            }


            Debug.Log($”[ChallengeQuestMod] Loaded rewards for {BaseDukeRewardPerTier.Count} tiers.”);

        }


        public int GetBaseReward(int tier)

        {

            return BaseDukeRewardPerTier.ContainsKey(tier) ? BaseDukeRewardPerTier[tier] : 0;

        }

    }


    // 给 trader UI 的任务按钮添加逻辑

    [HarmonyPatch(typeof(XUiC_TraderWindow), “Init”)]

    public class ChallengeQuestTraderButtonPatch

    {

        static void Postfix(XUiC_TraderWindow __instance)

        {

            var questBtn = __instance.GetChildById(“btn_quest”)?.Parent?.GetChildById(“btn_quest”);

            if (questBtn != null)

            {

                questBtn.OnPress += new XUiEvent_OnPressEventHandler((XUiController sender, int playerId) =>

                {

                    EntityPlayerLocal player = __instance.xui.playerUI.entityPlayer as EntityPlayerLocal;

                    EntityTrader trader = __instance.xui.Dialog.Respondent as EntityTrader;

                    ChallengeQuestMod.GiveChallengeQuest(player, trader);

                });

                Debug.Log(“[ChallengeQuestMod] Hooked into trader quest button.”);

            }

            else

            {

                Debug.Log(“[ChallengeQuestMod] Quest button not found in trader window.”);

            }

        }

    }

    ChallengeQuestConfig.xml:

    <?xml version=”1.0″ encoding=”UTF-8″?>

    <ChallengeQuestConfig>

        <!– 最大任务等级(不能超过商人任务等级上限) –>

        <MaxTier>6</MaxTier>


        <!– 跨级任务的奖励倍率:比基础奖励高 CrossTierMultiplier 倍 –>

        <CrossTierMultiplier>2.0</CrossTierMultiplier>


        <!– 各个任务等级的基础奖励(单位:公爵币) –>

        <Tier Level=”1″ Reward=”2000″ />

        <Tier Level=”2″ Reward=”4000″ />

        <Tier Level=”3″ Reward=”6000″ />

        <Tier Level=”4″ Reward=”9000″ />

        <Tier Level=”5″ Reward=”12000″ />

        <Tier Level=”6″ Reward=”15000″ />

    </ChallengeQuestConfig>

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

    Lv.8

    这么复杂的东西你还想AI给你写出来 [s-45]

    定制加Q417983415

  • 0dtd主要是现在玩七日杀想有这个内容,但没什么mod制作经验,想快速做出来放进游戏里,就去试试ai了 [s-32] 没看到比较系统全面的mod制作教程,自己慢慢收集资料学会做出来了可能都结档了hh
    拉黑 3星期前 电脑端回复
  • 回复
    Lv.10
    怦然心动

    [s-1] [s-1]

    1111111111111

    回复
    创建和谐社区,请勿发表 不符合法律法规 的内容,社区不是大家 发泄个人情绪 的地方
    获取金币请查看 网页右侧悬浮栏领金币按钮 ,做 签到社区任务 获得金币!

    请登录之后再进行评论

    登录
    • 大版主
    • 小版主
  • 摸鱼摸鱼摸
    摸鱼摸鱼摸
    交流吹水群967780922
  • 柒月白风清
    柒月白风清
    一只小萌新,万年摸鱼党!已经脱坑了。。。
  • Cure_805
    Cure_805
    晚上在睡觉,白天在工作,不一定能及时回复,有事可以留言!
  • 至善丶丶
    至善丶丶
    群:1050040662 定制/开服/地图制作/价格公道
  • 银河
    银河
    CSOL大灾变欢迎你的到来。QQ群:967780922
  • 无名氏_217
  • 安安
    安安
    大背包、常显、叠加、除草树,唯一作者QQ383125283
  • happy!
    happy!
    住院中
  • 咖啡很苦
  • 妮可Neko
    妮可Neko
    无聊写些小玩意儿
  • 暂没有数据

    赞助广告位

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

    分享网站

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