Forts
Not enough ratings
Forts 公海DLC中文开发者指南
By Chrono and 1 collaborators
This is Chinese translated guide to the high seas
   
Award
Favorite
Favorited
Unfavorite
译者注
This is Chinese translated guide to the high seas
此中文翻译是由微软翻译
在原指南的基础上翻译并修改纠正
如有错误请联系我
下列里面的部分projectile 指弹射物
有些不能理解的名字如白帽whitecaps 还有一些翻译出来一些不明的原内容都会附上原英文内容

原指南:https://steamhost.cn/steamcommunity_com/sharedfiles/filedetails/?id=2790119314


介绍
公海DLC为堡垒模组增加一系列新的功能。新的弹药系统允许武器随意地改变其火力。可以创建飞机来投掷从跑道发射的炸弹。轨道激光可以从天空攻击,将船只一分为二,将部分沉入深处。建造队列提供了新的约束来平衡强大的武器。任意可以施加到结构的任何部分。射弹可以在空气中生成,而不需要武器。还有更多!

如果您尚未阅读如何修改堡垒指南,则应首先执行此操作。本指南将带您了解这些新功能,但如果您不了解基础知识,则没有多大意义。


官方写的原版指南给我整的也看不懂(


注:如果没有基础请下面链接
原指南链接:https://steamhost.cn/steamcommunity_com/sharedfiles/filedetails/?id=1296612027&searchtext=MOD
英文翻译链接:https://steamhost.cn/steamcommunity_com/sharedfiles/filedetails/?id=2335465393
公海异步警告!
在我们开发公海当中 会出现不明的不同步
这种情况会导致你的模组在联机模式中异常

要塞在触发异步后会把异步信息输出到
Forts目录下的users/steamID/desyncs文件夹内
里面会出现一个最近出现的文件夹
内部储存着Dump出的内存数据
  • data-checksum --数据
  • Log-playermap --日志
  • world-dump --地图

而公海出现的加载数据不同步
host:mods/dlc2/effects/dome_fx.lua: 16963
client:mods/dlc2/effects/dome_fx.lua: 17004

这种问题蜜蜂人(BeeMan)给出的解释是

我弄清楚了问题所在。您正在使用以下纹理作为弹丸精灵:mods/dlc2/effects/media/domefx_01.dds
在某些情况下,这将阻止计算纹理校验和,从而导致不同步
代码有一个修复程序。同时,您可以将该纹理替换为您自己的纹理,以防止不同步。

获取公海数据
如果需要DLC代码你需要DUMP工具
https://steamhost.cn/steamcommunity_com/sharedfiles/filedetails/?id=1810079579&searchtext=DUMP
添加DUMP工具时会把所有数据输出到log
log路径:磁盘符:\steam\steamapps\common\Forts\users\76561199186543023\log.txt
注意 users\76561199186543023\是本地数据 users里面的文件夹是随机名称生成里面的内容都是一样的 不包括表的数据
获取公海的表
https://steamhost.cn/steamcommunity_com/sharedfiles/filedetails/?id=1729263387
取决于公海
对于本指南中的某些功能(平面和轨道),您需要强制使用公海mod,该mod被命名为dlc2。

在您的mod.lua脚本中,只需添加:
Include = { "dlc2" }
控制功能位于单独的脚本中。如果要创建自己的控制弹丸,则可能需要单独启用该操作,或者除了 dlc2 之外,还需要启用该控制。
Include = { "dlc2", "dlc2_control_base" }
触发公海依赖
使用任何包含“dlc2_”的符号都会导致你的模组依赖于公海。检查是一个简单的字符串搜索,因此它也将在注释中拾取实例。您可以通过要求公海或支持公海来决定使用此功能。请继续阅读以了解差异。
需要公海
如果你的模组在没有公海的情况下毫无意义,那么你可以在模组中向浏览创意工坊的玩家和堡垒本身检测(如果未安装公海,这将使它无法选择):在模组.lua:
RequiresHighSeas = true
支持公海
如果你希望你的mod利用公海的功能,如果它已安装,但如果没有,那么它应该仍然有效,但有一些元素不起作用(或者更好的是删除)。这是很有可能的,因为你的mod被运行,并且检测公海(即dlc2)是否处于工作状态。

要实现这一点,并在游戏中的模组旁边有一个公海标志,只需在模组中设置以下标志.lua:
SupportsHighSeas = true
注:就是你没有公海DLC的时 你也能选择此DLC 跟上方的RequiresHighSeas差不多不过他是能选择的

然后,在模组的Lua文件中,你可以根据dlc2Var_Active和dlc2Var_Value变量来调整执行,这些变量由游戏自动设置。

例如,你可以dlc2Var_Active使用它们来避免将武器添加到武器表中,因为它在没有公海的情况下根本不起作用。

dlc2Var_Value可用于需要计算的地方,因为当公海不处于活动状态时,其值设置为 0,在需要计算时设置为 1。
if dlc2Var_Active then table.insert(Weapons, { -- 公海依赖武器内容 } end
在这种情况下,您仍然可以将“dlc2”添加到“包含”表中,因此如果可能的话,它更愿意强制使用公海mod。您可能会在上传模组时收到警告 只需了解dlc2模组的内容在运行时可能不可用即可。
弹药
弹药系统(简称“弹药”)是改变武器行为的方式。基础游戏允许武器只有一种射击模式。也就是说,一种武器只能发射一种类型的射弹,可以发射多发子弹,每发子弹可以发射一定数量的射弹,并有固定的换弹时间。指挥官可以在激活时改变行为,但除此之外,武器非常不灵活。使用公海DLC,武器可以以多种方式射击。

这就是它的工作方式:武器脚本根部的射击参数成为所有弹药类型的默认值。然后,游戏将查找dlc2_Ammunition表,该表包含要针对不同触发模式覆盖的值列表。

如果该类型不存在或为空,则使用默认值创建单个弹药类型。这就是基础游戏和登月射击的遗留武器的工作原理。

如果它确实存在,它将读取值,并使用任何未指定的默认值。列表中的每个条目都是不同的射击模式,可以覆盖下面列出的许多武器射击参数。在公海发射时,并非所有参数都得到支持,但这将得到纠正。

  • Projectile
  • RoundsEachBurst
  • ProjectilesEachRound
  • RoundPeriod
  • ReloadTime
  • MinFireSpeed
  • MaxFireSpeed
  • MetalFireCost
  • EnergyFireCost
  • RetriggerFireEffect
  • RetriggerFireEffectOnce
  • FireEffect
  • FireRetriggerEffect
  • FireEndEffect
  • CutOffEffects
  • BeamRetriggersImpactProjectile
  • BeamsCutOffEffects
  • BeamsRecycleEffects
  • BeamCollidesWithBackground
  • BeamDuration
  • BeamThicknessMultiplier
  • BeamDamageMultiplier
  • BeamPenetrationRotationThreshold
  • BeamPenetrationDistanceThreshold
  • BeamEndEffectTime
PS:关于有的参数无效XD
弹药 - 高级 同步2023/10/26指南修改
弹药 - 高级
本节将讨论可以使弹药使用更方便或用户友好的可选功能。

在设备脚本中指定弹药
武器用于其所有射击参数的弹药类型可以放在弹药设备配置脚本中,而不是武器配置脚本中。这样可以更轻松地将新的弹药类型(消耗品或其他)添加到现有武器中。请注意“武器”表,其中列出了添加指定弹药的一个或多个武器。

在设备/ammo_cannondouble.lua中:
dlc2_Ammunition = { { StringId = "Weapon.CannonDoubleShot", Sprite = "hud-context-ammo-doubleshot", RoundsEachBurst = 2, Devices = { { Name = "ammo_cannondouble", Consume = true } }, Weapons = { "cannon" }, -- 将此弹药添加到这些武器中(并从中获取默认值) } }
我们将在后面的部分中使用此方法为轨道激光器添加弹药和发射模式。

修改武器的精灵
你会注意到,当使用跑道和轨道激光时,武器图形的一部分会根据选择发射的弹药而变化。例如,如果霹雳弹药已准备好发射,则霹雳弹药似乎已加载并准备在跑道上发射。它为玩家提供了一个明显的视觉提示,让他们知道他们将要发射什么。这可能并不适合所有武器设计,但如果您要将弹药添加到已经使用该功能的现有武器中,这一点很重要。

要更改一个或多个武器精灵,请使用dlc2_Ammunition表项中的弹药精灵表,如下所示:
AmmoSprites = { { Node = "Head", Sprite = "thunderbolt-head-thunderbolt", }, },
这会将相关武器的头部节点更改为霹雳-头部-雷电精灵,如下所示。请注意,此精灵可以像普通武器精灵一样具有正常、空闲和重新加载状态,并且触发这些状态以允许集成。


一个简单的例子:交替发射模式

让我们对大炮进行改装,使其具有发射两个射弹而不是一个射弹的模式。 您可以订阅已完成的 Double Shot Cannon mod来复制和自定义它。

weapons/cannon.lua:
请注意,可以选择将与梁相关的值放置在梁表中,以便更好地组织。弹丸武器可以发射光束,反之亦然。

一个简单的示例:备用点火模式
让我们修改加农炮,使其具有发射两个射弹而不是一个射弹的模式。您可以订阅已完成的双发炮模组以复制和自定义它。

武器/加农炮.lua:
dofile("ui/uihelper.lua") if dlc2_Ammunition == nil then dlc2_Ammunition = { {}, -- 使用默认值 } end table.insert(dlc2_Ammunition, { Sprite = "hud-context-ammo-doubleshot", RoundsEachBurst = 2, -- 使用除 RoundsEachBurst 之外的默认值 }) table.insert(Sprites, ButtonSprite("hud-context-ammo-doubleshot", "context/HUD-Ammo-DoubleShot", nil, nil, nil, nil, path))
首先,有必要确保dlc2_Ammunition表的存在。虽然它不是在基础加农炮中创建的.lua脚本,但另一个mod可能已经创建了它并添加了自己的弹药。在这种情况下,如果没有被触及,我们希望创建一个弹药类型,就像炮已经默认发射一样。这是通过插入一个空表来实现的。当我们这样做时,弹药类型的所有射击值都取自默认值,可以在武器脚本的根中找到。如果未指定任何内容,则游戏将使用空白上下文按钮子画面,您可以在屏幕截图中看到该外观。

现在,为了添加新的弹药类型,我们将另一个项目插入到dlc2_Ammunition中。这次我们覆盖两个值。所有其他射击值都取自武器脚本的根部。

Sprite 值允许我们为弹药类型提供一个上下文按钮来识别和选择它。您可以使用游戏附带的 ui纹理上下文HUD-按钮-空白-*.tga文件作为模板来创建自己的文件。我们为演示模组制作了一个新的sprite来说明。

在本例中,RoundsEachBurst 设置为 2,将覆盖默认值 1。当选择这种弹药类型并发射武器时,它将按顺序生成两个弹弹。发射成本,后坐力,重新加载时间等与以前一样,因为它们使用默认值。您可以修改任何受支持的值,以使弹药的行为有所不同。你甚至可以将弹丸武器制成光束。

弹药所需设备

上面的例子使弹药随时可用,前提是有资源可以发射它。假设我们希望玩家建立一个升级中心,以便使用我们的弹药。

table.insert(dlc2_Ammunition, { Sprite = "hud-context-ammo-doubleshot", RoundsEachBurst = 2, Devices = { { Name = "upgrade", Consume = false } }, -- 需要构建升级设备 })

如果你运行这个,你会发现你需要建立升级中心才能发射我们的新弹药类型。当将鼠标悬停在弹药的上下文按钮上时,它现在将显示“升级中心”。这是从弹药的“设备”表中列出的第一个设备中获取的。这可能没有用,因此您可以使用 StringId 值手动设置它。
table.insert(dlc2_Ammunition, { StringId = "Weapon.CannonDoubleShot", -- 上下文菜单显示名称 Sprite = "hud-context-ammo-doubleshot", RoundsEachBurst = 2, Devices = { { Name = "upgrade", Consume = false } }, })
请参阅如何修改 Forts 指南的“本地化”部分,了解如何添加已翻译的字符串。

弹药消耗

到目前为止,我们已经研究了始终可用的弹药和仅在至少制造了一个设备时才可用的弹药。现在,我们将看看消耗设备的弹药。只需将弹药的“设备”表中项目的“消耗”标志设置为 true 即可实现此目的。

table.insert(dlc2_Ammunition, { StringId = "Weapon.CannonDoubleShot", Sprite = "hud-context-ammo-doubleshot", RoundsEachBurst = 2, Devices = { { Name = "ammo_cannondouble", Consume = true } }, })

将此设备放在新文件中非常重要:设备/ammo_list.lua。此文件的格式与设备/device_list.lua完全相同,只是其中的设备放置在HUD上的“弹药”选项卡中。这使得玩家更清楚地知道在哪里可以找到它,并且它可以作为武器的弹药。

中文:例如(改装设备/ammo_list.lua):
英文:For example (modding devices/ammo_list.lua):

table.insert(Devices, { SaveName = "ammo_cannondouble", FileName = path .. "/devices/ammo_cannondouble.lua", Icon = "hud-ammo_cannon_doubleshot-icon", Detail = "hud-detail-ammo_cannon_doubleshot", Enabled = true, Prerequisite = "munitions", BuildTimeIntermediate = 5, BuildTimeComplete = 15, ScrapPeriod = 1, MetalCost = 200, EnergyCost = 6000, MetalRepairCost = 100, EnergyRepairCost = 3000, MaxUpAngle = StandardMaxUpAngle, BuildOnGroundOnly = false, SelectEffect = "ui/hud/devices/ui_devices", })

弹药设备可以设置新的消耗效果值。通常您需要将其设置为标准的公海效果:
ConsumeEffect = "mods/dlc2/effects/ammo_consumption.lua"

在设备脚本中指定弹药

武器用于其所有射击参数的弹药类型可以放置在弹药设备配置脚本中,而不是武器配置脚本中。这使得向现有武器添加新的弹药类型(消耗品或其他)变得更加容易。请注意“武器”表,其中列出了一个或多个将指定弹药添加到的武器。

在设备/ammo_cannondouble.lua中:
dlc2_Ammunition = { { StringId = "Weapon.CannonDoubleShot", Sprite = "hud-context-ammo-doubleshot", RoundsEachBurst = 2, Devices = { { Name = "ammo_cannondouble", Consume = true } }, Weapons = { "cannon" }, -- add this ammo to these weapons (and get defaults from) } }

我们将在后面的部分中使用此方法将弹药和射击模式添加到轨道激光器中。

修改武器的脚本

你会注意到,在使用跑道和轨道激光时,武器图形的一部分会根据选择发射的弹药而变化。例如,如果霹雳弹药已准备好发射,则霹雳似乎已装载并准备在跑道上发射。它为玩家提供了一个明显的视觉提示,表明他们将要发射什么。这可能不适合所有武器设计,但如果你正在为已经使用该功能的现有武器添加弹药,这一点很重要。

要更改一个或多个武器脚本,请使用dlc2_Ammunition表项中的“弹药脚本”表,如下所示:
AmmoSprites = { { Node = "Head", Sprite = "thunderbolt-head-thunderbolt", }, },
这会将相关武器的头节点更改为霹雳脚本,如下所示。请注意,此子画面可以像常规武器脚本一样具有“正常”、“空闲”和“重新加载”状态,并且触发这些状态以允许集成。
构建队列
构建队列
默认情况下,设备和武器同时构建。玩家需要收集足够的资源才能开始建造,因此火力的发挥速度已经存在自然限制。

随着地图大小的增加,收集资源的速度也会增加,资源限制变得不那么有意义。公海引入了比现有武器更强大的武器和弹药——我们需要小心不要让它们太快出来,以免使现有武器过时。我们还希望拥有装满有价值但爆炸物品的船只,导致战斗可能会发生戏剧性的变化,因为当“堡垒”在所有位置都得到支撑并且基地宽阔时,重力不再那么重要。

构建队列就是答案:每种弹药一次只能建造一种。这使得平衡非常强大的武器和高瞬时射速变得更加容易。例如,跑道可以在不到一秒钟的时间内发射飞机,快速投掷炸弹以压倒对手。

创建构建队列
可以有任意数量的独立生成队列。在公海,有一个用于飞机(dlc2_runway)的构建队列,一个用于轨道激光信标(dlc2_ol_ammo),一个用于鱼叉(dlc2_harpoon)。这允许飞机,信标,诱饵和控制弹药同时建造,同时必须等待自己的同类完成。

继续我们上面的例子,让我们只允许一次构建一个“双发大炮”弹药设备,在它自己的队列中。这可以随心所欲地称呼,任何设备或武器都可以成为队列的一部分。只要确保它是合理独特和有意义的。如果您要与另一个已经有构建队列的模组集成,那么您不需要创建另一个 - 请参阅有关如何加入队列的下一个标题。

在我们的设备/ammo_list.lua文件中:
BuildQueueConcurrent["cannon_ammo"] = 1
分配给构建队列的值表示可以一次构造的与该队列关联的设备数。例如,如果使用值 2,则该队列中的 2 台设备可以同时构建。

加入构建队列
要使设备或武器成为构建队列的成员,您只需在适当的device_list.lua、weapon_list.lua或ammo_list.lua中为物品分配dlc2_BuildQueue值。对于我们的示例,我们可以像这样更新我们的设备/ammo_list.lua文件:
BuildQueueConcurrent["cannon_ammo"] = 1 table.insert(Devices, { SaveName = "ammo_cannondouble", dlc2_BuildQueue = "cannon_ammo", FileName = path .. "/devices/ammo_cannondouble.lua", Icon = "hud-ammo_cannon_doubleshot-icon", Detail = "hud-detail-ammo_cannon_doubleshot", Enabled = true, Prerequisite = "munitions", BuildTimeIntermediate = 5, BuildTimeComplete = 15, ScrapPeriod = 1, MetalCost = 200, EnergyCost = 6000, MetalRepairCost = 100, EnergyRepairCost = 3000, MaxUpAngle = StandardMaxUpAngle, BuildOnGroundOnly = false, SelectEffect = "ui/hud/devices/ui_devices", })
一个设备只能是一个生成队列的成员。

创建构建队列不会触发公海依赖关系,但加入构建队列会触发。

修改和限制构建队列

设备或武器可以更改一个或多个构建队列的同时构建容量。添加此功能是为了允许升级后的跑道同时建造两架飞机。这是通过在device_list.lua或weapon_list.lua中设置项的 BuildQueueModifier 表来完成的,如下所示:
runway2.BuildQueueModifier = { ["dlc2_runway"] = 1 }
这意味着对于每个“runway2”类型的武器,在构建队列容量上增加 1。如果要修改其他生成队列,可以向此表添加更多生成队列。

为了限制此操作的有效性,构建队列强制实施了一个限制。添加构建队列还有另一种形式来执行此操作:
BuildQueueConcurrent["dlc2_runway"] = { Default = 1, Min = 1, Max = 2 }
这意味着无论有多少跑道2型武器,最多只能同时建造2架飞机。修饰符可以是负数,这就是为什么还有一个最小值。
集中炮管和散射炮管保存换弹时间转换
在公海中甲板炮的集中炮管和散射炮管可以互相转换
当甲板炮在换弹时转换另一个状态时会保存换弹时间

甲板炮的转换本身就是升级
您只需要在Upgrades里面添加
Upgrades = { ["turret2_focus"] = { Enabled = true, SaveName = "turret2_focus", Button = "hud-context-turret2-focus", MetalCost = 0, EnergyCost = 0, BuildDuration = 1, --升级时间 添加这个值就不会按照目标升级的武器建造时间来改变升级时间 CanDowngrade = false, --是否可以降级 TransferReloadProgress = true, --保存换弹时间 }, },
飞机
飞机可以用来突破防空,并从上方攻击。在公海,跑道武器用于发射两架飞机,霹雳和夜鹰。这两种射弹有相似之处,但投下的炸弹射弹不同,数量也不同。

公海mod(dlc2)有一个脚本,允许跑道武器跟踪射弹并在它们接近时间结束时投掷炸弹。他们也可以离开,而不是坠毁。这一切都是由projectile_list.lua中的dlc2_Bombs表配置的。例如,Thunderbolts(霹雳)在其projectile_list.lua条目中具有以下内容:
dlc2_Bombs = { Count = 4, Period = 0.06, Speed = 1000, OffsetX = 0, OffsetY = 180, Projectile = "bomb", FireEffect = path .. "/effects/bomb_release.lua", BankEffect = path .. "/effects/thunderbolt_banking.lua", AIAnticipatesDelivery = true, BankingLookahead = 2500, AbortLookahead = 0, },
这导致霹雳弹释放4枚炸弹类型炸弹。间距,水平速度,位置和效果也可以调整。BankEffect用于使飞机在炸弹释放后转向地平线,或者它在BankingLookahead的距离内检测到障碍物。

AIAnticipatesDelivery对于某些形式的防空 - 特别是Dome(穹顶)非常有用。由于炸弹在飞机飞行途中不存在,因此dlc2脚本会创建一个“虚拟射弹”并移动它,以便如果圆顶朝那个方向发射,它很有可能在到达时拦截实际的炸弹。如果你想为你自己的防空形式启用它,这是用于mod ai / ai的线.lua:
data.AntiAirFiresAtVirtualWithin["dome"] = 1
其中,分配的值是接近虚拟射弹将有效的释放点的持续时间(以秒为单位)。

目前,飞机只与跑道一起工作。要添加飞机弹药,请参阅上面“弹药”部分中的详细信息,标题为“设备脚本中的指定弹药”。
轨道轰击
制造来自天上的攻击比飞机复杂一些:
使用dlc2_orbital表创建一个信标弹丸,告诉dlc2 mod脚本orbital_laser_source将使用哪种弹药类型以及如何移动它。
将弹药类型添加到orbital_laser并orbital_laser2发射这种新的信标弹丸。
步骤2中指定的弹药类型被添加到orbital_laser_source武器中,该武器描述了要发射的射弹或光束以及相关参数。
为攻击创建新的光束或射弹类型。
让我们创建一个新的模组。它将为轨道激光器添加一个新的弹药装置。这枚弹药将发射新的信标弹丸。当它降落时,卫星将扫过目标区域,发射20毫米射弹。您可以订阅,复制和自定义轨道20毫米加农炮横扫弹药。

直通链接:https://steamhost.cn/steamcommunity_com/sharedfiles/filedetails/?id=2797072055

首先,我们需要创建信标射弹。让我们复制ol_marker_sweep弹丸并进行一些修改。这包括dlc2_orbital表,告诉dlc2脚本它是轨道攻击,使用哪种弹药以及它如何移动(步骤1)。projectile_list.lua:
ol_marker_sweep = FindProjectile("ol_marker_sweep") if ol_marker_sweep then local ol_marker_20mm_sweep = DeepCopy(ol_marker_sweep) ol_marker_20mm_sweep.SaveName = "ol_marker_20mm_sweep" ol_marker_20mm_sweep.dlc2_orbital = { Ammo = "ol_20mm_sweep", Delay = 0.1, Speed = 200, LeadTime = 3, Duration = 6, } table.insert(Projectiles, ol_marker_20mm_sweep) end
dlc2_orbital表中的弹药值对应于下面弹药中的标签值。这需要是独一无二的。

现在,在新的弹药设备脚本(设备/ammo_orbital_20mm_sweep.lua)中,我们添加了一个dlc2_Ammunition表。这增加了两种弹药类型:一种用于orbital_laser和orbital_laser2武器以发射新信标(步骤2),另一种用于orbital_laser_source武器(天空中的卫星)向目标射击(步骤3)。信标弹药被消耗,但攻击始终可用,因此其设备值保留为零。
dlc2_Ammunition = { -- beacon ammo { Sprite = "hud-context-ammo-20mm-sweep", StringId = "Weapon.Orbital20mmSweep", -- context menu display name AmmoSprites = { { Node = "Head", Sprite = "orbital_laser_head_sweep", }, }, Devices = { { Name = "ammo_ol_20mm_sweep", Consume = true, }, }, Projectile = "ol_marker_20mm_sweep", RoundsEachBurst = 1, RetriggerFireEffect = true, FireEffect = path .. "/effects/fire_ol_laser_sweep.lua", Weapons = { "orbital_laser", "orbital_laser2" }, }, -- attack ammo { Tag = "ol_20mm_sweep", -- 对应于 ol_marker_20mm_sweep 弹丸中的弹药值 Projectile = "cannon20mm", RoundsEachBurst = 15, RoundPeriod = 0.5, MinFireSpeed = 6000, MaxFireSpeed = 6000.1, Weapons = { "orbital_laser_source" }, } }
由于cannon20mm类型已经存在,因此在此示例中,步骤4没有任何进一步的工作。如果我们想添加新的射弹或光束,这将像往常一样进入武器/projectile_list.lua文件。

添加供弹药使用的光束类型

在公海之前,光束宽度和伤害功能仅在武器配置脚本中指定。由于武器现在可以发射不同的光束,因此不再足够灵活。现在可以在射弹类型中指定这些功能。如果它们没有在那里指定,那么它们会回退到武器的配置脚本中的内容。

例如,扫射光束射弹看起来像这样:
dofile("scripts/interpolate.lua") table.insert(Projectiles, { SaveName = "ol_beam_sweep", ProjectileType = "beam", -- 为简洁起见,省略了常规光束值 BeamThickness = function(t) return InterpolateTable(BeamTableOrbitalSweep, t, 2) end, BeamDamage = function(t) return InterpolateTable(BeamTableOrbitalSweep, t, 3) end, BeamCollisionThickness = function(t) return InterpolateTable(BeamTableOrbitalSweep, t, 4) end, } -- 唯一命名的光束表(请参阅下面的警告) -- 第一列是时间关键点 -- 第二个碰撞时该关键点的厚度 -- 第三列是该关键点的损坏 BeamTableOrbitalSweep = { { 0, 1, 0, 0, }, { 1, 10, 0, 0.25, }, { 1.25, 100, 1500, 1, }, { 3.25, 100, 1500, 1, }, { 4.25, 0, 0, 0, }, }
WARNING: name your beam table something unique to your mod. Using the same table name will overwrite previous values and change the behaviour of other beams.
警告:将你的光束表命名为你的模组独有的东西。使用相同的表名将覆盖以前的值并更改其他梁的行为。

标记 光束撞击的效果可见性
Tagged Effect Visibility for Beam Impacts

我们想根据轨道激光的移动方向调整撞击效果,这样火花就会尾随撞击点。如果不复制整个弹丸类型,我们就无法做到这一点,因为您只能指定一种冲击效果。解决方案是允许关闭效果组件。效果脚本中的效果可以使用 Tag 变量用名称标记,然后我们调用 SetWeaponEffectTag 脚本函数,如下所示:
if config.speed ~= 0 then ScheduleCall(config.delay, SetWeaponEffectTag, id, "Right", config.speed > 0) ScheduleCall(config.delay, SetWeaponEffectTag, id, "Left", config.speed < 0) end
如果要向轨道激光添加新光束,则可以使用标记为“左”和“右”的组件创建效果,这些效果将根据其行进方向自动显示。
控制射弹
公海DLC增加了对我们所谓的“控制射弹”的内置支持,这些射弹具有强大的新功能。在指定的条件下,他们可以在远程结构上生成设备和/或控制它。

在DLC活动中,它们用于控制禁用或中立的结构。在小规模战斗模式中,它只适用于中立结构,因为让它在禁用的结构上工作可以绕过装甲并立即结束游戏。它被认为过于强大。

要使用此功能,首先请确保您的模组.lua至少包含dlc2_control_base模组:
Include = { "dlc2_control_base" }
然后在弹丸定义中,您需要设置dlc2_control表。这有三个可能的条目来指定当射弹与其他结构碰撞时会发生什么:友方,中立和敌方。这些表中的每一个都可以指定两个值:ControlFlags 和 Spawn。

ControlFlags 指定当弹丸与适当的结构发生碰撞时会发生什么。在脚本/堡垒中定义了适当的标志值.lua。它们可以组合在一起以自定义效果。
CONTROL_CONVERTALL = 1 CONTROL_CONVERTDISABLEDONLY = 2 CONTROL_SPAWNUNPOWEREDONLY = 4
以下是英文的说明
Spawn specifies what type of device is created on the hit structure, if any.

Let's look at some examples to put it together.
翻译出来的说明
Spawn 指定在命中结构上创建的设备类型(如果有)。

让我们看一些例子来把它放在一起。

示例:控制中性结构

这是控制弹丸在小规模战斗和多人游戏中的行为。为了实现这一目标,我们在射弹中设置了dlc2_control,如下所示:
dlc2_control = { Neutral = { ControlFlags = CONTROL_CONVERTALL + CONTROL_SPAWNUNPOWEREDONLY, Spawn = "minireactor", }, },
由于只设置了中立方表,因此如果射弹击中友方或敌方结构,则不会发生任何事情。当它碰到一个中性结构时,它总是会转换它(CONTROL_CONVERTALL)。

下一个标志(CONTROL_SPAWNUNPOWEREDONLY)防止在中性结构已经具有反应堆,炸药桶或其他结构要求设备的情况下生成反应堆设备。该结构将被简单地接管,而无需创建设

示例:控制中立和敌方结构

公海战役的行为略有不同,以促进任务目标。这个射弹dlc2_control是这样的:
dlc2_control = { Neutral = { ControlFlags = CONTROL_CONVERTALL, }, Enemy = { ControlFlags = CONTROL_CONVERTDISABLEDONLY, } },
在这种情况下,在与中性结构碰撞时,它会将结构转换为射弹的团队(CONTROL_CONVERTALL)。但是,如果结构还没有声明设备,则该结构将恢复为中性。

当它与敌方结构碰撞时,只有当所有声称的设备(如反应堆)都被禁用时,它才会尝试将其转换。
注:翻译出来是所有声称设备不代表提到的具体意思 应该是比如有占领性的炸药桶之类的

Example: Sending a Care Package
原话:
Let's say your ally is in a death spiral and you want to help them out. Shoot them a care package projectile and spawn a device on their fort that they can salvage when it's convenient for them. You will want to create your own carepackage device that perhaps costs a little more to fire than redeem. Perhaps in a few denominations. Do you want it to spawn on the enemy base too, for consistency?
翻译:
示例:发送护理包
假设你的盟友处于死亡螺旋中,你想帮助他们。向他们发射护理包射弹,并在他们的堡垒上生成一个装置,他们可以在方便的时候打捞它。您将需要创建自己的护理包设备,该设备可能比赎回的成本高一点。也许在几个队伍中。为了保持一致性,你也希望它在敌人的基地上生成吗?
注:翻译出来是护理包carepackage 在这里具体不清楚就很迷
dlc2_control = { Friendly = { Spawn = "carepackage", }, Neutral = { Spawn = "carepackage", }, },
Example: Sending a Bomb
原话:
The original Shockenaugh active randomly spawned a barrel in each enemy fort. We could revive this in a different form by spawning a barrel where a projectile hit. The enemy could try to scrap it before it was hit by another weapon. You might want to avoid spawning it for friendlies to avoid the inevitable team killing.

示例:发送炸弹
原来的Shockenaugh活跃在每个敌方堡垒中随机生成一个桶。我们可以通过生成一个发射弹击中的桶来以不同的形式恢复它。敌人可以在它被另一种武器击中之前试图报废它。你可能想避免在友谊赛中生成它,以避免不可避免的团队杀戮。
dlc2_control = { Neutral = { Spawn = "barrel", }, Enemy = { Spawn = "barrel", }, },

弹丸和结构飞溅
原话:
Projectile and Structure Splashes
Projectile splash effects are set up for the surface in the ImpactBySize table. Each item in this table includes a number which is associated with the ImpactSize variable of the projectile. If this is not set, then ProjectileDamage is used instead.

Splash effects for falling structure uses a separate table called NodeSoftImpactByVelocity. The number in each item for this represents the speed at which the node is falling into the water. Code listing below.

翻译:
弹丸飞溅效果在“影响比大小”表中为曲面设置。此表中的每个项目都包含一个数字,该数字与射弹的 ImpactSize 变量相关联。如果未设置此值,则使用射弹损坏。

下落结构的飞溅效果使用一个名为NodeSoftImpactByVelocity的单独表格。每个项目中的数字表示节点落入水中的速度。代码清单如下。

从基本公海环境出发
制作定制水环境的最简单方法是使用我们的内置dlc2_oceans_base mod。这将提供你需要的一切,但允许你添加背景图层,额外的道具,地面纹理等。通过将其包含在您的模组.lua中来执行此操作:
Include = { "dlc2_oceans_base" }
从那里像往常一样添加背景.lua和关联的纹理。尝试一下,看看你得到了什么,然后添加你需要的任何其他东西,比如地面纹理和道具。您甚至可以按照通常的方式添加新的地形表面类型。
动态曲面
要制作自己的水面,请将dlc2_DynamicAnim表添加到地形表面。此表有两个值:MaxDivision 和 Script。MaxDivision 告诉水最多应细分的距离。要获得整数个细分,实际距离可能略小于此值,具体取决于边长。脚本是描述如何对细分进行动画处理的文件路径。
dlc2_DynamicAnim = { MaxDivision = 100, Script = dir .. "water_anim.lua", },

dlc2_oceans_base中包含的曲面动画脚本包括以下water_anim.lua脚本。该脚本首先在 Load 函数中设置随机水波高。然后实现两个函数,分别控制细分地形节点的 x 和 y 位置。两个不同时间速率的正弦波叠加在一起,使水面看起来令人满意。
dofile("scripts/core.lua") function Load() Waves = 50 WaveHeight = {} SeedRandom(5); for i=1,Waves do local val = GetRandomFloat(0.4, 1) table.insert(WaveHeight, val) end end function UpdateDynamicNodeX(time, basePos) local mult1 = 2 * math.pi / 1000 --表面光滑度 return basePos.x + 50*math.sin(mult1*basePos.x + time) end function UpdateDynamicNodeY(time, basePos) local index = math.floor(basePos.x/1000 + time/(2*math.pi))%Waves local factor = WaveHeight[index + 1] local mult1 = 2 * math.pi / 1000 --小波浪间距 local mult2 = 2 * math.pi / 1500 local result = basePos.y + factor*20*math.sin(mult1*basePos.x + time) + 20*math.sin(mult2*basePos.x + -2*time) return result end
弹丸和结构飞溅
弹丸飞溅效果在“影响比大小”表中为曲面设置。此表中的每个项目都包含一个数字,该数字与射弹的 ImpactSize 变量相关联。如果未设置此值,则使用射弹损坏。

下落结构的飞溅效果使用一个名为NodeSoftImpactByVelocity的单独表格。每个项目中的数字表示节点落入水中的速度。代码清单如下。
白帽表面配置
总而言之,这是公海水面(白帽)的设置方式:
dir = path .. "/surfaces/" Sprites = { -- omitted for brevity } Bubbles = { Effect = path .. "/../../effects/bubbles_large.lua", AlignedToVel = true, } WhiteCaps = { SaveName = "whitecaps", IconSprite = dir .. "ocean_icon.png", ImpactBySize = { { 0, { Effect = path .. "/../../effects/splash_small.lua", AlignedToVel = false, Terminate = false, Chain = { Bubbles }, Splash = false, }}, { 30, { Effect = path .. "/../../effects/splash_medium.lua", AlignedToVel = false, Terminate = false, Chain = { Bubbles }, Splash = false }}, { 100, { Effect = path .. "/../../effects/splash_large.lua", AlignedToVel = false, Terminate = false, Chain = { Bubbles }, Splash = false }}, }, NodeSoftImpactByVelocity = { { 400, { Effect = path .. "/../../effects/splash_small.lua", AlignedToVel = false, ImpactDirFilterY = 1.0, Terminate = false }}, { 800, { Effect = path .. "/../../effects/splash_debris_medium.lua", AlignedToVel = false, ImpactDirFilterY = 1.0, Terminate = false }}, { 1200, { Effect = path .. "/../../effects/splash_large.lua", AlignedToVel = false, ImpactDirFilterY = 1.0, Terminate = false }}, }, { NormalAngleBrackets = { { -180, 180 } }, Layers = { { ExtrudedEdging = true, Sprite = "whitecaps", Offset = -0.4, }, } }, dlc2_DynamicAnim = { MaxDivision = 100, Script = dir .. "water_anim.lua", }, }

水物理
公海的水被建模为横跨世界的平坦水平线。图形水对物理没有影响。它是在任务脚本中通过dlc2_WaterLevel变量设置的:
dlc2_WaterLevel = 5200
调整水物理场的参数在 db/常量.lua脚本中设置。您可以修改这些以调整其行为。请继续阅读以了解这些值的用法。
Physics.Water = { Force = 120, ForceNeutral = 0.05, Power = 1.5, MaxDepth = 400, Drag = 100, FillPeriod = 6, DrainPeriod = 30, }
每个结构节点都有一个值,表示它的“充满水”的程度。当它被玩家拥有时,水位下降到零。当节点变为无队伍时,水位增加到1。该水位用于在Physics.Water表中的力和力中间值之间进行插值,以计算浮力的大小。该系统允许与反应堆隔绝的结构在短时间内保持漂浮,然后优雅地下沉。FillPeriod和DestreamPeriod控制结构吸收水分的速度以及重新连接时恢复的速度。

力的大小也随着深度的增加而增加,达到极限。这允许较大的结构将其大部分保持在水外,以便部署更多武器。功率值确定深度和力之间的指数关系,MaxDepth确定力可以达到多大以及在哪里。
const float force = currNode->mWaterLevel*mWaterForceNeutral + (1.0f - currNode->mWaterLevel)*mWaterForce; buoyancy = -force*pow(depth, mWaterPower);
还可以调整“拖动”值以限制结构在水下移动的速度。
水下射弹
有一些新的参数可用于控制射弹在水下的行为:MaxAgeUnderwater和UnderwaterFadeDuration。

MaxAgeUnderwater控制着一个水下射弹的持续时间。也就是说,如果射弹在水下下倾,然后转身并离开水面,计时器就会重置。新的水进入需要整个持续时间才能通过,然后弹丸才会消失。如果未设置此变量,则默认为 0.4。

水下衰减确定在寿命到期前多久射弹开始消失。它应该小于或等于 MaxAgeUnderwater。如果弹丸开始消失,然后离开水,它将重置为完全不透明。如果未设置此变量,则默认为 0.2。

请注意,可以选择将与梁相关的值放置在梁表中,以便更好地组织。射弹武器可以发射光束,反之亦然。
水下渐变的光束
在露天,光束将无限期地持续(*),并且它们可以通过穿过烟雾而减弱。使用公海,光束也可以在水下一段距离内淡出。

这只需在射弹项目中设置 BeamOcclusionDistanceWater 值即可。如果未设置,它将默认为BeamOcclusionDistance,默认为1200,这也用于通过烟雾削弱光束。您可以将 BeamOcclusionDistanceWater 设置为较高的值,以防止在水中明显消失。它不会调用公海依赖性,因此即使您不需要它,也可以与公海兼容。
BeamOcclusionDistanceWater = 1000,
公海更新还增加了一个新的射弹值,称为BeamMaxTravel。该值将在光束行进该距离(包括通过反射和门户)后终止光束。

(*)这并不完全正确。存在最大光束线段长度限制,该限制足够长,允许光束在地图最大范围内的任意两点之间移动。
水和陆地设备
为了使船舶看起来和感觉更像船舶,我们决定在公海增加新的资源收集器:螺旋桨收集金属,烟囱收集能量。在陆地上建造这些是没有意义的,在船上提供矿井和风力发电机也没有意义。陆地导弹发射井与海洋导弹发射井也是如此。

现在有设备和武器标志来控制可以构建设备的位置。这些设置在device_list.lua、weapon_list.lua或ammo_list.lua中的项目上:

For a land only device, you would write:
处于陆地要塞 设备它将是:
RequiresLand = true, RequiresWater = false,
For a water only device, it would be:
处于水里要塞 设备它将是:
RequiresLand = false, RequiresWater = true,

如果未指定这些,它们都默认为 false,使它们在任何地方都可用。

所有设备还可以在相同的Lua文件中设置MinBuildDepth变量,这可以防止在水面上或比指定深度浅的深度进行建造。这用于螺旋桨。默认情况下,此值设置为 0,这允许在水面以上和任何深度进行建造。
脚本函数
《公海》增加了一些新功能,这些功能可以从DLC独有的任务和mod脚本中使用。本节将简要介绍它们,以及一些可以在不引起公海依赖的情况下使用的方法。还添加了相当多的其他功能,可以在没有DLC的情况下使用,但这些功能在这里不会介绍。

有关所有功能的详细信息,请参阅 Forts 脚本 API https://www.earthworkgames.com/content/docs/FortsAPI.html

dlc2_CreateFloatingDevice
此功能允许您在任何地方创建设备或武器。也就是说,它不需要在平台或地面上取得成功。该装置或武器必须在其device_list.lua、weapon_list.lua或ammo_list.lua物品中dlc2_BuildAnywhere设置为 true,才能正常工作。

这就是orbital_laser_source武器在视图范围之外生成的方式。
// C prototype int dlc2_CreateFloatingDevice(int deviceTeamId, const char* saveName, const Vector3D& position, float angle)
dlc2_ApplyForce
此函数将向节点(包括结构和弹丸节点)添加瞬时力。如果你想连续施加力,你必须称之为每个物理场。

由于武器后坐力可以移动船只,因此公海利用这一点将船只保持在它们开始的位置。它应用于每个反应堆的一个平台节点。
// C prototype void dlc2_ApplyForce(int nodeId, const Vector3D& force)
dlc2_SetDevicePosition
为了对轨道激光器的位置进行动画处理,我们在一系列物理帧上使用此函数。目前,它需要将BuildOnGroundOnLy设置为true。
// C prototype void dlc2_SetDevicePosition(int deviceId, const Vector3D& pos)
dlc2_CreateProjectile
公海的飞机使用此功能在其轨迹的特定位置创建炸弹射弹。其他用途受您的想象力限制。

请注意,weaponSaveName 参数是可选的。当调用dlc2_CreateProjectile时,它还将调用所有脚本的 OnWeaponFired 事件,并将 weaponSaveName 的值作为第二个参数传递。某些脚本可能需要有效的武器保存名称。如果它没有意义,可以将其设置为空字符串。
// C prototype int dlc2_CreateProjectile(const char* saveName, const char* weaponSaveName, int teamId, const Vector3D& position, const Vector3D& velocity, float lifespan)
dlc2_ConvertStructure
当控制弹丸击中一个结构时,公海脚本,根据相关的控制旗帜,它会尝试将结构转换为弹丸的团队。这是它使用的函数。使用 NodeStructureId 可以发现特定节点的结构 Id。
// C prototype void dlc2_ConvertStructure(int structureId, int structureNodeId, int teamIdFrom, int teamIdTo)
GetStructureOnLand, GetStructureInWater
这些允许您查询结构是否至少部分位于陆地或水上。在某些情况下,可以在陆地和水中考虑结构,在这种情况下,它们都将返回true。
// C prototype bool GetStructureOnLand(int structureId) bool GetStructureInWater(int structureId)
GetWaterDepthAt, GetWaterLevel
这些函数允许您在地图中的各个位置查询水位以下的水位或水位本身(与动画地形表面无关的平面线)的深度。
// C prototype float GetWaterDepthAt(const Vector3D& pos) float GetWaterLevel(float x)
SetWeaponSelectedAmmo
你可能有一种武器有多个弹药类型,并且想要控制它试图发射哪种类型的弹药。您可以使用此功能来实现此目的,只需确保您的弹药具有Tag变量集即可。传递空字符串将使其使用默认值:队列模式或第一个弹药(如果没有可用的消耗品类型)。
// C prototype void SetWeaponSelectedAmmo(int deviceId, const char* tag)
GetProjectileTypeIndex, HasProjectileParamNodeByIndex, GetProjectileParameter*
在公海更新之前,如果脚本想要自定义射弹的行为,则必须自己指定所需的数据。这是有问题的,因为保留它的最合乎逻辑的地方是其余的弹丸配置数据。

平面和轨道激光器具有大量的配置变量,这对于像这样实现和修改是不方便的。相反,我们添加了一系列允许查询任意值的脚本函数。这些变量具有默认值,因此脚本可以决定在未设置变量时使用什么。

例如,公海mod查询轨道激光打击运动的持续时间,如下所示:
config.duration = GetProjectileParamFloat(sourceSaveName, teamId, "dlc2_orbital.Duration", 0)
您可以在 FortsAPI 文档中看到这些函数的完整列表
https://www.earthworkgames.com/content/docs/FortsAPI.html
公海类型引用
本节将为您提供公海中使用的类型名称和文件路径,以便您可以对其进行修改。
Type Reference
This section will give you the type names and file paths used in High Seas, so that you may mod them.

mods/dlc2: Devices
propeller: (devices/propeller.lua)
propeller2: (devices/propeller2.lua)
smokestack: (devices/smokestack.lua)
smokestack2: (devices/smokestack2.lua)
shipping_container: (devices/shipping_container.lua)
comms: (devices/comms.lua)
welder: (devices/welder.lua)
flag: (devices/flag.lua)
buoy: (devices/buoy.lua)

mods/dlc2: Weapons
harpoon: (weapons/harpoon.lua)
dome: (weapons/dome.lua)
hardpoint: (weapons/hardpoint.lua)
turret: (weapons/turret.lua)
turret2: (weapons/turret2.lua)
turret2_focus: (weapons/turret2_focus.lua)
turret3: (weapons/turret3.lua)
turret3_focus: (weapons/turret3_focus.lua)
orbital_laser: (weapons/orbital_laser.lua)
orbital_laser2: (weapons/orbital_laser2.lua)
orbital_laser_source: (weapons/orbital_laser_source.lua)
subswarm: (weapons/subswarm.lua)
sublauncher: (weapons/sublauncher.lua)
runway: (weapons/runway.lua)

mods/dlc2_skirmish: Weapons
runway2: (mods/dlc2/weapons/runway2.lua)

mods/dlc2: Ammo Devices
ammo_thunderbolt: (devices/ammo_thunderbolt.lua, queue: dlc2_runway)
ammo_nighthawk: (devices/ammo_nighthawk.lua, queue: dlc2_runway)
ammo_orbital_sweep: (devices/ammo_orbital_sweep.lua, queue: dlc2_ol_ammo)
ammo_orbital_focus: (devices/ammo_orbital_focus.lua, queue: dlc2_ol_ammo)
ammo_decoy: (devices/ammo_decoy.lua, queue: dlc2_harpoon)

mods/dlc2: Projectiles
decoy
dome_barrier
dome
thunderbolt
bomb
nighthawk
paveway
turret
ol_marker_sweep
ol_marker_focus
ol_beam_sweep
ol_beam_focus
flaming_boulder
flamingthunderbolt
flamingnighthawk
flamingbomb
flamingpaveway
flamingturret

mods/dlc2_ammo_control: Devices
minireactor: (devices/minireactor.lua)

mods/dlc2_ammo_control: Ammo Devices
ammo_control: (devices/ammo_control.lua, queue: dlc2_harpoon)

mods/dlc2: Projectiles
control
Effects Reference
mods/dlc2/effects
alert_warning.lua
ammo_consumption.lua
battery_eject_small.lua
bomb_release.lua
buoy_idle.lua
comms_explode.lua
container_explode.lua
cs_prologue_dreadnaught.lua
cs_whiteout.lua
debris_trails_bubbles.lua
deck_gun_projectile_fly.lua
decoy_fly.lua
device_explode_submerged.lua
device_explode_submerged_large.lua
device_explode_submerged_small.lua
dome_explode.lua
dome_fx.lua
dome_weapon_explode.lua
explosion_airburst.lua
explosion_airburst_electrical.lua
fire_deckgun.lua
fire_deckgun_2.lua
fire_deckgun_3.lua
fire_dome.lua
fire_harpoon.lua
fire_nighthawk.lua
fire_ol_laser_focus.lua
fire_ol_laser_sweep.lua
fire_thunderbolt.lua
flaming_boulder_trail.lua
harpoon_weapon_explode.lua
impact_bombs.lua
impact_decoy.lua
impact_ol_projectile.lua
impact_ol_projectile_sweep.lua
impact_paveway.lua
impact_turret.lua
jet_explode.lua
nighthawk_banking.lua
nighthawk_explode.lua
ol_beam_focus_hit.lua
ol_beam_hit.lua
ol_focus_projectile_fly.lua
ol_sweep_projectile_fly.lua
orbital_laser_source_fire.lua
orbital_laser_source_fire_focus.lua
orbital_laser_source_fire_sweep.lua
propeller_bubbles.lua
propeller_idle.lua
shell_eject_ol.lua
smokestack_idle.lua
smokestack_steam.lua
thunderbolt_banking.lua
thunderbolt_explode.lua
thunderbolt_weapon_explode.lua
trail_nighthawk.lua
trail_thunderbolt.lua
welder_explode.lua

mods/dlc2_ammo_control/effects
control_trail.lua
fire_control.lua
impact_cp.lua

mods/dlc2_oceans_base/effects
bubbles_large.lua
buoy_idle.lua
smoke_idle.lua
splash_debris_large.lua
splash_debris_medium.lua
splash_large.lua
splash_medium.lua
splash_small.lua
1 Comments
大聪明一号 6 Feb, 2023 @ 2:46am 
6啊