The 1.4.4 Update is Now Live
The 1.4.4 Update Is Now Live on Steam.
Thank you for your patience.
As a reminder, if mods you were using on 1.4.3 haven't updated yet, you can switch back to 1.4.3 in the meantime by using the beta branches feature to switch to the 1.4.3-legacy branch.
The following is a list of the most noteworthy pull requests and commits that have been pushed since 2022th October, and are now available on the default/stable branch.
[h3]Major Localization Changes by jopojelly[/h3]
[h3]Improve Player.clientClone performance by Chicken Bones & Mirsario[/h3]
• Brazilian Portuguese - Updated thanks to Pixelnando.
• Chinese - Updated thanks to lyc-Lacewing and sgkoishi.
• Russian - Updated thanks to RazzSG, Blueberryy, and Ved-s.
[h3]Torch fixes (Smart cursor, Biome torch/campfire) by jopojelly[/h3]
[h3]ExampleMod[/h3]
Blockaroz - Example Drill Midnight417 - Example for a Custom Swing Sword RayRelax - Porting various example commands RegularPhoenix - Ported Example Javelin RegularPhoenix - Updated Example Resource Rijam - Example Swinging Energy Sword (1.4.4 Excalibur Clone) Rijam - Minor Example Mod Changes Rijam - Updated Shimmered Example NPCs and Added Gore direwolf420 - Tweaks & fixes for example resource direwolf420 - Update existing mod integrations to 1.4.4 direwolf420 - More shimmer transformations direwolf420 - Reimplement ExampleBlock.ChangeWaterfallStyle FalconO5 - ExampleYoyo port
[h3]How do I switch to the 1.4.3-legacy or 1.3-legacy branches of TML?[/h3]
To switch to anoter branch in steam, just do the following: 1. Right click on tModLoader in Steam and select 'Properties...', then 'BETAS';
2. Select the branch you want in the drop-down menu on top;
3. Close the window. You don't need to enter any passwords.
Have fun!
Thank you for your patience.
As a reminder, if mods you were using on 1.4.3 haven't updated yet, you can switch back to 1.4.3 in the meantime by using the beta branches feature to switch to the 1.4.3-legacy branch.
New Changes' Highlights
The following is a list of the most noteworthy pull requests and commits that have been pushed since 2022th October, and are now available on the default/stable branch.
[h3]Major Localization Changes by jopojelly[/h3]
• Translations are now fully in localization files (.hjson files). DisplayName and Tooltip, for example, can no longer be assigned in code.[h3]Change HookGen Namespace Style by Chicken Bones[/h3]
• Localization files are automatically updated with entries for new content and managed by tModLoader. More organization options available.
• All ModTranslation usages are now replaced with LocalizedText
• All translation keys now follow a more predictable pattern: Mods.ModName.Category.ContentName.DataName
• Contributing translations, directly or through translation mods, streamlined.
Porting Notes: #preview-update-log in Discord
• Hookgen namespaces (IL. and On.) have been removed in favor of On_ and IL_ prepended to the type name.[h3]Declarative Shops by BasicallyIAmFox[/h3]
• No longer will you get 3 different namespace suggestions when you use VS to import a Terraria type name.
• Want On Item hooks? Just use On_Item it's in the same namespace as Item!
Porting Notes: #preview-update-log in Discord
• NPC shops are now declarative, meaning they get registered, and items can be added to them with conditions, similarly to NPC drops (loot) and recipes[h3]Max Health and Mana Manipulation API by absoluteAquarian[/h3]
• Adding items to shops, or hiding items from shops is now as easy as adding or disabling recipes
• Info mods can traverse the NPCShopDatabase to show how to obtain an item. All the conditions for items appearing in shops have been localized.
• Registering multiple shops per NPC is perfectly fine, and selecting the shop to be opened when chatting can now be done via the ref string shop parameter in OnChatButtonClicked
Porting Notes: #preview-update-log in Discord
• Adds ModPlayer.ModifyMaxStats with StatModifier arguments for permanent adjustments to max health/mana.[h3]ModHair API by steviegt6[/h3]
• Adds Player.ConsumedLifeCrystals, ConsumedLifeFruit and ConsumedManaCrystals properties.
• Add helper methods Player.UseHealthMaxIncreasingItem and Player.UseManaMaxIncreasingItem for the visual effects.
• Adds ModResourceDisplaySet allowing for custom life/mana draw styles (similar to boss bar styles) that can be selected in settings.
• Adds ModResourceOverlay to allow for drawing custom hearts/mana/effects over the vanilla (or modded) life/mana UI elements.
Porting Notes: #preview-update-log in Discord
• Adds the ability to add new hairstyles, with unlock conditions.[h3]Update MonoMod to new Re-organized implementation by Chicken-Bones[/h3]
• Updates to MonoMod involve the removal of old APIs, and better performance and stability moving forward.[h3]Player/NPC damage hooks rework. Hit/HurtModifiers and Hit/HurtInfo by Chicken Bones[/h3]
• NativeDetour and Detour are gone, there was little need for modders to use these anyway.
Porting Notes: #preview-update-log in Discord
Player and NPC hit hooks (OnHit, ModifyHit, OnHitBy, etc) have been simplified with common architecture, and had many new features added.[h3]OnStack Hook by andro951[/h3]
Porting Notes: #preview-update-log in Discord
• Adds ModItem/GlobalItem.OnStack and SplitStack to enable modded data such as experience counters, durability, etc to work with stackable items.[h3]Mod config auto localization by jopojelly[/h3]
• Crafting now creates the recipe item(s) first, and then combines them using OnStack. This means that in OnCreate,
RecipeCreationContext.DestinationStack has been added so you can make sure that the crafted result is stackable with the mouse item (if any)
Porting Notes: #preview-update-log in Discord
• ModConfig can now be localized by default.[h3]Make IEntitySource easier to use. Improve docs. Fix some projectile crit and armor pen bugs by Chicken-Bones[/h3]
• Localization for ModConfig entries are now done fully in .hjson files.
• .hjson files are automatically populated with entries.
• New LabelArgs and TooltipArgs attributes allow for cleaner code and better code/localization reuse.
• [Label] and [Tooltip] obsolete, [Header] changed. See porting notes.
Porting Notes: #preview-update-log in Discord
• All entity sources have been reviewed. Most are unchanged, but some have been removed, some added, or split.[h3]Allow keybind text to use translated text by Cyrillya[/h3]
• Many sources now extend EntitySource_Parent which is the most useful source. If in doubt, use GetSource_FromThis() when spawning a projectile.
• CritChance and ArmorPenetration now transfer from parent to child projectiles, and from players to player spawned projectiles.
• Projectile.ContinuouslyUpdateDamage is now ContinuouslyUpdateDamageStats and also updates CritChance and ArmorPenetration (no, minions still cannot crit, even though they have CritChance)
Porting Notes: #preview-update-log in Discord
• Modded keybinds are now localizable[h3]Item.NewItem overloads that takes Item by jopojelly[/h3]
• The name passed into KeybindLoader.RegisterKeybind is used in the key: "Mods.{ModName}.Keybind.{KeybindName}"
Porting Notes: #preview-update-log in Discord
• Added new Item.NewItem overloads that take an Item instance and clones it, allowing spawning a clone of an item.[h3]Fix Quick Heal and Quick Mana consuming non-consummables by Cyrillya[/h3]
• Fixes several cases where modded data was lost or broken (mediumcore death, items dropping from Tile Entities)
• Player.QuickSpawnItem (and similar) overloads with the Item parameter now use the item cloning by default. Player.QuickSpawnClonedItem is now marked as obsolete.
Porting Notes: #preview-update-log in Discord
• Adds item.Consummable as a check in Quick Heal and Quick Mana[h3]Add ModSystem.ClearWorld by Chicken-Bones[/h3]
• Is a simpler solution then overriding ConsumeItem(
Porting Notes: #preview-update-log in Discord
• Adds ModSystem.ClearWorld which runs on world clear. The new best place to clear/initialize world related data structures.[h3]IL Editing QoL Stuff and IL Editing GenPasses by Destructor-Ben[/h3]
Porting Notes: #preview-update-log in Discord
• Adds some helper methods and an exception for easier IL editing and error handling.[h3]Unify Localized Conditions by Chicken Bones[/h3]
• Adds WorldGen.ModifyPass and WorldGen.DetourPass to allow easily IL hooking legacy world gen passes
• It is recommended for modders to wrap their IL hooks in a try-catch, and call either MonoModHooks.DumpIL or throw new ILPatchFailureException so that a user can provide the IL log file for diagnosis when hooks fail.
Porting Notes: #preview-update-log in Discord
• Terraria.Recipe.Condition has been moved to Terraria.Condition and can now be applied to more things. Recipes, item variants, drops and soon shops[h3]GetItemDrops hook and redesigns to support Block Swap feature by jopojelly[/h3]
• Added SimpleItemDropRuleCondition class to help make drop conditions more easily.
Porting Notes: #preview-update-log in Discord
• Tiles and walls now automatically drop the items that place it. This process supports tiles with multiple styles.[h3]Default Research Unlock Value changed to 1 by jopojelly[/h3]
• Block Swap feature now supports modded torches, chests, and drawers.
• Other miscellaneous fixes.
Porting Notes: #preview-update-log in Discord
• All items will now default to needing 1 item to research.[h3]Mod/GlobalNPC.CanBeHitByNPC hooks by Ishigh1[/h3]
• The previous value of 0 left items unresearchable since many modders don't bother to implement journey mode features
• Modders can clean up their code. ModItems with Item.ResearchUnlockCount = 1; lines can be deleted.
Porting Notes: #preview-update-log in Discord
• New hooks, mirroring CanHitNPC but called on the victim's ModNPC and GlobalNPC[h3]BuyItem and PreReforge split into more granular methods, etc by jopojelly and Jadams505[/h3]
• Player.BuyItem split into BuyItem, CanAfford, and PayCurrency methods[h3]AmmoID.Sets.IsRocket changed to IsSpecialist, Player.rocketDamage changed to Player.specialistDamage by jopojelly[/h3]
• Player.CanBuyItem removed
• CustomCurrencyManager.BuyItem split in the same manner.
• Mod/GlobalItem.PreReforge is now split into PreReforge and CanReforge. PreReforge no longer returns bool, CanReforge handles that purpose.
Porting Notes: #preview-update-log in Discord
• Renames Player.rocketDamage to Player.specialistDamage, in line with 1.4.4 changes to Shroomite Helmet that changed "bonus rocket damage" to "bonus specialist ranged damage".[h3]ModPrefix.GetTooltipLines by jopojelly[/h3]
• Renames AmmoID.Sets.IsRocket to AmmoID.Sets.IsSpecialist and adds ammo entries matching Terraria for the same reason.
• Adds ItemID.Sets.IsRangedSpecialistWeapon to cover specialist weapons that don't use ammo.
Porting Notes: #preview-update-log in Discord
• ModPrefix.GetTooltipLines added to allow adding tooltips directly from ModPrefix class. Better code cohesion.[h3]ModTile.RegisterItemDrop to add fallback and manual type+style item drops by jopojelly[/h3]
Porting Notes: #preview-update-log in Discord
• Reworks automatic tile drops introduced in https://github.com/tModLoader/tModLoader/pull/3210[h3]Remove ILoadable from IModType by Chicken-Bones[/h3]
• ModBlockType.ItemDrop removed.
• TileLoader.GetItemDropFromTypeAndStyle no longer falls back to tile style 0. A special fallback will be used if the style is not found.
• ModTile.RegisterItemDrop added. Allows manually registering an item drop for a tile style, or as a fallback item. Used to provide drops for styles that don't have a corresponding item that places it.
• ModWall.RegisterItemDrop added. Allows manual registration of wall drop, useful for unsafe walls that drop safe walls.
Porting Notes: #preview-update-log in Discord
• IModType is no longer ILoadable, ModType is unchanged[h3]Automatically register TownNPCMood localizations by jopojelly[/h3]
• As a reminder, IModType exists only to support classes that can't extend from ModType. In tML the only instance of this is ModTileEntity which much extend from TileEntity, there is little reason for modders to extend from it instead of ModType.
Porting Notes: #preview-update-log in Discord
• TownNPCMood localization entries will automatically populate .hjson for town npc. Only used keys will be populated.[h3]Various NPC Gravity Changes by Kogsey[/h3]
• TownNPCDialogueName localization entries will automatically populate .hjson for biomes.
• NPCID.Sets.NoTownNPCHappiness added for town npc that don't use happiness.
Porting Notes: #preview-update-log in Discord
• Allows modders to affect NPC gravity and maxFallSpeed without interfering with other mods by multiplying NPC.GravityMultiplier and NPC.MaxFallSpeedMultiplier
• Adds GravityIgnoresType, GravityIgnoresLiquid and GravityIgnoresSpace properties to NPC to disable the respective vanilla gravity calculations.
Porting Notes: #preview-update-log in Discord
Performance Improvements
[h3]Improve Player.clientClone performance by Chicken Bones & Mirsario[/h3]
Item.Clone can become very performance expensive with many mods. Only type, stack and prefix are required to tell if an item has changed in the inventory and needs to be re-synced.[h3]Significantly Improve GlobalType Performance by Chicken Bones[/h3]
This PR replaces usages of Item.Clone in Player.clientClone with Item.CopyNetStateTo
Additionally, a single Player (and ModPlayer) instance is reused for all clientClone/CopyClientStateTo calls, acting as a 'storage copy' rather than making a new one each frame.
Please note that tModPorter is not smart enough to identify Item.Clone usages in ModPlayer.CopyClientStateTo calls automatically. You will need to replace these yourself or an exception will be thrown at runtime.
Porting Notes: #preview-update-log in Discord
• More performance, more modularity. No need to fear having hundreds of globals per mod. The new system should do better at optimizing performance than a modder can with 'uber globals' because it will skip even iterating past a global which doesn't apply to the target entity type.
• AppliesToEntity is not called during the game anymore! Instead, whether a global applies to an Item/Projectile/NPC type is computed and cached at the end of PostSetupContent
• This is a minimally breaking change, but reading the PR description is strongly recommended, especially for advanced modders.
Porting Notes: #preview-update-log in Discord
Localization
• Brazilian Portuguese - Updated thanks to Pixelnando.
• Chinese - Updated thanks to lyc-Lacewing and sgkoishi.
• Russian - Updated thanks to RazzSG, Blueberryy, and Ved-s.
Bug Fixes
[h3]Torch fixes (Smart cursor, Biome torch/campfire) by jopojelly[/h3]
• Biome Torch/Campfire (Torch Gods Favor) support has been added. ModBiome can now dictate the appropriate item to auto swap.[h3]UI Fixes by Destructor-Ben[/h3]
• Various torch issues have been fixed: Smart cursor, underwater placement, duplication menu category
• Block Swap feature now supports modded Campfire tiles.
• ExampleWaterTorch added. ExampleCampfire added.
Porting Notes: #preview-update-log in Discord
• UICommon.WithFadedMouseOver now supports border color toggling.[h3]Fix ModWaterStyle.SlopeTexture not being used by jopojelly[/h3]
Porting Notes: #preview-update-log in Discord
• If you are using ModWaterStyle, make sure you have a _Slope.png file. If you didn't, your mod won't load and will need to be updated.Rijam - More Conditions mtkloepf - Updated some documentation PaulHause - [1.4.4] WIP: Reworked Biome Block Counting for Vanilla Biomes stormytuna - Changes ModifyBuffTip hook into ModifyBuffText hook (#3307) noctisatrae - Improving the documentation (Recipe.Create) ScalarVector1 - Change legacy version message ExterminatorX99 - Run HookGen ExterminatorX99 - Mod/GlobalWall.WallFrame hook Ouroel - Wrap many ModPlayer hooks in exception suppressors to prevent cascading failures Exiled1 - Added a currency system accessor DarioDaF - Hotfix enumeration stopped error (Task edit UI) and icon disappearing Setnour6 - Add NearShimmer recipe condition Setnour6 - [1.4.4] Add new secret seed conditions for ItemDropRules Antirhinnum - A Little* Bit of Documentation turtletowerz - dedicated server management rewrite BasicallyIAmFox - UseImageX method overloads BasicallyIAmFox - [1.4.4] Add ItemID.Sets.OreDropsFromSlime MutantWafflez - New 1.4.4 Info Accessory Hooks MutantWafflez - Modded Loadout IO MutantWafflez - Completed Several Tasks From PortingNotes_1.4.4.9.md absoluteAquarian - More Reliable Stack Trace File Path Trimming absoluteAquarian - OnStack API Documentation Improvements Kogsey - Fixes setting npcCatchable true forcing NPC.friendly to falce Kogsey - Shimmer Recipe.Condition support + internalisation/removal of vanilla corruption/crimson versions Cyrillya - ModPlayer.AddMaterialsForCrafting Method Cyrillya - Call ItemLoader.UseItem for food quick buff Destructor-Ben - Better Mod Development Menu Destructor-Ben - More UI Fixes Destructor-Ben - IL Editing GenPasses Destructor-Ben - IL Editing QoL Stuff Jadams505 - Modded chest lock support direwolf420 - add DamageClassLoader.GetDamageClass direwolf420 - Add ItemID.Sets.CoinLuckValue direwolf420 - ModTypeLookup.RegisterLegacyNames method direwolf420 - InfoDisplay text coloring support direwolf420 - GrappleCanLatchOnTo hook direwolf420 - [1.4.4] Add TileID.Sets.AvoidedByMeteorLanding direwolf420 - [1.4.4] Add ItemID.Sets.GeodeDrops Mirsario - Patch improvements Mirsario - Code Style Update (K&R, etc.) Mirsario - Move & rename ModItem.SacrificeTotal Chicken-Bones - Improve FastParallel.For performance in CPU contended scenarios. Solxanich - Fix #881 (tModLoader not enabled for family share accounts on steam) Solxanich - Correct LogStartup order & Int.MaxValue UnloadedItem Exiled1 - Fix #3221 by adding a check to player and world names to prevent reserved keywords from being used. Cyrillya - Fix Player.Serialize bug due to extra buff slots added by mods HydroH - Fix IME compability issue turtletowerz - Fix console commands on Docker servers Destructor-Ben - UIMessageBox Fix Kogsey - Fix gravity being assigned instead of fall speed in maxFallSpeed private set. Kogsey - Fix for multiplayer modded music boxes not working with wiring Antirhinnum - Fix Character Creation Window Hair Draw Ordering Bug fkwilczek - Fixed double damage space fkwilczek - Fixed problem with detecting dotnet on linux Rijam - ItemUseStyleID.RaiseLamp Front Arm Animation Fix Rijam - Fix Town NPC Melee Swinging Source Rectangle Rijam - [1.4.4] Obsidian Armor Set Bonus Whip Speed Fix Jadams505 - [1.4.4] Health bar style options fix Jadams505 - [1.4.4] Quick stack visual fix Jadams505 - [1.4.4] Interface layer drawing fix direwolf420 - Use correct layers for First/LastVanillaLayer direwolf420 - Fix ModTree.Shake hook not working direwolf420 - Fix ProjectileLoader.ReceiveExtraAI not being called (consistently) direwolf420 - [ExampleMod] Fix EM not loading on servers, ExampleRecipeMaterialPlayer fixes direwolf420 - Fix pet drawing in player select screen for invalid items + ExampleMod showcase direwolf420 - Fix items falling through tiles and certain projectiles updating in non-loaded chunks in MP direwolf420 - [1.4.4] Fix DustType + CreateDust interaction direwolf420 - Fix tile framing (causing infinite UnloadedXTile loop and invisible tiles) ilcheese2 - Fix content folder path on Mac with GoG version (#3173)
• The Slope texture was added in 1.4.4 Terraria and helps draw water correctly around sloped tiles. See https://github.com/tModLoader/tModLoader/blob/1.4.4/ExampleMod/Content/Biomes/ExampleWaterStyle_Slope.png for an example. You can also look at the Images/LiquidSlope_# files from vanilla.
[h3]ExampleMod[/h3]
Blockaroz - Example Drill Midnight417 - Example for a Custom Swing Sword RayRelax - Porting various example commands RegularPhoenix - Ported Example Javelin RegularPhoenix - Updated Example Resource Rijam - Example Swinging Energy Sword (1.4.4 Excalibur Clone) Rijam - Minor Example Mod Changes Rijam - Updated Shimmered Example NPCs and Added Gore direwolf420 - Tweaks & fixes for example resource direwolf420 - Update existing mod integrations to 1.4.4 direwolf420 - More shimmer transformations direwolf420 - Reimplement ExampleBlock.ChangeWaterfallStyle FalconO5 - ExampleYoyo port
Frequently Asked Questions
[h3]How do I switch to the 1.4.3-legacy or 1.3-legacy branches of TML?[/h3]
To switch to anoter branch in steam, just do the following: 1. Right click on tModLoader in Steam and select 'Properties...', then 'BETAS';
2. Select the branch you want in the drop-down menu on top;
3. Close the window. You don't need to enter any passwords.
Have fun!