Info Symbol

Archived Page
This page contains information that has been deemed outdated or deprecated, but will still be kept for archival. It may or may not be updated.

This page is an archive of old changelog information for previous versions of tConfig (in particular, Release 1). It may therefore be no longer be correct, and is provided for your enjoyment.



  • Fixed bug with StatusNPC() method call


  • Blue slime bug has been fixed


  • 'host' multiplayer option is disabled when tConfigServer.exe isn't found


'Gameplay' method calls:

  • void OnNPCDeath(NPC npc)
  • int GetDamage(Player player, Item item)
    • Gets called for Ranged and Melee attacks
    • Normally returns item.damage * player.meleeDamage for melee weapons
  • float GetKnockback(Player player, Item item)
    • Called for Melee attacks
  • bool DamageCritical(Player player, NPC npc)
    • Return true if it lands a critical hit - deals double the damage
  • int DamageVariance(int damage, Player player, NPC npc)
    • Normally used to add or subtract a random amount.
  • float GetShootSpeed(Player p, Item i)
  • float GetRangedKnockback(Player p, Item i)
  • float GetAmmoShootSpeed(Player p, Item ammo)
  • int GetAmmoDamage(Player p, Item ammo)
  • float GetAmmoKnockback(Player p, Item ammo)
  • bool KeepAmmo(Player p, Item ammo, Item gun)
    • Return true if you don't want it to use up the ammo.
  • void LoadPlayer(BinaryReader reader)
  • void SavePlayer(BinaryWriter writer)
  • void CreatePlayer(Player player, Dictionary<string, string> settings)
    • This method is called after the inventory reset & starting items are added.
    • The settings dictionary is for the settings the player chose in the menu
  • Updated method call for items: void StatusNPC(NPC npc, Player p)
    • Now takes a Player as a parameter.
  • void DrawInterface(Player player, SpriteBatch batch)
    • Allows you to draw stuff to the interface!

I also got the custom menu working pretty well. I'm working on a simple example gameplay mod which adds three stats (strength, intelligence, dexterity) that factor into damage calculations.

Example gameplay mod is here - it isn't finished yet.

There are a few problems that need to be worked on

  • Loading a player that wasn't created using the currently loaded gameplay mod
  • Only one gameplay mod can be loaded at a time, so it should be a separate class of mods entirely. I'm thinking of creating a separate folder for it and a separate sub-menu that will allow you to have one turned on at a time. The same should probably be done for the worldgen chests spawn file as well.

Here's what the example menu file looks like:

starting weapon=Dagger,Longsword,Staff
gift=Pendant,Spider Ring,Flame Of Life
[class description]
Mage=Higher Intelligence
Fighter=Higher Strength
Ranger=Higher Dexterity
[race description]
Human=Ordinary dude
Orc=Green and ugly
[birthsign description]
Wolf=Like dogs, but better
Lion=Blonde and mighty
Eagle=Soaring through the wind

Not all of these are used in the code - mostly they're for stress testing the menu system.


  • Implemented method call for NPCs: string Chat()
    • Return the line of text you want the NPC to say when clicked on. Default NPCs normally check various conditions, such as time of day, and then randomly choose between two or three different statements. Simple example:
public static string Chat() {
	int choice=Main.rand.Next(2);
	if(choice==0) return "print('Hello World')\n";
	return "I have randomness!";
  • Another method call: bool TownSpawn()
    • Return true if the NPC meets requirements for spawning. Don't worry about checking for things like a house. Here, check for things like whether or not a boss has been defeated, or if the player has a bomb in his inventory, etc.
    • Currently I've set it so only one instance of a custom town NPC can be spawned.
    • If you unload a modpack containing a custom NPC that has spawned on your world, it will simply disappear when you load the world.
    • Checking for things like how much money the player has involves looping through the inventory and adding up the coin values. Here's an example in which the NPC requires that the players have a total of at least 5 gold coins.
public static bool TownSpawn() {
	int coinCount=0;
	int silverWorth=100;
	int goldWorth=10000;
	int platinumWorth=1000000;
	//Loop through all the players, add up their coins
	for (int i=0; i < Main.maxPlayers; i++)
		Player player = Main.player[i];
		if (
			for (int j = 0; j < 0x2c; j++)
				if ((player.inventory[j] != null) & (player.inventory[j].stack > 0))
					if (player.inventory[j].type == 71) //Copper coins
						coinCount += player.inventory[j].stack;
					if (player.inventory[j].type == 72) //Silver coins
						coinCount += player.inventory[j].stack * silverWorth;
					if (player.inventory[j].type == 73) //Gold coins
						coinCount += player.inventory[j].stack * goldWorth;
					if (player.inventory[j].type == 74) //Platinum coins
						coinCount += player.inventory[j].stack * platinumWorth;
	//If the coins sum up to more than 5 Gold's worth, then the NPC will spawn
	if(coinCount > 5*goldWorth) return true;
	return false;
  • New attribute for Tiles, "furniture" - set it to "comfort" or "flatSurface" and the tile can be used to attract NPCs.
  • Fixed bug causing items without recipes to have a 'stack' value of zero.



  • Made a more descriptive error message regarding invalid tile names in recipes


  • Implemented new method for specifying recipes for items. Example:
Items=1 Iron Bar,1 Sealed Death Lance,3 Death Essence
  • Backwards compatibility has been implemented


  • Implemented some stuff that should resolve issues with white boxes appearing around sprites.
  • Implemented "code" attribute for Items, NPCs, Tiles, Buffs, and Projectiles. This attribute overrides the presence of a .cs file for the item.
    • You set the attribute to the name of the item whose code you want to use.
    • The referenced item must be in the same mod pack
  • Implemented "texture" attribute. This attribute overrides the presence of a .png file for the item. Same rules apply - set it to the name of the item whose image you want to use, and the item has to be in the same mod pack.
  • Implemented "parent" attribute. Give it the name of an item which you want to inherit attributes from. For now it only inherits from [Stats], not from the recipe stuff. Also, it doesn't work with default items (yet). It only works with items in the same modpack. Example - A version of the Death Lance that deals more damage:
parent=Death Lance
Iron Bar=0


  • Fixed stuff. It no longer overwrites all the files, but it will simply not care whether or not you use the item's name or "Stats" as the section name.


  • Implemented ability to change shops - you can specify what items NPCs sell and their requirements (nightTime, bloodMoon, etc.). This probably only works with existing NPCs right now.
    • In order to do this, you create a method called SetupShop(Chest chest) in the NPC .cs file and add items to the chest, like this:
public static void SetupShop(Chest chest) {
 int index=0;
 chest.item[index].SetDefaults("Mining Helmet");
    • You can, of course, add if statements to check certain conditions.
  • INI files now have "Stats" as the main section - it no longer needs to be the name of the item. Backwards compatibility has been implemented - it should automatically update the files appropriately. No longer will people discover that their mod isn't working because their section name wasn't spelled the same as their filename.



  • Fixed some bugs
    • The scale attribute should work properly for everyone.
    • Reloading mods should actually work now


  • Updated the tConfig Settings menu. You can now flip through pages and pages of mods to enable or disable at your leisure!
  • When changing what mods are on, it no longer needs to completely restart the game, but it does re-initialize just about everything. There may be bugs here - as always, let me know if there any problems.
  • The "scale" attribute for everything is going to forcefully have any commas replaced with a period. I need everyone to let me know of any odd behavior with items (such as having extremely large spears taking up the whole screen) so that I can determine the cause. I've been getting conflicting reports about the behavior of this attribute.


  • You can now have multiple drop tables loaded in different mod packs. Be wary about potentially conflicting table names. If this occurs, the game should throw an error when it loads.
  • Note that only one copy of "Chests.ini" will be loaded. There is no way to load multiple settings for this at once, it just doesn't make sense. For this reason, I recommend making an entirely separate mod pack for this file so there isn't any confusion about how items are being placed in chests when you generate a world. I'll try to think of a better solution.


  • NPCs now use the new method for drops. Now you simply create a section called "Drops" and put stuff in there, like so:
1 Ancient Dragon Scale Mail=5
2-5 Bomb=10
*High Level Coins=20
  • In this case, it has a 5% chance of dropping Ancient Dragon Scale Mail, a 10% chance of dropping bombs, and a 20% chance of dropping coins from the High Level Coins drop table.
  • Yes, this does break compatibility with existing NPC drops! Sorry!
  • You can now do this with Tiles as well! Same deal, create a section called "Drops" and whatnot. Will only work for tiles that are bigger than 1 by 1, or if the "special" attribute is set to True. The "DropName" attribute still works, so there won't be any compatibility issues here.


  • Implemented ability to change how items spawn in chests during world generation
    • I re-created the entirety of the default spawn system, great as an example, download here
    • You can create "Drop Tables" in DropTables.ini, which are lists of items and the % chance of dropping that item.
    • Most of the 'tables' in my example are lists of items all with 100% chance of dropping - this is because we want it to randomly select one of them, with them all having an equal chance. This is something the game's chest spawn code does a lot.
    • You can put a reference to another drop table as an item - put an asterisk (*) in front of its name to let it know it's a drop table name.
    • Chests.ini contains lists as well, but works slightly differently. For each "region" you define what items can appear in the chest based on the region it appears in.
    • Drop tables will ideally be used in conjunction with NPCs and/or other things in the future
    • I looked at some statistical data to see how close my drop tables are to the game's normal results, and I think it's almost the same.
    • Feedback is welcome! I have a few ideas of how to improve the system further, but I figured this is a good start.


  • Fixed issue with custom NPCs being invisible in multiplayer


  • Fixed issue with arguments not being passed to custom methods for NPCs and Items
  • Added new custom method for NPCs: bool SpawnNPC(int x, int y, int playerID)
    • The x,y values correspond to a tile location. You can easily make an NPC spawn based on tile type by checking Main.tile[x,y].type
    • Use variables such as Main.worldSurface, Main.rockLayer, Main.dayTime, Main.bloodMoon, Main.player[playerID].zoneMeteor, etc.
    • Make it return true if you want the NPC to spawn. Simple Example:
public static bool SpawnNPC(int x, int y, int playerID) {
	if (y <= Main.worldSurface && Main.rand.Next(2)==1) return true;
	return false;



  • Fixed - using tiles as crafting stations


  • Added yet another method call for tiles: UpdateFrame(int x, int y)
    • This allows you to have complete control over the image frames.
  • At the moment, you need to set "special=True" for 1 by 1 tiles for it to call this method, as well as the UpdateTile() method. I might change this.
  • Fixed issue with custom items not being marked as Material


  • Created a method for accessing variables from other items' code
    • Config.GetCustomVar(string classType, string name, string varName)
    • Or Config.GetCustomVar(string classType, int type, string varName)
    • Example usage - gets the Vector2 array from the Green Portal tile code object:
Vector2[] portalLocations = (Vector2[])Config.GetCustomVar("tile", "Green Portal", "portalLocations");
    • It returns null if the code object doesn't exist, the variable doesn't exist, or if the variable isn't public
    • You need to make sure you cast it to the correct type
  • Added UpdateTile() method, which gets called every tick.
    • I've updated my portal tile so that you get teleported when you stand near it.
    • Of course, you can do all sorts of things based on whether the player is standing on or near the tile. If you wanted to, you could apply effects to them similar to buff effects, except they only take effect while near the tile. You could conceivably make tiles that damage enemies - you'd just have to loop through the array of NPCs, check their location, and if they're standing on your tile, damage them. Hah, even cooler would be a tile which shoots projectiles - an automated turret?
    • I've updated the download link for the portal tile, download here


  • Added ability to save/load data associated with the world. Create these methods in your .cs file:
    • SaveWorld(BinaryWriter writer)
    • LoadWorld(BinaryReader reader)
  • This is currently implemented for buffs and tiles
  • More methods for tiles:
    • PlaceTile(int x, int y)
    • DestroyTile(int x, int y)
  • Check out the example (work-in-progress) Portal tile, download here



  • Fixed problem with NPCs disappearing in multiplayer


  • Added new parameter to Status methods for projectiles, signatures looks like this:
    • StatusNPC(NPC npc, Projectile p)
    • StatusPlayer(Player p, Projectile p)
    • StatusPvP(Player p, Projectile p)
  • Renamed "MyReflection" class to "Config"
  • Made some huge improvements to my random number algorithm used for randomization.
  • Moved the following variables into the Config class:
    • public static IniFile[] tileFile;
    • public static string[] tileFolder;
    • public static Dictionary<string, int> tileID = new Dictionary<string, int>();
    • public static string[] tileLoad;
    • public static string[] tileDropName;
    • public static int[] tileHeight;
    • public static int[] tileWidth;
    • public static int[] tilePretendType;
    • public static string[] wallFolder;
    • public static Dictionary<string, int> wallID = new Dictionary<string, int>();
    • public static string[] wallLoad;
    • public static string[] wallName;
    • public static IniFile[] wallFile;
  • Tile method called when you use a tile: UseTile(Player player)
    • You can now have it set the spawn point, but the tile needs to have the attribute "spawn" set to True.
    • Creating custom doors is now possible, but NPCs won't use them. There's a separate tile for the closed and open versions of the door, and in the INI files, you set "doorType=open" if it's an open door, or "doorType=closed" if it's a closed door. Then you call a function, Config.OpenCustomDoor(), or Config.CloseCustomDoor() in the UseItem() method that you create for the tile. I've added an example Stone Door to the example mod pack .
  • Updated the installer to use the current working directory when it is unable to obtain the Steam path.


  • Added readme.txt containing required copyright notice about the .Net port of bsdiff (it gets extracted to your terraria folder).
  • All custom methods can choose to not have any parameters if it doesn't need them - this means you could have just the Player accepted as an argument to a buff method if you don't have any use for the buffType and buffIndex values.
  • Updated Buff method calls to take more parameters.
    • EffectsStart(Player p, int buffType, int buffIndex)
    • EffectsEnd(Player p, int buffType)
    • Effects(Player p, int buffType, int buffIndex)
    • NPCEffects(NPC npc, int buffType, int buffIndex)
  • Added two new buff method calls for NPCs
    • NPCEffectsStart(NPC npc, int buffType, int buffIndex)
    • NPCEffectsEnd(NPC npc, int buffType)
  • Moved various NPC variables into the MyReflection class:
    • public static Dictionary<string, string> npcFolder = new Dictionary<string, string>();
    • public static Dictionary<int, string> npcName = new Dictionary<int, string>();
    • public static Dictionary<string, IniFile> npcFile = new Dictionary<string, IniFile>();
    • public static Dictionary<string, object> npcCode = new Dictionary<string, object>();
  • Fixed some errors with calling methods for NPCs - fixed before you got to experience it! +1 Bug Squashing points to me!
  • Changed the registry that the installer looks in - it now looks in HKEY_CURRENT_USER
  • I think I forgot to mention that I have made it so that Knockback is a displayed value when you look at an item's stats.


  • Fixed a problem with calling custom methods - this was causing buffs to epic fail, and probably the projectiles too.
  • The Registry is now accessed to get the location of the Steam folder.
  • As noted in the previous entry, certain arrays for projectiles and buffs have been moved to a different class. This means that some code may need to be updated. The following variables are now in the class MyReflection:
    • public static IniFile[] buffFile;
    • public static string[] buffFolder;
    • public static Dictionary<string, int> buffID = new Dictionary<string, int>();
    • public static string[] buffLoad;
    • public static object[] buffCode;
    • public static IniFile[] projectileFile;
    • public static string[] projectileFolder;
    • public static Dictionary<string, int> projectileID = new Dictionary<string, int>();
    • public static string[] projectileName;
    • public static object[] projectileCode;

0.26.0 (Unstable)

  • May have fixed some bugs with loading recipes. I am thinking about changing it so that you simply list all of the required tiles in a comma-separated list.
  • Might have fixed issue with NPCs not spawning with max health - haven't tested it yet.
  • Began work on improving the performance of the game. Trying to use arrays instead of dictionaries where possible, but this also means I've had to rewrite code in various places, so something could be broken somewhere... Changes so far affect projectiles and buffs.
  • I've written a function that makes it easier than ever for me to load a custom method.
  • Custom method StatusPlayer(Player p) is loaded for projectiles - somewhat limited in use right now, but if an enemy does shoot projectiles, you can add a debuff effect to it.
  • You can also have projectiles load StatusPvP(Player p) for adding effects in player versus player combat.
  • Custom tiles can be used as crafting stations, but the items that appear in the crafting list won't disappear when you move away from the tile.
  • Made an awesome installer, and added support for the Terraria Game Launcher (well, it's required now).
  • Download newest version here (Warning: Stuff is broken!):
    • Keep a backup of your save files, since apparently there's some issue with using potions according to one person
  • Server download here:
  • Note that the server will still require all the DLL files that the tConfig Installer places in your Terraria folder.
  • Instructions: Install Terraria Game Launcher and then run tConfig Installer.exe (you can run it from anywhere! I think!)
  • Example mod pack link:
  • Regarding Issues with the new installer:
    • First, make sure the game launcher is installed
    • It attempts to locate your program files folder, but if Steam isn't installed there, it won't work. I'll be looking into a different way to do this...
    • For now, use the previous version of the mod if you're not a fan of broken things :P



  • Tiles are loaded before items now, so custom tiles should be able to be used as crafting stations
    • Didn't work - got more stuff to change for this
  • New functions for buffs: EffectsStart(Player p) is called when a buff is added, EffectsEnd(Player p) is called when a buff ends.
  • Added ability to change how tiles are destroyed
    • New tile attributes: pick, axe, and hammer
      • These are floating point numbers which represent how quickly the tile can be destroyed. The higher the value, the faster your item will destroy it. The value is multiplied by the item's pick/axe/hammer attribute.
    • New tile attributes: minPick, minAxe, and minHammer
      • These are integer values that represent the minimum item value required - for instance, a tile with minPick=50 requires that the pickaxe used has a pick attribute >= 50.
    • You should be able to change this for existing tiles as well.


  • Added ability to create new buffs
    • Attributes are: id, tip, and debuff. Example:
tip=You can't move!
    • It loads the functions "Effects" and "NPCEffects" like so:
public static void Effects(Player player) {

public static void NPCEffects(NPC npc) {
	npc.velocity.X = 0;
	npc.velocity.Y = 0;
    • To inflict enemies with this debuff, make the weapon's .cs file do something like this:
public static void StatusNPC(NPC npc) {
	npc.AddBuff(Config.buffID["Paralysis"], 360, false); //Paralyze them!
    • This example doesn't exactly work as expected - you'll still move, but so slowly it barely makes a difference. I'll have to play around with it some more to see if I can actually make it impossible to move.
    • Use the item attribute "buffName" to make an item use a custom buff
  • Loads new function for items, UseItemEffect, to handle dust particle effects or lighting effects (mostly for weapons). Example (similar to Fiery Greatsword effect):
public static void UseItemEffect(Player player, Rectangle rectangle) {
	Color color = new Color();
	int dust = Dust.NewDust(new Vector2((float) rectangle.X, (float) rectangle.Y), rectangle.Width, rectangle.Height, 6, (player.velocity.X * 0.2f) + (player.direction * 3), player.velocity.Y * 0.2f, 100, color, 1.9f);
	Main.dust[dust].noGravity = true;

  • Randomization - I've updated it so that it no longer generates a mod pack, and instead it adds some numbers to the end of the item name that indicate its attribute changes
  • To use this feature:
    • Set "randomized=True" under [Config] in Config Mod.ini
    • Create a file called "Randomize.ini" like the following:
;variance is the percentage of possible increase or decrease
    • Generate a world, and have fun!
  • The idea of the configuration is to allow you to tweak the balance of the randomization. For now, it only handles number attributes, and the way it works is it (in theory) makes the higher values more rare, with the rarest value occurring with the bestChance%. In this example, most attributes have a 5% chance to be increased by 50%. If I wrote my code correctly, this also means that there is roughly a 6% chance to increase the attribute by, say, 48%.
  • If your player character has randomized items on it, it will not be playable on vanilla Terraria, and it will not be playable with the "randomized" setting set to False.
  • If you generate a world and then make changes to Randomize.ini, you will probably end up changing the values of the randomized items.
  • When playing multiplayer, make sure you have the same Randomize.ini file as the server for best results. It doesn't check for this currently, but I will add in this check in the future.


  • Recipes array is now allocated according to the number of custom items you have, so there should really be no limit now.
  • Played around some more with Randomization feature - I'll post more about it later.


  • Fixed more issues with placing tiles. >.>
  • Fixed annoying issue with it saving default wall/tile files in a mod pack.
  • Began some work on optional randomization of items during world generation. I'm not yet sure whether the current implementation will stay the way it is, but I would like some feedback on its current state. So, here's how it currently works:
    • In "Config Mod.ini" section [Config], add "randomized=True" - this tells it to generate a Mod Pack by randomly modifying some item attributes of default items.
    • Edit (or create) the file "Randomize.ini" in your Terraria save folder, and add something like the following:
    • Currently it only allows you to modify integer and float values, but of course this will be added to in the future.
    • The basic idea is each section name is the name of the item attribute to modify, and each value under it tells it what prefix to add to the name of the item, the chances of adding this modifier (out of 100), and a multiplier value to multiply the attribute by.
    • Using the above example, you can get something like a Strong Piercing Flaming Arrow which is a Flaming Arrow that deals greater damage and has greater knockback. Or you could get a Rotten Healing Potion which only restores half the amount of health that it normally would.
    • The items that are randomized are ones that are placed in chests when the world is generated, so it doesn't affect item drops yet.
    • The mod pack will be called "Randomized" and after you've created a world, you must exit the game and then manually load this mod pack before you start playing on it (otherwise, the randomized items won't load at all). For this reason, I will try to come up with a way to do this that doesn't involve mod packs at all.



  • Fixed more problems with placing tiles
  • Fixed server


  • All images (except for the Re-logic splash) can be loaded from mod packs
  • Fixed problem with placing tiles with a height > 2 (I think)
  • Fixed issue with certain items not being loaded from mod packs
  • The color attribute should get loaded properly now.


  • Fixed problem with loading textures from the Images folder
  • Added "DropName" attribute to walls


  • Added basic support for Walls. They have only one attribute, "House", which I would guess indicates whether or not monsters spawn there and whether or not NPCs can move in. I have plans for adding more features, like adding item drops.
  • Use the new item attribute "createWallName" to place a wall with it.


  • Added new option to Config Mod.ini, "saveDebug" which is False by default, and determines whether debug output is written to a file.
  • Fixed issue with compiling code.
  • Added "animationType" attribute for NPCs. Use this in combination with a sprite that has the same number of frames as the NPC you are mimicking.
  • Textures will now be loaded from the "Images" folder in a mod pack, if it has one.



  • Split the main ini file into two files
    • Config Mod.ini contains tConfig-specific settings, like which mod packs are turned on
    • Config Mod Global Settings.ini contains everything else. This file will need to be the same as the one on the server when playing multiplayer.


  • Fixed issue with dropping custom items in multiplayer
  • Unfortunately, if you try to drop a default item, it doesn't want to have any velocity and comes right back to you immediately.


  • Files from default folders are not loaded anymore. Now, they are only there to show you what the default values are. If you want to modify an existing file, place it in a mod pack.
  • Started work on multiplayer support. It is accessible now but it is certainly not guaranteed to work.
  • Note that you can only connect to tConfig servers, and only if you have the same mod packs and Config Mod.ini.
  • I have verified that custom NPCs don't work and you can't drop custom items (they'll disappear).
  • I recommend you backup your save files before trying multiplayer.



  • Added new attribute for tiles, PretendType. Set it to the id value for an existing tile and it will act like that tile, in some ways. It allows you to, for instance, create a new type of platform, like the included Stone Platform example. More functionality will be added to this in the future, hopefully. For now it's just using the attribute when checking what frame a tile should be on.
  • I came up with a solution to problems with tiles not being preserved when loading a world with different modpacks and/or tiles loaded. When a world is saved, it creates a file associated with the world containing some data which ensures that it always loads the tiles properly.
  • In addition, if a tile in the world doesn't exist, the load will fail. You can deal with this though, if you have an idea of what the tile is. Check Debug Output.txt for the id value of the tile that it failed to load, and then add it to the tiles.ini file for the world. The file is contained in the same folder as the world save files, and each line specifies an id number and the name of the tile associated with it. It looks something like this:
107=Red Bed
108=Red Roof
109=Stone Platform



  • Fixed bug with mediumcore characters. They should now drop items properly.


  • Fixed default projectiles
  • Game now quits when it fails to load an image.


  • Tiles with a height of 1 and width > 1 should be placed properly now
  • Added two new attributes to Projectiles: aiPretendType and killPretendType
  • This should allow you to, for instance, make an arrow projectile that explodes on impact by setting killPretendType to the type value of a projectile that does this.
  • Also, you can get spears working by setting the aiPretendType to that of a spear. You can probably do this for other things as well, such as flails.



  • Fixed issue with opening inventory while near custom tiles
  • Fixed issue with placing 1x1 tiles.
  • Fixed issue with modifying recipes of existing items (again).
  • The game will now quit and show a message if it fails to load certain things.


  • Fixed issue with placing built-in tiles


  • Tiles are much easier to work with now. No code required. Use the new "Width" and "Height" attributes - the numbers should represent the number of tile space taken up. For example, if you took the sprite for the Table, and made a custom tile version of it, the Width is 3, and the Height is 2.
  • Remember that everything is case sensitive in the INI files. All the attributes for tiles start with a capital letter.
  • As noted in a previous entry here, set the "id" attribute to -1 for custom tiles, and the "DropName" attribute can be used to specify what item is dropped when the tile is destroyed.
  • Custom tiles can only be destroyed with a pickaxe - this is being worked on.



  • Fixed issue with custom item materials with recipes not getting loaded


  • Fixed issue with custom items appearing invisible in the crafting list


  • Loads a function called "UseItem" from the item's code. At the very least, you can now summon monsters/bosses. Use something like the following in your item's .cs file to summon King Slime.
public static void UseItem(Player player, int playerID) {
	Main.PlaySound(15, (int) player.position.X, (int) player.position.Y, 0);
	NPC.SpawnOnPlayer(playerID, 50);


  • Also loads a function called "PlayerFrame" (from the body armor code) where you can put in particle effects code for armor sets. Again, I hope to come up with examples, but I don't have any right now.


  • Loads code for NPC AI, Projectile AI and Kill
  • I will try to come up with good examples. Kill() is actually called by AI() when it sees that an arrow has hit a tile, for instance. Then Kill() decides whether to drop an item, or blow up a bunch of nearby tiles, or whatever. Maybe I'll make a new type of arrow that blows up tiles. For an NPC AI example, the best thing to do would be to create an entirely new NPC, but I'm not a sprite artist, so I'll probably make a modified version of an existing NPC.



  • You can now add offensive buffs to weapons and projectiles. Add a function called "StatusNPC" into the .cs file for the item or projectile. Examples follow:
    • Adds 33% chance to make enemy catch on fire. The second parameter to AddBuff is for length, but I don't think it's in seconds.
public static void StatusNPC(NPC npc) {
	if (Main.rand.Next(3) == 0) {
		npc.AddBuff(24, 180, false);
    • Adds 100% chance to poison the enemy.
public static void StatusNPC(NPC npc) {
	npc.AddBuff(20, 180, false);
  • Tiles can now be modified, and new ones can be added in Mod Packs. There's a lot more work to do in this area, but you can do some basic things now. Create a function called "PlaceTile" in the .cs file for the Tile. Examples:
  • I added a 'DropName' attribute for Tiles so you can specify what item is dropped when it is destroyed.
  • Added 'createTileName' attribute for items. You can use it to override 'createTile' when you want it to create a custom tile.
  • Set 'id' to -1 for custom Tiles (with custom images).



  • Forget all that Lua stuff, I've got some awesome C# runtime compilation working now. Here's some examples of stuff:


public static void FindFrame(NPC npc, int currentFrame) {
	if (npc.aiAction==0 && (npc.velocity.Y != 0 || npc.velocity.X != 0)) {
	if (npc.aiAction==1) {
	if (npc.frameCounter >= 16) {

Red Hero's Shirt.cs:

public static void Effects(Player player) {
	player.magicDamage += 0.15f;
	player.lifeRegen += 20;
	player.statDefense += 5;

public static void SetBonus(Player player) {
	player.setBonus = "10 Defense";
	player.statDefense += 10;



  • You can now add effects to armor/accessories, and set bonus effects to armor. For effects, create a file called "itemname.lua" where itemname is the name of the item. Create a function called Effects that takes player as an argument, like this:
function Effects(player)
	player.magicDamage = player.magicDamage + 0.15
	player.lifeRegen = player.lifeRegen + 20

For set bonuses, you need to set the variable called "setName" in each armor item piece - when you're wearing three armor pieces with the same setName it will call the SetBonus function in the script for the body. For instance, I have a Red Hero's Shirt item that is the body armor, so the script called Red Hero's Shirt.lua needs code similar to the following:

function SetBonus(player)
	player.setBonus = "10 Defense"
	player.statDefense = player.statDefense + 10

If the script doesn't have an Effects function, the game might fail to work properly, so you can include a blank one like this:

function Effects(player)



  • Space for Armor textures is now automatically allocated accordingly.



  • Added "useAmmoName" and "ammoName" variables to Items to replace "ammo" and "useAmmo" when using a custom projectile. Might need some more tweaking.


  • Introduction of lua scripting interface. For custom NPCs (with new images), you'll need to make a .lua file named after the NPC, and create a FindFrame() function. Here's an example that works somewhat like the slime code:
function FindFrame(npc, currentFrame)
 npc.frameCounter= npc.frameCounter+1
 if npc.aiAction==0 and (npc.velocity.Y ~= 0 or npc.velocity.X ~= 0) then
  npc.frameCounter = npc.frameCounter+1
 if npc.aiAction==1 then
 if npc.frameCounter >= 16 then

Always check Debug Output.txt if you're not sure what's going on. If you're script fails to load, a message will appear there.

  • - Fixed something, I guess.
  • - It now deletes names of mod pack folders from Config Mod.ini for any folders that have been deleted.


  • Fixed projectiles. For real. I hope.


  • NPCs with custom images can be created. Set the type to -1 and name the image the same as the NPC, like you do with custom items. Make sure you add a variable "frameCount" to indicate how many frames are in the image.
  • Looks like they're not switching between frames right now, I'm working on it.


  • You can now modify how NPCs spawn. This is somewhat experimental and I might need to change around how this works - try it out and let me know how well it works for you. I'm at least thinking that I'll have to rename some of these variables, because "underground" actually seems to be above ground. Check out the Debug Output.txt for details on how it's trying to spawn your NPCs.

Add a section called "Spawn" to an NPC .ini file. The following is an example showing the variables you can use. Each variable is the % chance of spawning under a certain condition (location or time of day). Note however that since the chance is set to 100%, this NPC is the only NPC that will spawn in these conditions. Also, if you leave out any of these variables, they will default to 0.


Each value that pertains to the current conditions is multiplied together. If there is a 50% chance to spawn at night, and 75% chance to spawn in the jungle, then if it's nighttime, and you're in a jungle, then the NPC will have a 100*.5*.75=37.5% chance to spawn.


  • Fixed armor textures not loading properly


  • You can now modify what loot drops from NPCs. It doesn't write the default loot drops due to the way the code is written - if you add loot drops, it will not use the defaults at all (although money and boss stuff still occurs). In the NPC .ini file, add a section for the item you wish it to drop. For instance:
[Hellstone Bar]

Will make the NPC drop between 1 and 5 hellstone bars 50% of the time. The chance parameter defaults to 100 and can be left out; maxAmount can also be left out and it will default to the minAmount. So you can also have:

[Hellstone Bar]

To drop 5 hellstone bars 100% of the time.


  • Fixed weirdness with projectiles.


  • You can now modify NPCs, and have modified NPCs included in mod packs. Ability to create new ones not yet added.
  • Changed the way textures are loaded, should be faster. Removed ability to replace images, for now. There is a limit to how many textures can be loaded, but unless you make like a whole bunch of custom items, it shouldn't be a problem. I plan on making the max amount of textures be calculated based on the number of custom items/stuff you have in your folders.


  • Actually, I broke stuff. Fixed it!


  • Modified recipes in Mod Packs work as expected now


  • The mod automatically detects mod packs and adds them to the INI file. It was supposed to do this before, but didn't due to a silly mistake. Now, just copy a mod pack into the ModPacks folder, and go into the tConfig Settings menu to enable it.


  • Projectile folder is created in mod packs automatically now.


  • Custom projectiles can be added, with custom images, and work in Mod Packs. Set the type to -1 if using a custom image.
  • Items now have a "projectile" attribute which you can use to input the name of the projectile to use. It overrides the "shoot" attribute, and is required for custom projectiles - it can be used for built-in projectiles as well.


  • Fixed world generation error
  • Added tConfig Settings menu - currently allows you to enable/disable mod packs. If you change a setting in this menu, clicking "Restart Game" will restart the game to ensure the mod packs are loaded correctly. You can also click "Cancel" to disregard changes and go back to the previous menu.



  • Fixed issue with iron tools/weapons default recipes not getting saved to file


  • Projectiles can now be modified. It's fun making the Demon Scythe able to go through walls xD. You can't yet add new ones, and they won't be loaded from mod packs yet.


  • Added light and wetLight attributes to items. wetLight is the light it gives while wet, and light is for when it's not wet. Note that this doesn't work on Orb Of Light, since the light comes from a buff effect.


  • You can now make armor properly! See the example Red Hero's Outfit for details.
  • Changed how the images are loaded, might be faster


This is the oldest archive we have. Sorry!