Ejemplo n.º 1
0
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)
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))
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
        ])))
Ejemplo n.º 4
0
def mod_header(output_filename, colour="green"):
    mod = Mod(
        output_filename,
        f'Arm\'s Race Starter Chest: {colour}',
        'skruntskrunt',
        [f"Makes the Arm's Race Starter Chest items of {colour} colour"],
        lic=Mod.CC_BY_SA_40,
        v=version,
        cats=['gameplay', 'armsrace'],  # fix this
    )
    return mod
Ejemplo n.º 5
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'),
     )
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)))
Ejemplo n.º 7
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)
Ejemplo n.º 8
0
import sys

sys.path.append('../../../python_mod_helpers')
from bl3hotfixmod.bl3hotfixmod import Mod

mod = Mod(
    'super_buff_craders_emp5.bl3hotfix',
    "Super Buff: Crader's EM-P5",
    'Apocalyptech',
    [
        "Vastly buffs Crader's EM-P5's damage, makes it not consume any ammo,",
        "gives it perfect accuracy+handling (though the in-game Handling stat",
        "won't say 100%), and improves its already-good fire rate",
        "",
        "Used by myself primarily just for mod testing purposes, for when I",
        "don't want to be bothered by actual combat.",
        "",
        "This mod also prevents x2 Grips from spawning on new EM-P5s, though",
        "the zero-ammo-consumption should work regardless of that part.",
    ],
    contact='https://apocalyptech.com/contact.php',
    lic=Mod.CC_BY_SA_40,
    v='1.0.1',
    cats='cheat, gear-smg',
)

# The default Crader's barrel doesn't have *any* InventoryAttributeEffects, so these
# are all new.  Note that I'm not really sure which of these are *actually* providing
# what benefits; just basically throwing everything that seemed likely at it.  Could
# maybe have tried some more OverrideBaseValue instead of ScaleSimple, too...
attr_effects = []
Ejemplo n.º 9
0
# along with this Borderlands 3 Hotfix Mod.  If not, see
# <https://www.gnu.org/licenses/>.

import sys

sys.path.append('../../../python_mod_helpers')
from bl3hotfixmod.bl3hotfixmod import Mod

mod = Mod(
    'super_buff_transformer.bl3hotfix',
    "Super Buff: Transformer",
    'Apocalyptech',
    [
        "Vastly buffs The Transformer, making you basically invulnerable",
        "when wearing it.",
        "",
        "Used by myself primarily just for mod testing purposes, for when I",
        "don't want to be bothered by actual combat.",
    ],
    lic=Mod.CC_BY_SA_40,
    v='1.0.0',
    cats='cheat, gear-shield',
)

attr_effects = []
for (attr, mod_type, mod_val) in [

        # Stock values
    ('/Game/Gear/Shields/_Design/Naming/Att_Shield_IgnoreManufacturerName',
     'OverrideBaseValue', 1),
    ('/Game/Gear/Shields/_Design/Balance/Attributes/Att_ShieldBalance_ElementalResistance',
Ejemplo n.º 10
0
#
# 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 bl3hotfixmod.bl3hotfixmod import Mod, BVC

mod = Mod('Bonus_Boss_Loot.txt',
        'restore Bonus Boss Loot mini event',
        'altef_4',
        [
            "Bonus Boss Loot mini Event",
        ],
        lic=Mod.CC_BY_SA_40,
        )

mod.reg_hotfix(Mod.EARLYLEVEL, 'GuardianTakedown_P',
		'/Game/PatchDLC/Takedown2/Maps/GuardianTakedown_Combat.GuardianTakedown_Combat:PersistentLevel.OakMissionSpawner_88.SpawnerComponent.SpawnerStyle_SpawnerStyle_Encounter.SpawnerStyle_SpawnerStyle_Den',
        'NumActorsParam.AttributeInitializationData.AttributeInitializer',
        "BlueprintGeneratedClass'/Game/GameData/Balance/PlayerCountFormulas/PCF_Add2In2PlayerAnd3In4Player.PCF_Add2In2PlayerAnd3In4Player_C'")

	
	
mod.reg_hotfix(Mod.CHAR, 'BPChar_GuardianSpectreTD2',
		'/Game/PatchDLC/Takedown2/Enemies/Guardians/_Shared/_Design/Balance/Table_Balance_GuardianTD2.Table_Balance_GuardianTD2',
        'HealthMultiplier_02_Secondary_12_9204082C4992E4200D005C8CBA622E49',
        "8")		
Ejemplo n.º 11
0
def save_mod(save_filename):
    """
    Save out a mod file.  This actually relies on an awful lot of global variables.
    Apologies.
    """
    mod = Mod(save_filename,
            'Arbitrary Partlocks: {}'.format(bal_last),
            'Apocalyptech',
            [
                'Auto-generated partlocks, chosen with an interactive CLI app.',
            ],
            lic=Mod.CC_BY_SA_40,
            )

    for cat_idx, cat_actions in enumerate(actions):
        cur_cat = categories[cat_idx]
        always_vals = set()
        never_vals = set()
        for action in cat_actions.values():
            if action.action == Action.ALWAYS:
                always_vals.add(action.list_idx)
            else:
                never_vals.add(action.list_idx)

        # Now, loop through each category and assign new weights
        if len(always_vals) > 0 or len(never_vals) > 0:
            if cat_idx == 0:

                # We could try to generalize, but whatever.  Just process anoints separately
                cur_idx = 0
                if cur_cat.cat.partlist:
                    cur_source = cur_cat.cat.partlist[0].anoint_source
                for num, part in enumerate(cur_cat.cat.partlist):

                    # Reset our array index if needed
                    if part.anoint_source != cur_source:
                        cur_idx = 0
                        cur_source = part.anoint_source

                    # If we have any "always" entries, we effectively assume everything else
                    # is a "never", so we process a bit differently
                    if len(always_vals) > 0:
                        if num not in always_vals:
                            never_vals.add(num)

                    # Now write out
                    if part.anoint_source != balance_name:
                        extra_txt = ' (affects anything using this anoint)'
                        attr_ref = 'GenericParts.Parts'
                    else:
                        extra_txt = ''
                        attr_ref = 'RuntimeGenericPartList.PartList'
                    if num in always_vals:
                        mod.comment('Anointments: Always choose {}{}'.format(part.short_name, extra_txt))
                        mod.reg_hotfix(Mod.PATCH, '',
                                part.anoint_source,
                                '{}[{}].Weight'.format(attr_ref, cur_idx),
                                BVCF(bvc=1))
                        mod.newline()
                    elif num in never_vals:
                        mod.comment('Anointments: Never choose {}{}'.format(part.short_name, extra_txt))
                        mod.reg_hotfix(Mod.PATCH, '',
                                part.anoint_source,
                                '{}[{}].Weight'.format(attr_ref, cur_idx),
                                BVCF(bvc=0))
                        mod.newline()

                    # Increment our index
                    cur_idx += 1

            else:

                # Make sure this is set to use weights
                if not cur_cat.cat.use_weight_with_mult:
                    mod.comment('Category {}: Enable weight-based part picking'.format(cat_idx))
                    mod.reg_hotfix(Mod.PATCH, '',
                            balance.partset_name,
                            'ActorPartLists.ActorPartLists[{}].bUseWeightWithMultiplePartSelection'.format(cat_idx-1),
                            'True')
                    mod.newline()

                # Regular parts
                # TODO: If we ever get GPartExpansion objects which do more than add expansions,
                # well have to support it here, too.
                cur_idx = cur_cat.start_part_idx
                for num, part in enumerate(cur_cat.cat.partlist):

                    # If we have any "always" entries, we effectively assume everything else
                    # is a "never", so we process a bit differently
                    if len(always_vals) > 0:
                        if num not in always_vals:
                            never_vals.add(num)

                    # Now write out
                    if num in always_vals:
                        mod.comment('Category {}: Always choose {}'.format(cat_idx, part.short_name))
                        mod.reg_hotfix(Mod.PATCH, '',
                                balance_name,
                                'RuntimePartList.AllParts[{}].Weight'.format(cur_idx),
                                BVCF(bvc=1))
                        mod.newline()
                    elif num in never_vals:
                        mod.comment('Category {}: Never choose {}'.format(cat_idx, part.short_name))
                        mod.reg_hotfix(Mod.PATCH, '',
                                balance_name,
                                'RuntimePartList.AllParts[{}].Weight'.format(cur_idx),
                                BVCF(bvc=0))
                        mod.newline()

                    # Increment index
                    cur_idx += 1

    print('')
    print(color_success + '='*80)
    mod.close()
    print(color_success + '='*80)
    print(color_reset)
    input('Hit Enter to Continue...')
    print('')
Ejemplo n.º 12
0
for label, scale, extra in [
    ('BL1', 1.045, ' (approximately; BL1 scaling is a bit weird)'),
    ('BL2', 1.13, ''),
    ('TPS', 1.1, ''),
]:

    full_filename = 'alternate_scaling_{}.bl3hotfix'.format(label.lower())
    mod = Mod(
        full_filename,
        'Alternate Scaling: {}'.format(label),
        'Apocalyptech',
        [
            "Updates the universal scaling constant from BL3's default of 1.09 to match",
            "{}'s {}{}".format(label, scale, extra),
            "",
            "(NOTE: These scaling vars don't play intuitively with Mayhem levels.  Anything",
            "above the default 1.09 will end up making the game quite a bit easier in higher",
            "Mayhem levels, so you'd actually want to *reduce* the scaling to make Mayhem",
            "harder.)",
        ],
        lic=Mod.CC_BY_SA_40,
        v='1.0.0',
        cats='scaling',
    )

    mod.reg_hotfix(
        Mod.PATCH, '',
        '/Game/GameData/Balance/HealthAndDamage/Att_UniversalBalanceScaler.Att_UniversalBalanceScaler:BP_ConstantValueResolver_C_0',
        'Value', BVC(bvc=scale))

    mod.close()
Ejemplo n.º 13
0
from bl3hotfixmod.bl3hotfixmod import Mod, BVC, Balance

mod = Mod(
    'world_drop_designers_cut_coms.bl3hotfix',
    'World Drop Designer\'s Cut COMs',
    'Apocalyptech',
    [
        "Adds in the white/green/blue/purple COMs available in the Designer's",
        "Cut DLC (DLC5/Ixora) data to the main world drop pools.  These COMs",
        "are available in the DLC5 game data but aren't actually available to",
        "drop anywhere ordinarily, for some reason.",
        "",
        "The COM names:",
        "",
        "    Beastmaster: Hellhound",
        "    Gunner: Guzzler",
        "    Operative: Bulldog",
        "    Siren: Ascetic",
    ],
    contact='https://apocalyptech.com/contact.php',
    lic=Mod.CC_BY_SA_40,
    v='1.0.0',
    cats='gear-com',
    ss=[
        'https://raw.githubusercontent.com/BLCM/bl3mods/master/Apocalyptech/loot_changes/world_drop_designers_cut_coms/com_beastmaster.png',
        'https://raw.githubusercontent.com/BLCM/bl3mods/master/Apocalyptech/loot_changes/world_drop_designers_cut_coms/com_gunner.png',
        'https://raw.githubusercontent.com/BLCM/bl3mods/master/Apocalyptech/loot_changes/world_drop_designers_cut_coms/com_operative.png',
        'https://raw.githubusercontent.com/BLCM/bl3mods/master/Apocalyptech/loot_changes/world_drop_designers_cut_coms/com_siren.png',
    ],
)

# Original is misspelled "Acsetic"
# 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/>.

import sys
sys.path.append('../../../python_mod_helpers')
from bl3hotfixmod.bl3hotfixmod import Mod, BVC, BVCF

mod = Mod(
    'mission_reward_randomizer.bl3hotfix',
    'Mission Reward Randomizer',
    'Apocalyptech',
    [
        "Randomizes the rewards given by missions.  Reward types should remain",
        "constant -- if it originally gives a pistol, you should get a legendary",
        "pistol of some sort.  This does not include customization rewards.",
        "",
        "More or less intended to be used alongside my Expanded Legendary Pools",
        "mods, for the most interesting rewards.",
    ],
    lic=Mod.CC_BY_SA_40,
    v='1.2.0',
    cats='quest-changes',
)

# There are various ways to accomplish this, and of course I go for a
# super over-engineered method.  Ah, well!

(AR, HW, PS, SG, SM, SR, SH, GM, CM, AF, SK, HD, TK, RD) = range(14)
type_blacklist = {SK, HD, TK, RD}

leg_pools = {
Ejemplo n.º 15
0
# 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/>.

import sys
sys.path.append('../../../python_mod_helpers')
from bl3hotfixmod.bl3hotfixmod import Mod, BVC

mod = Mod(
    'no_reload_notification.bl3hotfix',
    'No Reload Notification',
    'Apocalyptech',
    [
        "Removes the onscreen prompt to reload, when near the end of a mag.",
    ],
    contact='https://apocalyptech.com/contact.php',
    lic=Mod.CC_BY_SA_40,
    v='1.0.0',
    cats='qol, ui',
)

# Default: 0.3
mod.reg_hotfix(Mod.PATCH, '', '/Game/GameData/GameplayGlobals',
               'AmmoLowPercent', 0)

mod.close()
Ejemplo n.º 16
0
#
# 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/>.

import sys
sys.path.append('../../../python_mod_helpers')
from bl3hotfixmod.bl3hotfixmod import Mod

mod = Mod(
    'no_mayhem_drop_scaling.bl3hotfix',
    'No Mayhem Drop Scaling',
    'Apocalyptech',
    [
        "Mayhem 2.0 increases the drop rates pretty significantly, and when",
        "combined with my Better Loot mod, it's totally absurd.  I'm happy",
        "with my Better Loot drop weighting, so this should de-scale the",
        "loot so that Mayhem 2.0 modes are no different than in normal.",
    ],
    lic=Mod.CC_BY_SA_40,
    v='1.0.0',
    cats='mayhem, enemy-drops',
)

# There's another column named LootQuality_56_03E220E0495C6B37CD6C7195F5EA289B which
# goes from 1 at M1, to 2 at M10.  No idea what that does, really, though it looks like
# it might only be referenced by a UI element.  So possibly nothing important...

for mayhem_level in range(1, 11):
    mod.comment('Mayhem {}'.format(mayhem_level))
    for col_name in [
            'DropWeightCommonScalar_21_59A2FB124E32B955768A7B9D93C25A99',
# 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/>.

import sys
import collections
sys.path.append('../../../python_mod_helpers')
from bl3hotfixmod.bl3hotfixmod import Mod, BVCF

mod = Mod(
    'sisterly_love_more_money.bl3hotfix',
    'Sisterly Love: More Money',
    'Apocalyptech',
    [
        "I always felt that the malfunctioning-slot-machine money drop in",
        "the DLC2 mission Sisterly Love was pretty anemic and unimpressive.",
        "This mod buffs it up slightly, though it turns out there's not a",
        "*lot* that we can really do with it.",
    ],
    lic=Mod.CC_BY_SA_40,
    v='1.0.0',
    cats='quest-changes',
)

# Default is a single stack; I couldn't find anything bigger than the triple, which is
# still pretty meh.
mod.comment('Use "biggest" money drop')
to_obj_name = '/Game/Pickups/Money/DA_InventoryBalance_Currency_MoneyTripleStack'
mod.reg_hotfix(
    Mod.LEVEL, 'Strip_P',
    '/Dandelion/Missions/Side/BrotherlyLove/ItemPool_Money_BrotherlyLove',
    'BalancedItems.BalancedItems[0]', """(
scale_shotgun = 0.4
scale_smg = 0.5
scale_sniper = 0
scale_heavy = 0.5

mod = Mod(
    'better_maliwan_charge_time.bl3hotfix',
    'Better Maliwan Charge Time',
    'Apocalyptech',
    [
        'Reduces the charge time for Maliwan guns.',
        '',
        "Note that it's possible that any gun whose damage depends on charge time could",
        '*possibly* be nerfed by this, if the damage is based on time and not charge',
        "percent.  I think they're probably fine but have not tested it.",
        '',
        'Pistol Scaling: {:d}%'.format(int(scale_pistol * 100)),
        'Shotgun Scaling: {:d}%'.format(int(scale_shotgun * 100)),
        'SMG Scaling: {:d}%'.format(int(scale_smg * 100)),
        'Sniper Scaling: {:d}%'.format(int(scale_sniper * 100)),
        #'',
        #"Also (possibly) buffs the charge time for the ION CANNON, even though it's a Vladof gun.",
    ],
    lic=Mod.CC_BY_SA_40,
    v='1.3.0',
    cats='gear-brand, cheat',
)


def charge_time(
    mod,
    obj_name,
# 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 bl3hotfixmod.bl3hotfixmod import Mod

mod = Mod(
    'hatsoff_weapon.txt',
    'Hats Off Weapon',
    'Apocalyptech',
    [
        "Just a joke mod.  During the intro to Bounty of Blood, a character named",
        "Old Pete starts making another character dance by shooting at his feet.",
        "This changes his Jakobs gun into the Backburner, instead, for a laugh.",
    ],
    lic=Mod.CC_BY_SA_40,
)

# Had a heck of a time finding the attribute to use here
mod.reg_hotfix(
    Mod.CHAR, 'BPChar_Hatsoff',
    '/Geranium/NonPlayerCharacters/GerNPC/HatsOff/_Design/Character/BPChar_Hatsoff.Default__BPChar_Hatsoff_C',
    'DefaultBalanceWeaponData',
    Mod.get_full_cond(
        '/Game/PatchDLC/Mayhem2/Gear/Weapon/_Shared/_Unique/Backburner/Balance/Balance_HW_VLA_ETech_BackBurner',
        'InventoryBalanceData'))
Ejemplo n.º 20
0
import sys

sys.path.append('..\python_mod_helpers')
from bl3hotfixmod.bl3hotfixmod import Mod

mod = Mod(
    'TrialNames.bl3hotfix',
    'Trial Names',
    'DexManly',
    ["Add trial names to the galaxy map proving grounds."],
    lic=Mod.CC_BY_SA_40,
    v='1.0.0',
    cats='qol',
)

mod.reg_hotfix(
    Mod.LEVEL, 'MatchAll',
    '/Game/GameData/ZoneMap/PlanetMapData/PlanetMapData_ProvingGround-1.PlanetMapData_ProvingGround-1',
    'SubHeader', 'Proving Grounds - Survival')
mod.reg_hotfix(
    Mod.LEVEL, 'MatchAll',
    '/Game/GameData/ZoneMap/PlanetMapData/PlanetMapData_ProvingGround-4.PlanetMapData_ProvingGround-4',
    'SubHeader', 'Proving Grounds - Fervor')
mod.reg_hotfix(
    Mod.LEVEL, 'MatchAll',
    '/Game/GameData/ZoneMap/PlanetMapData/PlanetMapData_ProvingGround-5.PlanetMapData_ProvingGround-5',
    'SubHeader', 'Proving Grounds - Cunning')
mod.reg_hotfix(
    Mod.LEVEL, 'MatchAll',
    '/Game/GameData/ZoneMap/PlanetMapData/PlanetMapData_ProvingGround-6.PlanetMapData_ProvingGround-6',
    'SubHeader', 'Proving Grounds - Supremacy')
# and/or modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation, either version 3 of
# 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 bl3hotfixmod.bl3hotfixmod import Mod, BVC

mod = Mod(
    'longer_auto_pickup.txt',
    'Longer Auto Pickup',
    'Apocalyptech',
    [
        "Sets the var properly, but doesn't actually affect auto-pickup radius.",
    ],
    lic=Mod.CC_BY_SA_40,
)

# Default: 400
mod.reg_hotfix(Mod.PATCH, '', '/Game/GameData/GameplayGlobals',
               'MassPickupRadius', 3000)

mod.close()
Ejemplo n.º 22
0
# 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/>.

import sys
sys.path.append('../../../python_mod_helpers')
from bl3hotfixmod.bl3hotfixmod import Mod

mod = Mod('no_cryo_penalty.bl3hotfix',
        "No Cryo Penalty",
        'Apocalyptech',
        [
            "Gets rid of the movement penalty you'd otherwise suffer when a cryo",
            "effect is applied to your character, and allows sliding while frozen.",
            "This is obviously rather cheaty!",
        ],
        lic=Mod.CC_BY_SA_40,
        v='1.1.0',
        cats='cheat',
        )

# We could also just redefine the whole curve to only have a single point, but
# whatever.
mod.comment('Remove the speed debuff')
mod.reg_hotfix(Mod.PATCH, '',
		'/Game/GameData/StatusEffects/Cryo_PenaltyCurvePlayer',
		'FloatCurve.Keys.Keys[1].Value',
		1)
mod.reg_hotfix(Mod.PATCH, '',
		'/Game/GameData/StatusEffects/Cryo_PenaltyCurvePlayer',
Ejemplo n.º 23
0
        "This improves the customization drop rate from 0.5% to 12%, for most enemy",
        "drops.  Specific customization drops from a particular enemy haven't been",
        "touched.",
        "",
        "This will seriously interfere with your Lost Loot machine, so only really",
        "recommended if you're chasing down those last few customizations.",
    ]),
]:

    full_filename = 'customization_drop_rate_{}.bl3hotfix'.format(filename)

    mod = Mod(
        full_filename,
        'Customization Drop Rate: {}'.format(label),
        'Apocalyptech',
        desc,
        lic=Mod.CC_BY_SA_40,
        v='1.1.0',
        cats='enemy-drops',
    )

    mod.header('Set cosmetics drop chance to {}'.format(rate))
    for pool, index in [
        ('/Game/GameData/Loot/ItemPools/ItemPoolList_StandardEnemyGunsandGear',
         9),
        ('/Game/GameData/Loot/ItemPools/ItemPoolList_BadassEnemyGunsGear', 9),
        ('/Game/GameData/Loot/ItemPools/ItemPoolList_AnointedEnemyGunsGear',
         7),
        ('/Game/GameData/Loot/ItemPools/ItemPoolList_Boss', 6),
        ('/Game/GameData/Loot/ItemPools/ItemPoolList_MiniBoss', 6),
        ('/Game/GameData/Loot/ItemPools/ItemPoolList_VaultBossEnemy', 6),
Ejemplo n.º 24
0
# along with this Borderlands 3 Hotfix Mod.  If not, see
# <https://www.gnu.org/licenses/>.

import sys
sys.path.append('../../../python_mod_helpers')
from bl3hotfixmod.bl3hotfixmod import Mod

mod = Mod('more_visible_echo_logs.bl3hotfix',
        'More Visible ECHO Logs',
        'Apocalyptech',
        [
            "Alters the loot bar for ECHO logs (and coincidentally mission-related pickups,",
            "and anything else using that smallish cyan bar) so that it's *much* taller and",
            "a bit wider, to be more easily visible from a distance.  Put this together",
            "because even after a few playthroughs I wasn't sure if I'd heard all the ECHOs",
            "yet, and these might help me suss a few more out.",
            "",
            "Technically this also lengthens the ammo/eridium/health/money/booster bars a bit,",
            "but only by a very small amount.",
        ],
        lic=Mod.CC_BY_SA_40,
        v='1.0.0',
        cats='qol',
        ss='https://raw.githubusercontent.com/BLCM/bl3mods/master/Apocalyptech/qol/more_visible_echo_logs/echo.png',
        )

# default: 85
height = 900
interactive_height = 200

# default = 2.25
width = 15
Ejemplo n.º 25
0
    def write_mod(self):

        mod = Mod(
            f'money_grenade_changes_{self.mod_filename}.bl3hotfix',
            f'Money Grenade Changes: {self.mod_label}',
            'Apocalyptech',
            [
                f"Changes the 'Money' grenade part to drop {self.desc_text} instead of money.",
            ],
            contact='https://apocalyptech.com/contact.php',
            lic=Mod.CC_BY_SA_40,
            v='1.0.0',
            cats='joke, gear-grenade, cheat',
            ss=
            f'https://raw.githubusercontent.com/BLCM/bl3mods/master/Apocalyptech/gear_changes/money_grenade_changes/screenshot_{self.mod_filename}.png',
        )

        mod.header('Update item prefixes')
        mod.reg_hotfix(
            Mod.PATCH, '',
            '/Game/Gear/GrenadeMods/_Design/Naming/GrenadeModNamingStrategy',
            'SingleNames.SingleNames[20].NamePart.Object..PartName',
            self.single_name)
        mod.reg_hotfix(
            Mod.PATCH, '',
            '/Game/Gear/GrenadeMods/_Design/Naming/GrenadeModNamingStrategy',
            'TripleNames.TripleNames[11].NamePart.Object..PartName',
            self.triple_name)
        self._combo_name(mod, 19, self.combo_name_mirv)
        self._combo_name(mod, 36, self.combo_name_rain)
        self._combo_name(mod, 52, self.combo_name_nuke)
        self._combo_name(mod, 67, self.combo_name_large)
        self._combo_name(mod, 81, self.combo_name_bouncy)
        self._combo_name(mod, 94, self.combo_name_spring)
        self._combo_name(mod, 106, self.combo_name_sticky)
        self._combo_name(mod, 117, self.combo_name_artillery)
        self._combo_name(mod, 127, self.combo_name_lingering)
        self._combo_name(mod, 136, self.combo_name_divide)
        self._combo_name(mod, 144, self.combo_name_singularity)
        self._combo_name(mod, 151, self.combo_name_roider)
        self._combo_name(mod, 157, self.combo_name_link)
        self._combo_name(mod, 162, self.combo_name_transfusion)
        self._combo_name(mod, 166, self.combo_name_generator)
        self._combo_name(mod, 169, self.combo_name_elemental)
        self._combo_name(mod, 171, self.combo_name_force)
        self._combo_name(mod, 172, self.combo_name_money)
        mod.newline()

        mod.header('Update part name')
        mod.reg_hotfix(
            Mod.PATCH, '',
            '/Game/Gear/GrenadeMods/_Design/PartSets/Part_Behavior/Money/UIStat_Grenade_Money_Icon',
            'Text', self.part_text.upper())
        mod.newline()

        mod.header('Update drop pools and card descriptions')
        for pool_label, rewards, (uistat_name, uistat_text) in [
            ('Single-part grenade', self.rewards1, self.uistat1),
            ('Double-part grenade', self.rewards2, self.uistat2),
            ('Triple-part grenade', self.rewards3, self.uistat3),
        ]:
            mod.comment(pool_label)
            mod.reg_hotfix(Mod.PATCH, '', rewards.pool_name, 'BalancedItems',
                           str(rewards))
            mod.reg_hotfix(Mod.PATCH, '', uistat_name, 'FormatText',
                           uistat_text.format(self.card_text))
            mod.newline()

        # Special-case hardcodes for some mod types
        if self.mod_label == 'Diamond Keys':

            # Fix up the diamond key item so that it looks better when dropped
            # (by default it just looks like eridium, and also doesn't auto-pickup)

            mod.header_lines([
                "Fixing up droppable Diamond Key object",
                "",
                "We're making a few changes here which affect the item card specifically,",
                "though the item card will basically never be seen since we're enabling",
                "auto-pickup as well.  If you *do* get a glimpse of the card (using Photo",
                "Mode or the like) you'll see a bit of weirdness still -- the card might",
                "inherit the visual price of whatever card was last looked at, and the",
                "loot beam icon might inherit the last-looked-at item as well.  In the",
                "end I'm not bothering to track that down, though, since you've gotta",
                "work hard to see the card anyway.",
            ])

            mod.comment('Use an actual key mesh')
            mod.reg_hotfix(
                Mod.PATCH,
                '',
                '/Game/PatchDLC/VaultCard/Data/Currency/BP_DiamondKey_Single.Default__BP_DiamondKey_Single_C',
                'ItemMeshComponent.Object..StaticMesh',

                # Tried lots of various meshes here; I'm tempted to go with one of the keyring ones,
                # but in the end I just went with one of the smaller single-key ones.  Would be nice
                # if I could get that Geranium Key-to-City ones to interact with physics, though
                # that might cause weird problems with the key during the plot (or on Decoration),
                # so eh.  We'll just stick with the tiny key for now.

                # A bit much, though it's a nice big size.  Is definitely a keyring, though.
                #Mod.get_full_cond('/Dandelion/Missions/Plot/Ep04_Trashtown/Janitor_Keyring/Model/Meshes/SM_Janitor_Keyring', 'StaticMesh'),

                # Definitely a keyring; probably better than SM_Janitor_Keyring if I feel okay with that...
                #Mod.get_full_cond('/Ixora2/Missions/02_Eden6/Keyring/Model/Meshes/SM_Key_Ring', 'StaticMesh'),

                # Hah, just a rusty sphere basically
                #Mod.get_full_cond('/Geranium/LevelArt/Lodge/Props/Model/Meshes/SM_Apple_Key', 'StaticMesh'),

                # Very nice (and rightly-sized!) key, but it weirdly doesn't seem to actually interact with physics
                # at all?  Just hangs there in midair.
                #Mod.get_full_cond('/Geranium/InteractiveObjects/MissionAssets/Plot_5/Model/Meshes/SM_Key_to_City', 'StaticMesh'),
                # Same story here; and seemingly identical to the other one.  Almost certainly a copied object.
                #Mod.get_full_cond('/Game/PatchDLC/Geranium/InteractiveObjects/PlayerQuarters/RoomDecoMeshes/Meshes/SM_Key_to_City_RoomDeco', 'StaticMesh'),

                # Perfectly serviceable key, but quite small
                #Mod.get_full_cond('/Hibiscus/InteractiveObjects/MissionSpecific/Plot/EP03/Pickups/SM_Key_GateKey', 'StaticMesh'),
                # Perfectly serviceable key, but quite small
                Mod.get_full_cond(
                    '/Game/LevelArt/Environments/_Global/Props/Keys/Key_Scooters/Model/Meshes/SM_Key_Scooters',
                    'StaticMesh'),
            )
            mod.newline()

            mod.comment('Set a different item card type')
            mod.reg_hotfix(
                Mod.PATCH,
                '',
                '/Game/PatchDLC/VaultCard/Data/Currency/InvData_DiamondKey',
                'ItemCardTypeFrameName',
                #'currencyEridium',
                # Mission is nice; has a diamondy icon, even!
                'Mission',
                # Cash works well
                #'Cash',
            )
            mod.newline()

            mod.comment(
                'Set monetary value to 1; might prevent currency from inheriting from previously-viewed items'
            )
            mod.reg_hotfix(
                Mod.PATCH, '',
                '/Game/PatchDLC/VaultCard/Data/Currency/InvData_DiamondKey',
                'MonetaryValue', BVCF(bvc=1))
            mod.newline()

            mod.comment(
                'Assign Legendary rarity (instead of Eridium), for loot bar + frame color'
            )
            mod.reg_hotfix(
                Mod.PATCH, '',
                '/Game/PatchDLC/VaultCard/Data/Currency/InventoryBalance_DiamondKey',
                'RarityData',
                Mod.get_full_cond(
                    '/Game/GameData/Loot/RarityData/RarityData_05_Legendary',
                    'RarityData'))
            mod.newline()

            mod.comment('Auto-pickup Diamond Keys')
            mod.reg_hotfix(
                Mod.PATCH,
                '',
                '/Game/Gear/_Shared/_Design/InventoryCategories/InventoryCategory_DiamondKey',
                'PickupActionType',
                #'OnUseOnly',
                'OnUseOrTouch',
            )
            mod.newline()

        mod.close()
Ejemplo n.º 26
0
import sys
sys.path.append('../../../python_mod_helpers')
from bl3hotfixmod.bl3hotfixmod import Mod, BVCF

mod = Mod(
    'fix_dlc_shield_drops.bl3hotfix',
    'Fix DLC Shield Drops',
    'Apocalyptech',
    [
        "Most enemies in DLC2 (Guns, Love, and Tentacles) don't actually drop",
        "shields, and some enemies in DLC4 (Psycho Krieg) have a very odd shield",
        "drop configuration as well.  For DLC2 standard enemies, they're in the",
        "pool list but with a zero weight.  For DCL2 badasses, they're absent",
        "entirely from the pool list.  We're fixing the DLC2 Standard ones, but",
        "not bothering with Badasses for now.",
        "",
        "For DLC4 standard enemies, they won't drop non-DLC-specific shields, though",
        "I don't know how widespread that issue is.  Regardless, this should fix",
        "it up for the ones that have the problem.  This DLC4 fix is also included",
        "in my DLC Loot De-Emphasizer mod.",
    ],
    contact='https://apocalyptech.com/contact.php',
    lic=Mod.CC_BY_SA_40,
    v='1.1.0',
    cats='bugfix',
)

# DLC2 Fix
mod.comment('DLC2')
mod.reg_hotfix(
    Mod.CHAR, 'MatchAll',
Ejemplo n.º 27
0
#
# 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 bl3hotfixmod.bl3hotfixmod import Mod, BVCF

mod = Mod(
    'faster_npcs.txt',
    'Faster NPCs',
    'Apocalyptech',
    [],
    lic=Mod.CC_BY_SA_40,
)

# Pretty sure this is the right var to go after, to get Oletta to speed up.
# Haven't yet found a hotfix syntax that'll alter it, though.  And of course
# I could be wrong about the var, too...

# getall gbxcharacteraniminstance maxwalkspeed
# BPAnim_Granny_C /Geranium/Maps/Forest/Forest_P.Forest_P:PersistentLevel.BPChar_Granny_C_0.CharacterMesh0.BPAnim_Granny_C_0.MaxWalkSpeed = 120
#
# getall gbxskeletalmeshcomponent animscriptinstance name=charactermesh0

if False:
    # Attempts at a "direct" set.
# along with this Borderlands 3 Hotfix Mod.  If not, see
# <https://www.gnu.org/licenses/>.

import sys
sys.path.append('../../../python_mod_helpers')
from bl3hotfixmod.bl3hotfixmod import Mod, BVCF

mod = Mod(
    'all_event_spawns_active.bl3hotfix',
    'All (Limited-Time) Event Spawns Active',
    'Apocalyptech',
    [
        "Enables Bloody Harvest, Broken Hearts, and Revenge of the Cartels spawn",
        "modifications at the same time.  Shouldn't require the events to be",
        "actually active in order to work.  Enemies *can* be both Haunted and",
        "Cartel, fwiw!",
        "",
        "This should appear in your modlist *after* any mod which enables an event,",
        "otherwise this statement will get overwritten.",
    ],
    lic=Mod.CC_BY_SA_40,
    v='1.0.0',
    cats='event, enemy',
)

mod.reg_hotfix(
    Mod.PATCH, '', '/Game/GameData/Spawning/GlobalSpawnDLCData', 'DLCs', """(
            (
                Data=/Game/PatchDLC/BloodyHarvest/GameData/SpawnDLCScripts/SpawnDLC_BloodyHarvest.SpawnDLC_BloodyHarvest,
                IsEnabled=(BaseValueConstant=1.000000)
            ),
Ejemplo n.º 29
0
#  - Needle Gun - On the card, it's outclassed damagewise in the first place.
#                 Could be that the effects make up for it, but leaving for now.

mod = Mod(
    'nerf_op_gear.bl3hotfix',
    'Nerf OP Gear',
    'Apocalyptech',
    [
        "Nerfs some of the more egregiously-OP gear to be merely best-in-class.",
        "This is mostly meant to address weapons clearly intended for use in",
        "Mayhem 10, introduced by the Cartels/Mayhem 2.0 update, but also includes",
        "some other weapons such as the Krakatoa and Anarchy, etc.  This is",
        "intended for folks like myself who mostly disable Mayhem scaling, and",
        "don't want some guns absurdly outshining the rest.",
        "",
        "This only really addresses the 'base' damage scaling, and doesn't take",
        "any weapon behavior into consideration.",
        "",
        "This hasn't really seen any 'real' playtesting.  I've mostly just spawned",
        "a bunch of gear and fiddled with the numbers until the gear seems merely",
        "great instead of way OP.  Could be that I've gone too far (or not far enough)",
        "in some cases.  Launchers especially I don't really have a great feel for.",
    ],
    contact='https://apocalyptech.com/contact.php',
    lic=Mod.CC_BY_SA_40,
    v='1.0.0',
    cats='gear-general',
)

readme_reports = []
Ejemplo n.º 30
0
#        'Team_Neutral',
#        'Team_NonPlayers_NoPlayerCollision',
#        'Team_NonPlayers',
#        'Team_Players',
#        'Team_Rakk_Troy',
#        'Team_Rakk',
#        'Team_Ratch',
#        'Team_Saurian',
#        'Team_ServiceBots',
#        'Team_Skag',
#        'Team_Spiderant',
#        'Team_Splotch',
#        'Team_TroyCalypso',
#        'Team_Varkid',
#        ]
team_to_set = Mod.get_full_cond('/Game/Common/_Design/Teams/Team_EnragedGoliath', 'Team')

# Extra check, since this requires some extra data
if not os.path.exists(base_dir):
    print('Constructing this requires a specific set of data dumps, using a UE4 object-dumper DLL')
    sys.exit(1)

# Figure out what SpawnOptions_* objects we care about
data = BL3Data()
spawnoptions = {}
spawnoptions_ixora = {}
full_options = list(data.find('', 'SpawnOptions_')) \
        + list(data.find('', 'SpawnGroup_')) \
        + list(data.find('', 'SpawnTier_'))
for spawnoption in full_options:
    if spawnoption in spawnoption_blacklist: