Blog - Terraria Mods, technical explorations 01

Page / - last modified by Victor Zhang on 00:27, 22/07/2020

Terraria Mods, technical explorations 01

last modified by Victor Zhang

on 00:27, 22/07/2020

Table of Contents

The tModLoader ships with Terraria, so it means now it updates automatically with steam

Need to look out for API changes

TModLoader all classes

Useful vanilla fields

I don't get why the document isn't with TModLoader APIs (even appendix)

Vanilla sound IDs

Examplemod somehow has an Error in ExampleCritter.cs, so had to download the source and recompile, rightnow muted the autoupdate override of the item, however still can't findout where the out of index comes from, error message stack trace:
System.IndexOutOfRangeException: Index was outside the bounds of the array.
at ExampleMod.NPCs.ExampleCritterNPC.HookStatue(ILContext il) in ExampleMod\NPCs\ExampleCritter.cs:line 0
at MonoMod.Cil.ILContext.Invoke(Manipulator manip)
at MonoMod.RuntimeDetour.ILHook.Context.InvokeManipulator(MethodDefinition def, Manipulator cb)
at MonoMod.RuntimeDetour.ILHook.Context.Refresh()
at MonoMod.RuntimeDetour.ILHook.Apply()
at MonoMod.RuntimeDetour.ILHook..ctor(MethodBase from, Manipulator manipulator, ILHookConfig& config)
at MonoMod.RuntimeDetour.HookGen.HookEndpoint._NewILHook(MethodBase from, Manipulator to)
at MonoMod.RuntimeDetour.HookGen.HookEndpoint._Add[TDelegate](Func`3 gen, TDelegate hookDelegate)
at MonoMod.RuntimeDetour.HookGen.HookEndpoint.Modify(Delegate hookDelegate)
at MonoMod.RuntimeDetour.HookGen.HookEndpointManager.Modify(MethodBase method, Delegate callback)
at IL.Terraria.Wiring.add_HitWireSingle(Manipulator )
at ExampleMod.NPCs.ExampleCritterNPC.Autoload(String& name) in ExampleMod\NPCs\ExampleCritter.cs:line 19
at Terraria.ModLoader.Mod.AutoloadNPC(Type type)
at Terraria.ModLoader.Mod.Autoload()
at Terraria.ModLoader.ModContent.<>c.<Load>b__38_0(Mod mod)
at Terraria.ModLoader.ModContent.LoadModContent(CancellationToken token, Action`1 loadAction)
at Terraria.ModLoader.ModContent.Load(CancellationToken token)
at Terraria.ModLoader.ModLoader.Load(CancellationToken token)

Seems no one else raises the issue on the issue page?

Need to pay follow the updates

Study on the example item:

The item sound seems inconsistant between when classify as weapon and when classify as connsumable(like potion), same sound id gives different sound, but managable, just need trial and error

Item will not be able to be consumed unless overriding UseItem and return true:public override bool UseItem(Player player){
return true;
}

Also , can have UseItem(Item item, Player player)

Player according to the vanilla field can not set currentHP, so there's probably no way to directly self-inflict damage

However, it might be possible to spawn an enemy projectile that does the damage and change world state

Did not find any world state extention method, but seems possible as vanilla has world fields, need to find how to extend them

Study on ExampleMod:

Chasing projectile possible, look at the wisp example.

Custom properties with mount might be possible

The example mount car has 3 balloons that can be damaged when player take damage, also in comment, syncing modplayer can even have functional use

Same reason, the mounted mg like metal-slug style might be achievable

Tilting with terrain seems not possible, it loads static spritesheet from <mount>_Back.png and <mount>_Front.png

Posted by Victor Zhang · Permalink