LE2 改进功能

LE2 改进功能

LE2中为使特定模组正常运行所必需的改进,同时也是其他模组开发者的资源参考。

工具

这个模组将作为我的仓库,存放那些在我所有模组中通用追踪的、针对《质量效应:传奇版2》(LE2)的特定需求。对于某些模组来说,它是必需的安装项,同时也为希望使用它的其他模组开发者提供资源。



[color=#00ff00][size=5]目前已实现的功能:[/size][/color]

[color=#00ffff][size=4]隐藏戴头盔队友的头发 - 此功能已包含在 LE2 非官方补丁中[/size][/color]
问题:
当队友戴上头盔时,LE2 的代码不支持移除其头发网格。这是因为原版游戏为某些队友使用了呼吸面罩,且大多数队友甚至没有头发网格。

解决方案:
安装了 2 个合并模组(mergemods),第一个是 bHelmetHidesHair.m3m,它为 SFXPawn_Henchman 添加了一个自定义配置布尔值。第二个是 ShowHelmet.m3m,它更新了 SFXPawn_Henchman 中的 ShowHelmet 函数,使其在判断队友戴头盔时是否应移除头发网格时,使用 bHelmetHidesHair 布尔值。bHelmetHidesHead 功能不受影响。

该函数将首先判断 bHelmetHidesHead 是否为 TRUE,如果是,则使用该过程。如果是 FALSE,则继续判断 bHelmetHidesHair,如果为 TRUE,则使用该过程。如果为 FALSE,函数将相应地继续执行。

使用方法:
安装后,您可以添加布尔值 bHelmetHidesHair = TRUE 直接到 BioH 的默认属性中,和/或包含一个 BIOGame.ini 合并文件来控制该角色的布尔状态。示例:

[BioGame.ini SFXGamePawns.SFXPawn_Miranda]
bHelmetHidesHair=TRUE

[color=#00ffff][size=4]弧光投影仪(Arc Projector)在 SFXGame 重新编译时崩溃(CTD) - 此功能已包含在 LE2 非官方补丁中[/size][/color]
问题:
当模组在 LE2 中重新编译 SFXWeapon 类时,游戏在选择弧光投影仪时会冻结/崩溃。这是因为弧光投影仪的默认属性中 PSC_ShellCasing 被设置为空。这不会影响原版游戏,我目前也不理解为什么。

解决方案:
此模组包含一个修正版的弧光投影仪,它将其 PSC_ShellCasing 属性设置为其正确的组件,从而阻止了模组化游戏中出现的冻结/崩溃问题。

[color=#00ffff][size=4]DefaultColorScale 合并配置化[/size][/color]
DefaultColorScale 是 Engine.pcc 中的一个向量变量,现在可以通过 Coalesced 进行配置。它的值 XYZ 对应 RGB。这将影响游戏中的每一个关卡。

要启用,请向您的模组添加一个 configdelta 文件并输入以下内容:

[BioGame.ini SFXGame.BioWorldInfo]
DefaultColorScale = (X=10,Y=0.1,Z=0.1)

此示例将使颜色变得超级红。

[color=#00ffff][size=4]创建了护甲头盔匹配系统[/size][/color]
已创建一个将头盔与特定护甲躯干匹配的系统。其工作方式是通过一个数组(ArmorHelmetMatches),该数组包含 2 个整数(ArmorMatchId, HelmetMatchId)。您将 ArmorMatchId 设置为想要影响的躯干 ID,并将 HelmetMatchId 设置为想要使用的头盔 ID。当部署到任何需要头盔/呼吸面罩的关卡时,系统将自动装备匹配的头盔。

要启用,请向您的模组添加一个 configdelta 文件并输入以下内容:

[BioGame.ini SFXGame.SFXGameConfig]
+ArmorHelmetMatches=(ArmorMatchId=0,HelmetMatchId=4)

在此示例中,如果您穿着 ID 为 0 的躯干护甲,系统将自动装备 ID 为 4 的头盔。

这对于您作为模组作者想要为特定护甲搭配特定头盔非常有用。

如果加载到需要呼吸面罩的关卡,此系统将覆盖玩家的头盔选择。

如果加载的关卡不需要头盔,此系统不会覆盖玩家的头盔选择,而是使用玩家的选择。

此系统通过此模组进行布尔门控,如果此模组被移除或禁用,则会停用。

[color=#00ffff][size=4]移除摄像机抖动 合并配置化[/size][/color]
编辑摄像机抖动功能,允许禁用大多数非过场动画(kismet)摄像机抖动。

要启用,请向您的模组添加一个 configdelta 文件并输入以下内容:

[BioGame.ini SFXGame.SFXGameConfig]
bN7ScreenNoShake=true

[color=#00ffff][size=4]角色视线范围 合并配置化[/size][/color]
编辑角色(Pawn)的视线变量,使其可通过 Coalesced 配置。

要启用,请向您的模组添加一个 configdelta 文件并输入以下内容:

[BioGame.ini SFXGame.BioPawn]
SightRadius=5000.0

视线半径可以调整。

[color=#00ffff][size=4]曳光弹速度 合并配置化[/size][/color]
编辑曳光弹速度功能,允许通过 Coalesced 全局配置曳光弹速度。

要启用,请向您的模组添加一个 configdelta 文件并输入以下内容:

[BioGame.ini SFXGame.SFXGameConfig]
bTracerspeedGatePear=true
fTracerspeedPear=25000.0

该布尔值开启更改,速度可以调整。

[color=#00ffff][size=4]从 Startup_CER_02 中移除 Mantis 和 Incisor[/size][/color]
Mantis 和 Incisor 的数据包含在 Startup_CER_02 的 loc 文件中。这使得覆盖任何这些数据变得困难。
此新实现会剥离所有 Startup_CER_02_loc 文件中与 Mantis 和 Incisor 相关的数据,同时保留其中的 SFXGameEffect_Gear 数据,从而使 Mantis 和 Incisor 的数据能够被轻松覆盖。
它还向此模组添加了包含所需数据的 SFXWeapon_IncisorSniperRifle_02 文件。

[color=#00ffff][size=4]启用本地头盔无线电滤波器[/size][/color]
增加了使 BioPawn 或 SFXPawn_Henchman 使用头盔无线电 RTPC 滤波器的能力。要启用,请在 BioPawn/SFXPawn_Henchman 上设置以下布尔值为 true:

bCanSwim=true

为什么用 bCanSwim?因为您无法在不导致崩溃的情况下向 BioPawn 或其子类添加变量。这个变量已经在 BioPawn 中,且在其他地方没有使用,因此被此模组“借用”了。

特别感谢 Beccatoria 在这方面的帮助。

[color=#00ffff][size=4]禁用全局头盔无线电滤波器[/size][/color]
增加了阻止薛帕德、队友和其他本地 BioPawn 在使用呼吸面罩头盔时使用头盔滤波器的能力。这将覆盖之前为特定 BioPawn 或队友启用头盔过滤器的能力。

要启用,请向您的模组添加一个 configdelta 文件并输入以下内容:

[BioGame.ini SFXGame.SFXGameConfig]
bStopHelmetFilter=true

有些角色台词内置了此效果,不会通过此方法更改。

[color=#00ffff][size=4]停止尸体清理[/size][/color]
编辑 SFXGame 和 Engine 中的函数,以阻止游戏在战斗中清理尸体。更换关卡或进行过场对话时,尸体仍会被清理。

要启用,请向您的模组添加一个 configdelta 文件并输入以下内容:

[BioGame.ini Engine.Admin]
bCorpseNoClean=true

[BioGame.ini SFXGame.SFXGameConfig]
bCorpseNoClean=true

这可能会影响您的帧率。

[color=#00ffff][size=4]技能使用配置[/size][/color]
此实现是为 ECM 制作的。您也可以随意使用。

这是对 SFXGame 中 BioPowerScript.ShouldUsePowerOnShields 函数的脚本更改。此更改有 2 个新增点:
bShouldUsePowerAlways,始终使技能可以选择用于目标,无论其是否有护盾。
bShouldUsePowerSmart,使用一个 if 树来智能选择技能是否应对有护盾的敌人可用。

函数:
[spoiler]
public function bool ShouldUsePowerOnShields(BioPawn Target, Class<SFXDamageType> DamageType, out string sOptionalInfo)
{
local SFXShield_Base CurrentShields;

if (Class'SFXGameConfig'.default.bShouldUsePowerAlways)
{
return TRUE;
}
if (Class'SFXGameConfig'.default.bShouldUsePowerSmart)
{
if (DamageType.default.Name == 'Default__SFXDamageType_Warp')
{
return TRUE;
}
if (DamageType.default.Name == 'Default__SFXDamageType_Shockwave')
{
return TRUE;
}
if (DamageType.default.Name == 'Default__SFXDamageType_Overload')
{
if (Target.PawnType.RaceType == ERaceType.RaceType_Machine)
{
return TRUE;
}
}
if (DamageType.default.Name == 'Default__SFXDamageType_NeuralShock')
{
if (Target.PawnType.RaceType == ERaceType.RaceType_Humanoid)
{
return TRUE;
}
if (Target.PawnType.RaceType == ERaceType.RaceType_Animal)
{
return TRUE;
}
else
{
sOptionalInfo = string(NotRecommended_TargetMachine);
return FALSE;
}
}
if (DamageType.default.Name == 'Default__SFXDamageType_Dominate')
{
if (Target.PawnType.RaceType == ERaceType.RaceType_Humanoid)
{
return TRUE;
}
if (Target.PawnType.RaceType == ERaceType.RaceType_Animal)
{
return TRUE;
}
else
{
sOptionalInfo = string(NotRecommended_TargetMachine);
return FALSE;
}
}
if (DamageType.default.Name == 'Default__SFXDamageType_Reave')
{
return TRUE;
}
if (DamageType.default.Name == 'Default__SFXDamageType_AIHacking')
{
if (Target.PawnType.RaceType == ERaceType.RaceType_Machine)
{
return TRUE;
}
else
{
sOptionalInfo = string(NotRecommended_TargetOrganic);
return FALSE;
}
}
if (DamageType.default.Name == 'Default__SFXDamageType_Crush')
{
return TRUE;
}
if (DamageType.default.Name == 'Default__SFXDamageType_CryoFreeze')
{
return TRUE;
}
if (DamageType.default.Name == 'Default__SFXDamageType_Pull')
{
return TRUE;
}
if (DamageType.default.Name == 'Default__SFXDamageType_ImprovedShieldJack')
{
if (Target.PawnType.RaceType == ERaceType.RaceType_Machine)
{
return TRUE;
}
}
if (DamageType.default.Name == 'Default__SFXDamageType_Throw')
{
return TRUE;
}
if (DamageType.default.Name == 'Default__SFXDamageType_ConcussiveShot')
{
return TRUE;
}
if (DamageType.default.Name == 'Default__SFXDamageType_ZaeedUnique')
{
return TRUE;
}
}
if (Target != None && Target.GetCurrentShields() > float(0))
{
CurrentShields = GetCurrentShields(Target);
if (CurrentShields == None)
{
return TRUE;
}
if (SFXShield_Energy(CurrentShields) != None)
{
if (DamageType.default.Resistance.Shield < 2.0)
{
sOptionalInfo = string(NotRecommended_TargetHasShields);
return FALSE;
}
}
else if (SFXShield_Biotic(CurrentShields) != None)
{
if (DamageType.default.Resistance.Biotic < 2.0)
{
sOptionalInfo = string(NotRecommended_TargetHasBiotics);
return FALSE;
}
}
else if (SFXShield_Armour(CurrentShields) != None)
{
if (DamageType.default.Resistance.Armour < 2.0)
{
sOptionalInfo = string(NotRecommended_TargetHasArmor);
return FALSE;
}
}
else
{
return FALSE;
}
}
return TRUE;
}
[/spoiler]

要启用,请向您的模组添加一个 configdelta 文件并输入以下内容:

[BioGame.ini SFXGame.SFXGameConfig]
bShouldUsePowerSmart=true ; 将使用智能系统
bShouldUsePowerAlways=true ; 将始终可选择,此选项如果设置为 true 将首先运行

为了让技能实际对护盾起作用,您仍然需要:

[BioGame.ini SFXGame.SFXGameConfig]
bShieldsBlockPowers=false

在您模组的 configdelta 文件中。

[color=#00ffff][size=4]抗性 合并配置化[/size][/color]
SFXDamageType 中的 Resistance 结构体变量现在可以通过 Coalesced 配置。这可以增加或减少武器和技能对不同护盾的伤害。它还可以通过将值提高到 2 或更高,使技能可以选择用于对抗护盾。

要启用,请向您的模组添加一个 configdelta 文件并输入以下内容:

[BioWeapon.ini SFXGameContent_Inventory.SFXDamageType_AssaultRifle]
Resistance=(Shield=1.25,Armour=1.25,Biotic=1.25) ; 原版伤害值,将它们上下移动以增加或减少对相应护盾造成的伤害

[BioWeapon.ini SFXGame.SFXDamageType_Incinerate]
Resistance=(Shield=2,Armour=2,Biotic=2) ; 这将使焚烧技能可以选择有护盾和屏障的目标。也会改变它们对护盾造成的伤害量

为了让技能实际对护盾起作用,您仍然需要:

[BioGame.ini SFXGame.SFXGameConfig]
bShieldsBlockPowers=false

在您模组的 configdelta 文件中。

[color=#00ff00][size=5]模组信息:[/size][/color]
挂载点:31997

[color=#00ff00][size=5]报告错误:[/size][/color]
请在“错误报告”部分报告错误。报告时,请上传您当前安装的日志文件。在上传日志之前,不要做任何更改。
[url=https://i.imgur.com/EU9H98d.gif]点击此处查看如何创建并发布错误日志链接。[/url]
可以在 ME3Tweaks 或 Mass Effect Modding 的 Discord 服务器上获得支持。
[url=https://discord.gg/s8HA6dc]点击此处访问 ME3Tweaks Discord[/url]
[url=https://discord.com/channels/384874253448642570/384886119621197834/862413054799773776]点击此处访问 Mass Effect Modding Discord[/url]