コード例 #1
0
def construct_partlist(passed_anointments):
    """
    Constructs the anointment partlist
    """
    parts = ["""(
            PartData=None,
            Weight=(
                BaseValueConstant=1,
                BaseValueAttribute=GbxAttributeData'"{}"',
                BaseValueScale=1
            )
        )""".format(anoint_parts[NONE])]
    for (part_obj, part_type) in passed_anointments:
        parts.append("""(
            PartData=InventoryGenericPartData'"{}"',
            Weight=(
                BaseValueConstant=1,
                BaseValueAttribute=GbxAttributeData'"{}"',
                BaseValueScale=1
            )
        )""".format(
            Mod.get_full_cond(part_obj),
            anoint_parts[part_type],
            ))
    return '({})'.format(','.join(parts))
コード例 #2
0
def patch_mayhem_level(level, mods):
    mod.reg_hotfix(
        Mod.PATCH, '', '/Game/PatchDLC/Mayhem2/OverrideModSet_Mayhem2',
        'PerLevelOverrides.PerLevelOverrides[{}].RandomModifierSlotsOverride'.
        format(level), '({})'.format(','.join([
            Mod.get_full_cond(mod, 'MayhemModifierSlotDataAsset')
            for mod in mods
        ])))
コード例 #3
0
 def to_hotfix(self, mod):
     return """(
         (RewardCustomizations=({})),
         (RewardWeaponTrinkets=({})),
         (RewardItemPool={}),
         (RewardCustomizations=({})),
         (RewardItemPool={})
     )""".format(
         mod.get_full_cond(self.echo, 'ECHOThemeCustomizationData'),
         mod.get_full_cond(self.trinket, 'BP_BaseWeaponTrinketData_C'),
         Mod.get_full_cond(
             '/Game/PatchDLC/EventVDay/GameData/Challenges/ChallengeRewards/ItemPool_VDay_Weapon_PolyAim',
             'ItemPoolData'),
         ','.join([
             mod.get_full_cond(s, 'OakCustomizationData')
             for s in self.skins
         ]),
         Mod.get_full_cond(
             '/Game/PatchDLC/EventVDay/GameData/Challenges/ChallengeRewards/ItemPool_VDay_Weapon_WeddingInvitation',
             'ItemPoolData'),
     )
コード例 #4
0
def set_pool(mod, pool_to_set, balances, char=None):

    parts = []
    for bal in balances:
        if type(bal) is tuple:
            (bal1, bal2) = bal
        else:
            bal1 = bal
            bal2 = bal
        part = '(InventoryBalanceData={},ResolvedInventoryBalanceData={},Weight=(BaseValueConstant=1))'.format(
            Mod.get_full_cond(bal1),
            Mod.get_full_cond(bal2, 'InventoryBalanceData'),
        )
        parts.append(part)
    if char is None:
        hf_subtype = Mod.PATCH
        hf_pkg = ''
    else:
        hf_subtype = Mod.CHAR
        hf_pkg = char
    mod.reg_hotfix(hf_subtype, hf_pkg, pool_to_set, 'BalancedItems',
                   '({})'.format(','.join(parts)))
コード例 #5
0
def charge_time(mod,
        obj_name,
        new_val,
        final_attr='ChargeTime',
        prev_val=None,
        aspect_list=1,
        aspect_obj='AspectList_WeaponUseModeSecondaryAspectData',
        aspect_attr='Component_BPWeaponChargeComponent_MAL',
        ):
    if prev_val is None:
        prev_val = ''
    else:
        prev_val = '(BaseValue={:.6f})'.format(prev_val)
    mod.reg_hotfix(Mod.PATCH, '',
            '{}:{}.{}'.format(Mod.get_full_cond(obj_name), aspect_obj, aspect_attr),
            'AspectList.AspectList[{}].Object..Component.Object..{}'.format(aspect_list, final_attr),
            '(BaseValue={:.6f})'.format(new_val),
            prev_val=prev_val)
コード例 #6
0
        "",
        "This doesn't touch *specific* enemy drops, such as Gideon and The",
        "Procurer from DLC2, who drop from the same pool ordinarily used for DLC2",
        "legendary world drops.",
        "",
        "This is intended to be used alongside my Expanded Legendary Pools mod,",
        "so you've got interesting stuff dropping most of the time.",
    ],
    lic=Mod.CC_BY_SA_40,
    v='1.3.0',
    cats='loot-system, enemy-drops, chests',
)

# Pools that we're redirecting stuff to
leg_pool_guns = Mod.get_full_cond(
    '/Game/GameData/Loot/ItemPools/Guns/ItemPool_Guns_Legendary',
    'ItemPoolData')
leg_pool_shields = Mod.get_full_cond(
    '/Game/GameData/Loot/ItemPools/Shields/ItemPool_Shields_05_Legendary',
    'ItemPoolData')
leg_pool_coms = Mod.get_full_cond(
    '/Game/Gear/ClassMods/_Design/ItemPools/ItemPool_ClassMods_05_Legendary',
    'ItemPoolData')
leg_pool_artifacts = Mod.get_full_cond(
    '/Game/Gear/Artifacts/_Design/ItemPools/ItemPool_Artifacts_05_Legendary',
    'ItemPoolData')
leg_pool_grenades = Mod.get_full_cond(
    '/Game/GameData/Loot/ItemPools/GrenadeMods/ItemPool_GrenadeMods_05_Legendary',
    'ItemPoolData')

# Individual wepon type pools
コード例 #7
0
ファイル: ixoraspawners.py プロジェクト: Rfleener84/bl3mods
def make_ixora_spawns():
    done_so = set()
    for entry in raw_ixora_spawn_list:
        row,factory,idx,pools = entry
        so = row
        # 'Options.Options[{}].Factory.Object..AIActorClass'.format(rev(c,idx))
        pool = "all"
        if params["heavy"]:
            pool = "heavy"
        elif len(pools) > 0:
            pool = random.choice(pools)
        mod.comment(f"From Pool: {pool}")
        mob = random.choice(difficulty_pools[pool])
        bpchar = mob[BPCHAR]
        mod.comment(f"so:{row} factory:{factory} bpchar:{bpchar}")
        mod.reg_hotfix(Mod.EARLYLEVEL,
                       IXORA_MAP,
                       row,
                       f'Options.Options[{idx}].Factory.Object..AIActorClass',
                       f"BlueprintGeneratedClass'{bpchar}.{get_bpchar(bpchar)}_C'",
        )
        extend = params["extend"]
        scale = 1.0
        if not so in done_so:
            mod.reg_hotfix(DFL_LEVEL, IXORA_MAP, Mod.get_full(so),
                       'Options.Options[{}].Factory.Object..SpawnExtent'.format(idx),
                       f'(X={scale * float(extend[0])},Y={scale * float(extend[1])},Z={scale * float(extend[2])})')
            mod.reg_hotfix(DFL_LEVEL, IXORA_MAP, Mod.get_full(so),
                       'Options.Options[{}].Factory.Object..SpawnExtent'.format(idx),
                       f'(x={scale * float(extend[0])},y={scale * float(extend[1])},z={scale * float(extend[2])})')
            mod.reg_hotfix(DFL_LEVEL, IXORA_MAP, Mod.get_full(so),
                       'Options.Options[{}].Factory.Object..UINameOverride'.format(idx),
                       'None')
            mod.reg_hotfix(DFL_LEVEL, IXORA_MAP, Mod.get_full(so),
                       'Options.Options[{}].Factory.Object..SpawnOrigin'.format(idx),
                        params["SpawnOrigin"])
            # We used AlwaysSpawn and it didn't necessarily work
            mod.reg_hotfix(DFL_LEVEL, IXORA_MAP, Mod.get_full(so),
                       'Options.Options[{}].Factory.Object..CollisionHandling'.format(idx),
                       params["collision"])
            mod.reg_hotfix(DFL_LEVEL, IXORA_MAP, Mod.get_full(so),
                       'Options.Options[{}].Factory.Object..bOverrideCollisionHandling'.format(idx),
                       'True')
            mod.reg_hotfix(DFL_LEVEL, IXORA_MAP, Mod.get_full(so),
                       'Options.Options[{}].Factory.Object..ItemPoolToDropOnDeathAdditive'.format(idx),
                       'True')
            mod.reg_hotfix(DFL_LEVEL, IXORA_MAP, Mod.get_full(so),
                       'Options.Options[{}].Factory.Object..bUseActorProperties'.format(idx),
                           params["UseActorProperties"])
            mod.reg_hotfix(DFL_LEVEL, IXORA_MAP, Mod.get_full(so),
                       'Options.Options[{}].Factory.Object..SpawnDetails'.format(idx),
                       '(Critical=AlwaysSpawn,bOverrideCritical=True)') # added this
            # AdjustIfPossibleButAlwaysSpawn
            mod.reg_hotfix(DFL_LEVEL, IXORA_MAP, '{}:{}'.format(Mod.get_full(so),bpchar), 'TeamOverride', Mod.get_full_cond('/Game/Common/_Design/Teams/Team_Maliwan', 'Team'))
    
        done_so.add(so)
コード例 #8
0
        "not in here yet.",
        "",
        "NOTE: this'll probably never actually be a standalone mod; if I figure",
        "out other unlocks in the future, I'm likely to just fold it into",
        "Early Bloomer, as I did with the Resonator.",
    ],
    lic=Mod.CC_BY_SA_40,
)

mod.comment('Always allow Resonator (included in Early Bloomer v1.1.0+)')

mod.reg_hotfix(
    Mod.PATCH, '', '/Game/Gear/Game/Resonator/_Design/MeleeData_Resonator',
    'OverrideCondition.Object..Conditions', '({},{})'.format(
        mod.get_full_cond(
            '/Game/Gear/Game/Resonator/_Design/MeleeData_Resonator.MeleeData_Resonator:OverrideCondition_GbxCondition_List.Conditions_Condition_CompareDistance',
            'Condition_CompareDistance_C'),
        mod.get_full_cond(
            '/Game/Gear/Game/Resonator/_Design/MeleeData_Resonator.MeleeData_Resonator:OverrideCondition_GbxCondition_List.Conditions_Condition_CanUseResonator',
            'Condition_CanUseResonator_C'),
    ))

mod.newline()

# Tried doing a bit of this, but the subobject creation didn't work, and I suspect
# that there's some stuff in the ubergraph/blueprint anyway
#mod.comment('Analyzer')
#
#mod.reg_hotfix(Mod.EARLYLEVEL, 'MatchAll',
#        '/Game/InteractiveObjects/EridianWriting/IO_EridianWriting.IO_EridianWriting_C:Usable_GEN_VARIABLE',
#        'EnabledCondition',
コード例 #9
0
    '/Game/GameData/Loot/ItemPools/Guns/Pistols/ItemPool_Pistols_Legendary',
    SG:
    '/Game/GameData/Loot/ItemPools/Guns/Shotguns/ItemPool_Shotguns_Legendary',
    SM: '/Game/GameData/Loot/ItemPools/Guns/SMG/ItemPool_SMGs_Legendary',
    SR:
    '/Game/GameData/Loot/ItemPools/Guns/SniperRifles/ItemPool_SnipeRifles_Legendary',
    SH: '/Game/GameData/Loot/ItemPools/Shields/ItemPool_Shields_05_Legendary',
    GM:
    '/Game/GameData/Loot/ItemPools/GrenadeMods/ItemPool_GrenadeMods_05_Legendary',
    CM:
    '/Game/Gear/ClassMods/_Design/ItemPools/ItemPool_ClassMods_05_Legendary',
    AF:
    '/Game/Gear/Artifacts/_Design/ItemPools/ItemPool_Artifacts_05_Legendary',
}
for drop_type in leg_pools.keys():
    leg_pools[drop_type] = Mod.get_full_cond(leg_pools[drop_type],
                                             'ItemPoolData')

# Here we go!
for (label, char_name, pools) in sorted([
    ('Amach', 'BPChar_ZealotPilfer_Child_Rare', [
        ('/Game/PatchDLC/Hibiscus/GameData/Loot/UniqueEnemyDrops/ItemPool_Hibiscus_UnseenThreat',
         [SR]),
    ]),
    ('Anathema the Relentless', 'BPChar_GuardianBruteMiniboss', [
        ('/Game/PatchDLC/Takedown2/GameData/Loot/ItemPool_TD2_Miniboss',
         [SH, SH, GM, None]),
        ('/Game/PatchDLC/Mayhem2/Gear/ItemPoolExpansion_Mayhem2/ItemPool_Mayhem2_Legendaries',
         [HW, SM, PS, SM, AR, HW, SG, SR]),
    ]),
    ('Anointed Alpha', 'BPChar_AnointedJoe', [
        ('/Game/Enemies/Enforcer/_Unique/AnointedJoe/_Design/ItemPools/ItemPool_AnointedJoe',
コード例 #10
0
        "Makes all Mayhem levels look identical in terms of difficulty-related",
        "scaling: 200% health/shield/armor scaling for enemies, and 2x Easy +",
        "1x Hard modifiers.",
        "",
        "Note that this and mayhem2_decreased_enemy_scaling both touch the same",
        "vars for enemy scaling, so they'll conflict (whichever is used 'last'",
        "will take precedence).",
    ],
    lic=Mod.CC_BY_SA_40,
    v='1.1.1',
    cats='mayhem, cheat',
)

enemy_scale = 2
modifiers = '({})'.format(','.join([
    Mod.get_full_cond(m, 'MayhemModifierSlotDataAsset') for m in [
        '/Game/PatchDLC/Mayhem2/ModifierSets/ModSet_Mayhem2_Easy',
        '/Game/PatchDLC/Mayhem2/ModifierSets/ModSet_Mayhem2_Easy',
        '/Game/PatchDLC/Mayhem2/ModifierSets/ModSet_Mayhem2_Hard',
    ]
]))

for mayhem_level_minus_one in range(11):
    mayhem_level = mayhem_level_minus_one + 1
    mod.comment('Mayhem {}'.format(mayhem_level))
    for col_name in [
            'HealthSimpleScalar_42_0499AACF43FDF39B7084E2BB63E4BF68',
            'ShieldSimpleScalar_43_417C36C54DA2550A4CABC7B26A5E24A8',
            'ArmorSimpleScalar_44_BCAAA445479831C25B0D55AF294A15D6',
    ]:
        mod.table_hotfix(
コード例 #11
0
            "pistols.",
        ],
        contact='https://apocalyptech.com/contact.php',
        lic=Mod.CC_BY_SA_40,
        v='1.0.0',
        cats='chests, cheat',
    )

    mod.comment('Update the chest LootDef')
    stanzas = []
    for (socket, pool) in attachments:
        stanzas.append("""(
                ItemPool=ItemPoolData'"{}"',
                AttachmentPointName={},
                Probability=(BaseValueConstant=1)
            )""".format(Mod.get_full_cond(pool), socket))
    # This does have to be EARLYLEVEL to work, btw.
    mod.reg_hotfix(
        Mod.EARLYLEVEL, 'Recruitment_P',
        '/Game/Missions/Plot/EP01_ChildrenOfTheVault/LootDef_Global_WhiteChest_ChildrenOfTheVault',
        'DefaultLoot.DefaultLoot[0].ItemAttachments',
        '({})'.format(','.join(stanzas)))
    mod.newline()

    # Also update the First Gun pool, if need be
    if set_gun:
        mod.comment('Update first-gun pool')

        mod.reg_hotfix(
            Mod.LEVEL, 'Recruitment_P',
            '/Game/GameData/Loot/ItemPools/Guns/Pistols/ItemPool_Pistols_FirstGun',
コード例 #12
0
ファイル: gen_all_anointed.py プロジェクト: itsPoipoi/bl3mods
            all_exports = data.get_data(obj_name)
            optiondata = data.get_exports(obj_name, 'SpawnOptionData')[0]

            for idx, option in enumerate(optiondata['Options']):
                export_idx = option['Factory']['export']
                factory = all_exports[export_idx - 1]
                if 'AIActorClass' in factory:
                    orig_class = factory['AIActorClass']['asset_path_name']
                    if orig_class not in anointeds:
                        if orig_class in anointed_mapping:
                            mod.reg_hotfix(
                                Mod.EARLYLEVEL,
                                level,
                                obj_name,
                                'Options.Options[{}].Factory.Object..AIActorClass'
                                .format(idx),
                                # Bit of a laugh here; turn everything into Wotan, instead.
                                #Mod.get_full_cond('/Game/PatchDLC/Raid1/Enemies/Behemoth/_Unique/RaidMiniBoss/_Design/Character/BPChar_BehemothRaid.BPChar_BehemothRaid_C', 'BlueprintGeneratedClass'))
                                Mod.get_full_cond(anointed_mapping[orig_class],
                                                  'BlueprintGeneratedClass'))
                        else:
                            print('Unknown class: {}'.format(orig_class))
                elif 'Options' in factory:
                    spawnoptions.add(factory['Options'][1])
                    added_more = True
                else:
                    raise Exception('bzort')

mod.close()
コード例 #13
0
    def move_to(self, mod, loc):
        """
        Moves ourselves to the specified `loc`, to the given `mod` modfile.
        Bit of bleedthrough here; this should maybe be in Location, though
        we're doing a few checks against our own location data, so it's easier
        to leave it in here.
        """

        # TODO: So one problem with this mod is that when you fast-travel into the
        # map from outside, you end up getting dumped into the original Fast Travel
        # spot first.  You can then do an in-map fast travel over to the real
        # station, at least, which is pretty quick.  I'm honestly not sure if there's
        # anything we can do about that at the moment -- I assume that the player's
        # location must be set real early on in the level-loading process, before
        # hotfixes have been processed.  I did try converting all these to EARLYLEVEL
        # instead, but that didn't change anything.  So yeah, might be something
        # that requires a hypothetical SDK.  Still, better than nothing!

        # Sub-objects we'll be touching
        sm_obj_name = f'{self.obj_name}.SkeletalMesh'
        aa_obj_name = f'{self.obj_name}.ActivationArea'
        res_obj_name = f'{self.obj_name}.OakTravelStationResurrectComponent'

        # Location
        mod.reg_hotfix(
            Mod.LEVEL,
            self.map_name,
            sm_obj_name,
            'RelativeLocation',
            f'(x={loc.x},y={loc.y},z={loc.z})',
            notify=True,
        )

        # Rotation
        mod.reg_hotfix(
            Mod.LEVEL,
            self.map_name,
            sm_obj_name,
            'RelativeRotation',
            f'(pitch={loc.pitch},yaw={loc.yaw},roll={loc.roll})',
            notify=True,
        )

        # Activation Location
        mod.reg_hotfix(
            Mod.LEVEL,
            self.map_name,
            aa_obj_name,
            'RelativeLocation',
            f'(x={loc.act_x},y={loc.act_y},z={loc.act_z})',
            notify=True,
        )

        # Detection Radius
        if self.has_min_radius and loc.radius < self.loc.radius:
            radius = self.loc.radius
        else:
            radius = loc.radius
        mod.reg_hotfix(
            Mod.LEVEL,
            self.map_name,
            aa_obj_name,
            'DetectionRadius',
            radius,
            notify=True,
        )

        # Detection halfheight, whatever that is.
        mod.reg_hotfix(
            Mod.LEVEL,
            self.map_name,
            aa_obj_name,
            'DetectionHalfHeight',
            loc.halfheight,
            notify=True,
        )

        # Resurrection Location
        mod.reg_hotfix(
            Mod.LEVEL,
            self.map_name,
            res_obj_name,
            'RelativeLocation',
            f'(x={loc.res_x},y={loc.res_y},z={loc.res_z})',
            notify=True,
        )

        # Activate on entering its area?  Only going to set this if it's
        # changing, since we expect it to be True
        if self.loc.activate_on_enter_area != loc.activate_on_enter_area:
            mod.reg_hotfix(
                Mod.LEVEL,
                self.map_name,
                res_obj_name,
                'bActivateOnEnterArea',
                loc.activate_on_enter_area,
                notify=True,
            )

        # Finally -- any Ubergraph references to update?
        if loc.ubergraph_ref is not None:
            obj_name, attr_name = loc.ubergraph_ref
            mod.reg_hotfix(Mod.LEVEL, self.map_name, obj_name, attr_name,
                           Mod.get_full_cond(self.obj_name, self.export_type))
コード例 #14
0
         0, None),
        ('Warden', 'BPChar_Goliath_CageArena',
         '/Game/PatchDLC/Mayhem2/Gear/ItemPoolExpansion_Mayhem2/ItemPoolExpansion_Mayhem2_HW_Legendary2',
         0, None),
        ('Anathema the Relentless', 'BPChar_GuardianBruteMiniboss',
         '/Game/PatchDLC/Takedown2/GameData/Loot/ItemPool_TD2_Miniboss', 3,
         None),
        ('Scourge the Invincible Martyr', 'BPChar_GuardianBruteBoss',
         '/Game/PatchDLC/Takedown2/GameData/Loot/ItemPool_TD2_Boss', 4, None),
    ]),
]:
    mod.header('Main Mayhem {} Unlocks'.format(mayhem_level))
    for char_name, char_obj, exp_obj, idx, att in sorted(data):
        mod.comment(char_name)
        if att:
            value = Mod.get_full_cond(att, 'GbxAttributeData')
        else:
            value = 'None'
        mod.reg_hotfix(
            Mod.CHAR, char_obj, exp_obj,
            'BalancedItems.BalancedItems[{}].Weight.BaseValueAttribute'.format(
                idx), value)
        mod.newline()

# Now update the itempool itself
mod.header('Maliwan Takedown Mayhem 4 Unlocks (Wotan / Valkyrie Squad)')

mod.comment('M4 Legendaries Pool')
for idx in range(11):
    for char_name in [
            'BPChar_BehemothRaid',
コード例 #15
0
    'Apocalyptech',
    [
        "Various Porta-Potties throughout The Droughts ordinarily only provide",
        "ammo/money and the like, without any gear attachments.  This mod fixes",
        "them up so that they act like any other porta-potty in the game.",
    ],
    lic=Mod.CC_BY_SA_40,
    v='1.0.0',
    cats='qol, maps',
    ss=[
        'https://raw.githubusercontent.com/BLCM/bl3mods/master/Apocalyptech/qol/droughts_stocked_porta_potties/screenshot.jpg'
    ],
)

lootdef = Mod.get_full_cond(
    '/Game/Lootables/_Design/Data/Industrial/LootDef_Industrial_PortaPotty',
    'LootableBalanceData')

for submap, index in [
    ('Dynamic', 61),
    ('Dynamic', 224),
    ('Dynamic', 740),
    ('Dynamic', 1044),
    ('Dynamic', 1844),
    ('Terrain', 0),
    ('Terrain', 61),
]:

    base_obj_name = f'/Game/Maps/Zone_0/Prologue/Prologue_{submap}.Prologue_{submap}:PersistentLevel.BPIO_Lootable_Industrial_PortaPotty_{index}'
    loot_obj_name = f'{base_obj_name}.Loot'
コード例 #16
0
        com_name,
        )

bits = []
for part, part_title in [
        ('/Game/PatchDLC/Ixora/Gear/ClassMods/_Design/OPE/L01/Part_CM_Ixora_OPE_L01',
            'NamePart_InventoryNamePartData'),
        ('/Game/PatchDLC/Ixora/Gear/ClassMods/_Design/OPE/PartSets/ClassMod_Part_Mod_Operative_Ixora_01',
            'NamePart_InventoryNamePartData_1'),
        ('/Game/PatchDLC/Ixora/Gear/ClassMods/_Design/OPE/Skills/CM_Part_Skill_OPE_DLCSkill_12',
            'NamePart_InventoryNamePartData_2'),
        ('/Game/PatchDLC/Ixora/Gear/ClassMods/_Design/OPE/L02/Part_CM_Ixora_OPE_L02',
            title),
        ]:
    if part_title.startswith('/'):
        title_ref = Mod.get_full_cond(part_title, 'InventoryNamePartData')
    else:
        title_ref = Mod.get_full_cond('{}:{}'.format(Mod.get_full_cond(name_ext), part_title), 'InventoryNamePartData')
    bits.append('(Part={},NamePart={})'.format(
        Mod.get_full_cond(part, 'BPInvPart_ClassMod_C'),
        title_ref,
        ))

mod.reg_hotfix(Mod.PATCH, '',
        name_ext,
        'SingleNames',
        '({})'.format(','.join(bits)),
        )

mod.newline()
コード例 #17
0
# the License, or (at your option) any later version.
#
# This Borderlands 3 Hotfix Mod is distributed in the hope that it will
# be useful, but WITHOUT ANY WARRANTY; without even the implied
# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this Borderlands 3 Hotfix Mod.  If not, see
# <https://www.gnu.org/licenses/>.

from bl3data.bl3data import BL3Data
from bl3hotfixmod.bl3hotfixmod import Mod

to_rarity = '/Game/GameData/Loot/RarityData/RarityData_05_Legendary'
to_rarity_full = Mod.get_full_cond(to_rarity, 'OakInventoryRarityData')

# I just blindly copied all these from my Expanded Legendary Pools and made some real slight
# additional omissions.  We use some data introspection to find out which of these we actually
# need to alter.  This way I don't have to actually *think* about which ones need processing.  :)
# Also didn't bother to put COMs and Artifacts in there, since there's no exceptions.
#
# Omitted:
# - Big Succ
# - Blue-rarity Redistributor
# - Kevin's Chilly
# - Portals and S***e
# - Fixed-part Baby Maker
# - Mission version of Love Drill
# - Email-reward version of Short Stick
# - The other three Seventh Sense variants
コード例 #18
0
from bl3hotfixmod.bl3hotfixmod import Mod, BVC

mod = Mod(
    'beef_plissken_loot_pattern_fix.bl3hotfix',
    'Beef Plissken Loot Pattern Fix',
    'Apocalyptech',
    [
        "Beef Plissken has a loot drop pattern which is custom-built for his in-story",
        "death sequence, which shoots the loot up onto the platform he just jumped from.",
        "When returning to the area later, though, you just kill Beef as usual, and that",
        "loot pattern has a tendency to shoot the loot off the edge of the map, making",
        "the loot unobtainable. This replaces Beef's drop pattern with the usual enemy",
        "drop pattern.  This ends up dropping his loot on top of the masher gears when",
        "going through the DLC6 story, but you can hop onto them without getting killed",
        "so the loot is still retrievable during the plot mission, too.",
    ],
    lic=Mod.CC_BY_SA_40,
    v='1.0.0',
    cats='qol, enemy, bugfix',
)

mod.reg_hotfix(
    Mod.CHAR, 'BPChar_Punk_BanditChief',
    '/Ixora2/Enemies/CotV/Punk/BanditChief/_Design/Character/BPChar_Punk_BanditChief.BPChar_Punk_BanditChief_C:AIBalanceState_GEN_VARIABLE',
    'DropLootPattern',
    Mod.get_full_cond(
        '/Game/GameData/Loot/SpawnPatterns/LootSpawnPattern_Enemy',
        'LootSpawnPatternData'))

mod.close()
コード例 #19
0
                        BaseValueConstant=1,
                        DataTableValue=(DataTable=None,RowName="",ValueName=""),
                        BaseValueAttribute=None,
                        AttributeInitializer=None,
                        BaseValueScale=1
                    ),
                    NumberOfTimesToSelectFromThisPool=(
                        BaseValueConstant={},
                        DataTableValue=(DataTable=None,RowName="",ValueName=""),
                        BaseValueAttribute=None,
                        AttributeInitializer=None,
                        BaseValueScale=1
                    )
                )
            )""".format(
            Mod.get_full_cond(pool_to_set, 'ItemPoolData'),
            drop_quantity,
        ))

# Since I'm doing it, may as well put in trash piles specifically
# NOTE: the quantity specified here doesn't actually seem to show up, in general -
# I suspect that some of the spawned gear might fall through the ground.
mod.reg_hotfix(
    Mod.LEVEL, 'MatchAll', '/Game/GameData/Loot/ItemPools/ItemPool_TrashPile',
    'BalancedItems', """(
            (
                ItemPoolData={},
                Quantity=(BaseValueConstant={})
            )
        )""".format(
        Mod.get_full_cond(pool_to_set, 'ItemPoolData'),
コード例 #20
0
        15)

    mod.table_hotfix(
        Mod.CHAR, boss,
        '/Game/PatchDLC/BloodyHarvest/Enemies/_Shared/_Design/Balance/Table_Balance_HarvestEnemies_PT2',
        'Boss_Normal',
        'HealthMultiplier_02_Secondary_12_9204082C4992E4200D005C8CBA622E49',
        30)
    mod.newline()

    mod.comment('Drop from Boss pool, instead of Miniboss')
    mod.reg_hotfix(
        Mod.CHAR, boss,
        '/Game/PatchDLC/BloodyHarvest/Enemies/Heavy/_Unique/HarvestBoss/_Design/Character/BPChar_HarvestBoss.BPChar_HarvestBoss_C:AIBalanceState_GEN_VARIABLE',
        'DropOnDeathItemPools.ItemPoolLists.ItemPoolLists[0]',
        mod.get_full_cond('/Game/GameData/Loot/ItemPools/ItemPoolList_Boss',
                          'ItemPoolListData'))
    mod.newline()

    mod.comment('Audio fixes')
    mod.reg_hotfix(
        Mod.CHAR,
        boss,
        '/Game/PatchDLC/BloodyHarvest/Enemies/Heavy/_Unique/HarvestBoss/_Design/Character/BPChar_HarvestBoss.BPChar_HarvestBoss_C:DefaultAudioComponent_GEN_VARIABLE',
        'EmitterGain',
        10,
        notify=True)

    mod.reg_hotfix(
        Mod.CHAR,
        boss,
        '/Game/PatchDLC/BloodyHarvest/Enemies/Heavy/_Unique/HarvestBoss/_Design/Character/BPChar_HarvestBoss.BPChar_HarvestBoss_C:DefaultAudioComponent_GEN_VARIABLE',
コード例 #21
0
        '/Game/PatchDLC/BloodyHarvest/GameData/FastTravel',
        '/Game/PatchDLC/Raid1/GameData/FastTravel',
        '/Game/PatchDLC/Dandelion/GameData/FastTravel',
        '/Game/PatchDLC/Hibiscus/GameData/FastTravel',
        '/Game/PatchDLC/Event2/GameData/FastTravel',
        '/Game/PatchDLC/Takedown2/GameData/LevelTravel',
        '/Game/PatchDLC/Geranium/GameData/FastTravel',
        '/Game/PatchDLC/Alisma/GameData/FastTravel',
]:
    for prefix in ['FTS_', 'RTS_', 'LTS_']:
        object_names.extend(list(data.find(base_path, prefix)))

# Construct the mapping
fts_mapping = {}
for object_name in object_names:
    object_name_full = Mod.get_full_cond(object_name).lower()
    obj = data.get_data(object_name)
    for exp in obj:
        if 'StationMapName' in exp:
            last_map_bit = exp['StationMapName'].split('/')[-1]
            fts_mapping[object_name_full] = last_map_bit
            break

# Now output as a Python dict
with open(output_file, 'w') as df:
    print('', file=df)
    print(
        '# Autogenerated by gen_fts_mappings.py, in my bl3hotfixmodding project (in dataprocessing)',
        file=df)
    print('', file=df)
    print('fts_to_map = {', file=df)
コード例 #22
0
eridium_obj = '/Game/Pickups/Eridium/InvBal_Eridium_Stack'
mod.reg_hotfix(Mod.LEVEL, 'Trashtown_P',
        '/Dandelion/Missions/Side/HeartOfGold/ItemPool_Money_HeartOfGold',
        'BalancedItems',
        """(
            (
                InventoryBalanceData={},
                ResolvedInventoryBalanceData={},
                Weight=(BaseValueConstant=1)
            ),
            (
                InventoryBalanceData={},
                ResolvedInventoryBalanceData={},
                Weight=(BaseValueConstant=0.5)
            )
        )""".format(
            money_obj, Mod.get_full_cond(money_obj, 'InventoryBalanceData'),
            eridium_obj, Mod.get_full_cond(eridium_obj, 'InventoryBalanceData'),
            ))
mod.newline()

# Default value: 10.
mod.comment('Increase quantity')
mod.reg_hotfix(Mod.LEVEL, 'Trashtown_P',
        '/Dandelion/Missions/Side/HeartOfGold/ItemPool_Money_HeartOfGold',
        'Quantity.BaseValueConstant',
        40)
mod.newline()

mod.close()
コード例 #23
0
    AF:
    '/Game/Gear/Artifacts/_Design/ItemPools/ItemPool_Artifacts_05_Legendary',

    # If we were going to randomize customizations (as we were doing for awhile), we'd use
    # these.  These types are now blacklisted, though.
    SK:
    '/Game/Pickups/Customizations/_Design/ItemPools/Skins/ItemPool_Customizations_Skins_Loot',
    HD:
    '/Game/Pickups/Customizations/_Design/ItemPools/Heads/ItemPool_Customizations_Heads_Loot',
    TK:
    '/Game/Gear/WeaponTrinkets/_Design/ItemPools/ItemPool_Customizations_WeaponTrinkets_Loot',
    RD:
    '/Game/Pickups/Customizations/_Design/ItemPools/PlayerRoomDeco/ItemPool_Customizations_RoomDeco_Loot',
}
for drop_type in leg_pools.keys():
    leg_pools[drop_type] = Mod.get_full_cond(leg_pools[drop_type],
                                             'ItemPoolData')

for (mission_obj, drop_type) in [
        # This list generated by mission_rewards.py in my dataprocessing dir
        # Would be nice to have mission names in here, but the JWP serializations we rely on
        # for the data doesn't manage to serialize the name
        #
        # Mission_Scoopers_Bully (Dump on Dumptruck) used to show up as having a Pistol reward,
        # but as of 2021-04-08, mission_rewards.py doesn't report on it.  Looking at the data
        # seems to confirm?  Leaving it in here anyway, but could maybe use some investigation.
    ('/Game/Missions/Plot/Mission_Ep01_ChildrenOfTheVault.Default__Mission_Ep01_ChildrenOfTheVault_C:RewardData_OakMissionRewardData',
     GM),
    ('/Game/Missions/Plot/Mission_Ep02_Sacrifice.Default__Mission_Ep02_Sacrifice_C:RewardData_OakMissionRewardData',
     SK),
    ('/Game/Missions/Plot/Mission_Ep03_GetVaultMap.Default__Mission_Ep03_GetVaultMap_C:RewardData_OakMissionRewardData',
     HD),
コード例 #24
0
# spot, but aren't actually clickable until you get to their new tier.  So, a bit weird all around.
if False:

    # Was just trying this out to see if it happens to make the skills work totally properly after being
    # moved.  Spoiler: it did not, so reverted back to the default notify, which is False
    notify = False

    # Swap Root To Rise (tier 1) with One With Nature (tier 4)
    if False:
        # Setting just a single element in `Items`
        mod.reg_hotfix(
            Mod.PATCH,
            '',
            '/Game/PlayerCharacters/SirenBrawler/_Shared/_Design/Character/Inventory/AbilityTree_Siren_Brawl',
            'Tiers.Tiers[1].Object..Items.Items[0]',
            Mod.get_full_cond(one_with_nature,
                              'OakPlayerAbilityTreeItemData_Ability'),
            notify=notify)

        mod.reg_hotfix(
            Mod.PATCH,
            '',
            '/Game/PlayerCharacters/SirenBrawler/_Shared/_Design/Character/Inventory/AbilityTree_Siren_Brawl',
            'Tiers.Tiers[4].Object..Items.Items[0]',
            Mod.get_full_cond(root_to_rise,
                              'OakPlayerAbilityTreeItemData_Ability'),
            notify=notify)
    if True:
        # Setting the entire `Items` array
        mod.reg_hotfix(
            Mod.PATCH,
            '',