Surfpup's tConfig Mod Wiki

The latest version of tConfig is v0.38 See the Downloads page for other useful programs and files.

Release 16 (v0.28)


First, I have an aneurysm on my brain. I have a link of Pictures, Poems, Music, Blog, Phone, One-handed, and more:

Now the change:

  • Extract: C:\Program Files (x86)\Steam\steamapps\common\Terraria\
    • tConfig <- Create shortcut <- Move to Desktop
    • ModPack Builder <- Create shortcut <- Move to Desktop
      • - This is important. Rebuild Mods isn't working right now.
    • tConfigServer <- Create shortcut <- Move to Desktop


  • Fixed Gore.color tinting making it not react to local light in map
  • Fixed Ebonsand not being considered corruption (and thus it had no corruption bg or music by itself)
  • Fixed in DealtPVP hook where the damage parameter would be wrong
  • Fixed issue where the Guide didn't use item.displayName in his menu
  • Added buffName INI attribute for items, to use simply add 'buffName=MyCustomBuffName' to the item's .ini file.
    • If you do so, you can control how much time the buff will be applied for with 'buffTime=' , time specified in frames e.g. buffTime=600
  • Added tooltips to mod settings, to use add "tooltip": "tooltipHere", under "display" in any setting type
  • Added ModWorld hook - public bool PreDrawPartyText(SpriteBatch SP) , you can use it to override the text that appears on top of party members for health etc.
  • Settings.GetKeybind(string setting, string modpack = null) - returns a Keys enum for the selected key
  • Settings.GetX (where X is the setting type) now accepts a Codable instance instead of string as the modpack ID, too
  • Fixed the Mod Config menu pages a bit
  • Player mod data is now loaded when the world gets loaded (used to be loaded in player selection menu)
  • 0.35.3a - fixed player menu bugs and stuff...


  • Removed PreDrawALL modworld hook
  • Added custom dependencies support ,in your Config.ini file in your modpack , you can define custom dll dependencies in the following manners
    • references=SomeDLLNameWithoutTheExtension , this is for non mod related assemblies
    • references=ModName\References , this is for referring for assemblies of other mods

Here's an example provided by PoroCYon :

  • Added System.Drawing reference to mod compilation
  • Added System.Windows.Forms reference to mod compilation
  • Fixed buttons for previous and next pages on mod settings not appearing
  • Fixed [recipe2] screwing up vanilla items
  • Fixed issue where game would randomly crash frequently in loading times
  • Here's a new PDB file for those who are interested in helping with crash issue pinpointing


  • Fixed some crashes in KillTile where tiles were null
  • Fixed issue where purple slimes were way too common
  • Fixed bug where green fairy from fairy bell was defective
  • Fixed vanilla issue where mouse text wouldn't appear on scaled npcs properly
  • ModGeneric UpdateSpawn hook has been changed , it is now public void UpdateSpawn(Player P)
  • Added ModWorld hooks
    • public void PreDrawWater(SpriteBatch SP,bool background)
    • public void PostDrawWater(SpriteBatch SP,bool background)
    • public void PreUpdate(GameTime gametime) - first thing called on the game's Update method , added as per request
    • public void PreDrawAll(SpriteBatch SP,bool gameMenu)- called right after the game's Draw spritebatch.Begin.
  • Added 'texture=' INI attribute , can be used to make one ini use another's texture e.g. 'texture=Some Other NPC' (texture must be of the same group , aka npc to npc)
  • Made Menu class public
  • Added public static int Menu.MenuPosX , MenuPosY and bool[] MenuActive fields as per request.
  • Added json mod settings feature , all credits go to Shockah on this amazing new feature
    • Mod settings file is Modpacks/ModPackname/Settings.json , create this file to use the feature
    • Mod settings are capable of settings some values in your mods without creating overrides , this is useful for multipliers , key bindings and etc
    • There's 5 types of settings you can use at the moment , those are 'bool' , 'int' , 'choice' , 'string' and 'keybind'
    • each setting holds a number of properties , the shared similar properties are "type" , "display" , "serverSynced" - serversynced values are received from the server automatically on joining , not serversynced ones stay as they were. (good for keybindings etc)
    • Getting setting values in code can be done with the following methods , note that each also includes a null parameter modname , so you can retrieve settings of other mods
      • Settings.Get(string setting) , returns JsonData setting value
      • Settings.GetSetting(string setting) , returns JsonData setting
      • GetBool(string setting) , returns the setting as a bool
      • GetInt(string setting) , returns the setting as an int
      • GetString(string setting) , returns the setting as a string (also works for keybind and choice)
      • GetChoice(string setting) , returns the choice
      • GetChoiceIndex(string setting) , returns the choice's index
  • All mods have to be rebuilt to run on tConfig 0.35.0
  • Added debug PDB.
    • It is highly encouraged that you use this and report on this thread with your crash logs if you play multiplayer / get random crashes.
    • Once you download this , run it and set the desitnation folder to your steam/steamapps/common/terraria folder , then play with tConfig as you normally do.


  • Fixed an issue where OverrideItemVacuum item hook failed to work properly if the player had free inventory space
  • Fixed an issue with server item awareness (might also reduce bugs in multiplayer)
  • Fixed an issue where mods with the SaveAndExit / SaveAndPlay hooks will overwrite each other's results
  • Added Player hooks
    • public bool CanHitboxDamageNPC(Player P,Rectangle Hitbox,NPC N) - called on npcs that are in the player's weapon hitbox , return true to hit the npc , false otherwise
    • public bool CanHitboxDamagePlayer(Player P,Rectangle Hitbox,Player P2) - called on players that are in the player's weapon hitbox in pvp , return true to hit the enemy player , false otherwise
      • Both hooks can be used in the creation of melee weapons that hit through walls , for example.
  • Item shops now support buying stacks in a single click (anything that is not buyOnce)


  • Changed Player PreDraw hook , it is now public void PreDraw(Player P,SpriteBatch SP,ref bool LetDraw)
    • Setting LetDraw to false would be the equivalent of returning false in the old way.
  • Removed Player RocketHandle hook
  • Added Player hooks
    • public void RocketFrame(Player P,ref bool LetRocket,ref bool EmitDust)
      • LetRocket (default true) can be set to false to remove all the handling of rocket boots velocity changes and dust stuff
      • EmitDust (default true) can be set to false to make the player not emit dust when using rocket boots of any kind
    • public void DirectionalMovement(Player P,ref bool LetRun,ref bool EmitDust,ref bool PlaySound)
      • LetRun (default true) can be set to false to remove all the handling of horizontal movement
      • EmitDust (default true) can be set to false to remove any dust emitted by things such as hermes boots when moving fast
      • PlaySound (default true) can be set to false to remove any stepping sound when running fast
    • public void CheckJump(Player P,ref bool LetJump,ref bool EmitDust,ref bool PlaySound)
      • LetJump (default true) can be set to false to remove all the handling of the jump key control
      • EmitDust (default true) can be set to false to remove any dust emitted by cloud in a bottle like effects
      • PlaySound (default true) can be set to false to remove any jump related sound
  • Added Player methods
    • public bool HasItem(int netID,int stack =-1) , returns true if the player has the item , if stack is not -1 it will check if the player has at least the stack amount specified of the item
      • For example somePlayer.HasItem(8,3) would return true if the player has at least 3 torches
    • public bool HasItem(string name,int stack =-1) , like the netID version but takes a name instead
      • For example somePlayer.HasItem("Gold Ore",25) would return true if the player has at least 25 gold ores in the inventory
  • Moved player head rotation code when in merman form to Player.PlayerFrame (before the FrameEffect hook)
  • Added displayName for items
    • item.displayName (default "") can be set to make the item have the name stated in display name, note that any code referencing the item would still use the given ini file name of the item
      • For example you can have an item called SuperPowerFullOre.ini and it can have a displayName="Useless Ore" , the item would appear as "Useless Ore" in game but any code refering the item such as spawning still needs to use SuperPowerFullOre as the name.
    • added new optional INI Attribute 'displayName=' for items , works exactly like the code variant.
  • Changed AffixName hook for items , it is now public void AffixName(ref string itemname,bool AfterPrefixing)
    • The hook is now called twice per name getting , once before prefixing of the item and once after the prefixing of the item
    • Prefixes using the hook also need to be adjusted to fit this hook change
  • Added support for custom item slot displays
    • Added new ModWorld hook public void OnSetup() , called right before the RegisterOnScreenInterfaces hook , used for adding listeners for a portion of tConfig's hooks
    • This feature is only for advanced coders , it is recommended that you decompile the latest tConfig to find out all of its functionality.
    • Added IItemSlotRender layer interface , consisting of the following mandatory hooks
      • public void PreDrawItemInSlot(SpriteBatch SP,Color SlotColor,Item I,Vector2 Pos,float ItemScale, ref bool LetDraw)
      • public void PostDrawItemInSlot(SpriteBatch SP,Color SlotColor,Item I,Vector2 Pos,float ItemScale,bool DidDraw)
      • This hook is used to register ItemSlotRender layers
    • Example created by shockah is available
  • Fixed a small bug where tConfig would crash when trying to load a player if the last mod loaded was outdated / lacked a required dependency mod


  • Improved a very small and ignorable memory leak regarding custom music
  • Fixed a last minute bug with custom NPC Music
    • Made custom music be applicable to npcs dynamically , if you do that via code you have to set npc.musicName to <ModName>:<Cue Name> (without the '<' '>'s)
  • Made TMod.GetCurrentMod() public , you can use this to get your mod's name from your codes
  • Changed how custom music works internally , it now runs much smoother and nicer code wise
  • Improved the modpack builder file detection a bit , would help you avoid key missing from dictionary cases
  • Moved Player , NPC , Projectile and Item fields : wet , wetCount , lavaWet and active to Codable - this can help you make more generic search methods
  • Added new projectile field - bool projectile.hurtsTiles (default true),set to false to make projectile not cut tiles like grass / vines when passing them , true otherwise.
    • Added new projectile INI Attribute 'hurtsTiles' (default True) , does the same thing as the above
  • Added new convenience method public static void Projectile.ExplodeTile(int x,int y,int projtype,bool ExplodeWalls=false) - you can use this in your projectiles to explode tiles like the vanilla explosives do
  • All mods have to be re-built for 0.33.0


  • Fixed issue where npc musicName would fail to work properly
    • NPCs no longer play wav files as custom music , there is a new (much better) way to do it.
  • Mods now include the assembly Microsoft.Xna.Framework.Xact.dll (ignore this if you're not a modder, have fun if you are a modder)
  • Reduced custom music / sound loading times
  • Loading music now displays a counting message so you know what's going on as tConfig loads it
  • Re-vamped how modders should add custom music , tConfig can now load XNA sound engines , wavebanks and soundbanks for your enjoyment
  • Fixed issue where the merchant won't sell lesser mana potions to players who increased their max mana over 200 from several mods
  • Re-fixed vanilla terraria issue where enemies would share the shadow trails of each other
  • Fixed tConfig issue that apparently existed since day 1 , all enemies shared the same immunity array
    • This might cause you to notice a few very minor changes in your dps against some enemies (for better or worse is uncertain)
  • Added ModWorld method - public int OverrideItemRemove() , return 0-199 for choosing the item to replace when the world contains too many items, return anything else if you removed items from the world manually and want to let tConfig find the first available free slot.
  • Changed UpdateItem hook , it is now public void UpdateItem(int itemindex,ref bool LetUpdate,ref int MovementType,ref int LavaImmunity)
    • you can change LetUpdate to false in order to make the item not update naturally
    • you can assign the item movementType 0 (default) to make it act normally , 1 for floating movement type like soul items , anything else to make neither of those run
    • you can assign lavaImmunity to a value smaller then 0 to make the item always perish in lava , or a value higher then 0 to never perish in lava (0 is default case where only rare items don't perish in lava)
  • All mods have to be re-built for tConfig 0.32.0


  • fixed issue with trying to replace items with netID < 0 (phase swords , copper / silver / gold stuff)
  • Added player method public void RocketHandle(Player P,ref bool LetHandle) - you can use this method to overwrite the entire rocket boots logic for some more advanced mods / adding new rocket boots dust type.
  • 0.31.1a - fixed bug where assigning new recipes to items with a negative netid would delete all the recipes of the item of the same type.


  • Fixed issues where custom bosses would drop lesser healing potions on death
  • Fixed issue where TMod.Load<class>(path) would require a restart of the client to function properly.
  • Fixed prefixes being appliable to items that shouldn't be stackable under vanilla conditions
  • Added easy biome music support
    • Added biome.biomeMusicPriority MusicPriority Enum field (default MusicPriority.None)
    • added int biome.biomeMusic (default 0)
    • added bool isVanillaMusic (default true)
    • Added SetBiomeMusic(MusicPriority priority, int soundID,bool isVanilla = false) method for biome instances , use this to set the biome of your music if its simplistic
      • you can get the soundID by using SoundHandler.soundID["name"]
    • Added Func<SoundHandler.Music> GetMusic to biome instances , set this method to return a music instance of the sound you want to want the biome's tracks to procedurally change during certain events (such as day or night)
    • Added Biome.MusicPriority enumerator , values can be set to...
      • None - this value is when the biome does not have any custom music settings
      • High - this value will make your biome's music take priority over all the other musics in the game aside boss musics for the purpose of playing
      • Med - this value will make your music take priority over all musics besides High priority musics , meteor , corruption and dungeon musics
      • Low - this value will make your music only override day/night overworld musics and blood moon.
  • Added Player Hooks
    • public void BeforeHurt(Player P,ref bool LetHurt,ref bool PlaySound,ref bool GenGore,ref int TheDamage,ref int HitDirection,bool pvp,bool quiet,ref string DeathText,ref bool Crit,ref float CritMultiplier)
      • You can set LetHurt to false to stop Hurt from running the method after your code
      • You can set PlaySound to false to avoid player sound on being hurt
      • You can set GenGore to stop player from emitting blood on hit
      • tip : you can check the deathtext to try and understand what is the current damage source
    • public void AfterHurt(Player P,ref double ParsedDamage,int hitDirection,bool pvp,bool quiet,string deathtext,bool Crit,float CritMultiplier)
      • lets you control what the Hurt method outputs , if it matters...
  • Re enabled the server mod settings feature!
    • When running a dedicated server , and prompt to select a world , you can type 's' or 'S' to open up your mods list and toggle mods
    • The settings made from the server would be applied to your client's mod list unless there's a 'Config Server Mod.ini' in your terraria documents folder.
      • If the latter file does exist , the server will load that instead of your regular mod list
  • Added the ability to load NonPreMultipliedAlpha textures in tConfig , any texture in the gore folder that starts with the letters 'NPMA' (Non Pre Multiplied Alpha) in its name would get loaded as such.
    • examples include "NPMA fairy texture 1.png" , "NPMA my pizza.png" , or even "NPMAsomethingredicilloouslylong.png"


  • Fixed issue where game would call LoadPlayers every time it saves
    • Might fix a lot of the recent 'tConfig has stopped working' crashes
  • Removed the ability to place things on mannequins to avoid their inevitable failures
    • You can still take off whatever you had on them,that is intentional so you won't lose what you already placed there.
  • Fixed Tile "side " placeOn check , it was faulty.
  • Fixed issue where the tConfig installer would install tConfig OR the game launcher
  • Fixed & improved useAmmoName and ammoName , the values no longer require a projectile nor an item of the same name to exist in order to work
  • v0.30.4a - Fixed bug where custom ammo types failed to be recognized properly

v0.30.3 :(

  • Removed character display in character selection menu to fix bugs a few users were having
  • made TextureHandler fields public


  • Attempted to fix some black screen issues , failed


  • fixed issue where tConfig would crash in character selection when hovering over 'create character' or 'previous'
  • fixed issue where the game launcher 3 installer wouldn't run if game launcher 1 was installed
  • fixed issue where tConfig would not delete characters proprly.
  • added gore.color , works like any other color tinting in terraria.


  • fixed bug where vanilla worlds imported into tConfig would have hell starting at space
  • fixed bug where softcore players drop only 1 coin of each type rather than half a stack on death
  • fixed -long- 'bug' where any custom boss would drop greater health potions , you must now include them by yourselves if you want them
  • fixed Chandeliers not getting turned on / off by wires
  • fixed bug where DamagePVP hook on projectiles was misfunctional
  • fixed -long- bug where items with custom ammoName required a projectile of the same name to exist otherwise they would stop the mod from building
  • fixed 'bug' where tConfig didn't color player names by their difficulty in character selection
  • fixed 'bug' where tConfig didn't show player avatars by their name in character selection
    • this is not anywhere nearly done with yet , but took quite a bit of an effort to get at all so please shut up and appreciate it
    • you have to enter a world and exit for the character to generate an image to show in the menu
      • might have related bugs , hopefully not
  • added bool npc.dontDrawLifeText field (default false) if set to true npc won't display info when you aim your mouse at it
    • added new NPC INI attribute 'dontDisplayLifeText' , set it to True to apply the same kind of effect.
  • tConfig installer will now install Eikester's Game Launcher 3 instead of 1 , and will display tConfig subversions in game launcher.


  • Made Main.buffColor and Main.AccCheck public
  • Added Main.Disco Color property , returns Color(Main.DiscoR,Main.DiscoG,Main.DiscoB)
  • Made Collision,Lang,Lighting,WorldGen classes static
  • Added a string casting for Item,Projectile,NPC,Player,Tile , displaying common useful info
  • Added ModGeneric hook 'public void OnUnload()' , useful for unloading content if you like to keep things super clean
  • Added coloring support to projectiles
    • Added Color projectile.color field , you can use this to color how your projectile would look (same process as with NPCs / items)
    • Added 'color' projectile INI attribute , format is comma-separated byte values for red, green,blue, and alpha (example 'color=255,0,0,127')
    • Added Color Projectile.GetColor(Color current) return color of the same brightness as current
  • Added double Main.hellLayer field , this value serves as the height of hell's start (the point where the grey background ends and hell background starts) - you should use this to check hell spawning from now on. (default value Main.maxTilesY-200)
    • Updated Hell & rocklayer biome definitions to support Main.hellLayer
  • Added ModGeneric method 'public void PostDrawMenu(Main main,SpriteBatch SP)' you can use this method to draw things over the menu and even make your own with enough coding skills.


  • Fixed bug where npcs tried instanciate buffs that do not have code instances in multiplayer
  • Fixed bug where npc critical damage wouldn't calculate right
  • Fixed bug where the game would crash on draw if the player tried to load a save with unloaded buffs
  • Added static color fields CombatText.PlayerHurtColor(default 255,80,90,255) , CombatText.CritHurtColor (default 255,100,30,255) , CombatText.NPCHurtColor (default 255,160,80,255) - you can modify those to play around with combat text colors.
  • Added some anti-null codes to drawing , in hope to avoid further 'object not set to instance of an object' crashed


  • Added NPC.AnyNPCs(string name) - returns true if any npc of the name exists in the world , false if otherwise
  • Fixed issue where critical damage from NPCs would not work
  • Fixed subfolder recipe finder issue
  • Added projectile.displayName - you can change this to make the projectile name on death text look different
    • Added projectile 'displayName=' string attribute , set it to control the projectile's displayname.


  • Added Custom Dust half assed support
    • Added Texture2D dust.OverrideTexture - if not null the texture will be drawn instead of the dust , you can (and in fact must) set the dust.frame to show what you want out of the texture , the center will be the frame's center.
    • Added Action dust.OverrideUpdate - if not null the entire specific dust's update will be overriden by this action (remember to get your dusts to die!)
  • Fixed issue where custom tiles bigger then 1x1 would only tileframe the top left corner on placement
  • Added Vector2 codable.Size - returns vector2(width,height)
  • Added Rectangle codable.Hitbox - returns rectangle((int) position.x,(int)position.y,width,height)
  • tConfig now supports subfolders for content in mod building , this will allow big mods to organize their content much better
    • An example would be having a folder 'Modpack/Item/Swords' and 'Modpack/Gore/Animals'
      • The subfolder support exists for everything aside Hold/Usestyles.
      • You can not have 2 items with the same name , remember that!
  • Added floats player.meleeDamageCrit (default 2f),player.rangedDamageCrit (default 2f),player.magicDamageCrit (default 2f) - those are reset per frame and modify the player's critical damage by such damage sources
  • Added int npc.CritChance (default 0) - you only need to set this once , allows npcs to have critical hits (100 = always crits)
  • Added float npc.CritMult (default 2f) - you only need to set this once , adjusts critical hit damage
    • Changed Player.Hurt parameters , it is now public double Hurt(int Damage, int hitDirection, bool pvp = false, bool quiet = false, string deathText = " was slain...", bool Crit = false,float CritMultiplier = 2f)
    • Changed NPC.StrikeNPC parameters , it is now public double StrikeNPC(int Damage, float knockBack, int hitDirection, bool crit = false, bool noEffect = false , float CritMultiplier = 2f)
    • Changed NetMessage 26 , it now takes the following params : NetMessage.SendData(26, -1, -1, "", whoGotHit, hitDirection, CritMult, PVPState, Damage) - CritMult 1 means no crit
    • Changed NetMessage 28 , it now takes the following params : NetMessage.SendData(28, -1, -1, "", whoGotHit, CritMult, knockback, hitDirection, Damage) - CritMult 1 means no crit
  • All mods before this point must be rebuilt.


  • WeightedRandom variables now all inherit their Random from Main.rand
  • Fixed music , music priorities
  • Fixed tileMerge code for diagonally adjacent tiles
  • Fixed tile loading fail in worlds with unloaded tiles
  • Added player.HasBuff(string buffname) and npc.HasBuff(string buffname) ,returns the buff index of the wished buff or -1 if not found
  • Removed Player Hook - OverrideDrawWings
  • Added Player methods
    • public void DrawBeforeWings(Player P,SpriteBatch SP,ref bool LetDraw,ref Color Armor)
    • public void DrawAfterWings(Player P,SpriteBatch SP,ref Color Armor)
    • public void DrawBeforeSkin(Player P,SpriteBatch SP,ref bool LetDraw,ref Color Skin)
    • public void DrawAfterSkin(Player P,SpriteBatch SP,ref Color Skin)
  • Made the following static variables reset per player update , you can now mess with them at will
    • Player.tileRangeX (default 5)
    • Player.tileRangeY (default 4)
    • Player.itemGrabRange (default 38)
    • Player.itemGrabSpeed (default 0.45f)
    • Player.itemGrabSpeedMax (default 4f)


  • Fixed Music issues once again
  • Made tile merging possible between any two tiles possible
    • a bool[][] array 'Main.tileMerge' has been added , the first indexer is for a tile , the other is for the tile it attempts to interact with. Setting two tile's interaction of bools will make merge with each other like they do with pretendType.

values should be assigned at ModGeneric.OnLoad().

      • for example public void OnLoad() { Main.tileMerge[30][2]= true; Main.tileMerge[2][30] = true; } will make grass and wooden planks merge.
  • Moved direction and directionY and gravDir to Codable , new float 'direction2' contains the data of both grabDir and directionY
  • Added System and System.Core references to mods built with the modpack builder
  • Made all the previous Codable easy values have a setter
    • for example npc.Center = Main.MouseWorld would make your npc's center appear on your mouse.
  • Fixed issue where npcs would not set code instances of buffs in multiplayer properly. (might have to fix again)


  • Added application icon for tConfig
  • Replaced LoadShader with Load<T> , this will now let you load any compiled XNA file such as spritefonts *wink wink nudge nudge Eikester*
  • Changed more music logic
  • Hopefully fixed double menu music bug
  • Fixed game inactivity music bug
  • Added music priorities
    • Audio.Player.Priorities Enum - None,Biome,Boss,Override
    • Replaced Audio.Player.Play parameter set , it is now Play(string SongName,Priorities SongProirity=Proirities.None,bool Repeat = true)
      • Audio.Player.Play will now look for mp3 / wav files by itself it the extension is not given in SongName
    • Replaced Audio.Player.Stop parameter set , it is now Stop(Priorities SongPriority=Priorities.None)
    • Replaced Audio.Player.FadeTo parameter set , it is now FadeTo(string SongName,float FadeTime = 3.0f, Priorities Songpriority=Priorities.None)
      • As with Play , it will now guess the extension if not given one specifically
    • Made FadeIn and FadeOut private again by Empio's decision.
  • Made town NPC name lists public , have fun changing the possible outcomes.
  • Fixed long lived harpoon crash in tConfig! hurray! =D (W1k , Draykon , Mitchellex , you will never believe what it was! xD)
  • changed Config.hasHands from a hashset into a dictionaryhandler


  • Added new ModGeneric method 'public void ModifySpawnList(List<int> PossibleSpawns)' , you can modify the said list to change what can be rolled for spawning.
  • Added ModGeneric method 'public bool OverrideMenuSelection(int previousFocus,int choicesAmt,Main main)' ,return true to override menu choice handling , false to run this code along normal choices
  • Two new ints , Main.colorRarityMin (default -1) & Main.colorRarityMax (default 6), they set the range which the item's rarity value can go up/down to.
  • Added full support for the Main.colorRarity dictionary to add new rarity colors and values , adjust colorRarityMin and Max appropriately if you plan to do so
  • Added menus for loading worlds with missing tiles and walls and npcs.
  • Fixed issue with pretendType tiles , they will now be asked upon exactly like normally missing tiles.


  • Made Music related class stuff public , to allow making complex codes related to music
  • Added sound group 100 for the Main.PlaySound method , you can use this to play custom sounds without randomized pitch
  • Fixed 'blip' custom sound start issues
  • Fixed Music issues related to multiplayer
  • Changed the graphicsprofile to HiDef , this means terraria stops supporting windows phone (what the hell is that anyways) but it allows more complex graphics related mods *cough cough Empio*
  • Added item ini attribute drawHairAlt , its a bool , if set to true the player will draw the alternate hair for their hairstyle (can be freely used in conjunction with drawHair)
  • Changed item hook UpdateItem() to public bool UpdateItem(int index) , return false to override normal updating or true otherwise
  • Fixed error related to the AddSimpleRecipe method
  • Fixed buff code instances not initializing in multiplayer
  • Made 'reload mods' button always be available in tConfig settings menu
  • Added modpack builder feature 'do ' , can be used to compile multiple mods at once separated by ',' marks , example 'do 1,4,6' will compile mods #1 , #4 and then #6 (you can control the order) , supports overrides as well
  • Changed item stack saving in chest and syncing in multiplayer from byte to int , this allows the creation of 'stacks up' mod up to a 2.1 billion sized stack , worlds loaded on 0.29.1 cannot be loaded on earlier versions of tConfig
  • All mods have to be rebuilt in order to load on tConfig 0.29.1 , you will be notified of an error if you attempt to load old mods.
  • 29.1j+ : Added some modpack builder BAT building support
  • 29.1k+ : Changed QuickHeal and QuickMana player methods to only consume consumable items


  • Fixed '+' button not working in Terraria options for the 'Parallax' setting
  • More fixes for music fading
  • Fixed not being able to override recipes for vanilla items with INI files
  • New ModWorld.PostUpdate() hook (called after GAME update, right before Draw)
  • New Item/NPC/Projectile/Player methods:
    • float AngleTo(Vector2 Destination) - returns angle to destination in radians
    • float AngleFrom(Vector2 Source) -returns angle from source in radians
    • float Distance(Vector2 Other) -returns the distance in world units to the target
    • float DistanceSQ(Vector2 Other) -returns distance*distance in world units to the target
    • Vector2 DirectionTo(Vector2 Destination) - returns a unit vector aiming to the destination
    • Vector2 DirectionFrom(Vector2 Source) - returns a unit vector aimed from the source
    • bool WithinRange(Vector2 Target, float MaxRange) - checks if the target is within range from the entity that calls this
  • new Item/NPC/Projectile properties:
    • Vector2 Center - example projectile.Center
    • Left - example npc.Left
    • Right - example item.Right (note that these values are only useful for 'wild' items , dropped in the world)
    • Top - example player.Top
    • Bottom - example player.Bottom
    • ScreenPosition - the position of the object in relativity to the screen (only useful in drawing methods , really)
    • ScreenCenter - the center of the object in relative to the screen (same uses as the above)
  • New Vector2 Main.MouseWorld property (Main.screenPosition+new Vector2(Main.mouseX,Main.mouseY))
  • Extracting DLL and XNB files from the mod OBJ file into a temporary folder (for loading advanced stuff, like shaders)
  • Code for loading and using shaders
  • Walls (background tiles) now use ushorts instead of bytes - can load up to 65,535 different custom walls now
  • All mods before this point need to be rebuilt


  • Removed type limitations for sign tiles , you can now make custom signs
  • ModifyLightVision hook works again
  • You can now call the drawing code for an individual NPC via config.mainInstance.DrawNPCReal(int npcindex,bool behindtiles)
  • Added Main.MouseTextString, Main.MouseTextRare , those two values can be used to tamper with the item tooltipping in case of someone making custom interface mods
  • The reforge method logic has been moved into the Prefix method (if you call Prefix(-2) then you basically call reforging) , it is now overridable when making a mod with the OverridePrefix hook
  • Fixed the issue where multiple hotkeys could not be assigned to the same key
  • Added recipe boolean 'needLava' , item inis can now include this requirement via 'needLava=True' in the recipe
  • Added support for multiple recipes in a single ini file! to add a second recipe just add another recipe and change [Recipe] to [Recipe2] , you can go up to infinity although the numbers must be subsequent (aka 2,3,5 won't work , 2,3,4 will work)
  • Added ModGeneric hook 'public void LoadCustomRecipes()'
  • Added ModGeneric hook 'public void OnRecipeRefresh()'
  • Added Recipe.AddSimpleRecipe method :examples
  • Added Config.PrintConsole(string message, [Color color])
  • Added Config.TrackConsole(string tag, string message, [Color color], int ticks = 1)
  • Fixed vanilla bug with item duplication via trashing
  • Prefixes now have a value 'weight' , type double , determines chance to get
  • Added Prefix method SetWeight(double weight) , to set the weight of a prefix
  • Added Prefix ini attribute 'weight' , you can put the weight value of the recipe in there like 'weight=5.25'
  • Removed player!=null requirement for custom code KillTile to run.
  • Added item method 'public void ModifyPrefixList(WeightedRandom<int> validPrefixes)' , allowing you to control the list of which prefixes can be given to your item
  • Fixed custom doors not working in multiplayer when opened to the right by the player.
  • Fixed multiplayer server joining issue where the server name got corrupted
  • Changed desert and snow biome checks , you now count as if in desert when you are within the range of 1000 sand tiles (vanilla standard requirement for desert background) , changed snow requirement to 400 tiles (half the potential maximum amount of snowing)
  • Added modworld hook 'public void CraftItem(Recipe R,Item I,bool NewStack)' , this is called whenever an item is crafted and lets you run code on it on the moment of crafting (example purpose would be logging if you crafted it by yourself or not , or engrave your name into it)
  • Made the buff array be adaptable in size , if you change all of its array sizes to something different then 10 it will work appropriately


  • Removed type checks from signs , allowing for custom signs to be made
  • Removed revalidation of prefixes on loading items , allowing custom prefixed be given without issues


  • Stabilized all the bugs from tConfig v0.28.5
  • Created music support
  • Fixed item INI file property 'hasHands' , set hasHands to True to see your hands , false otherwise.
  • Added Main.modPause , setting this to true forces the game to pause , regardless of the situation(can even be used without autopause) (has no effect outside netMode 0)
  • Added the following Player methods
    • public bool HeldItemEffects(Player P)
      • Called on items the player has equipped , buffs , and the held item and the player itself , return false to negate held vanilla item effects such as candle lights or torch lights.
  • Rewrote the following Player methods
    • public void DrawBeforeLegs(Player P,SpriteBatch SP,ref bool LetDraw,ref Color Legs,ref Color Shoes,ref Color Grieves)
    • public void DrawAfterLegs(Player P,SpriteBatch SP,ref Color Legs,ref Color Shoes,ref Color Grieves)
    • public void DrawBeforeBody(Player P,SpriteBatch SP,ref bool LetDraw,ref Color Skin,ref Color Undershirt,ref Color Shirt,ref Color Armor)
    • public void DrawAfterBody(Player P,SpriteBatch SP,ref Color Skin,ref Color Undershirt,ref Color Shirt,ref Color Armor)
    • public void DrawBeforeHead(Player P,SpriteBatch SP,ref bool LetDraw,ref Color Skin,ref Color EyeWhite,ref Color Eye,ref Color Hair,ref Color Helm)
    • public void DrawAfterHead(Player P,SpriteBatch SP,ref Color Skin,ref Color EyeWhite,ref Color Eye,ref Color Hair,ref Color Helm)
    • public void DrawBeforeWeapon(Player P,SpriteBatch SP,red bool LetDraw,ref Color Weapon)
    • public void DrawAfterWeapon(Player P,SpriteBatch SP,ref Color Weapon)
    • public void DrawBeforeArms(Player P,SpriteBatch SP,ref bool LetDraw,ref Color Skin,ref Color Undershirt,ref Color Shirt,ref Color Armor)
    • public void DrawAfterArms(Player P,SpriteBatch SP,ref Color Skin,ref Color Undershirt,ref Color Shirt,ref Color Armor)
    • Example uses here
  • Giant tile update
  • Added support for custom doors of any size , will include an example with this post.
  • Made modpack builder refresh its mods list every time right before it writes it to the screen.


  • Updated how Vanilla NPC drops are handled. Any drops that you define for a vanilla NPC will be added, and won't overwrite existing drops. Furthermore, you can now define only new drops for an NPC without modifying its stats - for example, here's a Green Slime.ini file that adds torches as a drop:
5-10 Torch=100
  • This allows you to have better compatibility with other mods, and multiple mods can add drops to the same NPC.
  • For now, disabled the new NPC Biome Priorities feature, so custom NPCs can spawn again. We'll continue to work on this feature and add it back in once we get it working right.
  • 0.28.5a: Fixed multiplayer item dupe bug
  • 0.28.5d: Fixed various bugs


  • Fixed Frenzying Prefix
  • Fixed Projectile method DamagePlayer()
  • Added networking hooks (go in World.cs):
    • void NetReceiveIntercept(messageBuffer msgBuffer, int b, int start, int length, ref int num);
    • void NetSendIntercept(int num, ref int num2, ref int num3, int msgType, int remoteClient, int ignoreClient, string text, int number, float number2, float number3, float number4, int number5);
    • You can use these to intercept and augment messages. See my Epic Loot mod as an example of how to use this to transfer additional NPC data.
  • Added player variable 'statLifeMax2' which can be added to to add temporary health, similar to how mana works.
  • Increased size of mousetext array from 20 to 30. It may reduce chances of crashes occurring. This is just a temporary solution.
  • Added ability to specify namespace for mods that are compiled with customCompile=True
    • In Config.ini, set 'namespace' to the namespace of your mod
    • It's recommended to have a namespace other than 'Terraria' for various reasons
    • At some point I will look into making all regular-compiled mods have their own namespace by default, but there could be some issues with doing that.
  • Added ability to specify mod dependencies
    • In Config.ini, set 'requires' to a comma-separated list of mod names that the mod requires
    • If the required mod has an assembly, it will be added as a reference when compiling code
    • The required mod will be loaded first automatically
    • To specify a requirement for a specific version/setting of a mod, the name should be like: 'modname- override' - you'll see this naming convention in the DLL files placed within your source folder. The naming convention may change, in general this aspect of it hasn't been tested yet.
  • Due to changes in the way assemblies are loaded, all mods must be recompiled. You'll see this enforced in the game (mod is outdated error).
  • Fixed bug - Menu issue with prev and next buttons missing when entries on the current page are deleted - forum post
  • 'fixed' (see new networking hooks and Epic Loot implementation) - Issue with not being able to modify npc's max life in Initialize() - forum post
  • Fixed items not getting prefixes when crafted with RMB
  • Made reforging pass data of prefixed items to the new item - loaded previous item's save data after reforging
  • Fixed open door NPC spawning issue
  • Support for custom music added - more documentation to be added
  • Ability to specify Biome(s) for NPC spawning logic - more documentation to be added
  • WorldGen time has been greatly improved
  • Changes on February 9th
    • Loaded mods are now always placed at the top of the mod list
    • Users may now manually change the order that mods are loaded by changing their order in the Config Mod.ini file.
    • Fixed (hopefully) an issue with mod assembly dependencies failing


  • Added option for modpack builder that lets you have more control over how code is compiled. Set 'customCompile=True' in Config.ini under [Settings] within your mod's source folder. It will compile everything in the 'Global' directory, as well as all the usual stuff, but it won't automatically add class definitions, namespaces, etc. You can now work on your mod in visual studio and see compile errors more easily. For an example, see my Epic Loot mod.
  • Added Interface methods
    • public void PostDraw(SpriteBatch SP) - called after the interface is drawn
    • public void PostDrawSlot(SpriteBatch SP,int slot) - called after the slot is drawn
  • Fixed bug where interface item slot contents won't be dropped upon interface closing in multiplayer.
  • Implemented Projectile delegates
  • Implemented Item methods that get called when projectiles are spawned:
    • public CustomProjectile SpawnProjectile(Projectile p) - Return a CustomProjectile class, whose methods will be registered to the projectile.
    • public void RegisterProjectile(Projectile p) - Allows you to manually register delegates to the projectile if you wish to do so - might allow for more flexibility.
  • Fixed issue with Big Stinger not getting loaded into a dictionary properly
  • Added more console output for the server, for when mods fail to load
  • The tConfig error log will be deleted when the game is started - it will only have errors from the last time the game was run.
  • Fixed modpack builder so that 'cscheck' value is set to False automatically if the mod has 'customCompile' set to True.
  • Fixed modpack builder so that customCompile setting is reset after a mod is built


  • Fixed bug causing game to crash during mod reloading process
  • Added "Rebuild Mods" menu for easily rebuilding mods that have the source included. This currently only works if it finds 7-zip installed.
  • Added a way to manually set 7-zip location. In "Config Mod.ini" set something like this:
7zip=C:\Program Files\7-zip\7z.exe
  • 0.28.1b: Bundled portable 7-zip binary with the installer. Building with modpack builder will make use of this now. No installing of 7-zip should be necessary now.


  • Fixed bug - Tiles with 'directional' in the ini don't get the direction sent into the server in multiplayer , when placed by a player.
  • Added Tile INI attribute: set 'treasure=True' to make tile shine when using the spelunking potion.
  • new ModGeneric method , public void ServerCommand(string text) ,you can use it to add server commands by reading the text on them , the method is called before the actual regular text parsing and doesnt stop it.
  • added ModGeneric method , public void checkXMas() , the regular method is skipped if such method is found.
  • added new Projectile method , public bool tileCollide(Vector2 CollideVel) , allows executing code when the projectile hits a tile (only for tile collide projectiles) , return true to run normal collision code and false otherwise.
  • added ModGeneric method , public bool ItemMouseText(SpriteBatch SP,string cursorText,int rare,byte diff,string[] arr,bool[] arr2,bool[] arr3) , allows changing item tooltip texts entirely , return true to draw the normal text or false to skip it and draw your own stuff :P
  • changed CanEquip , OnUnEquip , OnEquip methods to also take int slot , to know which slot are you trying to equip the things to.
  • fixed mannequins not accepting custom armors , fixed mannequins torso equipment before bottom equipment
  • Added Tile INI attribute: set 'dustType=' to any number of dust type you want , for your tile to emit that dust when struck.
  • Attempted to improve performance of some Tile method calls. Currently the Update() method is now handled as an event, and it no longer takes any arguments. Save the coordinates in Initialize() if they are needed. Some testing with mods that use the Update() method is a good idea...
  • Fixed issue causing CreatePlayer() method to not get called.
  • Implemented more efficient handling of Save/Load methods for NPCs in networking code
  • Implemented a multiplayer-synchronized rand object for use in NPC AI code.
  • Fixed bug - light property and AddLight method now work in non-color lighting modes.
  • Fixed bug - tConfig no longer returns wrong x and y values for tiles with multiple rows on their sprite sheet
  • You can now get default tile types using Config.tileDefs.ID["Tile Name"]
  • Added hooks for color modification, all float[3] properties storing RGB values.
    • colorShopCopper , colorShopSilver , colorShopGold , colorShopPlatinum : Change color of buy/sell value in shop interface
    • colorRarity[rare] : Change item rarity colors
  • Implemented support for custom static prefixes. Prefixes are defined in INI files in the Prefix folder, here's an example:
;Name is required, this is what gets added to the item name
name=of Awesomeness
;Set suffix to True to make the name appear after the item name
;Possible requirements are: melee, ranged, magic, accessory
;Possible attributes: manaCost, damage, scale, knockback, shootSpeed, speed, defense, crit
;defense and crit are additive, and all other attributes are multipliers
;Possible attributes: defense, crit, mana, damage, moveSpeed, meleeSpeed
;All of these are additive, although some are floating point numbers
  • The Item section contains mostly multipliers that affect item stats, while the Player section is for adding to player-related values (this is what Accessories do to add defense, damage, etc)
  • Not all possibilities are implemented yet (like you can't add a static value of 5 damage to a weapon) but these may be added later. Currently you can do anything that the vanilla prefixes can do.
  • If a prefix isn't loaded, the item will get the "Mysterious" prefix, and should regain the original prefix if the prefix's mod is reloaded.
  • A more detailed description of the possible modifiers will be written later. Note that the 'speed' attribute is how much to increase speed by, this is done to prevent confusion due to the fact that increasing the actual variable itself results in slower speeds. So speed of 1.25 increases weapon speed by 25%, damage of 1.5 increase damage by 50%.
  • The filename for a prefix is used as a unique identifier
  • Added new Item methods:
    • void AffixName(ref string name); - Allows you to modify the name of the item for display purposes, after the prefix has already been applied to it.
    • MouseTip[] UpdateTooltip(); - Return a string array of new lines of text to add to the tooltip
    • void PostPrefix(int prefixID); - Called right after an item has its prefix set.
    • bool OverridePrefix(int prefixID) - Specifying this method will override prefix behavior entirely.
  • Added ability to define Prefixes in Prefix\Prefix.cs in a method called DefinePrefixes(), like so:
public List<Prefix> DefinePrefixes()
	List<Prefix> pref = new List<Prefix>();
	Prefix.Requirement armor = (Item item) => { return (item.accessory || item.bodySlot!=-1 || item.legSlot!=-1 || item.headSlot!=-1); };
		new Prefix[]{
			new Prefix("of Water Walking", true).Require(armor).Mod( (Player player) => { player.waterWalk=true; } ).AddTip("Gives the ability to walk on water")
	return pref;
  • Item prefix tooltips will always be calculated even if no prefix is present. If a mod alters an item's damage, for instance, it will tell you how much % higher the damage is than normal. This only applies to used items, not armor/accessories.
  • Started implementing delegates for custom methods.
  • Updated KindChatFunc to work as described in the changelog (return true to let normal function be called)
  • Updated Effects method behavior: It no longer overrides default effects, for default items. This may be a pretty important change for any 'global' item mods that affect all items, including default ones.
  • Implemented some changes that might prevent threading-related crashes.
  • UpdateItem method no longer takes any arguments. There is no point in passing in the Item to the method!
  • Updated custom NPC drops to have a chance of getting prefixes applied
  • Improved usage of CanDestroyTile to prevent tiles underneath from being destroyed
  • Changed DrawBeforeShooting , and changed DrawBefore methods to return a bool , return true to draw the part associated to the method , also added postdraws.
    • Note that these methods are ModPlayer methods and can be used on items.
    • Also note that DrawBeforeWeapon's color ref can be used to make the weapon glow at all times like the lightsabres.
    • public void DrawBeforeShooting(Player P,SpriteBatch SP,ref int XHoldGunAt,ref Vector2 ShootLoc)
    • public bool DrawBeforeHead(Player P,SpriteBatch SP,ref Color HelmColor)
    • public void DrawAfterHead(Player P,SpriteBatch SP,ref Color HelmColor)
    • public bool DrawBeforeBody(Player P,SpriteBatch SP,ref Color ChestColor)
    • public void DrawAfterBody(Player P,SpriteBatch SP,ref Color ChestColor)
    • public bool DrawBeforeLegs(Player P,SpriteBatch SP,ref Color GreavesColor)
    • public void DrawAfterLegs(Player P,SpriteBatch SP,ref Color GreavesColor)
    • public bool DrawBeforeWeapon(Player P,SpriteBatch SP,ref Color WeaponColor)
    • public void DrawAfterWeapon(Player P,SpriteBatch SP,ref Color WeaponColor)
    • public bool DrawBeforeArms(Player P,SpriteBatch SP,ref Color ArmsColor)
    • public void DrawAfterAfter(Player P,SpriteBatch SP,ref Color ArmsColor)
  • Added a 'MouseTip' class used for adding tooltips to prefixes and in the UpdateTooltip() method. If 'colored' is true, it will appear green, and if colored AND red is true, it will appear red. Here's the simple class in its entirety:
   public class MouseTip
       public string text;
       public bool colored;
       public bool red;
       public MouseTip(string text, bool colored = true, bool red = false)
           this.text = text;
           this.colored = colored;
  = red;
  • Updated RunMethod functions to utilize registered delegates when available.
  • Added some delegates for player draw methods
  • Added 'loading screen' - when the game starts, it immediately opens the window and displays load progress.
  • Restored/improved the tConfig update feature. I can't guarantee that it will always work for everybody, but I got it to work consistently on my computer. Only annoyance is that the Game Launcher may need to be restarted when you close the game, before you can start the game again.

Release 15 (v0.27)


  • PreDrawAll method has been removed entirely, until we can determine how to implement it without causing crashes.
  • Implemented new prefix system, with vanilla prefixes rewritten (thanks goes to Triple Blah for the help). Custom prefixes aren't supported yet, but I want to make sure that the system and the vanilla prefixes are working fine first.
    • Note that the 'prefixType' attribute of items is no longer being used. Any custom item might be able to obtain a prefix, as long as it meets requirements for a prefix.
    • There might be other small differences... For instance, you can probably get a prefix on the Guide Doll, even though you couldn't before.
  • Fixed Issue where the server would read receive tile data wrong
  • Fixed modpack builder item/tile/projectile existence check functions
  • Fixed multiplayer issue with random tile drops and pink textures.
  • Made the Mod Update screen / process use threads and display progress
  • Improved error messages for global mod codes for NPCs, Items, Projectiles, to include the mod name, for easier debugging and figuring out which mod isn't working.
  • Items
    • added public bool CanEquip(Player P, int slot) , return true to allow the player to equip an item , false otherwise.
    • added public void OnEquip(Player P, int slot) , runs on the moment you equip the item
    • added public void OnUnequip(Player P, int slot) , runs on the moment you unequip the item
    • added public bool AccCheck(Player P,slot i) , allows to override the '1 accessory of same kind' rule , return true to allow equipping the accessory in the slot i(3,4,5,6,7) , or false otherwise.
    • added public void VanityEffects(Player P) , same as Effects , only runs on the items in your vanityslot.
    • public bool InvRightClicked(Player P, int playerID, int slot)
  • Modified custom NPC spawn logic. In order to let all mods have equal opportunity to spawn NPCs, the following happens now: When SpawnNPC() is called, and returns true, the NPC is added to a list. SpawnNPC() is called for all custom NPCs, and then a random NPC is chosen from the 'success' list and spawned. With this method, there should be greater variety of NPCs when you have many mods enabled.
  • Minor revision:
    • Change to OnUnEquip behavior
    • changed TileCollision method override to be public Vector2 TileCollision(Vector2 Result,Vector2 Position,Vector2 Velocity,int Width,int Height,bool fallThrough,bool fall2) , return Result to not override , otherwise return anything else.


  • Fixed a bug in which the mod index wasn't being passed to the Initialize method for ModWorld.
  • Fixed: Custom NPC names not showing in multiplayer. May need more testing, but it does at least send the NPC names when the player connects to the server. It's possible there are other networking codes that need to be updated to handle custom NPC names, so just let me know if the names disappear or anything.
  • Added: Ability to specify drops that are floating point values (less than 1% for instance). May need more testing. Added backwards compatibility with old droptables, so mods shouldn't need to be rebuilt.
  • Fixed: Issue with ModWorld Initialize() being called multiple times in multiplayer.
  • Loading status messages added to be displayed when initialize/loading mods
  • "Reload Mods" button will now trigger an asynchronous callback to allow for loading status to be displayed on the screen
  • Fixed/Improved: Computed hash value of mods now includes the mod 'version' value, and when mods transfer, the mod version is sent as well. This is for mods that have multiple versions to choose from, like the Portal Mod's Craftable and Worldgen versions, and ensures that the correct version is loaded on the client.
  • May have fixed crash that occurs involving drawPlayer() method
  • Made the 'cscheck' setting for the ModPack Builder a global setting in Config Mod.ini. It goes into a section called Builder like this:
;Disable extra compile checks
  • Fixed modpack builder File I/O bug
  • Tiles - Added 'light' specification to the INI file. Format is comma-separated floating point values for red, green, blue.
  • Fixed multiplayer bug related to placement of tiles with ID higher than 255.
  • World load errors are printed to the console window for the server.
  • Custom doors using the "doorToggle" attribute should automatically be triggered by wires. This should work in multiplayer as well.
  • Projectiles
    • fixed issue where projectiles might crash when running draw methods
    • fixed issue where projectile types of 255 are not being supported on multiplayer (cap increased to 32,768)
  • Items
    • Changed UseAmmo method : public bool UseAmmo(Player P,bool CurrentState,Item Counter)
      • It is now called on both the ammo that is being used for shooting, and the item that shoots it.
      • The ammo method gets called first , then the shooting item's method.
      • P is the shooting player
      • CurrentState is the current status of using ammo (return it to leave unchanged)
      • If the method is called from an item that shoots ammo, Counter is the ammo item
      • if the method is called from an ammo item, Counter is the shooting item
  • Tiles
    • Fixed issue where tiles that are Cut (with Cut=True) will not call their death methods
    • Fixed issue where CanExplode wouldn't be called on each tile in the explosion
  • ModWorld
    • added new method : public static void TileCollision(Vector2 Result,Vector2 Position,Vector2 Velocity,int Width,int Height,bool fallThrough,bool fall2)
      • modify the values of Result (default -9000,-9000) to override the game's method , otherwise leave it as it is to let normal tile collision run
  • Added: public void AdjTile(Player P) - used to let players modify the adjTiles array every frame (used from modplayer and can be called from items , too!)
  • Added: public void PreQuickBuff(Player P) - as per the will from the modders around the forum.

Release 14 (v0.24)


  • Began implementing a new system for handling loading/saving of attributes from INI files and Obj files. The code is more organized and stored in one location. This will make it easier for us to add new attributes. So far the Item class has been re-done using this method.
  • Fixed bug causing tile code objects to not be reset when reloading a world.
  • Updated mod file format - uses local 7-zip installation to create a 7z archive which includes the mod file and the mod source directory. This results in mod files that are smaller than before, even with the original source files included!
    • There is a fallback to using a regular zip format if 7-zip is not found on your machine. I highly recommend installing 7-zip though since it is useful in general and has better compression ratios.
    • For the non-tech-savvy, if you have a mod file and you want to get the source files out of it, you right-click it, open with -> 7-zip and it'll open like any other archive would.
    • I think it's a great benefit to have the source included automatically - going forward you'll be able to re-compile any mod if needed.
  • Updated ModPlayer and ModWorld Initialize method to take the Mod ID as a parameter (needed for networking purposes)
  • Added awesome feature that allows you to package multiple versions of your mod together. The user can toggle which one to load in the tConfig Settings menu. See the Portal Mod as an example. To use this feature, set up the Config.ini file (in the source folder) like this:
;When using this attribute,the user can toggle which .obj file is loaded in the tConfig Settings menu.
;Use this if you have multiple versions of your mod and you only want one of them loaded at a time.

;Specify the name displayed for each version of the mod
    ;overridename = displayname
;set the default 'type' name (when no override is used), if it's blank then it won't be included!
;If you don't include an override here, it won't use it!
supereasy=Super Easy
  • Added ability to disable individual CS file compile checks in the modpack builder - set "cscheck=False" in "Config.ini" in your mod's source folder. For large mods, this can speed up the compile time greatly, just be aware that it might produce a more convoluted error if one does occur.
  • New ModWorld Methods:
    • public void PreDrawTiles(SpriteBatch SP,bool solidOnly)
    • public void PostDrawTiles(SpriteBatch SP,bool solidOnly)
    • public void PreDrawALL(SpriteBatch SP,bool InMainMenu) - can be called to mess with the game's menu draw / make changes to important things such as bgColor and more , for purposes of changing scenery.
    • public void PreLightTiles(SpriteBatch SP)
    • public void PostLightTiles(SpriteBatch SP)
    • public bool PreDrawLifeHearts(SpriteBatch SP) - return true to draw player's life hearts regularly , false to skip
    • public bool PreDrawManaStars(SpriteBatch SP) - return true to draw player's mana stars regularly , false to skip
    • public bool PreDrawBubbleBar(SpriteBatch SP) - return true to draw player's bubbles bar regularly , false to skip
    • public bool PreDrawBuffsList(SpriteBatch SP) - return true to draw player's buff icons regularly , false to skip
    • public bool PreDrawTrashItem(SpriteBatch SP) - return true to draw trash slot regularly , false to skip
    • public bool PreDrawInventoryTitle(SpriteBatch SP) - return true to draw "inventory" on top of the inventory , false to skip
    • public bool PreDrawInventorySlots(SpriteBatch SP) - return true to draw the player's inventory , false to skip
    • public bool PreDrawHotbarLock(SpriteBatch SP) - return true to draw the lock on the left of the quickbar normally , false to skip
    • public bool PreDrawNPCHouseToggle(SpriteBatch SP) - return true to draw the house icon which switches to the NPC housing normally , false to skip
    • public bool PreDrawNPCHousingMenu(SpriteBatch SP) - return true to draw housable NPCs in list normally , false to skip
    • public bool PreDrawPlayerEquipment(SpriteBatch SP) - return true to draw player equipment item slots , false to skip
    • public bool PreDrawAvailableRecipes(SpriteBatch SP) - return true to draw recipes list normally, false to skip
    • public bool PreDrawInventoryCoins(SpriteBatch SP) - return true to draw the coin slots normally , false to skip
    • public bool PreDrawInventoryAmmo(SpriteBatch SP) - return true to draw the ammo slots normally , false to skip
    • public bool PreDrawNPCShop(SpriteBatch SP) - return true to draw an NPC's shop normally , false to skip
    • public bool PreDrawChestButtons(SpriteBatch SP) - return true to draw the quick buttons on the side of a chest in a chest menu normally , false to skip
    • public bool PreDrawChestSlots(SpriteBatch SP) - return true to draw chest slots of a chest normally , false to skip
    • public bool PreDrawInformationTexts(SpriteBatch SP) - return true to draw informative texts such as the ones of a clock or a GPS item normally , false to skip
    • public bool PreDrawEscapeButtons(SpriteBatch SP) - ...
    • public bool PreDrawHotbarInventory(SpriteBatch SP) - return true to draw the hotbar out of inventory normally , false to skip
    • public bool PreDrawDeathText(SpriteBatch SP) - return true to draw "You were Slain..." on screen normally , false to skip
    • public bool PreDrawLifeText(SpriteBatch SP) - return true to draw life text mouseover for health when putting mouse on hearts , false to skip
    • public bool PreDrawManaText(SpriteBatch SP) - return true to draw mana text mouseover for mana when putting mouse on stars , false to skip
  • New NPC Methods
    • public string DominantChat() - return non-empty string to override Chat method , added for things like temporary event texts etc.
    • public string ShopOverFuncName() - return non-empty string to change the name of the left option on chat
    • public string KindChatFuncName() - return a non-empty string to change name of the right option button on chat
    • public bool ShopOverFun() - return true to override setup shop , otherwise false
    • public bool KindChatFunc() - return true to let normal chat func be called

  • New Item Methods
    • public bool OverrideItemGrab(Player P,int PlayerID,int ItemIndex) - return false to call normal grabbing , otherwise true
    • public bool OverrideItemVacuum(Player P,int PlayerID,int ItemIndex) - return true to let the item be vacuumed even if you don't have enough space in inventory (should be used with ItemGrab or overrideItemGrab)
    • public bool UpdateItem(Item I) - return true to let item run regular physics , false otherwise , can be used to make an item act like a soul without a pretendType of any sort , or some custom things.
    • public void PreDrawItem(SpriteBatch SP,Item I,ref Color DrawAlpha,ref float Scale) - can be used to make item draw in special ways , such as extremely big small / changing size per frame (again , can be used to make a soul without a pretendType)
    • public bool PreShoot(Player P,Vector2 ShootPos,Vector2 ShootVelocity,int projType,int Damage,float knockback,int owner) - mystical magical method to make all your life easier , return true to let custom item shoot normally , false otherwise
  • New InterfaceObj Methods
    • public bool PreDraw(SpriteBatch SP) - return true to draw regular interface , false otherwise
    • public bool PreDrawSlot(SpriteBatch SP,int slot) - return true to draw the slot , false otherwise , note that Main.inventoryScale is reset after each slot's draw , so you can make slots draw in different sizes easily (change Main.inventoryScale in the predraw)).
  • New ModPlayer Methods
    • public bool PreQuickHeal(Player P) - return true to call regular QuickHeal , false otherwise
    • public bool PreQuickMana(Player P) - return true to call regular QuickMana , false otherwise
    • public bool PreQuickGrapple(Player P) - return true to call regular QuickGrapple , false otherwise
    • public bool PreKill(Player P,double Damage,int hitDirection,bool pvp,string deathText) - return true to let player die normally , false otherwise (can be used to make second-chance items , or some special death event related ones)
    • public void PostKill(Player P,double Damage,int hitDirection,bool pvp,string deathText) - called after a player has died.
  • New Main Method
    • added static bool ForceGuideMenu, to allow guide menu stay open without the guide. Requires persistent setting to true to function
  • New Buff Methods - ALL OF THE BUFF METHODS IN TCONFIG HAVE CHANGED THEIR PARAMETER LIST. The list is now the same for all the methods of the same kind of subject.
    • public void EffectsStart(Player P,int buffIndex,int buffType,int buffTime)
    • public void Effects(Player P,int buffIndex,int buffType,int buffTime)
    • public void EffectsEnd(Player P,int buffIndex,int buffType,int buffTime)
    • public void NPCEffectsStart(NPC N,int buffIndex,int buffType,int buffTime)
    • public void NPCEffects(NPC N,int buffIndex,int buffType,int buffTime)
    • public void NPCEffectsEnd(NPC N,int buffIndex,int buffType,int buffTime)
  • New Tile Methods
    • public void MouseOverTile(int x,int y,Player P) - can be used to make tile give an item icon on the player's mouse. (such as custom beds showing they're clickable)
  • DictionaryHandler - made dict public, for direct modification.
  • all of Lighting.cs has been made public and can now be referred to for codes.
  • all of Lang.cs has now been made accessible for changes etc , recommended to be careful if doing so (fully compatible with knee jokes)
  • Fixed bug that made custom doors not function well if they were loaded with an id higher then 255.
  • Fixed bug where custom furniture tiles would screw up house validation badly.
  • Added "nonsolid" tile placement option, allowing the tile to be placed on non-solid tiles.

Release 13 (v0.23)


  • Actually added tileCount (forgot to add logic on 23.8)
  • Added a bunch of requested drawing methods
    • void ModifyPlayerDrawColors(Player P,bool OverrideFire,float a,float r,float g,float b) , this one allows you to change the color multipliers of a player , note that all values start at 1f , overrideFire is false by default , if you set it to true your changes will occur even if the player is on fire (where's usually it would just set everything back to 1 , again.) examples include players poisoned have the red and blue scales lowered a bit. (note , might've mixed letters between a being the last or the first color multiplier)
    • bool OverrideWingDraw(Player P,SpriteBatch SP) , return true to still draw normal wings , and false otherwise , will be called before the original wing draw
    • void DrawBeforeBody(Player P,SpriteBatch SP , Color ArmorColor,Color HandsColor)
    • void DrawBeforeLegs(Player P,SpriteBatch SP , Color LegsColor)
    • void DrawBeforeHead(Player P,SpriteBatch SP , Color HeadColor)
    • void DrawBeforeShooting(Player P,SpriteBatch SP,ref int shootOff,Vector2 ShootCenter)
    • void DrawBeforeArms(Player P,SpriteBatch SP , Color ArmsColor)
    • Notes:
      • These methods are called between every draw part , note that the order they are listed here is the chronological order in which they're called.
      • Color params are used to modify the colors of the drawn materials (essentially letting you draw colored armors *cough cough*)
      • on DrawBeforeShooting , note that it only applies to items of useStyle 5 , and will allow you to modify the position in which you hold them (for those requested machineguns / sniper rifles / shotguns / WHATEVER)
  • Added 4 new properties to NPCs - float baseGravity , float maxGravity , bool dontRelocate, bool dontDrawFace.
    • base and max gravity values can be tweaked on AI in order to affect npcs with gravity to move slower or faster on the y axis.
    • dontRelocate will make an npc avoid searching for a house , and instead will only take manual input on house position.
    • dontDrawFace will make an npc hide its icon from the npc housing list , as well as hide its death text (aka "someone was slain").
  • (fix) npcs with fighter or town ai will not longer be stuck when trying to hop on areas while walking forward.
  • added ModWorld drawing methods:
    • void PreDrawWalls(SpriteBatch SP) - drawn before walls
    • void PostDrawWalls(SpriteBatch SP) -drawn after walls
    • void PreDrawWater(SpriteBatch SP) -called before draw water
    • void PostDrawWater(SpriteBatch SP) -called after draw water
    • void PreDrawBackground(SpriteBatch SP) - called before drawing background (even sky)
    • void PostDrawBackground(SpriteBatch SP) - called after drawing background (for whatever reason)
    • void PreDrawTiles(SpriteBatch SP) - called before tiles are to be drawn
    • void PostDrawTiles(SpriteBatch SP) - called after all tiles are drawn
  • Improved handling of mod exceptions: When an exception is thrown, it is written to "tconfig-errorlog.txt" in the Terraria save directory, and a pop-up is displayed showing the error message. Furthermore, to prevent it from spamming you with pop-ups, it will only display 5 within one session.
  • Removed one of the 'killtile' method calls added in the previous update.


  • Added 'placeFrame' attribute to Item INI - specify the frame number to use when placing a tile. This value is zero by default.
  • Added 'ShadowTail' and 'ShadowAura' bools to the Player class - set to true in order for player shadow trails or aura to be drawn every frame.
  • custom NPCs can now be set to active through NPCLoot , in order to let them avoid death.
  • Added DamagePlayer(ref int damage, Player player) , and DealtPlayer(double damage,Player player) to projectiles , you can use these to apply a code over a player that's hit by a projectile with those methods.
  • Added baseGravity , maxGravity , baseSpeed , baseSpeedAcceleration , baseSlideFactor , baseMaxSpeed , maximumMaxSpeed for the player class , these are all floats which you can edit in order to control the player's movement , they're reset every frame , and can let you do some really neat stuff! (change baseGravity to 0f for no-gravity , for example)
  • Added Main.tileCount[] , this is an int array that contains the amount of every tile type in the game , and is updated every frame , you can use it to make 'custom biome' checks and stuff like that (e.g. Main.tileCount[30] is the count of the wood tiles you can place as a player , that is around your character)
  • Fixed buffs not initializing correctly on load.
  • Fixed an issue with the installer not generating .gli file (and other things...) after the game launcher is run
  • Tile Initialize method now takes coordinates as parameter, so it has the following signature: void Initialize(int x, int y)
  • Fixed bug in modpack builder related to using 'override' features and specifying 'code' attribute
  • Fixed bug in modpack builder causing the override variable to not be reset
  • Fixed bug in modpack builder causing the override feature to build the installer incorrectly
  • Fixed issue with KillTile method not being called sometimes
  • ModWorld is now initialized before the world is loaded. If this causes problems for anyone, of course, let me know! I'm thinking I could have PreInitialize and PostInitialize methods for loading before and after the world, if it's necessary.


  • Fixed bugs related to custom doors
  • Updated modpack builder with new feature: Overrides. Allows you write files that will override the regular ones. For instance, a mod might have the file ModName\Item\Shield.ini. If you want to make an easy mode version of the mod that makes it more powerful, you would have the changed attributes in ModName\Override\easy\Item\Shield.ini, and then compile it by entering "4:easy" into the modpack builder, where 4 is the number associated with the mod folder (for example).
  • Some improved error checking in the modpack builder.
  • Added many method calls for worldgen methods. If the worldgen method is void, then the custom method must return a boolean for whether or not to execute default code. If the worldgen method is a boolean, then the custom method must return a boolean array containing a boolean for whether to execute default code, and a boolean for the actual return value.
  • Improved tile feature: New INI file attribute 'placeOn' - specify how the tile can be placed. Current options are: solid, solidTop, wall, ceiling, side, air. You can use any combinations of these for a tile to have multiple possibilities, and separate them by a space. For instance, to make a tile be placeable on top of solid tiles and solidTop tiles (e.g. tables), then you set "placeOn=solid solidTop".
    • Default behavior is "solid wall ceiling side" for Solid tiles
    • Non-Solid tiles by default have just "solid" as their placeable attribute
  • On the other hand, the location that tiles are placed relative to where you click may be different now: it's always going to place the bottom-left part of the tile where you click. It might be somewhat counter-intuitive for certain tiles...


  • Actually implemented!:
    • Removed max mana (with equips) cap
    • Removed health/mana cap checks from loadplayer method
  • Fixed some major multiplayer bugs


  • Updated world save format to save frame number for custom tiles. This is necessary due to how the frame number is used for custom tiles now, and fixes an annoying crash.
  • v0.23.4a added a check to force users to update mods.
  • Created Tiles Examples pack and included:
    • Door using code, showing data persistence
    • Locked chest w/ unique key identification
    • Growing plant
    • Active/Inactive tile
    • Bed capable of facing both directions and setting spawn point


  • Removed case-sensitivity from INI file processing. Should make things easier!
  • Added support for the Boo scripting language. The ModPack Builder will automatically compile .boo files instead of .cs files if they are available. In short, the Boo scripting language is like Python, but with better integration with the Common Language Infrastructure, which is heavily used in Terraria. It might be easier or more convenient to write in Boo than in C# for some people.
  • Made some changes to increase the number of tiles that can be loaded at once to about 65,535. Needs further testing to ensure nothing is broken. Also, mod codes may need to be updated to treat tile IDs as ushort instead of byte.
  • Minor change that should allow you to be more flexible with checkplacetile - needs testing
  • New tile method: bool CanExplode(int x, int y, int projectileType) - Return true if the tile can be destroyed by an explosion, false otherwise. This only affects explosions from vanilla explosive projectiles, such as Bomb, Dynamite, Sticky Bomb, etc.
  • Fixed bug causing accessory prefixes to not work when custom code runs on the accessory
  • Removed max mana (with equips) cap
  • Removed health/mana cap checks from loadplayer method
  • Added new Global class called ModGeneric, which goes in Global\Generic.cs.
  • ModGeneric method: void OnLoad() - Called after mods and content are loaded. Can be useful for loading texture packs.
  • Fixed/changed UpdateSpawn() method. It now gets called from the ModGeneric class.
  • Added support for custom doors, with no code required. Add to your tile INI file these two options:
    • doorType - Set this to "open" or "closed" - If your door is opened, the sprite must have two frames of a 2x3 door. If the door is closed, it must have one frame of a 1x3 door.
    • doorToggle - Set this to the name of the other tile to 'toggle' to when opening or closing. For example, the "Open Stone Door.ini" would have doorToggle=Closed Stone Door. You can also ignore this attribute if you want to have more control by doing it through code.
  • Updated how tile code instances are managed; custom multi-frame tiles with code should work properly if you keep the frameNumber attribute of the tiles up to date.
  • Added ability to create 'multi-directional' tiles; it will change the sprite frame based on the direction the player is facing when placing the tile. The frames must be going horizontally; see vanilla sprites for the bed and door for example. In the tile INI file, set "directional=True" to enable this capability.
  • Note that most mods that have C# code will need to be recompiled; otherwise they will result in errors & crashes.

Example - C# code

public static void Effects(Player player) {

Example - Boo code

def Effects(player):


  • Added error checking for tile limit. If the number of tiles exceeds 255, then it will unload a mod and try again.
  • Added new menu option to copy over vanilla save files. Only appears if the tConfig save list is empty.
  • When creating a new character or world, the name will have a number appended to it if a character or world of the same name already exists.
  • Fixed bug preventing you from creating more than 5 player characters.
  • Removed post-processing capability to fix graphical glitches


  • PreDraw and PostDraw for the Player occurs for every instance of DrawPlayer() now
  • Added Tile attribute, 'hitSoundList' integer for specifying the sound list to use.
  • Unlimited player characters
  • Player characters are now saved in zip files
  • Added new Render Target, where everything is drawn to. Post processing effects can now occur in PreDrawInterface, which has the RenderTarget2D object passed in as well:
    • void PreDrawInterface(SpriteBatch spriteBatch, RenderTarget2D globalTarget) globalTarget variable is NULL until further notice.
  • Fixed Tile 'CheckTile' method to expect FALSE if the tile does not pass the check and should be destroyed, TRUE otherwise.
  • Added PostKill and PreKill methods for Projectiles, called before and after the Kill method, respectively
  • Added PreItemCheck(Player p, int playerIndex) and PostItemCheck(Player p, int playerIndex) methods for items; these methods get called before and after ItemCheck() (where UseItem is called)


  • Minor update - ModWorld Load() method is now called after normal world loading methods.


  • New Methods
    • Tile
      • bool CheckTile(int x, int y) - Check the consistency of the tile types and tile frames. Return true if the check passes; false otherwise.
      • bool CheckPlaceTile(int x, int y) - Check the ground, ceiling, surrounding area, etc. to see if the tile can be placed. Return true if the check passes; false otherwise.
    • ModWorld
      • void GenerateWorld() - overrides the world generation process.
      • ModWorld is now initialized before world generation.
  • Interface-related changes
    • void SlotRightClicked(int slot) - overrides the behavior of right clicking an item slot
    • Made more variables public; added string 'name' variable to InterfaceObj
  • Player methods (for items, armor, etc)
    • bool PreDraw(Player player, SpriteBatch spriteBatch) - Called before DrawPlayer; return true to let it continue with DrawPlayer(), false otherwise.
    • void PostDraw(Player player , SpriteBatch spriteBatch) - called after DrawPlayer
  • Projectile Methods
    • bool PreAI() - called before AI(); return true to execute AI(), false otherwise.
    • void PostAI() - called after AI()
  • Tile stuff
    • 'hitSound' and 'hitSoundName' INI attributes for specifying the sound ID, or a custom sound, when the tile is hit with a pickaxe
  • Attempted to improve error checking for auto-updating tConfig, and made some other minor improvements; this hasn't been tested yet.


Please see Changelog/v1 or Changelog/v2