('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()
mod_label='Eridium', mod_filename='eridium', desc_text='eridium', card_text='eridium', part_text='ERIDIUM', single_name='Eridium', combo_name_money='Hoarding', triple_name="Earl's Choice", # Honestly *most* of the combo names still work all right for the Eridium # variant, so I'm basically happy with where this one ended up. combo_name_singularity='Sunk Cost', combo_name_transfusion='Infusion', combo_name_elemental='Infusion', rewards1=[ ('/Game/Pickups/Eridium/InvBal_Eridium_Single', None, BVC(bvc=.75)), ('/Game/Pickups/Eridium/InvBal_Eridium_Stack', None, BVC(bvc=.25)), ], rewards2=[ ('/Game/Pickups/Eridium/InvBal_Eridium_Single', None, BVC(bvc=.5)), ('/Game/Pickups/Eridium/InvBal_Eridium_Stack', None, BVC(bvc=.5)), ], rewards3=[ ('/Game/Pickups/Eridium/InvBal_Eridium_Single', None, BVC(bvc=.25)), ('/Game/Pickups/Eridium/InvBal_Eridium_Stack', None, BVC(bvc=.75)), ],
def process_bvc_struct(self, data): """ Given a serialized BVC/BVSC/etc structure, return a value. """ return self.process_bvc(BVC.from_data_struct(data))
elif idx == 5: for part in cat.partlist: skill_parts.append(part.part_name) assert (modtype_part) assert (skill_parts) # Now add those in to the base-game COMs for idx, cat in enumerate(base_com.categories): if idx == 1: cat.add_part_name(modtype_part) elif idx == 3: # While we're in here, fix up the blank Primary part that Siren COMs can # spawn with. The Fix Siren COM Blank Parts mod does this too, but since # we're changing the indexes, it won't actually know what to do with this. # So that mod should be run first, and then this mod will overwrite the # Balance completely. if base_char == 'Siren': for part in cat.partlist: if part.part_name == 'None': part.weight = BVC(bvc=0) elif idx == 5: for part in skill_parts: cat.add_part_name(part) # ... and now write out the hotfixes mod.comment('{} {}'.format(base_char, rarity)) base_com.hotfix_balance_full(mod) mod.newline() mod.close()
leg_pools[drop_type]) mod.newline() mod.comment( 'Special-case for Heavyweight Harker, in Stormblind Complex (also randomizes other enemies there)' ) mod.reg_hotfix( Mod.CHAR, 'BPChar_FrontRider_Rider', '/Game/PatchDLC/Ixora/GameData/Loot/ItemPools/ItemPool_Ixora_Guns_Legendary', 'BalancedItems', """( ( ItemPoolData={}, Weight={} ) )""".format( Mod.get_full_cond( '/Game/GameData/Loot/ItemPools/Guns/ItemPool_Guns_Legendary', 'ItemPoolData'), BVC(bvc=1), )) mod.newline() mod.comment('Remove partlock attempt for Anointed Alpha drop') mod.reg_hotfix( Mod.CHAR, 'BPChar_AnointedJoe', '/Game/Enemies/Enforcer/_Unique/AnointedJoe/_Design/ItemPools/ItemPool_AnointedJoe', 'PartSelectionOverrides', '()') mod.newline() mod.close()
from bl3hotfixmod.bl3hotfixmod import Mod, BVC for event, menunum in [ ('normal', 0), ('halloween', 3), ('christmas', 4), ('cartels', 5), ]: mod_filename = 'main_menu_{}.txt'.format(event) event_cap = event.capitalize() mod = Mod( mod_filename, 'Main Menu: {}'.format(event_cap), 'Apocalyptech', [ "Sets the main menu to have the {} visuals. No actual effect on". format(event_cap), "gameplay or anything (use the `eventname_enable.txt` mods to actually", "turn timed events back on).", ], lic=Mod.CC_BY_SA_40, ) mod.table_hotfix(Mod.PATCH, '', '/Game/Common/_Design/Table_MicropatchSwitches', 'MainMenuAltBackground', 'Value', BVC(bvc=menunum)) mod.close()
self.itempool_reg_qty = itempool_reg_qty self.itempool_leg_qty = itempool_leg_qty self.firerate_reg = firerate_reg self.firerate_leg = firerate_leg self.label_reg = label_reg self.label_leg = label_leg self.reg_cost = reg_cost self.leg_cost = leg_cost self.video = video ### ### Rapid-fire config (also defines the "default" reward pools) ### fab_default_reg = ItemPool('/Game/GameData/Loot/ItemPools/Fabricator/ItemPool_FabricatorGuns') fab_default_reg.add_pool('/Game/GameData/Loot/ItemPools/Guns/ItemPool_Guns_Uncommon', BVC(bvc=90)) fab_default_reg.add_pool('/Game/GameData/Loot/ItemPools/Guns/ItemPool_Guns_Rare', BVC(bvc=8)) fab_default_reg.add_pool('/Game/GameData/Loot/ItemPools/Guns/ItemPool_Guns_VeryRare', BVC(bvc=2)) fab_default_leg = ItemPool('/Game/GameData/Loot/ItemPools/Fabricator/ItemPool_FabricatorGuns_AltFire') fab_default_leg.add_pool('/Game/GameData/Loot/ItemPools/Guns/ItemPool_Guns_Legendary') fab_default_leg.add_pool('/Game/GameData/Loot/ItemPools/VendingMachines/DA_ItemPool_VendingMachine_CrazyEarl_MissionRewards', BVC(bvc=0.25)) rapidfire = Config(filename='rapidfire', label='Rapid-Fire', desc=[ "Converts the Fabricator's primary firing mode to full auto single-gun", "firing, and the legendary mode to a full auto shotgun-like blast. The", "quantity of gear dropped on the legendary mode has been buffed up a bit", "as well, which is mildly cheaty.", ],
def get_extra_anoints(self, balance_name): """ Given a `balance_name`, return a list of tuples, each with two elements: 1) The GPartExpansion object providing extra anointments (or None) 2) A list of anointments which that GPartExpansion is adding to the object. """ # First, if we haven't read in the GPartExpansion data and created our lookup # object, do that. if not self.balance_to_extra_anoints: self.balance_to_extra_anoints = {} for expansion_name in [ '/Game/PatchDLC/Raid1/Gear/_GearExtension/GParts/GPartExpansion_Grenades_Raid1', '/Game/PatchDLC/Raid1/Gear/_GearExtension/GParts/GPartExpansion_Shields_Raid1', '/Game/PatchDLC/Raid1/Gear/_GearExtension/GParts/GPartExpansion_Weapons_Raid1', # Cartels expansions have become part of the base game, add those in. '/Game/PatchDLC/Event2/Gear/_Design/_GearExtension/GParts/GPartExpansion_Grenades_Event2', '/Game/PatchDLC/Event2/Gear/_Design/_GearExtension/GParts/GPartExpansion_Shields_Event2', '/Game/PatchDLC/Event2/Gear/_Design/_GearExtension/GParts/GPartExpansion_Weapons_Event2', # Designer's Cut expansion (yep, just weapons) '/Game/PatchDLC/Ixora/Gear/_GearExtension/GParts/GPartExpansion_Weapons_Ixora', # These objects do exist, but they don't actually add any parts, so whatever. # The BloodyHarvest ones *do* add them, but only during the event, so we're ignoring # those too. #'/Game/PatchDLC/BloodyHarvest/Gear/_Design/_GearExtension/GParts/GPartExpansion_Grenades_BloodyHarvest', #'/Game/PatchDLC/BloodyHarvest/Gear/_Design/_GearExtension/GParts/GPartExpansion_Shields_BloodyHarvest', #'/Game/PatchDLC/BloodyHarvest/Gear/_Design/_GearExtension/GParts/GPartExpansion_Weapons_BloodyHarvest', #'/Game/PatchDLC/Dandelion/Gear/_GearExtension/GParts/GPartExpansion_Grenades_Dandelion', #'/Game/PatchDLC/Dandelion/Gear/_GearExtension/GParts/GPartExpansion_Shields_Dandelion', #'/Game/PatchDLC/Dandelion/Gear/_GearExtension/GParts/GPartExpansion_Weapons_Dandelion', #'/Game/PatchDLC/Hibiscus/Gear/_GearExtension/GParts/GPartExpansion_Grenades_Hibiscus', #'/Game/PatchDLC/Hibiscus/Gear/_GearExtension/GParts/GPartExpansion_Shields_Hibiscus', #'/Game/PatchDLC/Hibiscus/Gear/_GearExtension/GParts/GPartExpansion_Weapons_Hibiscus', #'/Game/PatchDLC/Geranium/Gear/_GearExtension/GParts/GPartExpansion_Weapons_Geranium', #'/Game/PatchDLC/Geranium/Gear/_GearExtension/GParts/GPartExpansion_Shields_Geranium', #'/Game/PatchDLC/Geranium/Gear/_GearExtension/GParts/GPartExpansion_Grenades_Geranium', ]: # Construct a list of anointments which this GPartExpansion provides extra_anoints = [] expansion_data = self.get_exports( expansion_name, 'InventoryGenericPartExpansionData')[0] for part in expansion_data['GenericParts']['Parts']: extra_anoints.append( (part['PartData'][1], BVC.from_data_struct(part['Weight']))) # Grab a list of balance collections which define the gear this expansion acts on. bal_collections = [ expansion_data['InventoryBalanceCollection'][1] ] for (extra, extra_data) in self.get_refs_to_data(bal_collections[0]): if extra_data \ and extra_data[0]['export_type'] == 'InventoryBalanceCollectionData' \ and extra_data[0]['ParentCollection'][1] == bal_collections[0]: bal_collections.append(extra) # Now loop through all balances and populate our dict for bal_collection in bal_collections: collection = self.get_exports( bal_collection, 'InventoryBalanceCollectionData')[0] if 'InventoryBalanceList' in collection: for bal in collection['InventoryBalanceList']: this_balance = bal['asset_path_name'].split('.')[0] if this_balance not in self.balance_to_extra_anoints: self.balance_to_extra_anoints[ this_balance] = [] self.balance_to_extra_anoints[this_balance].append( (expansion_name, extra_anoints)) # Now, return the appropriate value if balance_name in self.balance_to_extra_anoints: return self.balance_to_extra_anoints[balance_name] else: return []
)""") # The default here is apparently: # SpawnOptionData'/Game/PatchDLC/BloodyHarvest/NonPlayerCharacters/LeagueNPC/_Design/Spawning/SpawnOptions_LeagueNPC_Season01.SpawnOptions_LeagueNPC_Season01' # Should maybe add that into our Bloody Harvest enabling thing mod.reg_hotfix( Mod.EARLYLEVEL, 'Sanctuary3_P', '/Game/Maps/Sanctuary3/Sanctuary3_Season.Sanctuary3_Season:PersistentLevel.OakMissionSpawner_1.SpawnerComponent.SpawnerStyle_SpawnerStyle_Single', 'SpawnOptions', "SpawnOptionData'/Game/PatchDLC/Event2/NonPlayerCharacters/LeagueNPC/_Design/Spawning/SpawnOptions_LeagueNPC_Season02.SpawnOptions_LeagueNPC_Season02'" ) mod.newline() mod.comment('Main Menu') mod.table_hotfix(Mod.PATCH, '', '/Game/Common/_Design/Table_MicropatchSwitches', 'MainMenuAltBackground', 'Value', BVC(bvc=5)) mod.newline() # Bugfixes included with the rollout; stuff that was fixed after the data was # cooked, presumably mod.comment('Bugfixes') mod.reg_hotfix( Mod.LEVEL, 'Cartels_P', '/Game/PatchDLC/Event2/Maps/Cartels_Mission.Cartels_Mission:PersistentLevel.OakMissionWaypointBox_ACtivateStairSlide.CollisionComp', 'RelativeScale3D', '(X=1.000000,Y=1.000000,Z=1.600000)') mod.newline() mod.close()
"drops to be either health charges or damage-reduction charges instead.", ], lic=Mod.CC_BY_SA_40, v='1.0.0', cats='mayhem', ) # Boosters to switch to new_boosters = [ '/Game/Gear/Shields/_Design/PartSets/Part_Augment/Charges/HealthCharge/HealthChargePickup/InvBal_HealthCharge', '/Game/Gear/Shields/_Design/PartSets/Part_Augment/Charges/FortifyCharge/FortifyCharge_Pickup/InvBal_FortifyCharge', # Not gonna do the damage one, since this is probably gonna be used by melee-focused builds. #'/Game/Gear/Shields/_Design/PartSets/Part_Augment/Charges/PowerCharge/PowerCharge_Pickup/InvBal_PowerCharge', ] booster_weight = 1/len(new_boosters) # Set up the pool pool = ItemPool('/Game/PatchDLC/Mayhem2/Abilities/Enemy/FinishThem/ItemPool_Mayhem2_FinishThem') pool.add_balance('/Game/Pickups/Health/DA_InventoryBalance_Health.DA_InventoryBalance_Health') for booster in new_boosters: pool.add_balance(booster, weight=BVC(bvc=booster_weight)) # Write the hotfix mod.reg_hotfix(Mod.EARLYLEVEL, 'MatchAll', pool.pool_name, 'BalancedItems', str(pool)) mod.close()
# The default here is apparently: # SpawnOptionData'/Game/PatchDLC/BloodyHarvest/NonPlayerCharacters/LeagueNPC/_Design/Spawning/SpawnOptions_LeagueNPC_Season01.SpawnOptions_LeagueNPC_Season01' # Should maybe add that into our Bloody Harvest enabling thing mod.reg_hotfix(Mod.EARLYLEVEL, 'Sanctuary3_P', '/Game/Maps/Sanctuary3/Sanctuary3_Season.Sanctuary3_Season:PersistentLevel.OakMissionSpawner_1.SpawnerComponent.SpawnerStyle_SpawnerStyle_Single', 'SpawnOptions', "SpawnOptionData'/Game/PatchDLC/Event2/NonPlayerCharacters/LeagueNPC/_Design/Spawning/SpawnOptions_LeagueNPC_Season02.SpawnOptions_LeagueNPC_Season02'") mod.newline() mod.comment('Main Menu') mod.table_hotfix(Mod.PATCH, '', '/Game/Common/_Design/Table_MicropatchSwitches', 'MainMenuAltBackground', 'Value', BVC(bvc=5)) mod.newline() # Bugfixes included with the rollout; stuff that was fixed after the data was # cooked, presumably mod.comment('Bugfixes') mod.reg_hotfix(Mod.LEVEL, 'Cartels_P', '/Game/PatchDLC/Event2/Maps/Cartels_Mission.Cartels_Mission:PersistentLevel.OakMissionWaypointBox_ACtivateStairSlide.CollisionComp', 'RelativeScale3D', '(X=1.000000,Y=1.000000,Z=1.600000)') mod.newline() mod.close()