当前位置: 首页 > news >正文

Rimworld Mod教程 武器Weapon篇 近战章 第二讲:生物可用的近战来源

本讲分析的是在原版(core+all dlc)环境下,一个Pawn可以用的Tools的所有来源。
重点要分析的是RimWorld.Pawn_MeleeVerbs下的方法GetUpdatedAvailableVerbsList,我把它贴在下面:

public List<VerbEntry> GetUpdatedAvailableVerbsList(bool terrainTools)
{meleeVerbs.Clear();verbsToAdd.Clear();if (!terrainTools){List<Verb> allVerbs = pawn.verbTracker.AllVerbs;for (int i = 0; i < allVerbs.Count; i++){if (IsUsableMeleeVerb(allVerbs[i])){verbsToAdd.Add(allVerbs[i]);}}if (pawn.equipment != null){List<ThingWithComps> allEquipmentListForReading = pawn.equipment.AllEquipmentListForReading;for (int j = 0; j < allEquipmentListForReading.Count; j++){List<Verb> list = allEquipmentListForReading[j].GetComp<CompEquippable>()?.AllVerbs;if (list == null){continue;}for (int k = 0; k < list.Count; k++){if (IsUsableMeleeVerb(list[k])){verbsToAdd.Add(list[k]);}}}}if (pawn.apparel != null){List<Apparel> wornApparel = pawn.apparel.WornApparel;for (int l = 0; l < wornApparel.Count; l++){List<Verb> list2 = wornApparel[l].GetComp<CompEquippable>()?.AllVerbs;if (list2 == null){continue;}for (int m = 0; m < list2.Count; m++){if (IsUsableMeleeVerb(list2[m])){verbsToAdd.Add(list2[m]);}}}}foreach (Verb hediffsVerb in pawn.health.hediffSet.GetHediffsVerbs()){if (IsUsableMeleeVerb(hediffsVerb)){verbsToAdd.Add(hediffsVerb);}}if (ModsConfig.AnomalyActive && pawn.IsMutant){foreach (Verb allVerb in pawn.mutant.AllVerbs){if (IsUsableMeleeVerb(allVerb)){verbsToAdd.Add(allVerb);}}}}else if (pawn.Spawned && !pawn.IsMutant){TerrainDef terrain = pawn.Position.GetTerrain(pawn.Map);if (terrainVerbs == null || terrainVerbs.def != terrain){terrainVerbs = Pawn_MeleeVerbs_TerrainSource.Create(this, terrain);}List<Verb> allVerbs2 = terrainVerbs.tracker.AllVerbs;for (int n = 0; n < allVerbs2.Count; n++){Verb verb = allVerbs2[n];if (IsUsableMeleeVerb(verb)){verbsToAdd.Add(verb);}}}float num = 0f;foreach (Verb item in verbsToAdd){float num2 = VerbUtility.InitialVerbWeight(item, pawn);if (num2 > num){num = num2;}}foreach (Verb item2 in verbsToAdd){meleeVerbs.Add(new VerbEntry(item2, pawn, verbsToAdd, num));}return meleeVerbs;bool IsUsableMeleeVerb(Verb v){if (v.IsMeleeAttack){return v.IsStillUsableBy(pawn);}return false;}
}

具有一定C#基础的同学一看就懂了,好的,本期教程到此为止,谢谢大家【

咳咳,然而该教程依然是面向XML的教程,所以我将把上述天书翻译为正常的教程内容。
首先,一个Pawn本身会自带一定的Tools,比如人类的左拳右拳牙齿头槌:

Core\ThingDefs_Races\Races_Humanlike.xml,line16开始

<tools><li><label>left fist</label><labelNoLocation>fist</labelNoLocation><capacities><li>Blunt</li></capacities><power>8.2</power><cooldownTime>2</cooldownTime><linkedBodyPartsGroup>LeftHand</linkedBodyPartsGroup><surpriseAttack><extraMeleeDamages><li><def>Stun</def><amount>14</amount></li></extraMeleeDamages></surpriseAttack></li><li><label>right fist</label><labelNoLocation>fist</labelNoLocation><capacities><li>Blunt</li></capacities><power>8.2</power><cooldownTime>2</cooldownTime><linkedBodyPartsGroup>RightHand</linkedBodyPartsGroup><surpriseAttack><extraMeleeDamages><li><def>Stun</def><amount>14</amount></li></extraMeleeDamages></surpriseAttack></li><li><label>teeth</label><capacities><li>Bite</li></capacities><power>8.2</power><cooldownTime>2</cooldownTime><linkedBodyPartsGroup>Teeth</linkedBodyPartsGroup><chanceFactor>0.07</chanceFactor><soundMeleeHit>Pawn_Melee_HumanBite_Hit</soundMeleeHit><soundMeleeMiss>Pawn_Melee_HumanBite_Miss</soundMeleeMiss></li><li><label>head</label><capacities><li>Blunt</li></capacities><power>5</power><cooldownTime>2</cooldownTime><linkedBodyPartsGroup>HeadAttackTool</linkedBodyPartsGroup><ensureLinkedBodyPartsGroupAlwaysUsable>true</ensureLinkedBodyPartsGroupAlwaysUsable><chanceFactor>0.2</chanceFactor></li>
</tools>

Pawn自带的tools会多出一个常用的字段,为linkedBodyPartsGroup,即该Tool与身体部件绑定。具体来说,与其绑定的BodyPartsGroup内的身体部件的效率会以倍率的形式影响该Tool的伤害;而如果Group内的身体部件均已缺失,则该Tool的伤害为0,也就不会被使用。
与之相关的另一个字段是ensureLinkedBodyPartsGroupAlwaysUsable,如果填的是true,那么伤害倍率至少为0.4倍,那么即使绑定的所有部件均已缺失,也能正常使用。


除此之外,这里还有一个surpriseAttack的词条,这并非“暴击”的意思,而是突然袭击。
具体来说,这个机制只有一个触发条件:当野生的食肉动物触发狩猎工作(JobDriver_PredatorHunt)时,若该次攻击是对目标造成的第一次尝试攻击,且目标并非殖民者,那么会造成额外的效果。在原版,这个额外效果均为14*30tick(7秒)的晕眩。

还有一个出现的chanceFactor,它会影响随机选用tools时被选中的概率。(具体的选择逻辑后续讲吧)


第二个来源是手持的武器,这个就不再细讲了。
第三个来源是身上的装备,装备依然需要带有CompEquippable,与武器类似。
第四个来源是hediff,比如皇权里面的肘刀:

Royalty\HediffDefs\Hediffs_BodyParts_Prosthetic_Empire.xml

<HediffDef ParentName="ImplantHediffBase"><defName>ElbowBlade</defName><label>elbow blade</label><labelNoun>an elbow blade</labelNoun><description>An installed elbow blade. Extends at will from a hidden opening at the end of the ulna. Appearing without warning, it can be used for devastating slice attacks.</description><descriptionHyperlinks><ThingDef>ElbowBlade</ThingDef></descriptionHyperlinks><addedPartProps><solid>true</solid></addedPartProps><comps><li Class="HediffCompProperties_VerbGiver"><tools><li><label>blade</label><capacities><li>Cut</li></capacities><power>18</power><cooldownTime>2</cooldownTime><alwaysTreatAsWeapon>true</alwaysTreatAsWeapon><soundMeleeHit>MeleeHit_BionicSlash</soundMeleeHit><soundMeleeMiss>MeleeMiss_BionicSlash</soundMeleeMiss></li></tools></li></comps><spawnThingOnRemoved>ElbowBlade</spawnThingOnRemoved>
</HediffDef>

就是这里的comp里面的内容。当带有该comp的hediff出现在小人身上的时候,小人就能直接使用它作为近战来源。

第五个来源是异象DLC下的机制,变异的生物会获得来自变异提供的更多tools,在MutantDef.tools进行编辑。原版比较典型的是蹒跚怪获得的新tools:
Anomaly\Misc\Mutants.xml line87

 <tools><li><label>teeth</label><capacities><li>Bite</li></capacities><power>8.2</power><cooldownTime>2</cooldownTime><linkedBodyPartsGroup>Teeth</linkedBodyPartsGroup><chanceFactor>1</chanceFactor><soundMeleeHit>Pawn_Melee_HumanBite_Hit</soundMeleeHit><soundMeleeMiss>Pawn_Melee_HumanBite_Miss</soundMeleeMiss></li><li><label>left hand</label><labelNoLocation>hand</labelNoLocation><capacities><li>Scratch</li></capacities><power>7.0</power><cooldownTime>2</cooldownTime><linkedBodyPartsGroup>LeftHand</linkedBodyPartsGroup><chanceFactor>1.5</chanceFactor><alwaysTreatAsWeapon>true</alwaysTreatAsWeapon></li><li><label>right hand</label><labelNoLocation>hand</labelNoLocation><capacities><li>Scratch</li></capacities><power>7.0</power><cooldownTime>2</cooldownTime><linkedBodyPartsGroup>RightHand</linkedBodyPartsGroup><chanceFactor>1.5</chanceFactor><alwaysTreatAsWeapon>true</alwaysTreatAsWeapon></li>
</tools>

新增了一个牙齿,两个伤害类型为刮伤的左右手。这三个tools类似Pawn自带的tools,也是与身体部件绑定的。但可以发现它们的chanceFactor都被设置的很高,表达了泰南将其作为更高攻击性身体武器的想法。


第六个来源是地板。Core\TerrainDefs\Terrain_Natural.xml  line41

 <tools><li><label>dirt</label><capacities><li>KickMaterialInEyes</li></capacities><hediff>DirtInEyes</hediff><cooldownTime>1.5</cooldownTime></li>
</tools>

就是站在这种地形上可以使用这种tool,这里是把土踢进人眼睛里,是一个特殊的近战。

没了。下次再会。

相关文章:

  • SpringBoot整合MQTT实战:基于EMQX实现双向设备通信(附源码)
  • (C语言)超市管理系统(测试版)(指针)(数据结构)(二进制文件读写)
  • 网络安全侦察与漏洞扫描One-Liners
  • 【UAP】《Empirical Upper Bound in Object Detection and More》
  • Docker 环境安装(2025最新版)
  • 20、map和set、unordered_map、un_ordered_set的复现
  • 论文学习_Trex: Learning Execution Semantics from Micro-Traces for Binary Similarity
  • 保险销售系统对接保险公司接口的常见技术架构
  • 快速幂算法详解
  • 免费 OCR 识别 + 批量处理!PDF 工具 提升办公效率
  • 【Docker】Docker环境下快速部署Ollama与Open-WebUI:详细指南
  • 框架篇八股(自用)
  • GraspVLA:基于Billion-级合成动作数据预训练的抓取基础模型
  • TDengine编译成功后的bin目录下的文件的作用
  • MapReduce 模型
  • 使用 `aiohttp` 构建高效的异步网络爬虫系统
  • 原型和原型链
  • 5月12日作业
  • 【图像处理基石】如何入门AI计算机视觉?
  • Hue面试内容整理-后端框架
  • SIFF动画单元公布首批片单:《燃比娃》《凡尔赛玫瑰》等
  • 人才争夺战,二三线城市和一线城市拼什么?洛阳官方调研剖析
  • 支持企业增强战略敏捷更好发展,上海市领导密集走访外贸外资企业
  • 美英贸易协议|不,这不是一份重大贸易协议
  • 上海建筑领域绿色发展2025年工作要点发布
  • 教育部基础教育教指委:小学阶段禁止学生独自使用开放式内容生成功能