P.A.I.M.O.N 发表于 2023-6-3 13:15:50

【进阶教程】派蒙手把手教你:在生涯模式内添加一个能够派发任务的NPC

本帖最后由 P.A.I.M.O.N 于 2023-6-23 22:22 编辑

想必各位Modder都很想在生涯模式内,在栩栩如生的星区世界内为自己的MOD增加NPC吧,现在就由我,万能的应急食品派蒙,来为各位星区旅行者介绍使MOD更加多彩的方法吧!1、新建一个人物首先,我们在某处新建一个人物,如果此人物需要星区生成时就存在,那么可以在ModPlugin文件的onNewGameAfterEconomyLoad函数下面添加如下代码:@Override
public void onNewGameAfterEconomyLoad() {//只有等经济系统初始化完毕后,游戏中的市场才会出现,在onNewGame函数里写市场相关代码会报错
    ImportantPeopleAPI ip = Global.getSector().getImportantPeople();
    //此处以X入侵的League of Watchmen为例
    MarketAPI market_low = Global.getSector().getEconomy().getMarket("watchmen_chaldea_market");
    //事先删除整个market里的所有人物,只留一个我们新建的marx
    if (market_low != null) {
      for (PersonAPI p : market_low.getPeopleCopy()) {
            market_low.removePerson(p);
            ip.removePerson(p);
            market_low.getCommDirectory().removePerson(p);
      }
      PersonAPI marx = market_low.getFaction().createRandomPerson();//使用这个函数,可以创建一个该阵营的随机人物

      marx.setId("marx");//人物id,游戏中可以唯一找到它的识别名
      marx.setPostId(Ranks.POST_ADMINISTRATOR);//设置该人物的职位
      marx.setRankId(Ranks.SPACE_COMMANDER);//设置该人物的军衔
      marx.setGender(FullName.Gender.MALE);//设置性别
      marx.getName().setFirst("Friedrich");//众所周知,西方人的名字是由两部分组成
      marx.getName().setLast("Marx");

      //marx.setFaction("watchmen");//设置阵营,但是由于之前我们创建时候就设置了,所以这里注释掉
      //marx.addTag(Tags.CONTACT_MILITARY);//为人物增加tag,例如贸易,军方,影响人物能够派发的联络人任务

      marx.setPortraitSprite("graphics/xinvade/portraits/Marx.png");//设置人物的大头照
      marx.setImportanceAndVoice(PersonImportance.HIGH, StarSystemGenerator.random);//设置人物的重要性,至于Voice是角色打招呼的语气,例如voice = faithful就会说“卢德保佑你”之类,可在rules中自定义

      ip.addPerson(marx);//只有加入ImportantPeople,该人物才能被rules和missionHub识别
      ip.getData(marx).getLocation().setMarket(market_low);//将人物传送到指定market里
      ip.checkOutPerson(marx, "permanent_staff");//"这个的意思是把人物以'永久成员(permanent_staff)'的理由签发出去,如此一来就不会成为某些随机任务的目标。“————感谢议长订正
      marx.getStats().setSkillLevel(Skills.INDUSTRIAL_PLANNING, 1);//设置人物的技能,这里给他加了1级的工业规划

      market_low.setAdmin(marx);//市场管理员设置为他
      market_low.getCommDirectory().addPerson(marx, 0);//将其加入通讯录中
      market_low.addPerson(marx);//将该person加入市场的人物列表,使某些按市场寻人的方法可以找到
    }
}这样,一个崭新的人物就生成完成了。2、为人物添加MissionHub
当建立新的联络人后,MissionHub会自动添加在联络人身上,可以用如下代码将NPC设置为潜在联络人。玩家自定义的人物如果没有走这个流程,就无法接取联络人任务。
ContactIntel.addPotentialContact(marx, market_low, dialog.getTextPanel());当然,也可以直接为人物添加MissionHub(类似学院任务的塞巴斯蒂安)://这里是设置该人物拥有多少个额外任务上限,若不填,则每次只能刷出一个任务,若填1,则每次最多能刷出2个人物,填2则最多刷出3个。
marx.getMemoryWithoutUpdate().set(BaseMissionHub.NUM_BONUS_MISSIONS, 1);
//为人物添加MissionHub
BaseMissionHub.set(marx, new BaseMissionHub(marx));
3、在person_mission文件夹中设置任务MissionHub会使联络人每隔一段时间便刷出一次person_mission列表中存在的任务。以下是person_mission中每一列参数所代表的含义
Mission id 任务的ID,需要唯一
Person id 只有当MissionHub持有者的id为person id时,才会派发此任务
Tags All 当该人物有且仅有此tag(之前在文件里定义的marx.addTag中的tag)时,可以刷出此任务
Tags Any 当该人物拥有此tag时,可以刷出此任务
Tags NotAny 当该人物不拥有此tag时,可以刷出该人物
Tags 这里的tag可以给任务增加一些其他限制,例如priority会使任务在满足要求时优先刷出来,non_repeatable可以使任务只刷出一次
Freq 任务刷出的可能性,随机数权重
Min/max timeout 任务可能在min至max个时间单位后被其他任务顶替掉
Min/max rep 在与联络人最低min,最高max的关系之间可能接到该任务
Importance 联络人的重要性高于此数值之后,才会接到该任务
ReqMissionAny 填任务id,在完成任意此列表任务中的某一个,则该任务可接
ReqMissionAll 在完成任意此列表任务中的全部任务后,该任务可接
ReqMissionNone 在未完成任意此列表任务中的全部任务前,该任务可接
Icon 任务图标
Plugin 该任务的脚本文件,填地址路径
4、在rules中设置任务流程
此处以本人MOD,X入侵的替守望者联盟导师Marx回收信标的任务为例
5、Intel文件配置
【进阶教程】派蒙手把手教你之第二弹:详解Intel - Mod制作讨论 - 远行星号中文论坛 (fossic.org)
本来写上面这篇帖子时想重新解释一下rules,但是我想,大概,看了intel之后就能有更深的理解了吧……
6、疑难解答
Q:你的教程有错误/我按照你的步骤,没有成功达到我的需求
A:你可以在本贴留言/私信我/去论坛Modder交流群at我提问,这个疑难解答就是为了补充各种情况下的对策而准备的。
       至于任何错误,欢迎各位高手斧正,尤其是我也不知道的部分敬请开君金口替我补充完整。但还请嘴下留情。

Q:rules和intel的配置太复杂了,有没有什么现成的参考?
A:原版rules.csv文件存在于Starsector\starsector-core\data\campaign文件夹中,至于intel可以解压Starsector\starsector-core\starfarer.api.zip,在com\fs\starfarer\api\impl\campaign\missions中找到原版的相关例子,也可以以我的MOD或议长的仙山作为参考。

Q:我有的问题实在解决不了,可以帮我写码吗?
A:我的MOD现在急需更多图像素材,但因为囊中羞涩无可奈何,如果可以帮我提供素材或其他支援的话,我可以以代替写码与改BUG作为交换。




马某 发表于 2023-6-3 13:58:14

好!

doc. 发表于 2023-6-3 14:22:03

6666{:5_128:}{:5_134:}

不知叫啥 发表于 2023-6-3 15:00:13

666

任岁飘零 发表于 2023-6-3 17:09:55

{:tieba_43:}

给自己起个昵称 发表于 2023-6-3 17:29:01

{:tieba_16:}{:tieba_16:}{:tieba_16:}

。。。 发表于 2023-6-3 20:39:34

{:tieba_12:}{:tieba_12:}

極光 发表于 2023-6-3 22:58:24

太牛辣~~{:tieba_50:}
页: [1]
查看完整版本: 【进阶教程】派蒙手把手教你:在生涯模式内添加一个能够派发任务的NPC