<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.play.eco/en/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=WugWugg</id>
	<title>Eco - English Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.play.eco/en/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=WugWugg"/>
	<link rel="alternate" type="text/html" href="https://wiki.play.eco/en/Special:Contributions/WugWugg"/>
	<updated>2026-06-04T03:42:18Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://wiki.play.eco/en/index.php?title=Helpful_Examples_for_Modding&amp;diff=16809</id>
		<title>Helpful Examples for Modding</title>
		<link rel="alternate" type="text/html" href="https://wiki.play.eco/en/index.php?title=Helpful_Examples_for_Modding&amp;diff=16809"/>
		<updated>2026-05-25T19:45:22Z</updated>

		<summary type="html">&lt;p&gt;WugWugg: /* Players Interactions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction =&lt;br /&gt;
Covers helpful examples of complex topics within Eco modding. Provides example code snippets.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a project file structure that covers all the basic functionality:&lt;br /&gt;
 MyProject&lt;br /&gt;
  ├─ Plugin.cs&lt;br /&gt;
  ├─ Logger.cs&lt;br /&gt;
  ├─ ChatCommands.cs &lt;br /&gt;
  └─ Registration.cs&lt;br /&gt;
&lt;br /&gt;
= Plugin.cs =&lt;br /&gt;
Here&#039;s the structure to start with:&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
namespace MyProject&lt;br /&gt;
{&lt;br /&gt;
    [SupportedOSPlatform(&amp;quot;windows7.0&amp;quot;)]&lt;br /&gt;
    public class MyProjectPlugin&lt;br /&gt;
    {&lt;br /&gt;
        // Used with chat commands and for release tracking&lt;br /&gt;
        public const string VERSION = &amp;quot;v0.0.0&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;code&amp;gt;[SupportedOSPlatform(&amp;quot;windows7.0&amp;quot;)]&amp;lt;/code&amp;gt; is here to silence some annoying warnings. It&#039;s optional.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;VERSION&amp;lt;/code&amp;gt; is defined here because it&#039;s the main code and when that code gets an update the version number should change too. &lt;br /&gt;
&lt;br /&gt;
This example is using semantic versioning. It uses 3 numbers: major version, minor version, and patch version. It can be useful to help communicate how big of an update is made. For example, &amp;lt;code&amp;gt;v2.0.0&amp;lt;/code&amp;gt; is a whole major version away from &amp;lt;code&amp;gt;v1.0.0&amp;lt;/code&amp;gt;. That indicates a lot of changes. But something like &amp;lt;code&amp;gt;v1.0.1&amp;lt;/code&amp;gt; is only a small patch away from &amp;lt;code&amp;gt;v1.0.0&amp;lt;/code&amp;gt;. That signals something very trivial has changed. To get a better understanding Google &amp;quot;semantic versioning&amp;quot; and read more.&lt;br /&gt;
&lt;br /&gt;
With all that said, &amp;lt;code&amp;gt;v1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;v2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;v3&amp;lt;/code&amp;gt;... &amp;lt;code&amp;gt;v1058&amp;lt;/code&amp;gt;. Is perfectly valid way of versioning too!&lt;br /&gt;
&lt;br /&gt;
=== IModKitPlugin ===&lt;br /&gt;
This is what makes Eco&#039;s code include this mods code into the game. &#039;&#039;Generally&#039;&#039;, this is implemented only once per mod.&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;using Eco.Core.Plugins.Interfaces;&lt;br /&gt;
using Eco.Shared.Localization;&lt;br /&gt;
&lt;br /&gt;
namespace MyProject&lt;br /&gt;
{&lt;br /&gt;
    [SupportedOSPlatform(&amp;quot;windows7.0&amp;quot;)]&lt;br /&gt;
    public class MyProjectPlugin : IModKitPlugin&lt;br /&gt;
    {&lt;br /&gt;
        // Used with chat commands and for release tracking&lt;br /&gt;
        public const string VERSION = &amp;quot;v0.0.0&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        #region IModKitPlugin&lt;br /&gt;
        public string GetCategory() =&amp;gt; &amp;quot;Mods&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        private string _status = &amp;quot;Created...&amp;quot;;&lt;br /&gt;
        public string GetStatus() =&amp;gt; Localizer.DoStr($&amp;quot;Status: {_status}&amp;quot;);&lt;br /&gt;
        #endregion&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Line 4:&#039;&#039;&#039; Added&amp;lt;code&amp;gt;IModKitPlugin&amp;lt;/code&amp;gt;to the class.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;#region IModKiPlugin&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;#endregion&amp;lt;/code&amp;gt; is optional and just let&#039;s the editor know how to collapse code that is related.&lt;br /&gt;
&lt;br /&gt;
The two fields that this interface needs are &amp;lt;code&amp;gt;GetCategory()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;GetStatus()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 13:&#039;&#039;&#039; Some mod author&#039;s prefer to set the category to their mod in specific. For example, &amp;quot;MyProject&amp;quot; instead of the general purpose &amp;quot;Mods&amp;quot;. This value will affect where it shows up on the Server GUI.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 15-16:&#039;&#039;&#039; &amp;lt;code&amp;gt;_status&amp;lt;/code&amp;gt; is defined as private to only allow this class to alter it&#039;s status. See sections on &amp;lt;code&amp;gt;IInitializablePlugin&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;IShutdownablePlugin&amp;lt;/code&amp;gt; to see usage.&lt;br /&gt;
&lt;br /&gt;
This interface on it&#039;s own doesn&#039;t &#039;&#039;do&#039;&#039; much. It just gets Eco to pickup on the mod and inject it into the runtime.&lt;br /&gt;
&lt;br /&gt;
=== IInitializablePlugin and IShutdownablePlugin ===&lt;br /&gt;
These two interfaces aren&#039;t required to be implemented at the same time, but often are. That&#039;s because Eco is very event-driven. Meaning often mods are waiting and listening for an event to happen before doing something. To do that listening part, the mod must register &amp;lt;u&amp;gt;and release&amp;lt;/u&amp;gt; itself as to that event.&lt;br /&gt;
&lt;br /&gt;
One example of a method used to listen to game actions is &amp;lt;code&amp;gt;ActionUtil.AddListener()&amp;lt;/code&amp;gt;. This method will be used and explained in the further section on &amp;lt;code&amp;gt;IGameActionAware&amp;lt;/code&amp;gt; below. For now, the point is that method needs called once on mod startup and once on mod shutdown. Another example would be listening to store&#039;s offers changing with &amp;lt;code&amp;gt;StoreItemData.SellOffersChangedEvent.AddUnique()&amp;lt;/code&amp;gt; which let&#039;s the mod respond to trade offers changing. While this store even won&#039;t be covered here, it&#039;s being mentioned to show how there are many different event sources in Eco&#039;s code. If the mod registers as a listener, then it needs to remove itself as a listener.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;Initialize&amp;lt;/code&amp;gt; function is the first &amp;quot;hook&amp;quot; this mod gets to run code. From here you can access different services and inspect the world. For example, to get a list of all stores:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;var stores = WorldObjectManager.GetWorldObjectsFromComponent(typeof(StoreComponent));&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Outlining all the managers and services in Eco is beyond this page&#039;s scope, but the point is to demonstrate that at this point in the code the game is largely loaded and running.&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;using Eco.Core.Plugins.Interfaces;&lt;br /&gt;
using Eco.Core.Utils;&lt;br /&gt;
using Eco.Gameplay.Components.Store.Internal;&lt;br /&gt;
using Eco.Gameplay.GameActions;&lt;br /&gt;
using Eco.Shared.Localization;&lt;br /&gt;
&lt;br /&gt;
namespace MyProject&lt;br /&gt;
{&lt;br /&gt;
    [SupportedOSPlatform(&amp;quot;windows7.0&amp;quot;)]&lt;br /&gt;
    [Priority(PriorityAttribute.Normal)] // VeryHigh, High, Normal, Low, VeryLow&lt;br /&gt;
    public class MyProjectPlugin: IModKitPlugin, IInitializablePlugin, IShutdownablePlugin&lt;br /&gt;
    {&lt;br /&gt;
        #region IModKitPlugin&lt;br /&gt;
&lt;br /&gt;
        #region IInitializablePlugin&lt;br /&gt;
        public void Initialize(TimedTask timer)&lt;br /&gt;
        {&lt;br /&gt;
            _status = &amp;quot;Initializing...&amp;quot;;&lt;br /&gt;
            // Example Listeners:&lt;br /&gt;
            // StoreItemData.SellOffersChangedEvent.AddUnique(HandleOffersChanged);&lt;br /&gt;
            // ActionUtil.AddListener(this);&lt;br /&gt;
            //&lt;br /&gt;
            // To see when this function is called try something like and run the game:&lt;br /&gt;
            // Logger.Debug(&amp;quot;Initializing MyProject&amp;quot;)&lt;br /&gt;
            _status = &amp;quot;Running&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        #endregion&lt;br /&gt;
&lt;br /&gt;
        #region IShutdownablePlugin&lt;br /&gt;
        public Task ShutdownAsync()&lt;br /&gt;
        {&lt;br /&gt;
            _status = &amp;quot;Stopping...&amp;quot;;&lt;br /&gt;
            // Example Cleanup:&lt;br /&gt;
            //StoreItemData.SellOffersChangedEvent.Remove(HandleOffersChanged);&lt;br /&gt;
            //ActionUtil.RemoveListener(this);&lt;br /&gt;
            //&lt;br /&gt;
            // To see when this function is called try something like and run the game:&lt;br /&gt;
            // Logger.Debug(&amp;quot;Cleaning Up MyProject&amp;quot;)&lt;br /&gt;
            _status = &amp;quot;Stopped&amp;quot;;&lt;br /&gt;
            return Task.CompletedTask;&lt;br /&gt;
        }&lt;br /&gt;
        #endregion&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Line 10:&#039;&#039;&#039; This attribute sets the mod&#039;s load priority. It controls when the mod is loaded in relation to other mods. &amp;lt;code&amp;gt;PriorityAttribute.VeryHigh&amp;lt;/code&amp;gt; is for things that need to start-up first and stop last. It&#039;s not recommended to use this priority unless you know what you are doing. &amp;lt;code&amp;gt;PriorityAttribute.VeryLow&amp;lt;/code&amp;gt; will do the opposite. It will try to load your mod last and stop it first. Useful if you want to wait for other mods to load in and make their changes first.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 11:&#039;&#039;&#039; Added &amp;lt;code&amp;gt;IInitializablePlugin&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;IShutdownablePlugin&amp;lt;/code&amp;gt; to the class.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 14:&#039;&#039;&#039; Notice how &amp;lt;code&amp;gt;TimedTask timer&amp;lt;/code&amp;gt; isn&#039;t being used. That&#039;s because for most mods are quick to initialize and don&#039;t need to report back on their progress. That&#039;s what this timer does. It&#039;s a way for the mod to say &amp;quot;Still loading... 50% done&amp;quot;. You could use it though, something &amp;lt;code&amp;gt;timer.LoadPercentage = (float)doneWork / (float)totalWork;&amp;lt;/code&amp;gt; to report progress. Again, most mods don&#039;t need this because they start in seconds, but nice to know about.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; While it should technically be possible to alter recipes at this point, it&#039;s still very tricky to programatically do it. Changes at this point through &amp;lt;code&amp;gt;RecipeManager&amp;lt;/code&amp;gt; tend to result in crashes or only paritial lists of recipes returned. Don&#039;t let this stop your mod though, just be aware!&lt;br /&gt;
&lt;br /&gt;
=== IConfigurablePlugin ===&lt;br /&gt;
This interface tells Eco that there should be a config file to load and save to when you load this mod.&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
using Eco.Core.Plugins;&lt;br /&gt;
using Eco.Core.Plugins.Interfaces;&lt;br /&gt;
using Eco.Core.Utils;&lt;br /&gt;
using Eco.Gameplay.Components.Store;&lt;br /&gt;
using Eco.Gameplay.Components.Store.Internal;&lt;br /&gt;
using Eco.Gameplay.GameActions;&lt;br /&gt;
using Eco.Gameplay.Items;&lt;br /&gt;
using Eco.Gameplay.Items.Recipes;&lt;br /&gt;
using Eco.Gameplay.Objects;&lt;br /&gt;
using Eco.Mods.TechTree;&lt;br /&gt;
using Eco.Shared.Localization;&lt;br /&gt;
using Eco.Shared.Utils;&lt;br /&gt;
using System.Runtime.Versioning;&lt;br /&gt;
&lt;br /&gt;
namespace MyProject&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    [Localized]&lt;br /&gt;
    public class MyProjectConfiguration : Singleton&amp;lt;MyProjectConfiguration&amp;gt;&lt;br /&gt;
    {&lt;br /&gt;
        [LocDescription(&amp;quot;Optional. Name of the effect to use.&amp;quot;)]&lt;br /&gt;
        public string EffectName { get; set; } = string.Empty;&lt;br /&gt;
&lt;br /&gt;
        [LocDescription(&amp;quot;Required, but has default. The amount of minutes that must pass.&amp;quot;)]&lt;br /&gt;
        public int Duration { get; set; } = 30;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    [SupportedOSPlatform(&amp;quot;windows7.0&amp;quot;)]&lt;br /&gt;
    public class MyProjectPlugin: IModKitPlugin, IInitializablePlugin, IShutdownablePlugin, IConfigurablePlugin&lt;br /&gt;
    {&lt;br /&gt;
        #region IModKitPlugin&lt;br /&gt;
&lt;br /&gt;
        #region IIInitializablePlugin&lt;br /&gt;
&lt;br /&gt;
        #region IShutdownablePlugin&lt;br /&gt;
&lt;br /&gt;
        #region IConfigurablePlugin&lt;br /&gt;
        readonly PluginConfig&amp;lt;MyProjectConfiguration&amp;gt; config = new(&amp;quot;MyProject&amp;quot;);&lt;br /&gt;
        public ThreadSafeAction&amp;lt;object, string&amp;gt; ParamChanged { get; set; } = new();&lt;br /&gt;
        public IPluginConfig PluginConfig =&amp;gt; this.config;&lt;br /&gt;
        public object GetEditObject() =&amp;gt; this.config.Config;&lt;br /&gt;
        public void OnEditObjectChanged(object o, string param)&lt;br /&gt;
        {&lt;br /&gt;
            if (param == &amp;quot;Duration&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                Logger.Info($&amp;quot;Someone changed the MyProject&#039;s duration: {config.Config.Duration}&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
            // Notify downstream&lt;br /&gt;
            ParamChanged.Invoke(o, param);&lt;br /&gt;
            // Write changes to config file&lt;br /&gt;
            this.SaveConfig();&lt;br /&gt;
        }&lt;br /&gt;
        #endregion&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Line 18:&#039;&#039;&#039; &amp;lt;code&amp;gt;[Localized]&amp;lt;/code&amp;gt; makes it so that the variable names are translated and localized for the user on the server GUI. Example, duration (English) might become durée (French) if the user&#039;s game detects that as their local.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 19:&#039;&#039;&#039; The configuration doesn&#039;t need to implement &amp;lt;code&amp;gt;Singleton&amp;lt;MyProjectConfiguration&amp;gt;&amp;lt;/code&amp;gt; but it&#039;s helpful if the mod grows in complexity. What the singleton pattern allows is code from anywhere to get access to the same instance of data. No need to pass it around. If any part of the code wants to see into the config do: &amp;lt;code&amp;gt;MyProjectConfiguration.Obj.Duration&amp;lt;/code&amp;gt;, for example. It might not seem super useful, but as code grows in size it becomes very convenient.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 21:&#039;&#039;&#039; &amp;lt;code&amp;gt;[LocDescription()]&amp;lt;/code&amp;gt; Adds a description to the variable in the server GUI and translates it for the user.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 29:&#039;&#039;&#039; Added &amp;lt;code&amp;gt;IConfigurablePlugin&amp;lt;/code&amp;gt; to the class.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 38:&#039;&#039;&#039; Creates and loads from file the configuration. &amp;lt;code&amp;gt;new(&amp;quot;MyProject&amp;quot;)&amp;lt;/code&amp;gt; is doing a lot of work here. Under the hood Eco is looking for the file in the &amp;lt;code&amp;gt;.../Eco Server/Configs&amp;lt;/code&amp;gt; directory. In this case it&#039;s looking for &amp;lt;code&amp;gt;MyProject.eco&amp;lt;/code&amp;gt;. It also will make the &amp;lt;code&amp;gt;MyProject.eco.template&amp;lt;/code&amp;gt; file from default values too.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 39:&#039;&#039;&#039; This is the hook for other code to listen for changes to this mods config. Not crazy useful, but make sure it does get called when a changed happens. It&#039;s impossible to know if later on some code will use that! Be nice and hook it up. See: line 49 notes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 40:&#039;&#039;&#039; Public access to this mods config as &amp;lt;code&amp;gt;config&amp;lt;/code&amp;gt; is private by default.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 42-47:&#039;&#039;&#039; Require method for this interface and example showing how to detect what changed. At this point &amp;lt;code&amp;gt;o&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;config.Config&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;MyProjectConfiguration.Obj&amp;lt;/code&amp;gt; reference the same data. &amp;lt;code&amp;gt;o&amp;lt;/code&amp;gt; is annoying to use since it&#039;s passed as &amp;lt;code&amp;gt;object&amp;lt;/code&amp;gt;, but the underlying data should be of the form &amp;lt;code&amp;gt;MyProjectConfiguration&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 49:&#039;&#039;&#039; This is the code that actually forwards changes to other parts listening to this mod&#039;s configuration changes. While that doesn&#039;t seem like it would happen offen, it&#039;s easy to hookup. The mod is responsible for doing this manually!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 51:&#039;&#039;&#039; Saves the config out to file, &amp;lt;code&amp;gt;MyProject.eco&amp;lt;/code&amp;gt;.  The mod is responsible for saving changes to disk!&lt;br /&gt;
&lt;br /&gt;
=== IGameActionAware ===&lt;br /&gt;
This is where most mod ideas hook into the engine. This interface allows the mod to be notified when any game action occurs.&lt;br /&gt;
&lt;br /&gt;
With that said, be careful here and code efficiently becuase the &amp;lt;code&amp;gt;ActionPerformed&amp;lt;/code&amp;gt; function is called a lot! The first thing the mod should do is filter to exactly the type of action it is waiting for before doing any computation, if possible.&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
using Eco.Core.Plugins;&lt;br /&gt;
using Eco.Core.Plugins.Interfaces;&lt;br /&gt;
using Eco.Core.Utils;&lt;br /&gt;
using Eco.Gameplay.Aliases;&lt;br /&gt;
using Eco.Gameplay.Components.Store;&lt;br /&gt;
using Eco.Gameplay.Components.Store.Internal;&lt;br /&gt;
using Eco.Gameplay.GameActions;&lt;br /&gt;
using Eco.Gameplay.Items;&lt;br /&gt;
using Eco.Gameplay.Items.Recipes;&lt;br /&gt;
using Eco.Gameplay.Objects;&lt;br /&gt;
using Eco.Gameplay.Property;&lt;br /&gt;
using Eco.Mods.TechTree;&lt;br /&gt;
using Eco.Shared.Localization;&lt;br /&gt;
using Eco.Shared.Utils;&lt;br /&gt;
using System.Runtime.Versioning;&lt;br /&gt;
&lt;br /&gt;
namespace MyProject&lt;br /&gt;
{&lt;br /&gt;
    // ...&lt;br /&gt;
&lt;br /&gt;
    [SupportedOSPlatform(&amp;quot;windows7.0&amp;quot;)]&lt;br /&gt;
    public class MyProjectPlugin: IModKitPlugin, IInitializablePlugin, IShutdownablePlugin, IConfigurablePlugin, IGameActionAware&lt;br /&gt;
    {&lt;br /&gt;
        #region IModKitPlugin&lt;br /&gt;
&lt;br /&gt;
        #region IIInitializablePlugin&lt;br /&gt;
&lt;br /&gt;
        #region IShutdownablePlugin&lt;br /&gt;
&lt;br /&gt;
        #region IConfigurablePlugin&lt;br /&gt;
&lt;br /&gt;
        #region IGameActionAware&lt;br /&gt;
        public async void ActionPerformed(GameAction action)&lt;br /&gt;
        {&lt;br /&gt;
            if (action is ChatSent chat)&lt;br /&gt;
            {&lt;br /&gt;
                Logger.Info($&amp;quot;{chat.Citizen} said {chat.Message}&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        public LazyResult ShouldOverrideAuth(IAlias? alias, IOwned? property, GameAction? action)&lt;br /&gt;
        {&lt;br /&gt;
            return LazyResult.FailedNoMessage;&lt;br /&gt;
        }&lt;br /&gt;
        #endregion&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Line 22:&#039;&#039;&#039; Added &amp;lt;code&amp;gt;IGameActionAware&amp;lt;/code&amp;gt; to the class&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 33:&#039;&#039;&#039; Method that will be called any time there&#039;s a game action happening. See a list of game actions here: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://docs.play.eco/api/server/eco.gameplay/Eco.Gameplay.GameActions.html&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 35:&#039;&#039;&#039; Example of filtering to just &amp;lt;code&amp;gt;ChatSent&amp;lt;/code&amp;gt; actions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 41:&#039;&#039;&#039; This is often not used and the method can be left as is. What it does is tell the game if this action should be allowed because of speical ruling. Think: laws that allow a player to hunt on other peoples deeds. That law would be overriding the normal authorization checks. &#039;&#039;Generally&#039;&#039;, the mod can return &amp;lt;code&amp;gt;LazyResult.FailedNoMessage&amp;lt;/code&amp;gt; to say &#039;No, don&#039;t create a special exception for this action&#039;.&lt;br /&gt;
&lt;br /&gt;
=== IWorkerPlugin ===&lt;br /&gt;
Here this example just covers a basic worker pattern that runs a task after a delay.&lt;br /&gt;
&lt;br /&gt;
This code will be repeatedly called. Be very efficient with what you do here because it&#039;s easy to tank a server&#039;s performance by doing expensive computations every loop (4 times a second in this example).&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
using Eco.Core.Plugins;&lt;br /&gt;
using Eco.Core.Plugins.Interfaces;&lt;br /&gt;
using Eco.Core.Utils;&lt;br /&gt;
using Eco.Core.Utils.Logging;&lt;br /&gt;
using Eco.Gameplay.Aliases;&lt;br /&gt;
using Eco.Gameplay.Components.Store;&lt;br /&gt;
using Eco.Gameplay.Components.Store.Internal;&lt;br /&gt;
using Eco.Gameplay.GameActions;&lt;br /&gt;
using Eco.Gameplay.Items;&lt;br /&gt;
using Eco.Gameplay.Items.Recipes;&lt;br /&gt;
using Eco.Gameplay.Objects;&lt;br /&gt;
using Eco.Gameplay.Property;&lt;br /&gt;
using Eco.Mods.TechTree;&lt;br /&gt;
using Eco.Shared.Localization;&lt;br /&gt;
using Eco.Shared.Utils;&lt;br /&gt;
using Eco.Simulation.Time;&lt;br /&gt;
using System.Runtime.Versioning;&lt;br /&gt;
&lt;br /&gt;
namespace MyProject&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    // ...&lt;br /&gt;
&lt;br /&gt;
    [SupportedOSPlatform(&amp;quot;windows7.0&amp;quot;)]&lt;br /&gt;
    [Worker(Repeatable = true, ThreadPriority = ThreadPriority.Normal)]&lt;br /&gt;
    public class MyProjectPlugin: IModKitPlugin, IInitializablePlugin, IShutdownablePlugin, IConfigurablePlugin, IGameActionAware, IWorkerPlugin&lt;br /&gt;
    {&lt;br /&gt;
        #region IModKitPlugin&lt;br /&gt;
&lt;br /&gt;
        #region IIInitializablePlugin&lt;br /&gt;
&lt;br /&gt;
        #region IShutdownablePlugin&lt;br /&gt;
&lt;br /&gt;
        #region IConfigurablePlugin&lt;br /&gt;
&lt;br /&gt;
        #region IGameActionAware&lt;br /&gt;
&lt;br /&gt;
        #region IWorkerPlugin&lt;br /&gt;
        public const int DELAY_MS = 250;&lt;br /&gt;
        public async Task DoWork(CancellationToken token)&lt;br /&gt;
        {&lt;br /&gt;
            while (!token.IsCancellationRequested)&lt;br /&gt;
            {&lt;br /&gt;
                try&lt;br /&gt;
                {&lt;br /&gt;
                    await Task.Delay(DELAY_MS, token);&lt;br /&gt;
                    // Scan the world for something...&lt;br /&gt;
                    // do work on it&lt;br /&gt;
                }&lt;br /&gt;
                catch (OperationCanceledException) when (token.IsCancellationRequested) { break; }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                   Logger.Info($&amp;quot;worker crashed: {e}&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            // Stop and cleanup&lt;br /&gt;
        }&lt;br /&gt;
        #endregion&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Line 25:&#039;&#039;&#039; This declares the working as something that will run more than once and that it should have a normal threading priority (interrupted only when something with higher priority needs to run).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 42:&#039;&#039;&#039; Creates the loop that keeps this repeating. Without it Eco would just call this once and be done! In this the mod is also checking that it hasn&#039;t been told to cancel this work. If it has been told to cancel it&#039;s wise to save and cleanup before stopping because sooner or later something will end this thread. It might not be nice about it either.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 46:&#039;&#039;&#039; This is the line that creates a delay between calls. Very necessary. Without it we would run as many times as the server could handle. Maxing out the CPU! This would be bad and most people might uninstall the mod becuase of performance issues like lag. Adjust the &amp;lt;code&amp;gt;DELAY_MS&amp;lt;/code&amp;gt; to give enough time between calls that the server can get to other things, but not so long that this mod is clunky and slow to react. It&#039;s a balance.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 50:&#039;&#039;&#039; Catching the cancellation and gracefully breaking the while loop.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 53:&#039;&#039;&#039; Catching all other exceptions and logging them.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 56:&#039;&#039;&#039; If the mod had cleanup to do from this thread, it would do it here.&lt;br /&gt;
&lt;br /&gt;
= Logger.cs =&lt;br /&gt;
To write to the logs I use the class &amp;lt;code&amp;gt;Eco.Core.Utils.Logging.NLogManager&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The Logger.cs file:&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
using Eco.Core.Utils.Logging;&lt;br /&gt;
using Eco.Gameplay.Systems.Messaging.Notifications;&lt;br /&gt;
using Eco.Shared.Localization;&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Diagnostics;&lt;br /&gt;
using System.Runtime.Versioning;&lt;br /&gt;
using System.Text;&lt;br /&gt;
&lt;br /&gt;
namespace MyProject&lt;br /&gt;
{&lt;br /&gt;
    static class Logger&lt;br /&gt;
    {&lt;br /&gt;
        const string NAME = &amp;quot;MyProject&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        [Conditional(&amp;quot;DEBUG&amp;quot;)]&lt;br /&gt;
        public static void Debug(string message)&lt;br /&gt;
        {&lt;br /&gt;
            NLogManager.GetEcoLogWriter().Write($&amp;quot;[{NAME}] {message}\n&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        [Conditional(&amp;quot;DEBUG&amp;quot;)]&lt;br /&gt;
        [SupportedOSPlatform(&amp;quot;windows7.0&amp;quot;)]&lt;br /&gt;
&lt;br /&gt;
        public static void NewsFeed(string message)&lt;br /&gt;
        {&lt;br /&gt;
            NotificationManager.ServerMessageToAll(Localizer.DoStr(message));&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        public static void Info(string message)&lt;br /&gt;
        {&lt;br /&gt;
            NLogManager.GetEcoLogWriter().Write($&amp;quot;[{NAME}] {message}\n&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Now in the project it is possible to use this with &amp;lt;code&amp;gt;Logger.Info(&amp;quot;Hello, World!&amp;quot;)&amp;lt;/code&amp;gt;. It will print out &amp;lt;code&amp;gt;[MyProject] Hello, World!&amp;lt;/code&amp;gt; to the logs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Logger.Debug(&amp;quot;Debug Message&amp;quot;)&amp;lt;/code&amp;gt; will do the same thing as Info. In this case printing &amp;lt;code&amp;gt;[MyProject] Debug Message&amp;lt;/code&amp;gt; to the logs, but notice the line above it -- &amp;lt;code&amp;gt;[Conditional(&amp;quot;DEBUG&amp;quot;)]&amp;lt;/code&amp;gt;. This line keeps any calls to this method from getting into a release build. They just won&#039;t exists and no message will be printed. Use this for printing things that are only helpful during development. Rest assured it&#039;s not spamming the logs or the news feed (notice that method has a conditional attribute too).&lt;br /&gt;
&lt;br /&gt;
Additionally, &amp;lt;code&amp;gt;Logger.NewsFeed(&amp;quot;Hello&amp;quot;)&amp;lt;/code&amp;gt; will print &amp;lt;code&amp;gt;Hello&amp;lt;/code&amp;gt; in the games feed (the place where you see messages for people logging in and out, other trades, people learning skills, etc.).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[SupportedOSPlatform(&amp;quot;windows7.0&amp;quot;)]&amp;lt;/code&amp;gt; Is only there to prevent the warnings from popping up and is completely optional.&lt;br /&gt;
&lt;br /&gt;
= ChatCommands.cs =&lt;br /&gt;
Having a version number is important because it helps the users know what will work with their Eco version. While it&#039;s helpful to include the version number in the name of the DLL, it&#039;s also helpful to provide a way for users to check in case that file is renamed/lost. Here&#039;s a basic chat command that prints the mod&#039;s version out:&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
using Eco.Gameplay.Systems.Chat;&lt;br /&gt;
using Eco.Gameplay.Systems.Messaging.Chat.Commands;&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Runtime.Versioning;&lt;br /&gt;
using System.Text;&lt;br /&gt;
&lt;br /&gt;
namespace MyProject&lt;br /&gt;
{&lt;br /&gt;
    [ChatCommandHandler]&lt;br /&gt;
    [SupportedOSPlatform(&amp;quot;windows7.0&amp;quot;)]&lt;br /&gt;
    public static class MyProjectCommands&lt;br /&gt;
    {&lt;br /&gt;
        [ChatCommand(&amp;quot;myproject&amp;quot;, ChatAuthorizationLevel.Moderator)]&lt;br /&gt;
        public static void myproject(IChatClient chat)&lt;br /&gt;
        {&lt;br /&gt;
            chat.MsgLoc($&amp;quot;Version: {MyProjectPlugin.VERSION}&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;This adds the command &amp;lt;code&amp;gt;/myproject&amp;lt;/code&amp;gt; to Eco. When ran it would reply something like &amp;lt;code&amp;gt;Version: v0.0.1&amp;lt;/code&amp;gt; to the in-game chat.&lt;br /&gt;
&lt;br /&gt;
Note (line 17): &amp;lt;code&amp;gt;MyProjectPlugin.VERSION&amp;lt;/code&amp;gt; is not defined in this project. Instead it&#039;s defined inside of the plugin&#039;s main code, &amp;lt;code&amp;gt;Plugin.cs&amp;lt;/code&amp;gt;, because it&#039;s mostly changed when the main code changes.&lt;br /&gt;
&lt;br /&gt;
= Registration.cs =&lt;br /&gt;
See page [[Registered Mods]] for more information about why register and additional steps necessary.&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
using Eco.Core.Plugins.Interfaces;&lt;br /&gt;
using Eco.Shared.Localization;&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Text;&lt;br /&gt;
&lt;br /&gt;
namespace MyProject&lt;br /&gt;
{&lt;br /&gt;
    public class MyProjectRegistration : IModInit&lt;br /&gt;
    {&lt;br /&gt;
        public static ModRegistration Register() =&amp;gt; new()&lt;br /&gt;
        {&lt;br /&gt;
            ModName = &amp;quot;MyProject&amp;quot;,&lt;br /&gt;
            ModDescription = Localizer.DoStr($&amp;quot;MyProject does something new!&amp;quot;),&lt;br /&gt;
            ModDisplayName = &amp;quot;My Project&amp;quot;&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Change the values of &amp;lt;code&amp;gt;ModName&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ModDescription&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ModDisplayName&amp;lt;/code&amp;gt; to something that fits the mod.&lt;br /&gt;
&lt;br /&gt;
The key in this file is the &amp;lt;code&amp;gt;IModInit&amp;lt;/code&amp;gt; interface that&#039;s being implemented on line 9. This is what Eco&#039;s code will look for when trying to find mods to be registered.&lt;br /&gt;
&lt;br /&gt;
Note: At the time of writing if &amp;lt;code&amp;gt;IModInit&amp;lt;/code&amp;gt; was implemented for the same class that &amp;lt;code&amp;gt;IModKitPlugin&amp;lt;/code&amp;gt; was the mod would crash. That&#039;s why it&#039;s being done with a separate class here.&lt;br /&gt;
&lt;br /&gt;
= Players Interactions =&lt;br /&gt;
&lt;br /&gt;
=== Game Messages ===&lt;br /&gt;
broadcast, side-message, on-screen, notification&lt;br /&gt;
&lt;br /&gt;
=== Player Choices ===&lt;br /&gt;
Go through popups types&lt;br /&gt;
&lt;br /&gt;
=== Other Popups ===&lt;br /&gt;
&amp;lt;code&amp;gt;Player.OpenInfoPanel&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>WugWugg</name></author>
	</entry>
	<entry>
		<id>https://wiki.play.eco/en/index.php?title=From_3D_Asset_to_Working_Worktable&amp;diff=16752</id>
		<title>From 3D Asset to Working Worktable</title>
		<link rel="alternate" type="text/html" href="https://wiki.play.eco/en/index.php?title=From_3D_Asset_to_Working_Worktable&amp;diff=16752"/>
		<updated>2026-04-30T18:49:27Z</updated>

		<summary type="html">&lt;p&gt;WugWugg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction =&lt;br /&gt;
Below is a guide on how to take an 3D asset from the Unity Store and make a working workbench in Eco. This includes:&lt;br /&gt;
* Creating a recipe to craft the modded table&lt;br /&gt;
* Creating recipes so the player can use the modded table to craft something&lt;br /&gt;
* Using Blender to generate a modded icon (seen when holding it in inventory)&lt;br /&gt;
* Using Blender to adjust the origin point of the model&lt;br /&gt;
* How to setup all this in a Unity scene and package for Eco&lt;br /&gt;
&lt;br /&gt;
= Setup =&lt;br /&gt;
&lt;br /&gt;
* Already have setup &#039;&#039;&#039;ModKit + Unity&#039;&#039;&#039;&lt;br /&gt;
** See: [[Installing the ModKit]]&lt;br /&gt;
* Have a &#039;&#039;&#039;3D model&#039;&#039;&#039;&lt;br /&gt;
** Just following along? Find the one used here at &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://assetstore.unity.com/packages/3d/props/low-poly-medieval-market-stalls-314286&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* A &#039;&#039;&#039;C# IDE&#039;&#039;&#039; (notepad++, Visual Studio, etc.)&lt;br /&gt;
** Highly encouraged to have an Intellisense setup and linked to the &#039;&#039;&#039;Reference Assemblies&#039;&#039;&#039;. Optional, but its really worth the time to figure out because it will help quickly correct small typos and trivial mistakes.&lt;br /&gt;
** See: [[Getting Started with Eco Modding in Visual Studio 2022]] (generally the same steps apply if using a new version of Visual Studio)&lt;br /&gt;
* &#039;&#039;&#039;Blender&#039;&#039;&#039; installed&lt;br /&gt;
** Homepage: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://www.blender.org/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Importing the Assets ==&lt;br /&gt;
&lt;br /&gt;
# Open the Unity editor to the project.&lt;br /&gt;
# From the top toolbar open the &#039;&#039;Window&#039;&#039; drop down.&lt;br /&gt;
# Hover &#039;&#039;Package Management&#039;&#039; to open sub-menu.&lt;br /&gt;
# Select &#039;&#039;Package Manager&#039;&#039;.&lt;br /&gt;
# The &#039;&#039;Package Manager&#039;&#039; window will pop-up.&lt;br /&gt;
# Install the package containing the assets you want to use...&lt;br /&gt;
## &amp;lt;u&amp;gt;If not using Unity Registry&amp;lt;/u&amp;gt;...&lt;br /&gt;
### Find the &#039;&#039;+▾&#039;&#039; button in the top left and open the drop down.&lt;br /&gt;
### Install the package from one of those options.&lt;br /&gt;
## &amp;lt;u&amp;gt;If using Unity Registry&amp;lt;/u&amp;gt;...&lt;br /&gt;
### Visit &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://assetstore.unity.com&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; and sign in.&lt;br /&gt;
### Search for the asset desired.&lt;br /&gt;
### Go to it&#039;s page (e.g. &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://assetstore.unity.com/packages/3d/props/low-poly-medieval-market-stalls-314286&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;) and click the big blue button, &#039;&#039;Add to My Assets.&#039;&#039;&lt;br /&gt;
### Now, in the Unity editor and back at the &#039;&#039;Package Manager&#039;&#039; window.&lt;br /&gt;
### Find &#039;&#039;My Assets&#039;&#039; on the left menu and navigate to it.&lt;br /&gt;
### Click the &#039;&#039;⟳&#039;&#039; button in the lower-right.&lt;br /&gt;
### The asset should be in the list now. Use the search to filter if needed.&lt;br /&gt;
### Click on the asset in the list. For those following along, &#039;&#039;Low Poly Medieval Market Stalls&#039;&#039;.&lt;br /&gt;
### In the right panel, find the &#039;&#039;Download ⤓&#039;&#039; button. Click it.&lt;br /&gt;
### Once downloaded, a new button should show up, it&#039;ll say something like &#039;&#039;⊕ Import 1.0 to project&#039;&#039; . Click it.&lt;br /&gt;
### The &#039;&#039;Import Unity Package&#039;&#039; window will pop-up.&lt;br /&gt;
### Select &#039;&#039;Import&#039;&#039; on it.&lt;br /&gt;
# Verify you can find your assets from the explorer. If following along, the assets are at &amp;lt;code&amp;gt;Assets/PolyRonin/Medieval Market Stalls&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Load in a demo scene, if provided, and make sure everything looks okay.&lt;br /&gt;
## For those following along, double click on the &#039;&#039;Demo&#039;&#039; scene at &amp;lt;code&amp;gt;Assets/PolyRonin/Medieval Market Stalls/Demo.unity&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:Eco - Unity - View Modes.png|thumb|Underlined in red are the different draw mode buttons. &amp;lt;u&amp;gt;4/20/26&amp;lt;/u&amp;gt;]]&lt;br /&gt;
If something seems off, check the different draw modes and see if changing those allow the scene to render as expected (see picture).&lt;br /&gt;
&lt;br /&gt;
= Creating The Worktable =&lt;br /&gt;
This guide will create the worktable in this order:&lt;br /&gt;
&lt;br /&gt;
# Create the item that represents the worktable&lt;br /&gt;
# Make a recipe to craft the worktable item&lt;br /&gt;
# Make the worktable item something that places a world object&lt;br /&gt;
# Give the worktable functionality by adding recipes to it&lt;br /&gt;
&lt;br /&gt;
== Creating the Item ==&lt;br /&gt;
&lt;br /&gt;
=== Item Icon ===&lt;br /&gt;
[[File:TeamstersStall - StallOnly - 256x256.png|thumb|A large (256x256px) icon created of Stall4 from the medieval assets.]]&lt;br /&gt;
# Open &amp;lt;u&amp;gt;Blender&amp;lt;/u&amp;gt;.&lt;br /&gt;
# Delete everything in the &#039;&#039;Scene Collection&#039;&#039;. Find this section in the top-right of the application.&lt;br /&gt;
# From the top toolbar, open the &#039;&#039;File&#039;&#039; drop down.&lt;br /&gt;
# Hover &#039;&#039;Import&#039;&#039; to open the sub-menu.&lt;br /&gt;
# Select the type of 3D asset. For those using medieval assets, select &#039;&#039;FBX (.fbx)&#039;&#039;.&lt;br /&gt;
# Find the asset on the computer...&amp;lt;br&amp;gt;&#039;&#039;&#039;Tip:&#039;&#039;&#039; Use Unity to find the &amp;lt;code&amp;gt;.fbx&amp;lt;/code&amp;gt; asset. &lt;br /&gt;
## For the medieval assets, that&#039;s in &amp;lt;code&amp;gt;Assets/PolyRonin/Medieval Market Stalls/Meshes/medieval-market-stalls-1.fbx&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Right click on it and select &#039;&#039;Show in explorer&#039;&#039;.&lt;br /&gt;
## Now copy the address of that folder from Explorer. It might look like &amp;lt;code&amp;gt;C:\Users\Wug\EcoMod--WikiDemo\WikiDemo\Assets\PolyRonin\Medieval Market Stalls\Meshes&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Paste that in the address bar of the &amp;lt;u&amp;gt;Blender&amp;lt;/u&amp;gt; import pop-up.&lt;br /&gt;
# Select the blue &#039;&#039;Import FBX&#039;&#039; button&#039;&#039;.&#039;&#039;&lt;br /&gt;
# Be in the &#039;&#039;Layout&#039;&#039; workspace (top toolbar) and in the &#039;&#039;Object Mode...&#039;&#039;&lt;br /&gt;
## Find the drop down in the second toolbar from the top that has options like &#039;&#039;Object Mode, Edit Mode, Sculpt Mode,&#039;&#039; etc.&lt;br /&gt;
## Select &#039;&#039;Object Mode&#039;&#039; from that drop down.&lt;br /&gt;
# Change the Viewport Shading to Material Preview or Rendered. This is on the second toolbar down, far right of center, but before &#039;&#039;Scene Collection&#039;&#039; section.&lt;br /&gt;
# If you see purple models, Blender will need help finding textures for these meshes...&lt;br /&gt;
## From the top toolbar, open the &#039;&#039;File&#039;&#039; drop down.&lt;br /&gt;
## Hover &#039;&#039;External Data&#039;&#039; to open the sub-menu.&lt;br /&gt;
## Select &#039;&#039;Find Missing Files...&#039;&#039;&lt;br /&gt;
## Point this to the whole directory that the 3D assets came in. For the medieval pack, &amp;lt;code&amp;gt;C:\Users\&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;Wug\EcoMod--WikiDemo\WikiDemo\Assets\PolyRonin&amp;lt;/code&amp;gt;.&lt;br /&gt;
## The proper textures/materials should have now loaded in. If it hasn&#039;t, consult Google because without the textures the following steps won&#039;t produce a usable icon.&lt;br /&gt;
# Add a source of light...&lt;br /&gt;
## Still be in the &#039;&#039;Layout&#039;&#039; workspace (top toolbar) and in the &#039;&#039;Object Mode...&#039;&#039;&lt;br /&gt;
### Find the drop down in the second toolbar from the top that has options like &#039;&#039;Object Mode, Edit Mode, Sculpt Mode,&#039;&#039; etc.&lt;br /&gt;
### Select &#039;&#039;Object Mode&#039;&#039; from that drop down.&lt;br /&gt;
## From the toolbar just under that one, find and open the &#039;&#039;Add&#039;&#039; drop down.&lt;br /&gt;
## Hover &#039;&#039;Light&#039;&#039; to open that sub-menu.&lt;br /&gt;
## Click &#039;&#039;Sun&#039;&#039;.&lt;br /&gt;
# Add a camera...&lt;br /&gt;
## In the &#039;&#039;Layout&#039;&#039; workspace (top toolbar) and in the &#039;&#039;Object Mode...&#039;&#039;&lt;br /&gt;
### Find the drop down in the second toolbar from the top that has options like &#039;&#039;Object Mode, Edit Mode, Sculpt Mode,&#039;&#039; etc.&lt;br /&gt;
### Select &#039;&#039;Object Mode&#039;&#039; from that drop down.&lt;br /&gt;
## From the second toolbar down, find and open the &#039;&#039;Add&#039;&#039; drop down.&lt;br /&gt;
## Select &#039;&#039;Camera&#039;&#039;.&lt;br /&gt;
# Setup the scene with the object placement and lighting direction desired.&amp;lt;br&amp;gt;&#039;&#039;&#039;Tip:&#039;&#039;&#039; To reset the editor to something selected press the period key &amp;lt;u&amp;gt;on the numpad&amp;lt;/u&amp;gt;. Without a numpad, use &#039;&#039;View&#039;&#039; (second toolbar from the top) and select &#039;&#039;Frame Selected&#039;&#039; from it. Alternatively, just set the zoom to zoom to the mouse position: &#039;&#039;Edit&#039;&#039; (top toolbar), &#039;&#039;Preferences&#039;&#039; (from drop down), &#039;&#039;Navigation&#039;&#039; (on left menu), &#039;&#039;Zoom to Mouse Position&#039;&#039; (In the zoom section). This makes moving around a lot more natural feeling.&lt;br /&gt;
# Setup the rendering camera...&lt;br /&gt;
## Go to &#039;&#039;Rendering&#039;&#039;  tab on the top toolbar&lt;br /&gt;
## On the right there will be a side-panel open, it should be the &#039;&#039;Render&#039;&#039; tab. Confirm that.&lt;br /&gt;
## Change &#039;&#039;Render Engine&#039;&#039; to &#039;&#039;Cycles&#039;&#039;.&lt;br /&gt;
## Look down below in the same tab for the &#039;&#039;Film&#039;&#039; section.&lt;br /&gt;
## Expand it and find the &#039;&#039;Transparent&#039;&#039; checkbox and section. Click it so that it has a check mark. This will make the icon&#039;s background transparent.&lt;br /&gt;
## Now, go to the &#039;&#039;Output&#039;&#039; tab &amp;lt;u&amp;gt;on the side panel&amp;lt;/u&amp;gt;. The tab is just below the current one.&lt;br /&gt;
## In the &#039;&#039;Format&#039;&#039; section set &#039;&#039;Resolution X&#039;&#039; to &#039;&#039;64.&#039;&#039; And &#039;&#039;Y&#039;&#039; to &#039;&#039;64&#039;&#039; as well. This will make the icon generated a 64 by 64 pixel image.&lt;br /&gt;
# Go back to the &#039;&#039;Layout&#039;&#039; tab from the top toolbar.&lt;br /&gt;
# Center your view on the object (numpad period or &#039;&#039;View &amp;gt; Frame Selected&#039;&#039;). Adjust it so that the object is how it should be for the icon.&lt;br /&gt;
# Align the camera to the view...&lt;br /&gt;
## Make sure the editor is in &#039;&#039;Layout&#039;&#039; workspace (top toolbar) and in the &#039;&#039;Object Mode...&#039;&#039;&lt;br /&gt;
### Find the drop down in the second toolbar from the top that has options like &#039;&#039;Object Mode, Edit Mode, Sculpt Mode,&#039;&#039; etc.&lt;br /&gt;
### Select &#039;&#039;Object Mode&#039;&#039; from that drop down.&lt;br /&gt;
## Find &#039;&#039;View&#039;&#039; from the second from the top toolbar and open the drop down.&lt;br /&gt;
## Hover &#039;&#039;Align View&#039;&#039; to open the sub-menu.&lt;br /&gt;
## Select &#039;&#039;Align Active Camera To View&#039;&#039;.&lt;br /&gt;
## If the view is slightly off, there is a lock icon on the right side of this panel. Use it to &amp;quot;lock&amp;quot; controls to the camera and tweak it&#039;s view.&lt;br /&gt;
# Now return to the &#039;&#039;Rendering&#039;&#039; tab from the top toolbar.&lt;br /&gt;
# Press the F12 key to start the render. This should complete quickly since 64x64 pixels is a very small render.&lt;br /&gt;
# A window should popup, &#039;&#039;Blender Render&#039;&#039;. This is the icon!&lt;br /&gt;
# From the top tool bar of this &#039;&#039;Blender Render&#039;&#039; window, open the &#039;&#039;Image&#039;&#039; drop down.&lt;br /&gt;
# Select &#039;&#039;Save As...&#039;&#039; to save somewhere on the computer.&lt;br /&gt;
# Return to step 13 and repeat to do larger images if desired. Create a 128 by 128 pixel image too. It will make things smoother later.&lt;br /&gt;
# Save the Blender scene. Not only will it be used later, this will make making a new icon with a small tweak that much easier.&lt;br /&gt;
## &#039;&#039;File&#039;&#039; drop down from top toolbar.&lt;br /&gt;
## &#039;&#039;Save As...&#039;&#039; to save the Blender scene to the computer.&lt;br /&gt;
## Save it to &amp;lt;code&amp;gt;Assets/WikiDemo/MedievalStall - Icon Scene.blend&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Adding to Unity Scene ===&lt;br /&gt;
The developers explain how to create an item in one of ModKit&#039;s read me files (See: &amp;lt;code&amp;gt;Assets/EcoModKit/Docs/README.md&amp;lt;/code&amp;gt;), but this guide will explain it below.&lt;br /&gt;
&lt;br /&gt;
Additionally, &#039;&#039;&#039;TheKye&#039;&#039;&#039; on YouTube covers this in their &#039;&#039;Creating Your First Item&#039;&#039; and &#039;&#039;Creating Your First Item Pt 2&#039;&#039; videos.&lt;br /&gt;
&lt;br /&gt;
Use those additional resource to help troubleshoot issues with item&#039;s icons.&lt;br /&gt;
&lt;br /&gt;
# Open &amp;lt;u&amp;gt;Unity&amp;lt;/u&amp;gt;.&lt;br /&gt;
# In the left panel, the &#039;&#039;Hierarchy&#039;&#039; tab should be selected.&lt;br /&gt;
# Select the top-most object there. It should be a scene. If the editor last loaded the &#039;&#039;Demo&#039;&#039; scene from the medieval assets, it&#039;ll be named &#039;&#039;Demo&#039;&#039;.&lt;br /&gt;
# Right click on this scene and select &#039;&#039;Add New Scene&#039;&#039; from the menu.&lt;br /&gt;
# Right click again on the old scene (&#039;&#039;Demo&#039;&#039;) and select &#039;&#039;Remove Scene&#039;&#039;.&lt;br /&gt;
# Let it save if the changes to the old scene are important. Discard if it was open just for exploration&#039;s sake.&lt;br /&gt;
# Right click the new, &#039;&#039;Untitled&#039;&#039; scene. Click &#039;&#039;Save Scene As...&#039;&#039;&lt;br /&gt;
# Save it to &amp;lt;code&amp;gt;Assets/WikiDemo.unity&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Delete &amp;lt;u&amp;gt;anything&amp;lt;/u&amp;gt; in the scene.&lt;br /&gt;
# Right click the scene, hover &#039;&#039;GameObject&#039;&#039;, and select &#039;&#039;Create Empty&#039;&#039; from the sub-menu.&lt;br /&gt;
# Name this new object &#039;&#039;Objects&#039;&#039;.&lt;br /&gt;
# Select the newly created &#039;&#039;Objects&#039;&#039; object from the &#039;&#039;Hierarchy&#039;&#039; menu.&lt;br /&gt;
# On the far right side of the screen, in the &#039;&#039;Inspector&#039;&#039; menu, click the &#039;&#039;Add Component&#039;&#039; button.&lt;br /&gt;
# Type in &#039;&#039;ModkitPrefabContainer&#039;&#039;. Click on the component from the search to add it. The component now should be listed in the &#039;&#039;Inspector&#039;&#039;.&lt;br /&gt;
# In the &#039;&#039;Hierarchy&#039;&#039; panel right click the scene, hover &#039;&#039;GameObject&#039;&#039;, and select &#039;&#039;Create Empty&#039;&#039;.&lt;br /&gt;
# Name this new object &#039;&#039;Items&#039;&#039;.&lt;br /&gt;
# Right click the scene, hover &#039;&#039;GameObject&#039;&#039;, and select &#039;&#039;Create Empty&#039;&#039;.&lt;br /&gt;
# Name this new object &#039;&#039;Emoji&#039;&#039;.&lt;br /&gt;
# Select the newly created &#039;&#039;Emoji&#039;&#039; object, find the &#039;&#039;Inspector&#039;&#039; menu (far-right), and click the &#039;&#039;Add Component&#039;&#039; button.&lt;br /&gt;
# Type in &#039;&#039;ChatEmoteSetOld&#039;&#039;. Click on the component from the search to add it. That component should now be listed in the &#039;&#039;Inspector&#039;&#039;.&lt;br /&gt;
# Right click the scene, hover &#039;&#039;GameObject&#039;&#039;, and select &#039;&#039;Create Empty&#039;&#039;.&lt;br /&gt;
# Name this new object &#039;&#039;BlockSets&#039;&#039;.&lt;br /&gt;
# Select the newly created &#039;&#039;BlockSets&#039;&#039; object, find the &#039;&#039;Inspector&#039;&#039; menu (far-right), and click &#039;&#039;Add Component&#039;&#039;.&lt;br /&gt;
# Search for &#039;&#039;BlockSetContainer&#039;&#039;. Click on the component from the search to add it. The &#039;&#039;Inspector&#039;&#039; should now show that component as added.&lt;br /&gt;
#Go to &amp;lt;code&amp;gt;Assets/EcoModKit/Prefabs&amp;lt;/code&amp;gt; in the Unity project window.&lt;br /&gt;
# Find the prefab &#039;&#039;ItemTemplate&#039;&#039;.&lt;br /&gt;
# Drag it onto the &#039;&#039;Items&#039;&#039; object in the &#039;&#039;Hierarchy&#039;&#039; panel. It should add it as a &amp;lt;u&amp;gt;child&amp;lt;/u&amp;gt; of the &#039;&#039;Items&#039;&#039; object.&lt;br /&gt;
# Right click on the new &#039;&#039;ItemTemplate&#039;&#039; object, hover &#039;&#039;Prefab&#039;&#039;, and select &#039;&#039;Unpack Completely&#039;&#039;.&lt;br /&gt;
# Right click on the &#039;&#039;ItemTemplate&#039;&#039; object and select &#039;&#039;Rename&#039;&#039;. Name this what you want the item to be called. Example: &#039;&#039;MedievalStallItem&#039;&#039;.&lt;br /&gt;
# Set this item&#039;s background...&lt;br /&gt;
## Here&#039;s the default backgrounds (blue = item, brown = block, green = food): &amp;lt;br&amp;gt;[[File:Eco - Item - Background.png|border|frameless]]        [[File:Eco - Block - Background.png|frameless]]        [[File:Eco - Food - Background.png|frameless]]&lt;br /&gt;
## Download or prepare the background and add it to the &amp;lt;code&amp;gt;Assets&amp;lt;/code&amp;gt; folder in Unity. &lt;br /&gt;
### To follow along lockstep, put the background in a new &amp;lt;code&amp;gt;Assets/WikiDemo&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
### Right click on &amp;lt;code&amp;gt;Assets&amp;lt;/code&amp;gt; folder, hover &#039;&#039;Create&#039;&#039;, select &#039;&#039;Folder&#039;&#039;.&lt;br /&gt;
### Name the folder &#039;&#039;WikiDemo&#039;&#039;.&lt;br /&gt;
## Configure Unity to use these as sprites...&lt;br /&gt;
### Select the background(s) added (Ctrl+Click each one).&lt;br /&gt;
### In the &#039;&#039;Inspector&#039;&#039;, find &#039;&#039;TextureType&#039;&#039; and change that to &#039;&#039;Sprite (2D and UI)&#039;&#039;.&lt;br /&gt;
### Again in the &#039;&#039;Inspector&#039;&#039;, find &#039;&#039;SpriteMode&#039;&#039; and change that to &#039;&#039;Single&#039;&#039;.&lt;br /&gt;
### Then scroll and go to the bottom of the &#039;&#039;Inspector&#039;&#039; and find the &#039;&#039;Apply&#039;&#039; button.&lt;br /&gt;
### This will apply those changes to that file and all other ones highlighted.&lt;br /&gt;
## Select the item being created (&#039;&#039;MedievalStallItem&#039;&#039;).&lt;br /&gt;
## In the &#039;&#039;Inspector&#039;&#039; panel (far-right), scroll and find the &#039;&#039;Item Template (Script)&#039;&#039; section.&lt;br /&gt;
## In here find the &#039;&#039;Background&#039;&#039; input. It&#039;ll say &#039;&#039;Background (Image)&#039;&#039; in it. If clicked that text to reveal and highlight the related object in the &#039;&#039;Hierarchy&#039;&#039; panel.&lt;br /&gt;
## Select the revealed, and highlighted object &#039;&#039;Background&#039;&#039;.&lt;br /&gt;
## In the &#039;&#039;Inspector&#039;&#039; panel, scroll and find the &#039;&#039;Image&#039;&#039; component section.&lt;br /&gt;
## Inside that component&#039;s section, find &#039;&#039;Source Image&#039;&#039;. It&#039;ll say &#039;&#039;Missing (Sprite)&#039;&#039;. Click the &#039;&#039;⦿&#039;&#039; button to the right.&lt;br /&gt;
## The &#039;&#039;Select Sprite&#039;&#039; popup will show. Make sure the &#039;&#039;Assets&#039;&#039; tab is selected, and find the backgrounds desired.&lt;br /&gt;
#Create the foreground image...&lt;br /&gt;
##This is easily accomplished in MS Paint.&lt;br /&gt;
##Get to the background image file in a &amp;lt;u&amp;gt;file explorer&amp;lt;/u&amp;gt;.&lt;br /&gt;
##Right click on it, hover &#039;&#039;Open with...&#039;&#039;, and select &#039;&#039;Paint&#039;&#039;.&lt;br /&gt;
##The solid background should be displayed.&lt;br /&gt;
##Open the &#039;&#039;File&#039;&#039; menu from the top toolbar.&lt;br /&gt;
##Hover &#039;&#039;Import to Canvas&#039;&#039; and select &#039;&#039;From a File&#039;&#039;.&lt;br /&gt;
##Find the icon in the file browser and import it. Match the size of the background image to have it nicely center itself.&lt;br /&gt;
##Now &#039;&#039;File&#039;&#039; from the top toolbar.&lt;br /&gt;
##Hover &#039;&#039;Save As...&#039;&#039; and select &#039;&#039;PNG&#039;&#039;.&lt;br /&gt;
##Save this to the &amp;lt;code&amp;gt;Assets/WikiDemo&amp;lt;/code&amp;gt; folder in Unity.&lt;br /&gt;
##Configure Unity to use these as sprites...&lt;br /&gt;
### Select the foreground image.&lt;br /&gt;
### In the &#039;&#039;Inspector&#039;&#039;, find &#039;&#039;TextureType&#039;&#039; and change that to &#039;&#039;Sprite (2D and UI)&#039;&#039;.&lt;br /&gt;
### Again in the &#039;&#039;Inspector&#039;&#039;, find &#039;&#039;SpriteMode&#039;&#039; and change that to &#039;&#039;Single&#039;&#039;.&lt;br /&gt;
### Then scroll and go to the bottom of the &#039;&#039;Inspector&#039;&#039; and find the &#039;&#039;Apply&#039;&#039; button.&lt;br /&gt;
### This will apply those changes to that file and all other ones highlighted.&lt;br /&gt;
#Set this item&#039;s foreground...&lt;br /&gt;
## Copy the item&#039;s icon into the &amp;lt;code&amp;gt;Assets&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
## Configure Unity to use it as a sprite (see the previous step&#039;s &#039;&#039;Set this item&#039;s background...&#039;&#039; instructions)&lt;br /&gt;
## Select the item being created (&#039;&#039;MedievalStallItem&#039;&#039;).&lt;br /&gt;
## In the &#039;&#039;Inspector&#039;&#039; panel (far-right), scroll and find the &#039;&#039;Item Template (Script)&#039;&#039; section.&lt;br /&gt;
## In here find the &#039;&#039;Foreground&#039;&#039; input. It&#039;ll say &#039;&#039;Foreground (Image)&#039;&#039; in it. If clicked that text to reveal and highlight the related object in the &#039;&#039;Hierarchy&#039;&#039; panel.&lt;br /&gt;
## Select the revealed, and highlighted object &#039;&#039;Foreground&#039;&#039;.&lt;br /&gt;
## Use the &#039;&#039;Inspector&#039;&#039;, find the &#039;&#039;Image&#039;&#039; component, within that component find the &#039;&#039;Source Image&#039;&#039; input. It will say &#039;&#039;Missing (Sprite)&#039;&#039;.&lt;br /&gt;
## Click the &#039;&#039;⦿&#039;&#039; button to the right of that input.&lt;br /&gt;
## From the &#039;&#039;Select Sprite&#039;&#039; popup, ensure the &#039;&#039;Assets&#039;&#039; tab is being searched, and find the icon just created.&lt;br /&gt;
&lt;br /&gt;
=== Export From Unity ===&lt;br /&gt;
&lt;br /&gt;
# Open the &#039;&#039;File&#039;&#039; menu from the top toolbar.&lt;br /&gt;
# Select &#039;&#039;Save.&#039;&#039; Save it to the &amp;lt;code&amp;gt;Assets/WikiDemo&amp;lt;/code&amp;gt; folder.&amp;lt;br&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; Do not skip. The scene must be saved for the ModKit build to work properly.&lt;br /&gt;
# Open the &#039;&#039;Eco Tools&#039;&#039; menu from the top toolbar.&lt;br /&gt;
# Hover &#039;&#039;Mod Kit&#039;&#039; to open the sub-menu.&lt;br /&gt;
# Select &#039;&#039;Build Current Bundle&#039;&#039;.&lt;br /&gt;
# Have it output the bundle to &amp;lt;code&amp;gt;/Eco Server/Mods/UserCode/WikiDemo.unity3d&amp;lt;/code&amp;gt;&lt;br /&gt;
# Wait for this to build. This may take a few minutes.&lt;br /&gt;
&lt;br /&gt;
=== Coding the Item ===&lt;br /&gt;
For this guide, all code will be placed in a single &amp;lt;code&amp;gt;.cs&amp;lt;/code&amp;gt; file and will not be compiled into a &amp;lt;code&amp;gt;.dll&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
# Create a &amp;lt;code&amp;gt;.cs&amp;lt;/code&amp;gt; file: &amp;lt;code&amp;gt;/Eco Server/Mods/UserCode/WikiDemo.cs&amp;lt;/code&amp;gt;&lt;br /&gt;
# Put the following into the newly created file:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;using Eco.Core.Items;&lt;br /&gt;
using Eco.Gameplay.Items;&lt;br /&gt;
using Eco.Shared.Localization;&lt;br /&gt;
using Eco.Shared.Serialization;&lt;br /&gt;
&lt;br /&gt;
namespace WikiDemo&lt;br /&gt;
{&lt;br /&gt;
    #region Item&lt;br /&gt;
    [Serialized] // Tells the save/load system this object needs to be serialized.&lt;br /&gt;
    [LocDisplayName(&amp;quot;Market Stall&amp;quot;)] // Defines the localized name of the item.&lt;br /&gt;
    [Weight(100)] // Defines how heavy this is.&lt;br /&gt;
    [Ecopedia(&amp;quot;Work Stations&amp;quot;, &amp;quot;Craft Tables&amp;quot;, createAsSubPage: true)]&lt;br /&gt;
    [LocDescription(&amp;quot;A medieval market stall.&amp;quot;)] //The tooltip description for the item.&lt;br /&gt;
    public partial class MedievalStallItem: Item { }&lt;br /&gt;
    #endregion&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Line 8:&#039;&#039;&#039; A region tag. Lets the editor know it can collapse all of that code as a section. The following examples in this guide will just show &amp;lt;code&amp;gt;#region Item&amp;lt;/code&amp;gt; in their code examples.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 13:&#039;&#039;&#039; The implementation of &amp;lt;code&amp;gt;Item&amp;lt;/code&amp;gt; means that Eco will find this and look for Unity assets that matching this class&#039; name, &amp;lt;code&amp;gt;MedivalStallItem&amp;lt;/code&amp;gt;. While this doesn&#039;t do anything fancy, it completes the first step towards a new workbench.&lt;br /&gt;
&lt;br /&gt;
=== Checkpoint #1 ===&lt;br /&gt;
[[File:Eco - Hotbar With Modded Icon.png|thumb|Shows the medieval stall as a modded icon in-game.]]&lt;br /&gt;
Make sure everything is running smoothly by doing the following:&lt;br /&gt;
&lt;br /&gt;
# Double-check that the &amp;lt;code&amp;gt;WikiDemo.unity3d&amp;lt;/code&amp;gt; and the &amp;lt;code&amp;gt;WikiDemo.cs&amp;lt;/code&amp;gt; files are in &amp;lt;code&amp;gt;/Eco Server/Mods/UserCode&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
# Start the server and connect to it.&lt;br /&gt;
# Test it out by typing &amp;lt;code&amp;gt;/give MedievalStall&amp;lt;/code&amp;gt; in chat.&lt;br /&gt;
## It&#039;s also possible to do &amp;lt;code&amp;gt;/give Market Stall&amp;lt;/code&amp;gt; to get the item. How? Line 10: of the the above code declares that name as this item&#039;s &amp;quot;common name&amp;quot;. Neat.&lt;br /&gt;
# The item should appear in the players inventory with a working icon.&lt;br /&gt;
&lt;br /&gt;
== Code the Item&#039;s Recipe ==&lt;br /&gt;
The following goes over how to add a new class and implement the &amp;lt;code&amp;gt;RecipeFamily&amp;lt;/code&amp;gt; interface.&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;using Eco.Core.Items;&lt;br /&gt;
using Eco.Gameplay.Components;&lt;br /&gt;
using Eco.Gameplay.Items;&lt;br /&gt;
using Eco.Gameplay.Items.Recipes;&lt;br /&gt;
using Eco.Gameplay.Skills;&lt;br /&gt;
using Eco.Mods.TechTree;&lt;br /&gt;
using Eco.Shared.Localization;&lt;br /&gt;
using Eco.Shared.Serialization;&lt;br /&gt;
using System.Runtime.Versioning;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
&lt;br /&gt;
namespace WikiDemo&lt;br /&gt;
{&lt;br /&gt;
    #region Item&lt;br /&gt;
&lt;br /&gt;
    #region Recipe&lt;br /&gt;
    [RequiresSkill(typeof(CarpentrySkill), 3)]&lt;br /&gt;
    [Ecopedia(&amp;quot;Work Stations&amp;quot;, &amp;quot;Craft Tables&amp;quot;, subPageName: &amp;quot;Market Stall&amp;quot;)]&lt;br /&gt;
    public partial class MedievalStallRecipe : RecipeFamily&lt;br /&gt;
    {&lt;br /&gt;
        [SupportedOSPlatform(&amp;quot;windows7.0&amp;quot;)]&lt;br /&gt;
        public MedievalStallRecipe()&lt;br /&gt;
        {&lt;br /&gt;
            var recipe = new Recipe();&lt;br /&gt;
            recipe.Init(&lt;br /&gt;
                name: &amp;quot;MedievalStallItem&amp;quot;,&lt;br /&gt;
                displayName: Localizer.DoStr(&amp;quot;Market Stall&amp;quot;),&lt;br /&gt;
                ingredients: new List&amp;lt;IngredientElement&amp;gt;&lt;br /&gt;
                {&lt;br /&gt;
                    new IngredientElement(&amp;quot;Wood&amp;quot;, 40, typeof(CarpentrySkill)),&lt;br /&gt;
                    new IngredientElement(typeof(CottonFabricItem), 30, typeof(CarpentrySkill)),&lt;br /&gt;
                    new IngredientElement(typeof(HempMooringRopeItem), 5, true)&lt;br /&gt;
                },&lt;br /&gt;
                items: new List&amp;lt;CraftingElement&amp;gt;&lt;br /&gt;
                {&lt;br /&gt;
                    new CraftingElement&amp;lt;MedievalStallItem&amp;gt;(1)&lt;br /&gt;
                }&lt;br /&gt;
            );&lt;br /&gt;
            this.Recipes = new List&amp;lt;Recipe&amp;gt; { recipe };&lt;br /&gt;
            this.LaborInCalories = CreateLaborInCaloriesValue(800, typeof(CarpentrySkill));&lt;br /&gt;
            this.CraftMinutes = CreateCraftTimeValue(typeof(MedievalStallRecipe), 10f, typeof(CarpentrySkill));&lt;br /&gt;
    &lt;br /&gt;
            // Perform pre/post initialization for user mods and initialize our recipe instance with the display name &amp;quot;Market Stall&amp;quot;&lt;br /&gt;
            this.ModsPreInitialize();&lt;br /&gt;
            this.Initialize(displayText: Localizer.DoStr(&amp;quot;Market Stall&amp;quot;), recipeType: typeof(MedievalStallRecipe));&lt;br /&gt;
            this.ModsPostInitialize();&lt;br /&gt;
    &lt;br /&gt;
            // Register our RecipeFamily instance to a work table (in this case the Carpentry Table) so it can be crafted.&lt;br /&gt;
            CraftingComponent.AddRecipe(tableType: typeof(CarpentryTableObject), recipeFamily: this); // NOTE: The table must be the object instance!&lt;br /&gt;
        }&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
        /// &amp;lt;summary&amp;gt;Hook for other mods to customize RecipeFamily before initialization.&amp;lt;/summary&amp;gt;&lt;br /&gt;
        partial void ModsPreInitialize();&lt;br /&gt;
    &lt;br /&gt;
        /// &amp;lt;summary&amp;gt;Hook for other mods to customize RecipeFamily after initialization, but before registration. You can change skill requirements here.&amp;lt;/summary&amp;gt;&lt;br /&gt;
        partial void ModsPostInitialize();&lt;br /&gt;
    }&lt;br /&gt;
    #endregion&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Line 10:&#039;&#039;&#039; Eco will need this explicitly added to the file. Visual Studio will not add this line automatically. It&#039;s used for the &amp;lt;code&amp;gt;List&amp;lt;T&amp;gt;&amp;lt;/code&amp;gt; objects found in this code.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 14:&#039;&#039;&#039; &amp;quot;Collapsed&amp;quot; &amp;lt;code&amp;gt;Item&amp;lt;/code&amp;gt; section. See the earlier sections in this guide for the code that belongs there.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 17:&#039;&#039;&#039; Sets the required skill and skill level to craft this recipe.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 21:&#039;&#039;&#039; &amp;lt;code&amp;gt;[SupportedOSPlatform(&amp;quot;windows7.0&amp;quot;)]&amp;lt;/code&amp;gt; is here to silence some annoying warnings in Visual Studio. It&#039;s optional.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 30-32:&#039;&#039;&#039; Declares the input ingredients used for crafting. &amp;lt;code&amp;gt;CarpentrySkill&amp;lt;/code&amp;gt; as defined by line 31. In this example the &amp;lt;code&amp;gt;HempMooringRope&amp;lt;/code&amp;gt; is a static input. A static input will not be modified by skills, upgrade modules, or game settings.&amp;lt;br&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; It seems that at the time of writing (4/21/2026, Eco v13.0.2) the only way to get an ingredient to be a dynamic value that is reduced by the table&#039;s upgrade is to pass &amp;lt;code&amp;gt;typeof(Skill)&amp;lt;/code&amp;gt; to it; Passing either &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; makes the this input static.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 34:&#039;&#039;&#039; The &amp;lt;code&amp;gt;items&amp;lt;/code&amp;gt; list declares what items are &amp;lt;u&amp;gt;output&amp;lt;/u&amp;gt; by this recipe.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 36:&#039;&#039;&#039; This line declares that one medieval stall is output from this recipe. Functionally this links this recipe to the &amp;lt;code&amp;gt;MedievalStallItem&amp;lt;/code&amp;gt; (aka &amp;quot;Market Stall&amp;quot;) item created in the last step.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 40:&#039;&#039;&#039; Amount of calories needed to craft this item. For a static value (not modified by upgrades or skill levels) change this line to: &amp;lt;code&amp;gt;this.LaborInCalories = CreateLaborInCaloriesValue(800);&amp;lt;/code&amp;gt;. As it&#039;s written in the example, this item&#039;s calorie cost will be dynamic (modified by upgrades and skill levels). The skill level that will modify it is declared on line 16.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 41:&#039;&#039;&#039;  Minutes needed to craft. Both static and dynamic values for crafting time can be modified by the world difficulty settings. For a static value change this line to: &amp;lt;code&amp;gt;this.CraftMinutes = CreateCraftTimeValue(10f);&amp;lt;/code&amp;gt;. As it&#039;s written in the example, this item&#039;s craft time will be dynamic.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 49:&#039;&#039;&#039; This line assigns the recipe to a workbench. &amp;lt;u&amp;gt;Do not assign&amp;lt;/u&amp;gt; to itself because then the first table could never be made. It&#039;s recommend to use a preexisting vanilla table.&lt;br /&gt;
=== Checkpoint #2 ===&lt;br /&gt;
Check the functionality at this point -- it should be possible to see the recipe in the crafting table.&lt;br /&gt;
&lt;br /&gt;
# Have the &amp;lt;code&amp;gt;.unity3d&amp;lt;/code&amp;gt; and the &amp;lt;code&amp;gt;.cs&amp;lt;/code&amp;gt; file in the &amp;lt;code&amp;gt;/Eco Server/Mods/UserCode&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
# Start the server and log in.&lt;br /&gt;
# Type &amp;lt;code&amp;gt;/give Carpentry Table&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Place the Carpentry Table down and interact to see the what can be crafted.&lt;br /&gt;
# Find the newly added recipe under the name &#039;&#039;Market Stall.&#039;&#039;&lt;br /&gt;
# Type &amp;lt;code&amp;gt;/give Basic Upgrade 4&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Put the basic upgrade into the table.&lt;br /&gt;
# Go back to the recipe for the &#039;&#039;Market Stall&#039;&#039; and make sure the Wood and the Cotton fabric inputs now require less, but the Hemp Mooring Rope still is the same.&amp;lt;br&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; In case the recipe hasn&#039;t changed close that table&#039;s window and interact with it again. It should for the recipes to refresh now that the upgrade is in it.&lt;br /&gt;
&lt;br /&gt;
== Create the World Object ==&lt;br /&gt;
=== Preparing the 3D Asset ===&lt;br /&gt;
# Open &amp;lt;u&amp;gt;Blender&amp;lt;/u&amp;gt;.&lt;br /&gt;
# Load the 3D object created earlier for icon rendering -- &amp;lt;code&amp;gt;Assets/WikiDemo/MedievalStall - Icon Scene.blend&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Cleanup the scene...&lt;br /&gt;
## Delete any light source. Use the &#039;&#039;Scene Collection&#039;&#039; panel on the top-right side of the screen. These will have a 💡 icon and by default are named something like &amp;quot;sun&amp;quot;, &amp;quot;point&amp;quot;, &amp;quot;spot&amp;quot; or &amp;quot;area&amp;quot;.&amp;lt;br&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; If your model is a light source or has one in it, you can leave that light source. The point here is to remove the ambient lights used for icon rendering.&lt;br /&gt;
## Delete any camera(s). Again, use the &#039;&#039;Scene Collection&#039;&#039; panel. These have a 🎥 icon and by default are named something like &amp;quot;camera&amp;quot;.&lt;br /&gt;
# &amp;lt;u&amp;gt;If there are multiple different 3D assets in the scene&amp;lt;/u&amp;gt; (like bags, crates, jars, ect.), join them all together...&lt;br /&gt;
## Select all of the meshes by holding &#039;&#039;Shift&#039;&#039; and clicking on each one in the &#039;&#039;Scene Collection&#039;&#039; panel (right side of window).&amp;lt;br&amp;gt;&#039;&#039;&#039;Tip:&#039;&#039;&#039; Quickly select a group of them by selecting one near the top. Then hold &#039;&#039;Shift&#039;&#039;, &#039;&#039;Ctrl,&#039;&#039; and click on one near the bottom. This will both the one at the top and the one at the bottom, but also every item in between. Neat!&lt;br /&gt;
## Be in &#039;&#039;Layout&#039;&#039; workspace (top toolbar) and in the &#039;&#039;Object Mode...&#039;&#039;&lt;br /&gt;
### Find the drop down in the second toolbar from the top that has options like &#039;&#039;Object Mode, Edit Mode, Sculpt Mode,&#039;&#039; etc.&lt;br /&gt;
### Select &#039;&#039;Object Mode&#039;&#039; from that drop down.&lt;br /&gt;
## Find and open the &#039;&#039;Object&#039;&#039; menu (second toolbar down from the top).&lt;br /&gt;
## Select &#039;&#039;Join&#039;&#039;.&lt;br /&gt;
## In the &#039;&#039;Scene Collection&#039;&#039; panel, double click on the name of the newly joined mesh.&lt;br /&gt;
# Rename the joined mesh to &amp;lt;code&amp;gt;MedievalStallMesh&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Add and position a reference cube...&lt;br /&gt;
## Make sure the editor is in &#039;&#039;Layout&#039;&#039; view (top toolbar) and in the &#039;&#039;Object Mode...&#039;&#039;&lt;br /&gt;
### Find the drop down in the second toolbar from the top that has options like &#039;&#039;Object Mode, Edit Mode, Sculpt Mode,&#039;&#039; etc.&lt;br /&gt;
### Select &#039;&#039;Object Mode&#039;&#039; from that drop down.&lt;br /&gt;
## Then, add a reference cube. Open the &#039;&#039;Add&#039;&#039; menu (second top toolbar down).&lt;br /&gt;
## Hover &#039;&#039;Mesh&#039;&#039;.&lt;br /&gt;
## Select &#039;&#039;Cube.&#039;&#039;&lt;br /&gt;
## Open the &#039;&#039;View&#039;&#039; menu (second toolbar down).&lt;br /&gt;
## Select &#039;&#039;Sidebar&#039;&#039;.&lt;br /&gt;
## A new panel will have expanded.&lt;br /&gt;
## Along the right side of that panel there&#039;s buttons (&#039;&#039;Item, Tool, View, Animation&#039;&#039;). Find and click the &#039;&#039;Item&#039;&#039; button.&lt;br /&gt;
## Find and expand the &#039;&#039;Transform&#039;&#039; section&lt;br /&gt;
## Set the &#039;&#039;Location...&#039;&#039;&lt;br /&gt;
### &#039;&#039;X&#039;&#039; to &#039;&#039;1&#039;&#039;.&lt;br /&gt;
### &#039;&#039;Y&#039;&#039; to &#039;&#039;1&#039;&#039;.&lt;br /&gt;
### &#039;&#039;Z&#039;&#039; to &#039;&#039;1&#039;&#039;.&lt;br /&gt;
## The bottom corner of the cube should be touching the where green and red axis lines meet.&lt;br /&gt;
# Move the reference cube&#039;s origin to &amp;lt;code&amp;gt;(0, 0, 0)&amp;lt;/code&amp;gt;...&lt;br /&gt;
## Be in &#039;&#039;Layout&#039;&#039; workspace (top toolbar) and in the &#039;&#039;Object Mode...&#039;&#039;&lt;br /&gt;
### Find the drop down in the second toolbar from the top that has options like &#039;&#039;Object Mode, Edit Mode, Sculpt Mode,&#039;&#039; etc.&lt;br /&gt;
### Select &#039;&#039;Object Mode&#039;&#039; from that drop down.&lt;br /&gt;
## Open the &#039;&#039;View&#039;&#039; menu (second toolbar down).&lt;br /&gt;
## Select &#039;&#039;Sidebar&#039;&#039;.&lt;br /&gt;
## A new panel will have expanded.&lt;br /&gt;
## Along the right side of that panel there&#039;s buttons (&#039;&#039;Item, Tool, View, Animation&#039;&#039;). Find and click the &#039;&#039;View&#039;&#039; button.&lt;br /&gt;
## Find and expand the &#039;&#039;3D Cursor&#039;&#039; section.&lt;br /&gt;
## Set the 3D cursor&#039;s &#039;&#039;Location&#039;&#039;...&lt;br /&gt;
### &#039;&#039;X&#039;&#039; to &#039;&#039;0&#039;&#039;.&lt;br /&gt;
### &#039;&#039;Y&#039;&#039; to &#039;&#039;0&#039;&#039;.&lt;br /&gt;
### &#039;&#039;Z&#039;&#039; to &#039;&#039;0.&#039;&#039;&lt;br /&gt;
## Now in the &#039;&#039;Scene Collection&#039;&#039; panel, click on the &#039;&#039;Cube&#039;&#039; mesh to highlight and select it.&lt;br /&gt;
## Open the &#039;&#039;Object&#039;&#039; menu from the second toolbar down from the top.&lt;br /&gt;
## Hover &#039;&#039;Set Origin&#039;&#039;.&lt;br /&gt;
## Select &#039;&#039;Origin to 3D Cursor&#039;&#039;.&lt;br /&gt;
# Set the reference cube&#039;s dimensions...&lt;br /&gt;
## Be in &#039;&#039;Layout&#039;&#039; workspace (top toolbar) and in the &#039;&#039;Object Mode...&#039;&#039;&lt;br /&gt;
### Find the drop down in the second toolbar from the top that has options like &#039;&#039;Object Mode, Edit Mode, Sculpt Mode,&#039;&#039; etc.&lt;br /&gt;
### Select &#039;&#039;Object Mode&#039;&#039; from that drop down.&lt;br /&gt;
## Open the &#039;&#039;View&#039;&#039; menu (second toolbar down).&lt;br /&gt;
## Select and check the &#039;&#039;Sidebar&#039;&#039; option&#039;&#039;.&#039;&#039; &lt;br /&gt;
## The &#039;&#039;Sidebar&#039;&#039; menu just expanded over on the right side of the screen.&lt;br /&gt;
## To the right of the &#039;&#039;Sidebar&#039;&#039;, find and click the &#039;&#039;Item&#039;&#039; button.&lt;br /&gt;
## Expand the &#039;&#039;Transform&#039;&#039; section.&lt;br /&gt;
## Set the &#039;&#039;Dimensions...&#039;&#039;&#039;&#039;&#039;&amp;lt;br&amp;gt;Note:&#039;&#039;&#039; These dimensions only make sense for the asset being used for this guide. If using a different one, set the dimensions to the size of the box that model should fit in.&lt;br /&gt;
### &#039;&#039;X&#039;&#039; to &#039;&#039;4&#039;&#039;.&lt;br /&gt;
### &#039;&#039;Y&#039;&#039; to &#039;&#039;3&#039;&#039;.&lt;br /&gt;
### &#039;&#039;Z&#039;&#039; to &#039;&#039;3&#039;&#039;. &lt;br /&gt;
# Adjust the position and scale of the &#039;&#039;MedievalStallMesh&#039;&#039; to fit inside a box.&lt;br /&gt;
## Be in &#039;&#039;Layout&#039;&#039; workspace (top toolbar) and in the &#039;&#039;Object Mode...&#039;&#039;&lt;br /&gt;
### Find the drop down in the second toolbar from the top that has options like &#039;&#039;Object Mode, Edit Mode, Sculpt Mode,&#039;&#039; etc.&lt;br /&gt;
### Select &#039;&#039;Object Mode&#039;&#039; from that drop down.&lt;br /&gt;
## On the left side of the screen there&#039;s a column of icons. Hover over them to see their names.&lt;br /&gt;
## Select the &#039;&#039;Move&#039;&#039; tool.&lt;br /&gt;
## Click on the Medieval Stall to select it. Zoom out and reposition the camera so that the blue, green, and red arrows are visible.&amp;lt;br&amp;gt;&#039;&#039;&#039;Tip:&#039;&#039;&#039; By holding the middle-mouse button and dragging the scene will rotate. By holding the middle-mouse button and the &#039;&#039;Shift&#039;&#039; key, the scene will pan.&amp;lt;br&amp;gt;&#039;&#039;&#039;Tip:&#039;&#039;&#039; If panning or rotating the scene becomes slow or frustrating (especially after zooming), try selecting 3D asset from the &#039;&#039;Scene Collection&#039;&#039; panel, opening the &#039;&#039;View&#039;&#039; menu (second toolbar from top), and selecting &#039;&#039;Frame Selected&#039;&#039;. This will reset the view onto that object and controls should feel normal again.&lt;br /&gt;
## Click and hold one of the arrows. Move the mouse to drag the 3D asset towards the box.&lt;br /&gt;
## Move the 3D asset around till it&#039;s &amp;lt;u&amp;gt;completely inside the box&amp;lt;/u&amp;gt;. If it cannot fit and is too big, continue to the next step.&amp;lt;br&amp;gt;&#039;&#039;&#039;Tip:&#039;&#039;&#039; To select the 3D asset once it disappears, use the &#039;&#039;Scene Collection&#039;&#039; panel. Click on it there and the blue, green, and red arrows will show up again for it.&amp;lt;br&amp;gt;&#039;&#039;&#039;Tip:&#039;&#039;&#039; There are preset views. To use them go to the &#039;&#039;View&#039;&#039; menu (second toolbar from top)&#039;&#039;,&#039;&#039; hover &#039;&#039;Viewpoint&#039;&#039;, and select the view that would be most helpful.&lt;br /&gt;
## Find the &#039;&#039;Scale&#039;&#039; tool from the left side of the screen.&lt;br /&gt;
## Now the blue, green, and red &amp;quot;arrows&amp;quot; don&#039;t really look like arrows anymore. They are lines with boxes at the end.&lt;br /&gt;
## Click and hold on those lines to adjust the scale of the 3D asset to make it fit inside the box.&amp;lt;br&amp;gt;&#039;&#039;&#039;Tip:&#039;&#039;&#039; There are little colored boxes in between the lines that can be dragged to scale the 3D asset more proportionally.&lt;br /&gt;
## Continue using the &#039;&#039;Move&#039;&#039; and &#039;&#039;Scale&#039;&#039; tools till the model fits. This will take patience and time.&amp;lt;br&amp;gt;&#039;&#039;&#039;Tip:&#039;&#039;&#039; Hide the reference cube to see what is happening with the 3D asset. Go to the &#039;&#039;Scene Collections&#039;&#039; panel and click the 👁 button to hide it. Click that button again to show it.&lt;br /&gt;
# Move the reference cube&#039;s origin to &amp;lt;code&amp;gt;(0.5, 0.5, 0.5)&amp;lt;/code&amp;gt;...&lt;br /&gt;
## Be in &#039;&#039;Layout&#039;&#039; workspace (top toolbar) and in the &#039;&#039;Object Mode...&#039;&#039;&lt;br /&gt;
### Find the drop down in the second toolbar from the top that has options like &#039;&#039;Object Mode, Edit Mode, Sculpt Mode,&#039;&#039; etc.&lt;br /&gt;
### Select &#039;&#039;Object Mode&#039;&#039; from that drop down.&lt;br /&gt;
## Open the &#039;&#039;View&#039;&#039; menu (second toolbar down).&lt;br /&gt;
## Select &#039;&#039;Sidebar&#039;&#039;.&lt;br /&gt;
## A new panel will have expanded.&lt;br /&gt;
## Along the right side of that panel there&#039;s buttons (&#039;&#039;Item, Tool, View, Animation&#039;&#039;). Find and click the &#039;&#039;View&#039;&#039; button.&lt;br /&gt;
## Find and expand the &#039;&#039;3D Cursor&#039;&#039; section.&lt;br /&gt;
## Set the 3D cursor&#039;s &#039;&#039;Location&#039;&#039;...&lt;br /&gt;
### &#039;&#039;X&#039;&#039; to &#039;&#039;0&#039;&#039;.5.&lt;br /&gt;
### &#039;&#039;Y&#039;&#039; to &#039;&#039;0.5&#039;&#039;.&lt;br /&gt;
### &#039;&#039;Z&#039;&#039; to &#039;&#039;0.5.&#039;&#039;&lt;br /&gt;
## Select the &#039;&#039;MedievalStallMesh&#039;&#039; using the &#039;&#039;Scene Collection&#039;&#039; panel.&lt;br /&gt;
## Open the &#039;&#039;Object&#039;&#039; menu (second toolbar down).&lt;br /&gt;
## Hover &#039;&#039;Set Origin&#039;&#039;.&lt;br /&gt;
## Select &#039;&#039;Origin to 3D Cursor&#039;&#039;.&lt;br /&gt;
# Select the reference cube named &#039;&#039;Cube&#039;&#039; from the &#039;&#039;Scene Collections&#039;&#039; panel.&lt;br /&gt;
# Open &#039;&#039;Object&#039;&#039; menu (second toolbar down).&lt;br /&gt;
# Select &#039;&#039;Delete&#039;&#039;.&lt;br /&gt;
# Move the &#039;&#039;MedievalStallMesh&#039;&#039; to &amp;lt;code&amp;gt;(0, 0, 0)&amp;lt;/code&amp;gt;...&lt;br /&gt;
## Be in &#039;&#039;Layout&#039;&#039; workspace (top toolbar) and in the &#039;&#039;Object Mode...&#039;&#039;&lt;br /&gt;
### Find the drop down in the second toolbar from the top that has options like &#039;&#039;Object Mode, Edit Mode, Sculpt Mode,&#039;&#039; etc.&lt;br /&gt;
### Select &#039;&#039;Object Mode&#039;&#039; from that drop down.&lt;br /&gt;
## Open the &#039;&#039;View&#039;&#039; menu (second toolbar down).&lt;br /&gt;
## Select &#039;&#039;Sidebar&#039;&#039;.&lt;br /&gt;
## A new panel will have expanded.&lt;br /&gt;
## Along the right side of that panel there&#039;s buttons (&#039;&#039;Item, Tool, View, Animation&#039;&#039;). Find and click the &#039;&#039;Item&#039;&#039; button.&lt;br /&gt;
## Make sure the &#039;&#039;MedievalStallMesh&#039;&#039; is selected. Use the &#039;&#039;Scene Collection&#039;&#039; panel if needed.&lt;br /&gt;
## Find and expand the &#039;&#039;Transform&#039;&#039; section&lt;br /&gt;
## Set the &#039;&#039;Location...&#039;&#039;&lt;br /&gt;
### &#039;&#039;X&#039;&#039; to 0.&lt;br /&gt;
### &#039;&#039;Y&#039;&#039; to 0.&lt;br /&gt;
### &#039;&#039;Z&#039;&#039; to 0.&lt;br /&gt;
# Make sure the &#039;&#039;MedievalStallMesh&#039;&#039; is selected. Use the &#039;&#039;Scene Collection&#039;&#039; panel if needed.&lt;br /&gt;
# Open the &#039;&#039;Object&#039;&#039; menu.&lt;br /&gt;
# Hover &#039;&#039;Apply&#039;&#039;.&lt;br /&gt;
# Select &#039;&#039;All Transformations&#039;&#039;.&amp;lt;br&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; This step bakes all of the changes into the mesh. It&#039;s very important.&lt;br /&gt;
# Open the &#039;&#039;File&#039;&#039;  menu from the top toolbar.&lt;br /&gt;
# Hover &#039;&#039;Export&#039;&#039; to open the sub-menu.&lt;br /&gt;
# Select &#039;&#039;FBX (.fbx)&#039;&#039; &lt;br /&gt;
# A &#039;&#039;Blender File View&#039;&#039; window will pop-up.&lt;br /&gt;
# On the right side of this window there&#039;s a ⚙️ icon. Click it to expand the settings region.&lt;br /&gt;
# In the expanded region find the &#039;&#039;Include&#039;&#039; section and expand it. Change the following:&lt;br /&gt;
## Find &#039;&#039;Object Types&#039;&#039; and only select &#039;&#039;Mesh.&#039;&#039; No other option should be highlighted for this setting.&lt;br /&gt;
# In the settings region scroll and find the &#039;&#039;Transform&#039;&#039; section and expand it. Change the following:&lt;br /&gt;
## Find &#039;&#039;Apply Scalings&#039;&#039; and set it to &#039;&#039;FBX All&#039;&#039;.&lt;br /&gt;
## Just below that find &#039;&#039;Forward&#039;&#039; and set it to &#039;&#039;Z Forward&#039;&#039;.&lt;br /&gt;
## Ensure that the next setting down, &#039;&#039;Up&#039;&#039;, changed to &#039;&#039;Y Up&#039;&#039;.&lt;br /&gt;
## Find &#039;&#039;Apply Unit&#039;&#039; and make sure it&#039;s checked.&lt;br /&gt;
## Next, find &#039;&#039;Use Space Transform&#039;&#039; check it.&lt;br /&gt;
## Lastly, find &#039;&#039;Apply Transform&#039;&#039; and check it too.&lt;br /&gt;
# Save it to &amp;lt;code&amp;gt;Assets/WikiDemo/MedievalStall.fbx&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Save the Blender scene...&lt;br /&gt;
## &#039;&#039;File&#039;&#039; drop down from top toolbar.&lt;br /&gt;
## &#039;&#039;Save As...&#039;&#039; to save the Blender scene to the computer.&lt;br /&gt;
## Save it to &amp;lt;code&amp;gt;Assets/WikiDemo/MedievalStall - Eco Ready Scene.blend&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Add to Unity Scene ===&lt;br /&gt;
&lt;br /&gt;
# Open &amp;lt;u&amp;gt;Unity&amp;lt;/u&amp;gt;.&lt;br /&gt;
# Select the &amp;lt;code&amp;gt;.fbx&amp;lt;/code&amp;gt; file in the project window.&lt;br /&gt;
# Open the &#039;&#039;Eco Tools&#039;&#039; menu from the top toolbar.&lt;br /&gt;
# Hover &#039;&#039;Mod Kit&#039;&#039;.&lt;br /&gt;
# Select &#039;&#039;World Object Setup.&#039;&#039;&lt;br /&gt;
# A &#039;&#039;World Object Setup&#039;&#039;  window will pop-up.&lt;br /&gt;
# Make sure that &#039;&#039;Selected Objects&#039;&#039; reads &#039;&#039;MedievalStall.&#039;&#039;&lt;br /&gt;
# Also make sure that &#039;&#039;World Object Type&#039;&#039; is set to &#039;&#039;World Object&#039;&#039;.&lt;br /&gt;
# Press the &#039;&#039;Setup World Objects&#039;&#039; button.&lt;br /&gt;
# Notice in the project window that a new &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt; file was created -- &amp;lt;code&amp;gt;MedievalStallObject.prefab&amp;lt;/code&amp;gt;&lt;br /&gt;
# Select the &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt;.&lt;br /&gt;
# In the &#039;&#039;Inspector&#039;&#039; panel find the &#039;&#039;Transform&#039;&#039; component.&lt;br /&gt;
# Change this component&#039;s &#039;&#039;Rotation...&#039;&#039;&lt;br /&gt;
## &#039;&#039;X&#039;&#039; to &#039;&#039;0.&#039;&#039;&lt;br /&gt;
## &#039;&#039;Y&#039;&#039; to &#039;&#039;0.&#039;&#039;&lt;br /&gt;
## &#039;&#039;Z&#039;&#039; to &#039;&#039;0.&#039;&#039;&lt;br /&gt;
# In the &#039;&#039;Inspector&#039;&#039; panel find the &#039;&#039;Box Collider&#039;&#039; component.&lt;br /&gt;
#Find the &#039;&#039;⋮&#039;&#039; icon (all the way to the right of the words &#039;&#039;Box Collider)&#039;&#039; and click on it.&lt;br /&gt;
#Select &#039;&#039;Reset&#039;&#039; from the menu. This will regenerate the box collider now that the rotation has changed.&lt;br /&gt;
#Look in the &#039;&#039;Inspector&#039;&#039; panel and find the &#039;&#039;World Object (Script)&#039;&#039; component.&lt;br /&gt;
# That component has a checkbox &#039;&#039;Override Occupancy&#039;&#039;. Check it.&lt;br /&gt;
# A new field should&#039;ve expanded below it called &#039;&#039;Size&#039;&#039;.&lt;br /&gt;
# Set the &#039;&#039;Size&#039;&#039;...&amp;lt;br&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; This size similar to the size of the reference cube from earlier, but the Y and Z coordinates get flipped! So if in Blender it was &amp;lt;code&amp;gt;(1, 2, 3)&amp;lt;/code&amp;gt; then in Unity its &amp;lt;code&amp;gt;(1, 3, 2)&amp;lt;/code&amp;gt;.&lt;br /&gt;
## &#039;&#039;X&#039;&#039; to &#039;&#039;4&#039;&#039;.&lt;br /&gt;
## &#039;&#039;Y&#039;&#039; to &#039;&#039;3&#039;&#039;.&lt;br /&gt;
## &#039;&#039;Z&#039;&#039; to &#039;&#039;3&#039;&#039;.&lt;br /&gt;
# Select &#039;&#039;Objects&#039;&#039; from &#039;&#039;Hierarchy&#039;&#039; panel (left-side of the window).&lt;br /&gt;
# Find the &#039;&#039;Modkit Prefab Container (Script)&#039;&#039; component. This component was added earlier, if it&#039;s not there add it now.&lt;br /&gt;
# Expand the &#039;&#039;Prefabs&#039;&#039; section in that component.&lt;br /&gt;
# Click the &#039;&#039;+&#039;&#039; button to add an item to the list.&lt;br /&gt;
# Either...&lt;br /&gt;
## Click the &#039;&#039;⦿&#039;&#039; button, switch to the &#039;&#039;Assets&#039;&#039; tab, find or search for &#039;&#039;MedievalStallObject&#039;&#039;, and double click on it. Make sure it&#039;s the medieval stall &amp;lt;u&amp;gt;object&amp;lt;/u&amp;gt; with the &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt; ending.&lt;br /&gt;
## Drag the &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt; file onto the &#039;&#039;⦿&#039;&#039; button&lt;br /&gt;
# Open the &#039;&#039;File&#039;&#039; menu from top toolbar and select &#039;&#039;Save&#039;&#039;.&amp;lt;br&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; Do not skip. The scene must be saved for the ModKit build to work properly.&lt;br /&gt;
# Open the &#039;&#039;Eco Tools&#039;&#039; menu from the top toolbar.&lt;br /&gt;
# Hover &#039;&#039;Mod Kit&#039;&#039;.&lt;br /&gt;
# Select &#039;&#039;Build Current Bundle&#039;&#039;.&lt;br /&gt;
# Save the bundle to &amp;lt;code&amp;gt;/Eco Server/Mods/UserCode/WikiDemo.unity3d&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Coding the World Object ===&lt;br /&gt;
The following collapses the &amp;lt;code&amp;gt;#region Recipe&amp;lt;/code&amp;gt;. Please see the earlier section [[#Code the Item&#039;s Recipe|Code the Item&#039;s Recipe]] to get the code that belongs there.&lt;br /&gt;
&lt;br /&gt;
Add the new &amp;lt;code&amp;gt;using&amp;lt;/code&amp;gt; lines, replace the &amp;lt;code&amp;gt;#region Item&amp;lt;/code&amp;gt; section, and replace the &amp;lt;code&amp;gt;#region Object&amp;lt;/code&amp;gt; sections using the following:&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;using Eco.Core.Items;&lt;br /&gt;
using Eco.Gameplay.Components;&lt;br /&gt;
using Eco.Gameplay.Items;&lt;br /&gt;
using Eco.Gameplay.Items.Recipes;&lt;br /&gt;
using Eco.Gameplay.Objects;&lt;br /&gt;
using Eco.Gameplay.Skills;&lt;br /&gt;
using Eco.Mods.TechTree;&lt;br /&gt;
using Eco.Shared.Localization;&lt;br /&gt;
using Eco.Shared.Serialization;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Runtime.Versioning;&lt;br /&gt;
using System;&lt;br /&gt;
using Eco.Core.Controller;&lt;br /&gt;
using Eco.Gameplay.Systems.NewTooltip;&lt;br /&gt;
using Eco.Shared.Items;&lt;br /&gt;
using Eco.Gameplay.Occupancy;&lt;br /&gt;
using Eco.Shared.Math;&lt;br /&gt;
using Eco.Gameplay.Components.Auth;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
namespace WikiDemo&lt;br /&gt;
{&lt;br /&gt;
    #region Item&lt;br /&gt;
    [Serialized] // Tells the save/load system this object needs to be serialized.&lt;br /&gt;
    [SupportedOSPlatform(&amp;quot;windows7.0&amp;quot;)]&lt;br /&gt;
    [LocDisplayName(&amp;quot;Market Stall&amp;quot;)] // Defines the localized name of the item.&lt;br /&gt;
    [Weight(3000)] // Defines how heavy this is.&lt;br /&gt;
    [Ecopedia(&amp;quot;Work Stations&amp;quot;, &amp;quot;Craft Tables&amp;quot;, createAsSubPage: true)]&lt;br /&gt;
    [LocDescription(&amp;quot;A medieval market stall.&amp;quot;)] //The tooltip description for the item.&lt;br /&gt;
    public partial class MedievalStallItem : WorldObjectItem&amp;lt;MedievalStallObject&amp;gt;, IPersistentData&lt;br /&gt;
    {&lt;br /&gt;
        [Serialized, SyncToView, NewTooltipChildren(CacheAs.Instance, flags: TTFlags.AllowNonControllerTypeForChildren)] public object? PersistentData { get; set; }&lt;br /&gt;
&lt;br /&gt;
        protected override OccupancyContext GetOccupancyContext =&amp;gt; new SideAttachedContext(&lt;br /&gt;
            DirectionAxisFlags.Down, // Read: every occupied block on the bottom must be supported&lt;br /&gt;
            WorldObject.GetOccupancyInfo(this.WorldObjectType)&lt;br /&gt;
        );&lt;br /&gt;
    }&lt;br /&gt;
    #endregion&lt;br /&gt;
&lt;br /&gt;
    #region Recipe&lt;br /&gt;
&lt;br /&gt;
    #region Object&lt;br /&gt;
    [Serialized]&lt;br /&gt;
    [SupportedOSPlatform(&amp;quot;windows7.0&amp;quot;)]&lt;br /&gt;
    [RequireComponent(typeof(CraftingComponent))]&lt;br /&gt;
    [RequireComponent(typeof(MinimapComponent))]&lt;br /&gt;
    [RequireComponent(typeof(LinkComponent))]&lt;br /&gt;
    [RequireComponent(typeof(OccupancyRequirementComponent))]&lt;br /&gt;
    [Tag(&amp;quot;Usable&amp;quot;)]&lt;br /&gt;
    [Ecopedia(&amp;quot;Work Stations&amp;quot;, &amp;quot;Craft Tables&amp;quot;, subPageName: &amp;quot;Market Stall&amp;quot;)]&lt;br /&gt;
    public partial class MedievalStallObject : WorldObject, IRepresentsItem&lt;br /&gt;
    {&lt;br /&gt;
        public Type RepresentedItemType =&amp;gt; typeof(MedievalStallItem);&lt;br /&gt;
&lt;br /&gt;
        static MedievalStallObject()&lt;br /&gt;
        {&lt;br /&gt;
            WorldObject.AddOccupancy&amp;lt;MedievalStallObject&amp;gt;(CalculateBoxOccupancy(4, 3, 3));&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        protected override void Initialize()&lt;br /&gt;
        {&lt;br /&gt;
            this.ModsPreInitialize();&lt;br /&gt;
            this.GetComponent&amp;lt;LinkComponent&amp;gt;().Initialize(15);&lt;br /&gt;
            this.GetComponent&amp;lt;MinimapComponent&amp;gt;().SetCategory(Localizer.DoStr(&amp;quot;Crafting&amp;quot;));&lt;br /&gt;
            this.ModsPostInitialize();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;Hook for mods to customize WorldObject before initialization. You can change housing values here.&amp;lt;/summary&amp;gt;&lt;br /&gt;
        partial void ModsPreInitialize();&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;Hook for mods to customize WorldObject after initialization.&amp;lt;/summary&amp;gt;&lt;br /&gt;
        partial void ModsPostInitialize();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Calculates the blocks that this item will occupy when placed. All coordinates are offsets relative to this 3D model&#039;s origin&lt;br /&gt;
        /// point. This function can only be used to calculate a box shape; there can be no gaps. All blocks will be of the&lt;br /&gt;
        /// BlockOccupancyType.None type.&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        ///&lt;br /&gt;
        /// Examples:&lt;br /&gt;
        ///     * Imagine a 1x1x1 cube. The origin point of the 3D model is the middle of the bottom-left cube. The only block the&lt;br /&gt;
        ///     cube would occupy would be the same one the origin point is in. In offset coordinates, the only block the cube occupies&lt;br /&gt;
        ///     is (0,0,0) from the origin point.&lt;br /&gt;
        ///     * Image a 1x5x1 flag pole. Again the origin point of the 3D model is in the middle of the bottom most cube. The only&lt;br /&gt;
        ///     blocks the flage pole occupies is the one the origin point is in and the 4 above that one. In offset coordinates, that&lt;br /&gt;
        ///     would be (0,0,0) + (0,1,0) + (0,2,0) + (0,3,0) + (0,4,0).&lt;br /&gt;
        /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br /&gt;
        private static List&amp;lt;BlockOccupancy&amp;gt; CalculateBoxOccupancy(int sizeX, int sizeY, int sizeZ)&lt;br /&gt;
        {&lt;br /&gt;
            var cells = new List&amp;lt;BlockOccupancy&amp;gt;(sizeX * sizeY * sizeZ);&lt;br /&gt;
            for (int x = 0; x &amp;lt; sizeX; x++)&lt;br /&gt;
                for (int y = 0; y &amp;lt; sizeY; y++)&lt;br /&gt;
                    for (int z = 0; z &amp;lt; sizeZ; z++)&lt;br /&gt;
                        cells.Add(new BlockOccupancy(new Vector3i(x, y, z)));&lt;br /&gt;
            return cells;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    #endregion&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Line 30:&#039;&#039;&#039; This changes from implementing &amp;lt;code&amp;gt;Item&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;WorldObjectItem&amp;lt;MedievalStallObject&amp;gt;&amp;lt;/code&amp;gt;. This is what tell Eco that this item has the ability to place a world object into the world.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 32:&#039;&#039;&#039; This defines the object where &amp;lt;code&amp;gt;PersistentData&amp;lt;/code&amp;gt; is stored. Other components like a &#039;&#039;PartsComponet&#039;&#039; would store the information of the table parts&#039; durability in here. in this example, this line is illustrative and doesn&#039;t have any components using it.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 34:&#039;&#039;&#039; Sets the type of occupancy context this world object has. Occupancy is the system used to determine what space blocks and object are in. The &amp;lt;code&amp;gt;SideAttachContext&amp;lt;/code&amp;gt; means that this object must have a certain side supported for it to be attached to the world and valid to be placed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 35:&#039;&#039;&#039; Defines the bottom side as the side this object uses to attach.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 36:&#039;&#039;&#039; This line is getting the list of blocks occupied from a static lookup in &amp;lt;code&amp;gt;WorldObject&amp;lt;/code&amp;gt; for the &amp;lt;code&amp;gt;MedievalStallObject&amp;lt;/code&amp;gt;. See line 60 to see this value set.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 41:&#039;&#039;&#039; The &amp;quot;collapsed&amp;quot; Recipe section. See earlier sections in this guide to see what code belongs here.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 46:&#039;&#039;&#039; Adds a &amp;lt;code&amp;gt;CraftComponent&amp;lt;/code&amp;gt; to the table. This component lets players use this table to craft something on.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 47:&#039;&#039;&#039; &amp;lt;code&amp;gt;MinimapComponent&amp;lt;/code&amp;gt; this registers the object with the minimap. This makes it so when a player places a medieval stall, the minimap shows it. Related: line 67.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 48:&#039;&#039;&#039; &amp;lt;code&amp;gt;LinkComponent&amp;lt;/code&amp;gt; allows storage linking. Related: line 66.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 49:&#039;&#039;&#039; &amp;lt;code&amp;gt;OccupancyRequirementComponent&amp;lt;/code&amp;gt; defines this object as having and occupying physical space. Related: line 60.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 50:&#039;&#039;&#039; Assigns a tag to this object. Like how the tag &#039;&#039;Wood&#039;&#039; in Eco refers to all the different types of logs. In this case, the &#039;&#039;MedievalStallObject&#039;&#039; is being added to the &amp;lt;code&amp;gt;Usable&amp;lt;/code&amp;gt; tag.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 52:&#039;&#039;&#039; Declares the &amp;lt;code&amp;gt;MedievalStallObject&amp;lt;/code&amp;gt;. It&#039;s important that this class name is matches exactly the &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt; file name because the name is what links them.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 54:&#039;&#039;&#039; Declares the item that is given when this world object is picked up.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 58:&#039;&#039;&#039; This sets the occupancy for the world object in the simulation. This must also be set for the object in addition to the &#039;&#039;Override Occupancy&#039;&#039; and &#039;&#039;Size&#039;&#039; setting previously set on the Unity &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt;. That&#039;s because the settings in Unity are used client side. This sets the occupancy on the server side. They both need to be set and be matching for things to work right.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 64:&#039;&#039;&#039; Initializes the &amp;lt;code&amp;gt;LinkComponent&amp;lt;/code&amp;gt; with a base 15 block radius. Know that this value is just the base value and that server settings will determine the actual game play radius.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 65:&#039;&#039;&#039; Initializes the &amp;lt;code&amp;gt;MinimapComponent&amp;lt;/code&amp;gt; and add this object to the &amp;lt;code&amp;gt;Crafting&amp;lt;/code&amp;gt; category.&lt;br /&gt;
&lt;br /&gt;
=== Checkpoint ===&lt;br /&gt;
&lt;br /&gt;
[[File:WikiDemo - Medieval Stall - Checkpoint -3.png|thumb|The Medieval Stall modded into Eco.]]&lt;br /&gt;
&#039;&#039;&#039;Warning:&#039;&#039;&#039; In &#039;&#039;Eco&#039;&#039; v13.0.2, free-placed objects may display misaligned ghost cubes, even when configured correctly in your mod. This is a visual-only base-game bug — placement still works as expected, even if the object appears red near edges. &amp;lt;!-- See: https://github.com/StrangeLoopGames/EcoIssues/issues/25834 --&amp;gt; &lt;br /&gt;
&lt;br /&gt;
# Have the &amp;lt;code&amp;gt;.unity3d&amp;lt;/code&amp;gt; and the &amp;lt;code&amp;gt;.cs&amp;lt;/code&amp;gt; file in the &amp;lt;code&amp;gt;/Eco Server/Mods/UserCode&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
# Start the server and log in.&lt;br /&gt;
# Type &amp;lt;code&amp;gt;/give MedievalStall&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Place the stall down. &#039;&#039;&#039;Pro-tip:&#039;&#039;&#039; Put down a floor of &amp;lt;u&amp;gt;flat roof&amp;lt;/u&amp;gt; tiles made of &#039;&#039;Reinforced Concrete&#039;&#039;. This will show you where the occupancy of your object is when you place it because the roof tiles will change shape under the object. Neat!&lt;br /&gt;
# It should look and function like a normal workbench.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;WikiDemo.unity3d&amp;lt;/code&amp;gt; and the &amp;lt;code&amp;gt;WikiDemo.cs&amp;lt;/code&amp;gt; files are all that is needed to share this mod now.&lt;br /&gt;
&lt;br /&gt;
= Adding a Recipe to Craft =&lt;br /&gt;
To add a recipe to the medieval stall add this to the &amp;lt;code&amp;gt;WikiDemo.cs&amp;lt;/code&amp;gt; file:&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
using Eco.Core.Items;&lt;br /&gt;
using Eco.Gameplay.Components;&lt;br /&gt;
using Eco.Gameplay.Items;&lt;br /&gt;
using Eco.Gameplay.Items.Recipes;&lt;br /&gt;
using Eco.Gameplay.Objects;&lt;br /&gt;
using Eco.Gameplay.Skills;&lt;br /&gt;
using Eco.Mods.TechTree;&lt;br /&gt;
using Eco.Shared.Localization;&lt;br /&gt;
using Eco.Shared.Serialization;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Runtime.Versioning;&lt;br /&gt;
using System;&lt;br /&gt;
using Eco.Core.Controller;&lt;br /&gt;
using Eco.Gameplay.Systems.NewTooltip;&lt;br /&gt;
using Eco.Shared.Items;&lt;br /&gt;
using Eco.Gameplay.Occupancy;&lt;br /&gt;
using Eco.Shared.Math;&lt;br /&gt;
using Eco.Gameplay.Components.Auth;&lt;br /&gt;
&lt;br /&gt;
namespace WikiDemo&lt;br /&gt;
{&lt;br /&gt;
    #region Item&lt;br /&gt;
&lt;br /&gt;
    #region Recipe&lt;br /&gt;
&lt;br /&gt;
    #region Object&lt;br /&gt;
&lt;br /&gt;
    #region CraftingRecipes&lt;br /&gt;
    public partial class MyArrowRecipe : RecipeFamily&lt;br /&gt;
    {&lt;br /&gt;
        [SupportedOSPlatform(&amp;quot;windows7.0&amp;quot;)]&lt;br /&gt;
        public MyArrowRecipe()&lt;br /&gt;
        {&lt;br /&gt;
            var recipe = new Recipe();&lt;br /&gt;
            recipe.Init(&lt;br /&gt;
                name: &amp;quot;Alternate Arrow&amp;quot;,&lt;br /&gt;
                displayName: Localizer.DoStr(&amp;quot;Alternate Arrow&amp;quot;),&lt;br /&gt;
                ingredients: new List&amp;lt;IngredientElement&amp;gt;&lt;br /&gt;
                {&lt;br /&gt;
                    new IngredientElement(&amp;quot;Wood&amp;quot;, 1, typeof(Skill)),&lt;br /&gt;
                    new IngredientElement(&amp;quot;Rock&amp;quot;, 1)&lt;br /&gt;
                },&lt;br /&gt;
                items: new List&amp;lt;CraftingElement&amp;gt;&lt;br /&gt;
                {&lt;br /&gt;
                    new CraftingElement&amp;lt;ArrowItem&amp;gt;(1)&lt;br /&gt;
                }&lt;br /&gt;
            );&lt;br /&gt;
            this.Recipes = new List&amp;lt;Recipe&amp;gt; { recipe };&lt;br /&gt;
            this.LaborInCalories = CreateLaborInCaloriesValue(10);&lt;br /&gt;
            this.CraftMinutes = CreateCraftTimeValue(0.1f);&lt;br /&gt;
&lt;br /&gt;
            // Perform pre/post initialization for user mods and initialize our recipe instance with the display name &amp;quot;Market Stall&amp;quot;&lt;br /&gt;
            this.ModsPreInitialize();&lt;br /&gt;
            this.Initialize(displayText: Localizer.DoStr(&amp;quot;Alternate Arrow Recipe&amp;quot;), recipeType: typeof(MyArrowRecipe));&lt;br /&gt;
            this.ModsPostInitialize();&lt;br /&gt;
&lt;br /&gt;
            // Register our RecipeFamily instance to a work table (in this case the Carpentry Table) so it can be crafted.&lt;br /&gt;
            CraftingComponent.AddRecipe(tableType: typeof(MedievalStallObject), recipeFamily: this); // NOTE: The table must be the object instance!&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;Hook for other mods to customize RecipeFamily before initialization.&amp;lt;/summary&amp;gt;&lt;br /&gt;
        partial void ModsPreInitialize();&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;Hook for other mods to customize RecipeFamily after initialization, but before registration. You can change skill requirements here.&amp;lt;/summary&amp;gt;&lt;br /&gt;
        partial void ModsPostInitialize();&lt;br /&gt;
    }&lt;br /&gt;
    #endregion&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[File:WikiDemo MedievalStall AltArrowRecipe.png|thumb|Shows a new recipe added to the crafting tab of the Medieval Stall.]]&lt;br /&gt;
&#039;&#039;&#039;Line 58:&#039;&#039;&#039; This line here adds this recipe to the &amp;lt;code&amp;gt;MedievalStallObject&amp;lt;/code&amp;gt; just created.&lt;/div&gt;</summary>
		<author><name>WugWugg</name></author>
	</entry>
	<entry>
		<id>https://wiki.play.eco/en/index.php?title=Getting_Started_with_Eco_Modding_in_Visual_Studio&amp;diff=16751</id>
		<title>Getting Started with Eco Modding in Visual Studio</title>
		<link rel="alternate" type="text/html" href="https://wiki.play.eco/en/index.php?title=Getting_Started_with_Eco_Modding_in_Visual_Studio&amp;diff=16751"/>
		<updated>2026-04-29T14:59:22Z</updated>

		<summary type="html">&lt;p&gt;WugWugg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction =&lt;br /&gt;
This guide focuses on setting up a C# modding environment in Visual Studio.&lt;br /&gt;
&lt;br /&gt;
It does &#039;&#039;&#039;not&#039;&#039;&#039; cover adding Unity assets (models, prefabs, UI) to the game. See: [[From 3D Asset to Working Worktable]] for that workflow.&lt;br /&gt;
&lt;br /&gt;
This guide won’t teach you how to code or write a mod, but it will help you get everything set up so you’re ready to start learning. Helpful resources are listed at the bottom of this guide, including [[Helpful Examples for Modding]] for practical code examples.&lt;br /&gt;
&lt;br /&gt;
Visual Studio 2026 has a completely free version called the &#039;&#039;&#039;Community Edition&#039;&#039;&#039;. This guide is written assuming that&#039;s the version used.&lt;br /&gt;
&lt;br /&gt;
=== Have Ready ===&lt;br /&gt;
* A copy of the Eco game installed&lt;br /&gt;
* A file explorer and the file-path to &amp;lt;code&amp;gt;Eco&amp;lt;/code&amp;gt; folder&amp;lt;br&amp;gt;&#039;&#039;&#039;Tip:&#039;&#039;&#039; Within this folder there&#039;s folders like &amp;lt;code&amp;gt;D3D12&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Eco_Data&amp;lt;/code&amp;gt;. Also, you&#039;ll find the &amp;lt;code&amp;gt;Eco.exe&amp;lt;/code&amp;gt; file here. There are other files and folder here too, but this list is just to help you know what the folder looks like.&lt;br /&gt;
* &#039;&#039;&#039;Tip:&#039;&#039;&#039; Steam users can find the install folder by right-clicking on the game in your Steam Library:&amp;lt;br&amp;gt;[[File:Steam Library -- Browse Local Files.png|alt=Shows a Steam Library with a menu open over the Eco game. Highlighted in that menu is a &amp;quot;Manage&amp;quot; option, opening a sub-menu. The sub-menu has &amp;quot;Browse local files&amp;quot; highlighted.|frameless|border|upright=3|location=center|link=]]&lt;br /&gt;
&lt;br /&gt;
= Installing Visual Studio =&lt;br /&gt;
# Go to &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://visualstudio.microsoft.com/downloads/#visual-studio-community-2026&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; and look for the &amp;quot;&#039;&#039;&#039;Visual Studio Community 2026&#039;&#039;&#039;&amp;quot; download.&lt;br /&gt;
# Start the download by clicking on the &#039;&#039;Download&#039;&#039; button.&lt;br /&gt;
# Run the installer until it reaches the Workloads page&lt;br /&gt;
# Select these workloads...&lt;br /&gt;
## .NET desktop development -- &#039;&#039;&#039;Required&#039;&#039;&#039; for any mod development&lt;br /&gt;
## ASP.NET and web development -- Optional. If you want to interact with external websites or Eco&#039;s own web server (e.g. Discord&#039;s webhooks or extending the API)&lt;br /&gt;
# With those workloads selected the page should look something like this:&amp;lt;br&amp;gt;[[File:VisualStudioCommunity2022 Workloads.png|alt=Workloads screen during VS2022 installation. Options selected are &amp;quot;ASP.NET and web development&amp;quot; and &amp;quot;.NET desktop development&amp;quot;. |frameless|location=center|upright=4|link=|border]]&lt;br /&gt;
# Click the Install button. It will take a few minutes to complete installation.&lt;br /&gt;
# Open Visual Studio after it installs.&lt;br /&gt;
# You may be prompted to sign in:&lt;br /&gt;
## Click &#039;&#039;Skip and add accounts later&#039;&#039; to continue.&lt;br /&gt;
## If you plan to use GitHub, sign in to make version control easier.&lt;br /&gt;
# Finally, it might ask what color theme you&#039;d like. Select your preference and continue.&lt;br /&gt;
# Visual Studio is now installed and ready to be used.&lt;br /&gt;
&lt;br /&gt;
= Setting Up a New Mod =&lt;br /&gt;
Once Eco and Visual Studio are installed, all of the tools needed to code, build, and run a mod are ready.&lt;br /&gt;
&lt;br /&gt;
== Creating a New Project ==&lt;br /&gt;
# Open Visual Studio. When it first opens it will show you a dashboard where you can quickly select what you want to do.&lt;br /&gt;
# On the right, under &#039;&#039;Get Started&#039;&#039; find the &#039;&#039;Create a new project&#039;&#039; button:&amp;lt;br&amp;gt;[[File:VS2022 OpeningDashboard.png|alt=VS2022&#039;s launch dashboard showing recent projects on the left and quick action buttons on the right. Highlighted is a button titled &amp;quot;Create a new project&amp;quot;.|frameless|border|link=|location=center|upright=4]]&lt;br /&gt;
# A new window will pop-up.&lt;br /&gt;
# Select C# &#039;&#039;Class Library.&#039;&#039; To find the template, search &amp;lt;code&amp;gt;C# library&amp;lt;/code&amp;gt; in the search bar. Select the C# option titled &#039;&#039;Class Library&#039;&#039;.&amp;lt;br&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; &amp;lt;u&amp;gt;Make sure you select the &amp;lt;code&amp;gt;C#&amp;lt;/code&amp;gt; option as there are other options similarly named &#039;&#039;Class Library&#039;&#039;.&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt;[[File:VS2022 NewProjectWizard Templates.png|frameless|border|location=center|upright=4|link=]]&lt;br /&gt;
# Click the &#039;&#039;Next&#039;&#039; button.&lt;br /&gt;
# For &#039;&#039;Project Name&#039;&#039; type the name of the mod being created.&lt;br /&gt;
# The other options like the &#039;&#039;Location&#039;&#039; and the &#039;&#039;Solution Name&#039;&#039; do not need edited.&lt;br /&gt;
# Leave the box &#039;&#039;Place solution and project in the same directory&#039;&#039; unchecked.&lt;br /&gt;
# Click the Next button.&lt;br /&gt;
# In the &#039;&#039;Framework&#039;&#039; drop-down select the same version of .NET Eco uses (as described below). &#039;&#039;&#039;Tip:&#039;&#039;&#039; Eco currently targets &#039;&#039;.NET 10.0&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== .NET Version ==&lt;br /&gt;
To confirm the version of .NET that Eco uses:&lt;br /&gt;
&lt;br /&gt;
# Go to the NuGet Gallery &amp;lt;code&amp;gt;www.nuget.org/packages?q=Eco.ReferenceAssemblies&amp;lt;/code&amp;gt;&amp;lt;!-- I&#039;m not directly linking to the package as there is no way to link to the latest version. So as a workaround I&#039;m using the search to point the reader to the latest version. --&amp;gt;&lt;br /&gt;
# Find the package with the name &#039;&#039;Eco.ReferenceAssemblies&#039;&#039; made by &#039;&#039;StrangeLoopGames&#039;&#039;.&lt;br /&gt;
# Notice the chip underneath of it with the &#039;&#039;.NET&#039;&#039; version it targets.&amp;lt;br&amp;gt;[[File:NuGetGallery -- Eco.ReferenceAssemblies Search.png|alt=Shows the search result of Eco.ReferenceAssemblies. In a blue chip the text &amp;quot;.NET 8.0&amp;quot; can be seen.|frameless|upright=4|location=center|link=|border]]&lt;br /&gt;
# Click on that search result (shown above).&lt;br /&gt;
# A more detailed page is shown. Again, there&#039;s chips showing what version of .NET to use:&amp;lt;br&amp;gt;[[File:NuGetGallery--Eco.ReferenceAssemblies Details.png|alt=Show the package page for &amp;quot;Eco.ReferenceAssemblies&amp;quot; on NuGet Gallery. Circled in red are two chips with some version of the text &amp;quot;.NET 8.0&amp;quot; inside them.|frameless|link=|border|location=center|upright=3]]&lt;br /&gt;
&lt;br /&gt;
== Linking to Eco Assemblies ==&lt;br /&gt;
# Find the &#039;&#039;Solution Explorer&#039;&#039; on the right side of Visual Studio. It should look something like this:&amp;lt;br&amp;gt;&#039;&#039;&#039;Note&#039;&#039;&#039;: If the solution explorer isn&#039;t there, open the &#039;&#039;View&#039;&#039; menu (top toolbar) and select &#039;&#039;Solution Explorer&#039;&#039;.&amp;lt;br&amp;gt;[[File:VS2022 -- Solution Explorer.png|alt=A picture of a basic layout in Visual Studio 2022 with the Solution Explorer open on the right-hand side. The solution explorer is circled in red.|frameless|link=|upright=4|location=center|border]]&lt;br /&gt;
# In the &#039;&#039;Solution Explorer&#039;&#039;, find and right-click on the &#039;&#039;Dependencies&#039;&#039; item.&lt;br /&gt;
# Select &#039;&#039;Manage NuGet Packages...&#039;&#039;&amp;lt;br&amp;gt;[[File:VS2022 Solution Explorer -- Manage NuGet Packages.png|alt=Shows VS2022&#039;s Solution Explorer with project expanded. The References line is highlighted and a menu is open. On that menu the &amp;quot;Manage NuGet Packages&amp;quot; line is highlighted.|frameless|link=|upright=4|location=center|border]]&lt;br /&gt;
# A &#039;&#039;NuGet&#039;&#039; tab will have opened in the editor window...&lt;br /&gt;
## Right above the search bar on this tab there&#039;s sub-tabs.&lt;br /&gt;
## Select the &#039;&#039;Browse&#039;&#039; sub-tab.&lt;br /&gt;
## Type &amp;lt;code&amp;gt;Eco.ReferenceAssemblies&amp;lt;/code&amp;gt; into the search bar.&lt;br /&gt;
## Check the &#039;&#039;Include prerelease&#039;&#039; check-box.&lt;br /&gt;
## Find the option with the name &#039;&#039;Eco.ReferenceAssemblies&#039;&#039; made by &#039;&#039;StrangeLoopGames&#039;&#039;.&lt;br /&gt;
## Click on that.&lt;br /&gt;
## A details panel will show up to the right. It will show the version of the reference assemblies being targeted. By default it chooses the latest and can be left at its default.&lt;br /&gt;
## Click the Install button.&lt;br /&gt;
### Click the &#039;&#039;Apply&#039;&#039; button on the popup to finish adding the references.&amp;lt;br&amp;gt;[[File:VS2022 -- NuGet Install Eco.ReferenceAssemblies.png|alt=VS2022 is open to the NuGet tab and is searching with the text Eco.ReferenceAssemblies. The checkbox to the right of the search is checked -- include prerelease. The only search result is selected. There is yellow highlights over part of the photo.|frameless|link=|upright=4|location=center|border]] &lt;br /&gt;
# The reference assemblies have now been added. That means when coding Visual Studio will provide IntelliSense popups.&lt;br /&gt;
# Try it out by going back to the &amp;lt;code&amp;gt;Class1.cs&amp;lt;/code&amp;gt; file and typing &amp;lt;code&amp;gt;Eco.&amp;lt;/code&amp;gt; and suggestions will pop up.&lt;br /&gt;
&lt;br /&gt;
= Dynamic Link Library (DLL) =&lt;br /&gt;
Building the mod creates the &amp;lt;code&amp;gt;.dll&amp;lt;/code&amp;gt; file that can be dropped into the &amp;lt;code&amp;gt;Mods/UserCode&amp;lt;/code&amp;gt; folder of any server and run.&lt;br /&gt;
&lt;br /&gt;
== Building for Development ==&lt;br /&gt;
&lt;br /&gt;
# Open the project in Visual Studio.&lt;br /&gt;
# Open the &#039;&#039;Build&#039;&#039; menu from the top toolbar.&lt;br /&gt;
# Select &#039;&#039;Build Solution&#039;&#039;. This will produce a non-optimized DLL used for testing and development.&amp;lt;br&amp;gt;[[File:VS2022 -- Build Menu.png|alt=VS2022 top menu &amp;quot;Build&amp;quot; is open with &amp;quot;build solution&amp;quot; highlighted (ctrl + shift + b).|frameless|link=|upright=4|location=center|border]]&lt;br /&gt;
# To find the file Visual Studio just built, right click on the project in the Solution Explorer.&lt;br /&gt;
# Select &#039;&#039;Open Folder in File Explorer.&#039;&#039;&amp;lt;br&amp;gt;[[File:VS2022 -- Project Menu.png|alt=VS2022&#039;s solution explorer is shown with the projects right-click menu open. Highlighted is &amp;quot;Open folder in File Explorer&amp;quot;|frameless|link=|upright=4|location=center|border]]&lt;br /&gt;
# From here, the mod&#039;s DLL will be in the &amp;lt;code&amp;gt;bin/Debug/net10.0/&amp;lt;/code&amp;gt; folder. The file will be named with mod&#039;s name, like &amp;lt;code&amp;gt;TheMod.dll&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Copy the mod&#039;s DLL file.&lt;br /&gt;
# Paste it into the folder &amp;lt;code&amp;gt;Eco/Eco_Data/Server/Mods/UserCode&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Checkpoint ===&lt;br /&gt;
&lt;br /&gt;
# Start Eco and create a local world to see if the mod is being loaded.&lt;br /&gt;
# Check the logs at &amp;lt;code&amp;gt;Eco/Eco_Data/Server/Logs/&amp;lt;/code&amp;gt; to verify...&lt;br /&gt;
## Open the &amp;lt;u&amp;gt;most recent&amp;lt;/u&amp;gt; log file here.&lt;br /&gt;
## If the mod was loaded it there will be a line mentioning the file-name of the DLL. If the DLL was named &amp;lt;code&amp;gt;TheMod.dll&amp;lt;/code&amp;gt;, line 5 is what to look for in the log file:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[13:55:54.815] [4] [ Info] [Eco] Starting ModKitPlugin                             ...  &lt;br /&gt;
[13:56:27.399] [4] [ Info] [Eco] Starting ModKitPlugin                             ... Finished in 32.584 sec&lt;br /&gt;
 &lt;br /&gt;
[13:56:27.439] [4] [ Info] [Eco] Loading mods                                      ...  &lt;br /&gt;
[13:56:27.439] [9] [ Info] [Eco] Loading TheMod...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tip:&#039;&#039;&#039; Setup File Explorer to Sort By Date&lt;br /&gt;
&lt;br /&gt;
# Setup the file view to &#039;&#039;Details&#039;&#039; in this folder because it will show the &#039;&#039;Date Modified&#039;&#039; for each file.&amp;lt;br&amp;gt;[[File:File Explorer -- View Settings Menu.png|alt=Show Window&#039;s File Explorer&#039;s view setting menu with the &amp;quot;details&amp;quot; option highlighted.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
# Click on the &#039;&#039;Date Modified&#039;&#039; header to sort all files. This will sort it so the most recent is on top. Now, every time the server starts the log file is easily found -- it&#039;s the one on top!&amp;lt;br&amp;gt;[[File:File Explorer -- Details Example.png|alt=Show&#039;s window&#039;s File Explorer with the date modified header highlighted.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
== Building for Release ==&lt;br /&gt;
Release builds are optimized and intended for sharing. Unlike Debug builds, they exclude extra debugging overhead and produce a cleaner, final version of your mod.&lt;br /&gt;
&lt;br /&gt;
# Open the project in Visual Studio.&lt;br /&gt;
# Click on the mod&#039;s project in the Solution Explorer to highlight it.&amp;lt;br&amp;gt;[[File:VS2022 -- Solution Explorer Project Highlight.png|alt=Shows VS2022&#039;s solution explorer with the project highlighted.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
# Open the &#039;&#039;Build&#039;&#039; menu from the top toolbar.&lt;br /&gt;
# Select &#039;&#039;Publish Selection&#039;&#039;.&lt;br /&gt;
# A new &#039;&#039;Publish&#039;&#039; window will pop-up.&lt;br /&gt;
# Set the target &#039;&#039;as Folder&#039;&#039;.&lt;br /&gt;
# Click the &#039;&#039;Next&#039;&#039; button.&amp;lt;br&amp;gt;[[File:VS2022 -- Publish Wizard.png|alt=VS2022&#039;s publish wizard showing the target selection screen. The Folder option is highlighted.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
# Leave the folder location as it is.&lt;br /&gt;
# Click the &#039;&#039;Finish&#039;&#039; button.&lt;br /&gt;
# Click the &#039;&#039;Close&#039;&#039; button.&lt;br /&gt;
# Click the &#039;&#039;Publish&#039;&#039; button to start the build. This may take a minute.&lt;br /&gt;
# A green alert will pop up when the build is completed:&amp;lt;br&amp;gt;[[File:VS2022 -- Publish Screen.png|alt=Show&#039;s VS2022 publish screen. There&#039;s publish button at the top of this screen.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
# Inside the alert there will be a blue &#039;&#039;Navigate&#039;&#039; link. Click it.&lt;br /&gt;
# A file explorer should have opened to where the &amp;lt;code&amp;gt;.dll&amp;lt;/code&amp;gt; file is.&lt;br /&gt;
# The mod file will be named with the mod project&#039;s name. For example, &amp;lt;code&amp;gt;TheMod.dll&amp;lt;/code&amp;gt;. &lt;br /&gt;
# To share this mod, the only file needed is the mod&#039;s &amp;lt;code&amp;gt;.dll&amp;lt;/code&amp;gt;.  Do not copy any of the &amp;lt;code&amp;gt;.dll&amp;lt;/code&amp;gt; files starting with &#039;&#039;Eco&#039;&#039; or &#039;&#039;StrangeCloud&#039;&#039;. Additionally, do not copy the &amp;lt;code&amp;gt;TheMod.deps.json&amp;lt;/code&amp;gt; or the &amp;lt;code&amp;gt;TheMod.pdb&amp;lt;/code&amp;gt; files.&lt;br /&gt;
&lt;br /&gt;
= Post-Build Scripts =&lt;br /&gt;
With a post-build script Visual Studio will automatically copy the files into the Eco &amp;lt;code&amp;gt;Mods/UserCode&amp;lt;/code&amp;gt; folder every time it builds. It&#039;s a very nice feature to have when developing and rebuilding to test something new.&lt;br /&gt;
&lt;br /&gt;
# Open the project in Visual Studio.&lt;br /&gt;
# Right-click on the project in the &#039;&#039;Solution Explorer.&#039;&#039;&lt;br /&gt;
# Select &#039;&#039;↱&#039;&#039; &#039;&#039;Edit Project File&#039;&#039; option.&lt;br /&gt;
# Add the properties &amp;lt;code&amp;gt;EcoServerExe&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;EcoServerDir&amp;lt;/code&amp;gt; inside of the &amp;lt;code&amp;gt;PropertyGroup&amp;lt;/code&amp;gt; tag.&amp;lt;br&amp;gt;&#039;&#039;&#039;Tip:&#039;&#039;&#039; By holding shift and right-clicking on a file in the file explorer an old-school menu pops up. Midway down this menu is an option to &#039;&#039;Copy As Path&#039;&#039;. Neat!&lt;br /&gt;
# The project file should look something like this (lines 8-9):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Project Sdk=&amp;quot;Microsoft.NET.Sdk&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;PropertyGroup&amp;gt;&lt;br /&gt;
    &amp;lt;TargetFramework&amp;gt;net10.0&amp;lt;/TargetFramework&amp;gt;&lt;br /&gt;
    &amp;lt;ImplicitUsings&amp;gt;enable&amp;lt;/ImplicitUsings&amp;gt;&lt;br /&gt;
    &amp;lt;Nullable&amp;gt;enable&amp;lt;/Nullable&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- Point this at your Eco source server Mods/UserCode --&amp;gt;&lt;br /&gt;
    &amp;lt;EcoModsDir&amp;gt;C:\Program Files (x86)\Steam\steamapps\common\Eco\Eco_Data\Server\Mods\UserCode&amp;lt;/EcoModsDir&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
  &amp;lt;/PropertyGroup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;ItemGroup&amp;gt;&lt;br /&gt;
    &amp;lt;PackageReference Include=&amp;quot;Eco.ReferenceAssemblies&amp;quot; Version=&amp;quot;0.11.1.13-beta-release-887&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/ItemGroup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/Project&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# Add the &amp;lt;code&amp;gt;PostBuild&amp;lt;/code&amp;gt; property inside the &amp;lt;code&amp;gt;Project&amp;lt;/code&amp;gt; tag.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Project Sdk=&amp;quot;Microsoft.NET.Sdk&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;PropertyGroup&amp;gt;&lt;br /&gt;
    ... SNIP ...&lt;br /&gt;
  &amp;lt;/PropertyGroup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;ItemGroup&amp;gt;&lt;br /&gt;
    ... SNIP ...&lt;br /&gt;
  &amp;lt;/ItemGroup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Target Name=&amp;quot;CopyModToEco&amp;quot; AfterTargets=&amp;quot;Build&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;Copy SourceFiles=&amp;quot;$(TargetPath)&amp;quot; DestinationFolder=&amp;quot;$(EcoModsDir)&amp;quot; SkipUnchangedFiles=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;Copy SourceFiles=&amp;quot;$(TargetDir)$(TargetName).pdb&amp;quot; DestinationFolder=&amp;quot;$(EcoModsDir)&amp;quot; SkipUnchangedFiles=&amp;quot;true&amp;quot; Condition=&amp;quot;Exists(&#039;$(TargetDir)$(TargetName).pdb&#039;)&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Target&amp;gt;&lt;br /&gt;
&amp;lt;/Project&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# Build the project.&lt;br /&gt;
# Look in the &amp;lt;code&amp;gt;Mods/UserCode&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
# There should be &amp;lt;code&amp;gt;TheMod.dll&amp;lt;/code&amp;gt; file.&lt;br /&gt;
&lt;br /&gt;
= Setting up Debugging =&lt;br /&gt;
To set up debugging, make sure the project is configured with the post-build script described above.&lt;br /&gt;
&lt;br /&gt;
Debugging is a powerful tool that allows you to set breakpoints anywhere in your code to pause execution. While paused, you can inspect variable values and step through the code line by line. This is invaluable when tracking down bugs or understanding complex behavior.&lt;br /&gt;
&lt;br /&gt;
When running the server in debug mode, code changes can be hot-reloaded. This allows you to modify code and apply changes without rebuilding and restarting Eco, significantly speeding up development.&lt;br /&gt;
&lt;br /&gt;
# Open the &#039;&#039;Debug&#039;&#039; menu from the top toolbar.&lt;br /&gt;
# Select &#039;&#039;YourModName Debug Properties&#039;&#039; from the bottom of the menu.&amp;lt;br&amp;gt;[[File:VS2022 -- Debug Menu.png|alt=VS2022&#039;s debug menu is open from the top of the application. Highlighted is the last option &amp;quot;Debug Properties&amp;quot;.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
# Click the &#039;&#039;Create a new profile&#039;&#039; button in the top-left of this new window (see image below).&lt;br /&gt;
# Select &#039;&#039;Executable&#039;&#039; from the drop-down menu.&amp;lt;br&amp;gt;[[File:VS2022 -- Debugger Launch Profiles.png|alt=VS2022&#039;s launch profile window is open. Underlined and pointed to by a red mark is the &amp;quot;Create a new profile&amp;quot; button, located in the top-left of the window. Highlighted from the menu under it is the option reading &amp;quot;Executable&amp;quot;.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
# Set the &#039;&#039;Executable&#039;&#039; field to the full path to the &amp;lt;code&amp;gt;EcoServer.exe&amp;lt;/code&amp;gt; file.&amp;lt;br&amp;gt;&#039;&#039;&#039;Example:&#039;&#039;&#039; &amp;lt;code&amp;gt;C:\Program Files (x86)\Steam\steamapps\common\Eco\Eco_Data\Server&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;\EcoServer.exe&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Set the &#039;&#039;Working Directory&#039;&#039; field to the full path to the folder containing the &amp;lt;code&amp;gt;EcoServer.exe&amp;lt;/code&amp;gt; file.&amp;lt;br&amp;gt;&#039;&#039;&#039;Example:&#039;&#039;&#039; &amp;lt;code&amp;gt;C:\Program Files (x86)\Steam\steamapps\common\Eco\Eco_Data\Server&amp;lt;/code&amp;gt;.&amp;lt;br&amp;gt;[[File:VS2022 -- Eco Debugging Profile.png|alt=A fully configured profile ready to debug Eco on VS2022&#039;s launch profile page.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
# Switch to this newly configured profile by clicking the small arrow to the right of the play icon (see image).&amp;lt;br&amp;gt;[[File:VS2022 -- Debugger Profile Selection.png|alt=VS2022&#039;s debugger profile selection menu is open with the newly created &amp;quot;Profile 1&amp;quot; highlighted.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
# Select the newly created profile -- &#039;&#039;Profile 1&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Checkpoint ===&lt;br /&gt;
&lt;br /&gt;
# Put the following in &amp;lt;code&amp;gt;Class1.cs&amp;lt;/code&amp;gt; file:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
using Eco.Core.Plugins.Interfaces;&lt;br /&gt;
using Eco.Core.Utils;&lt;br /&gt;
using Eco.ModKit;&lt;br /&gt;
&lt;br /&gt;
namespace Test&lt;br /&gt;
{&lt;br /&gt;
    public class Class1 : IModKitPlugin, IInitializablePlugin&lt;br /&gt;
    {&lt;br /&gt;
        public string GetCategory() =&amp;gt; &amp;quot;Tutorial&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        public string GetStatus() =&amp;gt; this._status;&lt;br /&gt;
        string _status = string.Empty;&lt;br /&gt;
&lt;br /&gt;
        public void Initialize(TimedTask timer)&lt;br /&gt;
        {&lt;br /&gt;
            this._status = &amp;quot;Ok&amp;quot;;&lt;br /&gt;
            bool yes = true;&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    [ChatCommandHandler]&lt;br /&gt;
    [SupportedOSPlatform(&amp;quot;windows7.0&amp;quot;)]&lt;br /&gt;
    public static class CommonCentsCommands&lt;br /&gt;
    {&lt;br /&gt;
        [ChatCommand(&amp;quot;wikiTest&amp;quot;, ChatAuthorizationLevel.Moderator)]&lt;br /&gt;
        public static void wikiTest(IChatClient chat)&lt;br /&gt;
        {&lt;br /&gt;
            chat.MsgLoc($&amp;quot;Hello, World.&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
This code creates a basic plugin, called &amp;lt;code&amp;gt;Class1&amp;lt;/code&amp;gt;, that Eco will load and initialize on startup. Eco knows to do this because this class inherits the &amp;lt;code&amp;gt;IModKitPlugin&amp;lt;/code&amp;gt; interface (causes it to be loaded) and the &amp;lt;code&amp;gt;IInitializablePlugin&amp;lt;/code&amp;gt; interface (causes it to be initialized).&lt;br /&gt;
# Add a breakpoint to the code by right-clicking on the line &amp;lt;code&amp;gt;bool yes = true;&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;[[File:VS2022 -- Adding a breakpoint.png|alt=A boilerplate example of a mod is shown in the VS2022 text editor. A line has a menu open above it with the option &amp;quot;Breakpoint&amp;quot; expanded and the option &amp;quot;Insert Breakpoint&amp;quot; highlighted on the sub-menu.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
# Click the green &#039;&#039;⏵&#039;&#039; button to start the server with the mod. The server will start and Visual Studio will flash back on screen once Eco tries to initialize the mod&#039;s plugin.&amp;lt;br&amp;gt;[[File:VS2022 -- Launch Debugger.png|alt=Highlighted is the play button for VS2022&#039;s debugger. The &amp;quot;Profile 1&amp;quot; is still selected from before.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
# When Visual Studio hits the breakpoint it will keep startup from continuing and allow detailed inspection to happen. In the bottom left (circled in red) is a table of all of the variables within scope. Use this to see what is happening (especially useful in loops!). At the middle-top (circled in red) are some of the debugger controls. Clicking the highlighted &#039;&#039;Continue&#039;&#039; button resumes normal operation. Using the buttons to the right that are highlighted will allow the developer to step through the codes execution to see exactly how each line is performing. Debugging is a deep and rich topic that this guide will not explain further, but there&#039;s a great video by Microsoft Visual Studio on YouTube called Basics of Debugging. In that 45 minute video (don&#039;t worry there&#039;s annotations to jump to just what is interesting) a whole gamut of information about how to use debugging is covered.&amp;lt;br&amp;gt;[[File:VS2022 -- Debugger LIve.png|alt=Shows a simple plugin&#039;s code in the editor of VS2022. In the bottom-left is a table of all variables used in the function. It is circled in red. On the top of the image also circled in red is the debugger controls. Highlighted within is the continue button and the &amp;quot;step over&amp;quot; button.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
# Hit the green&#039;&#039;⏵&#039;&#039; &#039;&#039;Continue&#039;&#039; button.&lt;br /&gt;
# Let the server finish loading.&lt;br /&gt;
# Open Eco to play.&lt;br /&gt;
# Connect to the LAN world by named something like &#039;&#039;Eco World&#039;&#039;.&lt;br /&gt;
# Type &amp;lt;code&amp;gt;/wikiDemo&amp;lt;/code&amp;gt; in chat.&lt;br /&gt;
# See that the mod replies with &#039;&#039;Hello, World.&#039;&#039;&lt;br /&gt;
# Change line 29 in &amp;lt;code&amp;gt;Class1.cs&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;chat.MsgLoc($&amp;quot;Hello, Modder!&amp;quot;);&amp;lt;/code&amp;gt;&lt;br /&gt;
# Hit the hot reload button. It&#039;s just to the right of the green &#039;&#039;⏵&#039;&#039; &#039;&#039;Continue&#039;&#039; button and vaguely looks like the 🔥 icon.&lt;br /&gt;
# Type &amp;lt;code&amp;gt;/wikiDemo&amp;lt;/code&amp;gt; in chat.&lt;br /&gt;
# See that the mod now replies with &#039;&#039;Hello, Modder!&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Releasing a Mod ==&lt;br /&gt;
&lt;br /&gt;
=== Mod.io ===&lt;br /&gt;
&amp;lt;code&amp;gt;mod.io&amp;lt;/code&amp;gt; is where creators share their mods with players and others. To share a new mod there all that is necessary is an account:&lt;br /&gt;
&lt;br /&gt;
# Goto &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://mod.io/g/eco&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; and click &amp;quot;Login&amp;quot; in the top-right corner.&lt;br /&gt;
# Sign up with whatever account type you prefer.&lt;br /&gt;
# Click the &amp;quot;Add Mod&amp;quot; button in the top-right.&lt;br /&gt;
# Follow the upload wizard as directed.&lt;br /&gt;
# Once on the &amp;quot;File Manager&amp;quot; section, a zip file is needed...&lt;br /&gt;
## Zip the mod&#039;s &amp;lt;code&amp;gt;release/&amp;lt;/code&amp;gt; dll and any other assets necessary (e.g. Unity bundles) by putting all the files into a folder.&lt;br /&gt;
## Right-click on that folder&lt;br /&gt;
## Hover &amp;quot;Compress To...&amp;quot;&lt;br /&gt;
## Select &amp;quot;ZIP file&amp;quot;.&lt;br /&gt;
## Use and upload that zip file.&amp;lt;br&amp;gt;&#039;&#039;&#039;Tip:&#039;&#039;&#039; Considering naming it with a version number to help stay organized (e.g. &amp;quot;v1&amp;quot;). Next release, increase that number by 1 (e.g. &amp;quot;v2&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
=== Sharing on Discord ===&lt;br /&gt;
Consider posting an ad on the official {{EcoDiscord}}. There&#039;s a channel for mods called &#039;&#039;mod-ads&#039;&#039;. &lt;br /&gt;
Please read the rules before posting.&lt;br /&gt;
&lt;br /&gt;
== Helpful Resources ==&lt;br /&gt;
&lt;br /&gt;
* Consider learning source control (Git). Completely optional, but can help you keep things organized as development continues.&lt;br /&gt;
* Explore Eco’s open-source mod projects for ideas (search on GitHub &amp;quot;Eco Mods&amp;quot; to find some real-life examples)&lt;br /&gt;
** {{EcoDiscord}}has a channel for mod developers to help one another called &#039;&#039;mod-dev.&#039;&#039; &#039;&#039;&#039;Note:&#039;&#039;&#039; Make under the &#039;&#039;Channel &amp;amp; Roles&#039;&#039; settings you have the 🛠&#039;&#039;Yes, I want to see the channels about modding&#039;&#039; role selected.&lt;/div&gt;</summary>
		<author><name>WugWugg</name></author>
	</entry>
	<entry>
		<id>https://wiki.play.eco/en/index.php?title=Getting_Started_with_Eco_Modding_in_Visual_Studio&amp;diff=16750</id>
		<title>Getting Started with Eco Modding in Visual Studio</title>
		<link rel="alternate" type="text/html" href="https://wiki.play.eco/en/index.php?title=Getting_Started_with_Eco_Modding_in_Visual_Studio&amp;diff=16750"/>
		<updated>2026-04-29T14:55:30Z</updated>

		<summary type="html">&lt;p&gt;WugWugg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction =&lt;br /&gt;
This guide focuses on setting up a C# modding environment in Visual Studio.&lt;br /&gt;
&lt;br /&gt;
It does &#039;&#039;&#039;not&#039;&#039;&#039; cover adding Unity assets (models, prefabs, UI) to the game. See: [[From 3D Asset to Working Worktable]] for that workflow.&lt;br /&gt;
&lt;br /&gt;
This guide won’t teach you how to code or write a mod, but it will help you get everything set up so you’re ready to start learning. Helpful resources are listed at the bottom of this guide, including [[Helpful Examples for Modding]] for practical code examples.&lt;br /&gt;
&lt;br /&gt;
Visual Studio 2026 has a completely free version called the &#039;&#039;&#039;Community Edition&#039;&#039;&#039;. This guide is written assuming that&#039;s the version used.&lt;br /&gt;
&lt;br /&gt;
=== Have Ready ===&lt;br /&gt;
* A copy of the Eco game installed&lt;br /&gt;
* A file explorer and the file-path to &amp;lt;code&amp;gt;Eco&amp;lt;/code&amp;gt; folder&amp;lt;br&amp;gt;&#039;&#039;&#039;Tip:&#039;&#039;&#039; Within this folder there&#039;s folders like &amp;lt;code&amp;gt;D3D12&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Eco_Data&amp;lt;/code&amp;gt;. Also, you&#039;ll find the &amp;lt;code&amp;gt;Eco.exe&amp;lt;/code&amp;gt; file here. There are other files and folder here too, but this list is just to help you know what the folder looks like.&lt;br /&gt;
* &#039;&#039;&#039;Tip:&#039;&#039;&#039; Steam users can find the install folder by right-clicking on the game in your Steam Library:&amp;lt;br&amp;gt;[[File:Steam Library -- Browse Local Files.png|alt=Shows a Steam Library with a menu open over the Eco game. Highlighted in that menu is a &amp;quot;Manage&amp;quot; option, opening a sub-menu. The sub-menu has &amp;quot;Browse local files&amp;quot; highlighted.|frameless|border|upright=3|location=center|link=]]&lt;br /&gt;
&lt;br /&gt;
= Installing Visual Studio =&lt;br /&gt;
# Go to &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://visualstudio.microsoft.com/downloads/#visual-studio-community-2026&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; and look for the &amp;quot;&#039;&#039;&#039;Visual Studio Community 2026&#039;&#039;&#039;&amp;quot; download.&lt;br /&gt;
# Start the download by clicking on the &#039;&#039;Download&#039;&#039; button.&lt;br /&gt;
# Run the installer until it reaches the Workloads page&lt;br /&gt;
# Select these workloads...&lt;br /&gt;
## .NET desktop development -- &#039;&#039;&#039;Required&#039;&#039;&#039; for any mod development&lt;br /&gt;
## ASP.NET and web development -- Optional. If you want to interact with external websites or Eco&#039;s own web server (e.g. Discord&#039;s webhooks or extending the API)&lt;br /&gt;
# With those workloads selected the page should look something like this:&amp;lt;br&amp;gt;[[File:VisualStudioCommunity2022 Workloads.png|alt=Workloads screen during VS2022 installation. Options selected are &amp;quot;ASP.NET and web development&amp;quot; and &amp;quot;.NET desktop development&amp;quot;. |frameless|location=center|upright=4|link=|border]]&lt;br /&gt;
# Click the Install button. It will take a few minutes to complete installation.&lt;br /&gt;
# Open Visual Studio after it installs.&lt;br /&gt;
# You may be prompted to sign in:&lt;br /&gt;
## Click &#039;&#039;Skip and add accounts later&#039;&#039; to continue.&lt;br /&gt;
## If you plan to use GitHub, sign in to make version control easier.&lt;br /&gt;
# Finally, it might ask what color theme you&#039;d like. Select your preference and continue.&lt;br /&gt;
# Visual Studio is now installed and ready to be used.&lt;br /&gt;
&lt;br /&gt;
= Setting Up a New Mod =&lt;br /&gt;
Once Eco and Visual Studio are installed, all of the tools needed to code, build, and run a mod are ready.&lt;br /&gt;
&lt;br /&gt;
== Creating a New Project ==&lt;br /&gt;
# Open Visual Studio. When it first opens it will show you a dashboard where you can quickly select what you want to do.&lt;br /&gt;
# On the right, under &#039;&#039;Get Started&#039;&#039; find the &#039;&#039;Create a new project&#039;&#039; button:&amp;lt;br&amp;gt;[[File:VS2022 OpeningDashboard.png|alt=VS2022&#039;s launch dashboard showing recent projects on the left and quick action buttons on the right. Highlighted is a button titled &amp;quot;Create a new project&amp;quot;.|frameless|border|link=|location=center|upright=4]]&lt;br /&gt;
# A new window will pop-up.&lt;br /&gt;
# Select C# &#039;&#039;Class Library.&#039;&#039; To find the template, search &amp;lt;code&amp;gt;C# library&amp;lt;/code&amp;gt; in the search bar. Select the C# option titled &#039;&#039;Class Library&#039;&#039;.&amp;lt;br&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; &amp;lt;u&amp;gt;Make sure you select the &amp;lt;code&amp;gt;C#&amp;lt;/code&amp;gt; option as there are other options similarly named &#039;&#039;Class Library&#039;&#039;.&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt;[[File:VS2022 NewProjectWizard Templates.png|frameless|border|location=center|upright=4|link=]]&lt;br /&gt;
# Click the &#039;&#039;Next&#039;&#039; button.&lt;br /&gt;
# For &#039;&#039;Project Name&#039;&#039; type the name of the mod being created.&lt;br /&gt;
# The other options like the &#039;&#039;Location&#039;&#039; and the &#039;&#039;Solution Name&#039;&#039; do not need edited.&lt;br /&gt;
# Leave the box &#039;&#039;Place solution and project in the same directory&#039;&#039; unchecked.&lt;br /&gt;
# Click the Next button.&lt;br /&gt;
# In the &#039;&#039;Framework&#039;&#039; drop-down select the same version of .NET Eco uses (as described below). &#039;&#039;&#039;Tip:&#039;&#039;&#039; Eco currently targets &#039;&#039;.NET 10.0&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== .NET Version ==&lt;br /&gt;
To confirm the version of .NET that Eco uses:&lt;br /&gt;
&lt;br /&gt;
# Go to the NuGet Gallery &amp;lt;code&amp;gt;www.nuget.org/packages?q=Eco.ReferenceAssemblies&amp;lt;/code&amp;gt;&amp;lt;!-- I&#039;m not directly linking to the package as there is no way to link to the latest version. So as a workaround I&#039;m using the search to point the reader to the latest version. --&amp;gt;&lt;br /&gt;
# Find the package with the name &#039;&#039;Eco.ReferenceAssemblies&#039;&#039; made by &#039;&#039;StrangeLoopGames&#039;&#039;.&lt;br /&gt;
# Notice the chip underneath of it with the &#039;&#039;.NET&#039;&#039; version it targets.&amp;lt;br&amp;gt;[[File:NuGetGallery -- Eco.ReferenceAssemblies Search.png|alt=Shows the search result of Eco.ReferenceAssemblies. In a blue chip the text &amp;quot;.NET 8.0&amp;quot; can be seen.|frameless|upright=4|location=center|link=|border]]&lt;br /&gt;
# Click on that search result (shown above).&lt;br /&gt;
# A more detailed page is shown. Again, there&#039;s chips showing what version of .NET to use:&amp;lt;br&amp;gt;[[File:NuGetGallery--Eco.ReferenceAssemblies Details.png|alt=Show the package page for &amp;quot;Eco.ReferenceAssemblies&amp;quot; on NuGet Gallery. Circled in red are two chips with some version of the text &amp;quot;.NET 8.0&amp;quot; inside them.|frameless|link=|border|location=center|upright=3]]&lt;br /&gt;
&lt;br /&gt;
== Linking to Eco Assemblies ==&lt;br /&gt;
# Find the &#039;&#039;Solution Explorer&#039;&#039; on the right side of Visual Studio. It should look something like this:&amp;lt;br&amp;gt;&#039;&#039;&#039;Note&#039;&#039;&#039;: If the solution explorer isn&#039;t there, open the &#039;&#039;View&#039;&#039; menu (top toolbar) and select &#039;&#039;Solution Explorer&#039;&#039;.&amp;lt;br&amp;gt;[[File:VS2022 -- Solution Explorer.png|alt=A picture of a basic layout in Visual Studio 2022 with the Solution Explorer open on the right-hand side. The solution explorer is circled in red.|frameless|link=|upright=4|location=center|border]]&lt;br /&gt;
# In the &#039;&#039;Solution Explorer&#039;&#039;, find and right-click on the &#039;&#039;Dependencies&#039;&#039; item.&lt;br /&gt;
# Select &#039;&#039;Manage NuGet Packages...&#039;&#039;&amp;lt;br&amp;gt;[[File:VS2022 Solution Explorer -- Manage NuGet Packages.png|alt=Shows VS2022&#039;s Solution Explorer with project expanded. The References line is highlighted and a menu is open. On that menu the &amp;quot;Manage NuGet Packages&amp;quot; line is highlighted.|frameless|link=|upright=4|location=center|border]]&lt;br /&gt;
# A &#039;&#039;NuGet&#039;&#039; tab will have opened in the editor window...&lt;br /&gt;
## Right above the search bar on this tab there&#039;s sub-tabs.&lt;br /&gt;
## Select the &#039;&#039;Browse&#039;&#039; sub-tab.&lt;br /&gt;
## Type &amp;lt;code&amp;gt;Eco.ReferenceAssemblies&amp;lt;/code&amp;gt; into the search bar.&lt;br /&gt;
## Check the &#039;&#039;Include prerelease&#039;&#039; check-box.&lt;br /&gt;
## Find the option with the name &#039;&#039;Eco.ReferenceAssemblies&#039;&#039; made by &#039;&#039;StrangeLoopGames&#039;&#039;.&lt;br /&gt;
## Click on that.&lt;br /&gt;
## A details panel will show up to the right. It will show the version of the reference assemblies being targeted. By default it chooses the latest and can be left at its default.&lt;br /&gt;
## Click the Install button.&lt;br /&gt;
### Click the &#039;&#039;Apply&#039;&#039; button on the popup to finish adding the references.&amp;lt;br&amp;gt;[[File:VS2022 -- NuGet Install Eco.ReferenceAssemblies.png|alt=VS2022 is open to the NuGet tab and is searching with the text Eco.ReferenceAssemblies. The checkbox to the right of the search is checked -- include prerelease. The only search result is selected. There is yellow highlights over part of the photo.|frameless|link=|upright=4|location=center|border]] &lt;br /&gt;
# The reference assemblies have now been added. That means when coding Visual Studio will provide IntelliSense popups.&lt;br /&gt;
# Try it out by going back to the &amp;lt;code&amp;gt;Class1.cs&amp;lt;/code&amp;gt; file and typing &amp;lt;code&amp;gt;Eco.&amp;lt;/code&amp;gt; and suggestions will pop up.&lt;br /&gt;
&lt;br /&gt;
= Dynamic Link Library (DLL) =&lt;br /&gt;
Building the mod creates the &amp;lt;code&amp;gt;.dll&amp;lt;/code&amp;gt; file that can be dropped into the &amp;lt;code&amp;gt;Mods/UserCode&amp;lt;/code&amp;gt; folder of any server and run.&lt;br /&gt;
&lt;br /&gt;
== Building for Development ==&lt;br /&gt;
&lt;br /&gt;
# Open the project in Visual Studio.&lt;br /&gt;
# Open the &#039;&#039;Build&#039;&#039; menu from the top toolbar.&lt;br /&gt;
# Select &#039;&#039;Build Solution&#039;&#039;. This will produce a non-optimized DLL used for testing and development.&amp;lt;br&amp;gt;[[File:VS2022 -- Build Menu.png|alt=VS2022 top menu &amp;quot;Build&amp;quot; is open with &amp;quot;build solution&amp;quot; highlighted (ctrl + shift + b).|frameless|link=|upright=4|location=center|border]]&lt;br /&gt;
# To find the file Visual Studio just built, right click on the project in the Solution Explorer.&lt;br /&gt;
# Select &#039;&#039;Open Folder in File Explorer.&#039;&#039;&amp;lt;br&amp;gt;[[File:VS2022 -- Project Menu.png|alt=VS2022&#039;s solution explorer is shown with the projects right-click menu open. Highlighted is &amp;quot;Open folder in File Explorer&amp;quot;|frameless|link=|upright=4|location=center|border]]&lt;br /&gt;
# From here, the mod&#039;s DLL will be in the &amp;lt;code&amp;gt;bin/Debug/net10.0/&amp;lt;/code&amp;gt; folder. The file will be named with mod&#039;s name, like &amp;lt;code&amp;gt;TheMod.dll&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Copy the mod&#039;s DLL file.&lt;br /&gt;
# Paste it into the folder &amp;lt;code&amp;gt;Eco/Eco_Data/Server/Mods/UserCode&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Checkpoint ===&lt;br /&gt;
&lt;br /&gt;
# Start Eco and create a local world to see if the mod is being loaded.&lt;br /&gt;
# Check the logs at &amp;lt;code&amp;gt;Eco/Eco_Data/Server/Logs/&amp;lt;/code&amp;gt; to verify...&lt;br /&gt;
## Open the &amp;lt;u&amp;gt;most recent&amp;lt;/u&amp;gt; log file here.&lt;br /&gt;
## If the mod was loaded it there will be a line mentioning the file-name of the DLL. If the DLL was named &amp;lt;code&amp;gt;TheMod.dll&amp;lt;/code&amp;gt;, line 5 is what to look for in the log file:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[13:55:54.815] [4] [ Info] [Eco] Starting ModKitPlugin                             ...  &lt;br /&gt;
[13:56:27.399] [4] [ Info] [Eco] Starting ModKitPlugin                             ... Finished in 32.584 sec&lt;br /&gt;
 &lt;br /&gt;
[13:56:27.439] [4] [ Info] [Eco] Loading mods                                      ...  &lt;br /&gt;
[13:56:27.439] [9] [ Info] [Eco] Loading TheMod...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tip:&#039;&#039;&#039; Setup File Explorer to Sort By Date&lt;br /&gt;
&lt;br /&gt;
# Setup the file view to &#039;&#039;Details&#039;&#039; in this folder because it will show the &#039;&#039;Date Modified&#039;&#039; for each file.&amp;lt;br&amp;gt;[[File:File Explorer -- View Settings Menu.png|alt=Show Window&#039;s File Explorer&#039;s view setting menu with the &amp;quot;details&amp;quot; option highlighted.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
# Click on the &#039;&#039;Date Modified&#039;&#039; header to sort all files. This will sort it so the most recent is on top. Now, every time the server starts the log file is easily found -- it&#039;s the one on top!&amp;lt;br&amp;gt;[[File:File Explorer -- Details Example.png|alt=Show&#039;s window&#039;s File Explorer with the date modified header highlighted.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
== Building for Release ==&lt;br /&gt;
Release builds are optimized and intended for sharing. Unlike Debug builds, they exclude extra debugging overhead and produce a cleaner, final version of your mod.&lt;br /&gt;
&lt;br /&gt;
# Open the project in Visual Studio.&lt;br /&gt;
# Click on the mod&#039;s project in the Solution Explorer to highlight it.&amp;lt;br&amp;gt;[[File:VS2022 -- Solution Explorer Project Highlight.png|alt=Shows VS2022&#039;s solution explorer with the project highlighted.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
# Open the &#039;&#039;Build&#039;&#039; menu from the top toolbar.&lt;br /&gt;
# Select &#039;&#039;Publish Selection&#039;&#039;.&lt;br /&gt;
# A new &#039;&#039;Publish&#039;&#039; window will pop-up.&lt;br /&gt;
# Set the target &#039;&#039;as Folder&#039;&#039;.&lt;br /&gt;
# Click the &#039;&#039;Next&#039;&#039; button.&amp;lt;br&amp;gt;[[File:VS2022 -- Publish Wizard.png|alt=VS2022&#039;s publish wizard showing the target selection screen. The Folder option is highlighted.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
# Leave the folder location as it is.&lt;br /&gt;
# Click the &#039;&#039;Finish&#039;&#039; button.&lt;br /&gt;
# Click the &#039;&#039;Close&#039;&#039; button.&lt;br /&gt;
# Click the &#039;&#039;Publish&#039;&#039; button to start the build. This may take a minute.&lt;br /&gt;
# A green alert will pop up when the build is completed:&amp;lt;br&amp;gt;[[File:VS2022 -- Publish Screen.png|alt=Show&#039;s VS2022 publish screen. There&#039;s publish button at the top of this screen.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
# Inside the alert there will be a blue &#039;&#039;Navigate&#039;&#039; link. Click it.&lt;br /&gt;
# A file explorer should have opened to where the &amp;lt;code&amp;gt;.dll&amp;lt;/code&amp;gt; file is.&lt;br /&gt;
# The mod file will be named with the mod project&#039;s name. For example, &amp;lt;code&amp;gt;TheMod.dll&amp;lt;/code&amp;gt;. &lt;br /&gt;
# To share this mod, the only file needed is the mod&#039;s &amp;lt;code&amp;gt;.dll&amp;lt;/code&amp;gt;.  Do not copy any of the &amp;lt;code&amp;gt;.dll&amp;lt;/code&amp;gt; files starting with &#039;&#039;Eco&#039;&#039; or &#039;&#039;StrangeCloud&#039;&#039;. Additionally, do not copy the &amp;lt;code&amp;gt;TheMod.deps.json&amp;lt;/code&amp;gt; or the &amp;lt;code&amp;gt;TheMod.pdb&amp;lt;/code&amp;gt; files.&lt;br /&gt;
&lt;br /&gt;
= Post-Build Scripts =&lt;br /&gt;
With a post-build script Visual Studio will automatically copy the files into the Eco &amp;lt;code&amp;gt;Mods/UserCode&amp;lt;/code&amp;gt; folder every time it builds. It&#039;s a very nice feature to have when developing and rebuilding to test something new.&lt;br /&gt;
&lt;br /&gt;
# Open the project in Visual Studio.&lt;br /&gt;
# Right-click on the project in the &#039;&#039;Solution Explorer.&#039;&#039;&lt;br /&gt;
# Select &#039;&#039;↱&#039;&#039; &#039;&#039;Edit Project File&#039;&#039; option.&lt;br /&gt;
# Add the properties &amp;lt;code&amp;gt;EcoServerExe&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;EcoServerDir&amp;lt;/code&amp;gt; inside of the &amp;lt;code&amp;gt;PropertyGroup&amp;lt;/code&amp;gt; tag.&amp;lt;br&amp;gt;&#039;&#039;&#039;Tip:&#039;&#039;&#039; By holding shift and right-clicking on a file in the file explorer an old-school menu pops up. Midway down this menu is an option to &#039;&#039;Copy As Path&#039;&#039;. Neat!&lt;br /&gt;
# The project file should look something like this (lines 8-9):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Project Sdk=&amp;quot;Microsoft.NET.Sdk&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;PropertyGroup&amp;gt;&lt;br /&gt;
    &amp;lt;TargetFramework&amp;gt;net10.0&amp;lt;/TargetFramework&amp;gt;&lt;br /&gt;
    &amp;lt;ImplicitUsings&amp;gt;enable&amp;lt;/ImplicitUsings&amp;gt;&lt;br /&gt;
    &amp;lt;Nullable&amp;gt;enable&amp;lt;/Nullable&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- Point this at your Eco source server Mods/UserCode --&amp;gt;&lt;br /&gt;
    &amp;lt;EcoModsDir&amp;gt;C:\Program Files (x86)\Steam\steamapps\common\Eco\Eco_Data\Server\Mods\UserCode&amp;lt;/EcoModsDir&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
  &amp;lt;/PropertyGroup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;ItemGroup&amp;gt;&lt;br /&gt;
    &amp;lt;PackageReference Include=&amp;quot;Eco.ReferenceAssemblies&amp;quot; Version=&amp;quot;0.11.1.13-beta-release-887&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/ItemGroup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/Project&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# Add the &amp;lt;code&amp;gt;PostBuild&amp;lt;/code&amp;gt; property inside the &amp;lt;code&amp;gt;Project&amp;lt;/code&amp;gt; tag.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Project Sdk=&amp;quot;Microsoft.NET.Sdk&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;PropertyGroup&amp;gt;&lt;br /&gt;
    ... SNIP ...&lt;br /&gt;
  &amp;lt;/PropertyGroup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;ItemGroup&amp;gt;&lt;br /&gt;
    ... SNIP ...&lt;br /&gt;
  &amp;lt;/ItemGroup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Target Name=&amp;quot;CopyModToEco&amp;quot; AfterTargets=&amp;quot;Build&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;Copy SourceFiles=&amp;quot;$(TargetPath)&amp;quot; DestinationFolder=&amp;quot;$(EcoModsDir)&amp;quot; SkipUnchangedFiles=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;Copy SourceFiles=&amp;quot;$(TargetDir)$(TargetName).pdb&amp;quot; DestinationFolder=&amp;quot;$(EcoModsDir)&amp;quot; SkipUnchangedFiles=&amp;quot;true&amp;quot; Condition=&amp;quot;Exists(&#039;$(TargetDir)$(TargetName).pdb&#039;)&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Target&amp;gt;&lt;br /&gt;
&amp;lt;/Project&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# Build the project.&lt;br /&gt;
# Look in the &amp;lt;code&amp;gt;Mods/UserCode&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
# There should be &amp;lt;code&amp;gt;TheMod.dll&amp;lt;/code&amp;gt; file.&lt;br /&gt;
&lt;br /&gt;
= Setting up Debugging =&lt;br /&gt;
To set up debugging, make sure the project is configured with the post-build script described above.&lt;br /&gt;
&lt;br /&gt;
Debugging is a powerful tool that allows you to set breakpoints anywhere in your code to pause execution. While paused, you can inspect variable values and step through the code line by line. This is invaluable when tracking down bugs or understanding complex behavior.&lt;br /&gt;
&lt;br /&gt;
When running the server in debug mode, code changes can be hot-reloaded. This allows you to modify code and apply changes without rebuilding and restarting Eco, significantly speeding up development.&lt;br /&gt;
&lt;br /&gt;
# Open the &#039;&#039;Debug&#039;&#039; menu from the top toolbar.&lt;br /&gt;
# Select &#039;&#039;YourModName Debug Properties&#039;&#039; from the bottom of the menu.&amp;lt;br&amp;gt;[[File:VS2022 -- Debug Menu.png|alt=VS2022&#039;s debug menu is open from the top of the application. Highlighted is the last option &amp;quot;Debug Properties&amp;quot;.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
# Click the &#039;&#039;Create a new profile&#039;&#039; button in the top-left of this new window (see image below).&lt;br /&gt;
# Select &#039;&#039;Executable&#039;&#039; from the drop-down menu.&amp;lt;br&amp;gt;[[File:VS2022 -- Debugger Launch Profiles.png|alt=VS2022&#039;s launch profile window is open. Underlined and pointed to by a red mark is the &amp;quot;Create a new profile&amp;quot; button, located in the top-left of the window. Highlighted from the menu under it is the option reading &amp;quot;Executable&amp;quot;.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
# Set the &#039;&#039;Executable&#039;&#039; field to the full path to the &amp;lt;code&amp;gt;EcoServer.exe&amp;lt;/code&amp;gt; file.&amp;lt;br&amp;gt;&#039;&#039;&#039;Example:&#039;&#039;&#039; &amp;lt;code&amp;gt;C:\Program Files (x86)\Steam\steamapps\common\Eco\Eco_Data\Server&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;\EcoServer.exe&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Set the &#039;&#039;Working Directory&#039;&#039; field to the full path to the folder containing the &amp;lt;code&amp;gt;EcoServer.exe&amp;lt;/code&amp;gt; file.&amp;lt;br&amp;gt;&#039;&#039;&#039;Example:&#039;&#039;&#039; &amp;lt;code&amp;gt;C:\Program Files (x86)\Steam\steamapps\common\Eco\Eco_Data\Server&amp;lt;/code&amp;gt;.&amp;lt;br&amp;gt;[[File:VS2022 -- Eco Debugging Profile.png|alt=A fully configured profile ready to debug Eco on VS2022&#039;s launch profile page.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
# Switch to this newly configured profile by clicking the small arrow to the right of the play icon (see image).&amp;lt;br&amp;gt;[[File:VS2022 -- Debugger Profile Selection.png|alt=VS2022&#039;s debugger profile selection menu is open with the newly created &amp;quot;Profile 1&amp;quot; highlighted.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
# Select the newly created profile -- &#039;&#039;Profile 1&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Checkpoint ===&lt;br /&gt;
&lt;br /&gt;
# Put the following in &amp;lt;code&amp;gt;Class1.cs&amp;lt;/code&amp;gt; file:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
using Eco.Core.Plugins.Interfaces;&lt;br /&gt;
using Eco.Core.Utils;&lt;br /&gt;
using Eco.ModKit;&lt;br /&gt;
&lt;br /&gt;
namespace Test&lt;br /&gt;
{&lt;br /&gt;
    public class Class1 : IModKitPlugin, IInitializablePlugin&lt;br /&gt;
    {&lt;br /&gt;
        public string GetCategory() =&amp;gt; &amp;quot;Tutorial&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        public string GetStatus() =&amp;gt; this._status;&lt;br /&gt;
        string _status = string.Empty;&lt;br /&gt;
&lt;br /&gt;
        public void Initialize(TimedTask timer)&lt;br /&gt;
        {&lt;br /&gt;
            this._status = &amp;quot;Ok&amp;quot;;&lt;br /&gt;
            bool yes = true;&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    [ChatCommandHandler]&lt;br /&gt;
    [SupportedOSPlatform(&amp;quot;windows7.0&amp;quot;)]&lt;br /&gt;
    public static class CommonCentsCommands&lt;br /&gt;
    {&lt;br /&gt;
        [ChatCommand(&amp;quot;wikiTest&amp;quot;, ChatAuthorizationLevel.Moderator)]&lt;br /&gt;
        public static void wikiTest(IChatClient chat)&lt;br /&gt;
        {&lt;br /&gt;
            chat.MsgLoc($&amp;quot;Hello, World.&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br&amp;gt;This code creates a basic plugin, called &amp;lt;code&amp;gt;Class1&amp;lt;/code&amp;gt;, that Eco will load and initialize on startup. Eco knows to do this because this class inherits the &amp;lt;code&amp;gt;IModKitPlugin&amp;lt;/code&amp;gt; interface (causes it to be loaded) and the &amp;lt;code&amp;gt;IInitializablePlugin&amp;lt;/code&amp;gt; interface (causes it to be initialized).&lt;br /&gt;
# Add a breakpoint to the code by right-clicking on the line &amp;lt;code&amp;gt;bool yes = true;&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;[[File:VS2022 -- Adding a breakpoint.png|alt=A boilerplate example of a mod is shown in the VS2022 text editor. A line has a menu open above it with the option &amp;quot;Breakpoint&amp;quot; expanded and the option &amp;quot;Insert Breakpoint&amp;quot; highlighted on the sub-menu.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
# Click the green &#039;&#039;⏵&#039;&#039; button to start the server with the mod. The server will start and Visual Studio will flash back on screen once Eco tries to initialize the mod&#039;s plugin.&amp;lt;br&amp;gt;[[File:VS2022 -- Launch Debugger.png|alt=Highlighted is the play button for VS2022&#039;s debugger. The &amp;quot;Profile 1&amp;quot; is still selected from before.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
# When Visual Studio hits the breakpoint it will keep startup from continuing and allow detailed inspection to happen. In the bottom left (circled in red) is a table of all of the variables within scope. Use this to see what is happening (especially useful in loops!). At the middle-top (circled in red) are some of the debugger controls. Clicking the highlighted &#039;&#039;Continue&#039;&#039; button resumes normal operation. Using the buttons to the right that are highlighted will allow the developer to step through the codes execution to see exactly how each line is performing. Debugging is a deep and rich topic that this guide will not explain further, but there&#039;s a great video by Microsoft Visual Studio on YouTube called Basics of Debugging. In that 45 minute video (don&#039;t worry there&#039;s annotations to jump to just what is interesting) a whole gamut of information about how to use debugging is covered.&amp;lt;br&amp;gt;[[File:VS2022 -- Debugger LIve.png|alt=Shows a simple plugin&#039;s code in the editor of VS2022. In the bottom-left is a table of all variables used in the function. It is circled in red. On the top of the image also circled in red is the debugger controls. Highlighted within is the continue button and the &amp;quot;step over&amp;quot; button.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
# Hit the green&#039;&#039;⏵&#039;&#039; &#039;&#039;Continue&#039;&#039; button.&lt;br /&gt;
# Let the server finish loading.&lt;br /&gt;
# Open Eco to play.&lt;br /&gt;
# Connect to the LAN world by named something like &#039;&#039;Eco World&#039;&#039;.&lt;br /&gt;
# Type &amp;lt;code&amp;gt;/wikiDemo&amp;lt;/code&amp;gt; in chat.&lt;br /&gt;
# See that the mod replies with &#039;&#039;Hello, World.&#039;&#039;&lt;br /&gt;
# Change line 29 in &amp;lt;code&amp;gt;Class1.cs&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;chat.MsgLoc($&amp;quot;Hello, Modder!&amp;quot;);&amp;lt;/code&amp;gt;&lt;br /&gt;
# Hit the hot reload button. It&#039;s just to the right of the green &#039;&#039;⏵&#039;&#039; &#039;&#039;Continue&#039;&#039; button and vaguely looks like the 🔥 icon.&lt;br /&gt;
# Type &amp;lt;code&amp;gt;/wikiDemo&amp;lt;/code&amp;gt; in chat.&lt;br /&gt;
# See that the mod now replies with &#039;&#039;Hello, Modder!&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Releasing a Mod ==&lt;br /&gt;
&lt;br /&gt;
=== Mod.io ===&lt;br /&gt;
&amp;lt;code&amp;gt;mod.io&amp;lt;/code&amp;gt; is where creators share their mods with players and others. To share a new mod there all that is necessary is an account:&lt;br /&gt;
&lt;br /&gt;
# Goto &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://mod.io/g/eco&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; and click &amp;quot;Login&amp;quot; in the top-right corner.&lt;br /&gt;
# Sign up with whatever account type you prefer.&lt;br /&gt;
# Click the &amp;quot;Add Mod&amp;quot; button in the top-right.&lt;br /&gt;
# Follow the upload wizard as directed.&lt;br /&gt;
# Once on the &amp;quot;File Manager&amp;quot; section, a zip file is needed...&lt;br /&gt;
## Zip the mod&#039;s &amp;lt;code&amp;gt;release/&amp;lt;/code&amp;gt; dll and any other assets necessary (e.g. Unity bundles) by putting all the files into a folder.&lt;br /&gt;
## Right-click on that folder&lt;br /&gt;
## Hover &amp;quot;Compress To...&amp;quot;&lt;br /&gt;
## Select &amp;quot;ZIP file&amp;quot;.&lt;br /&gt;
## Use and upload that zip file.&amp;lt;br&amp;gt;&#039;&#039;&#039;Tip:&#039;&#039;&#039; Considering naming it with a version number to help stay organized (e.g. &amp;quot;v1&amp;quot;). Next release, increase that number by 1 (e.g. &amp;quot;v2&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
=== Sharing on Discord ===&lt;br /&gt;
Consider posting an ad on the official {{EcoDiscord}}. There&#039;s a channel for mods called &#039;&#039;mod-ads&#039;&#039;. &lt;br /&gt;
Please read the rules before posting.&lt;br /&gt;
&lt;br /&gt;
== Helpful Resources ==&lt;br /&gt;
&lt;br /&gt;
* Consider learning source control (Git). Completely optional, but can help you keep things organized as development continues.&lt;br /&gt;
* Explore Eco’s open-source mod projects for ideas (search on GitHub &amp;quot;Eco Mods&amp;quot; to find some real-life examples)&lt;br /&gt;
** {{EcoDiscord}}has a channel for mod developers to help one another called &#039;&#039;mod-dev.&#039;&#039; &#039;&#039;&#039;Note:&#039;&#039;&#039; Make under the &#039;&#039;Channel &amp;amp; Roles&#039;&#039; settings you have the 🛠&#039;&#039;Yes, I want to see the channels about modding&#039;&#039; role selected.&lt;/div&gt;</summary>
		<author><name>WugWugg</name></author>
	</entry>
	<entry>
		<id>https://wiki.play.eco/en/index.php?title=Getting_Started_with_Eco_Modding_in_Visual_Studio&amp;diff=16749</id>
		<title>Getting Started with Eco Modding in Visual Studio</title>
		<link rel="alternate" type="text/html" href="https://wiki.play.eco/en/index.php?title=Getting_Started_with_Eco_Modding_in_Visual_Studio&amp;diff=16749"/>
		<updated>2026-04-29T14:44:07Z</updated>

		<summary type="html">&lt;p&gt;WugWugg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction =&lt;br /&gt;
This guide focuses on setting up a C# modding environment in Visual Studio.&lt;br /&gt;
&lt;br /&gt;
It does &#039;&#039;&#039;not&#039;&#039;&#039; cover adding Unity assets (models, prefabs, UI) to the game. See: [[From 3D Asset to Working Worktable]] for that workflow.&lt;br /&gt;
&lt;br /&gt;
This guide won’t teach you how to code or write a mod, but it will help you get everything set up so you’re ready to start learning. Helpful resources are listed at the bottom of this guide, including [[Helpful Examples for Modding]] for practical code examples.&lt;br /&gt;
&lt;br /&gt;
Visual Studio 2026 has a completely free to use version called the &#039;&#039;&#039;Community Edition&#039;&#039;&#039;. This guide is written assuming that&#039;s the version used.&lt;br /&gt;
&lt;br /&gt;
=== Have Ready ===&lt;br /&gt;
* A copy of the Eco game installed&lt;br /&gt;
* A file explorer and the file-path to &amp;lt;code&amp;gt;Eco&amp;lt;/code&amp;gt; folder&amp;lt;br&amp;gt;&#039;&#039;&#039;Tip:&#039;&#039;&#039; Within this folder there&#039;s folders like &amp;lt;code&amp;gt;D3D12&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Eco_Data&amp;lt;/code&amp;gt;. Also, you&#039;ll find the &amp;lt;code&amp;gt;Eco.exe&amp;lt;/code&amp;gt; file here. There are other files and folder here too, but this list is just to help you know what the folder looks like.&lt;br /&gt;
* &#039;&#039;&#039;Tip:&#039;&#039;&#039; Steam users can find the install folder by right-clicking on the game in your Steam Library:&amp;lt;br&amp;gt;[[File:Steam Library -- Browse Local Files.png|alt=Shows a Steam Library with a menu open over the Eco game. Highlighted in that menu is a &amp;quot;Manage&amp;quot; option, opening a sub-menu. The sub-menu has &amp;quot;Browse local files&amp;quot; highlighted.|frameless|border|upright=3|location=center|link=]]&lt;br /&gt;
&lt;br /&gt;
= Installing Visual Studio =&lt;br /&gt;
# Go to &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://visualstudio.microsoft.com/downloads/#visual-studio-community-2026&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; and look for the &amp;quot;&#039;&#039;&#039;Visual Studio Community 2026&#039;&#039;&#039;&amp;quot; download.&lt;br /&gt;
# Start the download by clicking on the &#039;&#039;Download&#039;&#039; button.&lt;br /&gt;
# Run the installer until it reaches to the Workloads page.&lt;br /&gt;
# Select these workloads...&lt;br /&gt;
## .NET desktop development -- &#039;&#039;&#039;Required&#039;&#039;&#039; for any mod development&lt;br /&gt;
## ASP.NET and web development -- Optional. If you want to interact with external websites or Eco&#039;s own web server (e.g. Discord&#039;s webhooks or extending the API)&lt;br /&gt;
# With those workloads selected the page should look something like this:&amp;lt;br&amp;gt;[[File:VisualStudioCommunity2022 Workloads.png|alt=Workloads screen during VS2022 installation. Options selected are &amp;quot;ASP.NET and web development&amp;quot; and &amp;quot;.NET desktop development&amp;quot;. |frameless|location=center|upright=4|link=|border]]&lt;br /&gt;
# Click the Install button. It will take a few minutes to complete installation.&lt;br /&gt;
# Open Visual Studio after it installs.&lt;br /&gt;
# You may be prompted to sign in:&lt;br /&gt;
## Click &#039;&#039;Skip and add accounts later&#039;&#039; to continue.&lt;br /&gt;
## If you plan to use Github, sign in to make version control easier.&lt;br /&gt;
# Finally, it might ask what color theme you&#039;d like. Select your preference and continue.&lt;br /&gt;
# Visual Studio is now installed and ready to be used.&lt;br /&gt;
&lt;br /&gt;
= Setting Up a New Mod =&lt;br /&gt;
Once Eco and Visual Studio are installed all of the tools needed to code, build, and run a mod are ready.&lt;br /&gt;
&lt;br /&gt;
== Creating a New Project ==&lt;br /&gt;
# Open Visual Studio. When it first opens it will show you a dashboard where you can quickly select what you want to do.&lt;br /&gt;
# On the right, under &#039;&#039;Get Started&#039;&#039; find the &#039;&#039;Create a new project&#039;&#039; button:&amp;lt;br&amp;gt;[[File:VS2022 OpeningDashboard.png|alt=VS2022&#039;s launch dashboard showing recent projects on the left and quick action buttons on the right. Highlighted is a button titled &amp;quot;Create a new project&amp;quot;.|frameless|border|link=|location=center|upright=4]]&lt;br /&gt;
# A new window will pop-up.&lt;br /&gt;
# Select C# &#039;&#039;Class Library.&#039;&#039; To find the template, search &amp;lt;code&amp;gt;C# library&amp;lt;/code&amp;gt; in the search bar. Select the C# option titled &#039;&#039;Class Library&#039;&#039;.&amp;lt;br&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; &amp;lt;u&amp;gt;Make sure you select the &amp;lt;code&amp;gt;C#&amp;lt;/code&amp;gt; option as there are other options similarly named &#039;&#039;Class Library&#039;&#039;.&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt;[[File:VS2022 NewProjectWizard Templates.png|frameless|border|location=center|upright=4|link=]]&lt;br /&gt;
# Click the &#039;&#039;Next&#039;&#039; button.&lt;br /&gt;
# For &#039;&#039;Project Name&#039;&#039; type the name of the mod being created.&lt;br /&gt;
# The other options like the &#039;&#039;Location&#039;&#039; and the &#039;&#039;Solution Name&#039;&#039; do not need edited.&lt;br /&gt;
# Leave the box &#039;&#039;Place solution and project in the same directory&#039;&#039; unchecked.&lt;br /&gt;
# Click the Next button.&lt;br /&gt;
# In the &#039;&#039;Framework&#039;&#039; drop-down select the same version of .NET Eco uses (as described below). &#039;&#039;&#039;Tip:&#039;&#039;&#039; Eco currently targets &#039;&#039;.NET 10.0&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== .NET Version ==&lt;br /&gt;
To confirm the version of .NET that Eco uses:&lt;br /&gt;
&lt;br /&gt;
# Go to the NuGet Gallery &amp;lt;code&amp;gt;www.nuget.org/packages?q=Eco.ReferenceAssemblies&amp;lt;/code&amp;gt;&amp;lt;!-- I&#039;m not directly linking to the package as there is no way to link to the latest version. So as a workaround I&#039;m using the search to point the reader to the latest version. --&amp;gt;&lt;br /&gt;
# Find the package with the name &#039;&#039;Eco.ReferenceAssemblies&#039;&#039; made by &#039;&#039;StrangeLoopGames&#039;&#039;.&lt;br /&gt;
# Notice the chip underneath of it with the &#039;&#039;.NET&#039;&#039; version it targets.&amp;lt;br&amp;gt;[[File:NuGetGallery -- Eco.ReferenceAssemblies Search.png|alt=Shows the search result of Eco.ReferenceAssemblies. In a blue chip the text &amp;quot;.NET 8.0&amp;quot; can be seen.|frameless|upright=4|location=center|link=|border]]&lt;br /&gt;
# Click on that search result (shown above).&lt;br /&gt;
# A more detailed page is shown. Again, there&#039;s chips showing what version of .NET to use:&amp;lt;br&amp;gt;[[File:NuGetGallery--Eco.ReferenceAssemblies Details.png|alt=Show the package page for &amp;quot;Eco.ReferenceAssemblies&amp;quot; on NuGet Gallery. Circled in red are two chips with some version of the text &amp;quot;.NET 8.0&amp;quot; inside them.|frameless|link=|border|location=center|upright=3]]&lt;br /&gt;
&lt;br /&gt;
== Linking to Eco Assemblies ==&lt;br /&gt;
# Find the &#039;&#039;Solution Explorer&#039;&#039; on the right side of Visual Studio. It should look something like this:&amp;lt;br&amp;gt;&#039;&#039;&#039;Note&#039;&#039;&#039;: If the solution explorer isn&#039;t there, open the &#039;&#039;View&#039;&#039; menu (top toolbar) and select &#039;&#039;Solution Explorer&#039;&#039;.&amp;lt;br&amp;gt;[[File:VS2022 -- Solution Explorer.png|alt=A picture of a basic layout in Visual Studio 2022 with the Solution Explorer open on the right-hand side. The solution explorer is circled in red.|frameless|link=|upright=4|location=center|border]]&lt;br /&gt;
# In the &#039;&#039;Solution Explorer&#039;&#039;, find and right-click on the &#039;&#039;Dependencies&#039;&#039; item.&lt;br /&gt;
# Select &#039;&#039;Manage NuGet Packages...&#039;&#039;&amp;lt;br&amp;gt;[[File:VS2022 Solution Explorer -- Manage NuGet Packages.png|alt=Shows VS2022&#039;s Solution Explorer with project expanded. The References line is highlighted and a menu is open. On that menu the &amp;quot;Manage NuGet Packages&amp;quot; line is highlighted.|frameless|link=|upright=4|location=center|border]]&lt;br /&gt;
# A &#039;&#039;NuGet&#039;&#039; tab will have opened in the editor window...&lt;br /&gt;
## Right above the search bar on this tab there&#039;s sub-tabs.&lt;br /&gt;
## Select the &#039;&#039;Browse&#039;&#039; sub-tab.&lt;br /&gt;
## Type &amp;lt;code&amp;gt;Eco.ReferenceAssemblies&amp;lt;/code&amp;gt; into the search bar.&lt;br /&gt;
## Check the &#039;&#039;Include prerelease&#039;&#039; check-box.&lt;br /&gt;
## Find the option with the name &#039;&#039;Eco.ReferenceAssemblies&#039;&#039; made by &#039;&#039;StrangeLoopGames&#039;&#039;.&lt;br /&gt;
## Click on that.&lt;br /&gt;
## A details panel will show up to the right. It will show the version of the reference assemblies being targeted. By default it chooses the latest and can be left at its default.&lt;br /&gt;
## Click the Install button.&lt;br /&gt;
## Click the &#039;&#039;Apply&#039;&#039; button on the popup to finish adding the references.&amp;lt;br&amp;gt;[[File:VS2022 -- NuGet Install Eco.ReferenceAssemblies.png|alt=VS2022 is open to the NuGet tab and is searching with the text Eco.ReferenceAssemblies. The checkbox to the right of the search is checked -- include prerelease. The only search result is selected. There is yellow highlights over part of the photo.|frameless|link=|upright=4|location=center|border]]&lt;br /&gt;
# Now reference assemblies have now been added. That means when coding Visual Studio will provide IntelliSense popups. &lt;br /&gt;
# Try it out by going back to the &amp;lt;code&amp;gt;Class1.cs&amp;lt;/code&amp;gt; file and typing &amp;lt;code&amp;gt;Eco.&amp;lt;/code&amp;gt; and you will see suggestion pop up.&lt;br /&gt;
&lt;br /&gt;
= Dynamic Link Library (DLL) =&lt;br /&gt;
Building the mod creates the &amp;lt;code&amp;gt;.dll&amp;lt;/code&amp;gt; file that can be dropped into the &amp;lt;code&amp;gt;Mods/UserCode&amp;lt;/code&amp;gt; folder of any server an ran.&lt;br /&gt;
&lt;br /&gt;
== Building for Development ==&lt;br /&gt;
&lt;br /&gt;
# Open the project in Visual Studio.&lt;br /&gt;
# Open the &#039;&#039;Build&#039;&#039; menu from the top toolbar.&lt;br /&gt;
# Select &#039;&#039;Build Solution&#039;&#039;. This will produce non-optimized DLL used for testing and development.&amp;lt;br&amp;gt;[[File:VS2022 -- Build Menu.png|alt=VS2022 top menu &amp;quot;Build&amp;quot; is open with &amp;quot;build solution&amp;quot; highlighted (ctrl + shift + b).|frameless|link=|upright=4|location=center|border]]&lt;br /&gt;
# To find the file Visual Studio just built, right click on the project in the Solution Explorer.&lt;br /&gt;
# Select &#039;&#039;Open Folder in File Explorer.&#039;&#039;&amp;lt;br&amp;gt;[[File:VS2022 -- Project Menu.png|alt=VS2022&#039;s solution explorer is shown with the projects right-click menu open. Highlighted is &amp;quot;Open folder in File Explorer&amp;quot;|frameless|link=|upright=4|location=center|border]]&lt;br /&gt;
# From here, the mod&#039;s DLL will be in the &amp;lt;code&amp;gt;bin/Debug/net10.0/&amp;lt;/code&amp;gt; folder. The file will be named with mod&#039;s name, like &amp;lt;code&amp;gt;TheMod.dll&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Copy the mod&#039;s DLL file.&lt;br /&gt;
# Paste it into the folder &amp;lt;code&amp;gt;Eco/Eco_Data/Server/Mods/UserCode&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Checkpoint ===&lt;br /&gt;
&lt;br /&gt;
# Start a Eco and create a local world to see if the mod is being loaded.&lt;br /&gt;
# Check the logs at &amp;lt;code&amp;gt;Eco/Eco_Data/Server/Logs/&amp;lt;/code&amp;gt; to verify...&lt;br /&gt;
## Open the &amp;lt;u&amp;gt;most recent&amp;lt;/u&amp;gt; log file here.&lt;br /&gt;
## If the mod was loaded it there will be a line mentioning the file-name of the DLL. If the DLL was named &amp;lt;code&amp;gt;TheMod.dll&amp;lt;/code&amp;gt;, line 5 is what to look for in the log file:&amp;lt;br&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;[13:55:54.815] [4] [ Info] [Eco] Starting ModKitPlugin                             ...  &lt;br /&gt;
[13:56:27.399] [4] [ Info] [Eco] Starting ModKitPlugin                             ... Finished in 32.584 sec&lt;br /&gt;
 &lt;br /&gt;
[13:56:27.439] [4] [ Info] [Eco] Loading mods                                      ...  &lt;br /&gt;
[13:56:27.439] [9] [ Info] [Eco] Loading TheMod...&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pro-Tip:&#039;&#039;&#039; Setup File Explorer to Sort By Date&lt;br /&gt;
&lt;br /&gt;
# Setup the file view to &#039;&#039;Details&#039;&#039; in this folder because it will show the &#039;&#039;Date Modified&#039;&#039; for each file.&amp;lt;br&amp;gt;[[File:File Explorer -- View Settings Menu.png|alt=Show Window&#039;s File Explorer&#039;s view setting menu with the &amp;quot;details&amp;quot; option highlighted.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
# Click on the &#039;&#039;Date Modified&#039;&#039; header to sort all files. This will sort it so the most recent is on top. Now, every time the server starts the log file is easily found -- it&#039;s the one on top!&amp;lt;br&amp;gt;[[File:File Explorer -- Details Example.png|alt=Show&#039;s window&#039;s File Explorer with the date modified header highlighted.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
== Building for Release ==&lt;br /&gt;
Release builds are optimized and intended for sharing. Unlike Debug builds, they exclude extra debugging overhead and produce a cleaner, final version of your mod.&lt;br /&gt;
&lt;br /&gt;
# Open the project in Visual Studio.&lt;br /&gt;
# Click on the mod&#039;s project in the Solution Explorer to highlight it. [[File:VS2022 -- Solution Explorer Project Highlight.png|alt=Shows VS2022&#039;s solution explorer with the project highlighted.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
# Open the &#039;&#039;Build&#039;&#039; menu from the top toolbar.&lt;br /&gt;
# Select &#039;&#039;Publish Selection&#039;&#039;.&lt;br /&gt;
# A new &#039;&#039;Publish&#039;&#039; window will pop-up.&lt;br /&gt;
# Set the target &#039;&#039;as Folder&#039;&#039;.&lt;br /&gt;
# Click the &#039;&#039;Next&#039;&#039; button. [[File:VS2022 -- Publish Wizard.png|alt=VS2022&#039;s publish wizard showing the target selection screen. The Folder option is highlighted.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
# Leave the folder location as it is.&lt;br /&gt;
# Click the &#039;&#039;Finish&#039;&#039; button.&lt;br /&gt;
# Click the &#039;&#039;Close&#039;&#039; button.&lt;br /&gt;
# Click the &#039;&#039;Publish&#039;&#039; button to start the build. This may take a minute.&lt;br /&gt;
# A green alert will pop up when the build is completed: [[File:VS2022 -- Publish Screen.png|alt=Show&#039;s VS2022 publish screen. There&#039;s publish button at the top of this screen.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
# Inside the alert there will be a blue &#039;&#039;Navigate&#039;&#039; link. Click it.&lt;br /&gt;
# A file explorer should have opened to where the &amp;lt;code&amp;gt;.dll&amp;lt;/code&amp;gt; file is.&lt;br /&gt;
# The mod file will be named with the mod project&#039;s name. For example, &amp;lt;code&amp;gt;TheMod.dll&amp;lt;/code&amp;gt;. &lt;br /&gt;
# To share this mod, the only file needed is the mod&#039;s &amp;lt;code&amp;gt;.dll&amp;lt;/code&amp;gt;.  Do not copy any of the &amp;lt;code&amp;gt;.dll&amp;lt;/code&amp;gt; files starting with &#039;&#039;Eco&#039;&#039; or &#039;&#039;StrangeCloud&#039;&#039;. Additionally, do not copy the &amp;lt;code&amp;gt;TheMod.deps.json&amp;lt;/code&amp;gt; or the &amp;lt;code&amp;gt;TheMod.pbd&amp;lt;/code&amp;gt; files.&lt;br /&gt;
&lt;br /&gt;
= Post-Build Scripts =&lt;br /&gt;
With a post-build script Visual Studio will automatically copy the files into the Eco &amp;lt;code&amp;gt;Mods/UserCode&amp;lt;/code&amp;gt; folder every time it builds. It&#039;s a very nice feature to have when developing and rebuilding to test something new.&lt;br /&gt;
&lt;br /&gt;
# Open the project in Visual Studio.&lt;br /&gt;
# Right-click on the project in the &#039;&#039;Solution Explorer.&#039;&#039;&lt;br /&gt;
# Select &#039;&#039;↱&#039;&#039; &#039;&#039;Edit Project File&#039;&#039; option.&lt;br /&gt;
# Add the properties &amp;lt;code&amp;gt;EcoServerExe&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;EcoServerDir&amp;lt;/code&amp;gt; inside of the &amp;lt;code&amp;gt;PropertyGroup&amp;lt;/code&amp;gt; tag. &#039;&#039;&#039;Tip:&#039;&#039;&#039; By holding shift and right-clicking on a file in the file explorer an old-school menu pops up. Midway down this menu is an option to &#039;&#039;Copy As Path&#039;&#039;. Neat!&lt;br /&gt;
# The project file should look something like this (lines 8-9):&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;Project Sdk=&amp;quot;Microsoft.NET.Sdk&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;PropertyGroup&amp;gt;&lt;br /&gt;
    &amp;lt;TargetFramework&amp;gt;net10.0&amp;lt;/TargetFramework&amp;gt;&lt;br /&gt;
    &amp;lt;ImplicitUsings&amp;gt;enable&amp;lt;/ImplicitUsings&amp;gt;&lt;br /&gt;
    &amp;lt;Nullable&amp;gt;enable&amp;lt;/Nullable&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- Point this at your Eco source server Mods/UserCode --&amp;gt;&lt;br /&gt;
    &amp;lt;EcoModsDir&amp;gt;C:\Program Files (x86)\Steam\steamapps\common\Eco\Eco_Data\Server\Mods\UserCode&amp;lt;/EcoModsDir&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
  &amp;lt;/PropertyGroup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;ItemGroup&amp;gt;&lt;br /&gt;
    &amp;lt;PackageReference Include=&amp;quot;Eco.ReferenceAssemblies&amp;quot; Version=&amp;quot;0.11.1.13-beta-release-887&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/ItemGroup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/Project&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# Add the &amp;lt;code&amp;gt;PostBuild&amp;lt;/code&amp;gt; property inside the &amp;lt;code&amp;gt;Project&amp;lt;/code&amp;gt; tag.&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Project Sdk=&amp;quot;Microsoft.NET.Sdk&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;PropertyGroup&amp;gt;&lt;br /&gt;
    ... SNIP ...&lt;br /&gt;
  &amp;lt;/PropertyGroup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;ItemGroup&amp;gt;&lt;br /&gt;
    ... SNIP ...&lt;br /&gt;
  &amp;lt;/ItemGroup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Target Name=&amp;quot;CopyModToEco&amp;quot; AfterTargets=&amp;quot;Build&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;Copy SourceFiles=&amp;quot;$(TargetPath)&amp;quot; DestinationFolder=&amp;quot;$(EcoModsDir)&amp;quot; SkipUnchangedFiles=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;Copy SourceFiles=&amp;quot;$(TargetDir)$(TargetName).pdb&amp;quot; DestinationFolder=&amp;quot;$(EcoModsDir)&amp;quot; SkipUnchangedFiles=&amp;quot;true&amp;quot; Condition=&amp;quot;Exists(&#039;$(TargetDir)$(TargetName).pdb&#039;)&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Target&amp;gt;&lt;br /&gt;
&amp;lt;/Project&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# Build the project.&lt;br /&gt;
# Look in the &amp;lt;code&amp;gt;Mods/UserCode&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
# There should be &amp;lt;code&amp;gt;TheMod.dll&amp;lt;/code&amp;gt; file.&lt;br /&gt;
&lt;br /&gt;
= Setting up Debugging =&lt;br /&gt;
To set up debugging, make sure the project is configured with the post-build script described above.&lt;br /&gt;
&lt;br /&gt;
Debugging is a powerful tool that allows you to set breakpoints anywhere in your code to pause execution. While paused, you can inspect variable values and step through the code line by line. This is invaluable when tracking down bugs or understanding complex behavior.&lt;br /&gt;
&lt;br /&gt;
When running the server in debug mode, code changes can be hot-reloaded. This allows you to modify code and apply changes without rebuilding and restarting Eco, significantly speeding up development.&lt;br /&gt;
&lt;br /&gt;
# Open the &#039;&#039;Debug&#039;&#039; menu from the top toolbar.&lt;br /&gt;
# Select &#039;&#039;YourModName Debug Properties&#039;&#039; from the bottom of the menu. [[File:VS2022 -- Debug Menu.png|alt=VS2022&#039;s debug menu is open from the top of the application. Highlighted is the last option &amp;quot;Debug Properties&amp;quot;.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
# Click the &#039;&#039;Create a new profile&#039;&#039; button in the top-left of this new window (see image below).&lt;br /&gt;
# Select &#039;&#039;Executable&#039;&#039; from the drop-down menu. [[File:VS2022 -- Debugger Launch Profiles.png|alt=VS2022&#039;s launch profile window is open. Underlined and pointed to by a red mark is the &amp;quot;Create a new profile&amp;quot; button, located in the top-left of the window. Highlighted from the menu under it is the option reading &amp;quot;Executable&amp;quot;.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
# Set the &#039;&#039;Executable&#039;&#039; field to the full path to the &amp;lt;code&amp;gt;EcoServer.exe&amp;lt;/code&amp;gt; file. &#039;&#039;&#039;Example:&#039;&#039;&#039; &amp;lt;code&amp;gt;C:\Program Files (x86)\Steam\steamapps\common\Eco\Eco_Data\Server&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;\EcoServer.exe&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Set the &#039;&#039;Working Directory&#039;&#039; field to the full path to the folder containing the &amp;lt;code&amp;gt;EcoServer.exe&amp;lt;/code&amp;gt; file. &#039;&#039;&#039;Example:&#039;&#039;&#039; &amp;lt;code&amp;gt;C:\Program Files (x86)\Steam\steamapps\common\Eco\Eco_Data\Server&amp;lt;/code&amp;gt;. [[File:VS2022 -- Eco Debugging Profile.png|alt=A fully configured profile ready to debug Eco on VS2022&#039;s launch profile page.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
# Switch to this newly configured profile by clicking the small arrow to the right of the play icon (see image). [[File:VS2022 -- Debugger Profile Selection.png|alt=VS2022&#039;s debugger profile selection menu is open with the newly created &amp;quot;Profile 1&amp;quot; highlighted.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
# Select the newly created profile -- &#039;&#039;Profile 1&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Checkpoint ===&lt;br /&gt;
&lt;br /&gt;
# Put the following in &amp;lt;code&amp;gt;Class1.cs&amp;lt;/code&amp;gt; file:&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
using Eco.Core.Plugins.Interfaces;&lt;br /&gt;
using Eco.Core.Utils;&lt;br /&gt;
using Eco.ModKit;&lt;br /&gt;
&lt;br /&gt;
namespace Test&lt;br /&gt;
{&lt;br /&gt;
    public class Class1 : IModKitPlugin, IInitializablePlugin&lt;br /&gt;
    {&lt;br /&gt;
        public string GetCategory() =&amp;gt; &amp;quot;Tutorial&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        public string GetStatus() =&amp;gt; this._status;&lt;br /&gt;
        string _status = string.Empty;&lt;br /&gt;
&lt;br /&gt;
        public void Initialize(TimedTask timer)&lt;br /&gt;
        {&lt;br /&gt;
            this._status = &amp;quot;Ok&amp;quot;;&lt;br /&gt;
            bool yes = true;&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    [ChatCommandHandler]&lt;br /&gt;
    [SupportedOSPlatform(&amp;quot;windows7.0&amp;quot;)]&lt;br /&gt;
    public static class CommonCentsCommands&lt;br /&gt;
    {&lt;br /&gt;
        [ChatCommand(&amp;quot;wikiTest&amp;quot;, ChatAuthorizationLevel.Moderator)]&lt;br /&gt;
        public static void wikiTest(IChatClient chat)&lt;br /&gt;
        {&lt;br /&gt;
            chat.MsgLoc($&amp;quot;Hello, World.&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;This code creates a basic plugin, called &amp;lt;code&amp;gt;Class1&amp;lt;/code&amp;gt;, that Eco will load and initialize on startup. Eco knows to do this because this class inherits the &amp;lt;code&amp;gt;IModKitPlugin&amp;lt;/code&amp;gt; interface (causes it to be loaded) and the &amp;lt;code&amp;gt;IInitializablePlugin&amp;lt;/code&amp;gt; interface (causes it to be initialized).&lt;br /&gt;
# Add a breakpoint to the code by right-clicking on the line &amp;lt;code&amp;gt;bool yes = true;&amp;lt;/code&amp;gt;[[File:VS2022 -- Adding a breakpoint.png|alt=A boilerplate example of a mod is shown in the VS2022 text editor. A line has a menu open above it with the option &amp;quot;Breakpoint&amp;quot; expanded and the option &amp;quot;Insert Breakpoint&amp;quot; highlighted on the sub-menu.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
# Click the green &#039;&#039;⏵&#039;&#039; button to start the server with the mod. The server will start and Visual Studio will flash back on screen once Eco tries to initialize the mod&#039;s plugin.[[File:VS2022 -- Launch Debugger.png|alt=Highlighted is the play button for VS2022&#039;s debugger. The &amp;quot;Profile 1&amp;quot; is still selected from before.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
# When Visual Studio hits the breakpoint it will keep startup from continuing and allow detailed inspection to happen. In the bottom left (circled in red) is a table of all of the variables within scope. Use this to see what is happening (especially useful in loops!). At the middle-top (circled in red) are some of the debugger controls. Clicking the highlighted &#039;&#039;Continue&#039;&#039; button resumes normal operation. Using the buttons to the right that are highlighted will allow the developer to step through the codes execution to see exactly how each line is performing. Debugging is a deep and rich topic that this guide will not explain further, but there&#039;s a great video by Microsoft Visual Studio on YouTube called Basics of Debugging. In that 45 minute video (don&#039;t worry there&#039;s annotations to jump to just what is interesting) a whole gamut of information about how to use debugging is covered. [[File:VS2022 -- Debugger LIve.png|alt=Shows a simple plugin&#039;s code in the editor of VS2022. In the bottom-left is a table of all variables used in the function. It is circled in red. On the top of the image also circled in red is the debugger controls. Highlighted within is the continue button and the &amp;quot;step over&amp;quot; button.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
# Hit the green&#039;&#039;⏵&#039;&#039; &#039;&#039;Continue&#039;&#039; button.&lt;br /&gt;
# Let the server finish loading.&lt;br /&gt;
# Open Eco to play.&lt;br /&gt;
# Connect to the LAN world by named something like &#039;&#039;Eco World&#039;&#039;.&lt;br /&gt;
# Type &amp;lt;code&amp;gt;/wikiDemo&amp;lt;/code&amp;gt; in chat.&lt;br /&gt;
# See that the mod replies with &#039;&#039;Hello, World.&#039;&#039;&lt;br /&gt;
# Change line 29 in &amp;lt;code&amp;gt;Class1.cs&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;chat.MsgLoc($&amp;quot;Hello, Modder!&amp;quot;);&amp;lt;/code&amp;gt;&lt;br /&gt;
# Hit the hot reload button. It&#039;s just to the right of the green &#039;&#039;⏵&#039;&#039; &#039;&#039;Continue&#039;&#039; button and vaguely looks like the 🔥 icon.&lt;br /&gt;
# Type &amp;lt;code&amp;gt;/wikiDemo&amp;lt;/code&amp;gt; in chat.&lt;br /&gt;
# See that the mod now replies with &#039;&#039;Hello, Modder!&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Releasing a Mod ==&lt;br /&gt;
&lt;br /&gt;
=== Mod.io ===&lt;br /&gt;
&amp;lt;code&amp;gt;mod.io&amp;lt;/code&amp;gt; is where creators share their mods with players and others. To share a new mod there all that is necessary is an account:&lt;br /&gt;
&lt;br /&gt;
# Goto &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://mod.io/g/eco&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; and click &amp;quot;Login&amp;quot; in the top-right corner.&lt;br /&gt;
# Sign up with whatever account type you prefer.&lt;br /&gt;
# Click the &amp;quot;Add Mod&amp;quot; button in the top-right.&lt;br /&gt;
# Follow the upload wizard as directed.&lt;br /&gt;
# Once on the &amp;quot;File Manager&amp;quot; section, a zip file is needed...&lt;br /&gt;
## Zip the mod&#039;s &amp;lt;code&amp;gt;release/&amp;lt;/code&amp;gt; dll and any other assets necessary (e.g. Unity bundles) by putting all the files into a folder.&lt;br /&gt;
## Right-click on that folder&lt;br /&gt;
## Hover &amp;quot;Compress To...&amp;quot;&lt;br /&gt;
## Select &amp;quot;ZIP file&amp;quot;.&lt;br /&gt;
## Use and upload that zip file.&amp;lt;br&amp;gt; Tip: Considering naming it with a version number to help stay organized (e.g. &amp;quot;v1&amp;quot;). Next release, increase that number by 1 (e.g. &amp;quot;v2&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
=== Sharing on Discord ===&lt;br /&gt;
Consider posting an ad on the official {{EcoDiscord}}. There&#039;s a channel for mods called &#039;&#039;mod-ads&#039;&#039;. &lt;br /&gt;
Please read the rules before posting.&lt;br /&gt;
&lt;br /&gt;
== Helpful Resources ==&lt;br /&gt;
&lt;br /&gt;
* Consider learning source control (Git). Completely optional, but can help you keep things organized as development continues.&lt;br /&gt;
* Explore Eco’s open-source mod projects for ideas (search on Github &amp;quot;Eco Mods&amp;quot; to find some real-life examples)&lt;br /&gt;
** {{EcoDiscord}}has a channel for mod developers to help one another called &#039;&#039;mod-dev.&#039;&#039; &#039;&#039;&#039;Note:&#039;&#039;&#039; Make under the &#039;&#039;Channel &amp;amp; Roles&#039;&#039; settings you have the 🛠&#039;&#039;Yes, I want to see the channels about modding&#039;&#039; role selected.&lt;/div&gt;</summary>
		<author><name>WugWugg</name></author>
	</entry>
	<entry>
		<id>https://wiki.play.eco/en/index.php?title=Getting_Started_with_Eco_Modding_in_Visual_Studio&amp;diff=16748</id>
		<title>Getting Started with Eco Modding in Visual Studio</title>
		<link rel="alternate" type="text/html" href="https://wiki.play.eco/en/index.php?title=Getting_Started_with_Eco_Modding_in_Visual_Studio&amp;diff=16748"/>
		<updated>2026-04-29T14:32:15Z</updated>

		<summary type="html">&lt;p&gt;WugWugg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction =&lt;br /&gt;
This guide focuses on setting up a C# modding environment in Visual Studio.&lt;br /&gt;
&lt;br /&gt;
It does &#039;&#039;&#039;not&#039;&#039;&#039; cover adding Unity assets (models, prefabs, UI) to the game. See: [[From 3D Asset to Working Worktable]] for that workflow.&lt;br /&gt;
&lt;br /&gt;
This guide won’t teach you how to code or write a mod, but it will help you get everything set up so you’re ready to start learning. Helpful resources are listed at the bottom of this guide, including [[Helpful Examples for Modding]] for practical code examples.&lt;br /&gt;
&lt;br /&gt;
Visual Studio 2026 has a completely free to use version called the &#039;&#039;&#039;Community Edition&#039;&#039;&#039;. This guide is written assuming that&#039;s the version used.&lt;br /&gt;
&lt;br /&gt;
=== Have Ready ===&lt;br /&gt;
* A copy of the Eco game installed&lt;br /&gt;
* A file explorer and the file-path to &amp;lt;code&amp;gt;Eco&amp;lt;/code&amp;gt; folder&amp;lt;br&amp;gt;&#039;&#039;&#039;Tip:&#039;&#039;&#039; Within this folder there&#039;s folders like &amp;lt;code&amp;gt;D3D12&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Eco_Data&amp;lt;/code&amp;gt;. Also, you&#039;ll find the &amp;lt;code&amp;gt;Eco.exe&amp;lt;/code&amp;gt; file here. There are other files and folder here too, but this list is just to help you know what the folder looks like.&lt;br /&gt;
* &#039;&#039;&#039;Tip:&#039;&#039;&#039; Steam users can find the install folder by right-clicking on the game in your Steam Library:&amp;lt;br&amp;gt;[[File:Steam Library -- Browse Local Files.png|alt=Shows a Steam Library with a menu open over the Eco game. Highlighted in that menu is a &amp;quot;Manage&amp;quot; option, opening a sub-menu. The sub-menu has &amp;quot;Browse local files&amp;quot; highlighted.|frameless|border|upright=3|location=center|link=]]&lt;br /&gt;
&lt;br /&gt;
= Installing Visual Studio =&lt;br /&gt;
# Go to &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://visualstudio.microsoft.com/downloads/#visual-studio-community-2026&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; and look for the &amp;quot;&#039;&#039;&#039;Visual Studio Community 2026&#039;&#039;&#039;&amp;quot; download.&lt;br /&gt;
# Start the download by clicking on the &#039;&#039;Download&#039;&#039; button.&lt;br /&gt;
# Run the installer until it reaches to the Workloads page.&lt;br /&gt;
# Select these workloads...&lt;br /&gt;
## .NET desktop development -- &#039;&#039;&#039;Required&#039;&#039;&#039; for any mod development&lt;br /&gt;
## ASP.NET and web development -- Optional. If you want to interact with external websites or Eco&#039;s own web server (e.g. Discord&#039;s webhooks or extending the API)&lt;br /&gt;
# With those workloads selected the page should look something like this:&amp;lt;br&amp;gt;[[File:VisualStudioCommunity2022 Workloads.png|alt=Workloads screen during VS2022 installation. Options selected are &amp;quot;ASP.NET and web development&amp;quot; and &amp;quot;.NET desktop development&amp;quot;. |frameless|location=center|upright=4|link=|border]]&lt;br /&gt;
# Click the Install button. It will take a few minutes to complete installation.&lt;br /&gt;
# Open Visual Studio after it installs.&lt;br /&gt;
# You may be prompted to sign in:&lt;br /&gt;
## Click &#039;&#039;Skip and add accounts later&#039;&#039; to continue.&lt;br /&gt;
## If you plan to use Github, sign in to make version control easier.&lt;br /&gt;
# Finally, it might ask what color theme you&#039;d like. Select your preference and continue.&lt;br /&gt;
# Visual Studio is now installed and ready to be used.&lt;br /&gt;
&lt;br /&gt;
= Setting Up a New Mod =&lt;br /&gt;
Once Eco and Visual Studio are installed all of the tools needed to code, build, and run a mod are ready.&lt;br /&gt;
&lt;br /&gt;
== Creating a New Project ==&lt;br /&gt;
# Open Visual Studio. When it first opens it will show you a dashboard where you can quickly select what you want to do.&lt;br /&gt;
# On the right, under &#039;&#039;Get Started&#039;&#039; find the &#039;&#039;Create a new project&#039;&#039; button:&amp;lt;br&amp;gt;[[File:VS2022 OpeningDashboard.png|alt=VS2022&#039;s launch dashboard showing recent projects on the left and quick action buttons on the right. Highlighted is a button titled &amp;quot;Create a new project&amp;quot;.|frameless|border|link=|location=center|upright=4]]&lt;br /&gt;
# A new window will pop-up.&lt;br /&gt;
# Select C# &#039;&#039;Class Library.&#039;&#039; To find the template, search &amp;lt;code&amp;gt;C# library&amp;lt;/code&amp;gt; in the search bar. Select the C# option titled &#039;&#039;Class Library&#039;&#039;.&amp;lt;br&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; &amp;lt;u&amp;gt;Make sure you select the &amp;lt;code&amp;gt;C#&amp;lt;/code&amp;gt; option as there are other options similarly named &#039;&#039;Class Library&#039;&#039;.&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt;[[File:VS2022 NewProjectWizard Templates.png|frameless|border|location=center|upright=4|link=]]&lt;br /&gt;
# Click the &#039;&#039;Next&#039;&#039; button.&lt;br /&gt;
# For &#039;&#039;Project Name&#039;&#039; type the name of the mod being created.&lt;br /&gt;
# The other options like the &#039;&#039;Location&#039;&#039; and the &#039;&#039;Solution Name&#039;&#039; do not need edited.&lt;br /&gt;
# Leave the box &#039;&#039;Place solution and project in the same directory&#039;&#039; unchecked.&lt;br /&gt;
# Click the Next button.&lt;br /&gt;
# In the &#039;&#039;Framework&#039;&#039; drop-down select the same version of .NET Eco uses (as described below). &#039;&#039;&#039;Tip:&#039;&#039;&#039; Eco currently targets &#039;&#039;.NET 10.0&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== .NET Version ==&lt;br /&gt;
To confirm the version of .NET that Eco uses:&lt;br /&gt;
&lt;br /&gt;
# Go to the NuGet Gallery &amp;lt;code&amp;gt;www.nuget.org/packages?q=Eco.ReferenceAssemblies&amp;lt;/code&amp;gt;&amp;lt;!-- I&#039;m not directly linking to the package as there is no way to link to the latest version. So as a workaround I&#039;m using the search to point the reader to the latest version. --&amp;gt;&lt;br /&gt;
# Find the package with the name &#039;&#039;Eco.ReferenceAssemblies&#039;&#039; made by &#039;&#039;StrangeLoopGames&#039;&#039;.&lt;br /&gt;
# Notice the chip underneath of it with the &#039;&#039;.NET&#039;&#039; version it targets.&amp;lt;br&amp;gt;[[File:NuGetGallery -- Eco.ReferenceAssemblies Search.png|alt=Shows the search result of Eco.ReferenceAssemblies. In a blue chip the text &amp;quot;.NET 8.0&amp;quot; can be seen.|frameless|upright=4|location=center|link=|border]]&lt;br /&gt;
# Click on that search result (shown above).&lt;br /&gt;
# A more detailed page is shown. Again, there&#039;s chips showing what version of .NET to use:&amp;lt;br&amp;gt;[[File:NuGetGallery--Eco.ReferenceAssemblies Details.png|alt=Show the package page for &amp;quot;Eco.ReferenceAssemblies&amp;quot; on NuGet Gallery. Circled in red are two chips with some version of the text &amp;quot;.NET 8.0&amp;quot; inside them.|frameless|link=|border|location=center|upright=3]]&lt;br /&gt;
&lt;br /&gt;
== Linking to Eco Assemblies ==&lt;br /&gt;
# Find the &#039;&#039;Solution Explorer&#039;&#039; on the right side of Visual Studio. It should look something like this:&amp;lt;br&amp;gt;&#039;&#039;&#039;Note&#039;&#039;&#039;: If the solution explorer isn&#039;t there, open the &#039;&#039;View&#039;&#039; menu (top toolbar) and select &#039;&#039;Solution Explorer&#039;&#039;.&amp;lt;br&amp;gt;[[File:VS2022 -- Solution Explorer.png|alt=A picture of a basic layout in Visual Studio 2022 with the Solution Explorer open on the right-hand side. The solution explorer is circled in red.|frameless|link=|upright=4|location=center|border]]&lt;br /&gt;
# In the &#039;&#039;Solution Explorer&#039;&#039;, find and right-click on the &#039;&#039;Dependencies&#039;&#039; item.&lt;br /&gt;
# Select &#039;&#039;Manage NuGet Packages...&#039;&#039;&amp;lt;br&amp;gt;[[File:VS2022 Solution Explorer -- Manage NuGet Packages.png|alt=Shows VS2022&#039;s Solution Explorer with project expanded. The References line is highlighted and a menu is open. On that menu the &amp;quot;Manage NuGet Packages&amp;quot; line is highlighted.|frameless|link=|upright=4|location=center|border]]&lt;br /&gt;
# A &#039;&#039;NuGet&#039;&#039; tab will have opened in the editor window...&lt;br /&gt;
## Right above the search bar on this tab there&#039;s sub-tabs.&lt;br /&gt;
## Select the &#039;&#039;Browse&#039;&#039; sub-tab.&lt;br /&gt;
## Type &amp;lt;code&amp;gt;Eco.ReferenceAssemblies&amp;lt;/code&amp;gt; into the search bar.&lt;br /&gt;
## Check the &#039;&#039;Include prerelease&#039;&#039; check-box.&lt;br /&gt;
## Find the option with the name &#039;&#039;Eco.ReferenceAssemblies&#039;&#039; made by &#039;&#039;StrangeLoopGames&#039;&#039;.&lt;br /&gt;
## Click on that.&lt;br /&gt;
## A details panel will show up to the right. It will show the version of the reference assemblies being targeted. By default it chooses the latest and can be left at its default.&lt;br /&gt;
## Click the Install button.&lt;br /&gt;
## Click the &#039;&#039;Apply&#039;&#039; button on the popup to finish adding the references.&amp;lt;br&amp;gt;[[File:VS2022 -- NuGet Install Eco.ReferenceAssemblies.png|alt=VS2022 is open to the NuGet tab and is searching with the text Eco.ReferenceAssemblies. The checkbox to the right of the search is checked -- include prerelease. The only search result is selected. There is yellow highlights over part of the photo.|frameless|link=|upright=4|location=center|border]]&lt;br /&gt;
# Now reference assemblies have now been added. That means when coding Visual Studio will provide IntelliSense popups. &lt;br /&gt;
# Try it out by going back to the &amp;lt;code&amp;gt;Class1.cs&amp;lt;/code&amp;gt; file and typing &amp;lt;code&amp;gt;Eco.&amp;lt;/code&amp;gt; and you will see suggestion pop up.&lt;br /&gt;
&lt;br /&gt;
= Dynamic Link Library (DLL) =&lt;br /&gt;
Building the mod creates the &amp;lt;code&amp;gt;.dll&amp;lt;/code&amp;gt; file that can be dropped into the &amp;lt;code&amp;gt;Mods/UserCode&amp;lt;/code&amp;gt; folder of any server an ran.&lt;br /&gt;
&lt;br /&gt;
== Building for Development ==&lt;br /&gt;
&lt;br /&gt;
# Open the project in Visual Studio.&lt;br /&gt;
# Open the &#039;&#039;Build&#039;&#039; menu from the top toolbar.&lt;br /&gt;
# Select &#039;&#039;Build Solution&#039;&#039;. This will produce non-optimized DLL used for testing and development.&amp;lt;br&amp;gt;[[File:VS2022 -- Build Menu.png|alt=VS2022 top menu &amp;quot;Build&amp;quot; is open with &amp;quot;build solution&amp;quot; highlighted (ctrl + shift + b).|frameless|link=|upright=4|location=center|border]]&lt;br /&gt;
# To find the file Visual Studio just built, right click on the project in the Solution Explorer.&lt;br /&gt;
# Select &#039;&#039;Open Folder in File Explorer.&#039;&#039;&amp;lt;br&amp;gt;[[File:VS2022 -- Project Menu.png|alt=VS2022&#039;s solution explorer is shown with the projects right-click menu open. Highlighted is &amp;quot;Open folder in File Explorer&amp;quot;|frameless|link=|upright=4|location=center|border]]&lt;br /&gt;
# From here, the mod&#039;s DLL will be in the &amp;lt;code&amp;gt;bin/Debug/net10.0/&amp;lt;/code&amp;gt; folder. The file will be named with mod&#039;s name, like &amp;lt;code&amp;gt;TheMod.dll&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Copy the mod&#039;s DLL file.&lt;br /&gt;
# Paste it into the folder &amp;lt;code&amp;gt;Eco/Eco_Data/Server/Mods/UserCode&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Checkpoint ===&lt;br /&gt;
&lt;br /&gt;
# Start a Eco and create a local world to see if the mod is being loaded.&lt;br /&gt;
# Check the logs at &amp;lt;code&amp;gt;Eco/Eco_Data/Server/Logs/&amp;lt;/code&amp;gt; to verify...&lt;br /&gt;
## Open the &amp;lt;u&amp;gt;most recent&amp;lt;/u&amp;gt; log file here.&lt;br /&gt;
## If the mod was loaded it there will be a line mentioning the file-name of the DLL. If the DLL was named &amp;lt;code&amp;gt;TheMod.dll&amp;lt;/code&amp;gt;, line 5 is what to look for in the log file:&amp;lt;br&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;[13:55:54.815] [4] [ Info] [Eco] Starting ModKitPlugin                             ...  &lt;br /&gt;
[13:56:27.399] [4] [ Info] [Eco] Starting ModKitPlugin                             ... Finished in 32.584 sec&lt;br /&gt;
 &lt;br /&gt;
[13:56:27.439] [4] [ Info] [Eco] Loading mods                                      ...  &lt;br /&gt;
[13:56:27.439] [9] [ Info] [Eco] Loading TheMod...&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pro-Tip:&#039;&#039;&#039; Setup File Explorer to Sort By Date&lt;br /&gt;
&lt;br /&gt;
# Setup the file view to &#039;&#039;Details&#039;&#039; in this folder because it will show the &#039;&#039;Date Modified&#039;&#039; for each file.&amp;lt;br&amp;gt;[[File:File Explorer -- View Settings Menu.png|alt=Show Window&#039;s File Explorer&#039;s view setting menu with the &amp;quot;details&amp;quot; option highlighted.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
# Click on the &#039;&#039;Date Modified&#039;&#039; header to sort all files. This will sort it so the most recent is on top. Now, every time the server starts the log file is easily found -- it&#039;s the one on top!&amp;lt;br&amp;gt;[[File:File Explorer -- Details Example.png|alt=Show&#039;s window&#039;s File Explorer with the date modified header highlighted.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
== Building for Release ==&lt;br /&gt;
Release builds are optimized and intended for sharing. Unlike Debug builds, they exclude extra debugging overhead and produce a cleaner, final version of your mod.&lt;br /&gt;
&lt;br /&gt;
# Open the project in Visual Studio.&lt;br /&gt;
# Click on the mod&#039;s project in the Solution Explorer to highlight it. [[File:VS2022 -- Solution Explorer Project Highlight.png|alt=Shows VS2022&#039;s solution explorer with the project highlighted.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
# Open the &#039;&#039;Build&#039;&#039; menu from the top toolbar.&lt;br /&gt;
# Select &#039;&#039;Publish Selection&#039;&#039;.&lt;br /&gt;
# A new &#039;&#039;Publish&#039;&#039; window will pop-up.&lt;br /&gt;
# Set the target &#039;&#039;as Folder&#039;&#039;.&lt;br /&gt;
# Click the &#039;&#039;Next&#039;&#039; button. [[File:VS2022 -- Publish Wizard.png|alt=VS2022&#039;s publish wizard showing the target selection screen. The Folder option is highlighted.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
# Leave the folder location as it is.&lt;br /&gt;
# Click the &#039;&#039;Finish&#039;&#039; button.&lt;br /&gt;
# Click the &#039;&#039;Close&#039;&#039; button.&lt;br /&gt;
# Click the &#039;&#039;Publish&#039;&#039; button to start the build. This may take a minute.&lt;br /&gt;
# A green alert will pop up when the build is completed: [[File:VS2022 -- Publish Screen.png|alt=Show&#039;s VS2022 publish screen. There&#039;s publish button at the top of this screen.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
# Inside the alert there will be a blue &#039;&#039;Navigate&#039;&#039; link. Click it.&lt;br /&gt;
# A file explorer should have opened to where the &amp;lt;code&amp;gt;.dll&amp;lt;/code&amp;gt; file is.&lt;br /&gt;
# The mod file will be named with the mod project&#039;s name. For example, &amp;lt;code&amp;gt;TheMod.dll&amp;lt;/code&amp;gt;. &lt;br /&gt;
# To share this mod, the only file needed is the mod&#039;s &amp;lt;code&amp;gt;.dll&amp;lt;/code&amp;gt;.  Do not copy any of the &amp;lt;code&amp;gt;.dll&amp;lt;/code&amp;gt; files starting with &#039;&#039;Eco&#039;&#039; or &#039;&#039;StrangeCloud&#039;&#039;. Additionally, do not copy the &amp;lt;code&amp;gt;TheMod.deps.json&amp;lt;/code&amp;gt; or the &amp;lt;code&amp;gt;TheMod.pbd&amp;lt;/code&amp;gt; files.&lt;br /&gt;
&lt;br /&gt;
= Post-Build Scripts =&lt;br /&gt;
With a post-build script Visual Studio will automatically copy the files into the Eco &amp;lt;code&amp;gt;Mods/UserCode&amp;lt;/code&amp;gt; folder every time it builds. It&#039;s a very nice feature to have when developing and rebuilding to test something new.&lt;br /&gt;
&lt;br /&gt;
# Open the project in Visual Studio.&lt;br /&gt;
# Right-click on the project in the &#039;&#039;Solution Explorer.&#039;&#039;&lt;br /&gt;
# Select &#039;&#039;↱&#039;&#039; &#039;&#039;Edit Project File&#039;&#039; option.&lt;br /&gt;
# Add the properties &amp;lt;code&amp;gt;EcoServerExe&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;EcoServerDir&amp;lt;/code&amp;gt; inside of the &amp;lt;code&amp;gt;PropertyGroup&amp;lt;/code&amp;gt; tag. &#039;&#039;&#039;Tip:&#039;&#039;&#039; By holding shift and right-clicking on a file in the file explorer an old-school menu pops up. Midway down this menu is an option to &#039;&#039;Copy As Path&#039;&#039;. Neat!&lt;br /&gt;
# The project file should look something like this (lines 8-9):&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;Project Sdk=&amp;quot;Microsoft.NET.Sdk&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;PropertyGroup&amp;gt;&lt;br /&gt;
    &amp;lt;TargetFramework&amp;gt;net10.0&amp;lt;/TargetFramework&amp;gt;&lt;br /&gt;
    &amp;lt;ImplicitUsings&amp;gt;enable&amp;lt;/ImplicitUsings&amp;gt;&lt;br /&gt;
    &amp;lt;Nullable&amp;gt;enable&amp;lt;/Nullable&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- Point this at your Eco source server Mods/UserCode --&amp;gt;&lt;br /&gt;
    &amp;lt;EcoModsDir&amp;gt;C:\Program Files (x86)\Steam\steamapps\common\Eco\Eco_Data\Server\Mods\UserCode&amp;lt;/EcoModsDir&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
  &amp;lt;/PropertyGroup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;ItemGroup&amp;gt;&lt;br /&gt;
    &amp;lt;PackageReference Include=&amp;quot;Eco.ReferenceAssemblies&amp;quot; Version=&amp;quot;0.11.1.13-beta-release-887&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/ItemGroup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/Project&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# Add the &amp;lt;code&amp;gt;PostBuild&amp;lt;/code&amp;gt; property inside the &amp;lt;code&amp;gt;Project&amp;lt;/code&amp;gt; tag.&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Project Sdk=&amp;quot;Microsoft.NET.Sdk&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;PropertyGroup&amp;gt;&lt;br /&gt;
    ... SNIP ...&lt;br /&gt;
  &amp;lt;/PropertyGroup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;ItemGroup&amp;gt;&lt;br /&gt;
    ... SNIP ...&lt;br /&gt;
  &amp;lt;/ItemGroup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Target Name=&amp;quot;CopyModToEco&amp;quot; AfterTargets=&amp;quot;Build&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;Copy SourceFiles=&amp;quot;$(TargetPath)&amp;quot; DestinationFolder=&amp;quot;$(EcoModsDir)&amp;quot; SkipUnchangedFiles=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;Copy SourceFiles=&amp;quot;$(TargetDir)$(TargetName).pdb&amp;quot; DestinationFolder=&amp;quot;$(EcoModsDir)&amp;quot; SkipUnchangedFiles=&amp;quot;true&amp;quot; Condition=&amp;quot;Exists(&#039;$(TargetDir)$(TargetName).pdb&#039;)&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Target&amp;gt;&lt;br /&gt;
&amp;lt;/Project&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# Build the project.&lt;br /&gt;
# Look in the &amp;lt;code&amp;gt;Mods/UserCode&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
# There should be &amp;lt;code&amp;gt;TheMod.dll&amp;lt;/code&amp;gt; file.&lt;br /&gt;
&lt;br /&gt;
= Setting up Debugging =&lt;br /&gt;
To set up debugging, make sure the project is configured with the post-build script described above.&lt;br /&gt;
&lt;br /&gt;
Debugging is a powerful tool that allows you to set breakpoints anywhere in your code to pause execution. While paused, you can inspect variable values and step through the code line by line. This is invaluable when tracking down bugs or understanding complex behavior.&lt;br /&gt;
&lt;br /&gt;
When running the server in debug mode, code changes can be hot-reloaded. This allows you to modify code and apply changes without rebuilding and restarting Eco, significantly speeding up development.&lt;br /&gt;
&lt;br /&gt;
# Open the &#039;&#039;Debug&#039;&#039; menu from the top toolbar.&lt;br /&gt;
# Select &#039;&#039;YourModName Debug Properties&#039;&#039; from the bottom of the menu. [[File:VS2022 -- Debug Menu.png|alt=VS2022&#039;s debug menu is open from the top of the application. Highlighted is the last option &amp;quot;Debug Properties&amp;quot;.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
# Click the &#039;&#039;Create a new profile&#039;&#039; button in the top-left of this new window (see image below).&lt;br /&gt;
# Select &#039;&#039;Executable&#039;&#039; from the drop-down menu. [[File:VS2022 -- Debugger Launch Profiles.png|alt=VS2022&#039;s launch profile window is open. Underlined and pointed to by a red mark is the &amp;quot;Create a new profile&amp;quot; button, located in the top-left of the window. Highlighted from the menu under it is the option reading &amp;quot;Executable&amp;quot;.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
# Set the &#039;&#039;Executable&#039;&#039; field to the full path to the &amp;lt;code&amp;gt;EcoServer.exe&amp;lt;/code&amp;gt; file. &#039;&#039;&#039;Example:&#039;&#039;&#039; &amp;lt;code&amp;gt;C:\Program Files (x86)\Steam\steamapps\common\Eco\Eco_Data\Server&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;\EcoServer.exe&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Set the &#039;&#039;Working Directory&#039;&#039; field to the full path to the folder containing the &amp;lt;code&amp;gt;EcoServer.exe&amp;lt;/code&amp;gt; file. &#039;&#039;&#039;Example:&#039;&#039;&#039; &amp;lt;code&amp;gt;C:\Program Files (x86)\Steam\steamapps\common\Eco\Eco_Data\Server&amp;lt;/code&amp;gt;. [[File:VS2022 -- Eco Debugging Profile.png|alt=A fully configured profile ready to debug Eco on VS2022&#039;s launch profile page.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
# Switch to this newly configured profile by clicking the small arrow to the right of the play icon (see image). [[File:VS2022 -- Debugger Profile Selection.png|alt=VS2022&#039;s debugger profile selection menu is open with the newly created &amp;quot;Profile 1&amp;quot; highlighted.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
# Select the newly created profile -- &#039;&#039;Profile 1&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Checkpoint ===&lt;br /&gt;
&lt;br /&gt;
# Put the following in &amp;lt;code&amp;gt;Class1.cs&amp;lt;/code&amp;gt; file:&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
using Eco.Core.Plugins.Interfaces;&lt;br /&gt;
using Eco.Core.Utils;&lt;br /&gt;
using Eco.ModKit;&lt;br /&gt;
&lt;br /&gt;
namespace Test&lt;br /&gt;
{&lt;br /&gt;
    public class Class1 : IModKitPlugin, IInitializablePlugin&lt;br /&gt;
    {&lt;br /&gt;
        public string GetCategory() =&amp;gt; &amp;quot;Tutorial&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        public string GetStatus() =&amp;gt; this._status;&lt;br /&gt;
        string _status = string.Empty;&lt;br /&gt;
&lt;br /&gt;
        public void Initialize(TimedTask timer)&lt;br /&gt;
        {&lt;br /&gt;
            this._status = &amp;quot;Ok&amp;quot;;&lt;br /&gt;
            bool yes = true;&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    [ChatCommandHandler]&lt;br /&gt;
    [SupportedOSPlatform(&amp;quot;windows7.0&amp;quot;)]&lt;br /&gt;
    public static class CommonCentsCommands&lt;br /&gt;
    {&lt;br /&gt;
        [ChatCommand(&amp;quot;wikiTest&amp;quot;, ChatAuthorizationLevel.Moderator)]&lt;br /&gt;
        public static void wikiTest(IChatClient chat)&lt;br /&gt;
        {&lt;br /&gt;
            chat.MsgLoc($&amp;quot;Hello, World.&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;This code creates a basic plugin, called &amp;lt;code&amp;gt;Class1&amp;lt;/code&amp;gt;, that Eco will load and initialize on startup. Eco knows to do this because this class inherits the &amp;lt;code&amp;gt;IModKitPlugin&amp;lt;/code&amp;gt; interface (causes it to be loaded) and the &amp;lt;code&amp;gt;IInitializablePlugin&amp;lt;/code&amp;gt; interface (causes it to be initialized).&lt;br /&gt;
# Add a breakpoint to the code by right-clicking on the line &amp;lt;code&amp;gt;bool yes = true;&amp;lt;/code&amp;gt;[[File:VS2022 -- Adding a breakpoint.png|alt=A boilerplate example of a mod is shown in the VS2022 text editor. A line has a menu open above it with the option &amp;quot;Breakpoint&amp;quot; expanded and the option &amp;quot;Insert Breakpoint&amp;quot; highlighted on the sub-menu.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
# Click the green &#039;&#039;⏵&#039;&#039; button to start the server with the mod. The server will start and Visual Studio will flash back on screen once Eco tries to initialize the mod&#039;s plugin.[[File:VS2022 -- Launch Debugger.png|alt=Highlighted is the play button for VS2022&#039;s debugger. The &amp;quot;Profile 1&amp;quot; is still selected from before.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
# When Visual Studio hits the breakpoint it will keep startup from continuing and allow detailed inspection to happen. In the bottom left (circled in red) is a table of all of the variables within scope. Use this to see what is happening (especially useful in loops!). At the middle-top (circled in red) are some of the debugger controls. Clicking the highlighted &#039;&#039;Continue&#039;&#039; button resumes normal operation. Using the buttons to the right that are highlighted will allow the developer to step through the codes execution to see exactly how each line is performing. Debugging is a deep and rich topic that this guide will not explain further, but there&#039;s a great video by Microsoft Visual Studio on YouTube called Basics of Debugging. In that 45 minute video (don&#039;t worry there&#039;s annotations to jump to just what is interesting) a whole gamut of information about how to use debugging is covered. [[File:VS2022 -- Debugger LIve.png|alt=Shows a simple plugin&#039;s code in the editor of VS2022. In the bottom-left is a table of all variables used in the function. It is circled in red. On the top of the image also circled in red is the debugger controls. Highlighted within is the continue button and the &amp;quot;step over&amp;quot; button.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
# Hit the green&#039;&#039;⏵&#039;&#039; &#039;&#039;Continue&#039;&#039; button.&lt;br /&gt;
# Let the server finish loading.&lt;br /&gt;
# Open Eco to play.&lt;br /&gt;
# Connect to the LAN world by named something like &#039;&#039;Eco World&#039;&#039;.&lt;br /&gt;
# Type &amp;lt;code&amp;gt;/wikiDemo&amp;lt;/code&amp;gt; in chat.&lt;br /&gt;
# See that the mod replies with &#039;&#039;Hello, World.&#039;&#039;&lt;br /&gt;
# Change line 29 in &amp;lt;code&amp;gt;Class1.cs&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;chat.MsgLoc($&amp;quot;Hello, Modder!&amp;quot;);&amp;lt;/code&amp;gt;&lt;br /&gt;
# Hit the hot reload button. It&#039;s just to the right of the green &#039;&#039;⏵&#039;&#039; &#039;&#039;Continue&#039;&#039; button and vaguely looks like the 🔥 icon.&lt;br /&gt;
# Type &amp;lt;code&amp;gt;/wikiDemo&amp;lt;/code&amp;gt; in chat.&lt;br /&gt;
# See that the mod now replies with &#039;&#039;Hello, Modder!&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Releasing a Mod ==&lt;br /&gt;
&lt;br /&gt;
=== Mod.io ===&lt;br /&gt;
&amp;lt;code&amp;gt;mod.io&amp;lt;/code&amp;gt; is where creators share their mods with players and others.&lt;br /&gt;
&lt;br /&gt;
To share a new mod here all that is necessary is an account.&lt;br /&gt;
&lt;br /&gt;
Head over to &amp;lt;code&amp;gt;mod.io/g/eco&amp;lt;/code&amp;gt; and click &#039;&#039;Login&#039;&#039; in the top-right corner. &lt;br /&gt;
&lt;br /&gt;
Finish signing-up with whatever account type you prefer.&lt;br /&gt;
&lt;br /&gt;
Click the &#039;&#039;Add Mod&#039;&#039; button in the top-right.&lt;br /&gt;
&lt;br /&gt;
Follow the upload wizard as directed.&lt;br /&gt;
&lt;br /&gt;
Once on the &#039;&#039;File Manager&#039;&#039; section, a zip file is needed.&lt;br /&gt;
&lt;br /&gt;
Zip the mod&#039;s &amp;lt;u&amp;gt;release&amp;lt;/u&amp;gt; dll and any other assets necessary (e.g. Unity bundles) by putting all the files into a folder. Then right-click on that folder and select &#039;&#039;Compress To...&#039;&#039; and from the sub-menu select &#039;&#039;ZIP file&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Upload that zip file. Considering naming it with a version number to help stay organized (e.g. &#039;&#039;v1&#039;&#039;). Next release, increase that number by 1 (e.g. &#039;&#039;v2&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Congratulations on releasing the mod!&lt;br /&gt;
&lt;br /&gt;
=== Sharing on Discord ===&lt;br /&gt;
Consider posting an ad on the official {{EcoDiscord}}. There&#039;s a channel for mods called &#039;&#039;mod-ads&#039;&#039;. &lt;br /&gt;
Please read the rules before posting.&lt;br /&gt;
&lt;br /&gt;
== Helpful Resources ==&lt;br /&gt;
&lt;br /&gt;
* Consider learning source control (Git). Completely optional, but can help you keep things organized as development continues.&lt;br /&gt;
* Explore Eco’s open-source mod projects for ideas (search on Github &amp;quot;Eco Mods&amp;quot; to find some real-life examples)&lt;br /&gt;
** {{EcoDiscord}}has a channel for mod developers to help one another called &#039;&#039;mod-dev.&#039;&#039; &#039;&#039;&#039;Note:&#039;&#039;&#039; Make under the &#039;&#039;Channel &amp;amp; Roles&#039;&#039; settings you have the 🛠&#039;&#039;Yes, I want to see the channels about modding&#039;&#039; role selected.&lt;/div&gt;</summary>
		<author><name>WugWugg</name></author>
	</entry>
	<entry>
		<id>https://wiki.play.eco/en/index.php?title=Getting_Started_with_Eco_Modding_in_Visual_Studio&amp;diff=16747</id>
		<title>Getting Started with Eco Modding in Visual Studio</title>
		<link rel="alternate" type="text/html" href="https://wiki.play.eco/en/index.php?title=Getting_Started_with_Eco_Modding_in_Visual_Studio&amp;diff=16747"/>
		<updated>2026-04-29T13:21:33Z</updated>

		<summary type="html">&lt;p&gt;WugWugg: Building for development is updated.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction =&lt;br /&gt;
This guide focuses on setting up a C# modding environment in Visual Studio.&lt;br /&gt;
&lt;br /&gt;
It does &#039;&#039;&#039;not&#039;&#039;&#039; cover adding Unity assets (models, prefabs, UI) to the game. See: [[From 3D Asset to Working Worktable]] for that workflow.&lt;br /&gt;
&lt;br /&gt;
This guide won’t teach you how to code or write a mod, but it will help you get everything set up so you’re ready to start learning. Helpful resources are listed at the bottom of this guide, including [[Helpful Examples for Modding]] for practical code examples.&lt;br /&gt;
&lt;br /&gt;
Visual Studio 2026 has a completely free to use version called the &#039;&#039;&#039;Community Edition&#039;&#039;&#039;. This guide is written assuming that&#039;s the version used.&lt;br /&gt;
&lt;br /&gt;
=== Have Ready ===&lt;br /&gt;
* A copy of the Eco game installed&lt;br /&gt;
* A file explorer and the file-path to &amp;lt;code&amp;gt;Eco&amp;lt;/code&amp;gt; folder&amp;lt;br&amp;gt;&#039;&#039;&#039;Tip:&#039;&#039;&#039; Within this folder there&#039;s folders like &amp;lt;code&amp;gt;D3D12&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Eco_Data&amp;lt;/code&amp;gt;. Also, you&#039;ll find the &amp;lt;code&amp;gt;Eco.exe&amp;lt;/code&amp;gt; file here. There are other files and folder here too, but this list is just to help you know what the folder looks like.&lt;br /&gt;
* &#039;&#039;&#039;Tip:&#039;&#039;&#039; Steam users can find the install folder by right-clicking on the game in your Steam Library:&amp;lt;br&amp;gt;[[File:Steam Library -- Browse Local Files.png|alt=Shows a Steam Library with a menu open over the Eco game. Highlighted in that menu is a &amp;quot;Manage&amp;quot; option, opening a sub-menu. The sub-menu has &amp;quot;Browse local files&amp;quot; highlighted.|frameless|border|upright=3|location=center|link=]]&lt;br /&gt;
&lt;br /&gt;
= Installing Visual Studio =&lt;br /&gt;
# Go to &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://visualstudio.microsoft.com/downloads/#visual-studio-community-2026&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; and look for the &amp;quot;&#039;&#039;&#039;Visual Studio Community 2026&#039;&#039;&#039;&amp;quot; download.&lt;br /&gt;
# Start the download by clicking on the &#039;&#039;Download&#039;&#039; button.&lt;br /&gt;
# Run the installer until it reaches to the Workloads page.&lt;br /&gt;
# Select these workloads...&lt;br /&gt;
## .NET desktop development -- &#039;&#039;&#039;Required&#039;&#039;&#039; for any mod development&lt;br /&gt;
## ASP.NET and web development -- Optional. If you want to interact with external websites or Eco&#039;s own web server (e.g. Discord&#039;s webhooks or extending the API)&lt;br /&gt;
# With those workloads selected the page should look something like this:&amp;lt;br&amp;gt;[[File:VisualStudioCommunity2022 Workloads.png|alt=Workloads screen during VS2022 installation. Options selected are &amp;quot;ASP.NET and web development&amp;quot; and &amp;quot;.NET desktop development&amp;quot;. |frameless|location=center|upright=4|link=|border]]&lt;br /&gt;
# Click the Install button. It will take a few minutes to complete installation.&lt;br /&gt;
# Open Visual Studio after it installs.&lt;br /&gt;
# You may be prompted to sign in:&lt;br /&gt;
## Click &#039;&#039;Skip and add accounts later&#039;&#039; to continue.&lt;br /&gt;
## If you plan to use Github, sign in to make version control easier.&lt;br /&gt;
# Finally, it might ask what color theme you&#039;d like. Select your preference and continue.&lt;br /&gt;
# Visual Studio is now installed and ready to be used.&lt;br /&gt;
&lt;br /&gt;
= Setting Up a New Mod =&lt;br /&gt;
Once Eco and Visual Studio are installed all of the tools needed to code, build, and run a mod are ready.&lt;br /&gt;
&lt;br /&gt;
== Creating a New Project ==&lt;br /&gt;
# Open Visual Studio. When it first opens it will show you a dashboard where you can quickly select what you want to do.&lt;br /&gt;
# On the right, under &#039;&#039;Get Started&#039;&#039; find the &#039;&#039;Create a new project&#039;&#039; button:&amp;lt;br&amp;gt;[[File:VS2022 OpeningDashboard.png|alt=VS2022&#039;s launch dashboard showing recent projects on the left and quick action buttons on the right. Highlighted is a button titled &amp;quot;Create a new project&amp;quot;.|frameless|border|link=|location=center|upright=4]]&lt;br /&gt;
# A new window will pop-up.&lt;br /&gt;
# Select C# &#039;&#039;Class Library.&#039;&#039; To find the template, search &amp;lt;code&amp;gt;C# library&amp;lt;/code&amp;gt; in the search bar. Select the C# option titled &#039;&#039;Class Library&#039;&#039;.&amp;lt;br&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; &amp;lt;u&amp;gt;Make sure you select the &amp;lt;code&amp;gt;C#&amp;lt;/code&amp;gt; option as there are other options similarly named &#039;&#039;Class Library&#039;&#039;.&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt;[[File:VS2022 NewProjectWizard Templates.png|frameless|border|location=center|upright=4|link=]]&lt;br /&gt;
# Click the &#039;&#039;Next&#039;&#039; button.&lt;br /&gt;
# For &#039;&#039;Project Name&#039;&#039; type the name of the mod being created.&lt;br /&gt;
# The other options like the &#039;&#039;Location&#039;&#039; and the &#039;&#039;Solution Name&#039;&#039; do not need edited.&lt;br /&gt;
# Leave the box &#039;&#039;Place solution and project in the same directory&#039;&#039; unchecked.&lt;br /&gt;
# Click the Next button.&lt;br /&gt;
# In the &#039;&#039;Framework&#039;&#039; drop-down select the same version of .NET Eco uses (as described below). &#039;&#039;&#039;Tip:&#039;&#039;&#039; Eco currently targets &#039;&#039;.NET 10.0&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== .NET Version ==&lt;br /&gt;
To confirm the version of .NET that Eco uses:&lt;br /&gt;
&lt;br /&gt;
# Go to the NuGet Gallery &amp;lt;code&amp;gt;www.nuget.org/packages?q=Eco.ReferenceAssemblies&amp;lt;/code&amp;gt;&amp;lt;!-- I&#039;m not directly linking to the package as there is no way to link to the latest version. So as a workaround I&#039;m using the search to point the reader to the latest version. --&amp;gt;&lt;br /&gt;
# Find the package with the name &#039;&#039;Eco.ReferenceAssemblies&#039;&#039; made by &#039;&#039;StrangeLoopGames&#039;&#039;.&lt;br /&gt;
# Notice the chip underneath of it with the &#039;&#039;.NET&#039;&#039; version it targets.&amp;lt;br&amp;gt;[[File:NuGetGallery -- Eco.ReferenceAssemblies Search.png|alt=Shows the search result of Eco.ReferenceAssemblies. In a blue chip the text &amp;quot;.NET 8.0&amp;quot; can be seen.|frameless|upright=4|location=center|link=|border]]&lt;br /&gt;
# Click on that search result (shown above).&lt;br /&gt;
# A more detailed page is shown. Again, there&#039;s chips showing what version of .NET to use:&amp;lt;br&amp;gt;[[File:NuGetGallery--Eco.ReferenceAssemblies Details.png|alt=Show the package page for &amp;quot;Eco.ReferenceAssemblies&amp;quot; on NuGet Gallery. Circled in red are two chips with some version of the text &amp;quot;.NET 8.0&amp;quot; inside them.|frameless|link=|border|location=center|upright=3]]&lt;br /&gt;
&lt;br /&gt;
== Linking to Eco Assemblies ==&lt;br /&gt;
# Find the &#039;&#039;Solution Explorer&#039;&#039; on the right side of Visual Studio. It should look something like this:&amp;lt;br&amp;gt;&#039;&#039;&#039;Note&#039;&#039;&#039;: If the solution explorer isn&#039;t there, open the &#039;&#039;View&#039;&#039; menu (top toolbar) and select &#039;&#039;Solution Explorer&#039;&#039;.&amp;lt;br&amp;gt;[[File:VS2022 -- Solution Explorer.png|alt=A picture of a basic layout in Visual Studio 2022 with the Solution Explorer open on the right-hand side. The solution explorer is circled in red.|frameless|link=|upright=4|location=center|border]]&lt;br /&gt;
# In the &#039;&#039;Solution Explorer&#039;&#039;, find and right-click on the &#039;&#039;Dependencies&#039;&#039; item.&lt;br /&gt;
# Select &#039;&#039;Manage NuGet Packages...&#039;&#039;&amp;lt;br&amp;gt;[[File:VS2022 Solution Explorer -- Manage NuGet Packages.png|alt=Shows VS2022&#039;s Solution Explorer with project expanded. The References line is highlighted and a menu is open. On that menu the &amp;quot;Manage NuGet Packages&amp;quot; line is highlighted.|frameless|link=|upright=4|location=center|border]]&lt;br /&gt;
# A &#039;&#039;NuGet&#039;&#039; tab will have opened in the editor window...&lt;br /&gt;
## Right above the search bar on this tab there&#039;s sub-tabs.&lt;br /&gt;
## Select the &#039;&#039;Browse&#039;&#039; sub-tab.&lt;br /&gt;
## Type &amp;lt;code&amp;gt;Eco.ReferenceAssemblies&amp;lt;/code&amp;gt; into the search bar.&lt;br /&gt;
## Check the &#039;&#039;Include prerelease&#039;&#039; check-box.&lt;br /&gt;
## Find the option with the name &#039;&#039;Eco.ReferenceAssemblies&#039;&#039; made by &#039;&#039;StrangeLoopGames&#039;&#039;.&lt;br /&gt;
## Click on that.&lt;br /&gt;
## A details panel will show up to the right. It will show the version of the reference assemblies being targeted. By default it chooses the latest and can be left at its default.&lt;br /&gt;
## Click the Install button.&lt;br /&gt;
## Click the &#039;&#039;Apply&#039;&#039; button on the popup to finish adding the references.&amp;lt;br&amp;gt;[[File:VS2022 -- NuGet Install Eco.ReferenceAssemblies.png|alt=VS2022 is open to the NuGet tab and is searching with the text Eco.ReferenceAssemblies. The checkbox to the right of the search is checked -- include prerelease. The only search result is selected. There is yellow highlights over part of the photo.|frameless|link=|upright=4|location=center|border]]&lt;br /&gt;
# Now reference assemblies have now been added. That means when coding Visual Studio will provide IntelliSense popups. &lt;br /&gt;
# Try it out by going back to the &amp;lt;code&amp;gt;Class1.cs&amp;lt;/code&amp;gt; file and typing &amp;lt;code&amp;gt;Eco.&amp;lt;/code&amp;gt; and you will see suggestion pop up.&lt;br /&gt;
&lt;br /&gt;
= Dynamic Link Library (DLL) =&lt;br /&gt;
Building the mod creates the &amp;lt;code&amp;gt;.dll&amp;lt;/code&amp;gt; file that can be dropped into the &amp;lt;code&amp;gt;Mods/UserCode&amp;lt;/code&amp;gt; folder of any server an ran.&lt;br /&gt;
&lt;br /&gt;
== Building for Development ==&lt;br /&gt;
&lt;br /&gt;
# Open Visual Studio.&lt;br /&gt;
# Open the &#039;&#039;Build&#039;&#039; menu from the top toolbar.&lt;br /&gt;
# Select &#039;&#039;Build Solution&#039;&#039;. This will produce non-optimized DLL used for testing and development.&amp;lt;br&amp;gt;[[File:VS2022 -- Build Menu.png|alt=VS2022 top menu &amp;quot;Build&amp;quot; is open with &amp;quot;build solution&amp;quot; highlighted (ctrl + shift + b).|frameless|link=|upright=4|location=center|border]]&lt;br /&gt;
# To find the file Visual Studio just built, right click on the project in the Solution Explorer.&lt;br /&gt;
# Select &#039;&#039;Open Folder in File Explorer.&#039;&#039;&amp;lt;br&amp;gt;[[File:VS2022 -- Project Menu.png|alt=VS2022&#039;s solution explorer is shown with the projects right-click menu open. Highlighted is &amp;quot;Open folder in File Explorer&amp;quot;|frameless|link=|upright=4|location=center|border]]&lt;br /&gt;
# From here, the mod&#039;s DLL will be in the &amp;lt;code&amp;gt;bin/Debug/net10.0/&amp;lt;/code&amp;gt; folder. The file will be named with mod&#039;s name, like &amp;lt;code&amp;gt;TheMod.dll&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Copy the mod&#039;s DLL file.&lt;br /&gt;
# Paste it into the folder &amp;lt;code&amp;gt;Eco/Eco_Data/Server/Mods/UserCode&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Checkpoint ===&lt;br /&gt;
&lt;br /&gt;
# Start a Eco and create a local world to see if the mod is being loaded.&lt;br /&gt;
# Check the logs at &amp;lt;code&amp;gt;Eco/Eco_Data/Server/Logs/&amp;lt;/code&amp;gt; to verify...&lt;br /&gt;
## Open the &amp;lt;u&amp;gt;most recent&amp;lt;/u&amp;gt; log file here.&lt;br /&gt;
## If the mod was loaded it there will be a line mentioning the file-name of the DLL. If the DLL was named &amp;lt;code&amp;gt;TheMod.dll&amp;lt;/code&amp;gt;, line 5 is what to look for in the log file:&amp;lt;br&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;[13:55:54.815] [4] [ Info] [Eco] Starting ModKitPlugin                             ...  &lt;br /&gt;
[13:56:27.399] [4] [ Info] [Eco] Starting ModKitPlugin                             ... Finished in 32.584 sec&lt;br /&gt;
 &lt;br /&gt;
[13:56:27.439] [4] [ Info] [Eco] Loading mods                                      ...  &lt;br /&gt;
[13:56:27.439] [9] [ Info] [Eco] Loading TheMod...&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pro-Tip:&#039;&#039;&#039; Setup File Explorer to Sort By Date&lt;br /&gt;
&lt;br /&gt;
# Setup the file view to &#039;&#039;Details&#039;&#039; in this folder because it will show the &#039;&#039;Date Modified&#039;&#039; for each file.&amp;lt;br&amp;gt;[[File:File Explorer -- View Settings Menu.png|alt=Show Window&#039;s File Explorer&#039;s view setting menu with the &amp;quot;details&amp;quot; option highlighted.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
# Click on the &#039;&#039;Date Modified&#039;&#039; header to sort all files. This will sort it so the most recent is on top. Now, every time the server starts the log file is easily found -- it&#039;s the one on top!&amp;lt;br&amp;gt;[[File:File Explorer -- Details Example.png|alt=Show&#039;s window&#039;s File Explorer with the date modified header highlighted.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
== Building for Release ==&lt;br /&gt;
To build for release, click on the mod&#039;s project in the Solution Explorer to highlight it.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Solution Explorer Project Highlight.png|alt=Shows VS2022&#039;s solution explorer with the project highlighted.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
Then, open the &#039;&#039;Build&#039;&#039; menu from the top of VS2022 and select &#039;&#039;Publish Selection&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Set the target &#039;&#039;as Folder&#039;&#039;. Click the &#039;&#039;Next&#039;&#039; button.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Publish Wizard.png|alt=VS2022&#039;s publish wizard showing the target selection screen. The Folder option is highlighted.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
Leave the folder location as default. Click the &#039;&#039;Finish&#039;&#039; button.&lt;br /&gt;
&lt;br /&gt;
Click the &#039;&#039;Close&#039;&#039; button.&lt;br /&gt;
&lt;br /&gt;
Finally, click the &#039;&#039;Publish&#039;&#039; button to start the build.&lt;br /&gt;
&lt;br /&gt;
A green alert will pop up when the build is completed:&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Publish Screen.png|alt=Show&#039;s VS2022 publish screen. There&#039;s publish button at the top of this screen.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Either use the blue links on this page to find the file or browse the project&#039;s files as shown in &amp;quot;Building for Development&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Inside the project, the file will be in &amp;lt;code&amp;gt;bin/Release/net8.0/publish&amp;lt;/code&amp;gt;. The file will be named with the mod project&#039;s name. For example, &amp;lt;code&amp;gt;TheMod.dll&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Since the reference assemblies are already included in the game, do not worry about the other files here.  &lt;br /&gt;
&lt;br /&gt;
To share this mod, the only file needed is the mod&#039;s dll -- &amp;lt;code&amp;gt;TheMod.dll&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Post-Build Scripts: Automatic Copy ===&lt;br /&gt;
With a post-build script VS2022 will automatically copy the files each build. It&#039;s a very nice feature to have when developing and rebuilding every 5 minutes to test something new.&lt;br /&gt;
&lt;br /&gt;
First, add the variables about where &amp;lt;code&amp;gt;EcoServer.exe&amp;lt;/code&amp;gt; is located to the project file.&lt;br /&gt;
&lt;br /&gt;
Right-click on the project in the Solution Explorer and select the &#039;&#039;Edit Project File&#039;&#039; option.&lt;br /&gt;
&lt;br /&gt;
Add the properties &amp;lt;code&amp;gt;EcoServerExe&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;EcoServerDir&amp;lt;/code&amp;gt; &amp;lt;u&amp;gt;inside of the &amp;lt;code&amp;gt;PropertyGroup&amp;lt;/code&amp;gt; tag.&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; Tip: By holding shift and right-clicking on a file in the file explorer an old-school menu pops up. Midway down this menu is an option to &#039;&#039;Copy As Path&#039;&#039;. Neat!&lt;br /&gt;
&lt;br /&gt;
The project file should look something like this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;Project Sdk=&amp;quot;Microsoft.NET.Sdk&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;PropertyGroup&amp;gt;&lt;br /&gt;
    &amp;lt;TargetFramework&amp;gt;net8.0&amp;lt;/TargetFramework&amp;gt;&lt;br /&gt;
    &amp;lt;ImplicitUsings&amp;gt;enable&amp;lt;/ImplicitUsings&amp;gt;&lt;br /&gt;
    &amp;lt;Nullable&amp;gt;enable&amp;lt;/Nullable&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;EcoServerExe&amp;gt;$(EcoServerDir)\EcoServer.exe&amp;lt;/EcoServerExe&amp;gt;&lt;br /&gt;
    &amp;lt;EcoServerDir&amp;gt;C:\Program Files (x86)\Steam\steamapps\common\Eco\Eco_Data\Server&amp;lt;/EcoServerDir&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
  &amp;lt;/PropertyGroup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;ItemGroup&amp;gt;&lt;br /&gt;
    &amp;lt;PackageReference Include=&amp;quot;Eco.ReferenceAssemblies&amp;quot; Version=&amp;quot;0.11.1.13-beta-release-887&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/ItemGroup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/Project&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Next, add the &amp;lt;code&amp;gt;PostBuild&amp;lt;/code&amp;gt; property inside the &amp;lt;code&amp;gt;Project&amp;lt;/code&amp;gt; tag.&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Project Sdk=&amp;quot;Microsoft.NET.Sdk&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;PropertyGroup&amp;gt;&lt;br /&gt;
    ... SNIP ...&lt;br /&gt;
  &amp;lt;/PropertyGroup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;ItemGroup&amp;gt;&lt;br /&gt;
    ... SNIP ...&lt;br /&gt;
  &amp;lt;/ItemGroup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;Target Name=&amp;quot;PostBuild&amp;quot; AfterTargets=&amp;quot;PostBuildEvent&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;Exec Command=&#039;call PostBuild.bat &amp;quot;$(EcoServerDir)&amp;quot; &amp;quot;$(OutDir)&amp;quot; &amp;quot;$(MSBuildProjectName)&amp;quot;&#039;/&amp;gt;&lt;br /&gt;
  &amp;lt;/Target&amp;gt;&lt;br /&gt;
&amp;lt;/Project&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Finally create a new file directly inside the project by right-clicking on the project in the Solution Explorer. Select the &#039;&#039;Add&#039;&#039; and click on &#039;&#039;New Item...&#039;&#039; from the sub-menu.&lt;br /&gt;
&lt;br /&gt;
Use the name &amp;lt;code&amp;gt;PostBuild.bat&amp;lt;/code&amp;gt; for this new file.&lt;br /&gt;
&lt;br /&gt;
Open it and put the following in the PostBuild file:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;batch&amp;quot;&amp;gt;REM reading in arguements to sensible variables&lt;br /&gt;
set serverDir=%1&lt;br /&gt;
set outDir=%2&lt;br /&gt;
set projName=%3&lt;br /&gt;
&lt;br /&gt;
REM removing double-quotes added to variables for concatenation&lt;br /&gt;
set serverDir=%serverDir:&amp;quot;=%&lt;br /&gt;
set outDir=%outDir:&amp;quot;=%&lt;br /&gt;
set projName=%projName:&amp;quot;=%&lt;br /&gt;
&lt;br /&gt;
REM Copy mod dll to Mods dir&lt;br /&gt;
set dllFile=%outDir%%projName%.dll&lt;br /&gt;
echo Copying mod dll file: %dllFile%&lt;br /&gt;
copy &amp;quot;%dllFile%&amp;quot; &amp;quot;%serverDir%\Mods&amp;quot;&lt;br /&gt;
&lt;br /&gt;
REM Copy mod pdb to directory where EcoServer.exe is&lt;br /&gt;
set pdbFile=%outDir%%projName%.pdb&lt;br /&gt;
echo Copying mod pdb file: %pdbFile%&lt;br /&gt;
copy &amp;quot;%pdbFile%&amp;quot; &amp;quot;%serverDir%&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;Now try running a rebuild of the project. The output should report copying files and inside the &amp;lt;code&amp;gt;Eco/Eco_Data/Server/Mods&amp;lt;/code&amp;gt; folder should be &amp;lt;code&amp;gt;TheMod.dll&amp;lt;/code&amp;gt; file&lt;br /&gt;
&lt;br /&gt;
=== Setting up Debugging ===&lt;br /&gt;
&#039;&#039;&#039;Special thanks to Monzun#0606 on Eco&#039;s Discord for helping research the following information.&#039;&#039;&#039;&lt;br /&gt;
To setup debugging, &amp;lt;u&amp;gt;make sure that the project is setup with the post-build script described above&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Debugging is a &amp;lt;u&amp;gt;powerful&amp;lt;/u&amp;gt; tool to a developer and allows the developer to set breakpoints anywhere in the code to stop execution. When execution is stopped the developer can review every variable&#039;s value and incrementally continue the code. This is invaluable when tracking down bugs or trying to understand a complex piece of code.&lt;br /&gt;
&lt;br /&gt;
From the top menu, select &#039;&#039;Debug&#039;&#039; and click on the option &#039;&#039;TheMod Debug Properties&#039;&#039; at the bottom of the menu.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Debug Menu.png|alt=VS2022&#039;s debug menu is open from the top of the application. Highlighted is the last option &amp;quot;Debug Properties&amp;quot;.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
Find the &#039;&#039;Create a new profile&#039;&#039; button &#039;&#039;&#039;in the top-left&#039;&#039;&#039; of this new window. Select &#039;&#039;Executable&#039;&#039; from the drop-down menu.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Debugger Launch Profiles.png|alt=VS2022&#039;s launch profile window is open. Underlined and pointed to by a red mark is the &amp;quot;Create a new profile&amp;quot; button, located in the top-left of the window. Highlighted from the menu under it is the option reading &amp;quot;Executable&amp;quot;.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
Set the &#039;&#039;Executable&#039;&#039; field to the full path to the &amp;lt;code&amp;gt;EcoServer.exe&amp;lt;/code&amp;gt; file. For example, &amp;lt;code&amp;gt;C:\Program Files (x86)\Steam\steamapps\common\Eco\Eco_Data\Server&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;\EcoServer.exe&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Set the &#039;&#039;Working Directory&#039;&#039; field to the full path to the folder containing the &amp;lt;code&amp;gt;EcoServer.exe&amp;lt;/code&amp;gt; file. For example, &amp;lt;code&amp;gt;C:\Program Files (x86)\Steam\steamapps\common\Eco\Eco_Data\Server&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Eco Debugging Profile.png|alt=A fully configured profile ready to debug Eco on VS2022&#039;s launch profile page.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
To use this newly configured profile, switch to it by clicking the small arrow to the right of the play icon (see image).  Select the newly created profile -- &#039;&#039;Profile 1&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Debugger Profile Selection.png|alt=VS2022&#039;s debugger profile selection menu is open with the newly created &amp;quot;Profile 1&amp;quot; highlighted.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
To see how breakpoints work, put the following in &amp;lt;code&amp;gt;Class1.cs&amp;lt;/code&amp;gt; file:&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot;&amp;gt;&lt;br /&gt;
using Eco.Core.Plugins.Interfaces;&lt;br /&gt;
using Eco.Core.Utils;&lt;br /&gt;
using Eco.ModKit;&lt;br /&gt;
&lt;br /&gt;
namespace Test&lt;br /&gt;
{&lt;br /&gt;
    public class Class1 : IModKitPlugin, IInitializablePlugin&lt;br /&gt;
    {&lt;br /&gt;
        public string GetCategory() =&amp;gt; &amp;quot;Tutorial&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        public string GetStatus() =&amp;gt; this._status;&lt;br /&gt;
        string _status = string.Empty;&lt;br /&gt;
&lt;br /&gt;
        public void Initialize(TimedTask timer)&lt;br /&gt;
        {&lt;br /&gt;
            this._status = &amp;quot;Ok&amp;quot;;&lt;br /&gt;
            bool yes = true;&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;This code creates a basic plugin, called &amp;lt;code&amp;gt;Class1&amp;lt;/code&amp;gt;, that Eco will load and initialize on startup. Eco knows to do this because this class inherits the &amp;lt;code&amp;gt;IModKitPlugin&amp;lt;/code&amp;gt; interface (causes it to be loaded) and the &amp;lt;code&amp;gt;IInitializablePlugin&amp;lt;/code&amp;gt; interface (causes it to be initialized).&lt;br /&gt;
&lt;br /&gt;
Add a breakpoint to the code by right-clicking on the line &amp;lt;code&amp;gt;bool yes = true;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Adding a breakpoint.png|alt=A boilerplate example of a mod is shown in the VS2022 text editor. A line has a menu open above it with the option &amp;quot;Breakpoint&amp;quot; expanded and the option &amp;quot;Insert Breakpoint&amp;quot; highlighted on the sub-menu.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
Now hit the play button. The server will start and VS2022 will flash back on screen once Eco tries to initialize the mod&#039;s plugin.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Launch Debugger.png|alt=Highlighted is the play button for VS2022&#039;s debugger. The &amp;quot;Profile 1&amp;quot; is still selected from before.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After a little bit the server will start-up and hit the breakpoint set. When it does VS2022 will keep startup from continuing and allow detailed inspection to happen.&lt;br /&gt;
&lt;br /&gt;
In the bottom left (circled in red) is a table of all of the variables within scope. Use this to see what is happening (especially useful in loops!).&lt;br /&gt;
&lt;br /&gt;
At the middle-top (circled in red) are some of the debugger controls. Clicking the highlighted &#039;&#039;Continue&#039;&#039; button resumes normal operation. Using the buttons to the right that are highlighted will allow the developer to step through the codes execution to see exactly how each line is performing. Debugging is a deep and rich topic that this guide will not explain further, but there&#039;s a great video by Microsoft Visual Studio on YouTube called Basics of Debugging. In that 45 minute video (don&#039;t worry there&#039;s annotations to jump to just what is interesting) a whole gamut of information about how to use debugging is covered.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Debugger LIve.png|alt=Shows a simple plugin&#039;s code in the editor of VS2022. In the bottom-left is a table of all variables used in the function. It is circled in red. On the top of the image also circled in red is the debugger controls. Highlighted within is the continue button and the &amp;quot;step over&amp;quot; button.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
== Releasing a Mod ==&lt;br /&gt;
&lt;br /&gt;
=== Mod.io ===&lt;br /&gt;
&amp;lt;code&amp;gt;mod.io&amp;lt;/code&amp;gt; is where creators share their mods with players and others.&lt;br /&gt;
&lt;br /&gt;
To share a new mod here all that is necessary is an account.&lt;br /&gt;
&lt;br /&gt;
Head over to &amp;lt;code&amp;gt;mod.io/g/eco&amp;lt;/code&amp;gt; and click &#039;&#039;Login&#039;&#039; in the top-right corner. &lt;br /&gt;
&lt;br /&gt;
Finish signing-up with whatever account type you prefer.&lt;br /&gt;
&lt;br /&gt;
Click the &#039;&#039;Add Mod&#039;&#039; button in the top-right.&lt;br /&gt;
&lt;br /&gt;
Follow the upload wizard as directed.&lt;br /&gt;
&lt;br /&gt;
Once on the &#039;&#039;File Manager&#039;&#039; section, a zip file is needed.&lt;br /&gt;
&lt;br /&gt;
Zip the mod&#039;s &amp;lt;u&amp;gt;release&amp;lt;/u&amp;gt; dll and any other assets necessary (e.g. Unity bundles) by putting all the files into a folder. Then right-click on that folder and select &#039;&#039;Compress To...&#039;&#039; and from the sub-menu select &#039;&#039;ZIP file&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Upload that zip file. Considering naming it with a version number to help stay organized (e.g. &#039;&#039;v1&#039;&#039;). Next release, increase that number by 1 (e.g. &#039;&#039;v2&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Congratulations on releasing the mod!&lt;br /&gt;
&lt;br /&gt;
=== Sharing on Discord ===&lt;br /&gt;
Consider posting an ad on the official {{EcoDiscord}}. There&#039;s a channel for mods called &#039;&#039;mod-ads&#039;&#039;. &lt;br /&gt;
Please read the rules before posting.&lt;br /&gt;
&lt;br /&gt;
== Helpful Resources ==&lt;br /&gt;
&lt;br /&gt;
* Consider learning source control (Git). Completely optional, but can help you keep things organized as development continues.&lt;br /&gt;
* Explore Eco’s open-source mod projects for ideas (search on Github &amp;quot;Eco Mods&amp;quot; to find some real-life examples)&lt;br /&gt;
** {{EcoDiscord}}has a channel for mod developers to help one another called &#039;&#039;mod-dev.&#039;&#039; &#039;&#039;&#039;Note:&#039;&#039;&#039; Make under the &#039;&#039;Channel &amp;amp; Roles&#039;&#039; settings you have the 🛠&#039;&#039;Yes, I want to see the channels about modding&#039;&#039; role selected.&lt;/div&gt;</summary>
		<author><name>WugWugg</name></author>
	</entry>
	<entry>
		<id>https://wiki.play.eco/en/index.php?title=Getting_Started_with_Eco_Modding_in_Visual_Studio&amp;diff=16746</id>
		<title>Getting Started with Eco Modding in Visual Studio</title>
		<link rel="alternate" type="text/html" href="https://wiki.play.eco/en/index.php?title=Getting_Started_with_Eco_Modding_in_Visual_Studio&amp;diff=16746"/>
		<updated>2026-04-29T13:08:37Z</updated>

		<summary type="html">&lt;p&gt;WugWugg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction =&lt;br /&gt;
This guide focuses on setting up a C# modding environment in Visual Studio.&lt;br /&gt;
&lt;br /&gt;
It does &#039;&#039;&#039;not&#039;&#039;&#039; cover adding Unity assets (models, prefabs, UI) to the game. See: [[From 3D Asset to Working Worktable]] for that workflow.&lt;br /&gt;
&lt;br /&gt;
This guide won’t teach you how to code or write a mod, but it will help you get everything set up so you’re ready to start learning. Helpful resources are listed at the bottom of this guide, including [[Helpful Examples for Modding]] for practical code examples.&lt;br /&gt;
&lt;br /&gt;
Visual Studio 2026 has a completely free to use version called the &#039;&#039;&#039;Community Edition&#039;&#039;&#039;. This guide is written assuming that&#039;s the version used.&lt;br /&gt;
&lt;br /&gt;
=== Have Ready ===&lt;br /&gt;
* A copy of the Eco game installed&lt;br /&gt;
* A file explorer and the file-path to &amp;lt;code&amp;gt;Eco&amp;lt;/code&amp;gt; folder&amp;lt;br&amp;gt;&#039;&#039;&#039;Tip:&#039;&#039;&#039; Within this folder there&#039;s folders like &amp;lt;code&amp;gt;D3D12&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Eco_Data&amp;lt;/code&amp;gt;. Also, you&#039;ll find the &amp;lt;code&amp;gt;Eco.exe&amp;lt;/code&amp;gt; file here. There are other files and folder here too, but this list is just to help you know what the folder looks like.&lt;br /&gt;
* &#039;&#039;&#039;Tip:&#039;&#039;&#039; Steam users can find the install folder by right-clicking on the game in your Steam Library:&amp;lt;br&amp;gt;[[File:Steam Library -- Browse Local Files.png|alt=Shows a Steam Library with a menu open over the Eco game. Highlighted in that menu is a &amp;quot;Manage&amp;quot; option, opening a sub-menu. The sub-menu has &amp;quot;Browse local files&amp;quot; highlighted.|frameless|border|upright=3|location=center|link=]]&lt;br /&gt;
&lt;br /&gt;
= Installing Visual Studio =&lt;br /&gt;
# Go to &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://visualstudio.microsoft.com/downloads/#visual-studio-community-2026&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; and look for the &amp;quot;&#039;&#039;&#039;Visual Studio Community 2026&#039;&#039;&#039;&amp;quot; download.&lt;br /&gt;
# Start the download by clicking on the &#039;&#039;Download&#039;&#039; button.&lt;br /&gt;
# Run the installer until it reaches to the Workloads page.&lt;br /&gt;
# Select these workloads...&lt;br /&gt;
## .NET desktop development -- &#039;&#039;&#039;Required&#039;&#039;&#039; for any mod development&lt;br /&gt;
## ASP.NET and web development -- Optional. If you want to interact with external websites or Eco&#039;s own web server (e.g. Discord&#039;s webhooks or extending the API)&lt;br /&gt;
# With those workloads selected the page should look something like this:&amp;lt;br&amp;gt;[[File:VisualStudioCommunity2022 Workloads.png|alt=Workloads screen during VS2022 installation. Options selected are &amp;quot;ASP.NET and web development&amp;quot; and &amp;quot;.NET desktop development&amp;quot;. |frameless|location=center|upright=4|link=|border]]&lt;br /&gt;
# Click the Install button. It will take a few minutes to complete installation.&lt;br /&gt;
# Open Visual Studio after it installs.&lt;br /&gt;
# You may be prompted to sign in:&lt;br /&gt;
## Click &#039;&#039;Skip and add accounts later&#039;&#039; to continue.&lt;br /&gt;
## If you plan to use Github, sign in to make version control easier.&lt;br /&gt;
# Finally, it might ask what color theme you&#039;d like. Select your preference and continue.&lt;br /&gt;
# Visual Studio is now installed and ready to be used.&lt;br /&gt;
&lt;br /&gt;
= The Mod =&lt;br /&gt;
Once Eco and Visual Studio are installed all of the tools needed to code, build, and run a mod are ready.&lt;br /&gt;
&lt;br /&gt;
=== Creating a New Project ===&lt;br /&gt;
&lt;br /&gt;
# Open Visual Studio. When it first opens it will show you a dashboard where you can quickly select what you want to do.&lt;br /&gt;
# On the right, under &#039;&#039;Get Started&#039;&#039; find the &#039;&#039;Create a new project&#039;&#039; button:&amp;lt;br&amp;gt;[[File:VS2022 OpeningDashboard.png|alt=VS2022&#039;s launch dashboard showing recent projects on the left and quick action buttons on the right. Highlighted is a button titled &amp;quot;Create a new project&amp;quot;.|frameless|border|link=|location=center|upright=4]]&lt;br /&gt;
# A new window will pop-up.&lt;br /&gt;
# Select C# &#039;&#039;Class Library.&#039;&#039; To find the template, search &amp;lt;code&amp;gt;C# library&amp;lt;/code&amp;gt; in the search bar. Select the C# option titled &#039;&#039;Class Library&#039;&#039;.&amp;lt;br&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; &amp;lt;u&amp;gt;Make sure you select the &amp;lt;code&amp;gt;C#&amp;lt;/code&amp;gt; option as there are other options similarly named &#039;&#039;Class Library&#039;&#039;.&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt;[[File:VS2022 NewProjectWizard Templates.png|frameless|border|location=center|upright=4|link=]]&lt;br /&gt;
# Click the &#039;&#039;Next&#039;&#039; button.&lt;br /&gt;
# For &#039;&#039;Project Name&#039;&#039; type the name of the mod being created.&lt;br /&gt;
# The other options like the &#039;&#039;Location&#039;&#039; and the &#039;&#039;Solution Name&#039;&#039; do not need edited.&lt;br /&gt;
# Leave the box &#039;&#039;Place solution and project in the same directory&#039;&#039; unchecked.&lt;br /&gt;
# Click the Next button.&lt;br /&gt;
# In the &#039;&#039;Framework&#039;&#039; drop-down select the same version of .NET Eco uses (as described below). &#039;&#039;&#039;Tip:&#039;&#039;&#039; Eco currently targets &#039;&#039;.NET 10.0&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== .NET Version ===&lt;br /&gt;
To confirm the version of .NET that Eco uses:&lt;br /&gt;
&lt;br /&gt;
# Go to the NuGet Gallery &amp;lt;code&amp;gt;www.nuget.org/packages?q=Eco.ReferenceAssemblies&amp;lt;/code&amp;gt;&amp;lt;!-- I&#039;m not directly linking to the package as there is no way to link to the latest version. So as a workaround I&#039;m using the search to point the reader to the latest version. --&amp;gt;&lt;br /&gt;
# Find the package with the name &#039;&#039;Eco.ReferenceAssemblies&#039;&#039; made by &#039;&#039;StrangeLoopGames&#039;&#039;.&lt;br /&gt;
# Notice the chip underneath of it with the &#039;&#039;.NET&#039;&#039; version it targets.&amp;lt;br&amp;gt;[[File:NuGetGallery -- Eco.ReferenceAssemblies Search.png|alt=Shows the search result of Eco.ReferenceAssemblies. In a blue chip the text &amp;quot;.NET 8.0&amp;quot; can be seen.|frameless|upright=4|location=center|link=|border]]&lt;br /&gt;
# Click on that search result (shown above).&lt;br /&gt;
# A more detailed page is shown. Again, there&#039;s chips showing what version of .NET to use:&amp;lt;br&amp;gt;[[File:NuGetGallery--Eco.ReferenceAssemblies Details.png|alt=Show the package page for &amp;quot;Eco.ReferenceAssemblies&amp;quot; on NuGet Gallery. Circled in red are two chips with some version of the text &amp;quot;.NET 8.0&amp;quot; inside them.|frameless|link=|border|location=center|upright=3]]&lt;br /&gt;
=== Linking to Eco Assemblies ===&lt;br /&gt;
&lt;br /&gt;
# Find the &#039;&#039;Solution Explorer&#039;&#039; on the right side of Visual Studio. It should look something like this:&amp;lt;br&amp;gt;&#039;&#039;&#039;Note&#039;&#039;&#039;: If the solution explorer isn&#039;t there, open the &#039;&#039;View&#039;&#039; menu (top toolbar) and select &#039;&#039;Solution Explorer&#039;&#039;.&amp;lt;br&amp;gt;[[File:VS2022 -- Solution Explorer.png|alt=A picture of a basic layout in Visual Studio 2022 with the Solution Explorer open on the right-hand side. The solution explorer is circled in red.|frameless|link=|upright=4|location=center|border]]&lt;br /&gt;
# In the &#039;&#039;Solution Explorer&#039;&#039;, find and right-click on the &#039;&#039;Dependencies&#039;&#039; item.&lt;br /&gt;
# Select &#039;&#039;Manage NuGet Packages...&#039;&#039;&amp;lt;br&amp;gt;[[File:VS2022 Solution Explorer -- Manage NuGet Packages.png|alt=Shows VS2022&#039;s Solution Explorer with project expanded. The References line is highlighted and a menu is open. On that menu the &amp;quot;Manage NuGet Packages&amp;quot; line is highlighted.|frameless|link=|upright=4|location=center|border]]&lt;br /&gt;
# A &#039;&#039;NuGet&#039;&#039; tab will have opened in the editor window...&lt;br /&gt;
## Right above the search bar on this tab there&#039;s sub-tabs.&lt;br /&gt;
## Select the &#039;&#039;Browse&#039;&#039; sub-tab.&lt;br /&gt;
## Type &amp;lt;code&amp;gt;Eco.ReferenceAssemblies&amp;lt;/code&amp;gt; into the search bar.&lt;br /&gt;
## Check the &#039;&#039;Include prerelease&#039;&#039; check-box.&lt;br /&gt;
## Find the option with the name &#039;&#039;Eco.ReferenceAssemblies&#039;&#039; made by &#039;&#039;StrangeLoopGames&#039;&#039;.&lt;br /&gt;
## Click on that.&lt;br /&gt;
## A details panel will show up to the right. It will show the version of the reference assemblies being targeted. By default it chooses the latest and can be left at its default.&lt;br /&gt;
## Click the Install button.&lt;br /&gt;
## Click the &#039;&#039;Apply&#039;&#039; button on the popup to finish adding the references.&amp;lt;br&amp;gt;[[File:VS2022 -- NuGet Install Eco.ReferenceAssemblies.png|alt=VS2022 is open to the NuGet tab and is searching with the text Eco.ReferenceAssemblies. The checkbox to the right of the search is checked -- include prerelease. The only search result is selected. There is yellow highlights over part of the photo.|frameless|link=|upright=4|location=center|border]]&lt;br /&gt;
# Now reference assemblies have now been added. That means when coding Visual Studio will provide IntelliSense popups. &lt;br /&gt;
# Try it out by going back to the &amp;lt;code&amp;gt;Class1.cs&amp;lt;/code&amp;gt; file and typing &amp;lt;code&amp;gt;Eco.&amp;lt;/code&amp;gt; and you will see suggestion pop up.&lt;br /&gt;
=== Building The Dynamic Link Library (DLL) ===&lt;br /&gt;
&lt;br /&gt;
==== Building for Development ====&lt;br /&gt;
Building the mod creates the &amp;lt;code&amp;gt;.dll&amp;lt;/code&amp;gt; file that can be used to test with.&lt;br /&gt;
&lt;br /&gt;
To build, open the &#039;&#039;Build&#039;&#039; menu from the top of VS2022.&lt;br /&gt;
&lt;br /&gt;
Select &#039;&#039;Build Solution&#039;&#039;. This will produce non-optimized DLL used for testing and development.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Build Menu.png|alt=VS2022 top menu &amp;quot;Build&amp;quot; is open with &amp;quot;build solution&amp;quot; highlighted (ctrl + shift + b).|frameless|link=|upright=4|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
To find the file VS2022 just built, right click on the project in the Solution Explorer. &lt;br /&gt;
&lt;br /&gt;
Select &#039;&#039;Open Folder in File Explorer.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Project Menu.png|alt=VS2022&#039;s solution explorer is shown with the projects right-click menu open. Highlighted is &amp;quot;Open folder in File Explorer&amp;quot;|frameless|link=|upright=4|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
From here, the mod&#039;s DLL will be in the &amp;lt;code&amp;gt;bin/Debug/net8.0/&amp;lt;/code&amp;gt; folder. The file will be named with mod&#039;s name, like &amp;lt;code&amp;gt;TheMod.dll&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Copy the mod&#039;s DLL file.&lt;br /&gt;
&lt;br /&gt;
Paste it into the folder &amp;lt;code&amp;gt;Eco/Eco_Data/Server/Mods/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
To run a game with that mod &#039;&#039;&#039;create a local world&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
The mod should be running. Check the logs at &amp;lt;code&amp;gt;Eco/Eco_Data/Server/Logs/&amp;lt;/code&amp;gt; to verify. Open the &amp;lt;u&amp;gt;most recent&amp;lt;/u&amp;gt; log file here.&lt;br /&gt;
&lt;br /&gt;
If the mod was loaded it there will be a line mentioning the file-name of the DLL. If the DLL was named &amp;lt;code&amp;gt;TheMod.dll&amp;lt;/code&amp;gt; this is what to look for in the log file:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;[13:55:54.815] [4] [ Info] [Eco] Starting ModKitPlugin                             ...  &lt;br /&gt;
[13:56:27.399] [4] [ Info] [Eco] Starting ModKitPlugin                             ... Finished in 32.584 sec&lt;br /&gt;
 &lt;br /&gt;
[13:56:27.439] [4] [ Info] [Eco] Loading mods                                      ...  &lt;br /&gt;
[13:56:27.439] [9] [ Info] [Eco] Loading TheMod...&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Tip: Setup File Explorer to Sort By Date =====&lt;br /&gt;
It&#039;s suggested to setup the file view to &#039;&#039;Details&#039;&#039; in this folder because it will show the &#039;&#039;Date Modified&#039;&#039; for each file.&lt;br /&gt;
&lt;br /&gt;
[[File:File Explorer -- View Settings Menu.png|alt=Show Window&#039;s File Explorer&#039;s view setting menu with the &amp;quot;details&amp;quot; option highlighted.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
Additionally, clicking on the &#039;&#039;Date Modified&#039;&#039; header sorts all files. Sort it so the most recent is on top and every time the server starts the log file is easily found -- it&#039;s the one on top!&lt;br /&gt;
&lt;br /&gt;
[[File:File Explorer -- Details Example.png|alt=Show&#039;s window&#039;s File Explorer with the date modified header highlighted.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
==== Building for Release ====&lt;br /&gt;
To build for release, click on the mod&#039;s project in the Solution Explorer to highlight it.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Solution Explorer Project Highlight.png|alt=Shows VS2022&#039;s solution explorer with the project highlighted.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
Then, open the &#039;&#039;Build&#039;&#039; menu from the top of VS2022 and select &#039;&#039;Publish Selection&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Set the target &#039;&#039;as Folder&#039;&#039;. Click the &#039;&#039;Next&#039;&#039; button.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Publish Wizard.png|alt=VS2022&#039;s publish wizard showing the target selection screen. The Folder option is highlighted.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
Leave the folder location as default. Click the &#039;&#039;Finish&#039;&#039; button.&lt;br /&gt;
&lt;br /&gt;
Click the &#039;&#039;Close&#039;&#039; button.&lt;br /&gt;
&lt;br /&gt;
Finally, click the &#039;&#039;Publish&#039;&#039; button to start the build.&lt;br /&gt;
&lt;br /&gt;
A green alert will pop up when the build is completed:&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Publish Screen.png|alt=Show&#039;s VS2022 publish screen. There&#039;s publish button at the top of this screen.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Either use the blue links on this page to find the file or browse the project&#039;s files as shown in &amp;quot;Building for Development&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Inside the project, the file will be in &amp;lt;code&amp;gt;bin/Release/net8.0/publish&amp;lt;/code&amp;gt;. The file will be named with the mod project&#039;s name. For example, &amp;lt;code&amp;gt;TheMod.dll&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Since the reference assemblies are already included in the game, do not worry about the other files here.  &lt;br /&gt;
&lt;br /&gt;
To share this mod, the only file needed is the mod&#039;s dll -- &amp;lt;code&amp;gt;TheMod.dll&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Post-Build Scripts: Automatic Copy ===&lt;br /&gt;
With a post-build script VS2022 will automatically copy the files each build. It&#039;s a very nice feature to have when developing and rebuilding every 5 minutes to test something new.&lt;br /&gt;
&lt;br /&gt;
First, add the variables about where &amp;lt;code&amp;gt;EcoServer.exe&amp;lt;/code&amp;gt; is located to the project file.&lt;br /&gt;
&lt;br /&gt;
Right-click on the project in the Solution Explorer and select the &#039;&#039;Edit Project File&#039;&#039; option.&lt;br /&gt;
&lt;br /&gt;
Add the properties &amp;lt;code&amp;gt;EcoServerExe&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;EcoServerDir&amp;lt;/code&amp;gt; &amp;lt;u&amp;gt;inside of the &amp;lt;code&amp;gt;PropertyGroup&amp;lt;/code&amp;gt; tag.&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; Tip: By holding shift and right-clicking on a file in the file explorer an old-school menu pops up. Midway down this menu is an option to &#039;&#039;Copy As Path&#039;&#039;. Neat!&lt;br /&gt;
&lt;br /&gt;
The project file should look something like this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;Project Sdk=&amp;quot;Microsoft.NET.Sdk&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;PropertyGroup&amp;gt;&lt;br /&gt;
    &amp;lt;TargetFramework&amp;gt;net8.0&amp;lt;/TargetFramework&amp;gt;&lt;br /&gt;
    &amp;lt;ImplicitUsings&amp;gt;enable&amp;lt;/ImplicitUsings&amp;gt;&lt;br /&gt;
    &amp;lt;Nullable&amp;gt;enable&amp;lt;/Nullable&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;EcoServerExe&amp;gt;$(EcoServerDir)\EcoServer.exe&amp;lt;/EcoServerExe&amp;gt;&lt;br /&gt;
    &amp;lt;EcoServerDir&amp;gt;C:\Program Files (x86)\Steam\steamapps\common\Eco\Eco_Data\Server&amp;lt;/EcoServerDir&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
  &amp;lt;/PropertyGroup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;ItemGroup&amp;gt;&lt;br /&gt;
    &amp;lt;PackageReference Include=&amp;quot;Eco.ReferenceAssemblies&amp;quot; Version=&amp;quot;0.11.1.13-beta-release-887&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/ItemGroup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/Project&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Next, add the &amp;lt;code&amp;gt;PostBuild&amp;lt;/code&amp;gt; property inside the &amp;lt;code&amp;gt;Project&amp;lt;/code&amp;gt; tag.&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Project Sdk=&amp;quot;Microsoft.NET.Sdk&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;PropertyGroup&amp;gt;&lt;br /&gt;
    ... SNIP ...&lt;br /&gt;
  &amp;lt;/PropertyGroup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;ItemGroup&amp;gt;&lt;br /&gt;
    ... SNIP ...&lt;br /&gt;
  &amp;lt;/ItemGroup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;Target Name=&amp;quot;PostBuild&amp;quot; AfterTargets=&amp;quot;PostBuildEvent&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;Exec Command=&#039;call PostBuild.bat &amp;quot;$(EcoServerDir)&amp;quot; &amp;quot;$(OutDir)&amp;quot; &amp;quot;$(MSBuildProjectName)&amp;quot;&#039;/&amp;gt;&lt;br /&gt;
  &amp;lt;/Target&amp;gt;&lt;br /&gt;
&amp;lt;/Project&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Finally create a new file directly inside the project by right-clicking on the project in the Solution Explorer. Select the &#039;&#039;Add&#039;&#039; and click on &#039;&#039;New Item...&#039;&#039; from the sub-menu.&lt;br /&gt;
&lt;br /&gt;
Use the name &amp;lt;code&amp;gt;PostBuild.bat&amp;lt;/code&amp;gt; for this new file.&lt;br /&gt;
&lt;br /&gt;
Open it and put the following in the PostBuild file:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;batch&amp;quot;&amp;gt;REM reading in arguements to sensible variables&lt;br /&gt;
set serverDir=%1&lt;br /&gt;
set outDir=%2&lt;br /&gt;
set projName=%3&lt;br /&gt;
&lt;br /&gt;
REM removing double-quotes added to variables for concatenation&lt;br /&gt;
set serverDir=%serverDir:&amp;quot;=%&lt;br /&gt;
set outDir=%outDir:&amp;quot;=%&lt;br /&gt;
set projName=%projName:&amp;quot;=%&lt;br /&gt;
&lt;br /&gt;
REM Copy mod dll to Mods dir&lt;br /&gt;
set dllFile=%outDir%%projName%.dll&lt;br /&gt;
echo Copying mod dll file: %dllFile%&lt;br /&gt;
copy &amp;quot;%dllFile%&amp;quot; &amp;quot;%serverDir%\Mods&amp;quot;&lt;br /&gt;
&lt;br /&gt;
REM Copy mod pdb to directory where EcoServer.exe is&lt;br /&gt;
set pdbFile=%outDir%%projName%.pdb&lt;br /&gt;
echo Copying mod pdb file: %pdbFile%&lt;br /&gt;
copy &amp;quot;%pdbFile%&amp;quot; &amp;quot;%serverDir%&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;Now try running a rebuild of the project. The output should report copying files and inside the &amp;lt;code&amp;gt;Eco/Eco_Data/Server/Mods&amp;lt;/code&amp;gt; folder should be &amp;lt;code&amp;gt;TheMod.dll&amp;lt;/code&amp;gt; file&lt;br /&gt;
&lt;br /&gt;
=== Setting up Debugging ===&lt;br /&gt;
&#039;&#039;&#039;Special thanks to Monzun#0606 on Eco&#039;s Discord for helping research the following information.&#039;&#039;&#039;&lt;br /&gt;
To setup debugging, &amp;lt;u&amp;gt;make sure that the project is setup with the post-build script described above&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Debugging is a &amp;lt;u&amp;gt;powerful&amp;lt;/u&amp;gt; tool to a developer and allows the developer to set breakpoints anywhere in the code to stop execution. When execution is stopped the developer can review every variable&#039;s value and incrementally continue the code. This is invaluable when tracking down bugs or trying to understand a complex piece of code.&lt;br /&gt;
&lt;br /&gt;
From the top menu, select &#039;&#039;Debug&#039;&#039; and click on the option &#039;&#039;TheMod Debug Properties&#039;&#039; at the bottom of the menu.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Debug Menu.png|alt=VS2022&#039;s debug menu is open from the top of the application. Highlighted is the last option &amp;quot;Debug Properties&amp;quot;.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
Find the &#039;&#039;Create a new profile&#039;&#039; button &#039;&#039;&#039;in the top-left&#039;&#039;&#039; of this new window. Select &#039;&#039;Executable&#039;&#039; from the drop-down menu.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Debugger Launch Profiles.png|alt=VS2022&#039;s launch profile window is open. Underlined and pointed to by a red mark is the &amp;quot;Create a new profile&amp;quot; button, located in the top-left of the window. Highlighted from the menu under it is the option reading &amp;quot;Executable&amp;quot;.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
Set the &#039;&#039;Executable&#039;&#039; field to the full path to the &amp;lt;code&amp;gt;EcoServer.exe&amp;lt;/code&amp;gt; file. For example, &amp;lt;code&amp;gt;C:\Program Files (x86)\Steam\steamapps\common\Eco\Eco_Data\Server&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;\EcoServer.exe&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Set the &#039;&#039;Working Directory&#039;&#039; field to the full path to the folder containing the &amp;lt;code&amp;gt;EcoServer.exe&amp;lt;/code&amp;gt; file. For example, &amp;lt;code&amp;gt;C:\Program Files (x86)\Steam\steamapps\common\Eco\Eco_Data\Server&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Eco Debugging Profile.png|alt=A fully configured profile ready to debug Eco on VS2022&#039;s launch profile page.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
To use this newly configured profile, switch to it by clicking the small arrow to the right of the play icon (see image).  Select the newly created profile -- &#039;&#039;Profile 1&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Debugger Profile Selection.png|alt=VS2022&#039;s debugger profile selection menu is open with the newly created &amp;quot;Profile 1&amp;quot; highlighted.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
To see how breakpoints work, put the following in &amp;lt;code&amp;gt;Class1.cs&amp;lt;/code&amp;gt; file:&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot;&amp;gt;&lt;br /&gt;
using Eco.Core.Plugins.Interfaces;&lt;br /&gt;
using Eco.Core.Utils;&lt;br /&gt;
using Eco.ModKit;&lt;br /&gt;
&lt;br /&gt;
namespace Test&lt;br /&gt;
{&lt;br /&gt;
    public class Class1 : IModKitPlugin, IInitializablePlugin&lt;br /&gt;
    {&lt;br /&gt;
        public string GetCategory() =&amp;gt; &amp;quot;Tutorial&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        public string GetStatus() =&amp;gt; this._status;&lt;br /&gt;
        string _status = string.Empty;&lt;br /&gt;
&lt;br /&gt;
        public void Initialize(TimedTask timer)&lt;br /&gt;
        {&lt;br /&gt;
            this._status = &amp;quot;Ok&amp;quot;;&lt;br /&gt;
            bool yes = true;&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;This code creates a basic plugin, called &amp;lt;code&amp;gt;Class1&amp;lt;/code&amp;gt;, that Eco will load and initialize on startup. Eco knows to do this because this class inherits the &amp;lt;code&amp;gt;IModKitPlugin&amp;lt;/code&amp;gt; interface (causes it to be loaded) and the &amp;lt;code&amp;gt;IInitializablePlugin&amp;lt;/code&amp;gt; interface (causes it to be initialized).&lt;br /&gt;
&lt;br /&gt;
Add a breakpoint to the code by right-clicking on the line &amp;lt;code&amp;gt;bool yes = true;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Adding a breakpoint.png|alt=A boilerplate example of a mod is shown in the VS2022 text editor. A line has a menu open above it with the option &amp;quot;Breakpoint&amp;quot; expanded and the option &amp;quot;Insert Breakpoint&amp;quot; highlighted on the sub-menu.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
Now hit the play button. The server will start and VS2022 will flash back on screen once Eco tries to initialize the mod&#039;s plugin.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Launch Debugger.png|alt=Highlighted is the play button for VS2022&#039;s debugger. The &amp;quot;Profile 1&amp;quot; is still selected from before.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After a little bit the server will start-up and hit the breakpoint set. When it does VS2022 will keep startup from continuing and allow detailed inspection to happen.&lt;br /&gt;
&lt;br /&gt;
In the bottom left (circled in red) is a table of all of the variables within scope. Use this to see what is happening (especially useful in loops!).&lt;br /&gt;
&lt;br /&gt;
At the middle-top (circled in red) are some of the debugger controls. Clicking the highlighted &#039;&#039;Continue&#039;&#039; button resumes normal operation. Using the buttons to the right that are highlighted will allow the developer to step through the codes execution to see exactly how each line is performing. Debugging is a deep and rich topic that this guide will not explain further, but there&#039;s a great video by Microsoft Visual Studio on YouTube called Basics of Debugging. In that 45 minute video (don&#039;t worry there&#039;s annotations to jump to just what is interesting) a whole gamut of information about how to use debugging is covered.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Debugger LIve.png|alt=Shows a simple plugin&#039;s code in the editor of VS2022. In the bottom-left is a table of all variables used in the function. It is circled in red. On the top of the image also circled in red is the debugger controls. Highlighted within is the continue button and the &amp;quot;step over&amp;quot; button.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
== Releasing a Mod ==&lt;br /&gt;
&lt;br /&gt;
=== Mod.io ===&lt;br /&gt;
&amp;lt;code&amp;gt;mod.io&amp;lt;/code&amp;gt; is where creators share their mods with players and others.&lt;br /&gt;
&lt;br /&gt;
To share a new mod here all that is necessary is an account.&lt;br /&gt;
&lt;br /&gt;
Head over to &amp;lt;code&amp;gt;mod.io/g/eco&amp;lt;/code&amp;gt; and click &#039;&#039;Login&#039;&#039; in the top-right corner. &lt;br /&gt;
&lt;br /&gt;
Finish signing-up with whatever account type you prefer.&lt;br /&gt;
&lt;br /&gt;
Click the &#039;&#039;Add Mod&#039;&#039; button in the top-right.&lt;br /&gt;
&lt;br /&gt;
Follow the upload wizard as directed.&lt;br /&gt;
&lt;br /&gt;
Once on the &#039;&#039;File Manager&#039;&#039; section, a zip file is needed.&lt;br /&gt;
&lt;br /&gt;
Zip the mod&#039;s &amp;lt;u&amp;gt;release&amp;lt;/u&amp;gt; dll and any other assets necessary (e.g. Unity bundles) by putting all the files into a folder. Then right-click on that folder and select &#039;&#039;Compress To...&#039;&#039; and from the sub-menu select &#039;&#039;ZIP file&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Upload that zip file. Considering naming it with a version number to help stay organized (e.g. &#039;&#039;v1&#039;&#039;). Next release, increase that number by 1 (e.g. &#039;&#039;v2&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Congratulations on releasing the mod!&lt;br /&gt;
&lt;br /&gt;
=== Sharing on Discord ===&lt;br /&gt;
Consider posting an ad on the official {{EcoDiscord}}. There&#039;s a channel for mods called &#039;&#039;mod-ads&#039;&#039;. &lt;br /&gt;
Please read the rules before posting.&lt;br /&gt;
&lt;br /&gt;
== Helpful Resources ==&lt;br /&gt;
&lt;br /&gt;
* Consider learning source control (Git). Completely optional, but can help you keep things organized as development continues.&lt;br /&gt;
* Explore Eco’s open-source mod projects for ideas (search on Github &amp;quot;Eco Mods&amp;quot; to find some real-life examples)&lt;br /&gt;
** {{EcoDiscord}}has a channel for mod developers to help one another called &#039;&#039;mod-dev.&#039;&#039; &#039;&#039;&#039;Note:&#039;&#039;&#039; Make under the &#039;&#039;Channel &amp;amp; Roles&#039;&#039; settings you have the 🛠&#039;&#039;Yes, I want to see the channels about modding&#039;&#039; role selected.&lt;/div&gt;</summary>
		<author><name>WugWugg</name></author>
	</entry>
	<entry>
		<id>https://wiki.play.eco/en/index.php?title=Getting_Started_with_Eco_Modding_in_Visual_Studio&amp;diff=16745</id>
		<title>Getting Started with Eco Modding in Visual Studio</title>
		<link rel="alternate" type="text/html" href="https://wiki.play.eco/en/index.php?title=Getting_Started_with_Eco_Modding_in_Visual_Studio&amp;diff=16745"/>
		<updated>2026-04-29T12:59:51Z</updated>

		<summary type="html">&lt;p&gt;WugWugg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
This guide focuses on setting up a C# modding environment in Visual Studio.&lt;br /&gt;
&lt;br /&gt;
It does &#039;&#039;&#039;not&#039;&#039;&#039; cover adding Unity assets (models, prefabs, UI) to the game. See: [[From 3D Asset to Working Worktable]] for that workflow.&lt;br /&gt;
&lt;br /&gt;
This guide won’t teach you how to code or write a mod, but it will help you get everything set up so you’re ready to start learning. Helpful resources are listed at the bottom of this guide, including [[Helpful Examples for Modding]] for practical code examples.&lt;br /&gt;
&lt;br /&gt;
Visual Studio 2026 has a completely free to use version called the &#039;&#039;&#039;Community Edition&#039;&#039;&#039;. This guide is written assuming that&#039;s the version used.&lt;br /&gt;
&lt;br /&gt;
=== Have Ready ===&lt;br /&gt;
* A copy of the Eco game installed&lt;br /&gt;
* A file explorer and the file-path to &amp;lt;code&amp;gt;Eco&amp;lt;/code&amp;gt; folder&amp;lt;br&amp;gt;&#039;&#039;&#039;Tip:&#039;&#039;&#039; Within this folder there&#039;s folders like &amp;lt;code&amp;gt;D3D12&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Eco_Data&amp;lt;/code&amp;gt;. Also, you&#039;ll find the &amp;lt;code&amp;gt;Eco.exe&amp;lt;/code&amp;gt; file here. There are other files and folder here too, but this list is just to help you know what the folder looks like.&lt;br /&gt;
&lt;br /&gt;
==== Tip: Find Folder with Steam ====&lt;br /&gt;
Steam users can find the install folder by right-clicking on the game in your Steam Library:&lt;br /&gt;
&lt;br /&gt;
[[File:Steam Library -- Browse Local Files.png|alt=Shows a Steam Library with a menu open over the Eco game. Highlighted in that menu is a &amp;quot;Manage&amp;quot; option, opening a sub-menu. The sub-menu has &amp;quot;Browse local files&amp;quot; highlighted.|frameless|border|upright=3|location=center|link=]]&lt;br /&gt;
&lt;br /&gt;
== Installing Visual Studio ==&lt;br /&gt;
 &lt;br /&gt;
# Go to &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://visualstudio.microsoft.com/downloads/#visual-studio-community-2026&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; and look for the &amp;quot;&#039;&#039;&#039;Visual Studio Community 2026&#039;&#039;&#039;&amp;quot; download.&lt;br /&gt;
# Start the download by clicking on the &#039;&#039;Download&#039;&#039; button.&lt;br /&gt;
# Run the installer until it reaches to the Workloads page.&lt;br /&gt;
# Select these workloads...&lt;br /&gt;
## .NET desktop development -- &#039;&#039;&#039;Required&#039;&#039;&#039; for any mod development&lt;br /&gt;
## ASP.NET and web development -- Optional. If you want to interact with external websites or Eco&#039;s own web server (e.g. Discord&#039;s webhooks or extending the API)&lt;br /&gt;
# With those workloads selected the page should look something like this:&amp;lt;br&amp;gt;[[File:VisualStudioCommunity2022 Workloads.png|alt=Workloads screen during VS2022 installation. Options selected are &amp;quot;ASP.NET and web development&amp;quot; and &amp;quot;.NET desktop development&amp;quot;. |frameless|location=center|upright=4|link=|border]]&lt;br /&gt;
# Click the Install button. It will take a few minutes to complete installation.&lt;br /&gt;
# Open Visual Studio after it installs.&lt;br /&gt;
# You may be prompted to sign in:&lt;br /&gt;
## Click &#039;&#039;Skip and add accounts later&#039;&#039; to continue.&lt;br /&gt;
## If you plan to use Github, sign in to make version control easier.&lt;br /&gt;
# Finally, it might ask what color theme you&#039;d like. Select your preference and continue.&lt;br /&gt;
# Visual Studio is now installed and ready to be used.&lt;br /&gt;
&lt;br /&gt;
== The Mod ==&lt;br /&gt;
&lt;br /&gt;
Once Eco and Visual Studio are installed all of the tools needed to code, build, and run a mod are ready.&lt;br /&gt;
&lt;br /&gt;
=== Creating a New Project ===&lt;br /&gt;
&lt;br /&gt;
# Open Visual Studio. When it first opens it will show you a dashboard where you can quickly select what you want to do.&lt;br /&gt;
# On the right, under &#039;&#039;Get Started&#039;&#039; find the &#039;&#039;Create a new project&#039;&#039; button:&amp;lt;br&amp;gt;[[File:VS2022 OpeningDashboard.png|alt=VS2022&#039;s launch dashboard showing recent projects on the left and quick action buttons on the right. Highlighted is a button titled &amp;quot;Create a new project&amp;quot;.|frameless|border|link=|location=center|upright=4]]&lt;br /&gt;
# A new window will pop-up.&lt;br /&gt;
# Select C# &#039;&#039;Class Library.&#039;&#039; To find the template, search &amp;lt;code&amp;gt;C# library&amp;lt;/code&amp;gt; in the search bar. Select the C# option titled &#039;&#039;Class Library&#039;&#039;.&amp;lt;br&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; &amp;lt;u&amp;gt;Make sure you select the &amp;lt;code&amp;gt;C#&amp;lt;/code&amp;gt; option as there are other options similarly named &#039;&#039;Class Library&#039;&#039;.&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt;[[File:VS2022 NewProjectWizard Templates.png|frameless|border|location=center|upright=4|link=]]&lt;br /&gt;
# Click the &#039;&#039;Next&#039;&#039; button.&lt;br /&gt;
# For &#039;&#039;Project Name&#039;&#039; type the name of the mod being created.&lt;br /&gt;
# The other options like the &#039;&#039;Location&#039;&#039; and the &#039;&#039;Solution Name&#039;&#039; do not need edited.&lt;br /&gt;
# Leave the box &#039;&#039;Place solution and project in the same directory&#039;&#039; unchecked.&lt;br /&gt;
# Click the Next button.&lt;br /&gt;
# In the &#039;&#039;Framework&#039;&#039; drop-down select the same version of .NET Eco uses (as described below). &#039;&#039;&#039;Tip:&#039;&#039;&#039; Eco currently targets &#039;&#039;.NET 10.0&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== .NET Version ===&lt;br /&gt;
To confirm the version of .NET that Eco uses:&lt;br /&gt;
&lt;br /&gt;
# Go to the NuGet Gallery &amp;lt;code&amp;gt;www.nuget.org/packages?q=Eco.ReferenceAssemblies&amp;lt;/code&amp;gt;&amp;lt;!-- I&#039;m not directly linking to the package as there is no way to link to the latest version. So as a workaround I&#039;m using the search to point the reader to the latest version. --&amp;gt;&lt;br /&gt;
# Find the package with the name &#039;&#039;Eco.ReferenceAssemblies&#039;&#039; made by &#039;&#039;StrangeLoopGames&#039;&#039;.&lt;br /&gt;
# Notice the chip underneath of it with the &#039;&#039;.NET&#039;&#039; version it targets.&amp;lt;br&amp;gt;[[File:NuGetGallery -- Eco.ReferenceAssemblies Search.png|alt=Shows the search result of Eco.ReferenceAssemblies. In a blue chip the text &amp;quot;.NET 8.0&amp;quot; can be seen.|frameless|upright=4|location=center|link=|border]]&lt;br /&gt;
# Click on that search result (shown above).&lt;br /&gt;
# A more detailed page is shown. Again, there&#039;s chips showing what version of .NET to use:&amp;lt;br&amp;gt;[[File:NuGetGallery--Eco.ReferenceAssemblies Details.png|alt=Show the package page for &amp;quot;Eco.ReferenceAssemblies&amp;quot; on NuGet Gallery. Circled in red are two chips with some version of the text &amp;quot;.NET 8.0&amp;quot; inside them.|frameless|link=|border|location=center|upright=3]]&lt;br /&gt;
=== Linking to Eco Assemblies ===&lt;br /&gt;
&lt;br /&gt;
# Find the &#039;&#039;Solution Explorer&#039;&#039; on the right side of Visual Studio. It should look something like this:&amp;lt;br&amp;gt;&#039;&#039;&#039;Note&#039;&#039;&#039;: If the solution explorer isn&#039;t there, open the &#039;&#039;View&#039;&#039; menu (top toolbar) and select &#039;&#039;Solution Explorer&#039;&#039;.&amp;lt;br&amp;gt;[[File:VS2022 -- Solution Explorer.png|alt=A picture of a basic layout in Visual Studio 2022 with the Solution Explorer open on the right-hand side. The solution explorer is circled in red.|frameless|link=|upright=4|location=center|border]]&lt;br /&gt;
# In the &#039;&#039;Solution Explorer&#039;&#039;, find and right-click on the &#039;&#039;Dependencies&#039;&#039; item.&lt;br /&gt;
# Select &#039;&#039;Manage NuGet Packages...&#039;&#039;&amp;lt;br&amp;gt;[[File:VS2022 Solution Explorer -- Manage NuGet Packages.png|alt=Shows VS2022&#039;s Solution Explorer with project expanded. The References line is highlighted and a menu is open. On that menu the &amp;quot;Manage NuGet Packages&amp;quot; line is highlighted.|frameless|link=|upright=4|location=center|border]]&lt;br /&gt;
# A &#039;&#039;NuGet&#039;&#039; tab will have opened in the editor window...&lt;br /&gt;
## Right above the search bar on this tab there&#039;s sub-tabs.&lt;br /&gt;
## Select the &#039;&#039;Browse&#039;&#039; sub-tab.&lt;br /&gt;
## Type &amp;lt;code&amp;gt;Eco.ReferenceAssemblies&amp;lt;/code&amp;gt; into the search bar.&lt;br /&gt;
## Check the &#039;&#039;Include prerelease&#039;&#039; check-box.&lt;br /&gt;
## Find the option with the name &#039;&#039;Eco.ReferenceAssemblies&#039;&#039; made by &#039;&#039;StrangeLoopGames&#039;&#039;.&lt;br /&gt;
## Click on that.&lt;br /&gt;
## A details panel will show up to the right. It will show the version of the reference assemblies being targeted. By default it chooses the latest and can be left at its default.&lt;br /&gt;
## Click the Install button.&lt;br /&gt;
## Click the &#039;&#039;Apply&#039;&#039; button on the popup to finish adding the references.&amp;lt;br&amp;gt;[[File:VS2022 -- NuGet Install Eco.ReferenceAssemblies.png|alt=VS2022 is open to the NuGet tab and is searching with the text Eco.ReferenceAssemblies. The checkbox to the right of the search is checked -- include prerelease. The only search result is selected. There is yellow highlights over part of the photo.|frameless|link=|upright=4|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The reference assemblies have now been added! When coding VS2022 will provide IntelliSense popups. Try it out by going back to the &amp;lt;code&amp;gt;Class1.cs&amp;lt;/code&amp;gt; file and typing &amp;lt;code&amp;gt;Eco.&amp;lt;/code&amp;gt; and you will see suggestion pop up. It’s an essential tool for a lot of modders.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Intellisense.png|alt=Shows a text editor with a basic class file. Inside there&#039;s the text &amp;quot;Eco.&amp;quot; and a menu that show the suggested namespaces within.|frameless|link=|upright=4|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
=== Building The Dynamic Link Library (DLL) ===&lt;br /&gt;
&lt;br /&gt;
==== Building for Development ====&lt;br /&gt;
Building the mod creates the &amp;lt;code&amp;gt;.dll&amp;lt;/code&amp;gt; file that can be used to test with.&lt;br /&gt;
&lt;br /&gt;
To build, open the &#039;&#039;Build&#039;&#039; menu from the top of VS2022.&lt;br /&gt;
&lt;br /&gt;
Select &#039;&#039;Build Solution&#039;&#039;. This will produce non-optimized DLL used for testing and development.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Build Menu.png|alt=VS2022 top menu &amp;quot;Build&amp;quot; is open with &amp;quot;build solution&amp;quot; highlighted (ctrl + shift + b).|frameless|link=|upright=4|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
To find the file VS2022 just built, right click on the project in the Solution Explorer. &lt;br /&gt;
&lt;br /&gt;
Select &#039;&#039;Open Folder in File Explorer.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Project Menu.png|alt=VS2022&#039;s solution explorer is shown with the projects right-click menu open. Highlighted is &amp;quot;Open folder in File Explorer&amp;quot;|frameless|link=|upright=4|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
From here, the mod&#039;s DLL will be in the &amp;lt;code&amp;gt;bin/Debug/net8.0/&amp;lt;/code&amp;gt; folder. The file will be named with mod&#039;s name, like &amp;lt;code&amp;gt;TheMod.dll&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Copy the mod&#039;s DLL file.&lt;br /&gt;
&lt;br /&gt;
Paste it into the folder &amp;lt;code&amp;gt;Eco/Eco_Data/Server/Mods/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
To run a game with that mod &#039;&#039;&#039;create a local world&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
The mod should be running. Check the logs at &amp;lt;code&amp;gt;Eco/Eco_Data/Server/Logs/&amp;lt;/code&amp;gt; to verify. Open the &amp;lt;u&amp;gt;most recent&amp;lt;/u&amp;gt; log file here.&lt;br /&gt;
&lt;br /&gt;
If the mod was loaded it there will be a line mentioning the file-name of the DLL. If the DLL was named &amp;lt;code&amp;gt;TheMod.dll&amp;lt;/code&amp;gt; this is what to look for in the log file:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;[13:55:54.815] [4] [ Info] [Eco] Starting ModKitPlugin                             ...  &lt;br /&gt;
[13:56:27.399] [4] [ Info] [Eco] Starting ModKitPlugin                             ... Finished in 32.584 sec&lt;br /&gt;
 &lt;br /&gt;
[13:56:27.439] [4] [ Info] [Eco] Loading mods                                      ...  &lt;br /&gt;
[13:56:27.439] [9] [ Info] [Eco] Loading TheMod...&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Tip: Setup File Explorer to Sort By Date =====&lt;br /&gt;
It&#039;s suggested to setup the file view to &#039;&#039;Details&#039;&#039; in this folder because it will show the &#039;&#039;Date Modified&#039;&#039; for each file.&lt;br /&gt;
&lt;br /&gt;
[[File:File Explorer -- View Settings Menu.png|alt=Show Window&#039;s File Explorer&#039;s view setting menu with the &amp;quot;details&amp;quot; option highlighted.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
Additionally, clicking on the &#039;&#039;Date Modified&#039;&#039; header sorts all files. Sort it so the most recent is on top and every time the server starts the log file is easily found -- it&#039;s the one on top!&lt;br /&gt;
&lt;br /&gt;
[[File:File Explorer -- Details Example.png|alt=Show&#039;s window&#039;s File Explorer with the date modified header highlighted.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
==== Building for Release ====&lt;br /&gt;
To build for release, click on the mod&#039;s project in the Solution Explorer to highlight it.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Solution Explorer Project Highlight.png|alt=Shows VS2022&#039;s solution explorer with the project highlighted.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
Then, open the &#039;&#039;Build&#039;&#039; menu from the top of VS2022 and select &#039;&#039;Publish Selection&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Set the target &#039;&#039;as Folder&#039;&#039;. Click the &#039;&#039;Next&#039;&#039; button.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Publish Wizard.png|alt=VS2022&#039;s publish wizard showing the target selection screen. The Folder option is highlighted.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
Leave the folder location as default. Click the &#039;&#039;Finish&#039;&#039; button.&lt;br /&gt;
&lt;br /&gt;
Click the &#039;&#039;Close&#039;&#039; button.&lt;br /&gt;
&lt;br /&gt;
Finally, click the &#039;&#039;Publish&#039;&#039; button to start the build.&lt;br /&gt;
&lt;br /&gt;
A green alert will pop up when the build is completed:&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Publish Screen.png|alt=Show&#039;s VS2022 publish screen. There&#039;s publish button at the top of this screen.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Either use the blue links on this page to find the file or browse the project&#039;s files as shown in &amp;quot;Building for Development&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Inside the project, the file will be in &amp;lt;code&amp;gt;bin/Release/net8.0/publish&amp;lt;/code&amp;gt;. The file will be named with the mod project&#039;s name. For example, &amp;lt;code&amp;gt;TheMod.dll&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Since the reference assemblies are already included in the game, do not worry about the other files here.  &lt;br /&gt;
&lt;br /&gt;
To share this mod, the only file needed is the mod&#039;s dll -- &amp;lt;code&amp;gt;TheMod.dll&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Post-Build Scripts: Automatic Copy ===&lt;br /&gt;
With a post-build script VS2022 will automatically copy the files each build. It&#039;s a very nice feature to have when developing and rebuilding every 5 minutes to test something new.&lt;br /&gt;
&lt;br /&gt;
First, add the variables about where &amp;lt;code&amp;gt;EcoServer.exe&amp;lt;/code&amp;gt; is located to the project file.&lt;br /&gt;
&lt;br /&gt;
Right-click on the project in the Solution Explorer and select the &#039;&#039;Edit Project File&#039;&#039; option.&lt;br /&gt;
&lt;br /&gt;
Add the properties &amp;lt;code&amp;gt;EcoServerExe&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;EcoServerDir&amp;lt;/code&amp;gt; &amp;lt;u&amp;gt;inside of the &amp;lt;code&amp;gt;PropertyGroup&amp;lt;/code&amp;gt; tag.&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; Tip: By holding shift and right-clicking on a file in the file explorer an old-school menu pops up. Midway down this menu is an option to &#039;&#039;Copy As Path&#039;&#039;. Neat!&lt;br /&gt;
&lt;br /&gt;
The project file should look something like this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;Project Sdk=&amp;quot;Microsoft.NET.Sdk&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;PropertyGroup&amp;gt;&lt;br /&gt;
    &amp;lt;TargetFramework&amp;gt;net8.0&amp;lt;/TargetFramework&amp;gt;&lt;br /&gt;
    &amp;lt;ImplicitUsings&amp;gt;enable&amp;lt;/ImplicitUsings&amp;gt;&lt;br /&gt;
    &amp;lt;Nullable&amp;gt;enable&amp;lt;/Nullable&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;EcoServerExe&amp;gt;$(EcoServerDir)\EcoServer.exe&amp;lt;/EcoServerExe&amp;gt;&lt;br /&gt;
    &amp;lt;EcoServerDir&amp;gt;C:\Program Files (x86)\Steam\steamapps\common\Eco\Eco_Data\Server&amp;lt;/EcoServerDir&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
  &amp;lt;/PropertyGroup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;ItemGroup&amp;gt;&lt;br /&gt;
    &amp;lt;PackageReference Include=&amp;quot;Eco.ReferenceAssemblies&amp;quot; Version=&amp;quot;0.11.1.13-beta-release-887&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/ItemGroup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/Project&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Next, add the &amp;lt;code&amp;gt;PostBuild&amp;lt;/code&amp;gt; property inside the &amp;lt;code&amp;gt;Project&amp;lt;/code&amp;gt; tag.&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Project Sdk=&amp;quot;Microsoft.NET.Sdk&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;PropertyGroup&amp;gt;&lt;br /&gt;
    ... SNIP ...&lt;br /&gt;
  &amp;lt;/PropertyGroup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;ItemGroup&amp;gt;&lt;br /&gt;
    ... SNIP ...&lt;br /&gt;
  &amp;lt;/ItemGroup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;Target Name=&amp;quot;PostBuild&amp;quot; AfterTargets=&amp;quot;PostBuildEvent&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;Exec Command=&#039;call PostBuild.bat &amp;quot;$(EcoServerDir)&amp;quot; &amp;quot;$(OutDir)&amp;quot; &amp;quot;$(MSBuildProjectName)&amp;quot;&#039;/&amp;gt;&lt;br /&gt;
  &amp;lt;/Target&amp;gt;&lt;br /&gt;
&amp;lt;/Project&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Finally create a new file directly inside the project by right-clicking on the project in the Solution Explorer. Select the &#039;&#039;Add&#039;&#039; and click on &#039;&#039;New Item...&#039;&#039; from the sub-menu.&lt;br /&gt;
&lt;br /&gt;
Use the name &amp;lt;code&amp;gt;PostBuild.bat&amp;lt;/code&amp;gt; for this new file.&lt;br /&gt;
&lt;br /&gt;
Open it and put the following in the PostBuild file:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;batch&amp;quot;&amp;gt;REM reading in arguements to sensible variables&lt;br /&gt;
set serverDir=%1&lt;br /&gt;
set outDir=%2&lt;br /&gt;
set projName=%3&lt;br /&gt;
&lt;br /&gt;
REM removing double-quotes added to variables for concatenation&lt;br /&gt;
set serverDir=%serverDir:&amp;quot;=%&lt;br /&gt;
set outDir=%outDir:&amp;quot;=%&lt;br /&gt;
set projName=%projName:&amp;quot;=%&lt;br /&gt;
&lt;br /&gt;
REM Copy mod dll to Mods dir&lt;br /&gt;
set dllFile=%outDir%%projName%.dll&lt;br /&gt;
echo Copying mod dll file: %dllFile%&lt;br /&gt;
copy &amp;quot;%dllFile%&amp;quot; &amp;quot;%serverDir%\Mods&amp;quot;&lt;br /&gt;
&lt;br /&gt;
REM Copy mod pdb to directory where EcoServer.exe is&lt;br /&gt;
set pdbFile=%outDir%%projName%.pdb&lt;br /&gt;
echo Copying mod pdb file: %pdbFile%&lt;br /&gt;
copy &amp;quot;%pdbFile%&amp;quot; &amp;quot;%serverDir%&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;Now try running a rebuild of the project. The output should report copying files and inside the &amp;lt;code&amp;gt;Eco/Eco_Data/Server/Mods&amp;lt;/code&amp;gt; folder should be &amp;lt;code&amp;gt;TheMod.dll&amp;lt;/code&amp;gt; file&lt;br /&gt;
&lt;br /&gt;
=== Setting up Debugging ===&lt;br /&gt;
&#039;&#039;&#039;Special thanks to Monzun#0606 on Eco&#039;s Discord for helping research the following information.&#039;&#039;&#039;&lt;br /&gt;
To setup debugging, &amp;lt;u&amp;gt;make sure that the project is setup with the post-build script described above&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Debugging is a &amp;lt;u&amp;gt;powerful&amp;lt;/u&amp;gt; tool to a developer and allows the developer to set breakpoints anywhere in the code to stop execution. When execution is stopped the developer can review every variable&#039;s value and incrementally continue the code. This is invaluable when tracking down bugs or trying to understand a complex piece of code.&lt;br /&gt;
&lt;br /&gt;
From the top menu, select &#039;&#039;Debug&#039;&#039; and click on the option &#039;&#039;TheMod Debug Properties&#039;&#039; at the bottom of the menu.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Debug Menu.png|alt=VS2022&#039;s debug menu is open from the top of the application. Highlighted is the last option &amp;quot;Debug Properties&amp;quot;.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
Find the &#039;&#039;Create a new profile&#039;&#039; button &#039;&#039;&#039;in the top-left&#039;&#039;&#039; of this new window. Select &#039;&#039;Executable&#039;&#039; from the drop-down menu.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Debugger Launch Profiles.png|alt=VS2022&#039;s launch profile window is open. Underlined and pointed to by a red mark is the &amp;quot;Create a new profile&amp;quot; button, located in the top-left of the window. Highlighted from the menu under it is the option reading &amp;quot;Executable&amp;quot;.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
Set the &#039;&#039;Executable&#039;&#039; field to the full path to the &amp;lt;code&amp;gt;EcoServer.exe&amp;lt;/code&amp;gt; file. For example, &amp;lt;code&amp;gt;C:\Program Files (x86)\Steam\steamapps\common\Eco\Eco_Data\Server&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;\EcoServer.exe&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Set the &#039;&#039;Working Directory&#039;&#039; field to the full path to the folder containing the &amp;lt;code&amp;gt;EcoServer.exe&amp;lt;/code&amp;gt; file. For example, &amp;lt;code&amp;gt;C:\Program Files (x86)\Steam\steamapps\common\Eco\Eco_Data\Server&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Eco Debugging Profile.png|alt=A fully configured profile ready to debug Eco on VS2022&#039;s launch profile page.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
To use this newly configured profile, switch to it by clicking the small arrow to the right of the play icon (see image).  Select the newly created profile -- &#039;&#039;Profile 1&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Debugger Profile Selection.png|alt=VS2022&#039;s debugger profile selection menu is open with the newly created &amp;quot;Profile 1&amp;quot; highlighted.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
To see how breakpoints work, put the following in &amp;lt;code&amp;gt;Class1.cs&amp;lt;/code&amp;gt; file:&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot;&amp;gt;&lt;br /&gt;
using Eco.Core.Plugins.Interfaces;&lt;br /&gt;
using Eco.Core.Utils;&lt;br /&gt;
using Eco.ModKit;&lt;br /&gt;
&lt;br /&gt;
namespace Test&lt;br /&gt;
{&lt;br /&gt;
    public class Class1 : IModKitPlugin, IInitializablePlugin&lt;br /&gt;
    {&lt;br /&gt;
        public string GetCategory() =&amp;gt; &amp;quot;Tutorial&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        public string GetStatus() =&amp;gt; this._status;&lt;br /&gt;
        string _status = string.Empty;&lt;br /&gt;
&lt;br /&gt;
        public void Initialize(TimedTask timer)&lt;br /&gt;
        {&lt;br /&gt;
            this._status = &amp;quot;Ok&amp;quot;;&lt;br /&gt;
            bool yes = true;&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;This code creates a basic plugin, called &amp;lt;code&amp;gt;Class1&amp;lt;/code&amp;gt;, that Eco will load and initialize on startup. Eco knows to do this because this class inherits the &amp;lt;code&amp;gt;IModKitPlugin&amp;lt;/code&amp;gt; interface (causes it to be loaded) and the &amp;lt;code&amp;gt;IInitializablePlugin&amp;lt;/code&amp;gt; interface (causes it to be initialized).&lt;br /&gt;
&lt;br /&gt;
Add a breakpoint to the code by right-clicking on the line &amp;lt;code&amp;gt;bool yes = true;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Adding a breakpoint.png|alt=A boilerplate example of a mod is shown in the VS2022 text editor. A line has a menu open above it with the option &amp;quot;Breakpoint&amp;quot; expanded and the option &amp;quot;Insert Breakpoint&amp;quot; highlighted on the sub-menu.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
Now hit the play button. The server will start and VS2022 will flash back on screen once Eco tries to initialize the mod&#039;s plugin.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Launch Debugger.png|alt=Highlighted is the play button for VS2022&#039;s debugger. The &amp;quot;Profile 1&amp;quot; is still selected from before.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After a little bit the server will start-up and hit the breakpoint set. When it does VS2022 will keep startup from continuing and allow detailed inspection to happen.&lt;br /&gt;
&lt;br /&gt;
In the bottom left (circled in red) is a table of all of the variables within scope. Use this to see what is happening (especially useful in loops!).&lt;br /&gt;
&lt;br /&gt;
At the middle-top (circled in red) are some of the debugger controls. Clicking the highlighted &#039;&#039;Continue&#039;&#039; button resumes normal operation. Using the buttons to the right that are highlighted will allow the developer to step through the codes execution to see exactly how each line is performing. Debugging is a deep and rich topic that this guide will not explain further, but there&#039;s a great video by Microsoft Visual Studio on YouTube called Basics of Debugging. In that 45 minute video (don&#039;t worry there&#039;s annotations to jump to just what is interesting) a whole gamut of information about how to use debugging is covered.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Debugger LIve.png|alt=Shows a simple plugin&#039;s code in the editor of VS2022. In the bottom-left is a table of all variables used in the function. It is circled in red. On the top of the image also circled in red is the debugger controls. Highlighted within is the continue button and the &amp;quot;step over&amp;quot; button.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
== Releasing a Mod ==&lt;br /&gt;
&lt;br /&gt;
=== Mod.io ===&lt;br /&gt;
&amp;lt;code&amp;gt;mod.io&amp;lt;/code&amp;gt; is where creators share their mods with players and others.&lt;br /&gt;
&lt;br /&gt;
To share a new mod here all that is necessary is an account.&lt;br /&gt;
&lt;br /&gt;
Head over to &amp;lt;code&amp;gt;mod.io/g/eco&amp;lt;/code&amp;gt; and click &#039;&#039;Login&#039;&#039; in the top-right corner. &lt;br /&gt;
&lt;br /&gt;
Finish signing-up with whatever account type you prefer.&lt;br /&gt;
&lt;br /&gt;
Click the &#039;&#039;Add Mod&#039;&#039; button in the top-right.&lt;br /&gt;
&lt;br /&gt;
Follow the upload wizard as directed.&lt;br /&gt;
&lt;br /&gt;
Once on the &#039;&#039;File Manager&#039;&#039; section, a zip file is needed.&lt;br /&gt;
&lt;br /&gt;
Zip the mod&#039;s &amp;lt;u&amp;gt;release&amp;lt;/u&amp;gt; dll and any other assets necessary (e.g. Unity bundles) by putting all the files into a folder. Then right-click on that folder and select &#039;&#039;Compress To...&#039;&#039; and from the sub-menu select &#039;&#039;ZIP file&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Upload that zip file. Considering naming it with a version number to help stay organized (e.g. &#039;&#039;v1&#039;&#039;). Next release, increase that number by 1 (e.g. &#039;&#039;v2&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Congratulations on releasing the mod!&lt;br /&gt;
&lt;br /&gt;
=== Sharing on Discord ===&lt;br /&gt;
Consider posting an ad on the official {{EcoDiscord}}. There&#039;s a channel for mods called &#039;&#039;mod-ads&#039;&#039;. &lt;br /&gt;
Please read the rules before posting.&lt;br /&gt;
&lt;br /&gt;
== Helpful Resources ==&lt;br /&gt;
&lt;br /&gt;
* Consider learning source control (Git). Completely optional, but can help you keep things organized as development continues.&lt;br /&gt;
* Explore Eco’s open-source mod projects for ideas (search on Github &amp;quot;Eco Mods&amp;quot; to find some real-life examples)&lt;br /&gt;
** {{EcoDiscord}}has a channel for mod developers to help one another called &#039;&#039;mod-dev.&#039;&#039; &#039;&#039;&#039;Note:&#039;&#039;&#039; Make under the &#039;&#039;Channel &amp;amp; Roles&#039;&#039; settings you have the 🛠&#039;&#039;Yes, I want to see the channels about modding&#039;&#039; role selected.&lt;/div&gt;</summary>
		<author><name>WugWugg</name></author>
	</entry>
	<entry>
		<id>https://wiki.play.eco/en/index.php?title=Getting_Started_with_Eco_Modding_in_Visual_Studio&amp;diff=16744</id>
		<title>Getting Started with Eco Modding in Visual Studio</title>
		<link rel="alternate" type="text/html" href="https://wiki.play.eco/en/index.php?title=Getting_Started_with_Eco_Modding_in_Visual_Studio&amp;diff=16744"/>
		<updated>2026-04-29T12:44:27Z</updated>

		<summary type="html">&lt;p&gt;WugWugg: Updated from intro to The Mod &amp;gt; .NET Version (text and images)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
This guide focuses on setting up a C# modding environment in Visual Studio.&lt;br /&gt;
&lt;br /&gt;
It does &#039;&#039;&#039;not&#039;&#039;&#039; cover adding Unity assets (models, prefabs, UI) to the game. See: [[From 3D Asset to Working Worktable]] for that workflow.&lt;br /&gt;
&lt;br /&gt;
This guide won’t teach you how to code or write a mod, but it will help you get everything set up so you’re ready to start learning. Helpful resources are listed at the bottom of this guide, including [[Helpful Examples for Modding]] for practical code examples.&lt;br /&gt;
&lt;br /&gt;
Visual Studio 2026 has a completely free to use version called the &#039;&#039;&#039;Community Edition&#039;&#039;&#039;. This guide is written assuming that&#039;s the version used.&lt;br /&gt;
&lt;br /&gt;
=== Have Ready ===&lt;br /&gt;
* A copy of the Eco game installed&lt;br /&gt;
* A file explorer and the file-path to &amp;lt;code&amp;gt;Eco&amp;lt;/code&amp;gt; folder&amp;lt;br&amp;gt;&#039;&#039;&#039;Tip:&#039;&#039;&#039; Within this folder there&#039;s folders like &amp;lt;code&amp;gt;D3D12&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Eco_Data&amp;lt;/code&amp;gt;. Also, you&#039;ll find the &amp;lt;code&amp;gt;Eco.exe&amp;lt;/code&amp;gt; file here. There are other files and folder here too, but this list is just to help you know what the folder looks like.&lt;br /&gt;
&lt;br /&gt;
==== Tip: Find Folder with Steam ====&lt;br /&gt;
Steam users can find the install folder by right-clicking on the game in your Steam Library:&lt;br /&gt;
&lt;br /&gt;
[[File:Steam Library -- Browse Local Files.png|alt=Shows a Steam Library with a menu open over the Eco game. Highlighted in that menu is a &amp;quot;Manage&amp;quot; option, opening a sub-menu. The sub-menu has &amp;quot;Browse local files&amp;quot; highlighted.|frameless|border|upright=3|location=center|link=]]&lt;br /&gt;
&lt;br /&gt;
== Installing Visual Studio ==&lt;br /&gt;
 &lt;br /&gt;
# Go to &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://visualstudio.microsoft.com/downloads/#visual-studio-community-2026&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; and look for the &amp;quot;&#039;&#039;&#039;Visual Studio Community 2026&#039;&#039;&#039;&amp;quot; download.&lt;br /&gt;
# Start the download by clicking on the &#039;&#039;Download&#039;&#039; button.&lt;br /&gt;
# Run the installer until it reaches to the Workloads page.&lt;br /&gt;
# Select these workloads...&lt;br /&gt;
## .NET desktop development -- &#039;&#039;&#039;Required&#039;&#039;&#039; for any mod development&lt;br /&gt;
## ASP.NET and web development -- Optional. If you want to interact with external websites or Eco&#039;s own web server (e.g. Discord&#039;s webhooks or extending the API)&lt;br /&gt;
# With those workloads selected the page should look something like this:&amp;lt;br&amp;gt;[[File:VisualStudioCommunity2022 Workloads.png|alt=Workloads screen during VS2022 installation. Options selected are &amp;quot;ASP.NET and web development&amp;quot; and &amp;quot;.NET desktop development&amp;quot;. |frameless|location=center|upright=4|link=|border]]&lt;br /&gt;
# Click the Install button. It will take a few minutes to complete installation.&lt;br /&gt;
# Open Visual Studio after it installs.&lt;br /&gt;
# You may be prompted to sign in:&lt;br /&gt;
## Click &#039;&#039;Skip and add accounts later&#039;&#039; to continue.&lt;br /&gt;
## If you plan to use Github, sign in to make version control easier.&lt;br /&gt;
# Finally, it might ask what color theme you&#039;d like. Select your preference and continue.&lt;br /&gt;
# Visual Studio is now installed and ready to be used.&lt;br /&gt;
&lt;br /&gt;
== The Mod ==&lt;br /&gt;
&lt;br /&gt;
Once Eco and Visual Studio are installed all of the tools needed to code, build, and run a mod are ready.&lt;br /&gt;
&lt;br /&gt;
=== Creating a New Project ===&lt;br /&gt;
&lt;br /&gt;
# Open Visual Studio. When it first opens it will show you a dashboard where you can quickly select what you want to do.&lt;br /&gt;
# On the right, under &#039;&#039;Get Started&#039;&#039; find the &#039;&#039;Create a new project&#039;&#039; button:&amp;lt;br&amp;gt;[[File:VS2022 OpeningDashboard.png|alt=VS2022&#039;s launch dashboard showing recent projects on the left and quick action buttons on the right. Highlighted is a button titled &amp;quot;Create a new project&amp;quot;.|frameless|border|link=|location=center|upright=4]]&lt;br /&gt;
# A new window will pop-up.&lt;br /&gt;
# Select C# &#039;&#039;Class Library.&#039;&#039; To find the template, search &amp;lt;code&amp;gt;C# library&amp;lt;/code&amp;gt; in the search bar. Select the C# option titled &#039;&#039;Class Library&#039;&#039;.&amp;lt;br&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; &amp;lt;u&amp;gt;Make sure you select the &amp;lt;code&amp;gt;C#&amp;lt;/code&amp;gt; option as there are other options similarly named &#039;&#039;Class Library&#039;&#039;.&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt;[[File:VS2022 NewProjectWizard Templates.png|frameless|border|location=center|upright=4|link=]]&lt;br /&gt;
# Click the &#039;&#039;Next&#039;&#039; button.&lt;br /&gt;
# For &#039;&#039;Project Name&#039;&#039; type the name of the mod being created.&lt;br /&gt;
# The other options like the &#039;&#039;Location&#039;&#039; and the &#039;&#039;Solution Name&#039;&#039; do not need edited.&lt;br /&gt;
# Leave the box &#039;&#039;Place solution and project in the same directory&#039;&#039; unchecked.&lt;br /&gt;
# Click the Next button.&lt;br /&gt;
# Continue with the next section in this guide to determine the &#039;&#039;Framework&#039;&#039; selection.&lt;br /&gt;
&lt;br /&gt;
=== .NET Version ===&lt;br /&gt;
&amp;lt;u&amp;gt;As of April of 2026&amp;lt;/u&amp;gt;, Eco targets &#039;&#039;.NET 10.0&#039;&#039; and the mod should too.&lt;br /&gt;
&lt;br /&gt;
To confirm the version of .NET that Eco uses:&lt;br /&gt;
&lt;br /&gt;
# Go to the NuGet Gallery &amp;lt;code&amp;gt;www.nuget.org/packages?q=Eco.ReferenceAssemblies&amp;lt;/code&amp;gt;&amp;lt;!-- I&#039;m not directly linking to the package as there is no way to link to the latest version. So as a workaround I&#039;m using the search to point the reader to the latest version. --&amp;gt;&lt;br /&gt;
# Find the package with the name &#039;&#039;Eco.ReferenceAssemblies&#039;&#039; made by &#039;&#039;StrangeLoopGames&#039;&#039;.&lt;br /&gt;
# Notice the chip underneath of it with the &#039;&#039;.NET&#039;&#039; version it targets.&amp;lt;br&amp;gt;[[File:NuGetGallery -- Eco.ReferenceAssemblies Search.png|alt=Shows the search result of Eco.ReferenceAssemblies. In a blue chip the text &amp;quot;.NET 8.0&amp;quot; can be seen.|frameless|upright=4|location=center|link=|border]]&lt;br /&gt;
# Click on that search result (shown above).&lt;br /&gt;
# A more detailed page is shown. Again, there&#039;s chips showing what version of .NET to use:&amp;lt;br&amp;gt;[[File:NuGetGallery--Eco.ReferenceAssemblies Details.png|alt=Show the package page for &amp;quot;Eco.ReferenceAssemblies&amp;quot; on NuGet Gallery. Circled in red are two chips with some version of the text &amp;quot;.NET 8.0&amp;quot; inside them.|frameless|link=|border|location=center|upright=3]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Back to VS2022&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
On the Additional Information page, there&#039;s the Framework drop-down. Select the same version of .NET Eco uses (as described above).&lt;br /&gt;
&lt;br /&gt;
Click the Create button to finish creating the mod!&lt;br /&gt;
&lt;br /&gt;
=== Linking to Eco Assemblies ===&lt;br /&gt;
Look for the Solution Explorer on the right-hand side of VS2022. It should look something like this:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note&#039;&#039;&#039;: If the solution explorer isn&#039;t there, open it from the top menu. Click the &#039;&#039;View&#039;&#039; button and select &#039;&#039;Solution Explorer&#039;&#039; from the menu.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Solution Explorer.png|alt=A picture of a basic layout in Visual Studio 2022 with the Solution Explorer open on the right-hand side. The solution explorer is circled in red.|frameless|link=|upright=4|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
From the Solution Explorer, find the &#039;&#039;References&#039;&#039; line and right-click on it. On that menu select &#039;&#039;Manage NuGet packages...&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 Solution Explorer -- Manage NuGet Packages.png|alt=Shows VS2022&#039;s Solution Explorer with project expanded. The References line is highlighted and a menu is open. On that menu the &amp;quot;Manage NuGet Packages&amp;quot; line is highlighted.|frameless|link=|upright=4|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
This will open a new tab. Above the search bar there&#039;s sub-tabs. &#039;&#039;&#039;Select the &#039;&#039;Browse&#039;&#039; sub-tab.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Type &amp;lt;code&amp;gt;Eco.ReferenceAssemblies&amp;lt;/code&amp;gt; into the search bar.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Check the &#039;&#039;Include prerelease&#039;&#039; check-box.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Find the option with the name &#039;&#039;Eco.ReferenceAssemblies&#039;&#039; made by &#039;&#039;StrangeLoopGames&#039;&#039;. Click on it.&lt;br /&gt;
&lt;br /&gt;
A details panel will show up to the right. It will show the version of the reference assemblies being targeted. By default it chooses the latest and can be left at its default.&lt;br /&gt;
&lt;br /&gt;
Click the Install button.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- NuGet Install Eco.ReferenceAssemblies.png|alt=VS2022 is open to the NuGet tab and is searching with the text Eco.ReferenceAssemblies. The checkbox to the right of the search is checked -- include prerelease. The only search result is selected. There is yellow highlights over part of the photo.|frameless|link=|upright=4|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
Click the &#039;&#039;Apply&#039;&#039; button on the popup to finish adding the references.&lt;br /&gt;
&lt;br /&gt;
The reference assemblies have now been added! When coding VS2022 will provide IntelliSense popups. Try it out by going back to the &amp;lt;code&amp;gt;Class1.cs&amp;lt;/code&amp;gt; file and typing &amp;lt;code&amp;gt;Eco.&amp;lt;/code&amp;gt; and you will see suggestion pop up. It’s an essential tool for a lot of modders.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Intellisense.png|alt=Shows a text editor with a basic class file. Inside there&#039;s the text &amp;quot;Eco.&amp;quot; and a menu that show the suggested namespaces within.|frameless|link=|upright=4|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
=== Building The Dynamic Link Library (DLL) ===&lt;br /&gt;
&lt;br /&gt;
==== Building for Development ====&lt;br /&gt;
Building the mod creates the &amp;lt;code&amp;gt;.dll&amp;lt;/code&amp;gt; file that can be used to test with.&lt;br /&gt;
&lt;br /&gt;
To build, open the &#039;&#039;Build&#039;&#039; menu from the top of VS2022.&lt;br /&gt;
&lt;br /&gt;
Select &#039;&#039;Build Solution&#039;&#039;. This will produce non-optimized DLL used for testing and development.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Build Menu.png|alt=VS2022 top menu &amp;quot;Build&amp;quot; is open with &amp;quot;build solution&amp;quot; highlighted (ctrl + shift + b).|frameless|link=|upright=4|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
To find the file VS2022 just built, right click on the project in the Solution Explorer. &lt;br /&gt;
&lt;br /&gt;
Select &#039;&#039;Open Folder in File Explorer.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Project Menu.png|alt=VS2022&#039;s solution explorer is shown with the projects right-click menu open. Highlighted is &amp;quot;Open folder in File Explorer&amp;quot;|frameless|link=|upright=4|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
From here, the mod&#039;s DLL will be in the &amp;lt;code&amp;gt;bin/Debug/net8.0/&amp;lt;/code&amp;gt; folder. The file will be named with mod&#039;s name, like &amp;lt;code&amp;gt;TheMod.dll&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Copy the mod&#039;s DLL file.&lt;br /&gt;
&lt;br /&gt;
Paste it into the folder &amp;lt;code&amp;gt;Eco/Eco_Data/Server/Mods/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
To run a game with that mod &#039;&#039;&#039;create a local world&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
The mod should be running. Check the logs at &amp;lt;code&amp;gt;Eco/Eco_Data/Server/Logs/&amp;lt;/code&amp;gt; to verify. Open the &amp;lt;u&amp;gt;most recent&amp;lt;/u&amp;gt; log file here.&lt;br /&gt;
&lt;br /&gt;
If the mod was loaded it there will be a line mentioning the file-name of the DLL. If the DLL was named &amp;lt;code&amp;gt;TheMod.dll&amp;lt;/code&amp;gt; this is what to look for in the log file:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;[13:55:54.815] [4] [ Info] [Eco] Starting ModKitPlugin                             ...  &lt;br /&gt;
[13:56:27.399] [4] [ Info] [Eco] Starting ModKitPlugin                             ... Finished in 32.584 sec&lt;br /&gt;
 &lt;br /&gt;
[13:56:27.439] [4] [ Info] [Eco] Loading mods                                      ...  &lt;br /&gt;
[13:56:27.439] [9] [ Info] [Eco] Loading TheMod...&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Tip: Setup File Explorer to Sort By Date =====&lt;br /&gt;
It&#039;s suggested to setup the file view to &#039;&#039;Details&#039;&#039; in this folder because it will show the &#039;&#039;Date Modified&#039;&#039; for each file.&lt;br /&gt;
&lt;br /&gt;
[[File:File Explorer -- View Settings Menu.png|alt=Show Window&#039;s File Explorer&#039;s view setting menu with the &amp;quot;details&amp;quot; option highlighted.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
Additionally, clicking on the &#039;&#039;Date Modified&#039;&#039; header sorts all files. Sort it so the most recent is on top and every time the server starts the log file is easily found -- it&#039;s the one on top!&lt;br /&gt;
&lt;br /&gt;
[[File:File Explorer -- Details Example.png|alt=Show&#039;s window&#039;s File Explorer with the date modified header highlighted.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
==== Building for Release ====&lt;br /&gt;
To build for release, click on the mod&#039;s project in the Solution Explorer to highlight it.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Solution Explorer Project Highlight.png|alt=Shows VS2022&#039;s solution explorer with the project highlighted.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
Then, open the &#039;&#039;Build&#039;&#039; menu from the top of VS2022 and select &#039;&#039;Publish Selection&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Set the target &#039;&#039;as Folder&#039;&#039;. Click the &#039;&#039;Next&#039;&#039; button.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Publish Wizard.png|alt=VS2022&#039;s publish wizard showing the target selection screen. The Folder option is highlighted.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
Leave the folder location as default. Click the &#039;&#039;Finish&#039;&#039; button.&lt;br /&gt;
&lt;br /&gt;
Click the &#039;&#039;Close&#039;&#039; button.&lt;br /&gt;
&lt;br /&gt;
Finally, click the &#039;&#039;Publish&#039;&#039; button to start the build.&lt;br /&gt;
&lt;br /&gt;
A green alert will pop up when the build is completed:&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Publish Screen.png|alt=Show&#039;s VS2022 publish screen. There&#039;s publish button at the top of this screen.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Either use the blue links on this page to find the file or browse the project&#039;s files as shown in &amp;quot;Building for Development&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Inside the project, the file will be in &amp;lt;code&amp;gt;bin/Release/net8.0/publish&amp;lt;/code&amp;gt;. The file will be named with the mod project&#039;s name. For example, &amp;lt;code&amp;gt;TheMod.dll&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Since the reference assemblies are already included in the game, do not worry about the other files here.  &lt;br /&gt;
&lt;br /&gt;
To share this mod, the only file needed is the mod&#039;s dll -- &amp;lt;code&amp;gt;TheMod.dll&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Post-Build Scripts: Automatic Copy ===&lt;br /&gt;
With a post-build script VS2022 will automatically copy the files each build. It&#039;s a very nice feature to have when developing and rebuilding every 5 minutes to test something new.&lt;br /&gt;
&lt;br /&gt;
First, add the variables about where &amp;lt;code&amp;gt;EcoServer.exe&amp;lt;/code&amp;gt; is located to the project file.&lt;br /&gt;
&lt;br /&gt;
Right-click on the project in the Solution Explorer and select the &#039;&#039;Edit Project File&#039;&#039; option.&lt;br /&gt;
&lt;br /&gt;
Add the properties &amp;lt;code&amp;gt;EcoServerExe&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;EcoServerDir&amp;lt;/code&amp;gt; &amp;lt;u&amp;gt;inside of the &amp;lt;code&amp;gt;PropertyGroup&amp;lt;/code&amp;gt; tag.&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; Tip: By holding shift and right-clicking on a file in the file explorer an old-school menu pops up. Midway down this menu is an option to &#039;&#039;Copy As Path&#039;&#039;. Neat!&lt;br /&gt;
&lt;br /&gt;
The project file should look something like this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;Project Sdk=&amp;quot;Microsoft.NET.Sdk&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;PropertyGroup&amp;gt;&lt;br /&gt;
    &amp;lt;TargetFramework&amp;gt;net8.0&amp;lt;/TargetFramework&amp;gt;&lt;br /&gt;
    &amp;lt;ImplicitUsings&amp;gt;enable&amp;lt;/ImplicitUsings&amp;gt;&lt;br /&gt;
    &amp;lt;Nullable&amp;gt;enable&amp;lt;/Nullable&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;EcoServerExe&amp;gt;$(EcoServerDir)\EcoServer.exe&amp;lt;/EcoServerExe&amp;gt;&lt;br /&gt;
    &amp;lt;EcoServerDir&amp;gt;C:\Program Files (x86)\Steam\steamapps\common\Eco\Eco_Data\Server&amp;lt;/EcoServerDir&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
  &amp;lt;/PropertyGroup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;ItemGroup&amp;gt;&lt;br /&gt;
    &amp;lt;PackageReference Include=&amp;quot;Eco.ReferenceAssemblies&amp;quot; Version=&amp;quot;0.11.1.13-beta-release-887&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/ItemGroup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/Project&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Next, add the &amp;lt;code&amp;gt;PostBuild&amp;lt;/code&amp;gt; property inside the &amp;lt;code&amp;gt;Project&amp;lt;/code&amp;gt; tag.&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Project Sdk=&amp;quot;Microsoft.NET.Sdk&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;PropertyGroup&amp;gt;&lt;br /&gt;
    ... SNIP ...&lt;br /&gt;
  &amp;lt;/PropertyGroup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;ItemGroup&amp;gt;&lt;br /&gt;
    ... SNIP ...&lt;br /&gt;
  &amp;lt;/ItemGroup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;Target Name=&amp;quot;PostBuild&amp;quot; AfterTargets=&amp;quot;PostBuildEvent&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;Exec Command=&#039;call PostBuild.bat &amp;quot;$(EcoServerDir)&amp;quot; &amp;quot;$(OutDir)&amp;quot; &amp;quot;$(MSBuildProjectName)&amp;quot;&#039;/&amp;gt;&lt;br /&gt;
  &amp;lt;/Target&amp;gt;&lt;br /&gt;
&amp;lt;/Project&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Finally create a new file directly inside the project by right-clicking on the project in the Solution Explorer. Select the &#039;&#039;Add&#039;&#039; and click on &#039;&#039;New Item...&#039;&#039; from the sub-menu.&lt;br /&gt;
&lt;br /&gt;
Use the name &amp;lt;code&amp;gt;PostBuild.bat&amp;lt;/code&amp;gt; for this new file.&lt;br /&gt;
&lt;br /&gt;
Open it and put the following in the PostBuild file:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;batch&amp;quot;&amp;gt;REM reading in arguements to sensible variables&lt;br /&gt;
set serverDir=%1&lt;br /&gt;
set outDir=%2&lt;br /&gt;
set projName=%3&lt;br /&gt;
&lt;br /&gt;
REM removing double-quotes added to variables for concatenation&lt;br /&gt;
set serverDir=%serverDir:&amp;quot;=%&lt;br /&gt;
set outDir=%outDir:&amp;quot;=%&lt;br /&gt;
set projName=%projName:&amp;quot;=%&lt;br /&gt;
&lt;br /&gt;
REM Copy mod dll to Mods dir&lt;br /&gt;
set dllFile=%outDir%%projName%.dll&lt;br /&gt;
echo Copying mod dll file: %dllFile%&lt;br /&gt;
copy &amp;quot;%dllFile%&amp;quot; &amp;quot;%serverDir%\Mods&amp;quot;&lt;br /&gt;
&lt;br /&gt;
REM Copy mod pdb to directory where EcoServer.exe is&lt;br /&gt;
set pdbFile=%outDir%%projName%.pdb&lt;br /&gt;
echo Copying mod pdb file: %pdbFile%&lt;br /&gt;
copy &amp;quot;%pdbFile%&amp;quot; &amp;quot;%serverDir%&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;Now try running a rebuild of the project. The output should report copying files and inside the &amp;lt;code&amp;gt;Eco/Eco_Data/Server/Mods&amp;lt;/code&amp;gt; folder should be &amp;lt;code&amp;gt;TheMod.dll&amp;lt;/code&amp;gt; file&lt;br /&gt;
&lt;br /&gt;
=== Setting up Debugging ===&lt;br /&gt;
&#039;&#039;&#039;Special thanks to Monzun#0606 on Eco&#039;s Discord for helping research the following information.&#039;&#039;&#039;&lt;br /&gt;
To setup debugging, &amp;lt;u&amp;gt;make sure that the project is setup with the post-build script described above&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Debugging is a &amp;lt;u&amp;gt;powerful&amp;lt;/u&amp;gt; tool to a developer and allows the developer to set breakpoints anywhere in the code to stop execution. When execution is stopped the developer can review every variable&#039;s value and incrementally continue the code. This is invaluable when tracking down bugs or trying to understand a complex piece of code.&lt;br /&gt;
&lt;br /&gt;
From the top menu, select &#039;&#039;Debug&#039;&#039; and click on the option &#039;&#039;TheMod Debug Properties&#039;&#039; at the bottom of the menu.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Debug Menu.png|alt=VS2022&#039;s debug menu is open from the top of the application. Highlighted is the last option &amp;quot;Debug Properties&amp;quot;.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
Find the &#039;&#039;Create a new profile&#039;&#039; button &#039;&#039;&#039;in the top-left&#039;&#039;&#039; of this new window. Select &#039;&#039;Executable&#039;&#039; from the drop-down menu.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Debugger Launch Profiles.png|alt=VS2022&#039;s launch profile window is open. Underlined and pointed to by a red mark is the &amp;quot;Create a new profile&amp;quot; button, located in the top-left of the window. Highlighted from the menu under it is the option reading &amp;quot;Executable&amp;quot;.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
Set the &#039;&#039;Executable&#039;&#039; field to the full path to the &amp;lt;code&amp;gt;EcoServer.exe&amp;lt;/code&amp;gt; file. For example, &amp;lt;code&amp;gt;C:\Program Files (x86)\Steam\steamapps\common\Eco\Eco_Data\Server&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;\EcoServer.exe&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Set the &#039;&#039;Working Directory&#039;&#039; field to the full path to the folder containing the &amp;lt;code&amp;gt;EcoServer.exe&amp;lt;/code&amp;gt; file. For example, &amp;lt;code&amp;gt;C:\Program Files (x86)\Steam\steamapps\common\Eco\Eco_Data\Server&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Eco Debugging Profile.png|alt=A fully configured profile ready to debug Eco on VS2022&#039;s launch profile page.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
To use this newly configured profile, switch to it by clicking the small arrow to the right of the play icon (see image).  Select the newly created profile -- &#039;&#039;Profile 1&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Debugger Profile Selection.png|alt=VS2022&#039;s debugger profile selection menu is open with the newly created &amp;quot;Profile 1&amp;quot; highlighted.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
To see how breakpoints work, put the following in &amp;lt;code&amp;gt;Class1.cs&amp;lt;/code&amp;gt; file:&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot;&amp;gt;&lt;br /&gt;
using Eco.Core.Plugins.Interfaces;&lt;br /&gt;
using Eco.Core.Utils;&lt;br /&gt;
using Eco.ModKit;&lt;br /&gt;
&lt;br /&gt;
namespace Test&lt;br /&gt;
{&lt;br /&gt;
    public class Class1 : IModKitPlugin, IInitializablePlugin&lt;br /&gt;
    {&lt;br /&gt;
        public string GetCategory() =&amp;gt; &amp;quot;Tutorial&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        public string GetStatus() =&amp;gt; this._status;&lt;br /&gt;
        string _status = string.Empty;&lt;br /&gt;
&lt;br /&gt;
        public void Initialize(TimedTask timer)&lt;br /&gt;
        {&lt;br /&gt;
            this._status = &amp;quot;Ok&amp;quot;;&lt;br /&gt;
            bool yes = true;&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;This code creates a basic plugin, called &amp;lt;code&amp;gt;Class1&amp;lt;/code&amp;gt;, that Eco will load and initialize on startup. Eco knows to do this because this class inherits the &amp;lt;code&amp;gt;IModKitPlugin&amp;lt;/code&amp;gt; interface (causes it to be loaded) and the &amp;lt;code&amp;gt;IInitializablePlugin&amp;lt;/code&amp;gt; interface (causes it to be initialized).&lt;br /&gt;
&lt;br /&gt;
Add a breakpoint to the code by right-clicking on the line &amp;lt;code&amp;gt;bool yes = true;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Adding a breakpoint.png|alt=A boilerplate example of a mod is shown in the VS2022 text editor. A line has a menu open above it with the option &amp;quot;Breakpoint&amp;quot; expanded and the option &amp;quot;Insert Breakpoint&amp;quot; highlighted on the sub-menu.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
Now hit the play button. The server will start and VS2022 will flash back on screen once Eco tries to initialize the mod&#039;s plugin.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Launch Debugger.png|alt=Highlighted is the play button for VS2022&#039;s debugger. The &amp;quot;Profile 1&amp;quot; is still selected from before.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After a little bit the server will start-up and hit the breakpoint set. When it does VS2022 will keep startup from continuing and allow detailed inspection to happen.&lt;br /&gt;
&lt;br /&gt;
In the bottom left (circled in red) is a table of all of the variables within scope. Use this to see what is happening (especially useful in loops!).&lt;br /&gt;
&lt;br /&gt;
At the middle-top (circled in red) are some of the debugger controls. Clicking the highlighted &#039;&#039;Continue&#039;&#039; button resumes normal operation. Using the buttons to the right that are highlighted will allow the developer to step through the codes execution to see exactly how each line is performing. Debugging is a deep and rich topic that this guide will not explain further, but there&#039;s a great video by Microsoft Visual Studio on YouTube called Basics of Debugging. In that 45 minute video (don&#039;t worry there&#039;s annotations to jump to just what is interesting) a whole gamut of information about how to use debugging is covered.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Debugger LIve.png|alt=Shows a simple plugin&#039;s code in the editor of VS2022. In the bottom-left is a table of all variables used in the function. It is circled in red. On the top of the image also circled in red is the debugger controls. Highlighted within is the continue button and the &amp;quot;step over&amp;quot; button.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
== Releasing a Mod ==&lt;br /&gt;
&lt;br /&gt;
=== Mod.io ===&lt;br /&gt;
&amp;lt;code&amp;gt;mod.io&amp;lt;/code&amp;gt; is where creators share their mods with players and others.&lt;br /&gt;
&lt;br /&gt;
To share a new mod here all that is necessary is an account.&lt;br /&gt;
&lt;br /&gt;
Head over to &amp;lt;code&amp;gt;mod.io/g/eco&amp;lt;/code&amp;gt; and click &#039;&#039;Login&#039;&#039; in the top-right corner. &lt;br /&gt;
&lt;br /&gt;
Finish signing-up with whatever account type you prefer.&lt;br /&gt;
&lt;br /&gt;
Click the &#039;&#039;Add Mod&#039;&#039; button in the top-right.&lt;br /&gt;
&lt;br /&gt;
Follow the upload wizard as directed.&lt;br /&gt;
&lt;br /&gt;
Once on the &#039;&#039;File Manager&#039;&#039; section, a zip file is needed.&lt;br /&gt;
&lt;br /&gt;
Zip the mod&#039;s &amp;lt;u&amp;gt;release&amp;lt;/u&amp;gt; dll and any other assets necessary (e.g. Unity bundles) by putting all the files into a folder. Then right-click on that folder and select &#039;&#039;Compress To...&#039;&#039; and from the sub-menu select &#039;&#039;ZIP file&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Upload that zip file. Considering naming it with a version number to help stay organized (e.g. &#039;&#039;v1&#039;&#039;). Next release, increase that number by 1 (e.g. &#039;&#039;v2&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Congratulations on releasing the mod!&lt;br /&gt;
&lt;br /&gt;
=== Sharing on Discord ===&lt;br /&gt;
Consider posting an ad on the official {{EcoDiscord}}. There&#039;s a channel for mods called &#039;&#039;mod-ads&#039;&#039;. &lt;br /&gt;
Please read the rules before posting.&lt;br /&gt;
&lt;br /&gt;
== Helpful Resources ==&lt;br /&gt;
&lt;br /&gt;
* Consider learning source control (Git). Completely optional, but can help you keep things organized as development continues.&lt;br /&gt;
* Explore Eco’s open-source mod projects for ideas (search on Github &amp;quot;Eco Mods&amp;quot; to find some real-life examples)&lt;br /&gt;
** {{EcoDiscord}}has a channel for mod developers to help one another called &#039;&#039;mod-dev.&#039;&#039; &#039;&#039;&#039;Note:&#039;&#039;&#039; Make under the &#039;&#039;Channel &amp;amp; Roles&#039;&#039; settings you have the 🛠&#039;&#039;Yes, I want to see the channels about modding&#039;&#039; role selected.&lt;/div&gt;</summary>
		<author><name>WugWugg</name></author>
	</entry>
	<entry>
		<id>https://wiki.play.eco/en/index.php?title=Getting_Started_with_Eco_Modding_in_Visual_Studio&amp;diff=16743</id>
		<title>Getting Started with Eco Modding in Visual Studio</title>
		<link rel="alternate" type="text/html" href="https://wiki.play.eco/en/index.php?title=Getting_Started_with_Eco_Modding_in_Visual_Studio&amp;diff=16743"/>
		<updated>2026-04-29T12:19:44Z</updated>

		<summary type="html">&lt;p&gt;WugWugg: Updated Installing Visual Studio section (text only)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
This guide focuses on setting up a C# modding environment in Visual Studio.&lt;br /&gt;
&lt;br /&gt;
It does &#039;&#039;&#039;not&#039;&#039;&#039; cover adding Unity assets (models, prefabs, UI) to the game. See: [[From 3D Asset to Working Worktable]] for that workflow.&lt;br /&gt;
&lt;br /&gt;
This guide won’t teach you how to code or write a mod, but it will help you get everything set up so you’re ready to start learning. Helpful resources are listed at the bottom of this guide, including [[Helpful Examples for Modding]] for practical code examples.&lt;br /&gt;
&lt;br /&gt;
Visual Studio 2026 has a completely free to use version called the &#039;&#039;&#039;Community Edition&#039;&#039;&#039;. This guide is written assuming that&#039;s the version used.&lt;br /&gt;
&lt;br /&gt;
=== Have Ready ===&lt;br /&gt;
* A copy of the Eco game installed&lt;br /&gt;
* A file explorer and the file-path to &amp;lt;code&amp;gt;Eco&amp;lt;/code&amp;gt; folder&amp;lt;br&amp;gt;&#039;&#039;&#039;Tip:&#039;&#039;&#039; Within this folder there&#039;s folders like &amp;lt;code&amp;gt;D3D12&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Eco_Data&amp;lt;/code&amp;gt;. Also, you&#039;ll find the &amp;lt;code&amp;gt;Eco.exe&amp;lt;/code&amp;gt; file here. There are other files and folder here too, but this list is just to help you know what the folder looks like.&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;&#039;Tip:&#039;&#039;&#039; Find Folder with Steam ====&lt;br /&gt;
Steam users can find the install folder by right-clicking on the game in your Steam Library:&lt;br /&gt;
&lt;br /&gt;
[[File:Steam Library -- Browse Local Files.png|alt=Shows a Steam Library with a menu open over the Eco game. Highlighted in that menu is a &amp;quot;Manage&amp;quot; option, opening a sub-menu. The sub-menu has &amp;quot;Browse local files&amp;quot; highlighted.|frameless|border|upright=3|location=center|link=]]&lt;br /&gt;
&lt;br /&gt;
== Installing Visual Studio ==&lt;br /&gt;
 &lt;br /&gt;
# Go to &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://visualstudio.microsoft.com/downloads/#visual-studio-community-2026&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; and look for the &amp;quot;&#039;&#039;&#039;Visual Studio Community 2026&#039;&#039;&#039;&amp;quot; download.&lt;br /&gt;
# Start the download by clicking on the &#039;&#039;Download&#039;&#039; button.&lt;br /&gt;
# Run the installer until it reaches to the Workloads page.&lt;br /&gt;
# Select these workloads...&lt;br /&gt;
## .NET desktop development -- &#039;&#039;&#039;Required&#039;&#039;&#039; for any mod development&lt;br /&gt;
## ASP.NET and web development -- Optional. If you want to interact with external websites or Eco&#039;s own web server (e.g. Discord&#039;s webhooks or extending the API)&lt;br /&gt;
# With those workloads selected the page should look something like this:[[File:VisualStudioCommunity2022 Workloads.png|alt=Workloads screen during VS2022 installation. Options selected are &amp;quot;ASP.NET and web development&amp;quot; and &amp;quot;.NET desktop development&amp;quot;. |frameless|location=center|upright=4|link=|border]]&lt;br /&gt;
# Click the Install button. It will take a few minutes to complete installation. By default, it should launch Visual Studio after it installs.&lt;br /&gt;
# You may be prompted to sign in:&lt;br /&gt;
## Click &#039;&#039;Skip and add accounts later&#039;&#039; to continue.&lt;br /&gt;
## If you plan to use Github, sign in to make version control easier.&lt;br /&gt;
# Finally, it might ask what color theme you&#039;d like. Select your preference and continue.&lt;br /&gt;
# Visual Studio is now installed and ready to be used.&lt;br /&gt;
&lt;br /&gt;
== The Mod ==&lt;br /&gt;
&lt;br /&gt;
Once Eco and Visual Studio are installed all of the tools needed to code, build, and run a mod are ready.&lt;br /&gt;
&lt;br /&gt;
=== Creating a New Project ===&lt;br /&gt;
&lt;br /&gt;
When VS2022 first opens it will show you a dashboard where you can quickly select what you want to do. On the left, are any recent projects opened. There won&#039;t be any if this is the first time installing it. &lt;br /&gt;
&lt;br /&gt;
On the right there will be a few options, from here select the &#039;&#039;Create a new project&#039;&#039; option.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 OpeningDashboard.png|alt=VS2022&#039;s launch dashboard showing recent projects on the left and quick action buttons on the right. Highlighted is a button titled &amp;quot;Create a new project&amp;quot;.|frameless|border|link=|location=center|upright=4]]&lt;br /&gt;
&lt;br /&gt;
Now, it&#039;s time to go through the new project wizard. First, the wizard asks what kind of project is being made. &lt;br /&gt;
&lt;br /&gt;
To mod Eco we need to make a &#039;&#039;&#039;C# Class Library&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
To find the template, search &amp;lt;code&amp;gt;C# library&amp;lt;/code&amp;gt; in the search bar. Select the C# option titled &#039;&#039;Class Library&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
It&#039;s important to &#039;&#039;&#039;pay attention to the icon and chips&#039;&#039;&#039; below the title and description. Make sure you &#039;&#039;&#039;select the &amp;lt;code&amp;gt;C#&amp;lt;/code&amp;gt; option&#039;&#039;&#039; as there are other options similarly named &#039;&#039;Class Library&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 NewProjectWizard Templates.png|frameless|border|location=center|upright=4|link=]]&lt;br /&gt;
&lt;br /&gt;
The next page will ask you what the Project Name should be. Type the name of the mod being created.&lt;br /&gt;
&lt;br /&gt;
The other options like the Location and the Solution Name do not need edited. &lt;br /&gt;
&lt;br /&gt;
Leave the box &#039;&#039;Place solution and project in the same directory&#039;&#039; unchecked.&lt;br /&gt;
&lt;br /&gt;
Click the Next button and continue along in the next section of this guide.&lt;br /&gt;
&lt;br /&gt;
=== .NET Version ===&lt;br /&gt;
&amp;lt;u&amp;gt;As of April of 2026&amp;lt;/u&amp;gt;, &#039;&#039;&#039;Eco targets .NET 10.0&#039;&#039;&#039; and the mod should too.&lt;br /&gt;
&lt;br /&gt;
It&#039;s suggested to confirm the version of .NET that Eco uses by looking at the .NET version the reference assemblies use.&lt;br /&gt;
&lt;br /&gt;
The reference assemblies can be found on the NuGet Gallery by searching for &amp;lt;code&amp;gt;Eco.ReferenceAssemblies&amp;lt;/code&amp;gt;. See: &amp;lt;code&amp;gt;www.nuget.org/packages?q=Eco.ReferenceAssemblies&amp;lt;/code&amp;gt;&amp;lt;!-- I&#039;m not directly linking to the package as there is no way to link to the latest version. So as a workaround I&#039;m using the search to point the reader to the latest version. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Find the package with the name &#039;&#039;Eco.ReferenceAssemblies&#039;&#039; made by &#039;&#039;StrangeLoopGames&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
There will be a chip underneath of it with the &#039;&#039;.NET&#039;&#039; version it targets. This is what that page looks like:&lt;br /&gt;
&lt;br /&gt;
[[File:NuGetGallery -- Eco.ReferenceAssemblies Search.png|alt=Shows the search result of Eco.ReferenceAssemblies. In a blue chip the text &amp;quot;.NET 8.0&amp;quot; can be seen.|frameless|upright=4|location=center|link=|border]]&lt;br /&gt;
&lt;br /&gt;
By clicking on that search result (shown above), a more detailed page opens is show. Again, there&#039;s chips showing what version of .NET to use:&lt;br /&gt;
&lt;br /&gt;
[[File:NuGetGallery--Eco.ReferenceAssemblies Details.png|alt=Show the package page for &amp;quot;Eco.ReferenceAssemblies&amp;quot; on NuGet Gallery. Circled in red are two chips with some version of the text &amp;quot;.NET 8.0&amp;quot; inside them.|frameless|link=|border|location=center|upright=3]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Back to VS2022&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
On the Additional Information page, there&#039;s the Framework drop-down. Select the same version of .NET Eco uses (as described above).&lt;br /&gt;
&lt;br /&gt;
Click the Create button to finish creating the mod!&lt;br /&gt;
&lt;br /&gt;
=== Linking to Eco Assemblies ===&lt;br /&gt;
Look for the Solution Explorer on the right-hand side of VS2022. It should look something like this:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note&#039;&#039;&#039;: If the solution explorer isn&#039;t there, open it from the top menu. Click the &#039;&#039;View&#039;&#039; button and select &#039;&#039;Solution Explorer&#039;&#039; from the menu.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Solution Explorer.png|alt=A picture of a basic layout in Visual Studio 2022 with the Solution Explorer open on the right-hand side. The solution explorer is circled in red.|frameless|link=|upright=4|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
From the Solution Explorer, find the &#039;&#039;References&#039;&#039; line and right-click on it. On that menu select &#039;&#039;Manage NuGet packages...&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 Solution Explorer -- Manage NuGet Packages.png|alt=Shows VS2022&#039;s Solution Explorer with project expanded. The References line is highlighted and a menu is open. On that menu the &amp;quot;Manage NuGet Packages&amp;quot; line is highlighted.|frameless|link=|upright=4|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
This will open a new tab. Above the search bar there&#039;s sub-tabs. &#039;&#039;&#039;Select the &#039;&#039;Browse&#039;&#039; sub-tab.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Type &amp;lt;code&amp;gt;Eco.ReferenceAssemblies&amp;lt;/code&amp;gt; into the search bar.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Check the &#039;&#039;Include prerelease&#039;&#039; check-box.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Find the option with the name &#039;&#039;Eco.ReferenceAssemblies&#039;&#039; made by &#039;&#039;StrangeLoopGames&#039;&#039;. Click on it.&lt;br /&gt;
&lt;br /&gt;
A details panel will show up to the right. It will show the version of the reference assemblies being targeted. By default it chooses the latest and can be left at its default.&lt;br /&gt;
&lt;br /&gt;
Click the Install button.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- NuGet Install Eco.ReferenceAssemblies.png|alt=VS2022 is open to the NuGet tab and is searching with the text Eco.ReferenceAssemblies. The checkbox to the right of the search is checked -- include prerelease. The only search result is selected. There is yellow highlights over part of the photo.|frameless|link=|upright=4|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
Click the &#039;&#039;Apply&#039;&#039; button on the popup to finish adding the references.&lt;br /&gt;
&lt;br /&gt;
The reference assemblies have now been added! When coding VS2022 will provide IntelliSense popups. Try it out by going back to the &amp;lt;code&amp;gt;Class1.cs&amp;lt;/code&amp;gt; file and typing &amp;lt;code&amp;gt;Eco.&amp;lt;/code&amp;gt; and you will see suggestion pop up. It’s an essential tool for a lot of modders.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Intellisense.png|alt=Shows a text editor with a basic class file. Inside there&#039;s the text &amp;quot;Eco.&amp;quot; and a menu that show the suggested namespaces within.|frameless|link=|upright=4|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
=== Building The Dynamic Link Library (DLL) ===&lt;br /&gt;
&lt;br /&gt;
==== Building for Development ====&lt;br /&gt;
Building the mod creates the &amp;lt;code&amp;gt;.dll&amp;lt;/code&amp;gt; file that can be used to test with.&lt;br /&gt;
&lt;br /&gt;
To build, open the &#039;&#039;Build&#039;&#039; menu from the top of VS2022.&lt;br /&gt;
&lt;br /&gt;
Select &#039;&#039;Build Solution&#039;&#039;. This will produce non-optimized DLL used for testing and development.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Build Menu.png|alt=VS2022 top menu &amp;quot;Build&amp;quot; is open with &amp;quot;build solution&amp;quot; highlighted (ctrl + shift + b).|frameless|link=|upright=4|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
To find the file VS2022 just built, right click on the project in the Solution Explorer. &lt;br /&gt;
&lt;br /&gt;
Select &#039;&#039;Open Folder in File Explorer.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Project Menu.png|alt=VS2022&#039;s solution explorer is shown with the projects right-click menu open. Highlighted is &amp;quot;Open folder in File Explorer&amp;quot;|frameless|link=|upright=4|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
From here, the mod&#039;s DLL will be in the &amp;lt;code&amp;gt;bin/Debug/net8.0/&amp;lt;/code&amp;gt; folder. The file will be named with mod&#039;s name, like &amp;lt;code&amp;gt;TheMod.dll&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Copy the mod&#039;s DLL file.&lt;br /&gt;
&lt;br /&gt;
Paste it into the folder &amp;lt;code&amp;gt;Eco/Eco_Data/Server/Mods/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
To run a game with that mod &#039;&#039;&#039;create a local world&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
The mod should be running. Check the logs at &amp;lt;code&amp;gt;Eco/Eco_Data/Server/Logs/&amp;lt;/code&amp;gt; to verify. Open the &amp;lt;u&amp;gt;most recent&amp;lt;/u&amp;gt; log file here.&lt;br /&gt;
&lt;br /&gt;
If the mod was loaded it there will be a line mentioning the file-name of the DLL. If the DLL was named &amp;lt;code&amp;gt;TheMod.dll&amp;lt;/code&amp;gt; this is what to look for in the log file:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;[13:55:54.815] [4] [ Info] [Eco] Starting ModKitPlugin                             ...  &lt;br /&gt;
[13:56:27.399] [4] [ Info] [Eco] Starting ModKitPlugin                             ... Finished in 32.584 sec&lt;br /&gt;
 &lt;br /&gt;
[13:56:27.439] [4] [ Info] [Eco] Loading mods                                      ...  &lt;br /&gt;
[13:56:27.439] [9] [ Info] [Eco] Loading TheMod...&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Tip: Setup File Explorer to Sort By Date =====&lt;br /&gt;
It&#039;s suggested to setup the file view to &#039;&#039;Details&#039;&#039; in this folder because it will show the &#039;&#039;Date Modified&#039;&#039; for each file.&lt;br /&gt;
&lt;br /&gt;
[[File:File Explorer -- View Settings Menu.png|alt=Show Window&#039;s File Explorer&#039;s view setting menu with the &amp;quot;details&amp;quot; option highlighted.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
Additionally, clicking on the &#039;&#039;Date Modified&#039;&#039; header sorts all files. Sort it so the most recent is on top and every time the server starts the log file is easily found -- it&#039;s the one on top!&lt;br /&gt;
&lt;br /&gt;
[[File:File Explorer -- Details Example.png|alt=Show&#039;s window&#039;s File Explorer with the date modified header highlighted.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
==== Building for Release ====&lt;br /&gt;
To build for release, click on the mod&#039;s project in the Solution Explorer to highlight it.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Solution Explorer Project Highlight.png|alt=Shows VS2022&#039;s solution explorer with the project highlighted.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
Then, open the &#039;&#039;Build&#039;&#039; menu from the top of VS2022 and select &#039;&#039;Publish Selection&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Set the target &#039;&#039;as Folder&#039;&#039;. Click the &#039;&#039;Next&#039;&#039; button.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Publish Wizard.png|alt=VS2022&#039;s publish wizard showing the target selection screen. The Folder option is highlighted.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
Leave the folder location as default. Click the &#039;&#039;Finish&#039;&#039; button.&lt;br /&gt;
&lt;br /&gt;
Click the &#039;&#039;Close&#039;&#039; button.&lt;br /&gt;
&lt;br /&gt;
Finally, click the &#039;&#039;Publish&#039;&#039; button to start the build.&lt;br /&gt;
&lt;br /&gt;
A green alert will pop up when the build is completed:&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Publish Screen.png|alt=Show&#039;s VS2022 publish screen. There&#039;s publish button at the top of this screen.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Either use the blue links on this page to find the file or browse the project&#039;s files as shown in &amp;quot;Building for Development&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Inside the project, the file will be in &amp;lt;code&amp;gt;bin/Release/net8.0/publish&amp;lt;/code&amp;gt;. The file will be named with the mod project&#039;s name. For example, &amp;lt;code&amp;gt;TheMod.dll&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Since the reference assemblies are already included in the game, do not worry about the other files here.  &lt;br /&gt;
&lt;br /&gt;
To share this mod, the only file needed is the mod&#039;s dll -- &amp;lt;code&amp;gt;TheMod.dll&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Post-Build Scripts: Automatic Copy ===&lt;br /&gt;
With a post-build script VS2022 will automatically copy the files each build. It&#039;s a very nice feature to have when developing and rebuilding every 5 minutes to test something new.&lt;br /&gt;
&lt;br /&gt;
First, add the variables about where &amp;lt;code&amp;gt;EcoServer.exe&amp;lt;/code&amp;gt; is located to the project file.&lt;br /&gt;
&lt;br /&gt;
Right-click on the project in the Solution Explorer and select the &#039;&#039;Edit Project File&#039;&#039; option.&lt;br /&gt;
&lt;br /&gt;
Add the properties &amp;lt;code&amp;gt;EcoServerExe&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;EcoServerDir&amp;lt;/code&amp;gt; &amp;lt;u&amp;gt;inside of the &amp;lt;code&amp;gt;PropertyGroup&amp;lt;/code&amp;gt; tag.&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; Tip: By holding shift and right-clicking on a file in the file explorer an old-school menu pops up. Midway down this menu is an option to &#039;&#039;Copy As Path&#039;&#039;. Neat!&lt;br /&gt;
&lt;br /&gt;
The project file should look something like this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;Project Sdk=&amp;quot;Microsoft.NET.Sdk&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;PropertyGroup&amp;gt;&lt;br /&gt;
    &amp;lt;TargetFramework&amp;gt;net8.0&amp;lt;/TargetFramework&amp;gt;&lt;br /&gt;
    &amp;lt;ImplicitUsings&amp;gt;enable&amp;lt;/ImplicitUsings&amp;gt;&lt;br /&gt;
    &amp;lt;Nullable&amp;gt;enable&amp;lt;/Nullable&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;EcoServerExe&amp;gt;$(EcoServerDir)\EcoServer.exe&amp;lt;/EcoServerExe&amp;gt;&lt;br /&gt;
    &amp;lt;EcoServerDir&amp;gt;C:\Program Files (x86)\Steam\steamapps\common\Eco\Eco_Data\Server&amp;lt;/EcoServerDir&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
  &amp;lt;/PropertyGroup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;ItemGroup&amp;gt;&lt;br /&gt;
    &amp;lt;PackageReference Include=&amp;quot;Eco.ReferenceAssemblies&amp;quot; Version=&amp;quot;0.11.1.13-beta-release-887&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/ItemGroup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/Project&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Next, add the &amp;lt;code&amp;gt;PostBuild&amp;lt;/code&amp;gt; property inside the &amp;lt;code&amp;gt;Project&amp;lt;/code&amp;gt; tag.&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Project Sdk=&amp;quot;Microsoft.NET.Sdk&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;PropertyGroup&amp;gt;&lt;br /&gt;
    ... SNIP ...&lt;br /&gt;
  &amp;lt;/PropertyGroup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;ItemGroup&amp;gt;&lt;br /&gt;
    ... SNIP ...&lt;br /&gt;
  &amp;lt;/ItemGroup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;Target Name=&amp;quot;PostBuild&amp;quot; AfterTargets=&amp;quot;PostBuildEvent&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;Exec Command=&#039;call PostBuild.bat &amp;quot;$(EcoServerDir)&amp;quot; &amp;quot;$(OutDir)&amp;quot; &amp;quot;$(MSBuildProjectName)&amp;quot;&#039;/&amp;gt;&lt;br /&gt;
  &amp;lt;/Target&amp;gt;&lt;br /&gt;
&amp;lt;/Project&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Finally create a new file directly inside the project by right-clicking on the project in the Solution Explorer. Select the &#039;&#039;Add&#039;&#039; and click on &#039;&#039;New Item...&#039;&#039; from the sub-menu.&lt;br /&gt;
&lt;br /&gt;
Use the name &amp;lt;code&amp;gt;PostBuild.bat&amp;lt;/code&amp;gt; for this new file.&lt;br /&gt;
&lt;br /&gt;
Open it and put the following in the PostBuild file:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;batch&amp;quot;&amp;gt;REM reading in arguements to sensible variables&lt;br /&gt;
set serverDir=%1&lt;br /&gt;
set outDir=%2&lt;br /&gt;
set projName=%3&lt;br /&gt;
&lt;br /&gt;
REM removing double-quotes added to variables for concatenation&lt;br /&gt;
set serverDir=%serverDir:&amp;quot;=%&lt;br /&gt;
set outDir=%outDir:&amp;quot;=%&lt;br /&gt;
set projName=%projName:&amp;quot;=%&lt;br /&gt;
&lt;br /&gt;
REM Copy mod dll to Mods dir&lt;br /&gt;
set dllFile=%outDir%%projName%.dll&lt;br /&gt;
echo Copying mod dll file: %dllFile%&lt;br /&gt;
copy &amp;quot;%dllFile%&amp;quot; &amp;quot;%serverDir%\Mods&amp;quot;&lt;br /&gt;
&lt;br /&gt;
REM Copy mod pdb to directory where EcoServer.exe is&lt;br /&gt;
set pdbFile=%outDir%%projName%.pdb&lt;br /&gt;
echo Copying mod pdb file: %pdbFile%&lt;br /&gt;
copy &amp;quot;%pdbFile%&amp;quot; &amp;quot;%serverDir%&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;Now try running a rebuild of the project. The output should report copying files and inside the &amp;lt;code&amp;gt;Eco/Eco_Data/Server/Mods&amp;lt;/code&amp;gt; folder should be &amp;lt;code&amp;gt;TheMod.dll&amp;lt;/code&amp;gt; file&lt;br /&gt;
&lt;br /&gt;
=== Setting up Debugging ===&lt;br /&gt;
&#039;&#039;&#039;Special thanks to Monzun#0606 on Eco&#039;s Discord for helping research the following information.&#039;&#039;&#039;&lt;br /&gt;
To setup debugging, &amp;lt;u&amp;gt;make sure that the project is setup with the post-build script described above&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Debugging is a &amp;lt;u&amp;gt;powerful&amp;lt;/u&amp;gt; tool to a developer and allows the developer to set breakpoints anywhere in the code to stop execution. When execution is stopped the developer can review every variable&#039;s value and incrementally continue the code. This is invaluable when tracking down bugs or trying to understand a complex piece of code.&lt;br /&gt;
&lt;br /&gt;
From the top menu, select &#039;&#039;Debug&#039;&#039; and click on the option &#039;&#039;TheMod Debug Properties&#039;&#039; at the bottom of the menu.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Debug Menu.png|alt=VS2022&#039;s debug menu is open from the top of the application. Highlighted is the last option &amp;quot;Debug Properties&amp;quot;.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
Find the &#039;&#039;Create a new profile&#039;&#039; button &#039;&#039;&#039;in the top-left&#039;&#039;&#039; of this new window. Select &#039;&#039;Executable&#039;&#039; from the drop-down menu.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Debugger Launch Profiles.png|alt=VS2022&#039;s launch profile window is open. Underlined and pointed to by a red mark is the &amp;quot;Create a new profile&amp;quot; button, located in the top-left of the window. Highlighted from the menu under it is the option reading &amp;quot;Executable&amp;quot;.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
Set the &#039;&#039;Executable&#039;&#039; field to the full path to the &amp;lt;code&amp;gt;EcoServer.exe&amp;lt;/code&amp;gt; file. For example, &amp;lt;code&amp;gt;C:\Program Files (x86)\Steam\steamapps\common\Eco\Eco_Data\Server&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;\EcoServer.exe&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Set the &#039;&#039;Working Directory&#039;&#039; field to the full path to the folder containing the &amp;lt;code&amp;gt;EcoServer.exe&amp;lt;/code&amp;gt; file. For example, &amp;lt;code&amp;gt;C:\Program Files (x86)\Steam\steamapps\common\Eco\Eco_Data\Server&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Eco Debugging Profile.png|alt=A fully configured profile ready to debug Eco on VS2022&#039;s launch profile page.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
To use this newly configured profile, switch to it by clicking the small arrow to the right of the play icon (see image).  Select the newly created profile -- &#039;&#039;Profile 1&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Debugger Profile Selection.png|alt=VS2022&#039;s debugger profile selection menu is open with the newly created &amp;quot;Profile 1&amp;quot; highlighted.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
To see how breakpoints work, put the following in &amp;lt;code&amp;gt;Class1.cs&amp;lt;/code&amp;gt; file:&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot;&amp;gt;&lt;br /&gt;
using Eco.Core.Plugins.Interfaces;&lt;br /&gt;
using Eco.Core.Utils;&lt;br /&gt;
using Eco.ModKit;&lt;br /&gt;
&lt;br /&gt;
namespace Test&lt;br /&gt;
{&lt;br /&gt;
    public class Class1 : IModKitPlugin, IInitializablePlugin&lt;br /&gt;
    {&lt;br /&gt;
        public string GetCategory() =&amp;gt; &amp;quot;Tutorial&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        public string GetStatus() =&amp;gt; this._status;&lt;br /&gt;
        string _status = string.Empty;&lt;br /&gt;
&lt;br /&gt;
        public void Initialize(TimedTask timer)&lt;br /&gt;
        {&lt;br /&gt;
            this._status = &amp;quot;Ok&amp;quot;;&lt;br /&gt;
            bool yes = true;&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;This code creates a basic plugin, called &amp;lt;code&amp;gt;Class1&amp;lt;/code&amp;gt;, that Eco will load and initialize on startup. Eco knows to do this because this class inherits the &amp;lt;code&amp;gt;IModKitPlugin&amp;lt;/code&amp;gt; interface (causes it to be loaded) and the &amp;lt;code&amp;gt;IInitializablePlugin&amp;lt;/code&amp;gt; interface (causes it to be initialized).&lt;br /&gt;
&lt;br /&gt;
Add a breakpoint to the code by right-clicking on the line &amp;lt;code&amp;gt;bool yes = true;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Adding a breakpoint.png|alt=A boilerplate example of a mod is shown in the VS2022 text editor. A line has a menu open above it with the option &amp;quot;Breakpoint&amp;quot; expanded and the option &amp;quot;Insert Breakpoint&amp;quot; highlighted on the sub-menu.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
Now hit the play button. The server will start and VS2022 will flash back on screen once Eco tries to initialize the mod&#039;s plugin.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Launch Debugger.png|alt=Highlighted is the play button for VS2022&#039;s debugger. The &amp;quot;Profile 1&amp;quot; is still selected from before.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After a little bit the server will start-up and hit the breakpoint set. When it does VS2022 will keep startup from continuing and allow detailed inspection to happen.&lt;br /&gt;
&lt;br /&gt;
In the bottom left (circled in red) is a table of all of the variables within scope. Use this to see what is happening (especially useful in loops!).&lt;br /&gt;
&lt;br /&gt;
At the middle-top (circled in red) are some of the debugger controls. Clicking the highlighted &#039;&#039;Continue&#039;&#039; button resumes normal operation. Using the buttons to the right that are highlighted will allow the developer to step through the codes execution to see exactly how each line is performing. Debugging is a deep and rich topic that this guide will not explain further, but there&#039;s a great video by Microsoft Visual Studio on YouTube called Basics of Debugging. In that 45 minute video (don&#039;t worry there&#039;s annotations to jump to just what is interesting) a whole gamut of information about how to use debugging is covered.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Debugger LIve.png|alt=Shows a simple plugin&#039;s code in the editor of VS2022. In the bottom-left is a table of all variables used in the function. It is circled in red. On the top of the image also circled in red is the debugger controls. Highlighted within is the continue button and the &amp;quot;step over&amp;quot; button.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
== Releasing a Mod ==&lt;br /&gt;
&lt;br /&gt;
=== Mod.io ===&lt;br /&gt;
&amp;lt;code&amp;gt;mod.io&amp;lt;/code&amp;gt; is where creators share their mods with players and others.&lt;br /&gt;
&lt;br /&gt;
To share a new mod here all that is necessary is an account.&lt;br /&gt;
&lt;br /&gt;
Head over to &amp;lt;code&amp;gt;mod.io/g/eco&amp;lt;/code&amp;gt; and click &#039;&#039;Login&#039;&#039; in the top-right corner. &lt;br /&gt;
&lt;br /&gt;
Finish signing-up with whatever account type you prefer.&lt;br /&gt;
&lt;br /&gt;
Click the &#039;&#039;Add Mod&#039;&#039; button in the top-right.&lt;br /&gt;
&lt;br /&gt;
Follow the upload wizard as directed.&lt;br /&gt;
&lt;br /&gt;
Once on the &#039;&#039;File Manager&#039;&#039; section, a zip file is needed.&lt;br /&gt;
&lt;br /&gt;
Zip the mod&#039;s &amp;lt;u&amp;gt;release&amp;lt;/u&amp;gt; dll and any other assets necessary (e.g. Unity bundles) by putting all the files into a folder. Then right-click on that folder and select &#039;&#039;Compress To...&#039;&#039; and from the sub-menu select &#039;&#039;ZIP file&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Upload that zip file. Considering naming it with a version number to help stay organized (e.g. &#039;&#039;v1&#039;&#039;). Next release, increase that number by 1 (e.g. &#039;&#039;v2&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Congratulations on releasing the mod!&lt;br /&gt;
&lt;br /&gt;
=== Sharing on Discord ===&lt;br /&gt;
Consider posting an ad on the official {{EcoDiscord}}. There&#039;s a channel for mods called &#039;&#039;mod-ads&#039;&#039;. &lt;br /&gt;
Please read the rules before posting.&lt;br /&gt;
&lt;br /&gt;
== Helpful Resources ==&lt;br /&gt;
&lt;br /&gt;
* Consider learning source control (Git). Completely optional, but can help you keep things organized as development continues.&lt;br /&gt;
* Explore Eco’s open-source mod projects for ideas (search on Github &amp;quot;Eco Mods&amp;quot; to find some real-life examples)&lt;br /&gt;
** {{EcoDiscord}}has a channel for mod developers to help one another called &#039;&#039;mod-dev.&#039;&#039; &#039;&#039;&#039;Note:&#039;&#039;&#039; Make under the &#039;&#039;Channel &amp;amp; Roles&#039;&#039; settings you have the 🛠&#039;&#039;Yes, I want to see the channels about modding&#039;&#039; role selected.&lt;/div&gt;</summary>
		<author><name>WugWugg</name></author>
	</entry>
	<entry>
		<id>https://wiki.play.eco/en/index.php?title=Getting_Started_with_Eco_Modding_in_Visual_Studio&amp;diff=16742</id>
		<title>Getting Started with Eco Modding in Visual Studio</title>
		<link rel="alternate" type="text/html" href="https://wiki.play.eco/en/index.php?title=Getting_Started_with_Eco_Modding_in_Visual_Studio&amp;diff=16742"/>
		<updated>2026-04-29T12:01:20Z</updated>

		<summary type="html">&lt;p&gt;WugWugg: Minor wording nitpicks.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
This guide focuses on setting up a C# modding environment in Visual Studio.&lt;br /&gt;
&lt;br /&gt;
It does &#039;&#039;&#039;not&#039;&#039;&#039; cover adding Unity assets (models, prefabs, UI) to the game. See: [[From 3D Asset to Working Worktable]] for that workflow.&lt;br /&gt;
&lt;br /&gt;
This guide won’t teach you how to code or write a mod, but it will help you get everything set up so you’re ready to start learning. Helpful resources are listed at the bottom of this guide, including [[Helpful Examples for Modding]] for practical code examples.&lt;br /&gt;
&lt;br /&gt;
=== Have Ready ===&lt;br /&gt;
* A copy of the Eco game installed&lt;br /&gt;
* A file explorer and the file-path to &amp;lt;code&amp;gt;Eco&amp;lt;/code&amp;gt; folder &#039;&#039;&#039;Tip:&#039;&#039;&#039; Within this folder there&#039;s folders like &amp;lt;code&amp;gt;D3D12&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Eco_Data&amp;lt;/code&amp;gt;. Also, you&#039;ll find the &amp;lt;code&amp;gt;Eco.exe&amp;lt;/code&amp;gt; file here. There are other files and folder here too, but this list is just to help you know what the folder looks like.&lt;br /&gt;
 &lt;br /&gt;
==== Note: Find Folder with Steam ====&lt;br /&gt;
&#039;&#039;&#039;Steam&#039;&#039;&#039; users can find the install folder by right-clicking on the game in your Steam Library:&lt;br /&gt;
&lt;br /&gt;
[[File:Steam Library -- Browse Local Files.png|alt=Shows a Steam Library with a menu open over the Eco game. Highlighted in that menu is a &amp;quot;Manage&amp;quot; option, opening a sub-menu. The sub-menu has &amp;quot;Browse local files&amp;quot; highlighted.|frameless|border|upright=3|location=center|link=]]&lt;br /&gt;
&lt;br /&gt;
== Installing Visual Studio 2022 ==&lt;br /&gt;
Visual Studio 2022 (VS2022) has a completely free to use version called the &#039;&#039;&#039;Community Edition&#039;&#039;&#039;. This guide is written assuming that&#039;s the version used. &lt;br /&gt;
&lt;br /&gt;
Go to https://visualstudio.microsoft.com/downloads/#visual-studio-community-2022 and look for the &amp;quot;&#039;&#039;&#039;Visual Studio Community 2022&#039;&#039;&#039;&amp;quot; download. The download button looks like:&lt;br /&gt;
&lt;br /&gt;
[[File:VisualStudio2022 DownloadPage.png|alt=A picture of a website showing a row. The first column has the name &amp;quot;Visual Studio Community 2022&amp;quot; and there&#039;s a &amp;quot;Download&amp;quot; button two columns to the right, past it&#039;s description text.|frameless|location=center|link=|border|upright=4]]&lt;br /&gt;
&lt;br /&gt;
Start the download by clicking on the Download button.&lt;br /&gt;
&lt;br /&gt;
Run the installer until it reaches to the Workloads page. On this page, select these workloads:&lt;br /&gt;
* &#039;&#039;&#039;.NET desktop development&#039;&#039;&#039; -- Required for any mod development&lt;br /&gt;
* ASP.NET and web development -- Optional. If you want to interact with external websites or Eco&#039;s own web server (e.g. Discord&#039;s webhooks or extending the API)&lt;br /&gt;
&#039;&#039;&#039;Note&#039;&#039;&#039;: Using the Workloads installation page is easy, but will install a few extra things (e.g. Github Copilot). If you want &#039;&#039;&#039;to keep the tooling minimal&#039;&#039;&#039; you can just install .NET from &amp;lt;code&amp;gt;dotnet.microsoft.com/en-us/download&amp;lt;/code&amp;gt;. &amp;lt;u&amp;gt;At the time of writing&amp;lt;/u&amp;gt;, Eco supports &#039;&#039;&#039;.NET version 8.0&#039;&#039;&#039;. See the later section [https://wiki.play.eco/en/index.php?title=Getting_Started_with_Eco_Modding_in_Visual_Studio_2022&amp;amp;veaction=edit&amp;amp;section=7 .NET Version] of this guide to learn how to check if that has changed.&lt;br /&gt;
&lt;br /&gt;
This is what the Workloads page looks like with those options selected:&lt;br /&gt;
&lt;br /&gt;
[[File:VisualStudioCommunity2022 Workloads.png|alt=Workloads screen during VS2022 installation. Options selected are &amp;quot;ASP.NET and web development&amp;quot; and &amp;quot;.NET desktop development&amp;quot;. |frameless|location=center|upright=4|link=|border]]&lt;br /&gt;
&lt;br /&gt;
Click the Install button. It will take a few minutes to complete installation. By default, it should launch VS2022 after it installs.&lt;br /&gt;
&lt;br /&gt;
It will ask you to sign in. &#039;&#039;&#039;You do not need to&#039;&#039;&#039; and can completely avoid this by clicking the &#039;&#039;Skip and add accounts later&#039;&#039; option in tiny text below the buttons. &lt;br /&gt;
&lt;br /&gt;
If you plan to upload your mod to Github, VS2022 does have integrated support for Github. So consider signing in with Github to make that process easier.&lt;br /&gt;
&lt;br /&gt;
This guide is continuing as if the &#039;&#039;Skip and add accounts later&#039;&#039; option was selected. Finally, it might ask what color theme you&#039;d like. Select your preference and continue. &lt;br /&gt;
&lt;br /&gt;
Installation Complete!&lt;br /&gt;
&lt;br /&gt;
== The Mod ==&lt;br /&gt;
&lt;br /&gt;
Once Eco and Visual Studio are installed all of the tools needed to code, build, and run a mod are ready.&lt;br /&gt;
&lt;br /&gt;
=== Creating a New Project ===&lt;br /&gt;
&lt;br /&gt;
When VS2022 first opens it will show you a dashboard where you can quickly select what you want to do. On the left, are any recent projects opened. There won&#039;t be any if this is the first time installing it. &lt;br /&gt;
&lt;br /&gt;
On the right there will be a few options, from here select the &#039;&#039;Create a new project&#039;&#039; option.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 OpeningDashboard.png|alt=VS2022&#039;s launch dashboard showing recent projects on the left and quick action buttons on the right. Highlighted is a button titled &amp;quot;Create a new project&amp;quot;.|frameless|border|link=|location=center|upright=4]]&lt;br /&gt;
&lt;br /&gt;
Now, it&#039;s time to go through the new project wizard. First, the wizard asks what kind of project is being made. &lt;br /&gt;
&lt;br /&gt;
To mod Eco we need to make a &#039;&#039;&#039;C# Class Library&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
To find the template, search &amp;lt;code&amp;gt;C# library&amp;lt;/code&amp;gt; in the search bar. Select the C# option titled &#039;&#039;Class Library&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
It&#039;s important to &#039;&#039;&#039;pay attention to the icon and chips&#039;&#039;&#039; below the title and description. Make sure you &#039;&#039;&#039;select the &amp;lt;code&amp;gt;C#&amp;lt;/code&amp;gt; option&#039;&#039;&#039; as there are other options similarly named &#039;&#039;Class Library&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 NewProjectWizard Templates.png|frameless|border|location=center|upright=4|link=]]&lt;br /&gt;
&lt;br /&gt;
The next page will ask you what the Project Name should be. Type the name of the mod being created.&lt;br /&gt;
&lt;br /&gt;
The other options like the Location and the Solution Name do not need edited. &lt;br /&gt;
&lt;br /&gt;
Leave the box &#039;&#039;Place solution and project in the same directory&#039;&#039; unchecked.&lt;br /&gt;
&lt;br /&gt;
Click the Next button and continue along in the next section of this guide.&lt;br /&gt;
&lt;br /&gt;
=== .NET Version ===&lt;br /&gt;
&amp;lt;u&amp;gt;As of April of 2026&amp;lt;/u&amp;gt;, &#039;&#039;&#039;Eco targets .NET 10.0&#039;&#039;&#039; and the mod should too.&lt;br /&gt;
&lt;br /&gt;
It&#039;s suggested to confirm the version of .NET that Eco uses by looking at the .NET version the reference assemblies use.&lt;br /&gt;
&lt;br /&gt;
The reference assemblies can be found on the NuGet Gallery by searching for &amp;lt;code&amp;gt;Eco.ReferenceAssemblies&amp;lt;/code&amp;gt;. See: &amp;lt;code&amp;gt;www.nuget.org/packages?q=Eco.ReferenceAssemblies&amp;lt;/code&amp;gt;&amp;lt;!-- I&#039;m not directly linking to the package as there is no way to link to the latest version. So as a workaround I&#039;m using the search to point the reader to the latest version. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Find the package with the name &#039;&#039;Eco.ReferenceAssemblies&#039;&#039; made by &#039;&#039;StrangeLoopGames&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
There will be a chip underneath of it with the &#039;&#039;.NET&#039;&#039; version it targets. This is what that page looks like:&lt;br /&gt;
&lt;br /&gt;
[[File:NuGetGallery -- Eco.ReferenceAssemblies Search.png|alt=Shows the search result of Eco.ReferenceAssemblies. In a blue chip the text &amp;quot;.NET 8.0&amp;quot; can be seen.|frameless|upright=4|location=center|link=|border]]&lt;br /&gt;
&lt;br /&gt;
By clicking on that search result (shown above), a more detailed page opens is show. Again, there&#039;s chips showing what version of .NET to use:&lt;br /&gt;
&lt;br /&gt;
[[File:NuGetGallery--Eco.ReferenceAssemblies Details.png|alt=Show the package page for &amp;quot;Eco.ReferenceAssemblies&amp;quot; on NuGet Gallery. Circled in red are two chips with some version of the text &amp;quot;.NET 8.0&amp;quot; inside them.|frameless|link=|border|location=center|upright=3]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Back to VS2022&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
On the Additional Information page, there&#039;s the Framework drop-down. Select the same version of .NET Eco uses (as described above).&lt;br /&gt;
&lt;br /&gt;
Click the Create button to finish creating the mod!&lt;br /&gt;
&lt;br /&gt;
=== Linking to Eco Assemblies ===&lt;br /&gt;
Look for the Solution Explorer on the right-hand side of VS2022. It should look something like this:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note&#039;&#039;&#039;: If the solution explorer isn&#039;t there, open it from the top menu. Click the &#039;&#039;View&#039;&#039; button and select &#039;&#039;Solution Explorer&#039;&#039; from the menu.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Solution Explorer.png|alt=A picture of a basic layout in Visual Studio 2022 with the Solution Explorer open on the right-hand side. The solution explorer is circled in red.|frameless|link=|upright=4|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
From the Solution Explorer, find the &#039;&#039;References&#039;&#039; line and right-click on it. On that menu select &#039;&#039;Manage NuGet packages...&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 Solution Explorer -- Manage NuGet Packages.png|alt=Shows VS2022&#039;s Solution Explorer with project expanded. The References line is highlighted and a menu is open. On that menu the &amp;quot;Manage NuGet Packages&amp;quot; line is highlighted.|frameless|link=|upright=4|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
This will open a new tab. Above the search bar there&#039;s sub-tabs. &#039;&#039;&#039;Select the &#039;&#039;Browse&#039;&#039; sub-tab.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Type &amp;lt;code&amp;gt;Eco.ReferenceAssemblies&amp;lt;/code&amp;gt; into the search bar.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Check the &#039;&#039;Include prerelease&#039;&#039; check-box.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Find the option with the name &#039;&#039;Eco.ReferenceAssemblies&#039;&#039; made by &#039;&#039;StrangeLoopGames&#039;&#039;. Click on it.&lt;br /&gt;
&lt;br /&gt;
A details panel will show up to the right. It will show the version of the reference assemblies being targeted. By default it chooses the latest and can be left at its default.&lt;br /&gt;
&lt;br /&gt;
Click the Install button.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- NuGet Install Eco.ReferenceAssemblies.png|alt=VS2022 is open to the NuGet tab and is searching with the text Eco.ReferenceAssemblies. The checkbox to the right of the search is checked -- include prerelease. The only search result is selected. There is yellow highlights over part of the photo.|frameless|link=|upright=4|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
Click the &#039;&#039;Apply&#039;&#039; button on the popup to finish adding the references.&lt;br /&gt;
&lt;br /&gt;
The reference assemblies have now been added! When coding VS2022 will provide IntelliSense popups. Try it out by going back to the &amp;lt;code&amp;gt;Class1.cs&amp;lt;/code&amp;gt; file and typing &amp;lt;code&amp;gt;Eco.&amp;lt;/code&amp;gt; and you will see suggestion pop up. It’s an essential tool for a lot of modders.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Intellisense.png|alt=Shows a text editor with a basic class file. Inside there&#039;s the text &amp;quot;Eco.&amp;quot; and a menu that show the suggested namespaces within.|frameless|link=|upright=4|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
=== Building The Dynamic Link Library (DLL) ===&lt;br /&gt;
&lt;br /&gt;
==== Building for Development ====&lt;br /&gt;
Building the mod creates the &amp;lt;code&amp;gt;.dll&amp;lt;/code&amp;gt; file that can be used to test with.&lt;br /&gt;
&lt;br /&gt;
To build, open the &#039;&#039;Build&#039;&#039; menu from the top of VS2022.&lt;br /&gt;
&lt;br /&gt;
Select &#039;&#039;Build Solution&#039;&#039;. This will produce non-optimized DLL used for testing and development.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Build Menu.png|alt=VS2022 top menu &amp;quot;Build&amp;quot; is open with &amp;quot;build solution&amp;quot; highlighted (ctrl + shift + b).|frameless|link=|upright=4|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
To find the file VS2022 just built, right click on the project in the Solution Explorer. &lt;br /&gt;
&lt;br /&gt;
Select &#039;&#039;Open Folder in File Explorer.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Project Menu.png|alt=VS2022&#039;s solution explorer is shown with the projects right-click menu open. Highlighted is &amp;quot;Open folder in File Explorer&amp;quot;|frameless|link=|upright=4|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
From here, the mod&#039;s DLL will be in the &amp;lt;code&amp;gt;bin/Debug/net8.0/&amp;lt;/code&amp;gt; folder. The file will be named with mod&#039;s name, like &amp;lt;code&amp;gt;TheMod.dll&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Copy the mod&#039;s DLL file.&lt;br /&gt;
&lt;br /&gt;
Paste it into the folder &amp;lt;code&amp;gt;Eco/Eco_Data/Server/Mods/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
To run a game with that mod &#039;&#039;&#039;create a local world&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
The mod should be running. Check the logs at &amp;lt;code&amp;gt;Eco/Eco_Data/Server/Logs/&amp;lt;/code&amp;gt; to verify. Open the &amp;lt;u&amp;gt;most recent&amp;lt;/u&amp;gt; log file here.&lt;br /&gt;
&lt;br /&gt;
If the mod was loaded it there will be a line mentioning the file-name of the DLL. If the DLL was named &amp;lt;code&amp;gt;TheMod.dll&amp;lt;/code&amp;gt; this is what to look for in the log file:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;[13:55:54.815] [4] [ Info] [Eco] Starting ModKitPlugin                             ...  &lt;br /&gt;
[13:56:27.399] [4] [ Info] [Eco] Starting ModKitPlugin                             ... Finished in 32.584 sec&lt;br /&gt;
 &lt;br /&gt;
[13:56:27.439] [4] [ Info] [Eco] Loading mods                                      ...  &lt;br /&gt;
[13:56:27.439] [9] [ Info] [Eco] Loading TheMod...&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Tip: Setup File Explorer to Sort By Date =====&lt;br /&gt;
It&#039;s suggested to setup the file view to &#039;&#039;Details&#039;&#039; in this folder because it will show the &#039;&#039;Date Modified&#039;&#039; for each file.&lt;br /&gt;
&lt;br /&gt;
[[File:File Explorer -- View Settings Menu.png|alt=Show Window&#039;s File Explorer&#039;s view setting menu with the &amp;quot;details&amp;quot; option highlighted.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
Additionally, clicking on the &#039;&#039;Date Modified&#039;&#039; header sorts all files. Sort it so the most recent is on top and every time the server starts the log file is easily found -- it&#039;s the one on top!&lt;br /&gt;
&lt;br /&gt;
[[File:File Explorer -- Details Example.png|alt=Show&#039;s window&#039;s File Explorer with the date modified header highlighted.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
==== Building for Release ====&lt;br /&gt;
To build for release, click on the mod&#039;s project in the Solution Explorer to highlight it.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Solution Explorer Project Highlight.png|alt=Shows VS2022&#039;s solution explorer with the project highlighted.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
Then, open the &#039;&#039;Build&#039;&#039; menu from the top of VS2022 and select &#039;&#039;Publish Selection&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Set the target &#039;&#039;as Folder&#039;&#039;. Click the &#039;&#039;Next&#039;&#039; button.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Publish Wizard.png|alt=VS2022&#039;s publish wizard showing the target selection screen. The Folder option is highlighted.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
Leave the folder location as default. Click the &#039;&#039;Finish&#039;&#039; button.&lt;br /&gt;
&lt;br /&gt;
Click the &#039;&#039;Close&#039;&#039; button.&lt;br /&gt;
&lt;br /&gt;
Finally, click the &#039;&#039;Publish&#039;&#039; button to start the build.&lt;br /&gt;
&lt;br /&gt;
A green alert will pop up when the build is completed:&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Publish Screen.png|alt=Show&#039;s VS2022 publish screen. There&#039;s publish button at the top of this screen.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Either use the blue links on this page to find the file or browse the project&#039;s files as shown in &amp;quot;Building for Development&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Inside the project, the file will be in &amp;lt;code&amp;gt;bin/Release/net8.0/publish&amp;lt;/code&amp;gt;. The file will be named with the mod project&#039;s name. For example, &amp;lt;code&amp;gt;TheMod.dll&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Since the reference assemblies are already included in the game, do not worry about the other files here.  &lt;br /&gt;
&lt;br /&gt;
To share this mod, the only file needed is the mod&#039;s dll -- &amp;lt;code&amp;gt;TheMod.dll&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Post-Build Scripts: Automatic Copy ===&lt;br /&gt;
With a post-build script VS2022 will automatically copy the files each build. It&#039;s a very nice feature to have when developing and rebuilding every 5 minutes to test something new.&lt;br /&gt;
&lt;br /&gt;
First, add the variables about where &amp;lt;code&amp;gt;EcoServer.exe&amp;lt;/code&amp;gt; is located to the project file.&lt;br /&gt;
&lt;br /&gt;
Right-click on the project in the Solution Explorer and select the &#039;&#039;Edit Project File&#039;&#039; option.&lt;br /&gt;
&lt;br /&gt;
Add the properties &amp;lt;code&amp;gt;EcoServerExe&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;EcoServerDir&amp;lt;/code&amp;gt; &amp;lt;u&amp;gt;inside of the &amp;lt;code&amp;gt;PropertyGroup&amp;lt;/code&amp;gt; tag.&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; Tip: By holding shift and right-clicking on a file in the file explorer an old-school menu pops up. Midway down this menu is an option to &#039;&#039;Copy As Path&#039;&#039;. Neat!&lt;br /&gt;
&lt;br /&gt;
The project file should look something like this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;Project Sdk=&amp;quot;Microsoft.NET.Sdk&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;PropertyGroup&amp;gt;&lt;br /&gt;
    &amp;lt;TargetFramework&amp;gt;net8.0&amp;lt;/TargetFramework&amp;gt;&lt;br /&gt;
    &amp;lt;ImplicitUsings&amp;gt;enable&amp;lt;/ImplicitUsings&amp;gt;&lt;br /&gt;
    &amp;lt;Nullable&amp;gt;enable&amp;lt;/Nullable&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;EcoServerExe&amp;gt;$(EcoServerDir)\EcoServer.exe&amp;lt;/EcoServerExe&amp;gt;&lt;br /&gt;
    &amp;lt;EcoServerDir&amp;gt;C:\Program Files (x86)\Steam\steamapps\common\Eco\Eco_Data\Server&amp;lt;/EcoServerDir&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
  &amp;lt;/PropertyGroup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;ItemGroup&amp;gt;&lt;br /&gt;
    &amp;lt;PackageReference Include=&amp;quot;Eco.ReferenceAssemblies&amp;quot; Version=&amp;quot;0.11.1.13-beta-release-887&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/ItemGroup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/Project&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Next, add the &amp;lt;code&amp;gt;PostBuild&amp;lt;/code&amp;gt; property inside the &amp;lt;code&amp;gt;Project&amp;lt;/code&amp;gt; tag.&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Project Sdk=&amp;quot;Microsoft.NET.Sdk&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;PropertyGroup&amp;gt;&lt;br /&gt;
    ... SNIP ...&lt;br /&gt;
  &amp;lt;/PropertyGroup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;ItemGroup&amp;gt;&lt;br /&gt;
    ... SNIP ...&lt;br /&gt;
  &amp;lt;/ItemGroup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;Target Name=&amp;quot;PostBuild&amp;quot; AfterTargets=&amp;quot;PostBuildEvent&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;Exec Command=&#039;call PostBuild.bat &amp;quot;$(EcoServerDir)&amp;quot; &amp;quot;$(OutDir)&amp;quot; &amp;quot;$(MSBuildProjectName)&amp;quot;&#039;/&amp;gt;&lt;br /&gt;
  &amp;lt;/Target&amp;gt;&lt;br /&gt;
&amp;lt;/Project&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Finally create a new file directly inside the project by right-clicking on the project in the Solution Explorer. Select the &#039;&#039;Add&#039;&#039; and click on &#039;&#039;New Item...&#039;&#039; from the sub-menu.&lt;br /&gt;
&lt;br /&gt;
Use the name &amp;lt;code&amp;gt;PostBuild.bat&amp;lt;/code&amp;gt; for this new file.&lt;br /&gt;
&lt;br /&gt;
Open it and put the following in the PostBuild file:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;batch&amp;quot;&amp;gt;REM reading in arguements to sensible variables&lt;br /&gt;
set serverDir=%1&lt;br /&gt;
set outDir=%2&lt;br /&gt;
set projName=%3&lt;br /&gt;
&lt;br /&gt;
REM removing double-quotes added to variables for concatenation&lt;br /&gt;
set serverDir=%serverDir:&amp;quot;=%&lt;br /&gt;
set outDir=%outDir:&amp;quot;=%&lt;br /&gt;
set projName=%projName:&amp;quot;=%&lt;br /&gt;
&lt;br /&gt;
REM Copy mod dll to Mods dir&lt;br /&gt;
set dllFile=%outDir%%projName%.dll&lt;br /&gt;
echo Copying mod dll file: %dllFile%&lt;br /&gt;
copy &amp;quot;%dllFile%&amp;quot; &amp;quot;%serverDir%\Mods&amp;quot;&lt;br /&gt;
&lt;br /&gt;
REM Copy mod pdb to directory where EcoServer.exe is&lt;br /&gt;
set pdbFile=%outDir%%projName%.pdb&lt;br /&gt;
echo Copying mod pdb file: %pdbFile%&lt;br /&gt;
copy &amp;quot;%pdbFile%&amp;quot; &amp;quot;%serverDir%&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;Now try running a rebuild of the project. The output should report copying files and inside the &amp;lt;code&amp;gt;Eco/Eco_Data/Server/Mods&amp;lt;/code&amp;gt; folder should be &amp;lt;code&amp;gt;TheMod.dll&amp;lt;/code&amp;gt; file&lt;br /&gt;
&lt;br /&gt;
=== Setting up Debugging ===&lt;br /&gt;
&#039;&#039;&#039;Special thanks to Monzun#0606 on Eco&#039;s Discord for helping research the following information.&#039;&#039;&#039;&lt;br /&gt;
To setup debugging, &amp;lt;u&amp;gt;make sure that the project is setup with the post-build script described above&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Debugging is a &amp;lt;u&amp;gt;powerful&amp;lt;/u&amp;gt; tool to a developer and allows the developer to set breakpoints anywhere in the code to stop execution. When execution is stopped the developer can review every variable&#039;s value and incrementally continue the code. This is invaluable when tracking down bugs or trying to understand a complex piece of code.&lt;br /&gt;
&lt;br /&gt;
From the top menu, select &#039;&#039;Debug&#039;&#039; and click on the option &#039;&#039;TheMod Debug Properties&#039;&#039; at the bottom of the menu.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Debug Menu.png|alt=VS2022&#039;s debug menu is open from the top of the application. Highlighted is the last option &amp;quot;Debug Properties&amp;quot;.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
Find the &#039;&#039;Create a new profile&#039;&#039; button &#039;&#039;&#039;in the top-left&#039;&#039;&#039; of this new window. Select &#039;&#039;Executable&#039;&#039; from the drop-down menu.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Debugger Launch Profiles.png|alt=VS2022&#039;s launch profile window is open. Underlined and pointed to by a red mark is the &amp;quot;Create a new profile&amp;quot; button, located in the top-left of the window. Highlighted from the menu under it is the option reading &amp;quot;Executable&amp;quot;.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
Set the &#039;&#039;Executable&#039;&#039; field to the full path to the &amp;lt;code&amp;gt;EcoServer.exe&amp;lt;/code&amp;gt; file. For example, &amp;lt;code&amp;gt;C:\Program Files (x86)\Steam\steamapps\common\Eco\Eco_Data\Server&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;\EcoServer.exe&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Set the &#039;&#039;Working Directory&#039;&#039; field to the full path to the folder containing the &amp;lt;code&amp;gt;EcoServer.exe&amp;lt;/code&amp;gt; file. For example, &amp;lt;code&amp;gt;C:\Program Files (x86)\Steam\steamapps\common\Eco\Eco_Data\Server&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Eco Debugging Profile.png|alt=A fully configured profile ready to debug Eco on VS2022&#039;s launch profile page.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
To use this newly configured profile, switch to it by clicking the small arrow to the right of the play icon (see image).  Select the newly created profile -- &#039;&#039;Profile 1&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Debugger Profile Selection.png|alt=VS2022&#039;s debugger profile selection menu is open with the newly created &amp;quot;Profile 1&amp;quot; highlighted.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
To see how breakpoints work, put the following in &amp;lt;code&amp;gt;Class1.cs&amp;lt;/code&amp;gt; file:&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot;&amp;gt;&lt;br /&gt;
using Eco.Core.Plugins.Interfaces;&lt;br /&gt;
using Eco.Core.Utils;&lt;br /&gt;
using Eco.ModKit;&lt;br /&gt;
&lt;br /&gt;
namespace Test&lt;br /&gt;
{&lt;br /&gt;
    public class Class1 : IModKitPlugin, IInitializablePlugin&lt;br /&gt;
    {&lt;br /&gt;
        public string GetCategory() =&amp;gt; &amp;quot;Tutorial&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        public string GetStatus() =&amp;gt; this._status;&lt;br /&gt;
        string _status = string.Empty;&lt;br /&gt;
&lt;br /&gt;
        public void Initialize(TimedTask timer)&lt;br /&gt;
        {&lt;br /&gt;
            this._status = &amp;quot;Ok&amp;quot;;&lt;br /&gt;
            bool yes = true;&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;This code creates a basic plugin, called &amp;lt;code&amp;gt;Class1&amp;lt;/code&amp;gt;, that Eco will load and initialize on startup. Eco knows to do this because this class inherits the &amp;lt;code&amp;gt;IModKitPlugin&amp;lt;/code&amp;gt; interface (causes it to be loaded) and the &amp;lt;code&amp;gt;IInitializablePlugin&amp;lt;/code&amp;gt; interface (causes it to be initialized).&lt;br /&gt;
&lt;br /&gt;
Add a breakpoint to the code by right-clicking on the line &amp;lt;code&amp;gt;bool yes = true;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Adding a breakpoint.png|alt=A boilerplate example of a mod is shown in the VS2022 text editor. A line has a menu open above it with the option &amp;quot;Breakpoint&amp;quot; expanded and the option &amp;quot;Insert Breakpoint&amp;quot; highlighted on the sub-menu.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
Now hit the play button. The server will start and VS2022 will flash back on screen once Eco tries to initialize the mod&#039;s plugin.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Launch Debugger.png|alt=Highlighted is the play button for VS2022&#039;s debugger. The &amp;quot;Profile 1&amp;quot; is still selected from before.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After a little bit the server will start-up and hit the breakpoint set. When it does VS2022 will keep startup from continuing and allow detailed inspection to happen.&lt;br /&gt;
&lt;br /&gt;
In the bottom left (circled in red) is a table of all of the variables within scope. Use this to see what is happening (especially useful in loops!).&lt;br /&gt;
&lt;br /&gt;
At the middle-top (circled in red) are some of the debugger controls. Clicking the highlighted &#039;&#039;Continue&#039;&#039; button resumes normal operation. Using the buttons to the right that are highlighted will allow the developer to step through the codes execution to see exactly how each line is performing. Debugging is a deep and rich topic that this guide will not explain further, but there&#039;s a great video by Microsoft Visual Studio on YouTube called Basics of Debugging. In that 45 minute video (don&#039;t worry there&#039;s annotations to jump to just what is interesting) a whole gamut of information about how to use debugging is covered.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Debugger LIve.png|alt=Shows a simple plugin&#039;s code in the editor of VS2022. In the bottom-left is a table of all variables used in the function. It is circled in red. On the top of the image also circled in red is the debugger controls. Highlighted within is the continue button and the &amp;quot;step over&amp;quot; button.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
== Releasing a Mod ==&lt;br /&gt;
&lt;br /&gt;
=== Mod.io ===&lt;br /&gt;
&amp;lt;code&amp;gt;mod.io&amp;lt;/code&amp;gt; is where creators share their mods with players and others.&lt;br /&gt;
&lt;br /&gt;
To share a new mod here all that is necessary is an account.&lt;br /&gt;
&lt;br /&gt;
Head over to &amp;lt;code&amp;gt;mod.io/g/eco&amp;lt;/code&amp;gt; and click &#039;&#039;Login&#039;&#039; in the top-right corner. &lt;br /&gt;
&lt;br /&gt;
Finish signing-up with whatever account type you prefer.&lt;br /&gt;
&lt;br /&gt;
Click the &#039;&#039;Add Mod&#039;&#039; button in the top-right.&lt;br /&gt;
&lt;br /&gt;
Follow the upload wizard as directed.&lt;br /&gt;
&lt;br /&gt;
Once on the &#039;&#039;File Manager&#039;&#039; section, a zip file is needed.&lt;br /&gt;
&lt;br /&gt;
Zip the mod&#039;s &amp;lt;u&amp;gt;release&amp;lt;/u&amp;gt; dll and any other assets necessary (e.g. Unity bundles) by putting all the files into a folder. Then right-click on that folder and select &#039;&#039;Compress To...&#039;&#039; and from the sub-menu select &#039;&#039;ZIP file&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Upload that zip file. Considering naming it with a version number to help stay organized (e.g. &#039;&#039;v1&#039;&#039;). Next release, increase that number by 1 (e.g. &#039;&#039;v2&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Congratulations on releasing the mod!&lt;br /&gt;
&lt;br /&gt;
=== Sharing on Discord ===&lt;br /&gt;
Consider posting an ad on the official {{EcoDiscord}}. There&#039;s a channel for mods called &#039;&#039;mod-ads&#039;&#039;. &lt;br /&gt;
Please read the rules before posting.&lt;br /&gt;
&lt;br /&gt;
== Helpful Resources ==&lt;br /&gt;
&lt;br /&gt;
* Consider learning source control (Git). Completely optional, but can help you keep things organized as development continues.&lt;br /&gt;
* Explore Eco’s open-source mod projects for ideas (search on Github &amp;quot;Eco Mods&amp;quot; to find some real-life examples)&lt;br /&gt;
** {{EcoDiscord}}has a channel for mod developers to help one another called &#039;&#039;mod-dev.&#039;&#039; &#039;&#039;&#039;Note:&#039;&#039;&#039; Make under the &#039;&#039;Channel &amp;amp; Roles&#039;&#039; settings you have the 🛠&#039;&#039;Yes, I want to see the channels about modding&#039;&#039; role selected.&lt;/div&gt;</summary>
		<author><name>WugWugg</name></author>
	</entry>
	<entry>
		<id>https://wiki.play.eco/en/index.php?title=Mod_Development&amp;diff=16741</id>
		<title>Mod Development</title>
		<link rel="alternate" type="text/html" href="https://wiki.play.eco/en/index.php?title=Mod_Development&amp;diff=16741"/>
		<updated>2026-04-29T11:36:02Z</updated>

		<summary type="html">&lt;p&gt;WugWugg: /* Player Contributed Written Guides */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;container-fluid&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;[[File:EcoModKit.jpg|class=headbanner|link=]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
NOTE: The modding system is under heavy development. APIs are expected to change, which may break existing mods! &lt;br /&gt;
Feel free to update any information on this wiki that is out of date.&lt;br /&gt;
&lt;br /&gt;
To get started on developing mods, see [[Installing the ModKit]]. For some example mods, see the [https://github.com/StrangeLoopGames/EcoModKit EcoModKit] repository.&lt;br /&gt;
== Documentation ==&lt;br /&gt;
Documentation of the server and game client code is available at [https://docs.play.eco https://docs.play.eco]. This is updated when the game is released to the latest version.&lt;br /&gt;
== Discord ==&lt;br /&gt;
You can discuss mods and modding on the {{EcoDiscord}}.&lt;br /&gt;
&lt;br /&gt;
We have multiple channels:&lt;br /&gt;
* &#039;&#039;&#039;#mod-ads&#039;&#039;&#039; for advertising your own mods.&lt;br /&gt;
* &#039;&#039;&#039;#mod-dev&#039;&#039;&#039; for talk about the development of mods.&lt;br /&gt;
* &#039;&#039;&#039;#mod-talk&#039;&#039;&#039; for general talk about mods, such as what existing mods to use or how to make basic changes to the game.&lt;br /&gt;
* &#039;&#039;&#039;#mod-help&#039;&#039;&#039; for issues with mods.&lt;br /&gt;
== Tools ==&lt;br /&gt;
{{SLG}} recommends using the latest versions of Visual Studio and Unity.&lt;br /&gt;
* [https://visualstudio.microsoft.com/downloads/ Visual Studio 2022 Community edition] (free)&lt;br /&gt;
* See [https://unity3d.com/get-unity/download/archive Unity Downloads] to download the version of Unity that matches the ProjectVersion.txt in the modkit you are using.&lt;br /&gt;
&lt;br /&gt;
== Official Guides ==&lt;br /&gt;
[[Installing the ModKit]]&lt;br /&gt;
&lt;br /&gt;
You can now &#039;&#039;&#039;earn a cut of every transaction in worlds that use your mods&#039;&#039;&#039;!  Follow this guide to set it up: [[Registered Mods]]&lt;br /&gt;
&lt;br /&gt;
Modkit examples&lt;br /&gt;
* [[Corn-on-the-cob example mod]]&lt;br /&gt;
* [[Flag example mod]]&lt;br /&gt;
== Player Contributed Written Guides ==&lt;br /&gt;
* [https://docs.google.com/document/d/1zQFcIxWZcPSZgc3PzbsXHj373Z_ndUW_Q7HfI3iFV5E/ FZM. Eco Mod Tutorial: Creating New Constructable Blocks]&lt;br /&gt;
* [https://docs.google.com/document/d/1SGDqJoKlHYL16j94L5jISO8281w-uoKuQeAm9KcUOmY/ Eco Mod Tutorial: The Item Class]&lt;br /&gt;
* [[Getting Started with Eco Modding in Visual Studio]]&lt;br /&gt;
* [[Helpful Examples for Modding]]&lt;br /&gt;
* [[From 3D Asset to Working Worktable]]&lt;br /&gt;
== Player Contributed Video Guides ==&lt;br /&gt;
&amp;lt;youtube dimensions=&amp;quot;400x240&amp;quot; description=&amp;quot;Getting Setup To Make Mods In Eco&amp;quot; container=&amp;quot;frame&amp;quot;&amp;gt;VamhpTr-wG8&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&amp;lt;youtube dimensions=&amp;quot;400x240&amp;quot; description=&amp;quot;Making Your First Item In Eco&amp;quot; container=&amp;quot;frame&amp;quot;&amp;gt;By75wsj_R2o&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&amp;lt;youtube dimensions=&amp;quot;400x240&amp;quot; description=&amp;quot;Making Your First Item PT2 - World Objects (Unity)&amp;quot; container=&amp;quot;frame&amp;quot;&amp;gt;-4JcxeB27jU&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&amp;lt;youtube dimensions=&amp;quot;400x240&amp;quot; description=&amp;quot;Using Other Mods within Your Own Mod&amp;quot; container=&amp;quot;frame&amp;quot;&amp;gt;hu-Jsk67vdw&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Other Resources ==&lt;br /&gt;
* [https://github.com/StrangeLoopGames/EcoModKit Eco Modkit] (check Wiki tab for documentation)&lt;br /&gt;
* [https://github.com/StrangeLoopGames/EcoModKit/wiki/Tutorial-Ceiling-Fan-Light Tutorial: Ceiling Fan Light]&lt;br /&gt;
[[Category: Modding]]&lt;/div&gt;</summary>
		<author><name>WugWugg</name></author>
	</entry>
	<entry>
		<id>https://wiki.play.eco/en/index.php?title=From_3D_Asset_to_Working_Worktable&amp;diff=16739</id>
		<title>From 3D Asset to Working Worktable</title>
		<link rel="alternate" type="text/html" href="https://wiki.play.eco/en/index.php?title=From_3D_Asset_to_Working_Worktable&amp;diff=16739"/>
		<updated>2026-04-29T00:29:04Z</updated>

		<summary type="html">&lt;p&gt;WugWugg: /* Checkpoint */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction =&lt;br /&gt;
Below is a guide on how to take an 3D asset from the Unity Store and make a working workbench in Eco. This includes:&lt;br /&gt;
* Creating a recipe to craft the modded table&lt;br /&gt;
* Creating recipes so the player can use the modded table to craft something&lt;br /&gt;
* Using Blender to generate a modded icon (seen when holding it in inventory)&lt;br /&gt;
* Using Blender to adjust the origin point of the model&lt;br /&gt;
* How to setup all this in a Unity scene and package for Eco&lt;br /&gt;
&lt;br /&gt;
= Setup =&lt;br /&gt;
&lt;br /&gt;
* Already have setup &#039;&#039;&#039;ModKit + Unity&#039;&#039;&#039;&lt;br /&gt;
** See: [[Installing the ModKit]]&lt;br /&gt;
* Have a &#039;&#039;&#039;3D model&#039;&#039;&#039;&lt;br /&gt;
** Just following along? Find the one used here at &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://assetstore.unity.com/packages/3d/props/low-poly-medieval-market-stalls-314286&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* A &#039;&#039;&#039;C# IDE&#039;&#039;&#039; (notepad++, Visual Studio, etc.)&lt;br /&gt;
** Highly encouraged to have an Intellisense setup and linked to the &#039;&#039;&#039;Reference Assemblies&#039;&#039;&#039;. Optional, but its really worth the time to figure out because it will help quickly correct small typos and trivial mistakes.&lt;br /&gt;
** See: [[Getting Started with Eco Modding in Visual Studio 2022]] (generally the same steps apply if using a new version of Visual Studio)&lt;br /&gt;
* &#039;&#039;&#039;Blender&#039;&#039;&#039; installed&lt;br /&gt;
** Homepage: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://www.blender.org/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Importing the Assets ==&lt;br /&gt;
&lt;br /&gt;
# Open the Unity editor to the project.&lt;br /&gt;
# From the top toolbar open the &#039;&#039;Window&#039;&#039; drop down.&lt;br /&gt;
# Hover &#039;&#039;Package Management&#039;&#039; to open sub-menu.&lt;br /&gt;
# Select &#039;&#039;Package Manager&#039;&#039;.&lt;br /&gt;
# The &#039;&#039;Package Manager&#039;&#039; window will pop-up.&lt;br /&gt;
# Install the package containing the assets you want to use...&lt;br /&gt;
## &amp;lt;u&amp;gt;If not using Unity Registry&amp;lt;/u&amp;gt;...&lt;br /&gt;
### Find the &#039;&#039;+▾&#039;&#039; button in the top left and open the drop down.&lt;br /&gt;
### Install the package from one of those options.&lt;br /&gt;
## &amp;lt;u&amp;gt;If using Unity Registry&amp;lt;/u&amp;gt;...&lt;br /&gt;
### Visit &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://assetstore.unity.com&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; and sign in.&lt;br /&gt;
### Search for the asset desired.&lt;br /&gt;
### Go to it&#039;s page (e.g. &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://assetstore.unity.com/packages/3d/props/low-poly-medieval-market-stalls-314286&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;) and click the big blue button, &#039;&#039;Add to My Assets.&#039;&#039;&lt;br /&gt;
### Now, in the Unity editor and back at the &#039;&#039;Package Manager&#039;&#039; window.&lt;br /&gt;
### Find &#039;&#039;My Assets&#039;&#039; on the left menu and navigate to it.&lt;br /&gt;
### Click the &#039;&#039;⟳&#039;&#039; button in the lower-right.&lt;br /&gt;
### The asset should be in the list now. Use the search to filter if needed.&lt;br /&gt;
### Click on the asset in the list. For those following along, &#039;&#039;Low Poly Medieval Market Stalls&#039;&#039;.&lt;br /&gt;
### In the right panel, find the &#039;&#039;Download ⤓&#039;&#039; button. Click it.&lt;br /&gt;
### Once downloaded, a new button should show up, it&#039;ll say something like &#039;&#039;⊕ Import 1.0 to project&#039;&#039; . Click it.&lt;br /&gt;
### The &#039;&#039;Import Unity Package&#039;&#039; window will pop-up.&lt;br /&gt;
### Select &#039;&#039;Import&#039;&#039; on it.&lt;br /&gt;
# Verify you can find your assets from the explorer. If following along, the assets are at &amp;lt;code&amp;gt;Assets/PolyRonin/Medieval Market Stalls&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Load in a demo scene, if provided, and make sure everything looks okay.&lt;br /&gt;
## For those following along, double click on the &#039;&#039;Demo&#039;&#039; scene at &amp;lt;code&amp;gt;Assets/PolyRonin/Medieval Market Stalls/Demo.unity&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:Eco - Unity - View Modes.png|thumb|Underlined in red are the different draw mode buttons. &amp;lt;u&amp;gt;4/20/26&amp;lt;/u&amp;gt;]]&lt;br /&gt;
If something seems off, check the different draw modes and see if changing those allow the scene to render as expected (see picture).&lt;br /&gt;
&lt;br /&gt;
= Creating The Worktable =&lt;br /&gt;
This guide will create the worktable in this order:&lt;br /&gt;
&lt;br /&gt;
# Create the item that represents the worktable&lt;br /&gt;
# Make a recipe to craft the worktable item&lt;br /&gt;
# Make the worktable item something that places a world object&lt;br /&gt;
# Give the worktable functionality by adding recipes to it&lt;br /&gt;
&lt;br /&gt;
== Creating the Item ==&lt;br /&gt;
&lt;br /&gt;
=== Item Icon ===&lt;br /&gt;
[[File:TeamstersStall - StallOnly - 256x256.png|thumb|A large (256x256px) icon created of Stall4 from the medieval assets.]]&lt;br /&gt;
# Open &amp;lt;u&amp;gt;Blender&amp;lt;/u&amp;gt;.&lt;br /&gt;
# Delete everything in the &#039;&#039;Scene Collection&#039;&#039;. Find this section in the top-right of the application.&lt;br /&gt;
# From the top toolbar, open the &#039;&#039;File&#039;&#039; drop down.&lt;br /&gt;
# Hover &#039;&#039;Import&#039;&#039; to open the sub-menu.&lt;br /&gt;
# Select the type of 3D asset. For those using medieval assets, select &#039;&#039;FBX (.fbx)&#039;&#039;.&lt;br /&gt;
# Find the asset on the computer...&amp;lt;br&amp;gt;&#039;&#039;&#039;Tip:&#039;&#039;&#039; Use Unity to find the &amp;lt;code&amp;gt;.fbx&amp;lt;/code&amp;gt; asset. &lt;br /&gt;
## For the medieval assets, that&#039;s in &amp;lt;code&amp;gt;Assets/PolyRonin/Medieval Market Stalls/Meshes/medieval-market-stalls-1.fbx&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Right click on it and select &#039;&#039;Show in explorer&#039;&#039;.&lt;br /&gt;
## Now copy the address of that folder from Explorer. It might look like &amp;lt;code&amp;gt;C:\Users\Wug\EcoMod--WikiDemo\WikiDemo\Assets\PolyRonin\Medieval Market Stalls\Meshes&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Paste that in the address bar of the &amp;lt;u&amp;gt;Blender&amp;lt;/u&amp;gt; import pop-up.&lt;br /&gt;
# Select the blue &#039;&#039;Import FBX&#039;&#039; button&#039;&#039;.&#039;&#039;&lt;br /&gt;
# Be in the &#039;&#039;Layout&#039;&#039; workspace (top toolbar) and in the &#039;&#039;Object Mode...&#039;&#039;&lt;br /&gt;
## Find the drop down in the second toolbar from the top that has options like &#039;&#039;Object Mode, Edit Mode, Sculpt Mode,&#039;&#039; etc.&lt;br /&gt;
## Select &#039;&#039;Object Mode&#039;&#039; from that drop down.&lt;br /&gt;
# Change the Viewport Shading to Material Preview or Rendered. This is on the second toolbar down, far right of center, but before &#039;&#039;Scene Collection&#039;&#039; section.&lt;br /&gt;
# If you see purple models, Blender will need help finding textures for these meshes...&lt;br /&gt;
## From the top toolbar, open the &#039;&#039;File&#039;&#039; drop down.&lt;br /&gt;
## Hover &#039;&#039;External Data&#039;&#039; to open the sub-menu.&lt;br /&gt;
## Select &#039;&#039;Find Missing Files...&#039;&#039;&lt;br /&gt;
## Point this to the whole directory that the 3D assets came in. For the medieval pack, &amp;lt;code&amp;gt;C:\Users\&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;Wug\EcoMod--WikiDemo\WikiDemo\Assets\PolyRonin&amp;lt;/code&amp;gt;.&lt;br /&gt;
## The proper textures/materials should have now loaded in. If it hasn&#039;t, consult Google because without the textures the following steps won&#039;t produce a usable icon.&lt;br /&gt;
# Add a source of light...&lt;br /&gt;
## Still be in the &#039;&#039;Layout&#039;&#039; workspace (top toolbar) and in the &#039;&#039;Object Mode...&#039;&#039;&lt;br /&gt;
### Find the drop down in the second toolbar from the top that has options like &#039;&#039;Object Mode, Edit Mode, Sculpt Mode,&#039;&#039; etc.&lt;br /&gt;
### Select &#039;&#039;Object Mode&#039;&#039; from that drop down.&lt;br /&gt;
## From the toolbar just under that one, find and open the &#039;&#039;Add&#039;&#039; drop down.&lt;br /&gt;
## Hover &#039;&#039;Light&#039;&#039; to open that sub-menu.&lt;br /&gt;
## Click &#039;&#039;Sun&#039;&#039;.&lt;br /&gt;
# Add a camera...&lt;br /&gt;
## In the &#039;&#039;Layout&#039;&#039; workspace (top toolbar) and in the &#039;&#039;Object Mode...&#039;&#039;&lt;br /&gt;
### Find the drop down in the second toolbar from the top that has options like &#039;&#039;Object Mode, Edit Mode, Sculpt Mode,&#039;&#039; etc.&lt;br /&gt;
### Select &#039;&#039;Object Mode&#039;&#039; from that drop down.&lt;br /&gt;
## From the second toolbar down, find and open the &#039;&#039;Add&#039;&#039; drop down.&lt;br /&gt;
## Select &#039;&#039;Camera&#039;&#039;.&lt;br /&gt;
# Setup the scene with the object placement and lighting direction desired.&amp;lt;br&amp;gt;&#039;&#039;&#039;Tip:&#039;&#039;&#039; To reset the editor to something selected press the period key &amp;lt;u&amp;gt;on the numpad&amp;lt;/u&amp;gt;. Without a numpad, use &#039;&#039;View&#039;&#039; (second toolbar from the top) and select &#039;&#039;Frame Selected&#039;&#039; from it. Alternatively, just set the zoom to zoom to the mouse position: &#039;&#039;Edit&#039;&#039; (top toolbar), &#039;&#039;Preferences&#039;&#039; (from drop down), &#039;&#039;Navigation&#039;&#039; (on left menu), &#039;&#039;Zoom to Mouse Position&#039;&#039; (In the zoom section). This makes moving around a lot more natural feeling.&lt;br /&gt;
# Setup the rendering camera...&lt;br /&gt;
## Go to &#039;&#039;Rendering&#039;&#039;  tab on the top toolbar&lt;br /&gt;
## On the right there will be a side-panel open, it should be the &#039;&#039;Render&#039;&#039; tab. Confirm that.&lt;br /&gt;
## Change &#039;&#039;Render Engine&#039;&#039; to &#039;&#039;Cycles&#039;&#039;.&lt;br /&gt;
## Look down below in the same tab for the &#039;&#039;Film&#039;&#039; section.&lt;br /&gt;
## Expand it and find the &#039;&#039;Transparent&#039;&#039; checkbox and section. Click it so that it has a check mark. This will make the icon&#039;s background transparent.&lt;br /&gt;
## Now, go to the &#039;&#039;Output&#039;&#039; tab &amp;lt;u&amp;gt;on the side panel&amp;lt;/u&amp;gt;. The tab is just below the current one.&lt;br /&gt;
## In the &#039;&#039;Format&#039;&#039; section set &#039;&#039;Resolution X&#039;&#039; to &#039;&#039;64.&#039;&#039; And &#039;&#039;Y&#039;&#039; to &#039;&#039;64&#039;&#039; as well. This will make the icon generated a 64 by 64 pixel image.&lt;br /&gt;
# Go back to the &#039;&#039;Layout&#039;&#039; tab from the top toolbar.&lt;br /&gt;
# Center your view on the object (numpad period or &#039;&#039;View &amp;gt; Frame Selected&#039;&#039;). Adjust it so that the object is how it should be for the icon.&lt;br /&gt;
# Align the camera to the view...&lt;br /&gt;
## Make sure the editor is in &#039;&#039;Layout&#039;&#039; workspace (top toolbar) and in the &#039;&#039;Object Mode...&#039;&#039;&lt;br /&gt;
### Find the drop down in the second toolbar from the top that has options like &#039;&#039;Object Mode, Edit Mode, Sculpt Mode,&#039;&#039; etc.&lt;br /&gt;
### Select &#039;&#039;Object Mode&#039;&#039; from that drop down.&lt;br /&gt;
## Find &#039;&#039;View&#039;&#039; from the second from the top toolbar and open the drop down.&lt;br /&gt;
## Hover &#039;&#039;Align View&#039;&#039; to open the sub-menu.&lt;br /&gt;
## Select &#039;&#039;Align Active Camera To View&#039;&#039;.&lt;br /&gt;
## If the view is slightly off, there is a lock icon on the right side of this panel. Use it to &amp;quot;lock&amp;quot; controls to the camera and tweak it&#039;s view.&lt;br /&gt;
# Now return to the &#039;&#039;Rendering&#039;&#039; tab from the top toolbar.&lt;br /&gt;
# Press the F12 key to start the render. This should complete quickly since 64x64 pixels is a very small render.&lt;br /&gt;
# A window should popup, &#039;&#039;Blender Render&#039;&#039;. This is the icon!&lt;br /&gt;
# From the top tool bar of this &#039;&#039;Blender Render&#039;&#039; window, open the &#039;&#039;Image&#039;&#039; drop down.&lt;br /&gt;
# Select &#039;&#039;Save As...&#039;&#039; to save somewhere on the computer.&lt;br /&gt;
# Return to step 13 and repeat to do larger images if desired. Create a 128 by 128 pixel image too. It will make things smoother later.&lt;br /&gt;
# Save the Blender scene. Not only will it be used later, this will make making a new icon with a small tweak that much easier.&lt;br /&gt;
## &#039;&#039;File&#039;&#039; drop down from top toolbar.&lt;br /&gt;
## &#039;&#039;Save As...&#039;&#039; to save the Blender scene to the computer.&lt;br /&gt;
## Save it to &amp;lt;code&amp;gt;Assets/WikiDemo/MedievalStall - Icon Scene.blend&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Adding to Unity Scene ===&lt;br /&gt;
The developers explain how to create an item in one of ModKit&#039;s read me files (See: &amp;lt;code&amp;gt;Assets/EcoModKit/Docs/README.md&amp;lt;/code&amp;gt;), but this guide will explain it below.&lt;br /&gt;
&lt;br /&gt;
Additionally, &#039;&#039;&#039;TheKye&#039;&#039;&#039; on YouTube covers this in their &#039;&#039;Creating Your First Item&#039;&#039; and &#039;&#039;Creating Your First Item Pt 2&#039;&#039; videos.&lt;br /&gt;
&lt;br /&gt;
Use those additional resource to help troubleshoot issues with item&#039;s icons.&lt;br /&gt;
&lt;br /&gt;
# Open &amp;lt;u&amp;gt;Unity&amp;lt;/u&amp;gt;.&lt;br /&gt;
# In the left panel, the &#039;&#039;Hierarchy&#039;&#039; tab should be selected.&lt;br /&gt;
# Select the top-most object there. It should be a scene. If the editor last loaded the &#039;&#039;Demo&#039;&#039; scene from the medieval assets, it&#039;ll be named &#039;&#039;Demo&#039;&#039;.&lt;br /&gt;
# Right click on this scene and select &#039;&#039;Add New Scene&#039;&#039; from the menu.&lt;br /&gt;
# Right click again on the old scene (&#039;&#039;Demo&#039;&#039;) and select &#039;&#039;Remove Scene&#039;&#039;.&lt;br /&gt;
# Let it save if the changes to the old scene are important. Discard if it was open just for exploration&#039;s sake.&lt;br /&gt;
# Right click the new, &#039;&#039;Untitled&#039;&#039; scene. Click &#039;&#039;Save Scene As...&#039;&#039;&lt;br /&gt;
# Save it to &amp;lt;code&amp;gt;Assets/WikiDemo.unity&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Delete &amp;lt;u&amp;gt;anything&amp;lt;/u&amp;gt; in the scene.&lt;br /&gt;
# Right click the scene, hover &#039;&#039;GameObject&#039;&#039;, and select &#039;&#039;Create Empty&#039;&#039; from the sub-menu.&lt;br /&gt;
# Name this new object &#039;&#039;Objects&#039;&#039;.&lt;br /&gt;
# Select the newly created &#039;&#039;Objects&#039;&#039; object from the &#039;&#039;Hierarchy&#039;&#039; menu.&lt;br /&gt;
# On the far right side of the screen, in the &#039;&#039;Inspector&#039;&#039; menu, click the &#039;&#039;Add Component&#039;&#039; button.&lt;br /&gt;
# Type in &#039;&#039;ModkitPrefabContainer&#039;&#039;. Click on the component from the search to add it. The component now should be listed in the &#039;&#039;Inspector&#039;&#039;.&lt;br /&gt;
# In the &#039;&#039;Hierarchy&#039;&#039; panel right click the scene, hover &#039;&#039;GameObject&#039;&#039;, and select &#039;&#039;Create Empty&#039;&#039;.&lt;br /&gt;
# Name this new object &#039;&#039;Items&#039;&#039;.&lt;br /&gt;
# Right click the scene, hover &#039;&#039;GameObject&#039;&#039;, and select &#039;&#039;Create Empty&#039;&#039;.&lt;br /&gt;
# Name this new object &#039;&#039;Emoji&#039;&#039;.&lt;br /&gt;
# Select the newly created &#039;&#039;Emoji&#039;&#039; object, find the &#039;&#039;Inspector&#039;&#039; menu (far-right), and click the &#039;&#039;Add Component&#039;&#039; button.&lt;br /&gt;
# Type in &#039;&#039;ChatEmoteSetOld&#039;&#039;. Click on the component from the search to add it. That component should now be listed in the &#039;&#039;Inspector&#039;&#039;.&lt;br /&gt;
# Right click the scene, hover &#039;&#039;GameObject&#039;&#039;, and select &#039;&#039;Create Empty&#039;&#039;.&lt;br /&gt;
# Name this new object &#039;&#039;BlockSets&#039;&#039;.&lt;br /&gt;
# Select the newly created &#039;&#039;BlockSets&#039;&#039; object, find the &#039;&#039;Inspector&#039;&#039; menu (far-right), and click &#039;&#039;Add Component&#039;&#039;.&lt;br /&gt;
# Search for &#039;&#039;BlockSetContainer&#039;&#039;. Click on the component from the search to add it. The &#039;&#039;Inspector&#039;&#039; should now show that component as added.&lt;br /&gt;
#Go to &amp;lt;code&amp;gt;Assets/EcoModKit/Prefabs&amp;lt;/code&amp;gt; in the Unity project window.&lt;br /&gt;
# Find the prefab &#039;&#039;ItemTemplate&#039;&#039;.&lt;br /&gt;
# Drag it onto the &#039;&#039;Items&#039;&#039; object in the &#039;&#039;Hierarchy&#039;&#039; panel. It should add it as a &amp;lt;u&amp;gt;child&amp;lt;/u&amp;gt; of the &#039;&#039;Items&#039;&#039; object.&lt;br /&gt;
# Right click on the new &#039;&#039;ItemTemplate&#039;&#039; object, hover &#039;&#039;Prefab&#039;&#039;, and select &#039;&#039;Unpack Completely&#039;&#039;.&lt;br /&gt;
# Right click on the &#039;&#039;ItemTemplate&#039;&#039; object and select &#039;&#039;Rename&#039;&#039;. Name this what you want the item to be called. Example: &#039;&#039;MedievalStallItem&#039;&#039;.&lt;br /&gt;
# Set this item&#039;s background...&lt;br /&gt;
## Here&#039;s the default backgrounds (blue = item, brown = block, green = food): &amp;lt;br&amp;gt;[[File:Eco - Item - Background.png|border|frameless]]        [[File:Eco - Block - Background.png|frameless]]        [[File:Eco - Food - Background.png|frameless]]&lt;br /&gt;
## Download or prepare the background and add it to the &amp;lt;code&amp;gt;Assets&amp;lt;/code&amp;gt; folder in Unity. &lt;br /&gt;
### To follow along lockstep, put the background in a new &amp;lt;code&amp;gt;Assets/WikiDemo&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
### Right click on &amp;lt;code&amp;gt;Assets&amp;lt;/code&amp;gt; folder, hover &#039;&#039;Create&#039;&#039;, select &#039;&#039;Folder&#039;&#039;.&lt;br /&gt;
### Name the folder &#039;&#039;WikiDemo&#039;&#039;.&lt;br /&gt;
## Configure Unity to use these as sprites...&lt;br /&gt;
### Select the background(s) added (Ctrl+Click each one).&lt;br /&gt;
### In the &#039;&#039;Inspector&#039;&#039;, find &#039;&#039;TextureType&#039;&#039; and change that to &#039;&#039;Sprite (2D and UI)&#039;&#039;.&lt;br /&gt;
### Again in the &#039;&#039;Inspector&#039;&#039;, find &#039;&#039;SpriteMode&#039;&#039; and change that to &#039;&#039;Single&#039;&#039;.&lt;br /&gt;
### Then scroll and go to the bottom of the &#039;&#039;Inspector&#039;&#039; and find the &#039;&#039;Apply&#039;&#039; button.&lt;br /&gt;
### This will apply those changes to that file and all other ones highlighted.&lt;br /&gt;
## Select the item being created (&#039;&#039;MedievalStallItem&#039;&#039;).&lt;br /&gt;
## In the &#039;&#039;Inspector&#039;&#039; panel (far-right), scroll and find the &#039;&#039;Item Template (Script)&#039;&#039; section.&lt;br /&gt;
## In here find the &#039;&#039;Background&#039;&#039; input. It&#039;ll say &#039;&#039;Background (Image)&#039;&#039; in it. If clicked that text to reveal and highlight the related object in the &#039;&#039;Hierarchy&#039;&#039; panel.&lt;br /&gt;
## Select the revealed, and highlighted object &#039;&#039;Background&#039;&#039;.&lt;br /&gt;
## In the &#039;&#039;Inspector&#039;&#039; panel, scroll and find the &#039;&#039;Image&#039;&#039; component section.&lt;br /&gt;
## Inside that component&#039;s section, find &#039;&#039;Source Image&#039;&#039;. It&#039;ll say &#039;&#039;Missing (Sprite)&#039;&#039;. Click the &#039;&#039;⦿&#039;&#039; button to the right.&lt;br /&gt;
## The &#039;&#039;Select Sprite&#039;&#039; popup will show. Make sure the &#039;&#039;Assets&#039;&#039; tab is selected, and find the backgrounds desired.&lt;br /&gt;
#Create the foreground image...&lt;br /&gt;
##This is easily accomplished in MS Paint.&lt;br /&gt;
##Get to the background image file in a &amp;lt;u&amp;gt;file explorer&amp;lt;/u&amp;gt;.&lt;br /&gt;
##Right click on it, hover &#039;&#039;Open with...&#039;&#039;, and select &#039;&#039;Paint&#039;&#039;.&lt;br /&gt;
##The solid background should be displayed.&lt;br /&gt;
##Open the &#039;&#039;File&#039;&#039; menu from the top toolbar.&lt;br /&gt;
##Hover &#039;&#039;Import to Canvas&#039;&#039; and select &#039;&#039;From a File&#039;&#039;.&lt;br /&gt;
##Find the icon in the file browser and import it. Match the size of the background image to have it nicely center itself.&lt;br /&gt;
##Now &#039;&#039;File&#039;&#039; from the top toolbar.&lt;br /&gt;
##Hover &#039;&#039;Save As...&#039;&#039; and select &#039;&#039;PNG&#039;&#039;.&lt;br /&gt;
##Save this to the &amp;lt;code&amp;gt;Assets/WikiDemo&amp;lt;/code&amp;gt; folder in Unity.&lt;br /&gt;
##Configure Unity to use these as sprites...&lt;br /&gt;
### Select the foreground image.&lt;br /&gt;
### In the &#039;&#039;Inspector&#039;&#039;, find &#039;&#039;TextureType&#039;&#039; and change that to &#039;&#039;Sprite (2D and UI)&#039;&#039;.&lt;br /&gt;
### Again in the &#039;&#039;Inspector&#039;&#039;, find &#039;&#039;SpriteMode&#039;&#039; and change that to &#039;&#039;Single&#039;&#039;.&lt;br /&gt;
### Then scroll and go to the bottom of the &#039;&#039;Inspector&#039;&#039; and find the &#039;&#039;Apply&#039;&#039; button.&lt;br /&gt;
### This will apply those changes to that file and all other ones highlighted.&lt;br /&gt;
#Set this item&#039;s foreground...&lt;br /&gt;
## Copy the item&#039;s icon into the &amp;lt;code&amp;gt;Assets&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
## Configure Unity to use it as a sprite (see the previous step&#039;s &#039;&#039;Set this item&#039;s background...&#039;&#039; instructions)&lt;br /&gt;
## Select the item being created (&#039;&#039;MedievalStallItem&#039;&#039;).&lt;br /&gt;
## In the &#039;&#039;Inspector&#039;&#039; panel (far-right), scroll and find the &#039;&#039;Item Template (Script)&#039;&#039; section.&lt;br /&gt;
## In here find the &#039;&#039;Foreground&#039;&#039; input. It&#039;ll say &#039;&#039;Foreground (Image)&#039;&#039; in it. If clicked that text to reveal and highlight the related object in the &#039;&#039;Hierarchy&#039;&#039; panel.&lt;br /&gt;
## Select the revealed, and highlighted object &#039;&#039;Foreground&#039;&#039;.&lt;br /&gt;
## Use the &#039;&#039;Inspector&#039;&#039;, find the &#039;&#039;Image&#039;&#039; component, within that component find the &#039;&#039;Source Image&#039;&#039; input. It will say &#039;&#039;Missing (Sprite)&#039;&#039;.&lt;br /&gt;
## Click the &#039;&#039;⦿&#039;&#039; button to the right of that input.&lt;br /&gt;
## From the &#039;&#039;Select Sprite&#039;&#039; popup, ensure the &#039;&#039;Assets&#039;&#039; tab is being searched, and find the icon just created.&lt;br /&gt;
&lt;br /&gt;
=== Export From Unity ===&lt;br /&gt;
&lt;br /&gt;
# Open the &#039;&#039;File&#039;&#039; menu from the top toolbar.&lt;br /&gt;
# Select &#039;&#039;Save.&#039;&#039; Save it to the &amp;lt;code&amp;gt;Assets/WikiDemo&amp;lt;/code&amp;gt; folder.&amp;lt;br&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; Do not skip. The scene must be saved for the ModKit build to work properly.&lt;br /&gt;
# Open the &#039;&#039;Eco Tools&#039;&#039; menu from the top toolbar.&lt;br /&gt;
# Hover &#039;&#039;Mod Kit&#039;&#039; to open the sub-menu.&lt;br /&gt;
# Select &#039;&#039;Build Current Bundle&#039;&#039;.&lt;br /&gt;
# Have it output the bundle to &amp;lt;code&amp;gt;/Eco Server/Mods/UserCode/WikiDemo.unity3d&amp;lt;/code&amp;gt;&lt;br /&gt;
# Wait for this to build. This may take a few minutes.&lt;br /&gt;
&lt;br /&gt;
=== Coding the Item ===&lt;br /&gt;
For this guide, all code will be placed in a single &amp;lt;code&amp;gt;.cs&amp;lt;/code&amp;gt; file and will not be compiled into a &amp;lt;code&amp;gt;.dll&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
# Create a &amp;lt;code&amp;gt;.cs&amp;lt;/code&amp;gt; file: &amp;lt;code&amp;gt;/Eco Server/Mods/UserCode/WikiDemo.cs&amp;lt;/code&amp;gt;&lt;br /&gt;
# Put the following into the newly created file:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;using Eco.Core.Items;&lt;br /&gt;
using Eco.Gameplay.Items;&lt;br /&gt;
using Eco.Shared.Localization;&lt;br /&gt;
using Eco.Shared.Serialization;&lt;br /&gt;
&lt;br /&gt;
namespace WikiDemo&lt;br /&gt;
{&lt;br /&gt;
    #region Item&lt;br /&gt;
    [Serialized] // Tells the save/load system this object needs to be serialized.&lt;br /&gt;
    [LocDisplayName(&amp;quot;Market Stall&amp;quot;)] // Defines the localized name of the item.&lt;br /&gt;
    [Weight(100)] // Defines how heavy this is.&lt;br /&gt;
    [Ecopedia(&amp;quot;Work Stations&amp;quot;, &amp;quot;Craft Tables&amp;quot;, createAsSubPage: true)]&lt;br /&gt;
    [LocDescription(&amp;quot;A medieval market stall.&amp;quot;)] //The tooltip description for the item.&lt;br /&gt;
    public partial class MedievalStallItem: Item { }&lt;br /&gt;
    #endregion&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Line 8:&#039;&#039;&#039; A region tag. Lets the editor know it can collapse all of that code as a section. The following examples in this guide will just show &amp;lt;code&amp;gt;#region Item&amp;lt;/code&amp;gt; in their code examples.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 13:&#039;&#039;&#039; The implementation of &amp;lt;code&amp;gt;Item&amp;lt;/code&amp;gt; means that Eco will find this and look for Unity assets that matching this class&#039; name, &amp;lt;code&amp;gt;MedivalStallItem&amp;lt;/code&amp;gt;. While this doesn&#039;t do anything fancy, it completes the first step towards a new workbench.&lt;br /&gt;
&lt;br /&gt;
=== Checkpoint #1 ===&lt;br /&gt;
[[File:Eco - Hotbar With Modded Icon.png|thumb|Shows the medieval stall as a modded icon in-game.]]&lt;br /&gt;
Make sure everything is running smoothly by doing the following:&lt;br /&gt;
&lt;br /&gt;
# Double-check that the &amp;lt;code&amp;gt;WikiDemo.unity3d&amp;lt;/code&amp;gt; and the &amp;lt;code&amp;gt;WikiDemo.cs&amp;lt;/code&amp;gt; files are in &amp;lt;code&amp;gt;/Eco Server/Mods/UserCode&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
# Start the server and connect to it.&lt;br /&gt;
# Test it out by typing &amp;lt;code&amp;gt;/give MedievalStall&amp;lt;/code&amp;gt; in chat.&lt;br /&gt;
## It&#039;s also possible to do &amp;lt;code&amp;gt;/give Market Stall&amp;lt;/code&amp;gt; to get the item. How? Line 10: of the the above code declares that name as this item&#039;s &amp;quot;common name&amp;quot;. Neat.&lt;br /&gt;
# The item should appear in the players inventory with a working icon.&lt;br /&gt;
&lt;br /&gt;
== Code the Item&#039;s Recipe ==&lt;br /&gt;
The following goes over how to add a new class and implement the &amp;lt;code&amp;gt;RecipeFamily&amp;lt;/code&amp;gt; interface.&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;using Eco.Core.Items;&lt;br /&gt;
using Eco.Gameplay.Components;&lt;br /&gt;
using Eco.Gameplay.Items;&lt;br /&gt;
using Eco.Gameplay.Items.Recipes;&lt;br /&gt;
using Eco.Gameplay.Skills;&lt;br /&gt;
using Eco.Mods.TechTree;&lt;br /&gt;
using Eco.Shared.Localization;&lt;br /&gt;
using Eco.Shared.Serialization;&lt;br /&gt;
using System.Runtime.Versioning;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
&lt;br /&gt;
namespace WikiDemo&lt;br /&gt;
{&lt;br /&gt;
    #region Item&lt;br /&gt;
&lt;br /&gt;
    #region Recipe&lt;br /&gt;
    [RequiresSkill(typeof(CarpentrySkill), 3)]&lt;br /&gt;
    [Ecopedia(&amp;quot;Work Stations&amp;quot;, &amp;quot;Craft Tables&amp;quot;, subPageName: &amp;quot;Market Stall&amp;quot;)]&lt;br /&gt;
    public partial class MedievalStallRecipe : RecipeFamily&lt;br /&gt;
    {&lt;br /&gt;
        [SupportedOSPlatform(&amp;quot;windows7.0&amp;quot;)]&lt;br /&gt;
        public MedievalStallRecipe()&lt;br /&gt;
        {&lt;br /&gt;
            var recipe = new Recipe();&lt;br /&gt;
            recipe.Init(&lt;br /&gt;
                name: &amp;quot;MedievalStallItem&amp;quot;,&lt;br /&gt;
                displayName: Localizer.DoStr(&amp;quot;Market Stall&amp;quot;),&lt;br /&gt;
                ingredients: new List&amp;lt;IngredientElement&amp;gt;&lt;br /&gt;
                {&lt;br /&gt;
                    new IngredientElement(&amp;quot;Wood&amp;quot;, 40, typeof(Skill)),&lt;br /&gt;
                    new IngredientElement(typeof(CottonFabricItem), 30, typeof(Skill)),&lt;br /&gt;
                    new IngredientElement(typeof(HempMooringRopeItem), 5, true)&lt;br /&gt;
                },&lt;br /&gt;
                items: new List&amp;lt;CraftingElement&amp;gt;&lt;br /&gt;
                {&lt;br /&gt;
                    new CraftingElement&amp;lt;MedievalStallItem&amp;gt;(1)&lt;br /&gt;
                }&lt;br /&gt;
            );&lt;br /&gt;
            this.Recipes = new List&amp;lt;Recipe&amp;gt; { recipe };&lt;br /&gt;
            this.LaborInCalories = CreateLaborInCaloriesValue(800, typeof(Skill));&lt;br /&gt;
            this.CraftMinutes = CreateCraftTimeValue(typeof(MedievalStallRecipe), 10f, typeof(Skill));&lt;br /&gt;
    &lt;br /&gt;
            // Perform pre/post initialization for user mods and initialize our recipe instance with the display name &amp;quot;Market Stall&amp;quot;&lt;br /&gt;
            this.ModsPreInitialize();&lt;br /&gt;
            this.Initialize(displayText: Localizer.DoStr(&amp;quot;Market Stall&amp;quot;), recipeType: typeof(MedievalStallRecipe));&lt;br /&gt;
            this.ModsPostInitialize();&lt;br /&gt;
    &lt;br /&gt;
            // Register our RecipeFamily instance to a work table (in this case the Carpentry Table) so it can be crafted.&lt;br /&gt;
            CraftingComponent.AddRecipe(tableType: typeof(CarpentryTableObject), recipeFamily: this); // NOTE: The table must be the object instance!&lt;br /&gt;
        }&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
        /// &amp;lt;summary&amp;gt;Hook for other mods to customize RecipeFamily before initialization.&amp;lt;/summary&amp;gt;&lt;br /&gt;
        partial void ModsPreInitialize();&lt;br /&gt;
    &lt;br /&gt;
        /// &amp;lt;summary&amp;gt;Hook for other mods to customize RecipeFamily after initialization, but before registration. You can change skill requirements here.&amp;lt;/summary&amp;gt;&lt;br /&gt;
        partial void ModsPostInitialize();&lt;br /&gt;
    }&lt;br /&gt;
    #endregion&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Line 10:&#039;&#039;&#039; Eco will need this explicitly added to the file. Visual Studio will not add this line automatically. It&#039;s used for the &amp;lt;code&amp;gt;List&amp;lt;T&amp;gt;&amp;lt;/code&amp;gt; objects found in this code.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 14:&#039;&#039;&#039; &amp;quot;Collapsed&amp;quot; &amp;lt;code&amp;gt;Item&amp;lt;/code&amp;gt; section. See the earlier sections in this guide for the code that belongs there.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 17:&#039;&#039;&#039; Sets the required skill and skill level to craft this recipe.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 21:&#039;&#039;&#039; &amp;lt;code&amp;gt;[SupportedOSPlatform(&amp;quot;windows7.0&amp;quot;)]&amp;lt;/code&amp;gt; is here to silence some annoying warnings in Visual Studio. It&#039;s optional.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 30-32:&#039;&#039;&#039; Declares the input ingredients used for crafting. &amp;lt;code&amp;gt;typeof(Skill)&amp;lt;/code&amp;gt; gets mapped to the &amp;lt;code&amp;gt;CarpentrySkill&amp;lt;/code&amp;gt; as defined by line 31. In this example the &amp;lt;code&amp;gt;HempMooringRope&amp;lt;/code&amp;gt; is a static input. A static input will not be modified by skills, upgrade modules, or game settings.&amp;lt;br&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; It seems that at the time of writing (4/21/2026, Eco v13.0.2) the only way to get an ingredient to be a dynamic value that is reduced by the table&#039;s upgrade is to pass &amp;lt;code&amp;gt;typeof(Skill)&amp;lt;/code&amp;gt; to it; Passing either &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; makes the this input static.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 34:&#039;&#039;&#039; The &amp;lt;code&amp;gt;items&amp;lt;/code&amp;gt; list declares what items are &amp;lt;u&amp;gt;output&amp;lt;/u&amp;gt; by this recipe.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 36:&#039;&#039;&#039; This line declares that one medieval stall is output from this recipe. Functionally this links this recipe to the &amp;lt;code&amp;gt;MedievalStallItem&amp;lt;/code&amp;gt; (aka &amp;quot;Market Stall&amp;quot;) item created in the last step.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 40:&#039;&#039;&#039; Amount of calories needed to craft this item. For a static value (not modified by upgrades or skill levels) change this line to: &amp;lt;code&amp;gt;this.LaborInCalories = CreateLaborInCaloriesValue(800);&amp;lt;/code&amp;gt;. As it&#039;s written in the example, this item&#039;s calorie cost will be dynamic (modified by upgrades and skill levels). The skill level that will modify it is declared on line 16.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 41:&#039;&#039;&#039;  Minutes needed to craft. Both static and dynamic values for crafting time can be modified by the world difficulty settings. For a static value change this line to: &amp;lt;code&amp;gt;this.CraftMinutes = CreateCraftTimeValue(10f);&amp;lt;/code&amp;gt;. As it&#039;s written in the example, this item&#039;s craft time will be dynamic.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 49:&#039;&#039;&#039; This line assigns the recipe to a workbench. &amp;lt;u&amp;gt;Do not assign&amp;lt;/u&amp;gt; to itself because then the first table could never be made. It&#039;s recommend to use a preexisting vanilla table.&lt;br /&gt;
=== Checkpoint #2 ===&lt;br /&gt;
Check the functionality at this point -- it should be possible to see the recipe in the crafting table.&lt;br /&gt;
&lt;br /&gt;
# Have the &amp;lt;code&amp;gt;.unity3d&amp;lt;/code&amp;gt; and the &amp;lt;code&amp;gt;.cs&amp;lt;/code&amp;gt; file in the &amp;lt;code&amp;gt;/Eco Server/Mods/UserCode&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
# Start the server and log in.&lt;br /&gt;
# Type &amp;lt;code&amp;gt;/give Carpentry Table&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Place the Carpentry Table down and interact to see the what can be crafted.&lt;br /&gt;
# Find the newly added recipe under the name &#039;&#039;Market Stall.&#039;&#039;&lt;br /&gt;
# Type &amp;lt;code&amp;gt;/give Basic Upgrade 4&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Put the basic upgrade into the table.&lt;br /&gt;
# Go back to the recipe for the &#039;&#039;Market Stall&#039;&#039; and make sure the Wood and the Cotton fabric inputs now require less, but the Hemp Mooring Rope still is the same.&amp;lt;br&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; In case the recipe hasn&#039;t changed close that table&#039;s window and interact with it again. It should for the recipes to refresh now that the upgrade is in it.&lt;br /&gt;
&lt;br /&gt;
== Create the World Object ==&lt;br /&gt;
=== Preparing the 3D Asset ===&lt;br /&gt;
# Open &amp;lt;u&amp;gt;Blender&amp;lt;/u&amp;gt;.&lt;br /&gt;
# Load the 3D object created earlier for icon rendering -- &amp;lt;code&amp;gt;Assets/WikiDemo/MedievalStall - Icon Scene.blend&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Cleanup the scene...&lt;br /&gt;
## Delete any light source. Use the &#039;&#039;Scene Collection&#039;&#039; panel on the top-right side of the screen. These will have a 💡 icon and by default are named something like &amp;quot;sun&amp;quot;, &amp;quot;point&amp;quot;, &amp;quot;spot&amp;quot; or &amp;quot;area&amp;quot;.&amp;lt;br&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; If your model is a light source or has one in it, you can leave that light source. The point here is to remove the ambient lights used for icon rendering.&lt;br /&gt;
## Delete any camera(s). Again, use the &#039;&#039;Scene Collection&#039;&#039; panel. These have a 🎥 icon and by default are named something like &amp;quot;camera&amp;quot;.&lt;br /&gt;
# &amp;lt;u&amp;gt;If there are multiple different 3D assets in the scene&amp;lt;/u&amp;gt; (like bags, crates, jars, ect.), join them all together...&lt;br /&gt;
## Select all of the meshes by holding &#039;&#039;Shift&#039;&#039; and clicking on each one in the &#039;&#039;Scene Collection&#039;&#039; panel (right side of window).&amp;lt;br&amp;gt;&#039;&#039;&#039;Tip:&#039;&#039;&#039; Quickly select a group of them by selecting one near the top. Then hold &#039;&#039;Shift&#039;&#039;, &#039;&#039;Ctrl,&#039;&#039; and click on one near the bottom. This will both the one at the top and the one at the bottom, but also every item in between. Neat!&lt;br /&gt;
## Be in &#039;&#039;Layout&#039;&#039; workspace (top toolbar) and in the &#039;&#039;Object Mode...&#039;&#039;&lt;br /&gt;
### Find the drop down in the second toolbar from the top that has options like &#039;&#039;Object Mode, Edit Mode, Sculpt Mode,&#039;&#039; etc.&lt;br /&gt;
### Select &#039;&#039;Object Mode&#039;&#039; from that drop down.&lt;br /&gt;
## Find and open the &#039;&#039;Object&#039;&#039; menu (second toolbar down from the top).&lt;br /&gt;
## Select &#039;&#039;Join&#039;&#039;.&lt;br /&gt;
## In the &#039;&#039;Scene Collection&#039;&#039; panel, double click on the name of the newly joined mesh.&lt;br /&gt;
# Rename the joined mesh to &amp;lt;code&amp;gt;MedievalStallMesh&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Add and position a reference cube...&lt;br /&gt;
## Make sure the editor is in &#039;&#039;Layout&#039;&#039; view (top toolbar) and in the &#039;&#039;Object Mode...&#039;&#039;&lt;br /&gt;
### Find the drop down in the second toolbar from the top that has options like &#039;&#039;Object Mode, Edit Mode, Sculpt Mode,&#039;&#039; etc.&lt;br /&gt;
### Select &#039;&#039;Object Mode&#039;&#039; from that drop down.&lt;br /&gt;
## Then, add a reference cube. Open the &#039;&#039;Add&#039;&#039; menu (second top toolbar down).&lt;br /&gt;
## Hover &#039;&#039;Mesh&#039;&#039;.&lt;br /&gt;
## Select &#039;&#039;Cube.&#039;&#039;&lt;br /&gt;
## Open the &#039;&#039;View&#039;&#039; menu (second toolbar down).&lt;br /&gt;
## Select &#039;&#039;Sidebar&#039;&#039;.&lt;br /&gt;
## A new panel will have expanded.&lt;br /&gt;
## Along the right side of that panel there&#039;s buttons (&#039;&#039;Item, Tool, View, Animation&#039;&#039;). Find and click the &#039;&#039;Item&#039;&#039; button.&lt;br /&gt;
## Find and expand the &#039;&#039;Transform&#039;&#039; section&lt;br /&gt;
## Set the &#039;&#039;Location...&#039;&#039;&lt;br /&gt;
### &#039;&#039;X&#039;&#039; to &#039;&#039;1&#039;&#039;.&lt;br /&gt;
### &#039;&#039;Y&#039;&#039; to &#039;&#039;1&#039;&#039;.&lt;br /&gt;
### &#039;&#039;Z&#039;&#039; to &#039;&#039;1&#039;&#039;.&lt;br /&gt;
## The bottom corner of the cube should be touching the where green and red axis lines meet.&lt;br /&gt;
# Move the reference cube&#039;s origin to &amp;lt;code&amp;gt;(0, 0, 0)&amp;lt;/code&amp;gt;...&lt;br /&gt;
## Be in &#039;&#039;Layout&#039;&#039; workspace (top toolbar) and in the &#039;&#039;Object Mode...&#039;&#039;&lt;br /&gt;
### Find the drop down in the second toolbar from the top that has options like &#039;&#039;Object Mode, Edit Mode, Sculpt Mode,&#039;&#039; etc.&lt;br /&gt;
### Select &#039;&#039;Object Mode&#039;&#039; from that drop down.&lt;br /&gt;
## Open the &#039;&#039;View&#039;&#039; menu (second toolbar down).&lt;br /&gt;
## Select &#039;&#039;Sidebar&#039;&#039;.&lt;br /&gt;
## A new panel will have expanded.&lt;br /&gt;
## Along the right side of that panel there&#039;s buttons (&#039;&#039;Item, Tool, View, Animation&#039;&#039;). Find and click the &#039;&#039;View&#039;&#039; button.&lt;br /&gt;
## Find and expand the &#039;&#039;3D Cursor&#039;&#039; section.&lt;br /&gt;
## Set the 3D cursor&#039;s &#039;&#039;Location&#039;&#039;...&lt;br /&gt;
### &#039;&#039;X&#039;&#039; to &#039;&#039;0&#039;&#039;.&lt;br /&gt;
### &#039;&#039;Y&#039;&#039; to &#039;&#039;0&#039;&#039;.&lt;br /&gt;
### &#039;&#039;Z&#039;&#039; to &#039;&#039;0.&#039;&#039;&lt;br /&gt;
## Now in the &#039;&#039;Scene Collection&#039;&#039; panel, click on the &#039;&#039;Cube&#039;&#039; mesh to highlight and select it.&lt;br /&gt;
## Open the &#039;&#039;Object&#039;&#039; menu from the second toolbar down from the top.&lt;br /&gt;
## Hover &#039;&#039;Set Origin&#039;&#039;.&lt;br /&gt;
## Select &#039;&#039;Origin to 3D Cursor&#039;&#039;.&lt;br /&gt;
# Set the reference cube&#039;s dimensions...&lt;br /&gt;
## Be in &#039;&#039;Layout&#039;&#039; workspace (top toolbar) and in the &#039;&#039;Object Mode...&#039;&#039;&lt;br /&gt;
### Find the drop down in the second toolbar from the top that has options like &#039;&#039;Object Mode, Edit Mode, Sculpt Mode,&#039;&#039; etc.&lt;br /&gt;
### Select &#039;&#039;Object Mode&#039;&#039; from that drop down.&lt;br /&gt;
## Open the &#039;&#039;View&#039;&#039; menu (second toolbar down).&lt;br /&gt;
## Select and check the &#039;&#039;Sidebar&#039;&#039; option&#039;&#039;.&#039;&#039; &lt;br /&gt;
## The &#039;&#039;Sidebar&#039;&#039; menu just expanded over on the right side of the screen.&lt;br /&gt;
## To the right of the &#039;&#039;Sidebar&#039;&#039;, find and click the &#039;&#039;Item&#039;&#039; button.&lt;br /&gt;
## Expand the &#039;&#039;Transform&#039;&#039; section.&lt;br /&gt;
## Set the &#039;&#039;Dimensions...&#039;&#039;&#039;&#039;&#039;&amp;lt;br&amp;gt;Note:&#039;&#039;&#039; These dimensions only make sense for the asset being used for this guide. If using a different one, set the dimensions to the size of the box that model should fit in.&lt;br /&gt;
### &#039;&#039;X&#039;&#039; to &#039;&#039;4&#039;&#039;.&lt;br /&gt;
### &#039;&#039;Y&#039;&#039; to &#039;&#039;3&#039;&#039;.&lt;br /&gt;
### &#039;&#039;Z&#039;&#039; to &#039;&#039;3&#039;&#039;. &lt;br /&gt;
# Adjust the position and scale of the &#039;&#039;MedievalStallMesh&#039;&#039; to fit inside a box.&lt;br /&gt;
## Be in &#039;&#039;Layout&#039;&#039; workspace (top toolbar) and in the &#039;&#039;Object Mode...&#039;&#039;&lt;br /&gt;
### Find the drop down in the second toolbar from the top that has options like &#039;&#039;Object Mode, Edit Mode, Sculpt Mode,&#039;&#039; etc.&lt;br /&gt;
### Select &#039;&#039;Object Mode&#039;&#039; from that drop down.&lt;br /&gt;
## On the left side of the screen there&#039;s a column of icons. Hover over them to see their names.&lt;br /&gt;
## Select the &#039;&#039;Move&#039;&#039; tool.&lt;br /&gt;
## Click on the Medieval Stall to select it. Zoom out and reposition the camera so that the blue, green, and red arrows are visible.&amp;lt;br&amp;gt;&#039;&#039;&#039;Tip:&#039;&#039;&#039; By holding the middle-mouse button and dragging the scene will rotate. By holding the middle-mouse button and the &#039;&#039;Shift&#039;&#039; key, the scene will pan.&amp;lt;br&amp;gt;&#039;&#039;&#039;Tip:&#039;&#039;&#039; If panning or rotating the scene becomes slow or frustrating (especially after zooming), try selecting 3D asset from the &#039;&#039;Scene Collection&#039;&#039; panel, opening the &#039;&#039;View&#039;&#039; menu (second toolbar from top), and selecting &#039;&#039;Frame Selected&#039;&#039;. This will reset the view onto that object and controls should feel normal again.&lt;br /&gt;
## Click and hold one of the arrows. Move the mouse to drag the 3D asset towards the box.&lt;br /&gt;
## Move the 3D asset around till it&#039;s &amp;lt;u&amp;gt;completely inside the box&amp;lt;/u&amp;gt;. If it cannot fit and is too big, continue to the next step.&amp;lt;br&amp;gt;&#039;&#039;&#039;Tip:&#039;&#039;&#039; To select the 3D asset once it disappears, use the &#039;&#039;Scene Collection&#039;&#039; panel. Click on it there and the blue, green, and red arrows will show up again for it.&amp;lt;br&amp;gt;&#039;&#039;&#039;Tip:&#039;&#039;&#039; There are preset views. To use them go to the &#039;&#039;View&#039;&#039; menu (second toolbar from top)&#039;&#039;,&#039;&#039; hover &#039;&#039;Viewpoint&#039;&#039;, and select the view that would be most helpful.&lt;br /&gt;
## Find the &#039;&#039;Scale&#039;&#039; tool from the left side of the screen.&lt;br /&gt;
## Now the blue, green, and red &amp;quot;arrows&amp;quot; don&#039;t really look like arrows anymore. They are lines with boxes at the end.&lt;br /&gt;
## Click and hold on those lines to adjust the scale of the 3D asset to make it fit inside the box.&amp;lt;br&amp;gt;&#039;&#039;&#039;Tip:&#039;&#039;&#039; There are little colored boxes in between the lines that can be dragged to scale the 3D asset more proportionally.&lt;br /&gt;
## Continue using the &#039;&#039;Move&#039;&#039; and &#039;&#039;Scale&#039;&#039; tools till the model fits. This will take patience and time.&amp;lt;br&amp;gt;&#039;&#039;&#039;Tip:&#039;&#039;&#039; Hide the reference cube to see what is happening with the 3D asset. Go to the &#039;&#039;Scene Collections&#039;&#039; panel and click the 👁 button to hide it. Click that button again to show it.&lt;br /&gt;
# Move the reference cube&#039;s origin to &amp;lt;code&amp;gt;(0.5, 0.5, 0.5)&amp;lt;/code&amp;gt;...&lt;br /&gt;
## Be in &#039;&#039;Layout&#039;&#039; workspace (top toolbar) and in the &#039;&#039;Object Mode...&#039;&#039;&lt;br /&gt;
### Find the drop down in the second toolbar from the top that has options like &#039;&#039;Object Mode, Edit Mode, Sculpt Mode,&#039;&#039; etc.&lt;br /&gt;
### Select &#039;&#039;Object Mode&#039;&#039; from that drop down.&lt;br /&gt;
## Open the &#039;&#039;View&#039;&#039; menu (second toolbar down).&lt;br /&gt;
## Select &#039;&#039;Sidebar&#039;&#039;.&lt;br /&gt;
## A new panel will have expanded.&lt;br /&gt;
## Along the right side of that panel there&#039;s buttons (&#039;&#039;Item, Tool, View, Animation&#039;&#039;). Find and click the &#039;&#039;View&#039;&#039; button.&lt;br /&gt;
## Find and expand the &#039;&#039;3D Cursor&#039;&#039; section.&lt;br /&gt;
## Set the 3D cursor&#039;s &#039;&#039;Location&#039;&#039;...&lt;br /&gt;
### &#039;&#039;X&#039;&#039; to &#039;&#039;0&#039;&#039;.5.&lt;br /&gt;
### &#039;&#039;Y&#039;&#039; to &#039;&#039;0.5&#039;&#039;.&lt;br /&gt;
### &#039;&#039;Z&#039;&#039; to &#039;&#039;0.5.&#039;&#039;&lt;br /&gt;
## Select the &#039;&#039;MedievalStallMesh&#039;&#039; using the &#039;&#039;Scene Collection&#039;&#039; panel.&lt;br /&gt;
## Open the &#039;&#039;Object&#039;&#039; menu (second toolbar down).&lt;br /&gt;
## Hover &#039;&#039;Set Origin&#039;&#039;.&lt;br /&gt;
## Select &#039;&#039;Origin to 3D Cursor&#039;&#039;.&lt;br /&gt;
# Select the reference cube named &#039;&#039;Cube&#039;&#039; from the &#039;&#039;Scene Collections&#039;&#039; panel.&lt;br /&gt;
# Open &#039;&#039;Object&#039;&#039; menu (second toolbar down).&lt;br /&gt;
# Select &#039;&#039;Delete&#039;&#039;.&lt;br /&gt;
# Move the &#039;&#039;MedievalStallMesh&#039;&#039; to &amp;lt;code&amp;gt;(0, 0, 0)&amp;lt;/code&amp;gt;...&lt;br /&gt;
## Be in &#039;&#039;Layout&#039;&#039; workspace (top toolbar) and in the &#039;&#039;Object Mode...&#039;&#039;&lt;br /&gt;
### Find the drop down in the second toolbar from the top that has options like &#039;&#039;Object Mode, Edit Mode, Sculpt Mode,&#039;&#039; etc.&lt;br /&gt;
### Select &#039;&#039;Object Mode&#039;&#039; from that drop down.&lt;br /&gt;
## Open the &#039;&#039;View&#039;&#039; menu (second toolbar down).&lt;br /&gt;
## Select &#039;&#039;Sidebar&#039;&#039;.&lt;br /&gt;
## A new panel will have expanded.&lt;br /&gt;
## Along the right side of that panel there&#039;s buttons (&#039;&#039;Item, Tool, View, Animation&#039;&#039;). Find and click the &#039;&#039;Item&#039;&#039; button.&lt;br /&gt;
## Make sure the &#039;&#039;MedievalStallMesh&#039;&#039; is selected. Use the &#039;&#039;Scene Collection&#039;&#039; panel if needed.&lt;br /&gt;
## Find and expand the &#039;&#039;Transform&#039;&#039; section&lt;br /&gt;
## Set the &#039;&#039;Location...&#039;&#039;&lt;br /&gt;
### &#039;&#039;X&#039;&#039; to 0.&lt;br /&gt;
### &#039;&#039;Y&#039;&#039; to 0.&lt;br /&gt;
### &#039;&#039;Z&#039;&#039; to 0.&lt;br /&gt;
# Make sure the &#039;&#039;MedievalStallMesh&#039;&#039; is selected. Use the &#039;&#039;Scene Collection&#039;&#039; panel if needed.&lt;br /&gt;
# Open the &#039;&#039;Object&#039;&#039; menu.&lt;br /&gt;
# Hover &#039;&#039;Apply&#039;&#039;.&lt;br /&gt;
# Select &#039;&#039;All Transformations&#039;&#039;.&amp;lt;br&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; This step bakes all of the changes into the mesh. It&#039;s very important.&lt;br /&gt;
# Open the &#039;&#039;File&#039;&#039;  menu from the top toolbar.&lt;br /&gt;
# Hover &#039;&#039;Export&#039;&#039; to open the sub-menu.&lt;br /&gt;
# Select &#039;&#039;FBX (.fbx)&#039;&#039; &lt;br /&gt;
# A &#039;&#039;Blender File View&#039;&#039; window will pop-up.&lt;br /&gt;
# On the right side of this window there&#039;s a ⚙️ icon. Click it to expand the settings region.&lt;br /&gt;
# In the expanded region find the &#039;&#039;Include&#039;&#039; section and expand it. Change the following:&lt;br /&gt;
## Find &#039;&#039;Object Types&#039;&#039; and only select &#039;&#039;Mesh.&#039;&#039; No other option should be highlighted for this setting.&lt;br /&gt;
# In the settings region scroll and find the &#039;&#039;Transform&#039;&#039; section and expand it. Change the following:&lt;br /&gt;
## Find &#039;&#039;Apply Scalings&#039;&#039; and set it to &#039;&#039;FBX All&#039;&#039;.&lt;br /&gt;
## Just below that find &#039;&#039;Forward&#039;&#039; and set it to &#039;&#039;Z Forward&#039;&#039;.&lt;br /&gt;
## Ensure that the next setting down, &#039;&#039;Up&#039;&#039;, changed to &#039;&#039;Y Up&#039;&#039;.&lt;br /&gt;
## Find &#039;&#039;Apply Unit&#039;&#039; and make sure it&#039;s checked.&lt;br /&gt;
## Next, find &#039;&#039;Use Space Transform&#039;&#039; check it.&lt;br /&gt;
## Lastly, find &#039;&#039;Apply Transform&#039;&#039; and check it too.&lt;br /&gt;
# Save it to &amp;lt;code&amp;gt;Assets/WikiDemo/MedievalStall.fbx&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Save the Blender scene...&lt;br /&gt;
## &#039;&#039;File&#039;&#039; drop down from top toolbar.&lt;br /&gt;
## &#039;&#039;Save As...&#039;&#039; to save the Blender scene to the computer.&lt;br /&gt;
## Save it to &amp;lt;code&amp;gt;Assets/WikiDemo/MedievalStall - Eco Ready Scene.blend&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Add to Unity Scene ===&lt;br /&gt;
&lt;br /&gt;
# Open &amp;lt;u&amp;gt;Unity&amp;lt;/u&amp;gt;.&lt;br /&gt;
# Select the &amp;lt;code&amp;gt;.fbx&amp;lt;/code&amp;gt; file in the project window.&lt;br /&gt;
# Open the &#039;&#039;Eco Tools&#039;&#039; menu from the top toolbar.&lt;br /&gt;
# Hover &#039;&#039;Mod Kit&#039;&#039;.&lt;br /&gt;
# Select &#039;&#039;World Object Setup.&#039;&#039;&lt;br /&gt;
# A &#039;&#039;World Object Setup&#039;&#039;  window will pop-up.&lt;br /&gt;
# Make sure that &#039;&#039;Selected Objects&#039;&#039; reads &#039;&#039;MedievalStall.&#039;&#039;&lt;br /&gt;
# Also make sure that &#039;&#039;World Object Type&#039;&#039; is set to &#039;&#039;World Object&#039;&#039;.&lt;br /&gt;
# Press the &#039;&#039;Setup World Objects&#039;&#039; button.&lt;br /&gt;
# Notice in the project window that a new &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt; file was created -- &amp;lt;code&amp;gt;MedievalStallObject.prefab&amp;lt;/code&amp;gt;&lt;br /&gt;
# Select the &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt;.&lt;br /&gt;
# In the &#039;&#039;Inspector&#039;&#039; panel find the &#039;&#039;Transform&#039;&#039; component.&lt;br /&gt;
# Change this component&#039;s &#039;&#039;Rotation...&#039;&#039;&lt;br /&gt;
## &#039;&#039;X&#039;&#039; to &#039;&#039;0.&#039;&#039;&lt;br /&gt;
## &#039;&#039;Y&#039;&#039; to &#039;&#039;0.&#039;&#039;&lt;br /&gt;
## &#039;&#039;Z&#039;&#039; to &#039;&#039;0.&#039;&#039;&lt;br /&gt;
# In the &#039;&#039;Inspector&#039;&#039; panel find the &#039;&#039;Box Collider&#039;&#039; component.&lt;br /&gt;
#Find the &#039;&#039;⋮&#039;&#039; icon (all the way to the right of the words &#039;&#039;Box Collider)&#039;&#039; and click on it.&lt;br /&gt;
#Select &#039;&#039;Reset&#039;&#039; from the menu. This will regenerate the box collider now that the rotation has changed.&lt;br /&gt;
#Look in the &#039;&#039;Inspector&#039;&#039; panel and find the &#039;&#039;World Object (Script)&#039;&#039; component.&lt;br /&gt;
# That component has a checkbox &#039;&#039;Override Occupancy&#039;&#039;. Check it.&lt;br /&gt;
# A new field should&#039;ve expanded below it called &#039;&#039;Size&#039;&#039;.&lt;br /&gt;
# Set the &#039;&#039;Size&#039;&#039;...&amp;lt;br&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; This size similar to the size of the reference cube from earlier, but the Y and Z coordinates get flipped! So if in Blender it was &amp;lt;code&amp;gt;(1, 2, 3)&amp;lt;/code&amp;gt; then in Unity its &amp;lt;code&amp;gt;(1, 3, 2)&amp;lt;/code&amp;gt;.&lt;br /&gt;
## &#039;&#039;X&#039;&#039; to &#039;&#039;4&#039;&#039;.&lt;br /&gt;
## &#039;&#039;Y&#039;&#039; to &#039;&#039;3&#039;&#039;.&lt;br /&gt;
## &#039;&#039;Z&#039;&#039; to &#039;&#039;3&#039;&#039;.&lt;br /&gt;
# Select &#039;&#039;Objects&#039;&#039; from &#039;&#039;Hierarchy&#039;&#039; panel (left-side of the window).&lt;br /&gt;
# Find the &#039;&#039;Modkit Prefab Container (Script)&#039;&#039; component. This component was added earlier, if it&#039;s not there add it now.&lt;br /&gt;
# Expand the &#039;&#039;Prefabs&#039;&#039; section in that component.&lt;br /&gt;
# Click the &#039;&#039;+&#039;&#039; button to add an item to the list.&lt;br /&gt;
# Either...&lt;br /&gt;
## Click the &#039;&#039;⦿&#039;&#039; button, switch to the &#039;&#039;Assets&#039;&#039; tab, find or search for &#039;&#039;MedievalStallObject&#039;&#039;, and double click on it. Make sure it&#039;s the medieval stall &amp;lt;u&amp;gt;object&amp;lt;/u&amp;gt; with the &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt; ending.&lt;br /&gt;
## Drag the &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt; file onto the &#039;&#039;⦿&#039;&#039; button&lt;br /&gt;
# Open the &#039;&#039;File&#039;&#039; menu from top toolbar and select &#039;&#039;Save&#039;&#039;.&amp;lt;br&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; Do not skip. The scene must be saved for the ModKit build to work properly.&lt;br /&gt;
# Open the &#039;&#039;Eco Tools&#039;&#039; menu from the top toolbar.&lt;br /&gt;
# Hover &#039;&#039;Mod Kit&#039;&#039;.&lt;br /&gt;
# Select &#039;&#039;Build Current Bundle&#039;&#039;.&lt;br /&gt;
# Save the bundle to &amp;lt;code&amp;gt;/Eco Server/Mods/UserCode/WikiDemo.unity3d&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Coding the World Object ===&lt;br /&gt;
The following collapses the &amp;lt;code&amp;gt;#region Recipe&amp;lt;/code&amp;gt;. Please see the earlier section [[#Code the Item&#039;s Recipe|Code the Item&#039;s Recipe]] to get the code that belongs there.&lt;br /&gt;
&lt;br /&gt;
Add the new &amp;lt;code&amp;gt;using&amp;lt;/code&amp;gt; lines, replace the &amp;lt;code&amp;gt;#region Item&amp;lt;/code&amp;gt; section, and replace the &amp;lt;code&amp;gt;#region Object&amp;lt;/code&amp;gt; sections using the following:&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;using Eco.Core.Items;&lt;br /&gt;
using Eco.Gameplay.Components;&lt;br /&gt;
using Eco.Gameplay.Items;&lt;br /&gt;
using Eco.Gameplay.Items.Recipes;&lt;br /&gt;
using Eco.Gameplay.Objects;&lt;br /&gt;
using Eco.Gameplay.Skills;&lt;br /&gt;
using Eco.Mods.TechTree;&lt;br /&gt;
using Eco.Shared.Localization;&lt;br /&gt;
using Eco.Shared.Serialization;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Runtime.Versioning;&lt;br /&gt;
using System;&lt;br /&gt;
using Eco.Core.Controller;&lt;br /&gt;
using Eco.Gameplay.Systems.NewTooltip;&lt;br /&gt;
using Eco.Shared.Items;&lt;br /&gt;
using Eco.Gameplay.Occupancy;&lt;br /&gt;
using Eco.Shared.Math;&lt;br /&gt;
using Eco.Gameplay.Components.Auth;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
namespace WikiDemo&lt;br /&gt;
{&lt;br /&gt;
    #region Item&lt;br /&gt;
    [Serialized] // Tells the save/load system this object needs to be serialized.&lt;br /&gt;
    [SupportedOSPlatform(&amp;quot;windows7.0&amp;quot;)]&lt;br /&gt;
    [LocDisplayName(&amp;quot;Market Stall&amp;quot;)] // Defines the localized name of the item.&lt;br /&gt;
    [Weight(3000)] // Defines how heavy this is.&lt;br /&gt;
    [Ecopedia(&amp;quot;Work Stations&amp;quot;, &amp;quot;Craft Tables&amp;quot;, createAsSubPage: true)]&lt;br /&gt;
    [LocDescription(&amp;quot;A medieval market stall.&amp;quot;)] //The tooltip description for the item.&lt;br /&gt;
    public partial class MedievalStallItem : WorldObjectItem&amp;lt;MedievalStallObject&amp;gt;, IPersistentData&lt;br /&gt;
    {&lt;br /&gt;
        [Serialized, SyncToView, NewTooltipChildren(CacheAs.Instance, flags: TTFlags.AllowNonControllerTypeForChildren)] public object? PersistentData { get; set; }&lt;br /&gt;
&lt;br /&gt;
        protected override OccupancyContext GetOccupancyContext =&amp;gt; new SideAttachedContext(&lt;br /&gt;
            DirectionAxisFlags.Down, // Read: every occupied block on the bottom must be supported&lt;br /&gt;
            WorldObject.GetOccupancyInfo(this.WorldObjectType)&lt;br /&gt;
        );&lt;br /&gt;
    }&lt;br /&gt;
    #endregion&lt;br /&gt;
&lt;br /&gt;
    #region Recipe&lt;br /&gt;
&lt;br /&gt;
    #region Object&lt;br /&gt;
    [Serialized]&lt;br /&gt;
    [SupportedOSPlatform(&amp;quot;windows7.0&amp;quot;)]&lt;br /&gt;
    [RequireComponent(typeof(CraftingComponent))]&lt;br /&gt;
    [RequireComponent(typeof(MinimapComponent))]&lt;br /&gt;
    [RequireComponent(typeof(LinkComponent))]&lt;br /&gt;
    [RequireComponent(typeof(OccupancyRequirementComponent))]&lt;br /&gt;
    [Tag(&amp;quot;Usable&amp;quot;)]&lt;br /&gt;
    [Ecopedia(&amp;quot;Work Stations&amp;quot;, &amp;quot;Craft Tables&amp;quot;, subPageName: &amp;quot;Market Stall&amp;quot;)]&lt;br /&gt;
    public partial class MedievalStallObject : WorldObject, IRepresentsItem&lt;br /&gt;
    {&lt;br /&gt;
        public Type RepresentedItemType =&amp;gt; typeof(MedievalStallItem);&lt;br /&gt;
&lt;br /&gt;
        static MedievalStallObject()&lt;br /&gt;
        {&lt;br /&gt;
            WorldObject.AddOccupancy&amp;lt;MedievalStallObject&amp;gt;(CalculateBoxOccupancy(4, 3, 3));&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        protected override void Initialize()&lt;br /&gt;
        {&lt;br /&gt;
            this.ModsPreInitialize();&lt;br /&gt;
            this.GetComponent&amp;lt;LinkComponent&amp;gt;().Initialize(15);&lt;br /&gt;
            this.GetComponent&amp;lt;MinimapComponent&amp;gt;().SetCategory(Localizer.DoStr(&amp;quot;Crafting&amp;quot;));&lt;br /&gt;
            this.ModsPostInitialize();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;Hook for mods to customize WorldObject before initialization. You can change housing values here.&amp;lt;/summary&amp;gt;&lt;br /&gt;
        partial void ModsPreInitialize();&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;Hook for mods to customize WorldObject after initialization.&amp;lt;/summary&amp;gt;&lt;br /&gt;
        partial void ModsPostInitialize();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Calculates the blocks that this item will occupy when placed. All coordinates are offsets relative to this 3D model&#039;s origin&lt;br /&gt;
        /// point. This function can only be used to calculate a box shape; there can be no gaps. All blocks will be of the&lt;br /&gt;
        /// BlockOccupancyType.None type.&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        ///&lt;br /&gt;
        /// Examples:&lt;br /&gt;
        ///     * Imagine a 1x1x1 cube. The origin point of the 3D model is the middle of the bottom-left cube. The only block the&lt;br /&gt;
        ///     cube would occupy would be the same one the origin point is in. In offset coordinates, the only block the cube occupies&lt;br /&gt;
        ///     is (0,0,0) from the origin point.&lt;br /&gt;
        ///     * Image a 1x5x1 flag pole. Again the origin point of the 3D model is in the middle of the bottom most cube. The only&lt;br /&gt;
        ///     blocks the flage pole occupies is the one the origin point is in and the 4 above that one. In offset coordinates, that&lt;br /&gt;
        ///     would be (0,0,0) + (0,1,0) + (0,2,0) + (0,3,0) + (0,4,0).&lt;br /&gt;
        /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br /&gt;
        private static List&amp;lt;BlockOccupancy&amp;gt; CalculateBoxOccupancy(int sizeX, int sizeY, int sizeZ)&lt;br /&gt;
        {&lt;br /&gt;
            var cells = new List&amp;lt;BlockOccupancy&amp;gt;(sizeX * sizeY * sizeZ);&lt;br /&gt;
            for (int x = 0; x &amp;lt; sizeX; x++)&lt;br /&gt;
                for (int y = 0; y &amp;lt; sizeY; y++)&lt;br /&gt;
                    for (int z = 0; z &amp;lt; sizeZ; z++)&lt;br /&gt;
                        cells.Add(new BlockOccupancy(new Vector3i(x, y, z)));&lt;br /&gt;
            return cells;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    #endregion&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Line 30:&#039;&#039;&#039; This changes from implementing &amp;lt;code&amp;gt;Item&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;WorldObjectItem&amp;lt;MedievalStallObject&amp;gt;&amp;lt;/code&amp;gt;. This is what tell Eco that this item has the ability to place a world object into the world.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 32:&#039;&#039;&#039; This defines the object where &amp;lt;code&amp;gt;PersistentData&amp;lt;/code&amp;gt; is stored. Other components like a &#039;&#039;PartsComponet&#039;&#039; would store the information of the table parts&#039; durability in here. in this example, this line is illustrative and doesn&#039;t have any components using it.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 34:&#039;&#039;&#039; Sets the type of occupancy context this world object has. Occupancy is the system used to determine what space blocks and object are in. The &amp;lt;code&amp;gt;SideAttachContext&amp;lt;/code&amp;gt; means that this object must have a certain side supported for it to be attached to the world and valid to be placed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 35:&#039;&#039;&#039; Defines the bottom side as the side this object uses to attach.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 36:&#039;&#039;&#039; This line is getting the list of blocks occupied from a static lookup in &amp;lt;code&amp;gt;WorldObject&amp;lt;/code&amp;gt; for the &amp;lt;code&amp;gt;MedievalStallObject&amp;lt;/code&amp;gt;. See line 60 to see this value set.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 41:&#039;&#039;&#039; The &amp;quot;collapsed&amp;quot; Recipe section. See earlier sections in this guide to see what code belongs here.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 46:&#039;&#039;&#039; Adds a &amp;lt;code&amp;gt;CraftComponent&amp;lt;/code&amp;gt; to the table. This component lets players use this table to craft something on.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 47:&#039;&#039;&#039; &amp;lt;code&amp;gt;MinimapComponent&amp;lt;/code&amp;gt; this registers the object with the minimap. This makes it so when a player places a medieval stall, the minimap shows it. Related: line 67.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 48:&#039;&#039;&#039; &amp;lt;code&amp;gt;LinkComponent&amp;lt;/code&amp;gt; allows storage linking. Related: line 66.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 49:&#039;&#039;&#039; &amp;lt;code&amp;gt;OccupancyRequirementComponent&amp;lt;/code&amp;gt; defines this object as having and occupying physical space. Related: line 60.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 50:&#039;&#039;&#039; Assigns a tag to this object. Like how the tag &#039;&#039;Wood&#039;&#039; in Eco refers to all the different types of logs. In this case, the &#039;&#039;MedievalStallObject&#039;&#039; is being added to the &amp;lt;code&amp;gt;Usable&amp;lt;/code&amp;gt; tag.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 52:&#039;&#039;&#039; Declares the &amp;lt;code&amp;gt;MedievalStallObject&amp;lt;/code&amp;gt;. It&#039;s important that this class name is matches exactly the &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt; file name because the name is what links them.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 54:&#039;&#039;&#039; Declares the item that is given when this world object is picked up.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 58:&#039;&#039;&#039; This sets the occupancy for the world object in the simulation. This must also be set for the object in addition to the &#039;&#039;Override Occupancy&#039;&#039; and &#039;&#039;Size&#039;&#039; setting previously set on the Unity &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt;. That&#039;s because the settings in Unity are used client side. This sets the occupancy on the server side. They both need to be set and be matching for things to work right.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 64:&#039;&#039;&#039; Initializes the &amp;lt;code&amp;gt;LinkComponent&amp;lt;/code&amp;gt; with a base 15 block radius. Know that this value is just the base value and that server settings will determine the actual game play radius.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 65:&#039;&#039;&#039; Initializes the &amp;lt;code&amp;gt;MinimapComponent&amp;lt;/code&amp;gt; and add this object to the &amp;lt;code&amp;gt;Crafting&amp;lt;/code&amp;gt; category.&lt;br /&gt;
&lt;br /&gt;
=== Checkpoint ===&lt;br /&gt;
&lt;br /&gt;
[[File:WikiDemo - Medieval Stall - Checkpoint -3.png|thumb|The Medieval Stall modded into Eco.]]&lt;br /&gt;
&#039;&#039;&#039;Warning:&#039;&#039;&#039; In &#039;&#039;Eco&#039;&#039; v13.0.2, free-placed objects may display misaligned ghost cubes, even when configured correctly in your mod. This is a visual-only base-game bug — placement still works as expected, even if the object appears red near edges. &amp;lt;!-- See: https://github.com/StrangeLoopGames/EcoIssues/issues/25834 --&amp;gt; &lt;br /&gt;
&lt;br /&gt;
# Have the &amp;lt;code&amp;gt;.unity3d&amp;lt;/code&amp;gt; and the &amp;lt;code&amp;gt;.cs&amp;lt;/code&amp;gt; file in the &amp;lt;code&amp;gt;/Eco Server/Mods/UserCode&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
# Start the server and log in.&lt;br /&gt;
# Type &amp;lt;code&amp;gt;/give MedievalStall&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Place the stall down. &#039;&#039;&#039;Pro-tip:&#039;&#039;&#039; Put down a floor of &amp;lt;u&amp;gt;flat roof&amp;lt;/u&amp;gt; tiles made of &#039;&#039;Reinforced Concrete&#039;&#039;. This will show you where the occupancy of your object is when you place it because the roof tiles will change shape under the object. Neat!&lt;br /&gt;
# It should look and function like a normal workbench.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;WikiDemo.unity3d&amp;lt;/code&amp;gt; and the &amp;lt;code&amp;gt;WikiDemo.cs&amp;lt;/code&amp;gt; files are all that is needed to share this mod now.&lt;br /&gt;
&lt;br /&gt;
= Adding a Recipe to Craft =&lt;br /&gt;
To add a recipe to the medieval stall add this to the &amp;lt;code&amp;gt;WikiDemo.cs&amp;lt;/code&amp;gt; file:&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
using Eco.Core.Items;&lt;br /&gt;
using Eco.Gameplay.Components;&lt;br /&gt;
using Eco.Gameplay.Items;&lt;br /&gt;
using Eco.Gameplay.Items.Recipes;&lt;br /&gt;
using Eco.Gameplay.Objects;&lt;br /&gt;
using Eco.Gameplay.Skills;&lt;br /&gt;
using Eco.Mods.TechTree;&lt;br /&gt;
using Eco.Shared.Localization;&lt;br /&gt;
using Eco.Shared.Serialization;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Runtime.Versioning;&lt;br /&gt;
using System;&lt;br /&gt;
using Eco.Core.Controller;&lt;br /&gt;
using Eco.Gameplay.Systems.NewTooltip;&lt;br /&gt;
using Eco.Shared.Items;&lt;br /&gt;
using Eco.Gameplay.Occupancy;&lt;br /&gt;
using Eco.Shared.Math;&lt;br /&gt;
using Eco.Gameplay.Components.Auth;&lt;br /&gt;
&lt;br /&gt;
namespace WikiDemo&lt;br /&gt;
{&lt;br /&gt;
    #region Item&lt;br /&gt;
&lt;br /&gt;
    #region Recipe&lt;br /&gt;
&lt;br /&gt;
    #region Object&lt;br /&gt;
&lt;br /&gt;
    #region CraftingRecipes&lt;br /&gt;
    public partial class MyArrowRecipe : RecipeFamily&lt;br /&gt;
    {&lt;br /&gt;
        [SupportedOSPlatform(&amp;quot;windows7.0&amp;quot;)]&lt;br /&gt;
        public MyArrowRecipe()&lt;br /&gt;
        {&lt;br /&gt;
            var recipe = new Recipe();&lt;br /&gt;
            recipe.Init(&lt;br /&gt;
                name: &amp;quot;Alternate Arrow&amp;quot;,&lt;br /&gt;
                displayName: Localizer.DoStr(&amp;quot;Alternate Arrow&amp;quot;),&lt;br /&gt;
                ingredients: new List&amp;lt;IngredientElement&amp;gt;&lt;br /&gt;
                {&lt;br /&gt;
                    new IngredientElement(&amp;quot;Wood&amp;quot;, 1, typeof(Skill)),&lt;br /&gt;
                    new IngredientElement(&amp;quot;Rock&amp;quot;, 1)&lt;br /&gt;
                },&lt;br /&gt;
                items: new List&amp;lt;CraftingElement&amp;gt;&lt;br /&gt;
                {&lt;br /&gt;
                    new CraftingElement&amp;lt;ArrowItem&amp;gt;(1)&lt;br /&gt;
                }&lt;br /&gt;
            );&lt;br /&gt;
            this.Recipes = new List&amp;lt;Recipe&amp;gt; { recipe };&lt;br /&gt;
            this.LaborInCalories = CreateLaborInCaloriesValue(10);&lt;br /&gt;
            this.CraftMinutes = CreateCraftTimeValue(0.1f);&lt;br /&gt;
&lt;br /&gt;
            // Perform pre/post initialization for user mods and initialize our recipe instance with the display name &amp;quot;Market Stall&amp;quot;&lt;br /&gt;
            this.ModsPreInitialize();&lt;br /&gt;
            this.Initialize(displayText: Localizer.DoStr(&amp;quot;Alternate Arrow Recipe&amp;quot;), recipeType: typeof(MyArrowRecipe));&lt;br /&gt;
            this.ModsPostInitialize();&lt;br /&gt;
&lt;br /&gt;
            // Register our RecipeFamily instance to a work table (in this case the Carpentry Table) so it can be crafted.&lt;br /&gt;
            CraftingComponent.AddRecipe(tableType: typeof(MedievalStallObject), recipeFamily: this); // NOTE: The table must be the object instance!&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;Hook for other mods to customize RecipeFamily before initialization.&amp;lt;/summary&amp;gt;&lt;br /&gt;
        partial void ModsPreInitialize();&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;Hook for other mods to customize RecipeFamily after initialization, but before registration. You can change skill requirements here.&amp;lt;/summary&amp;gt;&lt;br /&gt;
        partial void ModsPostInitialize();&lt;br /&gt;
    }&lt;br /&gt;
    #endregion&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[File:WikiDemo MedievalStall AltArrowRecipe.png|thumb|Shows a new recipe added to the crafting tab of the Medieval Stall.]]&lt;br /&gt;
&#039;&#039;&#039;Line 58:&#039;&#039;&#039; This line here adds this recipe to the &amp;lt;code&amp;gt;MedievalStallObject&amp;lt;/code&amp;gt; just created.&lt;/div&gt;</summary>
		<author><name>WugWugg</name></author>
	</entry>
	<entry>
		<id>https://wiki.play.eco/en/index.php?title=Mod_Development&amp;diff=16738</id>
		<title>Mod Development</title>
		<link rel="alternate" type="text/html" href="https://wiki.play.eco/en/index.php?title=Mod_Development&amp;diff=16738"/>
		<updated>2026-04-29T00:20:44Z</updated>

		<summary type="html">&lt;p&gt;WugWugg: Updated Player Contributed Written Guides&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;container-fluid&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;[[File:EcoModKit.jpg|class=headbanner|link=]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
NOTE: The modding system is under heavy development. APIs are expected to change, which may break existing mods! &lt;br /&gt;
Feel free to update any information on this wiki that is out of date.&lt;br /&gt;
&lt;br /&gt;
To get started on developing mods, see [[Installing the ModKit]]. For some example mods, see the [https://github.com/StrangeLoopGames/EcoModKit EcoModKit] repository.&lt;br /&gt;
== Documentation ==&lt;br /&gt;
Documentation of the server and game client code is available at [https://docs.play.eco https://docs.play.eco]. This is updated when the game is released to the latest version.&lt;br /&gt;
== Discord ==&lt;br /&gt;
You can discuss mods and modding on the {{EcoDiscord}}.&lt;br /&gt;
&lt;br /&gt;
We have multiple channels:&lt;br /&gt;
* &#039;&#039;&#039;#mod-ads&#039;&#039;&#039; for advertising your own mods.&lt;br /&gt;
* &#039;&#039;&#039;#mod-dev&#039;&#039;&#039; for talk about the development of mods.&lt;br /&gt;
* &#039;&#039;&#039;#mod-talk&#039;&#039;&#039; for general talk about mods, such as what existing mods to use or how to make basic changes to the game.&lt;br /&gt;
* &#039;&#039;&#039;#mod-help&#039;&#039;&#039; for issues with mods.&lt;br /&gt;
== Tools ==&lt;br /&gt;
{{SLG}} recommends using the latest versions of Visual Studio and Unity.&lt;br /&gt;
* [https://visualstudio.microsoft.com/downloads/ Visual Studio 2022 Community edition] (free)&lt;br /&gt;
* See [https://unity3d.com/get-unity/download/archive Unity Downloads] to download the version of Unity that matches the ProjectVersion.txt in the modkit you are using.&lt;br /&gt;
&lt;br /&gt;
== Official Guides ==&lt;br /&gt;
[[Installing the ModKit]]&lt;br /&gt;
&lt;br /&gt;
You can now &#039;&#039;&#039;earn a cut of every transaction in worlds that use your mods&#039;&#039;&#039;!  Follow this guide to set it up: [[Registered Mods]]&lt;br /&gt;
&lt;br /&gt;
Modkit examples&lt;br /&gt;
* [[Corn-on-the-cob example mod]]&lt;br /&gt;
* [[Flag example mod]]&lt;br /&gt;
== Player Contributed Written Guides ==&lt;br /&gt;
* [https://docs.google.com/document/d/1zQFcIxWZcPSZgc3PzbsXHj373Z_ndUW_Q7HfI3iFV5E/ FZM. Eco Mod Tutorial: Creating New Constructable Blocks]&lt;br /&gt;
* [https://docs.google.com/document/d/1SGDqJoKlHYL16j94L5jISO8281w-uoKuQeAm9KcUOmY/ Eco Mod Tutorial: The Item Class]&lt;br /&gt;
* [[Getting Started with Eco Modding in Visual Studio 2022]]&lt;br /&gt;
* [[Helpful Examples for Modding]]&lt;br /&gt;
* [[From 3D Asset to Working Worktable]]&lt;br /&gt;
== Player Contributed Video Guides ==&lt;br /&gt;
&amp;lt;youtube dimensions=&amp;quot;400x240&amp;quot; description=&amp;quot;Getting Setup To Make Mods In Eco&amp;quot; container=&amp;quot;frame&amp;quot;&amp;gt;VamhpTr-wG8&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&amp;lt;youtube dimensions=&amp;quot;400x240&amp;quot; description=&amp;quot;Making Your First Item In Eco&amp;quot; container=&amp;quot;frame&amp;quot;&amp;gt;By75wsj_R2o&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&amp;lt;youtube dimensions=&amp;quot;400x240&amp;quot; description=&amp;quot;Making Your First Item PT2 - World Objects (Unity)&amp;quot; container=&amp;quot;frame&amp;quot;&amp;gt;-4JcxeB27jU&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&amp;lt;youtube dimensions=&amp;quot;400x240&amp;quot; description=&amp;quot;Using Other Mods within Your Own Mod&amp;quot; container=&amp;quot;frame&amp;quot;&amp;gt;hu-Jsk67vdw&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Other Resources ==&lt;br /&gt;
* [https://github.com/StrangeLoopGames/EcoModKit Eco Modkit] (check Wiki tab for documentation)&lt;br /&gt;
* [https://github.com/StrangeLoopGames/EcoModKit/wiki/Tutorial-Ceiling-Fan-Light Tutorial: Ceiling Fan Light]&lt;br /&gt;
[[Category: Modding]]&lt;/div&gt;</summary>
		<author><name>WugWugg</name></author>
	</entry>
	<entry>
		<id>https://wiki.play.eco/en/index.php?title=From_3D_Asset_to_Working_Worktable&amp;diff=16737</id>
		<title>From 3D Asset to Working Worktable</title>
		<link rel="alternate" type="text/html" href="https://wiki.play.eco/en/index.php?title=From_3D_Asset_to_Working_Worktable&amp;diff=16737"/>
		<updated>2026-04-29T00:19:23Z</updated>

		<summary type="html">&lt;p&gt;WugWugg: Done. This guide is long and probably too repetitive, but it will produce results!&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction =&lt;br /&gt;
Below is a guide on how to take an 3D asset from the Unity Store and make a working workbench in Eco. This includes:&lt;br /&gt;
* Creating a recipe to craft the modded table&lt;br /&gt;
* Creating recipes so the player can use the modded table to craft something&lt;br /&gt;
* Using Blender to generate a modded icon (seen when holding it in inventory)&lt;br /&gt;
* Using Blender to adjust the origin point of the model&lt;br /&gt;
* How to setup all this in a Unity scene and package for Eco&lt;br /&gt;
&lt;br /&gt;
= Setup =&lt;br /&gt;
&lt;br /&gt;
* Already have setup &#039;&#039;&#039;ModKit + Unity&#039;&#039;&#039;&lt;br /&gt;
** See: [[Installing the ModKit]]&lt;br /&gt;
* Have a &#039;&#039;&#039;3D model&#039;&#039;&#039;&lt;br /&gt;
** Just following along? Find the one used here at &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://assetstore.unity.com/packages/3d/props/low-poly-medieval-market-stalls-314286&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* A &#039;&#039;&#039;C# IDE&#039;&#039;&#039; (notepad++, Visual Studio, etc.)&lt;br /&gt;
** Highly encouraged to have an Intellisense setup and linked to the &#039;&#039;&#039;Reference Assemblies&#039;&#039;&#039;. Optional, but its really worth the time to figure out because it will help quickly correct small typos and trivial mistakes.&lt;br /&gt;
** See: [[Getting Started with Eco Modding in Visual Studio 2022]] (generally the same steps apply if using a new version of Visual Studio)&lt;br /&gt;
* &#039;&#039;&#039;Blender&#039;&#039;&#039; installed&lt;br /&gt;
** Homepage: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://www.blender.org/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Importing the Assets ==&lt;br /&gt;
&lt;br /&gt;
# Open the Unity editor to the project.&lt;br /&gt;
# From the top toolbar open the &#039;&#039;Window&#039;&#039; drop down.&lt;br /&gt;
# Hover &#039;&#039;Package Management&#039;&#039; to open sub-menu.&lt;br /&gt;
# Select &#039;&#039;Package Manager&#039;&#039;.&lt;br /&gt;
# The &#039;&#039;Package Manager&#039;&#039; window will pop-up.&lt;br /&gt;
# Install the package containing the assets you want to use...&lt;br /&gt;
## &amp;lt;u&amp;gt;If not using Unity Registry&amp;lt;/u&amp;gt;...&lt;br /&gt;
### Find the &#039;&#039;+▾&#039;&#039; button in the top left and open the drop down.&lt;br /&gt;
### Install the package from one of those options.&lt;br /&gt;
## &amp;lt;u&amp;gt;If using Unity Registry&amp;lt;/u&amp;gt;...&lt;br /&gt;
### Visit &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://assetstore.unity.com&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; and sign in.&lt;br /&gt;
### Search for the asset desired.&lt;br /&gt;
### Go to it&#039;s page (e.g. &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://assetstore.unity.com/packages/3d/props/low-poly-medieval-market-stalls-314286&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;) and click the big blue button, &#039;&#039;Add to My Assets.&#039;&#039;&lt;br /&gt;
### Now, in the Unity editor and back at the &#039;&#039;Package Manager&#039;&#039; window.&lt;br /&gt;
### Find &#039;&#039;My Assets&#039;&#039; on the left menu and navigate to it.&lt;br /&gt;
### Click the &#039;&#039;⟳&#039;&#039; button in the lower-right.&lt;br /&gt;
### The asset should be in the list now. Use the search to filter if needed.&lt;br /&gt;
### Click on the asset in the list. For those following along, &#039;&#039;Low Poly Medieval Market Stalls&#039;&#039;.&lt;br /&gt;
### In the right panel, find the &#039;&#039;Download ⤓&#039;&#039; button. Click it.&lt;br /&gt;
### Once downloaded, a new button should show up, it&#039;ll say something like &#039;&#039;⊕ Import 1.0 to project&#039;&#039; . Click it.&lt;br /&gt;
### The &#039;&#039;Import Unity Package&#039;&#039; window will pop-up.&lt;br /&gt;
### Select &#039;&#039;Import&#039;&#039; on it.&lt;br /&gt;
# Verify you can find your assets from the explorer. If following along, the assets are at &amp;lt;code&amp;gt;Assets/PolyRonin/Medieval Market Stalls&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Load in a demo scene, if provided, and make sure everything looks okay.&lt;br /&gt;
## For those following along, double click on the &#039;&#039;Demo&#039;&#039; scene at &amp;lt;code&amp;gt;Assets/PolyRonin/Medieval Market Stalls/Demo.unity&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:Eco - Unity - View Modes.png|thumb|Underlined in red are the different draw mode buttons. &amp;lt;u&amp;gt;4/20/26&amp;lt;/u&amp;gt;]]&lt;br /&gt;
If something seems off, check the different draw modes and see if changing those allow the scene to render as expected (see picture).&lt;br /&gt;
&lt;br /&gt;
= Creating The Worktable =&lt;br /&gt;
This guide will create the worktable in this order:&lt;br /&gt;
&lt;br /&gt;
# Create the item that represents the worktable&lt;br /&gt;
# Make a recipe to craft the worktable item&lt;br /&gt;
# Make the worktable item something that places a world object&lt;br /&gt;
# Give the worktable functionality by adding recipes to it&lt;br /&gt;
&lt;br /&gt;
== Creating the Item ==&lt;br /&gt;
&lt;br /&gt;
=== Item Icon ===&lt;br /&gt;
[[File:TeamstersStall - StallOnly - 256x256.png|thumb|A large (256x256px) icon created of Stall4 from the medieval assets.]]&lt;br /&gt;
# Open &amp;lt;u&amp;gt;Blender&amp;lt;/u&amp;gt;.&lt;br /&gt;
# Delete everything in the &#039;&#039;Scene Collection&#039;&#039;. Find this section in the top-right of the application.&lt;br /&gt;
# From the top toolbar, open the &#039;&#039;File&#039;&#039; drop down.&lt;br /&gt;
# Hover &#039;&#039;Import&#039;&#039; to open the sub-menu.&lt;br /&gt;
# Select the type of 3D asset. For those using medieval assets, select &#039;&#039;FBX (.fbx)&#039;&#039;.&lt;br /&gt;
# Find the asset on the computer...&amp;lt;br&amp;gt;&#039;&#039;&#039;Tip:&#039;&#039;&#039; Use Unity to find the &amp;lt;code&amp;gt;.fbx&amp;lt;/code&amp;gt; asset. &lt;br /&gt;
## For the medieval assets, that&#039;s in &amp;lt;code&amp;gt;Assets/PolyRonin/Medieval Market Stalls/Meshes/medieval-market-stalls-1.fbx&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Right click on it and select &#039;&#039;Show in explorer&#039;&#039;.&lt;br /&gt;
## Now copy the address of that folder from Explorer. It might look like &amp;lt;code&amp;gt;C:\Users\Wug\EcoMod--WikiDemo\WikiDemo\Assets\PolyRonin\Medieval Market Stalls\Meshes&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Paste that in the address bar of the &amp;lt;u&amp;gt;Blender&amp;lt;/u&amp;gt; import pop-up.&lt;br /&gt;
# Select the blue &#039;&#039;Import FBX&#039;&#039; button&#039;&#039;.&#039;&#039;&lt;br /&gt;
# Be in the &#039;&#039;Layout&#039;&#039; workspace (top toolbar) and in the &#039;&#039;Object Mode...&#039;&#039;&lt;br /&gt;
## Find the drop down in the second toolbar from the top that has options like &#039;&#039;Object Mode, Edit Mode, Sculpt Mode,&#039;&#039; etc.&lt;br /&gt;
## Select &#039;&#039;Object Mode&#039;&#039; from that drop down.&lt;br /&gt;
# Change the Viewport Shading to Material Preview or Rendered. This is on the second toolbar down, far right of center, but before &#039;&#039;Scene Collection&#039;&#039; section.&lt;br /&gt;
# If you see purple models, Blender will need help finding textures for these meshes...&lt;br /&gt;
## From the top toolbar, open the &#039;&#039;File&#039;&#039; drop down.&lt;br /&gt;
## Hover &#039;&#039;External Data&#039;&#039; to open the sub-menu.&lt;br /&gt;
## Select &#039;&#039;Find Missing Files...&#039;&#039;&lt;br /&gt;
## Point this to the whole directory that the 3D assets came in. For the medieval pack, &amp;lt;code&amp;gt;C:\Users\&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;Wug\EcoMod--WikiDemo\WikiDemo\Assets\PolyRonin&amp;lt;/code&amp;gt;.&lt;br /&gt;
## The proper textures/materials should have now loaded in. If it hasn&#039;t, consult Google because without the textures the following steps won&#039;t produce a usable icon.&lt;br /&gt;
# Add a source of light...&lt;br /&gt;
## Still be in the &#039;&#039;Layout&#039;&#039; workspace (top toolbar) and in the &#039;&#039;Object Mode...&#039;&#039;&lt;br /&gt;
### Find the drop down in the second toolbar from the top that has options like &#039;&#039;Object Mode, Edit Mode, Sculpt Mode,&#039;&#039; etc.&lt;br /&gt;
### Select &#039;&#039;Object Mode&#039;&#039; from that drop down.&lt;br /&gt;
## From the toolbar just under that one, find and open the &#039;&#039;Add&#039;&#039; drop down.&lt;br /&gt;
## Hover &#039;&#039;Light&#039;&#039; to open that sub-menu.&lt;br /&gt;
## Click &#039;&#039;Sun&#039;&#039;.&lt;br /&gt;
# Add a camera...&lt;br /&gt;
## In the &#039;&#039;Layout&#039;&#039; workspace (top toolbar) and in the &#039;&#039;Object Mode...&#039;&#039;&lt;br /&gt;
### Find the drop down in the second toolbar from the top that has options like &#039;&#039;Object Mode, Edit Mode, Sculpt Mode,&#039;&#039; etc.&lt;br /&gt;
### Select &#039;&#039;Object Mode&#039;&#039; from that drop down.&lt;br /&gt;
## From the second toolbar down, find and open the &#039;&#039;Add&#039;&#039; drop down.&lt;br /&gt;
## Select &#039;&#039;Camera&#039;&#039;.&lt;br /&gt;
# Setup the scene with the object placement and lighting direction desired.&amp;lt;br&amp;gt;&#039;&#039;&#039;Tip:&#039;&#039;&#039; To reset the editor to something selected press the period key &amp;lt;u&amp;gt;on the numpad&amp;lt;/u&amp;gt;. Without a numpad, use &#039;&#039;View&#039;&#039; (second toolbar from the top) and select &#039;&#039;Frame Selected&#039;&#039; from it. Alternatively, just set the zoom to zoom to the mouse position: &#039;&#039;Edit&#039;&#039; (top toolbar), &#039;&#039;Preferences&#039;&#039; (from drop down), &#039;&#039;Navigation&#039;&#039; (on left menu), &#039;&#039;Zoom to Mouse Position&#039;&#039; (In the zoom section). This makes moving around a lot more natural feeling.&lt;br /&gt;
# Setup the rendering camera...&lt;br /&gt;
## Go to &#039;&#039;Rendering&#039;&#039;  tab on the top toolbar&lt;br /&gt;
## On the right there will be a side-panel open, it should be the &#039;&#039;Render&#039;&#039; tab. Confirm that.&lt;br /&gt;
## Change &#039;&#039;Render Engine&#039;&#039; to &#039;&#039;Cycles&#039;&#039;.&lt;br /&gt;
## Look down below in the same tab for the &#039;&#039;Film&#039;&#039; section.&lt;br /&gt;
## Expand it and find the &#039;&#039;Transparent&#039;&#039; checkbox and section. Click it so that it has a check mark. This will make the icon&#039;s background transparent.&lt;br /&gt;
## Now, go to the &#039;&#039;Output&#039;&#039; tab &amp;lt;u&amp;gt;on the side panel&amp;lt;/u&amp;gt;. The tab is just below the current one.&lt;br /&gt;
## In the &#039;&#039;Format&#039;&#039; section set &#039;&#039;Resolution X&#039;&#039; to &#039;&#039;64.&#039;&#039; And &#039;&#039;Y&#039;&#039; to &#039;&#039;64&#039;&#039; as well. This will make the icon generated a 64 by 64 pixel image.&lt;br /&gt;
# Go back to the &#039;&#039;Layout&#039;&#039; tab from the top toolbar.&lt;br /&gt;
# Center your view on the object (numpad period or &#039;&#039;View &amp;gt; Frame Selected&#039;&#039;). Adjust it so that the object is how it should be for the icon.&lt;br /&gt;
# Align the camera to the view...&lt;br /&gt;
## Make sure the editor is in &#039;&#039;Layout&#039;&#039; workspace (top toolbar) and in the &#039;&#039;Object Mode...&#039;&#039;&lt;br /&gt;
### Find the drop down in the second toolbar from the top that has options like &#039;&#039;Object Mode, Edit Mode, Sculpt Mode,&#039;&#039; etc.&lt;br /&gt;
### Select &#039;&#039;Object Mode&#039;&#039; from that drop down.&lt;br /&gt;
## Find &#039;&#039;View&#039;&#039; from the second from the top toolbar and open the drop down.&lt;br /&gt;
## Hover &#039;&#039;Align View&#039;&#039; to open the sub-menu.&lt;br /&gt;
## Select &#039;&#039;Align Active Camera To View&#039;&#039;.&lt;br /&gt;
## If the view is slightly off, there is a lock icon on the right side of this panel. Use it to &amp;quot;lock&amp;quot; controls to the camera and tweak it&#039;s view.&lt;br /&gt;
# Now return to the &#039;&#039;Rendering&#039;&#039; tab from the top toolbar.&lt;br /&gt;
# Press the F12 key to start the render. This should complete quickly since 64x64 pixels is a very small render.&lt;br /&gt;
# A window should popup, &#039;&#039;Blender Render&#039;&#039;. This is the icon!&lt;br /&gt;
# From the top tool bar of this &#039;&#039;Blender Render&#039;&#039; window, open the &#039;&#039;Image&#039;&#039; drop down.&lt;br /&gt;
# Select &#039;&#039;Save As...&#039;&#039; to save somewhere on the computer.&lt;br /&gt;
# Return to step 13 and repeat to do larger images if desired. Create a 128 by 128 pixel image too. It will make things smoother later.&lt;br /&gt;
# Save the Blender scene. Not only will it be used later, this will make making a new icon with a small tweak that much easier.&lt;br /&gt;
## &#039;&#039;File&#039;&#039; drop down from top toolbar.&lt;br /&gt;
## &#039;&#039;Save As...&#039;&#039; to save the Blender scene to the computer.&lt;br /&gt;
## Save it to &amp;lt;code&amp;gt;Assets/WikiDemo/MedievalStall - Icon Scene.blend&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Adding to Unity Scene ===&lt;br /&gt;
The developers explain how to create an item in one of ModKit&#039;s read me files (See: &amp;lt;code&amp;gt;Assets/EcoModKit/Docs/README.md&amp;lt;/code&amp;gt;), but this guide will explain it below.&lt;br /&gt;
&lt;br /&gt;
Additionally, &#039;&#039;&#039;TheKye&#039;&#039;&#039; on YouTube covers this in their &#039;&#039;Creating Your First Item&#039;&#039; and &#039;&#039;Creating Your First Item Pt 2&#039;&#039; videos.&lt;br /&gt;
&lt;br /&gt;
Use those additional resource to help troubleshoot issues with item&#039;s icons.&lt;br /&gt;
&lt;br /&gt;
# Open &amp;lt;u&amp;gt;Unity&amp;lt;/u&amp;gt;.&lt;br /&gt;
# In the left panel, the &#039;&#039;Hierarchy&#039;&#039; tab should be selected.&lt;br /&gt;
# Select the top-most object there. It should be a scene. If the editor last loaded the &#039;&#039;Demo&#039;&#039; scene from the medieval assets, it&#039;ll be named &#039;&#039;Demo&#039;&#039;.&lt;br /&gt;
# Right click on this scene and select &#039;&#039;Add New Scene&#039;&#039; from the menu.&lt;br /&gt;
# Right click again on the old scene (&#039;&#039;Demo&#039;&#039;) and select &#039;&#039;Remove Scene&#039;&#039;.&lt;br /&gt;
# Let it save if the changes to the old scene are important. Discard if it was open just for exploration&#039;s sake.&lt;br /&gt;
# Right click the new, &#039;&#039;Untitled&#039;&#039; scene. Click &#039;&#039;Save Scene As...&#039;&#039;&lt;br /&gt;
# Save it to &amp;lt;code&amp;gt;Assets/WikiDemo.unity&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Delete &amp;lt;u&amp;gt;anything&amp;lt;/u&amp;gt; in the scene.&lt;br /&gt;
# Right click the scene, hover &#039;&#039;GameObject&#039;&#039;, and select &#039;&#039;Create Empty&#039;&#039; from the sub-menu.&lt;br /&gt;
# Name this new object &#039;&#039;Objects&#039;&#039;.&lt;br /&gt;
# Select the newly created &#039;&#039;Objects&#039;&#039; object from the &#039;&#039;Hierarchy&#039;&#039; menu.&lt;br /&gt;
# On the far right side of the screen, in the &#039;&#039;Inspector&#039;&#039; menu, click the &#039;&#039;Add Component&#039;&#039; button.&lt;br /&gt;
# Type in &#039;&#039;ModkitPrefabContainer&#039;&#039;. Click on the component from the search to add it. The component now should be listed in the &#039;&#039;Inspector&#039;&#039;.&lt;br /&gt;
# In the &#039;&#039;Hierarchy&#039;&#039; panel right click the scene, hover &#039;&#039;GameObject&#039;&#039;, and select &#039;&#039;Create Empty&#039;&#039;.&lt;br /&gt;
# Name this new object &#039;&#039;Items&#039;&#039;.&lt;br /&gt;
# Right click the scene, hover &#039;&#039;GameObject&#039;&#039;, and select &#039;&#039;Create Empty&#039;&#039;.&lt;br /&gt;
# Name this new object &#039;&#039;Emoji&#039;&#039;.&lt;br /&gt;
# Select the newly created &#039;&#039;Emoji&#039;&#039; object, find the &#039;&#039;Inspector&#039;&#039; menu (far-right), and click the &#039;&#039;Add Component&#039;&#039; button.&lt;br /&gt;
# Type in &#039;&#039;ChatEmoteSetOld&#039;&#039;. Click on the component from the search to add it. That component should now be listed in the &#039;&#039;Inspector&#039;&#039;.&lt;br /&gt;
# Right click the scene, hover &#039;&#039;GameObject&#039;&#039;, and select &#039;&#039;Create Empty&#039;&#039;.&lt;br /&gt;
# Name this new object &#039;&#039;BlockSets&#039;&#039;.&lt;br /&gt;
# Select the newly created &#039;&#039;BlockSets&#039;&#039; object, find the &#039;&#039;Inspector&#039;&#039; menu (far-right), and click &#039;&#039;Add Component&#039;&#039;.&lt;br /&gt;
# Search for &#039;&#039;BlockSetContainer&#039;&#039;. Click on the component from the search to add it. The &#039;&#039;Inspector&#039;&#039; should now show that component as added.&lt;br /&gt;
#Go to &amp;lt;code&amp;gt;Assets/EcoModKit/Prefabs&amp;lt;/code&amp;gt; in the Unity project window.&lt;br /&gt;
# Find the prefab &#039;&#039;ItemTemplate&#039;&#039;.&lt;br /&gt;
# Drag it onto the &#039;&#039;Items&#039;&#039; object in the &#039;&#039;Hierarchy&#039;&#039; panel. It should add it as a &amp;lt;u&amp;gt;child&amp;lt;/u&amp;gt; of the &#039;&#039;Items&#039;&#039; object.&lt;br /&gt;
# Right click on the new &#039;&#039;ItemTemplate&#039;&#039; object, hover &#039;&#039;Prefab&#039;&#039;, and select &#039;&#039;Unpack Completely&#039;&#039;.&lt;br /&gt;
# Right click on the &#039;&#039;ItemTemplate&#039;&#039; object and select &#039;&#039;Rename&#039;&#039;. Name this what you want the item to be called. Example: &#039;&#039;MedievalStallItem&#039;&#039;.&lt;br /&gt;
# Set this item&#039;s background...&lt;br /&gt;
## Here&#039;s the default backgrounds (blue = item, brown = block, green = food): &amp;lt;br&amp;gt;[[File:Eco - Item - Background.png|border|frameless]]        [[File:Eco - Block - Background.png|frameless]]        [[File:Eco - Food - Background.png|frameless]]&lt;br /&gt;
## Download or prepare the background and add it to the &amp;lt;code&amp;gt;Assets&amp;lt;/code&amp;gt; folder in Unity. &lt;br /&gt;
### To follow along lockstep, put the background in a new &amp;lt;code&amp;gt;Assets/WikiDemo&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
### Right click on &amp;lt;code&amp;gt;Assets&amp;lt;/code&amp;gt; folder, hover &#039;&#039;Create&#039;&#039;, select &#039;&#039;Folder&#039;&#039;.&lt;br /&gt;
### Name the folder &#039;&#039;WikiDemo&#039;&#039;.&lt;br /&gt;
## Configure Unity to use these as sprites...&lt;br /&gt;
### Select the background(s) added (Ctrl+Click each one).&lt;br /&gt;
### In the &#039;&#039;Inspector&#039;&#039;, find &#039;&#039;TextureType&#039;&#039; and change that to &#039;&#039;Sprite (2D and UI)&#039;&#039;.&lt;br /&gt;
### Again in the &#039;&#039;Inspector&#039;&#039;, find &#039;&#039;SpriteMode&#039;&#039; and change that to &#039;&#039;Single&#039;&#039;.&lt;br /&gt;
### Then scroll and go to the bottom of the &#039;&#039;Inspector&#039;&#039; and find the &#039;&#039;Apply&#039;&#039; button.&lt;br /&gt;
### This will apply those changes to that file and all other ones highlighted.&lt;br /&gt;
## Select the item being created (&#039;&#039;MedievalStallItem&#039;&#039;).&lt;br /&gt;
## In the &#039;&#039;Inspector&#039;&#039; panel (far-right), scroll and find the &#039;&#039;Item Template (Script)&#039;&#039; section.&lt;br /&gt;
## In here find the &#039;&#039;Background&#039;&#039; input. It&#039;ll say &#039;&#039;Background (Image)&#039;&#039; in it. If clicked that text to reveal and highlight the related object in the &#039;&#039;Hierarchy&#039;&#039; panel.&lt;br /&gt;
## Select the revealed, and highlighted object &#039;&#039;Background&#039;&#039;.&lt;br /&gt;
## In the &#039;&#039;Inspector&#039;&#039; panel, scroll and find the &#039;&#039;Image&#039;&#039; component section.&lt;br /&gt;
## Inside that component&#039;s section, find &#039;&#039;Source Image&#039;&#039;. It&#039;ll say &#039;&#039;Missing (Sprite)&#039;&#039;. Click the &#039;&#039;⦿&#039;&#039; button to the right.&lt;br /&gt;
## The &#039;&#039;Select Sprite&#039;&#039; popup will show. Make sure the &#039;&#039;Assets&#039;&#039; tab is selected, and find the backgrounds desired.&lt;br /&gt;
#Create the foreground image...&lt;br /&gt;
##This is easily accomplished in MS Paint.&lt;br /&gt;
##Get to the background image file in a &amp;lt;u&amp;gt;file explorer&amp;lt;/u&amp;gt;.&lt;br /&gt;
##Right click on it, hover &#039;&#039;Open with...&#039;&#039;, and select &#039;&#039;Paint&#039;&#039;.&lt;br /&gt;
##The solid background should be displayed.&lt;br /&gt;
##Open the &#039;&#039;File&#039;&#039; menu from the top toolbar.&lt;br /&gt;
##Hover &#039;&#039;Import to Canvas&#039;&#039; and select &#039;&#039;From a File&#039;&#039;.&lt;br /&gt;
##Find the icon in the file browser and import it. Match the size of the background image to have it nicely center itself.&lt;br /&gt;
##Now &#039;&#039;File&#039;&#039; from the top toolbar.&lt;br /&gt;
##Hover &#039;&#039;Save As...&#039;&#039; and select &#039;&#039;PNG&#039;&#039;.&lt;br /&gt;
##Save this to the &amp;lt;code&amp;gt;Assets/WikiDemo&amp;lt;/code&amp;gt; folder in Unity.&lt;br /&gt;
##Configure Unity to use these as sprites...&lt;br /&gt;
### Select the foreground image.&lt;br /&gt;
### In the &#039;&#039;Inspector&#039;&#039;, find &#039;&#039;TextureType&#039;&#039; and change that to &#039;&#039;Sprite (2D and UI)&#039;&#039;.&lt;br /&gt;
### Again in the &#039;&#039;Inspector&#039;&#039;, find &#039;&#039;SpriteMode&#039;&#039; and change that to &#039;&#039;Single&#039;&#039;.&lt;br /&gt;
### Then scroll and go to the bottom of the &#039;&#039;Inspector&#039;&#039; and find the &#039;&#039;Apply&#039;&#039; button.&lt;br /&gt;
### This will apply those changes to that file and all other ones highlighted.&lt;br /&gt;
#Set this item&#039;s foreground...&lt;br /&gt;
## Copy the item&#039;s icon into the &amp;lt;code&amp;gt;Assets&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
## Configure Unity to use it as a sprite (see the previous step&#039;s &#039;&#039;Set this item&#039;s background...&#039;&#039; instructions)&lt;br /&gt;
## Select the item being created (&#039;&#039;MedievalStallItem&#039;&#039;).&lt;br /&gt;
## In the &#039;&#039;Inspector&#039;&#039; panel (far-right), scroll and find the &#039;&#039;Item Template (Script)&#039;&#039; section.&lt;br /&gt;
## In here find the &#039;&#039;Foreground&#039;&#039; input. It&#039;ll say &#039;&#039;Foreground (Image)&#039;&#039; in it. If clicked that text to reveal and highlight the related object in the &#039;&#039;Hierarchy&#039;&#039; panel.&lt;br /&gt;
## Select the revealed, and highlighted object &#039;&#039;Foreground&#039;&#039;.&lt;br /&gt;
## Use the &#039;&#039;Inspector&#039;&#039;, find the &#039;&#039;Image&#039;&#039; component, within that component find the &#039;&#039;Source Image&#039;&#039; input. It will say &#039;&#039;Missing (Sprite)&#039;&#039;.&lt;br /&gt;
## Click the &#039;&#039;⦿&#039;&#039; button to the right of that input.&lt;br /&gt;
## From the &#039;&#039;Select Sprite&#039;&#039; popup, ensure the &#039;&#039;Assets&#039;&#039; tab is being searched, and find the icon just created.&lt;br /&gt;
&lt;br /&gt;
=== Export From Unity ===&lt;br /&gt;
&lt;br /&gt;
# Open the &#039;&#039;File&#039;&#039; menu from the top toolbar.&lt;br /&gt;
# Select &#039;&#039;Save.&#039;&#039; Save it to the &amp;lt;code&amp;gt;Assets/WikiDemo&amp;lt;/code&amp;gt; folder.&amp;lt;br&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; Do not skip. The scene must be saved for the ModKit build to work properly.&lt;br /&gt;
# Open the &#039;&#039;Eco Tools&#039;&#039; menu from the top toolbar.&lt;br /&gt;
# Hover &#039;&#039;Mod Kit&#039;&#039; to open the sub-menu.&lt;br /&gt;
# Select &#039;&#039;Build Current Bundle&#039;&#039;.&lt;br /&gt;
# Have it output the bundle to &amp;lt;code&amp;gt;/Eco Server/Mods/UserCode/WikiDemo.unity3d&amp;lt;/code&amp;gt;&lt;br /&gt;
# Wait for this to build. This may take a few minutes.&lt;br /&gt;
&lt;br /&gt;
=== Coding the Item ===&lt;br /&gt;
For this guide, all code will be placed in a single &amp;lt;code&amp;gt;.cs&amp;lt;/code&amp;gt; file and will not be compiled into a &amp;lt;code&amp;gt;.dll&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
# Create a &amp;lt;code&amp;gt;.cs&amp;lt;/code&amp;gt; file: &amp;lt;code&amp;gt;/Eco Server/Mods/UserCode/WikiDemo.cs&amp;lt;/code&amp;gt;&lt;br /&gt;
# Put the following into the newly created file:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;using Eco.Core.Items;&lt;br /&gt;
using Eco.Gameplay.Items;&lt;br /&gt;
using Eco.Shared.Localization;&lt;br /&gt;
using Eco.Shared.Serialization;&lt;br /&gt;
&lt;br /&gt;
namespace WikiDemo&lt;br /&gt;
{&lt;br /&gt;
    #region Item&lt;br /&gt;
    [Serialized] // Tells the save/load system this object needs to be serialized.&lt;br /&gt;
    [LocDisplayName(&amp;quot;Market Stall&amp;quot;)] // Defines the localized name of the item.&lt;br /&gt;
    [Weight(100)] // Defines how heavy this is.&lt;br /&gt;
    [Ecopedia(&amp;quot;Work Stations&amp;quot;, &amp;quot;Craft Tables&amp;quot;, createAsSubPage: true)]&lt;br /&gt;
    [LocDescription(&amp;quot;A medieval market stall.&amp;quot;)] //The tooltip description for the item.&lt;br /&gt;
    public partial class MedievalStallItem: Item { }&lt;br /&gt;
    #endregion&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Line 8:&#039;&#039;&#039; A region tag. Lets the editor know it can collapse all of that code as a section. The following examples in this guide will just show &amp;lt;code&amp;gt;#region Item&amp;lt;/code&amp;gt; in their code examples.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 13:&#039;&#039;&#039; The implementation of &amp;lt;code&amp;gt;Item&amp;lt;/code&amp;gt; means that Eco will find this and look for Unity assets that matching this class&#039; name, &amp;lt;code&amp;gt;MedivalStallItem&amp;lt;/code&amp;gt;. While this doesn&#039;t do anything fancy, it completes the first step towards a new workbench.&lt;br /&gt;
&lt;br /&gt;
=== Checkpoint #1 ===&lt;br /&gt;
[[File:Eco - Hotbar With Modded Icon.png|thumb|Shows the medieval stall as a modded icon in-game.]]&lt;br /&gt;
Make sure everything is running smoothly by doing the following:&lt;br /&gt;
&lt;br /&gt;
# Double-check that the &amp;lt;code&amp;gt;WikiDemo.unity3d&amp;lt;/code&amp;gt; and the &amp;lt;code&amp;gt;WikiDemo.cs&amp;lt;/code&amp;gt; files are in &amp;lt;code&amp;gt;/Eco Server/Mods/UserCode&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
# Start the server and connect to it.&lt;br /&gt;
# Test it out by typing &amp;lt;code&amp;gt;/give MedievalStall&amp;lt;/code&amp;gt; in chat.&lt;br /&gt;
## It&#039;s also possible to do &amp;lt;code&amp;gt;/give Market Stall&amp;lt;/code&amp;gt; to get the item. How? Line 10: of the the above code declares that name as this item&#039;s &amp;quot;common name&amp;quot;. Neat.&lt;br /&gt;
# The item should appear in the players inventory with a working icon.&lt;br /&gt;
&lt;br /&gt;
== Code the Item&#039;s Recipe ==&lt;br /&gt;
The following goes over how to add a new class and implement the &amp;lt;code&amp;gt;RecipeFamily&amp;lt;/code&amp;gt; interface.&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;using Eco.Core.Items;&lt;br /&gt;
using Eco.Gameplay.Components;&lt;br /&gt;
using Eco.Gameplay.Items;&lt;br /&gt;
using Eco.Gameplay.Items.Recipes;&lt;br /&gt;
using Eco.Gameplay.Skills;&lt;br /&gt;
using Eco.Mods.TechTree;&lt;br /&gt;
using Eco.Shared.Localization;&lt;br /&gt;
using Eco.Shared.Serialization;&lt;br /&gt;
using System.Runtime.Versioning;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
&lt;br /&gt;
namespace WikiDemo&lt;br /&gt;
{&lt;br /&gt;
    #region Item&lt;br /&gt;
&lt;br /&gt;
    #region Recipe&lt;br /&gt;
    [RequiresSkill(typeof(CarpentrySkill), 3)]&lt;br /&gt;
    [Ecopedia(&amp;quot;Work Stations&amp;quot;, &amp;quot;Craft Tables&amp;quot;, subPageName: &amp;quot;Market Stall&amp;quot;)]&lt;br /&gt;
    public partial class MedievalStallRecipe : RecipeFamily&lt;br /&gt;
    {&lt;br /&gt;
        [SupportedOSPlatform(&amp;quot;windows7.0&amp;quot;)]&lt;br /&gt;
        public MedievalStallRecipe()&lt;br /&gt;
        {&lt;br /&gt;
            var recipe = new Recipe();&lt;br /&gt;
            recipe.Init(&lt;br /&gt;
                name: &amp;quot;MedievalStallItem&amp;quot;,&lt;br /&gt;
                displayName: Localizer.DoStr(&amp;quot;Market Stall&amp;quot;),&lt;br /&gt;
                ingredients: new List&amp;lt;IngredientElement&amp;gt;&lt;br /&gt;
                {&lt;br /&gt;
                    new IngredientElement(&amp;quot;Wood&amp;quot;, 40, typeof(Skill)),&lt;br /&gt;
                    new IngredientElement(typeof(CottonFabricItem), 30, typeof(Skill)),&lt;br /&gt;
                    new IngredientElement(typeof(HempMooringRopeItem), 5, true)&lt;br /&gt;
                },&lt;br /&gt;
                items: new List&amp;lt;CraftingElement&amp;gt;&lt;br /&gt;
                {&lt;br /&gt;
                    new CraftingElement&amp;lt;MedievalStallItem&amp;gt;(1)&lt;br /&gt;
                }&lt;br /&gt;
            );&lt;br /&gt;
            this.Recipes = new List&amp;lt;Recipe&amp;gt; { recipe };&lt;br /&gt;
            this.LaborInCalories = CreateLaborInCaloriesValue(800, typeof(Skill));&lt;br /&gt;
            this.CraftMinutes = CreateCraftTimeValue(typeof(MedievalStallRecipe), 10f, typeof(Skill));&lt;br /&gt;
    &lt;br /&gt;
            // Perform pre/post initialization for user mods and initialize our recipe instance with the display name &amp;quot;Market Stall&amp;quot;&lt;br /&gt;
            this.ModsPreInitialize();&lt;br /&gt;
            this.Initialize(displayText: Localizer.DoStr(&amp;quot;Market Stall&amp;quot;), recipeType: typeof(MedievalStallRecipe));&lt;br /&gt;
            this.ModsPostInitialize();&lt;br /&gt;
    &lt;br /&gt;
            // Register our RecipeFamily instance to a work table (in this case the Carpentry Table) so it can be crafted.&lt;br /&gt;
            CraftingComponent.AddRecipe(tableType: typeof(CarpentryTableObject), recipeFamily: this); // NOTE: The table must be the object instance!&lt;br /&gt;
        }&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
        /// &amp;lt;summary&amp;gt;Hook for other mods to customize RecipeFamily before initialization.&amp;lt;/summary&amp;gt;&lt;br /&gt;
        partial void ModsPreInitialize();&lt;br /&gt;
    &lt;br /&gt;
        /// &amp;lt;summary&amp;gt;Hook for other mods to customize RecipeFamily after initialization, but before registration. You can change skill requirements here.&amp;lt;/summary&amp;gt;&lt;br /&gt;
        partial void ModsPostInitialize();&lt;br /&gt;
    }&lt;br /&gt;
    #endregion&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Line 10:&#039;&#039;&#039; Eco will need this explicitly added to the file. Visual Studio will not add this line automatically. It&#039;s used for the &amp;lt;code&amp;gt;List&amp;lt;T&amp;gt;&amp;lt;/code&amp;gt; objects found in this code.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 14:&#039;&#039;&#039; &amp;quot;Collapsed&amp;quot; &amp;lt;code&amp;gt;Item&amp;lt;/code&amp;gt; section. See the earlier sections in this guide for the code that belongs there.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 17:&#039;&#039;&#039; Sets the required skill and skill level to craft this recipe.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 21:&#039;&#039;&#039; &amp;lt;code&amp;gt;[SupportedOSPlatform(&amp;quot;windows7.0&amp;quot;)]&amp;lt;/code&amp;gt; is here to silence some annoying warnings in Visual Studio. It&#039;s optional.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 30-32:&#039;&#039;&#039; Declares the input ingredients used for crafting. &amp;lt;code&amp;gt;typeof(Skill)&amp;lt;/code&amp;gt; gets mapped to the &amp;lt;code&amp;gt;CarpentrySkill&amp;lt;/code&amp;gt; as defined by line 31. In this example the &amp;lt;code&amp;gt;HempMooringRope&amp;lt;/code&amp;gt; is a static input. A static input will not be modified by skills, upgrade modules, or game settings.&amp;lt;br&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; It seems that at the time of writing (4/21/2026, Eco v13.0.2) the only way to get an ingredient to be a dynamic value that is reduced by the table&#039;s upgrade is to pass &amp;lt;code&amp;gt;typeof(Skill)&amp;lt;/code&amp;gt; to it; Passing either &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; makes the this input static.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 34:&#039;&#039;&#039; The &amp;lt;code&amp;gt;items&amp;lt;/code&amp;gt; list declares what items are &amp;lt;u&amp;gt;output&amp;lt;/u&amp;gt; by this recipe.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 36:&#039;&#039;&#039; This line declares that one medieval stall is output from this recipe. Functionally this links this recipe to the &amp;lt;code&amp;gt;MedievalStallItem&amp;lt;/code&amp;gt; (aka &amp;quot;Market Stall&amp;quot;) item created in the last step.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 40:&#039;&#039;&#039; Amount of calories needed to craft this item. For a static value (not modified by upgrades or skill levels) change this line to: &amp;lt;code&amp;gt;this.LaborInCalories = CreateLaborInCaloriesValue(800);&amp;lt;/code&amp;gt;. As it&#039;s written in the example, this item&#039;s calorie cost will be dynamic (modified by upgrades and skill levels). The skill level that will modify it is declared on line 16.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 41:&#039;&#039;&#039;  Minutes needed to craft. Both static and dynamic values for crafting time can be modified by the world difficulty settings. For a static value change this line to: &amp;lt;code&amp;gt;this.CraftMinutes = CreateCraftTimeValue(10f);&amp;lt;/code&amp;gt;. As it&#039;s written in the example, this item&#039;s craft time will be dynamic.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 49:&#039;&#039;&#039; This line assigns the recipe to a workbench. &amp;lt;u&amp;gt;Do not assign&amp;lt;/u&amp;gt; to itself because then the first table could never be made. It&#039;s recommend to use a preexisting vanilla table.&lt;br /&gt;
=== Checkpoint #2 ===&lt;br /&gt;
Check the functionality at this point -- it should be possible to see the recipe in the crafting table.&lt;br /&gt;
&lt;br /&gt;
# Have the &amp;lt;code&amp;gt;.unity3d&amp;lt;/code&amp;gt; and the &amp;lt;code&amp;gt;.cs&amp;lt;/code&amp;gt; file in the &amp;lt;code&amp;gt;/Eco Server/Mods/UserCode&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
# Start the server and log in.&lt;br /&gt;
# Type &amp;lt;code&amp;gt;/give Carpentry Table&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Place the Carpentry Table down and interact to see the what can be crafted.&lt;br /&gt;
# Find the newly added recipe under the name &#039;&#039;Market Stall.&#039;&#039;&lt;br /&gt;
# Type &amp;lt;code&amp;gt;/give Basic Upgrade 4&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Put the basic upgrade into the table.&lt;br /&gt;
# Go back to the recipe for the &#039;&#039;Market Stall&#039;&#039; and make sure the Wood and the Cotton fabric inputs now require less, but the Hemp Mooring Rope still is the same.&amp;lt;br&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; In case the recipe hasn&#039;t changed close that table&#039;s window and interact with it again. It should for the recipes to refresh now that the upgrade is in it.&lt;br /&gt;
&lt;br /&gt;
== Create the World Object ==&lt;br /&gt;
=== Preparing the 3D Asset ===&lt;br /&gt;
# Open &amp;lt;u&amp;gt;Blender&amp;lt;/u&amp;gt;.&lt;br /&gt;
# Load the 3D object created earlier for icon rendering -- &amp;lt;code&amp;gt;Assets/WikiDemo/MedievalStall - Icon Scene.blend&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Cleanup the scene...&lt;br /&gt;
## Delete any light source. Use the &#039;&#039;Scene Collection&#039;&#039; panel on the top-right side of the screen. These will have a 💡 icon and by default are named something like &amp;quot;sun&amp;quot;, &amp;quot;point&amp;quot;, &amp;quot;spot&amp;quot; or &amp;quot;area&amp;quot;.&amp;lt;br&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; If your model is a light source or has one in it, you can leave that light source. The point here is to remove the ambient lights used for icon rendering.&lt;br /&gt;
## Delete any camera(s). Again, use the &#039;&#039;Scene Collection&#039;&#039; panel. These have a 🎥 icon and by default are named something like &amp;quot;camera&amp;quot;.&lt;br /&gt;
# &amp;lt;u&amp;gt;If there are multiple different 3D assets in the scene&amp;lt;/u&amp;gt; (like bags, crates, jars, ect.), join them all together...&lt;br /&gt;
## Select all of the meshes by holding &#039;&#039;Shift&#039;&#039; and clicking on each one in the &#039;&#039;Scene Collection&#039;&#039; panel (right side of window).&amp;lt;br&amp;gt;&#039;&#039;&#039;Tip:&#039;&#039;&#039; Quickly select a group of them by selecting one near the top. Then hold &#039;&#039;Shift&#039;&#039;, &#039;&#039;Ctrl,&#039;&#039; and click on one near the bottom. This will both the one at the top and the one at the bottom, but also every item in between. Neat!&lt;br /&gt;
## Be in &#039;&#039;Layout&#039;&#039; workspace (top toolbar) and in the &#039;&#039;Object Mode...&#039;&#039;&lt;br /&gt;
### Find the drop down in the second toolbar from the top that has options like &#039;&#039;Object Mode, Edit Mode, Sculpt Mode,&#039;&#039; etc.&lt;br /&gt;
### Select &#039;&#039;Object Mode&#039;&#039; from that drop down.&lt;br /&gt;
## Find and open the &#039;&#039;Object&#039;&#039; menu (second toolbar down from the top).&lt;br /&gt;
## Select &#039;&#039;Join&#039;&#039;.&lt;br /&gt;
## In the &#039;&#039;Scene Collection&#039;&#039; panel, double click on the name of the newly joined mesh.&lt;br /&gt;
# Rename the joined mesh to &amp;lt;code&amp;gt;MedievalStallMesh&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Add and position a reference cube...&lt;br /&gt;
## Make sure the editor is in &#039;&#039;Layout&#039;&#039; view (top toolbar) and in the &#039;&#039;Object Mode...&#039;&#039;&lt;br /&gt;
### Find the drop down in the second toolbar from the top that has options like &#039;&#039;Object Mode, Edit Mode, Sculpt Mode,&#039;&#039; etc.&lt;br /&gt;
### Select &#039;&#039;Object Mode&#039;&#039; from that drop down.&lt;br /&gt;
## Then, add a reference cube. Open the &#039;&#039;Add&#039;&#039; menu (second top toolbar down).&lt;br /&gt;
## Hover &#039;&#039;Mesh&#039;&#039;.&lt;br /&gt;
## Select &#039;&#039;Cube.&#039;&#039;&lt;br /&gt;
## Open the &#039;&#039;View&#039;&#039; menu (second toolbar down).&lt;br /&gt;
## Select &#039;&#039;Sidebar&#039;&#039;.&lt;br /&gt;
## A new panel will have expanded.&lt;br /&gt;
## Along the right side of that panel there&#039;s buttons (&#039;&#039;Item, Tool, View, Animation&#039;&#039;). Find and click the &#039;&#039;Item&#039;&#039; button.&lt;br /&gt;
## Find and expand the &#039;&#039;Transform&#039;&#039; section&lt;br /&gt;
## Set the &#039;&#039;Location...&#039;&#039;&lt;br /&gt;
### &#039;&#039;X&#039;&#039; to &#039;&#039;1&#039;&#039;.&lt;br /&gt;
### &#039;&#039;Y&#039;&#039; to &#039;&#039;1&#039;&#039;.&lt;br /&gt;
### &#039;&#039;Z&#039;&#039; to &#039;&#039;1&#039;&#039;.&lt;br /&gt;
## The bottom corner of the cube should be touching the where green and red axis lines meet.&lt;br /&gt;
# Move the reference cube&#039;s origin to &amp;lt;code&amp;gt;(0, 0, 0)&amp;lt;/code&amp;gt;...&lt;br /&gt;
## Be in &#039;&#039;Layout&#039;&#039; workspace (top toolbar) and in the &#039;&#039;Object Mode...&#039;&#039;&lt;br /&gt;
### Find the drop down in the second toolbar from the top that has options like &#039;&#039;Object Mode, Edit Mode, Sculpt Mode,&#039;&#039; etc.&lt;br /&gt;
### Select &#039;&#039;Object Mode&#039;&#039; from that drop down.&lt;br /&gt;
## Open the &#039;&#039;View&#039;&#039; menu (second toolbar down).&lt;br /&gt;
## Select &#039;&#039;Sidebar&#039;&#039;.&lt;br /&gt;
## A new panel will have expanded.&lt;br /&gt;
## Along the right side of that panel there&#039;s buttons (&#039;&#039;Item, Tool, View, Animation&#039;&#039;). Find and click the &#039;&#039;View&#039;&#039; button.&lt;br /&gt;
## Find and expand the &#039;&#039;3D Cursor&#039;&#039; section.&lt;br /&gt;
## Set the 3D cursor&#039;s &#039;&#039;Location&#039;&#039;...&lt;br /&gt;
### &#039;&#039;X&#039;&#039; to &#039;&#039;0&#039;&#039;.&lt;br /&gt;
### &#039;&#039;Y&#039;&#039; to &#039;&#039;0&#039;&#039;.&lt;br /&gt;
### &#039;&#039;Z&#039;&#039; to &#039;&#039;0.&#039;&#039;&lt;br /&gt;
## Now in the &#039;&#039;Scene Collection&#039;&#039; panel, click on the &#039;&#039;Cube&#039;&#039; mesh to highlight and select it.&lt;br /&gt;
## Open the &#039;&#039;Object&#039;&#039; menu from the second toolbar down from the top.&lt;br /&gt;
## Hover &#039;&#039;Set Origin&#039;&#039;.&lt;br /&gt;
## Select &#039;&#039;Origin to 3D Cursor&#039;&#039;.&lt;br /&gt;
# Set the reference cube&#039;s dimensions...&lt;br /&gt;
## Be in &#039;&#039;Layout&#039;&#039; workspace (top toolbar) and in the &#039;&#039;Object Mode...&#039;&#039;&lt;br /&gt;
### Find the drop down in the second toolbar from the top that has options like &#039;&#039;Object Mode, Edit Mode, Sculpt Mode,&#039;&#039; etc.&lt;br /&gt;
### Select &#039;&#039;Object Mode&#039;&#039; from that drop down.&lt;br /&gt;
## Open the &#039;&#039;View&#039;&#039; menu (second toolbar down).&lt;br /&gt;
## Select and check the &#039;&#039;Sidebar&#039;&#039; option&#039;&#039;.&#039;&#039; &lt;br /&gt;
## The &#039;&#039;Sidebar&#039;&#039; menu just expanded over on the right side of the screen.&lt;br /&gt;
## To the right of the &#039;&#039;Sidebar&#039;&#039;, find and click the &#039;&#039;Item&#039;&#039; button.&lt;br /&gt;
## Expand the &#039;&#039;Transform&#039;&#039; section.&lt;br /&gt;
## Set the &#039;&#039;Dimensions...&#039;&#039;&#039;&#039;&#039;&amp;lt;br&amp;gt;Note:&#039;&#039;&#039; These dimensions only make sense for the asset being used for this guide. If using a different one, set the dimensions to the size of the box that model should fit in.&lt;br /&gt;
### &#039;&#039;X&#039;&#039; to &#039;&#039;4&#039;&#039;.&lt;br /&gt;
### &#039;&#039;Y&#039;&#039; to &#039;&#039;3&#039;&#039;.&lt;br /&gt;
### &#039;&#039;Z&#039;&#039; to &#039;&#039;3&#039;&#039;. &lt;br /&gt;
# Adjust the position and scale of the &#039;&#039;MedievalStallMesh&#039;&#039; to fit inside a box.&lt;br /&gt;
## Be in &#039;&#039;Layout&#039;&#039; workspace (top toolbar) and in the &#039;&#039;Object Mode...&#039;&#039;&lt;br /&gt;
### Find the drop down in the second toolbar from the top that has options like &#039;&#039;Object Mode, Edit Mode, Sculpt Mode,&#039;&#039; etc.&lt;br /&gt;
### Select &#039;&#039;Object Mode&#039;&#039; from that drop down.&lt;br /&gt;
## On the left side of the screen there&#039;s a column of icons. Hover over them to see their names.&lt;br /&gt;
## Select the &#039;&#039;Move&#039;&#039; tool.&lt;br /&gt;
## Click on the Medieval Stall to select it. Zoom out and reposition the camera so that the blue, green, and red arrows are visible.&amp;lt;br&amp;gt;&#039;&#039;&#039;Tip:&#039;&#039;&#039; By holding the middle-mouse button and dragging the scene will rotate. By holding the middle-mouse button and the &#039;&#039;Shift&#039;&#039; key, the scene will pan.&amp;lt;br&amp;gt;&#039;&#039;&#039;Tip:&#039;&#039;&#039; If panning or rotating the scene becomes slow or frustrating (especially after zooming), try selecting 3D asset from the &#039;&#039;Scene Collection&#039;&#039; panel, opening the &#039;&#039;View&#039;&#039; menu (second toolbar from top), and selecting &#039;&#039;Frame Selected&#039;&#039;. This will reset the view onto that object and controls should feel normal again.&lt;br /&gt;
## Click and hold one of the arrows. Move the mouse to drag the 3D asset towards the box.&lt;br /&gt;
## Move the 3D asset around till it&#039;s &amp;lt;u&amp;gt;completely inside the box&amp;lt;/u&amp;gt;. If it cannot fit and is too big, continue to the next step.&amp;lt;br&amp;gt;&#039;&#039;&#039;Tip:&#039;&#039;&#039; To select the 3D asset once it disappears, use the &#039;&#039;Scene Collection&#039;&#039; panel. Click on it there and the blue, green, and red arrows will show up again for it.&amp;lt;br&amp;gt;&#039;&#039;&#039;Tip:&#039;&#039;&#039; There are preset views. To use them go to the &#039;&#039;View&#039;&#039; menu (second toolbar from top)&#039;&#039;,&#039;&#039; hover &#039;&#039;Viewpoint&#039;&#039;, and select the view that would be most helpful.&lt;br /&gt;
## Find the &#039;&#039;Scale&#039;&#039; tool from the left side of the screen.&lt;br /&gt;
## Now the blue, green, and red &amp;quot;arrows&amp;quot; don&#039;t really look like arrows anymore. They are lines with boxes at the end.&lt;br /&gt;
## Click and hold on those lines to adjust the scale of the 3D asset to make it fit inside the box.&amp;lt;br&amp;gt;&#039;&#039;&#039;Tip:&#039;&#039;&#039; There are little colored boxes in between the lines that can be dragged to scale the 3D asset more proportionally.&lt;br /&gt;
## Continue using the &#039;&#039;Move&#039;&#039; and &#039;&#039;Scale&#039;&#039; tools till the model fits. This will take patience and time.&amp;lt;br&amp;gt;&#039;&#039;&#039;Tip:&#039;&#039;&#039; Hide the reference cube to see what is happening with the 3D asset. Go to the &#039;&#039;Scene Collections&#039;&#039; panel and click the 👁 button to hide it. Click that button again to show it.&lt;br /&gt;
# Move the reference cube&#039;s origin to &amp;lt;code&amp;gt;(0.5, 0.5, 0.5)&amp;lt;/code&amp;gt;...&lt;br /&gt;
## Be in &#039;&#039;Layout&#039;&#039; workspace (top toolbar) and in the &#039;&#039;Object Mode...&#039;&#039;&lt;br /&gt;
### Find the drop down in the second toolbar from the top that has options like &#039;&#039;Object Mode, Edit Mode, Sculpt Mode,&#039;&#039; etc.&lt;br /&gt;
### Select &#039;&#039;Object Mode&#039;&#039; from that drop down.&lt;br /&gt;
## Open the &#039;&#039;View&#039;&#039; menu (second toolbar down).&lt;br /&gt;
## Select &#039;&#039;Sidebar&#039;&#039;.&lt;br /&gt;
## A new panel will have expanded.&lt;br /&gt;
## Along the right side of that panel there&#039;s buttons (&#039;&#039;Item, Tool, View, Animation&#039;&#039;). Find and click the &#039;&#039;View&#039;&#039; button.&lt;br /&gt;
## Find and expand the &#039;&#039;3D Cursor&#039;&#039; section.&lt;br /&gt;
## Set the 3D cursor&#039;s &#039;&#039;Location&#039;&#039;...&lt;br /&gt;
### &#039;&#039;X&#039;&#039; to &#039;&#039;0&#039;&#039;.5.&lt;br /&gt;
### &#039;&#039;Y&#039;&#039; to &#039;&#039;0.5&#039;&#039;.&lt;br /&gt;
### &#039;&#039;Z&#039;&#039; to &#039;&#039;0.5.&#039;&#039;&lt;br /&gt;
## Select the &#039;&#039;MedievalStallMesh&#039;&#039; using the &#039;&#039;Scene Collection&#039;&#039; panel.&lt;br /&gt;
## Open the &#039;&#039;Object&#039;&#039; menu (second toolbar down).&lt;br /&gt;
## Hover &#039;&#039;Set Origin&#039;&#039;.&lt;br /&gt;
## Select &#039;&#039;Origin to 3D Cursor&#039;&#039;.&lt;br /&gt;
# Select the reference cube named &#039;&#039;Cube&#039;&#039; from the &#039;&#039;Scene Collections&#039;&#039; panel.&lt;br /&gt;
# Open &#039;&#039;Object&#039;&#039; menu (second toolbar down).&lt;br /&gt;
# Select &#039;&#039;Delete&#039;&#039;.&lt;br /&gt;
# Move the &#039;&#039;MedievalStallMesh&#039;&#039; to &amp;lt;code&amp;gt;(0, 0, 0)&amp;lt;/code&amp;gt;...&lt;br /&gt;
## Be in &#039;&#039;Layout&#039;&#039; workspace (top toolbar) and in the &#039;&#039;Object Mode...&#039;&#039;&lt;br /&gt;
### Find the drop down in the second toolbar from the top that has options like &#039;&#039;Object Mode, Edit Mode, Sculpt Mode,&#039;&#039; etc.&lt;br /&gt;
### Select &#039;&#039;Object Mode&#039;&#039; from that drop down.&lt;br /&gt;
## Open the &#039;&#039;View&#039;&#039; menu (second toolbar down).&lt;br /&gt;
## Select &#039;&#039;Sidebar&#039;&#039;.&lt;br /&gt;
## A new panel will have expanded.&lt;br /&gt;
## Along the right side of that panel there&#039;s buttons (&#039;&#039;Item, Tool, View, Animation&#039;&#039;). Find and click the &#039;&#039;Item&#039;&#039; button.&lt;br /&gt;
## Make sure the &#039;&#039;MedievalStallMesh&#039;&#039; is selected. Use the &#039;&#039;Scene Collection&#039;&#039; panel if needed.&lt;br /&gt;
## Find and expand the &#039;&#039;Transform&#039;&#039; section&lt;br /&gt;
## Set the &#039;&#039;Location...&#039;&#039;&lt;br /&gt;
### &#039;&#039;X&#039;&#039; to 0.&lt;br /&gt;
### &#039;&#039;Y&#039;&#039; to 0.&lt;br /&gt;
### &#039;&#039;Z&#039;&#039; to 0.&lt;br /&gt;
# Make sure the &#039;&#039;MedievalStallMesh&#039;&#039; is selected. Use the &#039;&#039;Scene Collection&#039;&#039; panel if needed.&lt;br /&gt;
# Open the &#039;&#039;Object&#039;&#039; menu.&lt;br /&gt;
# Hover &#039;&#039;Apply&#039;&#039;.&lt;br /&gt;
# Select &#039;&#039;All Transformations&#039;&#039;.&amp;lt;br&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; This step bakes all of the changes into the mesh. It&#039;s very important.&lt;br /&gt;
# Open the &#039;&#039;File&#039;&#039;  menu from the top toolbar.&lt;br /&gt;
# Hover &#039;&#039;Export&#039;&#039; to open the sub-menu.&lt;br /&gt;
# Select &#039;&#039;FBX (.fbx)&#039;&#039; &lt;br /&gt;
# A &#039;&#039;Blender File View&#039;&#039; window will pop-up.&lt;br /&gt;
# On the right side of this window there&#039;s a ⚙️ icon. Click it to expand the settings region.&lt;br /&gt;
# In the expanded region find the &#039;&#039;Include&#039;&#039; section and expand it. Change the following:&lt;br /&gt;
## Find &#039;&#039;Object Types&#039;&#039; and only select &#039;&#039;Mesh.&#039;&#039; No other option should be highlighted for this setting.&lt;br /&gt;
# In the settings region scroll and find the &#039;&#039;Transform&#039;&#039; section and expand it. Change the following:&lt;br /&gt;
## Find &#039;&#039;Apply Scalings&#039;&#039; and set it to &#039;&#039;FBX All&#039;&#039;.&lt;br /&gt;
## Just below that find &#039;&#039;Forward&#039;&#039; and set it to &#039;&#039;Z Forward&#039;&#039;.&lt;br /&gt;
## Ensure that the next setting down, &#039;&#039;Up&#039;&#039;, changed to &#039;&#039;Y Up&#039;&#039;.&lt;br /&gt;
## Find &#039;&#039;Apply Unit&#039;&#039; and make sure it&#039;s checked.&lt;br /&gt;
## Next, find &#039;&#039;Use Space Transform&#039;&#039; check it.&lt;br /&gt;
## Lastly, find &#039;&#039;Apply Transform&#039;&#039; and check it too.&lt;br /&gt;
# Save it to &amp;lt;code&amp;gt;Assets/WikiDemo/MedievalStall.fbx&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Save the Blender scene...&lt;br /&gt;
## &#039;&#039;File&#039;&#039; drop down from top toolbar.&lt;br /&gt;
## &#039;&#039;Save As...&#039;&#039; to save the Blender scene to the computer.&lt;br /&gt;
## Save it to &amp;lt;code&amp;gt;Assets/WikiDemo/MedievalStall - Eco Ready Scene.blend&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Add to Unity Scene ===&lt;br /&gt;
&lt;br /&gt;
# Open &amp;lt;u&amp;gt;Unity&amp;lt;/u&amp;gt;.&lt;br /&gt;
# Select the &amp;lt;code&amp;gt;.fbx&amp;lt;/code&amp;gt; file in the project window.&lt;br /&gt;
# Open the &#039;&#039;Eco Tools&#039;&#039; menu from the top toolbar.&lt;br /&gt;
# Hover &#039;&#039;Mod Kit&#039;&#039;.&lt;br /&gt;
# Select &#039;&#039;World Object Setup.&#039;&#039;&lt;br /&gt;
# A &#039;&#039;World Object Setup&#039;&#039;  window will pop-up.&lt;br /&gt;
# Make sure that &#039;&#039;Selected Objects&#039;&#039; reads &#039;&#039;MedievalStall.&#039;&#039;&lt;br /&gt;
# Also make sure that &#039;&#039;World Object Type&#039;&#039; is set to &#039;&#039;World Object&#039;&#039;.&lt;br /&gt;
# Press the &#039;&#039;Setup World Objects&#039;&#039; button.&lt;br /&gt;
# Notice in the project window that a new &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt; file was created -- &amp;lt;code&amp;gt;MedievalStallObject.prefab&amp;lt;/code&amp;gt;&lt;br /&gt;
# Select the &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt;.&lt;br /&gt;
# In the &#039;&#039;Inspector&#039;&#039; panel find the &#039;&#039;Transform&#039;&#039; component.&lt;br /&gt;
# Change this component&#039;s &#039;&#039;Rotation...&#039;&#039;&lt;br /&gt;
## &#039;&#039;X&#039;&#039; to &#039;&#039;0.&#039;&#039;&lt;br /&gt;
## &#039;&#039;Y&#039;&#039; to &#039;&#039;0.&#039;&#039;&lt;br /&gt;
## &#039;&#039;Z&#039;&#039; to &#039;&#039;0.&#039;&#039;&lt;br /&gt;
# In the &#039;&#039;Inspector&#039;&#039; panel find the &#039;&#039;Box Collider&#039;&#039; component.&lt;br /&gt;
#Find the &#039;&#039;⋮&#039;&#039; icon (all the way to the right of the words &#039;&#039;Box Collider)&#039;&#039; and click on it.&lt;br /&gt;
#Select &#039;&#039;Reset&#039;&#039; from the menu. This will regenerate the box collider now that the rotation has changed.&lt;br /&gt;
#Look in the &#039;&#039;Inspector&#039;&#039; panel and find the &#039;&#039;World Object (Script)&#039;&#039; component.&lt;br /&gt;
# That component has a checkbox &#039;&#039;Override Occupancy&#039;&#039;. Check it.&lt;br /&gt;
# A new field should&#039;ve expanded below it called &#039;&#039;Size&#039;&#039;.&lt;br /&gt;
# Set the &#039;&#039;Size&#039;&#039;...&amp;lt;br&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; This size similar to the size of the reference cube from earlier, but the Y and Z coordinates get flipped! So if in Blender it was &amp;lt;code&amp;gt;(1, 2, 3)&amp;lt;/code&amp;gt; then in Unity its &amp;lt;code&amp;gt;(1, 3, 2)&amp;lt;/code&amp;gt;.&lt;br /&gt;
## &#039;&#039;X&#039;&#039; to &#039;&#039;4&#039;&#039;.&lt;br /&gt;
## &#039;&#039;Y&#039;&#039; to &#039;&#039;3&#039;&#039;.&lt;br /&gt;
## &#039;&#039;Z&#039;&#039; to &#039;&#039;3&#039;&#039;.&lt;br /&gt;
# Select &#039;&#039;Objects&#039;&#039; from &#039;&#039;Hierarchy&#039;&#039; panel (left-side of the window).&lt;br /&gt;
# Find the &#039;&#039;Modkit Prefab Container (Script)&#039;&#039; component. This component was added earlier, if it&#039;s not there add it now.&lt;br /&gt;
# Expand the &#039;&#039;Prefabs&#039;&#039; section in that component.&lt;br /&gt;
# Click the &#039;&#039;+&#039;&#039; button to add an item to the list.&lt;br /&gt;
# Either...&lt;br /&gt;
## Click the &#039;&#039;⦿&#039;&#039; button, switch to the &#039;&#039;Assets&#039;&#039; tab, find or search for &#039;&#039;MedievalStallObject&#039;&#039;, and double click on it. Make sure it&#039;s the medieval stall &amp;lt;u&amp;gt;object&amp;lt;/u&amp;gt; with the &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt; ending.&lt;br /&gt;
## Drag the &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt; file onto the &#039;&#039;⦿&#039;&#039; button&lt;br /&gt;
# Open the &#039;&#039;File&#039;&#039; menu from top toolbar and select &#039;&#039;Save&#039;&#039;.&amp;lt;br&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; Do not skip. The scene must be saved for the ModKit build to work properly.&lt;br /&gt;
# Open the &#039;&#039;Eco Tools&#039;&#039; menu from the top toolbar.&lt;br /&gt;
# Hover &#039;&#039;Mod Kit&#039;&#039;.&lt;br /&gt;
# Select &#039;&#039;Build Current Bundle&#039;&#039;.&lt;br /&gt;
# Save the bundle to &amp;lt;code&amp;gt;/Eco Server/Mods/UserCode/WikiDemo.unity3d&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Coding the World Object ===&lt;br /&gt;
The following collapses the &amp;lt;code&amp;gt;#region Recipe&amp;lt;/code&amp;gt;. Please see the earlier section [[#Code the Item&#039;s Recipe|Code the Item&#039;s Recipe]] to get the code that belongs there.&lt;br /&gt;
&lt;br /&gt;
Add the new &amp;lt;code&amp;gt;using&amp;lt;/code&amp;gt; lines, replace the &amp;lt;code&amp;gt;#region Item&amp;lt;/code&amp;gt; section, and replace the &amp;lt;code&amp;gt;#region Object&amp;lt;/code&amp;gt; sections using the following:&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;using Eco.Core.Items;&lt;br /&gt;
using Eco.Gameplay.Components;&lt;br /&gt;
using Eco.Gameplay.Items;&lt;br /&gt;
using Eco.Gameplay.Items.Recipes;&lt;br /&gt;
using Eco.Gameplay.Objects;&lt;br /&gt;
using Eco.Gameplay.Skills;&lt;br /&gt;
using Eco.Mods.TechTree;&lt;br /&gt;
using Eco.Shared.Localization;&lt;br /&gt;
using Eco.Shared.Serialization;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Runtime.Versioning;&lt;br /&gt;
using System;&lt;br /&gt;
using Eco.Core.Controller;&lt;br /&gt;
using Eco.Gameplay.Systems.NewTooltip;&lt;br /&gt;
using Eco.Shared.Items;&lt;br /&gt;
using Eco.Gameplay.Occupancy;&lt;br /&gt;
using Eco.Shared.Math;&lt;br /&gt;
using Eco.Gameplay.Components.Auth;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
namespace WikiDemo&lt;br /&gt;
{&lt;br /&gt;
    #region Item&lt;br /&gt;
    [Serialized] // Tells the save/load system this object needs to be serialized.&lt;br /&gt;
    [SupportedOSPlatform(&amp;quot;windows7.0&amp;quot;)]&lt;br /&gt;
    [LocDisplayName(&amp;quot;Market Stall&amp;quot;)] // Defines the localized name of the item.&lt;br /&gt;
    [Weight(3000)] // Defines how heavy this is.&lt;br /&gt;
    [Ecopedia(&amp;quot;Work Stations&amp;quot;, &amp;quot;Craft Tables&amp;quot;, createAsSubPage: true)]&lt;br /&gt;
    [LocDescription(&amp;quot;A medieval market stall.&amp;quot;)] //The tooltip description for the item.&lt;br /&gt;
    public partial class MedievalStallItem : WorldObjectItem&amp;lt;MedievalStallObject&amp;gt;, IPersistentData&lt;br /&gt;
    {&lt;br /&gt;
        [Serialized, SyncToView, NewTooltipChildren(CacheAs.Instance, flags: TTFlags.AllowNonControllerTypeForChildren)] public object? PersistentData { get; set; }&lt;br /&gt;
&lt;br /&gt;
        protected override OccupancyContext GetOccupancyContext =&amp;gt; new SideAttachedContext(&lt;br /&gt;
            DirectionAxisFlags.Down, // Read: every occupied block on the bottom must be supported&lt;br /&gt;
            WorldObject.GetOccupancyInfo(this.WorldObjectType)&lt;br /&gt;
        );&lt;br /&gt;
    }&lt;br /&gt;
    #endregion&lt;br /&gt;
&lt;br /&gt;
    #region Recipe&lt;br /&gt;
&lt;br /&gt;
    #region Object&lt;br /&gt;
    [Serialized]&lt;br /&gt;
    [SupportedOSPlatform(&amp;quot;windows7.0&amp;quot;)]&lt;br /&gt;
    [RequireComponent(typeof(CraftingComponent))]&lt;br /&gt;
    [RequireComponent(typeof(MinimapComponent))]&lt;br /&gt;
    [RequireComponent(typeof(LinkComponent))]&lt;br /&gt;
    [RequireComponent(typeof(OccupancyRequirementComponent))]&lt;br /&gt;
    [Tag(&amp;quot;Usable&amp;quot;)]&lt;br /&gt;
    [Ecopedia(&amp;quot;Work Stations&amp;quot;, &amp;quot;Craft Tables&amp;quot;, subPageName: &amp;quot;Market Stall&amp;quot;)]&lt;br /&gt;
    public partial class MedievalStallObject : WorldObject, IRepresentsItem&lt;br /&gt;
    {&lt;br /&gt;
        public Type RepresentedItemType =&amp;gt; typeof(MedievalStallItem);&lt;br /&gt;
&lt;br /&gt;
        static MedievalStallObject()&lt;br /&gt;
        {&lt;br /&gt;
            WorldObject.AddOccupancy&amp;lt;MedievalStallObject&amp;gt;(CalculateBoxOccupancy(4, 3, 3));&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        protected override void Initialize()&lt;br /&gt;
        {&lt;br /&gt;
            this.ModsPreInitialize();&lt;br /&gt;
            this.GetComponent&amp;lt;LinkComponent&amp;gt;().Initialize(15);&lt;br /&gt;
            this.GetComponent&amp;lt;MinimapComponent&amp;gt;().SetCategory(Localizer.DoStr(&amp;quot;Crafting&amp;quot;));&lt;br /&gt;
            this.ModsPostInitialize();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;Hook for mods to customize WorldObject before initialization. You can change housing values here.&amp;lt;/summary&amp;gt;&lt;br /&gt;
        partial void ModsPreInitialize();&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;Hook for mods to customize WorldObject after initialization.&amp;lt;/summary&amp;gt;&lt;br /&gt;
        partial void ModsPostInitialize();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Calculates the blocks that this item will occupy when placed. All coordinates are offsets relative to this 3D model&#039;s origin&lt;br /&gt;
        /// point. This function can only be used to calculate a box shape; there can be no gaps. All blocks will be of the&lt;br /&gt;
        /// BlockOccupancyType.None type.&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        ///&lt;br /&gt;
        /// Examples:&lt;br /&gt;
        ///     * Imagine a 1x1x1 cube. The origin point of the 3D model is the middle of the bottom-left cube. The only block the&lt;br /&gt;
        ///     cube would occupy would be the same one the origin point is in. In offset coordinates, the only block the cube occupies&lt;br /&gt;
        ///     is (0,0,0) from the origin point.&lt;br /&gt;
        ///     * Image a 1x5x1 flag pole. Again the origin point of the 3D model is in the middle of the bottom most cube. The only&lt;br /&gt;
        ///     blocks the flage pole occupies is the one the origin point is in and the 4 above that one. In offset coordinates, that&lt;br /&gt;
        ///     would be (0,0,0) + (0,1,0) + (0,2,0) + (0,3,0) + (0,4,0).&lt;br /&gt;
        /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br /&gt;
        private static List&amp;lt;BlockOccupancy&amp;gt; CalculateBoxOccupancy(int sizeX, int sizeY, int sizeZ)&lt;br /&gt;
        {&lt;br /&gt;
            var cells = new List&amp;lt;BlockOccupancy&amp;gt;(sizeX * sizeY * sizeZ);&lt;br /&gt;
            for (int x = 0; x &amp;lt; sizeX; x++)&lt;br /&gt;
                for (int y = 0; y &amp;lt; sizeY; y++)&lt;br /&gt;
                    for (int z = 0; z &amp;lt; sizeZ; z++)&lt;br /&gt;
                        cells.Add(new BlockOccupancy(new Vector3i(x, y, z)));&lt;br /&gt;
            return cells;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    #endregion&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Line 30:&#039;&#039;&#039; This changes from implementing &amp;lt;code&amp;gt;Item&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;WorldObjectItem&amp;lt;MedievalStallObject&amp;gt;&amp;lt;/code&amp;gt;. This is what tell Eco that this item has the ability to place a world object into the world.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 32:&#039;&#039;&#039; This defines the object where &amp;lt;code&amp;gt;PersistentData&amp;lt;/code&amp;gt; is stored. Other components like a &#039;&#039;PartsComponet&#039;&#039; would store the information of the table parts&#039; durability in here. in this example, this line is illustrative and doesn&#039;t have any components using it.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 34:&#039;&#039;&#039; Sets the type of occupancy context this world object has. Occupancy is the system used to determine what space blocks and object are in. The &amp;lt;code&amp;gt;SideAttachContext&amp;lt;/code&amp;gt; means that this object must have a certain side supported for it to be attached to the world and valid to be placed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 35:&#039;&#039;&#039; Defines the bottom side as the side this object uses to attach.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 36:&#039;&#039;&#039; This line is getting the list of blocks occupied from a static lookup in &amp;lt;code&amp;gt;WorldObject&amp;lt;/code&amp;gt; for the &amp;lt;code&amp;gt;MedievalStallObject&amp;lt;/code&amp;gt;. See line 60 to see this value set.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 41:&#039;&#039;&#039; The &amp;quot;collapsed&amp;quot; Recipe section. See earlier sections in this guide to see what code belongs here.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 46:&#039;&#039;&#039; Adds a &amp;lt;code&amp;gt;CraftComponent&amp;lt;/code&amp;gt; to the table. This component lets players use this table to craft something on.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 47:&#039;&#039;&#039; &amp;lt;code&amp;gt;MinimapComponent&amp;lt;/code&amp;gt; this registers the object with the minimap. This makes it so when a player places a medieval stall, the minimap shows it. Related: line 67.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 48:&#039;&#039;&#039; &amp;lt;code&amp;gt;LinkComponent&amp;lt;/code&amp;gt; allows storage linking. Related: line 66.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 49:&#039;&#039;&#039; &amp;lt;code&amp;gt;OccupancyRequirementComponent&amp;lt;/code&amp;gt; defines this object as having and occupying physical space. Related: line 60.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 50:&#039;&#039;&#039; Assigns a tag to this object. Like how the tag &#039;&#039;Wood&#039;&#039; in Eco refers to all the different types of logs. In this case, the &#039;&#039;MedievalStallObject&#039;&#039; is being added to the &amp;lt;code&amp;gt;Usable&amp;lt;/code&amp;gt; tag.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 52:&#039;&#039;&#039; Declares the &amp;lt;code&amp;gt;MedievalStallObject&amp;lt;/code&amp;gt;. It&#039;s important that this class name is matches exactly the &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt; file name because the name is what links them.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 54:&#039;&#039;&#039; Declares the item that is given when this world object is picked up.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 58:&#039;&#039;&#039; This sets the occupancy for the world object in the simulation. This must also be set for the object in addition to the &#039;&#039;Override Occupancy&#039;&#039; and &#039;&#039;Size&#039;&#039; setting previously set on the Unity &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt;. That&#039;s because the settings in Unity are used client side. This sets the occupancy on the server side. They both need to be set and be matching for things to work right.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 64:&#039;&#039;&#039; Initializes the &amp;lt;code&amp;gt;LinkComponent&amp;lt;/code&amp;gt; with a base 15 block radius. Know that this value is just the base value and that server settings will determine the actual game play radius.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 65:&#039;&#039;&#039; Initializes the &amp;lt;code&amp;gt;MinimapComponent&amp;lt;/code&amp;gt; and add this object to the &amp;lt;code&amp;gt;Crafting&amp;lt;/code&amp;gt; category.&lt;br /&gt;
&lt;br /&gt;
=== Checkpoint ===&lt;br /&gt;
&lt;br /&gt;
# Have the &amp;lt;code&amp;gt;.unity3d&amp;lt;/code&amp;gt; and the &amp;lt;code&amp;gt;.cs&amp;lt;/code&amp;gt; file in the &amp;lt;code&amp;gt;/Eco Server/Mods/UserCode&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
# Start the server and log in.&lt;br /&gt;
# Type &amp;lt;code&amp;gt;/give Carpentry Table&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Place the Carpentry Table down and interact to see the what can be crafted.&lt;br /&gt;
# Find the newly added recipe under the name &#039;&#039;Market Stall.&#039;&#039;&lt;br /&gt;
# Type &amp;lt;code&amp;gt;/give Basic Upgrade 4&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Put the basic upgrade into the table.&lt;br /&gt;
# Go back to the recipe for the &#039;&#039;Market Stall&#039;&#039; and make sure the Wood and the Cotton fabric inputs now require less, but the Hemp Mooring Rope still is the same. &#039;&#039;&#039;Note:&#039;&#039;&#039; In case the recipe hasn&#039;t changed close that table&#039;s window and interact with it again. It should for the recipes to refresh now that the upgrade is in it.&lt;br /&gt;
&lt;br /&gt;
[[File:WikiDemo - Medieval Stall - Checkpoint -3.png|thumb|The Medieval Stall modded into Eco.]]&lt;br /&gt;
&#039;&#039;&#039;Warning:&#039;&#039;&#039; In &#039;&#039;Eco&#039;&#039; v13.0.2, free-placed objects may display misaligned ghost cubes, even when configured correctly in your mod. This is a visual-only base-game bug — placement still works as expected, even if the object appears red near edges. &amp;lt;!-- See: https://github.com/StrangeLoopGames/EcoIssues/issues/25834 --&amp;gt; &lt;br /&gt;
&lt;br /&gt;
# Have the &amp;lt;code&amp;gt;.unity3d&amp;lt;/code&amp;gt; and the &amp;lt;code&amp;gt;.cs&amp;lt;/code&amp;gt; file in the &amp;lt;code&amp;gt;/Eco Server/Mods/UserCode&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
# Start the server and log in.&lt;br /&gt;
# Type &amp;lt;code&amp;gt;/give MedievalStall&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Place the stall down. &#039;&#039;&#039;Pro-tip:&#039;&#039;&#039; Put down a floor of &amp;lt;u&amp;gt;flat roof&amp;lt;/u&amp;gt; tiles made of &#039;&#039;Reinforced Concrete&#039;&#039;. This will show you where the occupancy of your object is when you place it because the roof tiles will change shape under the object. Neat!&lt;br /&gt;
# It should look and function like a normal workbench.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;WikiDemo.unity3d&amp;lt;/code&amp;gt; and the &amp;lt;code&amp;gt;WikiDemo.cs&amp;lt;/code&amp;gt; files are all that is needed to share this mod now.&lt;br /&gt;
&lt;br /&gt;
= Adding a Recipe to Craft =&lt;br /&gt;
To add a recipe to the medieval stall add this to the &amp;lt;code&amp;gt;WikiDemo.cs&amp;lt;/code&amp;gt; file:&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
using Eco.Core.Items;&lt;br /&gt;
using Eco.Gameplay.Components;&lt;br /&gt;
using Eco.Gameplay.Items;&lt;br /&gt;
using Eco.Gameplay.Items.Recipes;&lt;br /&gt;
using Eco.Gameplay.Objects;&lt;br /&gt;
using Eco.Gameplay.Skills;&lt;br /&gt;
using Eco.Mods.TechTree;&lt;br /&gt;
using Eco.Shared.Localization;&lt;br /&gt;
using Eco.Shared.Serialization;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Runtime.Versioning;&lt;br /&gt;
using System;&lt;br /&gt;
using Eco.Core.Controller;&lt;br /&gt;
using Eco.Gameplay.Systems.NewTooltip;&lt;br /&gt;
using Eco.Shared.Items;&lt;br /&gt;
using Eco.Gameplay.Occupancy;&lt;br /&gt;
using Eco.Shared.Math;&lt;br /&gt;
using Eco.Gameplay.Components.Auth;&lt;br /&gt;
&lt;br /&gt;
namespace WikiDemo&lt;br /&gt;
{&lt;br /&gt;
    #region Item&lt;br /&gt;
&lt;br /&gt;
    #region Recipe&lt;br /&gt;
&lt;br /&gt;
    #region Object&lt;br /&gt;
&lt;br /&gt;
    #region CraftingRecipes&lt;br /&gt;
    public partial class MyArrowRecipe : RecipeFamily&lt;br /&gt;
    {&lt;br /&gt;
        [SupportedOSPlatform(&amp;quot;windows7.0&amp;quot;)]&lt;br /&gt;
        public MyArrowRecipe()&lt;br /&gt;
        {&lt;br /&gt;
            var recipe = new Recipe();&lt;br /&gt;
            recipe.Init(&lt;br /&gt;
                name: &amp;quot;Alternate Arrow&amp;quot;,&lt;br /&gt;
                displayName: Localizer.DoStr(&amp;quot;Alternate Arrow&amp;quot;),&lt;br /&gt;
                ingredients: new List&amp;lt;IngredientElement&amp;gt;&lt;br /&gt;
                {&lt;br /&gt;
                    new IngredientElement(&amp;quot;Wood&amp;quot;, 1, typeof(Skill)),&lt;br /&gt;
                    new IngredientElement(&amp;quot;Rock&amp;quot;, 1)&lt;br /&gt;
                },&lt;br /&gt;
                items: new List&amp;lt;CraftingElement&amp;gt;&lt;br /&gt;
                {&lt;br /&gt;
                    new CraftingElement&amp;lt;ArrowItem&amp;gt;(1)&lt;br /&gt;
                }&lt;br /&gt;
            );&lt;br /&gt;
            this.Recipes = new List&amp;lt;Recipe&amp;gt; { recipe };&lt;br /&gt;
            this.LaborInCalories = CreateLaborInCaloriesValue(10);&lt;br /&gt;
            this.CraftMinutes = CreateCraftTimeValue(0.1f);&lt;br /&gt;
&lt;br /&gt;
            // Perform pre/post initialization for user mods and initialize our recipe instance with the display name &amp;quot;Market Stall&amp;quot;&lt;br /&gt;
            this.ModsPreInitialize();&lt;br /&gt;
            this.Initialize(displayText: Localizer.DoStr(&amp;quot;Alternate Arrow Recipe&amp;quot;), recipeType: typeof(MyArrowRecipe));&lt;br /&gt;
            this.ModsPostInitialize();&lt;br /&gt;
&lt;br /&gt;
            // Register our RecipeFamily instance to a work table (in this case the Carpentry Table) so it can be crafted.&lt;br /&gt;
            CraftingComponent.AddRecipe(tableType: typeof(MedievalStallObject), recipeFamily: this); // NOTE: The table must be the object instance!&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;Hook for other mods to customize RecipeFamily before initialization.&amp;lt;/summary&amp;gt;&lt;br /&gt;
        partial void ModsPreInitialize();&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;Hook for other mods to customize RecipeFamily after initialization, but before registration. You can change skill requirements here.&amp;lt;/summary&amp;gt;&lt;br /&gt;
        partial void ModsPostInitialize();&lt;br /&gt;
    }&lt;br /&gt;
    #endregion&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[File:WikiDemo MedievalStall AltArrowRecipe.png|thumb|Shows a new recipe added to the crafting tab of the Medieval Stall.]]&lt;br /&gt;
&#039;&#039;&#039;Line 58:&#039;&#039;&#039; This line here adds this recipe to the &amp;lt;code&amp;gt;MedievalStallObject&amp;lt;/code&amp;gt; just created.&lt;/div&gt;</summary>
		<author><name>WugWugg</name></author>
	</entry>
	<entry>
		<id>https://wiki.play.eco/en/index.php?title=From_3D_Asset_to_Working_Worktable&amp;diff=16736</id>
		<title>From 3D Asset to Working Worktable</title>
		<link rel="alternate" type="text/html" href="https://wiki.play.eco/en/index.php?title=From_3D_Asset_to_Working_Worktable&amp;diff=16736"/>
		<updated>2026-04-28T22:35:23Z</updated>

		<summary type="html">&lt;p&gt;WugWugg: Aside from 1 test, the Preparing the 3D asset section is done.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction =&lt;br /&gt;
Below is a guide on how to take an 3D asset from the Unity Store and make a working workbench in Eco. This includes:&lt;br /&gt;
* Creating a recipe to craft the modded table&lt;br /&gt;
* Creating recipes so the player can use the modded table to craft something&lt;br /&gt;
* Using Blender to generate a modded icon (seen when holding it in inventory)&lt;br /&gt;
* Using Blender to adjust the origin point of the model&lt;br /&gt;
* How to setup all this in a Unity scene and package for Eco&lt;br /&gt;
&lt;br /&gt;
= Setup =&lt;br /&gt;
&lt;br /&gt;
* Already have setup &#039;&#039;&#039;ModKit + Unity&#039;&#039;&#039;&lt;br /&gt;
** See: [[Installing the ModKit]]&lt;br /&gt;
* Have a &#039;&#039;&#039;3D model&#039;&#039;&#039;&lt;br /&gt;
** Just following along? Find the one used here at &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://assetstore.unity.com/packages/3d/props/low-poly-medieval-market-stalls-314286&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* A &#039;&#039;&#039;C# IDE&#039;&#039;&#039; (notepad++, Visual Studio, etc.)&lt;br /&gt;
** Highly encouraged to have an Intellisense setup and linked to the &#039;&#039;&#039;Reference Assemblies&#039;&#039;&#039;. Optional, but its really worth the time to figure out because it will help quickly correct small typos and trivial mistakes.&lt;br /&gt;
** See: [[Getting Started with Eco Modding in Visual Studio 2022]] (generally the same steps apply if using a new version of Visual Studio)&lt;br /&gt;
* &#039;&#039;&#039;Blender&#039;&#039;&#039; installed&lt;br /&gt;
** Homepage: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://www.blender.org/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Importing the Assets ==&lt;br /&gt;
&lt;br /&gt;
# Open the Unity editor to the project.&lt;br /&gt;
# From the top toolbar open the &#039;&#039;Window&#039;&#039; drop down.&lt;br /&gt;
# Hover &#039;&#039;Package Management&#039;&#039; to open sub-menu.&lt;br /&gt;
# Select &#039;&#039;Package Manager&#039;&#039;.&lt;br /&gt;
# The &#039;&#039;Package Manager&#039;&#039; window will pop-up.&lt;br /&gt;
# Install the package containing the assets you want to use...&lt;br /&gt;
## &amp;lt;u&amp;gt;If not using Unity Registry&amp;lt;/u&amp;gt;...&lt;br /&gt;
### Find the &#039;&#039;+▾&#039;&#039; button in the top left and open the drop down.&lt;br /&gt;
### Install the package from one of those options.&lt;br /&gt;
## &amp;lt;u&amp;gt;If using Unity Registry&amp;lt;/u&amp;gt;...&lt;br /&gt;
### Visit &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://assetstore.unity.com&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; and sign in.&lt;br /&gt;
### Search for the asset desired.&lt;br /&gt;
### Go to it&#039;s page (e.g. &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://assetstore.unity.com/packages/3d/props/low-poly-medieval-market-stalls-314286&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;) and click the big blue button, &#039;&#039;Add to My Assets.&#039;&#039;&lt;br /&gt;
### Now, in the Unity editor and back at the &#039;&#039;Package Manager&#039;&#039; window.&lt;br /&gt;
### Find &#039;&#039;My Assets&#039;&#039; on the left menu and navigate to it.&lt;br /&gt;
### Click the &#039;&#039;⟳&#039;&#039; button in the lower-right.&lt;br /&gt;
### The asset should be in the list now. Use the search to filter if needed.&lt;br /&gt;
### Click on the asset in the list. For those following along, &#039;&#039;Low Poly Medieval Market Stalls&#039;&#039;.&lt;br /&gt;
### In the right panel, find the &#039;&#039;Download ⤓&#039;&#039; button. Click it.&lt;br /&gt;
### Once downloaded, a new button should show up, it&#039;ll say something like &#039;&#039;⊕ Import 1.0 to project&#039;&#039; . Click it.&lt;br /&gt;
### The &#039;&#039;Import Unity Package&#039;&#039; window will pop-up.&lt;br /&gt;
### Select &#039;&#039;Import&#039;&#039; on it.&lt;br /&gt;
# Verify you can find your assets from the explorer. If following along, the assets are at &amp;lt;code&amp;gt;Assets/PolyRonin/Medieval Market Stalls&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Load in a demo scene, if provided, and make sure everything looks okay.&lt;br /&gt;
## For those following along, double click on the &#039;&#039;Demo&#039;&#039; scene at &amp;lt;code&amp;gt;Assets/PolyRonin/Medieval Market Stalls/Demo.unity&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:Eco - Unity - View Modes.png|thumb|Underlined in red are the different draw mode buttons. &amp;lt;u&amp;gt;4/20/26&amp;lt;/u&amp;gt;]]&lt;br /&gt;
If something seems off, check the different draw modes and see if changing those allow the scene to render as expected (see picture).&lt;br /&gt;
&lt;br /&gt;
= Creating The Worktable =&lt;br /&gt;
This guide will create the worktable in this order:&lt;br /&gt;
&lt;br /&gt;
# Create the item that represents the worktable&lt;br /&gt;
# Make a recipe to craft the worktable item&lt;br /&gt;
# Make the worktable item something that places a world object&lt;br /&gt;
# Give the worktable functionality by adding recipes to it&lt;br /&gt;
&lt;br /&gt;
== Creating the Item ==&lt;br /&gt;
&lt;br /&gt;
=== Item Icon ===&lt;br /&gt;
[[File:TeamstersStall - StallOnly - 256x256.png|thumb|A large (256x256px) icon created of Stall4 from the medieval assets.]]&lt;br /&gt;
# Open &amp;lt;u&amp;gt;Blender&amp;lt;/u&amp;gt;.&lt;br /&gt;
# Delete everything in the &#039;&#039;Scene Collection&#039;&#039;. Find this section in the top-right of the application.&lt;br /&gt;
# From the top toolbar, open the &#039;&#039;File&#039;&#039; drop down.&lt;br /&gt;
# Hover &#039;&#039;Import&#039;&#039; to open the sub-menu.&lt;br /&gt;
# Select the type of 3D asset. For those using medieval assets, select &#039;&#039;FBX (.fbx)&#039;&#039;.&lt;br /&gt;
# Find the asset on the computer...&amp;lt;br&amp;gt;&#039;&#039;&#039;Tip:&#039;&#039;&#039; Use Unity to find the &amp;lt;code&amp;gt;.fbx&amp;lt;/code&amp;gt; asset. &lt;br /&gt;
## For the medieval assets, that&#039;s in &amp;lt;code&amp;gt;Assets/PolyRonin/Medieval Market Stalls/Meshes/medieval-market-stalls-1.fbx&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Right click on it and select &#039;&#039;Show in explorer&#039;&#039;.&lt;br /&gt;
## Now copy the address of that folder from Explorer. It might look like &amp;lt;code&amp;gt;C:\Users\Wug\EcoMod--WikiDemo\WikiDemo\Assets\PolyRonin\Medieval Market Stalls\Meshes&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Paste that in the address bar of the &amp;lt;u&amp;gt;Blender&amp;lt;/u&amp;gt; import pop-up.&lt;br /&gt;
# Select the blue &#039;&#039;Import FBX&#039;&#039; button&#039;&#039;.&#039;&#039;&lt;br /&gt;
# Be in the &#039;&#039;Layout&#039;&#039; workspace (top toolbar) and in the &#039;&#039;Object Mode...&#039;&#039;&lt;br /&gt;
## Find the drop down in the second toolbar from the top that has options like &#039;&#039;Object Mode, Edit Mode, Sculpt Mode,&#039;&#039; etc.&lt;br /&gt;
## Select &#039;&#039;Object Mode&#039;&#039; from that drop down.&lt;br /&gt;
# Change the Viewport Shading to Material Preview or Rendered. This is on the second toolbar down, far right of center, but before &#039;&#039;Scene Collection&#039;&#039; section.&lt;br /&gt;
# If you see purple models, Blender will need help finding textures for these meshes...&lt;br /&gt;
## From the top toolbar, open the &#039;&#039;File&#039;&#039; drop down.&lt;br /&gt;
## Hover &#039;&#039;External Data&#039;&#039; to open the sub-menu.&lt;br /&gt;
## Select &#039;&#039;Find Missing Files...&#039;&#039;&lt;br /&gt;
## Point this to the whole directory that the 3D assets came in. For the medieval pack, &amp;lt;code&amp;gt;C:\Users\&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;Wug\EcoMod--WikiDemo\WikiDemo\Assets\PolyRonin&amp;lt;/code&amp;gt;.&lt;br /&gt;
## The proper textures/materials should have now loaded in. If it hasn&#039;t, consult Google because without the textures the following steps won&#039;t produce a usable icon.&lt;br /&gt;
# Add a source of light...&lt;br /&gt;
## Still be in the &#039;&#039;Layout&#039;&#039; workspace (top toolbar) and in the &#039;&#039;Object Mode...&#039;&#039;&lt;br /&gt;
### Find the drop down in the second toolbar from the top that has options like &#039;&#039;Object Mode, Edit Mode, Sculpt Mode,&#039;&#039; etc.&lt;br /&gt;
### Select &#039;&#039;Object Mode&#039;&#039; from that drop down.&lt;br /&gt;
## From the toolbar just under that one, find and open the &#039;&#039;Add&#039;&#039; drop down.&lt;br /&gt;
## Hover &#039;&#039;Light&#039;&#039; to open that sub-menu.&lt;br /&gt;
## Click &#039;&#039;Sun&#039;&#039;.&lt;br /&gt;
# Add a camera...&lt;br /&gt;
## In the &#039;&#039;Layout&#039;&#039; workspace (top toolbar) and in the &#039;&#039;Object Mode...&#039;&#039;&lt;br /&gt;
### Find the drop down in the second toolbar from the top that has options like &#039;&#039;Object Mode, Edit Mode, Sculpt Mode,&#039;&#039; etc.&lt;br /&gt;
### Select &#039;&#039;Object Mode&#039;&#039; from that drop down.&lt;br /&gt;
## From the second toolbar down, find and open the &#039;&#039;Add&#039;&#039; drop down.&lt;br /&gt;
## Select &#039;&#039;Camera&#039;&#039;.&lt;br /&gt;
# Setup the scene with the object placement and lighting direction desired.&amp;lt;br&amp;gt;&#039;&#039;&#039;Tip:&#039;&#039;&#039; To reset the editor to something selected press the period key &amp;lt;u&amp;gt;on the numpad&amp;lt;/u&amp;gt;. Without a numpad, use &#039;&#039;View&#039;&#039; (second toolbar from the top) and select &#039;&#039;Frame Selected&#039;&#039; from it. Alternatively, just set the zoom to zoom to the mouse position: &#039;&#039;Edit&#039;&#039; (top toolbar), &#039;&#039;Preferences&#039;&#039; (from drop down), &#039;&#039;Navigation&#039;&#039; (on left menu), &#039;&#039;Zoom to Mouse Position&#039;&#039; (In the zoom section). This makes moving around a lot more natural feeling.&lt;br /&gt;
# Setup the rendering camera...&lt;br /&gt;
## Go to &#039;&#039;Rendering&#039;&#039;  tab on the top toolbar&lt;br /&gt;
## On the right there will be a side-panel open, it should be the &#039;&#039;Render&#039;&#039; tab. Confirm that.&lt;br /&gt;
## Change &#039;&#039;Render Engine&#039;&#039; to &#039;&#039;Cycles&#039;&#039;.&lt;br /&gt;
## Look down below in the same tab for the &#039;&#039;Film&#039;&#039; section.&lt;br /&gt;
## Expand it and find the &#039;&#039;Transparent&#039;&#039; checkbox and section. Click it so that it has a check mark. This will make the icon&#039;s background transparent.&lt;br /&gt;
## Now, go to the &#039;&#039;Output&#039;&#039; tab &amp;lt;u&amp;gt;on the side panel&amp;lt;/u&amp;gt;. The tab is just below the current one.&lt;br /&gt;
## In the &#039;&#039;Format&#039;&#039; section set &#039;&#039;Resolution X&#039;&#039; to &#039;&#039;64.&#039;&#039; And &#039;&#039;Y&#039;&#039; to &#039;&#039;64&#039;&#039; as well. This will make the icon generated a 64 by 64 pixel image.&lt;br /&gt;
# Go back to the &#039;&#039;Layout&#039;&#039; tab from the top toolbar.&lt;br /&gt;
# Center your view on the object (numpad period or &#039;&#039;View &amp;gt; Frame Selected&#039;&#039;). Adjust it so that the object is how it should be for the icon.&lt;br /&gt;
# Align the camera to the view...&lt;br /&gt;
## Make sure the editor is in &#039;&#039;Layout&#039;&#039; workspace (top toolbar) and in the &#039;&#039;Object Mode...&#039;&#039;&lt;br /&gt;
### Find the drop down in the second toolbar from the top that has options like &#039;&#039;Object Mode, Edit Mode, Sculpt Mode,&#039;&#039; etc.&lt;br /&gt;
### Select &#039;&#039;Object Mode&#039;&#039; from that drop down.&lt;br /&gt;
## Find &#039;&#039;View&#039;&#039; from the second from the top toolbar and open the drop down.&lt;br /&gt;
## Hover &#039;&#039;Align View&#039;&#039; to open the sub-menu.&lt;br /&gt;
## Select &#039;&#039;Align Active Camera To View&#039;&#039;.&lt;br /&gt;
## If the view is slightly off, there is a lock icon on the right side of this panel. Use it to &amp;quot;lock&amp;quot; controls to the camera and tweak it&#039;s view.&lt;br /&gt;
# Now return to the &#039;&#039;Rendering&#039;&#039; tab from the top toolbar.&lt;br /&gt;
# Press the F12 key to start the render. This should complete quickly since 64x64 pixels is a very small render.&lt;br /&gt;
# A window should popup, &#039;&#039;Blender Render&#039;&#039;. This is the icon!&lt;br /&gt;
# From the top tool bar of this &#039;&#039;Blender Render&#039;&#039; window, open the &#039;&#039;Image&#039;&#039; drop down.&lt;br /&gt;
# Select &#039;&#039;Save As...&#039;&#039; to save somewhere on the computer.&lt;br /&gt;
# Return to step 13 and repeat to do larger images if desired. Create a 128 by 128 pixel image too. It will make things smoother later.&lt;br /&gt;
# Save the Blender scene. Not only will it be used later, this will make making a new icon with a small tweak that much easier.&lt;br /&gt;
## &#039;&#039;File&#039;&#039; drop down from top toolbar.&lt;br /&gt;
## &#039;&#039;Save As...&#039;&#039; to save the Blender scene to the computer.&lt;br /&gt;
## Save it to &amp;lt;code&amp;gt;Assets/WikiDemo/MedievalStall - Icon Scene.blend&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Adding to Unity Scene ===&lt;br /&gt;
The developers explain how to create an item in one of ModKit&#039;s read me files (See: &amp;lt;code&amp;gt;Assets/EcoModKit/Docs/README.md&amp;lt;/code&amp;gt;), but this guide will explain it below.&lt;br /&gt;
&lt;br /&gt;
Additionally, &#039;&#039;&#039;TheKye&#039;&#039;&#039; on YouTube covers this in their &#039;&#039;Creating Your First Item&#039;&#039; and &#039;&#039;Creating Your First Item Pt 2&#039;&#039; videos.&lt;br /&gt;
&lt;br /&gt;
Use those additional resource to help troubleshoot issues with item&#039;s icons.&lt;br /&gt;
&lt;br /&gt;
# Open &amp;lt;u&amp;gt;Unity&amp;lt;/u&amp;gt;.&lt;br /&gt;
# In the left panel, the &#039;&#039;Hierarchy&#039;&#039; tab should be selected.&lt;br /&gt;
# Select the top-most object there. It should be a scene. If the editor last loaded the &#039;&#039;Demo&#039;&#039; scene from the medieval assets, it&#039;ll be named &#039;&#039;Demo&#039;&#039;.&lt;br /&gt;
# Right click on this scene and select &#039;&#039;Add New Scene&#039;&#039; from the menu.&lt;br /&gt;
# Right click again on the old scene (&#039;&#039;Demo&#039;&#039;) and select &#039;&#039;Remove Scene&#039;&#039;.&lt;br /&gt;
# Let it save if the changes to the old scene are important. Discard if it was open just for exploration&#039;s sake.&lt;br /&gt;
# Right click the new, &#039;&#039;Untitled&#039;&#039; scene. Click &#039;&#039;Save Scene As...&#039;&#039;&lt;br /&gt;
# Save it to &amp;lt;code&amp;gt;Assets/WikiDemo.unity&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Delete &amp;lt;u&amp;gt;anything&amp;lt;/u&amp;gt; in the scene.&lt;br /&gt;
# Right click the scene, hover &#039;&#039;GameObject&#039;&#039;, and select &#039;&#039;Create Empty&#039;&#039; from the sub-menu.&lt;br /&gt;
# Name this new object &#039;&#039;Objects&#039;&#039;.&lt;br /&gt;
# Select the newly created &#039;&#039;Objects&#039;&#039; object from the &#039;&#039;Hierarchy&#039;&#039; menu.&lt;br /&gt;
# On the far right side of the screen, in the &#039;&#039;Inspector&#039;&#039; menu, click the &#039;&#039;Add Component&#039;&#039; button.&lt;br /&gt;
# Type in &#039;&#039;ModkitPrefabContainer&#039;&#039;. Click on the component from the search to add it. The component now should be listed in the &#039;&#039;Inspector&#039;&#039;.&lt;br /&gt;
# In the &#039;&#039;Hierarchy&#039;&#039; panel right click the scene, hover &#039;&#039;GameObject&#039;&#039;, and select &#039;&#039;Create Empty&#039;&#039;.&lt;br /&gt;
# Name this new object &#039;&#039;Items&#039;&#039;.&lt;br /&gt;
# Right click the scene, hover &#039;&#039;GameObject&#039;&#039;, and select &#039;&#039;Create Empty&#039;&#039;.&lt;br /&gt;
# Name this new object &#039;&#039;Emoji&#039;&#039;.&lt;br /&gt;
# Select the newly created &#039;&#039;Emoji&#039;&#039; object, find the &#039;&#039;Inspector&#039;&#039; menu (far-right), and click the &#039;&#039;Add Component&#039;&#039; button.&lt;br /&gt;
# Type in &#039;&#039;ChatEmoteSetOld&#039;&#039;. Click on the component from the search to add it. That component should now be listed in the &#039;&#039;Inspector&#039;&#039;.&lt;br /&gt;
# Right click the scene, hover &#039;&#039;GameObject&#039;&#039;, and select &#039;&#039;Create Empty&#039;&#039;.&lt;br /&gt;
# Name this new object &#039;&#039;BlockSets&#039;&#039;.&lt;br /&gt;
# Select the newly created &#039;&#039;BlockSets&#039;&#039; object, find the &#039;&#039;Inspector&#039;&#039; menu (far-right), and click &#039;&#039;Add Component&#039;&#039;.&lt;br /&gt;
# Search for &#039;&#039;BlockSetContainer&#039;&#039;. Click on the component from the search to add it. The &#039;&#039;Inspector&#039;&#039; should now show that component as added.&lt;br /&gt;
#Go to &amp;lt;code&amp;gt;Assets/EcoModKit/Prefabs&amp;lt;/code&amp;gt; in the Unity project window.&lt;br /&gt;
# Find the prefab &#039;&#039;ItemTemplate&#039;&#039;.&lt;br /&gt;
# Drag it onto the &#039;&#039;Items&#039;&#039; object in the &#039;&#039;Hierarchy&#039;&#039; panel. It should add it as a &amp;lt;u&amp;gt;child&amp;lt;/u&amp;gt; of the &#039;&#039;Items&#039;&#039; object.&lt;br /&gt;
# Right click on the new &#039;&#039;ItemTemplate&#039;&#039; object, hover &#039;&#039;Prefab&#039;&#039;, and select &#039;&#039;Unpack Completely&#039;&#039;.&lt;br /&gt;
# Right click on the &#039;&#039;ItemTemplate&#039;&#039; object and select &#039;&#039;Rename&#039;&#039;. Name this what you want the item to be called. Example: &#039;&#039;MedievalStallItem&#039;&#039;.&lt;br /&gt;
# Set this item&#039;s background...&lt;br /&gt;
## Here&#039;s the default backgrounds (blue = item, brown = block, green = food): &amp;lt;br&amp;gt;[[File:Eco - Item - Background.png|border|frameless]]        [[File:Eco - Block - Background.png|frameless]]        [[File:Eco - Food - Background.png|frameless]]&lt;br /&gt;
## Download or prepare the background and add it to the &amp;lt;code&amp;gt;Assets&amp;lt;/code&amp;gt; folder in Unity. &lt;br /&gt;
### To follow along lockstep, put the background in a new &amp;lt;code&amp;gt;Assets/WikiDemo&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
### Right click on &amp;lt;code&amp;gt;Assets&amp;lt;/code&amp;gt; folder, hover &#039;&#039;Create&#039;&#039;, select &#039;&#039;Folder&#039;&#039;.&lt;br /&gt;
### Name the folder &#039;&#039;WikiDemo&#039;&#039;.&lt;br /&gt;
## Configure Unity to use these as sprites...&lt;br /&gt;
### Select the background(s) added (Ctrl+Click each one).&lt;br /&gt;
### In the &#039;&#039;Inspector&#039;&#039;, find &#039;&#039;TextureType&#039;&#039; and change that to &#039;&#039;Sprite (2D and UI)&#039;&#039;.&lt;br /&gt;
### Again in the &#039;&#039;Inspector&#039;&#039;, find &#039;&#039;SpriteMode&#039;&#039; and change that to &#039;&#039;Single&#039;&#039;.&lt;br /&gt;
### Then scroll and go to the bottom of the &#039;&#039;Inspector&#039;&#039; and find the &#039;&#039;Apply&#039;&#039; button.&lt;br /&gt;
### This will apply those changes to that file and all other ones highlighted.&lt;br /&gt;
## Select the item being created (&#039;&#039;MedievalStallItem&#039;&#039;).&lt;br /&gt;
## In the &#039;&#039;Inspector&#039;&#039; panel (far-right), scroll and find the &#039;&#039;Item Template (Script)&#039;&#039; section.&lt;br /&gt;
## In here find the &#039;&#039;Background&#039;&#039; input. It&#039;ll say &#039;&#039;Background (Image)&#039;&#039; in it. If clicked that text to reveal and highlight the related object in the &#039;&#039;Hierarchy&#039;&#039; panel.&lt;br /&gt;
## Select the revealed, and highlighted object &#039;&#039;Background&#039;&#039;.&lt;br /&gt;
## In the &#039;&#039;Inspector&#039;&#039; panel, scroll and find the &#039;&#039;Image&#039;&#039; component section.&lt;br /&gt;
## Inside that component&#039;s section, find &#039;&#039;Source Image&#039;&#039;. It&#039;ll say &#039;&#039;Missing (Sprite)&#039;&#039;. Click the &#039;&#039;⦿&#039;&#039; button to the right.&lt;br /&gt;
## The &#039;&#039;Select Sprite&#039;&#039; popup will show. Make sure the &#039;&#039;Assets&#039;&#039; tab is selected, and find the backgrounds desired.&lt;br /&gt;
#Create the foreground image...&lt;br /&gt;
##This is easily accomplished in MS Paint.&lt;br /&gt;
##Get to the background image file in a &amp;lt;u&amp;gt;file explorer&amp;lt;/u&amp;gt;.&lt;br /&gt;
##Right click on it, hover &#039;&#039;Open with...&#039;&#039;, and select &#039;&#039;Paint&#039;&#039;.&lt;br /&gt;
##The solid background should be displayed.&lt;br /&gt;
##Open the &#039;&#039;File&#039;&#039; menu from the top toolbar.&lt;br /&gt;
##Hover &#039;&#039;Import to Canvas&#039;&#039; and select &#039;&#039;From a File&#039;&#039;.&lt;br /&gt;
##Find the icon in the file browser and import it. Match the size of the background image to have it nicely center itself.&lt;br /&gt;
##Now &#039;&#039;File&#039;&#039; from the top toolbar.&lt;br /&gt;
##Hover &#039;&#039;Save As...&#039;&#039; and select &#039;&#039;PNG&#039;&#039;.&lt;br /&gt;
##Save this to the &amp;lt;code&amp;gt;Assets/WikiDemo&amp;lt;/code&amp;gt; folder in Unity.&lt;br /&gt;
##Configure Unity to use these as sprites...&lt;br /&gt;
### Select the foreground image.&lt;br /&gt;
### In the &#039;&#039;Inspector&#039;&#039;, find &#039;&#039;TextureType&#039;&#039; and change that to &#039;&#039;Sprite (2D and UI)&#039;&#039;.&lt;br /&gt;
### Again in the &#039;&#039;Inspector&#039;&#039;, find &#039;&#039;SpriteMode&#039;&#039; and change that to &#039;&#039;Single&#039;&#039;.&lt;br /&gt;
### Then scroll and go to the bottom of the &#039;&#039;Inspector&#039;&#039; and find the &#039;&#039;Apply&#039;&#039; button.&lt;br /&gt;
### This will apply those changes to that file and all other ones highlighted.&lt;br /&gt;
#Set this item&#039;s foreground...&lt;br /&gt;
## Copy the item&#039;s icon into the &amp;lt;code&amp;gt;Assets&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
## Configure Unity to use it as a sprite (see the previous step&#039;s &#039;&#039;Set this item&#039;s background...&#039;&#039; instructions)&lt;br /&gt;
## Select the item being created (&#039;&#039;MedievalStallItem&#039;&#039;).&lt;br /&gt;
## In the &#039;&#039;Inspector&#039;&#039; panel (far-right), scroll and find the &#039;&#039;Item Template (Script)&#039;&#039; section.&lt;br /&gt;
## In here find the &#039;&#039;Foreground&#039;&#039; input. It&#039;ll say &#039;&#039;Foreground (Image)&#039;&#039; in it. If clicked that text to reveal and highlight the related object in the &#039;&#039;Hierarchy&#039;&#039; panel.&lt;br /&gt;
## Select the revealed, and highlighted object &#039;&#039;Foreground&#039;&#039;.&lt;br /&gt;
## Use the &#039;&#039;Inspector&#039;&#039;, find the &#039;&#039;Image&#039;&#039; component, within that component find the &#039;&#039;Source Image&#039;&#039; input. It will say &#039;&#039;Missing (Sprite)&#039;&#039;.&lt;br /&gt;
## Click the &#039;&#039;⦿&#039;&#039; button to the right of that input.&lt;br /&gt;
## From the &#039;&#039;Select Sprite&#039;&#039; popup, ensure the &#039;&#039;Assets&#039;&#039; tab is being searched, and find the icon just created.&lt;br /&gt;
&lt;br /&gt;
=== Export From Unity ===&lt;br /&gt;
&lt;br /&gt;
# Open the &#039;&#039;File&#039;&#039; menu from the top toolbar.&lt;br /&gt;
# Select &#039;&#039;Save.&#039;&#039; Save it to the &amp;lt;code&amp;gt;Assets/WikiDemo&amp;lt;/code&amp;gt; folder.&amp;lt;br&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; Do not skip. The scene must be saved for the ModKit build to work properly.&lt;br /&gt;
# Open the &#039;&#039;Eco Tools&#039;&#039; menu from the top toolbar.&lt;br /&gt;
# Hover &#039;&#039;Mod Kit&#039;&#039; to open the sub-menu.&lt;br /&gt;
# Select &#039;&#039;Build Current Bundle&#039;&#039;.&lt;br /&gt;
# Have it output the bundle to &amp;lt;code&amp;gt;/Eco Server/Mods/UserCode/WikiDemo.unity3d&amp;lt;/code&amp;gt;&lt;br /&gt;
# Wait for this to build. This may take a few minutes.&lt;br /&gt;
&lt;br /&gt;
=== Scripting the Item ===&lt;br /&gt;
For this guide, all code will be placed in a single &amp;lt;code&amp;gt;.cs&amp;lt;/code&amp;gt; file and will not be compiled into a &amp;lt;code&amp;gt;.dll&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
# Create a &amp;lt;code&amp;gt;.cs&amp;lt;/code&amp;gt; file: &amp;lt;code&amp;gt;/Eco Server/Mods/UserCode/WikiDemo.cs&amp;lt;/code&amp;gt;&lt;br /&gt;
# Put the following into the newly created file:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;using Eco.Core.Items;&lt;br /&gt;
using Eco.Gameplay.Items;&lt;br /&gt;
using Eco.Shared.Localization;&lt;br /&gt;
using Eco.Shared.Serialization;&lt;br /&gt;
&lt;br /&gt;
namespace WikiDemo&lt;br /&gt;
{&lt;br /&gt;
    #region Item&lt;br /&gt;
    [Serialized] // Tells the save/load system this object needs to be serialized.&lt;br /&gt;
    [LocDisplayName(&amp;quot;Market Stall&amp;quot;)] // Defines the localized name of the item.&lt;br /&gt;
    [Weight(100)] // Defines how heavy Arrow is.&lt;br /&gt;
    [Ecopedia(&amp;quot;Work Stations&amp;quot;, &amp;quot;Craft Tables&amp;quot;, createAsSubPage: true)]&lt;br /&gt;
    [LocDescription(&amp;quot;A medieval market stall.&amp;quot;)] //The tooltip description for the item.&lt;br /&gt;
    public partial class MedievalStallItem: Item { }&lt;br /&gt;
    #endregion&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Line 8:&#039;&#039;&#039; A region tag. Lets the editor know it can collapse all of that code as a section. The following examples in this guide will just show &amp;lt;code&amp;gt;#region Item&amp;lt;/code&amp;gt; in their code examples.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 13:&#039;&#039;&#039; The implementation of &amp;lt;code&amp;gt;Item&amp;lt;/code&amp;gt; means that Eco will find this and look for Unity assets that matching this class&#039; name, &amp;lt;code&amp;gt;MedivalStallItem&amp;lt;/code&amp;gt;. While this doesn&#039;t do anything fancy, it completes the first step towards a new workbench.&lt;br /&gt;
&lt;br /&gt;
=== Checkpoint #1 ===&lt;br /&gt;
[[File:Eco - Hotbar With Modded Icon.png|thumb|Shows the medieval stall as a modded icon in-game.]]&lt;br /&gt;
Make sure everything is running smoothly by doing the following:&lt;br /&gt;
&lt;br /&gt;
# Double-check that the &amp;lt;code&amp;gt;WikiDemo.unity3d&amp;lt;/code&amp;gt; and the &amp;lt;code&amp;gt;WikiDemo.cs&amp;lt;/code&amp;gt; files are in &amp;lt;code&amp;gt;/Eco Server/Mods/UserCode&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
# Start the server and connect to it.&lt;br /&gt;
# Test it out by typing &amp;lt;code&amp;gt;/give MedievalStall&amp;lt;/code&amp;gt; in chat.&lt;br /&gt;
## It&#039;s also possible to do &amp;lt;code&amp;gt;/give Market Stall&amp;lt;/code&amp;gt; to get the item. How? Line 10: of the the above code declares that name as this item&#039;s &amp;quot;common name&amp;quot;. Neat.&lt;br /&gt;
# The item should appear in the players inventory with a working icon.&lt;br /&gt;
&lt;br /&gt;
== Code the Item&#039;s Recipe ==&lt;br /&gt;
The following goes over how to add a new class and implement the &amp;lt;code&amp;gt;RecipeFamily&amp;lt;/code&amp;gt; interface.&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;using Eco.Core.Items;&lt;br /&gt;
using Eco.Gameplay.Components;&lt;br /&gt;
using Eco.Gameplay.Items;&lt;br /&gt;
using Eco.Gameplay.Items.Recipes;&lt;br /&gt;
using Eco.Gameplay.Skills;&lt;br /&gt;
using Eco.Mods.TechTree;&lt;br /&gt;
using Eco.Shared.Localization;&lt;br /&gt;
using Eco.Shared.Serialization;&lt;br /&gt;
using System.Runtime.Versioning;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
&lt;br /&gt;
namespace WikiDemo&lt;br /&gt;
{&lt;br /&gt;
    #region Item&lt;br /&gt;
&lt;br /&gt;
    #region Recipe&lt;br /&gt;
    [RequiresSkill(typeof(CarpentrySkill), 3)]&lt;br /&gt;
    [Ecopedia(&amp;quot;Work Stations&amp;quot;, &amp;quot;Craft Tables&amp;quot;, subPageName: &amp;quot;Market Stall&amp;quot;)]&lt;br /&gt;
    public partial class MedievalStallRecipe : RecipeFamily&lt;br /&gt;
    {&lt;br /&gt;
        [SupportedOSPlatform(&amp;quot;windows7.0&amp;quot;)]&lt;br /&gt;
        public MedievalStallRecipe()&lt;br /&gt;
        {&lt;br /&gt;
            var recipe = new Recipe();&lt;br /&gt;
            recipe.Init(&lt;br /&gt;
                name: &amp;quot;MedievalStallItem&amp;quot;,&lt;br /&gt;
                displayName: Localizer.DoStr(&amp;quot;Market Stall&amp;quot;),&lt;br /&gt;
                ingredients: new List&amp;lt;IngredientElement&amp;gt;&lt;br /&gt;
                {&lt;br /&gt;
                    new IngredientElement(&amp;quot;Wood&amp;quot;, 40, typeof(Skill)),&lt;br /&gt;
                    new IngredientElement(typeof(CottonFabricItem), 30, typeof(Skill)),&lt;br /&gt;
                    new IngredientElement(typeof(HempMooringRopeItem), 5, true)&lt;br /&gt;
                },&lt;br /&gt;
                items: new List&amp;lt;CraftingElement&amp;gt;&lt;br /&gt;
                {&lt;br /&gt;
                    new CraftingElement&amp;lt;MedievalStallItem&amp;gt;(1)&lt;br /&gt;
                }&lt;br /&gt;
            );&lt;br /&gt;
            this.Recipes = new List&amp;lt;Recipe&amp;gt; { recipe };&lt;br /&gt;
            this.LaborInCalories = CreateLaborInCaloriesValue(800, typeof(Skill));&lt;br /&gt;
            this.CraftMinutes = CreateCraftTimeValue(typeof(MedievalStallRecipe), 10f, typeof(Skill));&lt;br /&gt;
    &lt;br /&gt;
            // Perform pre/post initialization for user mods and initialize our recipe instance with the display name &amp;quot;Market Stall&amp;quot;&lt;br /&gt;
            this.ModsPreInitialize();&lt;br /&gt;
            this.Initialize(displayText: Localizer.DoStr(&amp;quot;Market Stall&amp;quot;), recipeType: typeof(MedievalStallRecipe));&lt;br /&gt;
            this.ModsPostInitialize();&lt;br /&gt;
    &lt;br /&gt;
            // Register our RecipeFamily instance to a work table (in this case the Carpentry Table) so it can be crafted.&lt;br /&gt;
            CraftingComponent.AddRecipe(tableType: typeof(CarpentryTableObject), recipeFamily: this); // NOTE: The table must be the object instance!&lt;br /&gt;
        }&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
        /// &amp;lt;summary&amp;gt;Hook for other mods to customize RecipeFamily before initialization.&amp;lt;/summary&amp;gt;&lt;br /&gt;
        partial void ModsPreInitialize();&lt;br /&gt;
    &lt;br /&gt;
        /// &amp;lt;summary&amp;gt;Hook for other mods to customize RecipeFamily after initialization, but before registration. You can change skill requirements here.&amp;lt;/summary&amp;gt;&lt;br /&gt;
        partial void ModsPostInitialize();&lt;br /&gt;
    }&lt;br /&gt;
    #endregion&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Line 10:&#039;&#039;&#039; Eco will need this explicitly added to the file. Visual Studio will not add this line automatically. It&#039;s used for the &amp;lt;code&amp;gt;List&amp;lt;T&amp;gt;&amp;lt;/code&amp;gt; objects found in this code.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 14:&#039;&#039;&#039; &amp;quot;Collapsed&amp;quot; &amp;lt;code&amp;gt;Item&amp;lt;/code&amp;gt; section. See the earlier sections in this guide for the code that belongs there.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 17:&#039;&#039;&#039; Sets the required skill and skill level to craft this recipe.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 21:&#039;&#039;&#039; &amp;lt;code&amp;gt;[SupportedOSPlatform(&amp;quot;windows7.0&amp;quot;)]&amp;lt;/code&amp;gt; is here to silence some annoying warnings in Visual Studio. It&#039;s optional.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 30-32:&#039;&#039;&#039; Declares the input ingredients used for crafting. &amp;lt;code&amp;gt;typeof(Skill)&amp;lt;/code&amp;gt; gets mapped to the &amp;lt;code&amp;gt;CarpentrySkill&amp;lt;/code&amp;gt; as defined by line 31. In this example the &amp;lt;code&amp;gt;HempMooringRope&amp;lt;/code&amp;gt; is a static input. A static input will not be modified by skills, upgrade modules, or game settings.&amp;lt;br&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; It seems that at the time of writing (4/21/2026, Eco v13.0.2) the only way to get an ingredient to be a dynamic value that is reduced by the table&#039;s upgrade is to pass &amp;lt;code&amp;gt;typeof(Skill)&amp;lt;/code&amp;gt; to it; Passing either &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; makes the this input static.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 34:&#039;&#039;&#039; The &amp;lt;code&amp;gt;items&amp;lt;/code&amp;gt; list declares what items are &amp;lt;u&amp;gt;output&amp;lt;/u&amp;gt; by this recipe.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 36:&#039;&#039;&#039; This line declares that one medieval stall is output from this recipe. Functionally this links this recipe to the &amp;lt;code&amp;gt;MedievalStallItem&amp;lt;/code&amp;gt; (aka &amp;quot;Market Stall&amp;quot;) item created in the last step.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 40:&#039;&#039;&#039; Amount of calories needed to craft this item. For a static value (not modified by upgrades or skill levels) change this line to: &amp;lt;code&amp;gt;this.LaborInCalories = CreateLaborInCaloriesValue(800);&amp;lt;/code&amp;gt;. As it&#039;s written in the example, this item&#039;s calorie cost will be dynamic (modified by upgrades and skill levels). The skill level that will modify it is declared on line 16.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 41:&#039;&#039;&#039;  Minutes needed to craft. Both static and dynamic values for crafting time can be modified by the world difficulty settings. For a static value change this line to: &amp;lt;code&amp;gt;this.CraftMinutes = CreateCraftTimeValue(10f);&amp;lt;/code&amp;gt;. As it&#039;s written in the example, this item&#039;s craft time will be dynamic.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 49:&#039;&#039;&#039; This line assigns the recipe to a workbench. &amp;lt;u&amp;gt;Do not assign&amp;lt;/u&amp;gt; to itself because then the first table could never be made. It&#039;s recommend to use a preexisting vanilla table.&lt;br /&gt;
=== Checkpoint #2 ===&lt;br /&gt;
Check the functionality at this point -- it should be possible to see the recipe in the crafting table.&lt;br /&gt;
&lt;br /&gt;
# Have the &amp;lt;code&amp;gt;.unity3d&amp;lt;/code&amp;gt; and the &amp;lt;code&amp;gt;.cs&amp;lt;/code&amp;gt; file in the &amp;lt;code&amp;gt;/Eco Server/Mods/UserCode&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
# Start the server and log in.&lt;br /&gt;
# Type &amp;lt;code&amp;gt;/give Carpentry Table&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Place the Carpentry Table down and interact to see the what can be crafted.&lt;br /&gt;
# Find the newly added recipe under the name &#039;&#039;Market Stall.&#039;&#039;&lt;br /&gt;
# Type &amp;lt;code&amp;gt;/give Basic Upgrade 4&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Put the basic upgrade into the table.&lt;br /&gt;
# Go back to the recipe for the &#039;&#039;Market Stall&#039;&#039; and make sure the Wood and the Cotton fabric inputs now require less, but the Hemp Mooring Rope still is the same.&amp;lt;br&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; In case the recipe hasn&#039;t changed close that table&#039;s window and interact with it again. It should for the recipes to refresh now that the upgrade is in it.&lt;br /&gt;
&lt;br /&gt;
== Create the World Object ==&lt;br /&gt;
=== Preparing the 3D Asset ===&lt;br /&gt;
# Open &amp;lt;u&amp;gt;Blender&amp;lt;/u&amp;gt;.&lt;br /&gt;
# Load the 3D object created earlier for icon rendering -- &amp;lt;code&amp;gt;Assets/WikiDemo/MedievalStall - Icon Scene.blend&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Cleanup the scene...&lt;br /&gt;
## Delete any light source. Use the &#039;&#039;Scene Collection&#039;&#039; panel on the top-right side of the screen. These will have a 💡 icon and by default are named something like &amp;quot;sun&amp;quot;, &amp;quot;point&amp;quot;, &amp;quot;spot&amp;quot; or &amp;quot;area&amp;quot;.&amp;lt;br&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; If your model is a light source or has one in it, you can leave that light source. The point here is to remove the ambient lights used for icon rendering.&lt;br /&gt;
## Delete any camera(s). Again, use the &#039;&#039;Scene Collection&#039;&#039; panel. These have a 🎥 icon and by default are named something like &amp;quot;camera&amp;quot;.&lt;br /&gt;
# &amp;lt;u&amp;gt;If there are multiple different 3D assets in the scene&amp;lt;/u&amp;gt; (like bags, crates, jars, ect.), join them all together...&lt;br /&gt;
## Select all of the meshes by holding &#039;&#039;Shift&#039;&#039; and clicking on each one in the &#039;&#039;Scene Collection&#039;&#039; panel (right side of window).&amp;lt;br&amp;gt;&#039;&#039;&#039;Tip:&#039;&#039;&#039; Quickly select a group of them by selecting one near the top. Then hold &#039;&#039;Shift&#039;&#039;, &#039;&#039;Ctrl,&#039;&#039; and click on one near the bottom. This will both the one at the top and the one at the bottom, but also every item in between. Neat!&lt;br /&gt;
## Be in &#039;&#039;Layout&#039;&#039; workspace (top toolbar) and in the &#039;&#039;Object Mode...&#039;&#039;&lt;br /&gt;
### Find the drop down in the second toolbar from the top that has options like &#039;&#039;Object Mode, Edit Mode, Sculpt Mode,&#039;&#039; etc.&lt;br /&gt;
### Select &#039;&#039;Object Mode&#039;&#039; from that drop down.&lt;br /&gt;
## Find and open the &#039;&#039;Object&#039;&#039; menu (second toolbar down from the top).&lt;br /&gt;
## Select &#039;&#039;Join&#039;&#039;.&lt;br /&gt;
## In the &#039;&#039;Scene Collection&#039;&#039; panel, double click on the name of the newly joined mesh.&lt;br /&gt;
# Rename the joined mesh to &amp;lt;code&amp;gt;MedievalStallMesh&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Add and position a reference cube...&lt;br /&gt;
## Make sure the editor is in &#039;&#039;Layout&#039;&#039; view (top toolbar) and in the &#039;&#039;Object Mode...&#039;&#039;&lt;br /&gt;
### Find the drop down in the second toolbar from the top that has options like &#039;&#039;Object Mode, Edit Mode, Sculpt Mode,&#039;&#039; etc.&lt;br /&gt;
### Select &#039;&#039;Object Mode&#039;&#039; from that drop down.&lt;br /&gt;
## Then, add a reference cube. Open the &#039;&#039;Add&#039;&#039; menu (second top toolbar down).&lt;br /&gt;
## Hover &#039;&#039;Mesh&#039;&#039;.&lt;br /&gt;
## Select &#039;&#039;Cube.&#039;&#039;&lt;br /&gt;
## Open the &#039;&#039;View&#039;&#039; menu (second toolbar down).&lt;br /&gt;
## Select &#039;&#039;Sidebar&#039;&#039;.&lt;br /&gt;
## A new panel will have expanded.&lt;br /&gt;
## Along the right side of that panel there&#039;s buttons (&#039;&#039;Item, Tool, View, Animation&#039;&#039;). Find and click the &#039;&#039;Item&#039;&#039; button.&lt;br /&gt;
## Find and expand the &#039;&#039;Transform&#039;&#039; section&lt;br /&gt;
## Set the &#039;&#039;Location...&#039;&#039;&lt;br /&gt;
### &#039;&#039;X&#039;&#039; to &#039;&#039;1&#039;&#039;.&lt;br /&gt;
### &#039;&#039;Y&#039;&#039; to &#039;&#039;1&#039;&#039;.&lt;br /&gt;
### &#039;&#039;Z&#039;&#039; to &#039;&#039;1&#039;&#039;.&lt;br /&gt;
## The bottom corner of the cube should be touching the where green and red axis lines meet.&lt;br /&gt;
# Move the reference cube&#039;s origin to &amp;lt;code&amp;gt;(0, 0, 0)&amp;lt;/code&amp;gt;...&lt;br /&gt;
## Be in &#039;&#039;Layout&#039;&#039; workspace (top toolbar) and in the &#039;&#039;Object Mode...&#039;&#039;&lt;br /&gt;
### Find the drop down in the second toolbar from the top that has options like &#039;&#039;Object Mode, Edit Mode, Sculpt Mode,&#039;&#039; etc.&lt;br /&gt;
### Select &#039;&#039;Object Mode&#039;&#039; from that drop down.&lt;br /&gt;
## Open the &#039;&#039;View&#039;&#039; menu (second toolbar down).&lt;br /&gt;
## Select &#039;&#039;Sidebar&#039;&#039;.&lt;br /&gt;
## A new panel will have expanded.&lt;br /&gt;
## Along the right side of that panel there&#039;s buttons (&#039;&#039;Item, Tool, View, Animation&#039;&#039;). Find and click the &#039;&#039;View&#039;&#039; button.&lt;br /&gt;
## Find and expand the &#039;&#039;3D Cursor&#039;&#039; section.&lt;br /&gt;
## Set the 3D cursor&#039;s &#039;&#039;Location&#039;&#039;...&lt;br /&gt;
### &#039;&#039;X&#039;&#039; to &#039;&#039;0&#039;&#039;.&lt;br /&gt;
### &#039;&#039;Y&#039;&#039; to &#039;&#039;0&#039;&#039;.&lt;br /&gt;
### &#039;&#039;Z&#039;&#039; to &#039;&#039;0.&#039;&#039;&lt;br /&gt;
## Now in the &#039;&#039;Scene Collection&#039;&#039; panel, click on the &#039;&#039;Cube&#039;&#039; mesh to highlight and select it.&lt;br /&gt;
## Open the &#039;&#039;Object&#039;&#039; menu from the second toolbar down from the top.&lt;br /&gt;
## Hover &#039;&#039;Set Origin&#039;&#039;.&lt;br /&gt;
## Select &#039;&#039;Origin to 3D Cursor&#039;&#039;.&lt;br /&gt;
# Set the reference cube&#039;s dimensions...&lt;br /&gt;
## Be in &#039;&#039;Layout&#039;&#039; workspace (top toolbar) and in the &#039;&#039;Object Mode...&#039;&#039;&lt;br /&gt;
### Find the drop down in the second toolbar from the top that has options like &#039;&#039;Object Mode, Edit Mode, Sculpt Mode,&#039;&#039; etc.&lt;br /&gt;
### Select &#039;&#039;Object Mode&#039;&#039; from that drop down.&lt;br /&gt;
## Open the &#039;&#039;View&#039;&#039; menu (second toolbar down).&lt;br /&gt;
## Select and check the &#039;&#039;Sidebar&#039;&#039; option&#039;&#039;.&#039;&#039; &lt;br /&gt;
## The &#039;&#039;Sidebar&#039;&#039; menu just expanded over on the right side of the screen.&lt;br /&gt;
## To the right of the &#039;&#039;Sidebar&#039;&#039;, find and click the &#039;&#039;Item&#039;&#039; button.&lt;br /&gt;
## Expand the &#039;&#039;Transform&#039;&#039; section.&lt;br /&gt;
## Set the &#039;&#039;Dimensions...&#039;&#039;&#039;&#039;&#039;&amp;lt;br&amp;gt;Note:&#039;&#039;&#039; These dimensions only make sense for the asset being used for this guide. If using a different one, set the dimensions to the size of the box that model should fit in.&lt;br /&gt;
### &#039;&#039;X&#039;&#039; to &#039;&#039;4&#039;&#039;.&lt;br /&gt;
### &#039;&#039;Y&#039;&#039; to &#039;&#039;3&#039;&#039;.&lt;br /&gt;
### &#039;&#039;Z&#039;&#039; to &#039;&#039;3&#039;&#039;. &lt;br /&gt;
# Adjust the position and scale of the &#039;&#039;MedievalStallMesh&#039;&#039; to fit inside a box.&lt;br /&gt;
## Be in &#039;&#039;Layout&#039;&#039; workspace (top toolbar) and in the &#039;&#039;Object Mode...&#039;&#039;&lt;br /&gt;
### Find the drop down in the second toolbar from the top that has options like &#039;&#039;Object Mode, Edit Mode, Sculpt Mode,&#039;&#039; etc.&lt;br /&gt;
### Select &#039;&#039;Object Mode&#039;&#039; from that drop down.&lt;br /&gt;
## On the left side of the screen there&#039;s a column of icons. Hover over them to see their names.&lt;br /&gt;
## Select the &#039;&#039;Move&#039;&#039; tool.&lt;br /&gt;
## Click on the Medieval Stall to select it. Zoom out and reposition the camera so that the blue, green, and red arrows are visible.&amp;lt;br&amp;gt;&#039;&#039;&#039;Tip:&#039;&#039;&#039; By holding the middle-mouse button and dragging the scene will rotate. By holding the middle-mouse button and the &#039;&#039;Shift&#039;&#039; key, the scene will pan.&amp;lt;br&amp;gt;&#039;&#039;&#039;Tip:&#039;&#039;&#039; If panning or rotating the scene becomes slow or frustrating (especially after zooming), try selecting 3D asset from the &#039;&#039;Scene Collection&#039;&#039; panel, opening the &#039;&#039;View&#039;&#039; menu (second toolbar from top), and selecting &#039;&#039;Frame Selected&#039;&#039;. This will reset the view onto that object and controls should feel normal again.&lt;br /&gt;
## Click and hold one of the arrows. Move the mouse to drag the 3D asset towards the box.&lt;br /&gt;
## Move the 3D asset around till it&#039;s &amp;lt;u&amp;gt;completely inside the box&amp;lt;/u&amp;gt;. If it cannot fit and is too big, continue to the next step.&amp;lt;br&amp;gt;&#039;&#039;&#039;Tip:&#039;&#039;&#039; To select the 3D asset once it disappears, use the &#039;&#039;Scene Collection&#039;&#039; panel. Click on it there and the blue, green, and red arrows will show up again for it.&amp;lt;br&amp;gt;&#039;&#039;&#039;Tip:&#039;&#039;&#039; There are preset views. To use them go to the &#039;&#039;View&#039;&#039; menu (second toolbar from top)&#039;&#039;,&#039;&#039; hover &#039;&#039;Viewpoint&#039;&#039;, and select the view that would be most helpful.&lt;br /&gt;
## Find the &#039;&#039;Scale&#039;&#039; tool from the left side of the screen.&lt;br /&gt;
## Now the blue, green, and red &amp;quot;arrows&amp;quot; don&#039;t really look like arrows anymore. They are lines with boxes at the end.&lt;br /&gt;
## Click and hold on those lines to adjust the scale of the 3D asset to make it fit inside the box.&amp;lt;br&amp;gt;&#039;&#039;&#039;Tip:&#039;&#039;&#039; There are little colored boxes in between the lines that can be dragged to scale the 3D asset more proportionally.&lt;br /&gt;
## Continue using the &#039;&#039;Move&#039;&#039; and &#039;&#039;Scale&#039;&#039; tools till the model fits. This will take patience and time.&amp;lt;br&amp;gt;&#039;&#039;&#039;Tip:&#039;&#039;&#039; Hide the reference cube to see what is happening with the 3D asset. Go to the &#039;&#039;Scene Collections&#039;&#039; panel and click the 👁 button to hide it. Click that button again to show it.&lt;br /&gt;
# Move the reference cube&#039;s origin to &amp;lt;code&amp;gt;(0.5, 0.5, 0.5)&amp;lt;/code&amp;gt;...&lt;br /&gt;
## Be in &#039;&#039;Layout&#039;&#039; workspace (top toolbar) and in the &#039;&#039;Object Mode...&#039;&#039;&lt;br /&gt;
### Find the drop down in the second toolbar from the top that has options like &#039;&#039;Object Mode, Edit Mode, Sculpt Mode,&#039;&#039; etc.&lt;br /&gt;
### Select &#039;&#039;Object Mode&#039;&#039; from that drop down.&lt;br /&gt;
## Open the &#039;&#039;View&#039;&#039; menu (second toolbar down).&lt;br /&gt;
## Select &#039;&#039;Sidebar&#039;&#039;.&lt;br /&gt;
## A new panel will have expanded.&lt;br /&gt;
## Along the right side of that panel there&#039;s buttons (&#039;&#039;Item, Tool, View, Animation&#039;&#039;). Find and click the &#039;&#039;View&#039;&#039; button.&lt;br /&gt;
## Find and expand the &#039;&#039;3D Cursor&#039;&#039; section.&lt;br /&gt;
## Set the 3D cursor&#039;s &#039;&#039;Location&#039;&#039;...&lt;br /&gt;
### &#039;&#039;X&#039;&#039; to &#039;&#039;0&#039;&#039;.5.&lt;br /&gt;
### &#039;&#039;Y&#039;&#039; to &#039;&#039;0.5&#039;&#039;.&lt;br /&gt;
### &#039;&#039;Z&#039;&#039; to &#039;&#039;0.5.&#039;&#039;&lt;br /&gt;
## Select the &#039;&#039;MedievalStallMesh&#039;&#039; using the &#039;&#039;Scene Collection&#039;&#039; panel.&lt;br /&gt;
## Open the &#039;&#039;Object&#039;&#039; menu (second toolbar down).&lt;br /&gt;
## Hover &#039;&#039;Set Origin&#039;&#039;.&lt;br /&gt;
## Select &#039;&#039;Origin to 3D Cursor&#039;&#039;.&lt;br /&gt;
# Select the reference cube named &#039;&#039;Cube&#039;&#039; from the &#039;&#039;Scene Collections&#039;&#039; panel.&lt;br /&gt;
# Open &#039;&#039;Object&#039;&#039; menu (second toolbar down).&lt;br /&gt;
# Select &#039;&#039;Delete&#039;&#039;.&lt;br /&gt;
# Move the &#039;&#039;MedievalStallMesh&#039;&#039; to &amp;lt;code&amp;gt;(0, 0, 0)&amp;lt;/code&amp;gt;...&lt;br /&gt;
## Be in &#039;&#039;Layout&#039;&#039; workspace (top toolbar) and in the &#039;&#039;Object Mode...&#039;&#039;&lt;br /&gt;
### Find the drop down in the second toolbar from the top that has options like &#039;&#039;Object Mode, Edit Mode, Sculpt Mode,&#039;&#039; etc.&lt;br /&gt;
### Select &#039;&#039;Object Mode&#039;&#039; from that drop down.&lt;br /&gt;
## Open the &#039;&#039;View&#039;&#039; menu (second toolbar down).&lt;br /&gt;
## Select &#039;&#039;Sidebar&#039;&#039;.&lt;br /&gt;
## A new panel will have expanded.&lt;br /&gt;
## Along the right side of that panel there&#039;s buttons (&#039;&#039;Item, Tool, View, Animation&#039;&#039;). Find and click the &#039;&#039;Item&#039;&#039; button.&lt;br /&gt;
## Make sure the &#039;&#039;MedievalStallMesh&#039;&#039; is selected. Use the &#039;&#039;Scene Collection&#039;&#039; panel if needed.&lt;br /&gt;
## Find and expand the &#039;&#039;Transform&#039;&#039; section&lt;br /&gt;
## Set the &#039;&#039;Location...&#039;&#039;&lt;br /&gt;
### &#039;&#039;X&#039;&#039; to 0.&lt;br /&gt;
### &#039;&#039;Y&#039;&#039; to 0.&lt;br /&gt;
### &#039;&#039;Z&#039;&#039; to 0.&lt;br /&gt;
# Make sure the &#039;&#039;MedievalStallMesh&#039;&#039; is selected. Use the &#039;&#039;Scene Collection&#039;&#039; panel if needed.&lt;br /&gt;
# Open the &#039;&#039;Object&#039;&#039; menu.&lt;br /&gt;
# Hover &#039;&#039;Apply&#039;&#039;.&lt;br /&gt;
# Select &#039;&#039;All Transformations&#039;&#039;. &#039;&#039;&#039;Note:&#039;&#039;&#039; This step bakes all of the changes into the mesh. It&#039;s very important.&lt;br /&gt;
# Open the &#039;&#039;File&#039;&#039;  menu from the top toolbar.&lt;br /&gt;
# Hover &#039;&#039;Export&#039;&#039; to open the sub-menu.&lt;br /&gt;
# Select &#039;&#039;FBX (.fbx)&#039;&#039; &lt;br /&gt;
# A &#039;&#039;Blender File View&#039;&#039; window will pop-up.&lt;br /&gt;
# On the right side of this window there&#039;s a ⚙️ icon. Click it to expand the settings region.&lt;br /&gt;
# In the expanded region find the &#039;&#039;Include&#039;&#039; section and expand it. Change the following:&lt;br /&gt;
## Find &#039;&#039;Object Types&#039;&#039; and only select &#039;&#039;Mesh.&#039;&#039; No other option should be highlighted for this setting.&lt;br /&gt;
# In the settings region scroll and find the &#039;&#039;Transform&#039;&#039; section and expand it. Change the following:&lt;br /&gt;
## Find &#039;&#039;Apply Scalings&#039;&#039; and set it to &#039;&#039;FBX All&#039;&#039;.&lt;br /&gt;
## Just below that find &#039;&#039;Forward&#039;&#039; and set it to &#039;&#039;Z Forward&#039;&#039;.&lt;br /&gt;
## Ensure that the next setting down, &#039;&#039;Up&#039;&#039;, changed to &#039;&#039;Y Up&#039;&#039;.&lt;br /&gt;
## Find &#039;&#039;Apply Unit&#039;&#039; and make sure it&#039;s checked.&lt;br /&gt;
## Next, find &#039;&#039;Use Space Transform&#039;&#039; check it.&lt;br /&gt;
## Lastly, find &#039;&#039;Apply Transform&#039;&#039; and check it too.&lt;br /&gt;
# Save it to &amp;lt;code&amp;gt;Assets/WikiDemo/MedievalStall.fbx&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Save the Blender scene...&lt;br /&gt;
## &#039;&#039;File&#039;&#039; drop down from top toolbar.&lt;br /&gt;
## &#039;&#039;Save As...&#039;&#039; to save the Blender scene to the computer.&lt;br /&gt;
## Save it to &amp;lt;code&amp;gt;Assets/WikiDemo/MedievalStall - Eco Ready Scene.blend&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Add to Unity Scene ===&lt;br /&gt;
&lt;br /&gt;
# Open &amp;lt;u&amp;gt;Unity&amp;lt;/u&amp;gt;.&lt;br /&gt;
# Select the &amp;lt;code&amp;gt;.fbx&amp;lt;/code&amp;gt; file in the project window.&lt;br /&gt;
# Open the &#039;&#039;Eco Tools&#039;&#039; menu from the top toolbar.&lt;br /&gt;
# Hover &#039;&#039;Mod Kit&#039;&#039;.&lt;br /&gt;
# Select &#039;&#039;World Object Setup.&#039;&#039;&lt;br /&gt;
# A &#039;&#039;World Object Setup&#039;&#039;  window will pop-up.&lt;br /&gt;
# Make sure that &#039;&#039;Selected Objects&#039;&#039; reads &#039;&#039;MedievalStall.&#039;&#039;&lt;br /&gt;
# Also make sure that &#039;&#039;World Object Type&#039;&#039; is set to &#039;&#039;World Object&#039;&#039;.&lt;br /&gt;
# Press the &#039;&#039;Setup World Objects&#039;&#039; button.&lt;br /&gt;
# Notice in the project window that a new &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt; file was created -- &amp;lt;code&amp;gt;MedievalStallObject.prefab&amp;lt;/code&amp;gt;&lt;br /&gt;
# Select the &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt;.&lt;br /&gt;
# In the &#039;&#039;Inspector&#039;&#039; panel find the &#039;&#039;Transform&#039;&#039; component.&lt;br /&gt;
# Change this component&#039;s &#039;&#039;Rotation...&#039;&#039;&lt;br /&gt;
## &#039;&#039;X&#039;&#039; to &#039;&#039;0.&#039;&#039;&lt;br /&gt;
## &#039;&#039;Y&#039;&#039; to &#039;&#039;0.&#039;&#039;&lt;br /&gt;
## &#039;&#039;Z&#039;&#039; to &#039;&#039;0.&#039;&#039;&lt;br /&gt;
# In the &#039;&#039;Inspector&#039;&#039; panel find the &#039;&#039;Box Collider&#039;&#039; component.&lt;br /&gt;
#Find the &#039;&#039;⋮&#039;&#039; icon (all the way to the right of the words &#039;&#039;Box Collider)&#039;&#039; and click on it.&lt;br /&gt;
#Select &#039;&#039;Reset&#039;&#039; from the menu. This will regenerate the box collider now that the rotation has changed.&lt;br /&gt;
#Look in the &#039;&#039;Inspector&#039;&#039; panel and find the &#039;&#039;World Object (Script)&#039;&#039; component.&lt;br /&gt;
# That component has a checkbox &#039;&#039;Override Occupancy&#039;&#039;. Check it.&lt;br /&gt;
# A new field should&#039;ve expanded below it called &#039;&#039;Size&#039;&#039;.&lt;br /&gt;
# Set the &#039;&#039;Size&#039;&#039;... &#039;&#039;&#039;Note:&#039;&#039;&#039; This size similar to the size of the reference cube from earlier, but the Y and Z coordinates get flipped! So if in Blender it was &amp;lt;code&amp;gt;(1, 2, 3)&amp;lt;/code&amp;gt; then in Unity its &amp;lt;code&amp;gt;(1, 3, 2)&amp;lt;/code&amp;gt;. &#039;&#039;&#039;TODO: Test This&#039;&#039;&#039;&lt;br /&gt;
## &#039;&#039;X&#039;&#039; to &#039;&#039;4&#039;&#039;.&lt;br /&gt;
## &#039;&#039;Y&#039;&#039; to &#039;&#039;3&#039;&#039;.&lt;br /&gt;
## &#039;&#039;Z&#039;&#039; to &#039;&#039;3&#039;&#039;.&lt;br /&gt;
# Select &#039;&#039;Objects&#039;&#039; from &#039;&#039;Hierarchy&#039;&#039; panel (left-side of the window).&lt;br /&gt;
# Find the &#039;&#039;Modkit Prefab Container (Script)&#039;&#039; component. This component was added earlier, if it&#039;s not there add it now.&lt;br /&gt;
# Expand the &#039;&#039;Prefabs&#039;&#039; section in that component.&lt;br /&gt;
# Click the &#039;&#039;+&#039;&#039; button to add an item to the list.&lt;br /&gt;
# Either...&lt;br /&gt;
## Click the &#039;&#039;⦿&#039;&#039; button, switch to the &#039;&#039;Assets&#039;&#039; tab, find or search for &#039;&#039;MedievalStallObject&#039;&#039;, and double click on it. Make sure it&#039;s the medieval stall &amp;lt;u&amp;gt;object&amp;lt;/u&amp;gt; with the &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt; ending.&lt;br /&gt;
## Drag the &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt; file onto the &#039;&#039;⦿&#039;&#039; button&lt;br /&gt;
# Open the &#039;&#039;File&#039;&#039; menu from top toolbar and select &#039;&#039;Save&#039;&#039;.&amp;lt;br&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; Do not skip. The scene must be saved for the ModKit build to work properly.&lt;br /&gt;
# Open the &#039;&#039;Eco Tools&#039;&#039; menu from the top toolbar.&lt;br /&gt;
# Hover &#039;&#039;Mod Kit&#039;&#039;.&lt;br /&gt;
# Select &#039;&#039;Build Current Bundle&#039;&#039;.&lt;br /&gt;
# Save the bundle to &amp;lt;code&amp;gt;/Eco Server/Mods/UserCode/WikiDemo.unity3d&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Scripting the World Object ===&lt;br /&gt;
WIP: Need occupancy code.&lt;br /&gt;
&lt;br /&gt;
Code that links the Item to this World Object.&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
using Eco.Core.Items;&lt;br /&gt;
using Eco.Gameplay.Components;&lt;br /&gt;
using Eco.Gameplay.Items;&lt;br /&gt;
using Eco.Gameplay.Items.Recipes;&lt;br /&gt;
using Eco.Gameplay.Objects;&lt;br /&gt;
using Eco.Gameplay.Skills;&lt;br /&gt;
using Eco.Mods.TechTree;&lt;br /&gt;
using Eco.Shared.Localization;&lt;br /&gt;
using Eco.Shared.Serialization;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Runtime.Versioning;&lt;br /&gt;
using System;&lt;br /&gt;
&lt;br /&gt;
namespace WikiDemo&lt;br /&gt;
{&lt;br /&gt;
    #region Item&lt;br /&gt;
    [Serialized] // Tells the save/load system this object needs to be serialized.&lt;br /&gt;
    [LocDisplayName(&amp;quot;Market Stall&amp;quot;)] // Defines the localized name of the item.&lt;br /&gt;
    [Weight(100)] // Defines how heavy Arrow is.&lt;br /&gt;
    [Ecopedia(&amp;quot;Work Stations&amp;quot;, &amp;quot;Craft Tables&amp;quot;, createAsSubPage: true)]&lt;br /&gt;
    [LocDescription(&amp;quot;A medieval market stall.&amp;quot;)] //The tooltip description for the item.&lt;br /&gt;
    public partial class MedievalStallItem : WorldObjectItem&amp;lt;MedievalStallObject&amp;gt; { }&lt;br /&gt;
    #endregion&lt;br /&gt;
&lt;br /&gt;
    #region Recipe&lt;br /&gt;
&lt;br /&gt;
    #region Object&lt;br /&gt;
    [Serialized]&lt;br /&gt;
    public partial class MedievalStallObject : WorldObject, IRepresentsItem&lt;br /&gt;
    {&lt;br /&gt;
        public Type RepresentedItemType =&amp;gt; typeof(MedievalStallItem);&lt;br /&gt;
    }&lt;br /&gt;
    #endregion&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Line 22:&#039;&#039;&#039; This changes from implementing &amp;lt;code&amp;gt;Item&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;WorldObjectItem&amp;lt;MedievalStallObject&amp;gt;&amp;lt;/code&amp;gt;. This is what gives the item the ability to place the table down in the world.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 25:&#039;&#039;&#039; The &amp;quot;collapsed&amp;quot; Recipe section. See earlier sections in this guide to see what code belongs here.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 29:&#039;&#039;&#039; Declares the &amp;lt;code&amp;gt;MedievalStallObject&amp;lt;/code&amp;gt;. It&#039;s important that this class name is matches exactly the &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt; file name because the name is what links them.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 31:&#039;&#039;&#039; This line is similar in function to line 22, it&#039;s declaring that this &amp;lt;code&amp;gt;MedievalStallObject&amp;lt;/code&amp;gt; is &amp;lt;code&amp;gt;MedievalStallItem&amp;lt;/code&amp;gt; when in inventories.&lt;br /&gt;
&lt;br /&gt;
=== Checkpoint ===&lt;br /&gt;
&#039;&#039;&#039;Warning:&#039;&#039;&#039; In &#039;&#039;Eco&#039;&#039; v13.0.2, free-placed objects may display misaligned ghost cubes, even when configured correctly in your mod. This is a visual-only base-game bug—placement still works as expected, even if the object appears red near edges. &amp;lt;!-- See: https://github.com/StrangeLoopGames/EcoIssues/issues/25834 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Export and see what it does. Ensure it&#039;s not lifting off the ground because of a non-curved shader.&lt;br /&gt;
&lt;br /&gt;
==== Origin Point Editing ====&lt;br /&gt;
Talk about what it does: the point that the simulation considers this world object to be at.&lt;br /&gt;
&lt;br /&gt;
Show how to move it around using blender.&lt;br /&gt;
&lt;br /&gt;
== Final Export ==&lt;br /&gt;
Export.&lt;br /&gt;
&lt;br /&gt;
Package.&lt;br /&gt;
&lt;br /&gt;
Distribute.&lt;/div&gt;</summary>
		<author><name>WugWugg</name></author>
	</entry>
	<entry>
		<id>https://wiki.play.eco/en/index.php?title=From_3D_Asset_to_Working_Worktable&amp;diff=16735</id>
		<title>From 3D Asset to Working Worktable</title>
		<link rel="alternate" type="text/html" href="https://wiki.play.eco/en/index.php?title=From_3D_Asset_to_Working_Worktable&amp;diff=16735"/>
		<updated>2026-04-28T21:29:06Z</updated>

		<summary type="html">&lt;p&gt;WugWugg: Creating the world object, Preparing the 3D asset is good.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction =&lt;br /&gt;
Below is a guide on how to take an 3D asset from the Unity Store and make a working workbench in Eco. This includes:&lt;br /&gt;
* Creating a recipe to craft the modded table&lt;br /&gt;
* Creating recipes so the player can use the modded table to craft something&lt;br /&gt;
* Using Blender to generate a modded icon (seen when holding it in inventory)&lt;br /&gt;
* Using Blender to adjust the origin point of the model&lt;br /&gt;
* How to setup all this in a Unity scene and package for Eco&lt;br /&gt;
&lt;br /&gt;
= Setup =&lt;br /&gt;
&lt;br /&gt;
* Already have setup &#039;&#039;&#039;ModKit + Unity&#039;&#039;&#039;&lt;br /&gt;
** See: [[Installing the ModKit]]&lt;br /&gt;
* Have a &#039;&#039;&#039;3D model&#039;&#039;&#039;&lt;br /&gt;
** Just following along? Find the one used here at &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://assetstore.unity.com/packages/3d/props/low-poly-medieval-market-stalls-314286&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* A &#039;&#039;&#039;C# IDE&#039;&#039;&#039; (notepad++, Visual Studio, etc.)&lt;br /&gt;
** Highly encouraged to have an Intellisense setup and linked to the &#039;&#039;&#039;Reference Assemblies&#039;&#039;&#039;. Optional, but its really worth the time to figure out because it will help quickly correct small typos and trivial mistakes.&lt;br /&gt;
** See: [[Getting Started with Eco Modding in Visual Studio 2022]] (generally the same steps apply if using a new version of Visual Studio)&lt;br /&gt;
* &#039;&#039;&#039;Blender&#039;&#039;&#039; installed&lt;br /&gt;
** Homepage: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://www.blender.org/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Importing the Assets ==&lt;br /&gt;
&lt;br /&gt;
# Open the Unity editor to the project.&lt;br /&gt;
# From the top toolbar open the &#039;&#039;Window&#039;&#039; drop down.&lt;br /&gt;
# Hover &#039;&#039;Package Management&#039;&#039; to open sub-menu.&lt;br /&gt;
# Select &#039;&#039;Package Manager&#039;&#039;.&lt;br /&gt;
# The &#039;&#039;Package Manager&#039;&#039; window will pop-up.&lt;br /&gt;
# Install the package containing the assets you want to use...&lt;br /&gt;
## &amp;lt;u&amp;gt;If not using Unity Registry&amp;lt;/u&amp;gt;...&lt;br /&gt;
### Find the &#039;&#039;+▾&#039;&#039; button in the top left and open the drop down.&lt;br /&gt;
### Install the package from one of those options.&lt;br /&gt;
## &amp;lt;u&amp;gt;If using Unity Registry&amp;lt;/u&amp;gt;...&lt;br /&gt;
### Visit &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://assetstore.unity.com&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; and sign in.&lt;br /&gt;
### Search for the asset desired.&lt;br /&gt;
### Go to it&#039;s page (e.g. &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://assetstore.unity.com/packages/3d/props/low-poly-medieval-market-stalls-314286&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;) and click the big blue button, &#039;&#039;Add to My Assets.&#039;&#039;&lt;br /&gt;
### Now, in the Unity editor and back at the &#039;&#039;Package Manager&#039;&#039; window.&lt;br /&gt;
### Find &#039;&#039;My Assets&#039;&#039; on the left menu and navigate to it.&lt;br /&gt;
### Click the &#039;&#039;⟳&#039;&#039; button in the lower-right.&lt;br /&gt;
### The asset should be in the list now. Use the search to filter if needed.&lt;br /&gt;
### Click on the asset in the list. For those following along, &#039;&#039;Low Poly Medieval Market Stalls&#039;&#039;.&lt;br /&gt;
### In the right panel, find the &#039;&#039;Download ⤓&#039;&#039; button. Click it.&lt;br /&gt;
### Once downloaded, a new button should show up, it&#039;ll say something like &#039;&#039;⊕ Import 1.0 to project&#039;&#039; . Click it.&lt;br /&gt;
### The &#039;&#039;Import Unity Package&#039;&#039; window will pop-up.&lt;br /&gt;
### Select &#039;&#039;Import&#039;&#039; on it.&lt;br /&gt;
# Verify you can find your assets from the explorer. If following along, the assets are at &amp;lt;code&amp;gt;Assets/PolyRonin/Medieval Market Stalls&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Load in a demo scene, if provided, and make sure everything looks okay.&lt;br /&gt;
## For those following along, double click on the &#039;&#039;Demo&#039;&#039; scene at &amp;lt;code&amp;gt;Assets/PolyRonin/Medieval Market Stalls/Demo.unity&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:Eco - Unity - View Modes.png|thumb|Underlined in red are the different draw mode buttons. &amp;lt;u&amp;gt;4/20/26&amp;lt;/u&amp;gt;]]&lt;br /&gt;
If something seems off, check the different draw modes and see if changing those allow the scene to render as expected (see picture).&lt;br /&gt;
&lt;br /&gt;
= Creating The Worktable =&lt;br /&gt;
This guide will create the worktable in this order:&lt;br /&gt;
&lt;br /&gt;
# Create the item that represents the worktable&lt;br /&gt;
# Make a recipe to craft the worktable item&lt;br /&gt;
# Make the worktable item something that places a world object&lt;br /&gt;
# Give the worktable functionality by adding recipes to it&lt;br /&gt;
&lt;br /&gt;
== Creating the Item ==&lt;br /&gt;
&lt;br /&gt;
=== Item Icon ===&lt;br /&gt;
[[File:TeamstersStall - StallOnly - 256x256.png|thumb|A large (256x256px) icon created of Stall4 from the medieval assets.]]&lt;br /&gt;
# Open &amp;lt;u&amp;gt;Blender&amp;lt;/u&amp;gt;.&lt;br /&gt;
# Delete everything in the &#039;&#039;Scene Collection&#039;&#039;. Find this section in the top-right of the application.&lt;br /&gt;
# From the top toolbar, open the &#039;&#039;File&#039;&#039; drop down.&lt;br /&gt;
# Hover &#039;&#039;Import&#039;&#039; to open the sub-menu.&lt;br /&gt;
# Select the type of 3D asset. For those using medieval assets, select &#039;&#039;FBX (.fbx)&#039;&#039;.&lt;br /&gt;
# Find the asset on the computer...&amp;lt;br&amp;gt;&#039;&#039;&#039;Tip:&#039;&#039;&#039; Use Unity to find the &amp;lt;code&amp;gt;.fbx&amp;lt;/code&amp;gt; asset. &lt;br /&gt;
## For the medieval assets, that&#039;s in &amp;lt;code&amp;gt;Assets/PolyRonin/Medieval Market Stalls/Meshes/medieval-market-stalls-1.fbx&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Right click on it and select &#039;&#039;Show in explorer&#039;&#039;.&lt;br /&gt;
## Now copy the address of that folder from Explorer. It might look like &amp;lt;code&amp;gt;C:\Users\Wug\EcoMod--WikiDemo\WikiDemo\Assets\PolyRonin\Medieval Market Stalls\Meshes&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Paste that in the address bar of the &amp;lt;u&amp;gt;Blender&amp;lt;/u&amp;gt; import pop-up.&lt;br /&gt;
# Select the blue &#039;&#039;Import FBX&#039;&#039; button&#039;&#039;.&#039;&#039;&lt;br /&gt;
# Be in the &#039;&#039;Layout&#039;&#039; workspace (top toolbar) and in the &#039;&#039;Object Mode...&#039;&#039;&lt;br /&gt;
## Find the drop down in the second toolbar from the top that has options like &#039;&#039;Object Mode, Edit Mode, Sculpt Mode,&#039;&#039; etc.&lt;br /&gt;
## Select &#039;&#039;Object Mode&#039;&#039; from that drop down.&lt;br /&gt;
# Change the Viewport Shading to Material Preview or Rendered. This is on the second toolbar down, far right of center, but before &#039;&#039;Scene Collection&#039;&#039; section.&lt;br /&gt;
# If you see purple models, Blender will need help finding textures for these meshes...&lt;br /&gt;
## From the top toolbar, open the &#039;&#039;File&#039;&#039; drop down.&lt;br /&gt;
## Hover &#039;&#039;External Data&#039;&#039; to open the sub-menu.&lt;br /&gt;
## Select &#039;&#039;Find Missing Files...&#039;&#039;&lt;br /&gt;
## Point this to the whole directory that the 3D assets came in. For the medieval pack, &amp;lt;code&amp;gt;C:\Users\&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;Wug\EcoMod--WikiDemo\WikiDemo\Assets\PolyRonin&amp;lt;/code&amp;gt;.&lt;br /&gt;
## The proper textures/materials should have now loaded in. If it hasn&#039;t, consult Google because without the textures the following steps won&#039;t produce a usable icon.&lt;br /&gt;
# Add a source of light...&lt;br /&gt;
## Still be in the &#039;&#039;Layout&#039;&#039; workspace (top toolbar) and in the &#039;&#039;Object Mode...&#039;&#039;&lt;br /&gt;
### Find the drop down in the second toolbar from the top that has options like &#039;&#039;Object Mode, Edit Mode, Sculpt Mode,&#039;&#039; etc.&lt;br /&gt;
### Select &#039;&#039;Object Mode&#039;&#039; from that drop down.&lt;br /&gt;
## From the toolbar just under that one, find and open the &#039;&#039;Add&#039;&#039; drop down.&lt;br /&gt;
## Hover &#039;&#039;Light&#039;&#039; to open that sub-menu.&lt;br /&gt;
## Click &#039;&#039;Sun&#039;&#039;.&lt;br /&gt;
# Add a camera...&lt;br /&gt;
## In the &#039;&#039;Layout&#039;&#039; workspace (top toolbar) and in the &#039;&#039;Object Mode...&#039;&#039;&lt;br /&gt;
### Find the drop down in the second toolbar from the top that has options like &#039;&#039;Object Mode, Edit Mode, Sculpt Mode,&#039;&#039; etc.&lt;br /&gt;
### Select &#039;&#039;Object Mode&#039;&#039; from that drop down.&lt;br /&gt;
## From the second toolbar down, find and open the &#039;&#039;Add&#039;&#039; drop down.&lt;br /&gt;
## Select &#039;&#039;Camera&#039;&#039;.&lt;br /&gt;
# Setup the scene with the object placement and lighting direction desired.&amp;lt;br&amp;gt;&#039;&#039;&#039;Tip:&#039;&#039;&#039; To reset the editor to something selected press the period key &amp;lt;u&amp;gt;on the numpad&amp;lt;/u&amp;gt;. Without a numpad, use &#039;&#039;View&#039;&#039; (second toolbar from the top) and select &#039;&#039;Frame Selected&#039;&#039; from it. Alternatively, just set the zoom to zoom to the mouse position: &#039;&#039;Edit&#039;&#039; (top toolbar), &#039;&#039;Preferences&#039;&#039; (from drop down), &#039;&#039;Navigation&#039;&#039; (on left menu), &#039;&#039;Zoom to Mouse Position&#039;&#039; (In the zoom section). This makes moving around a lot more natural feeling.&lt;br /&gt;
# Setup the rendering camera...&lt;br /&gt;
## Go to &#039;&#039;Rendering&#039;&#039;  tab on the top toolbar&lt;br /&gt;
## On the right there will be a side-panel open, it should be the &#039;&#039;Render&#039;&#039; tab. Confirm that.&lt;br /&gt;
## Change &#039;&#039;Render Engine&#039;&#039; to &#039;&#039;Cycles&#039;&#039;.&lt;br /&gt;
## Look down below in the same tab for the &#039;&#039;Film&#039;&#039; section.&lt;br /&gt;
## Expand it and find the &#039;&#039;Transparent&#039;&#039; checkbox and section. Click it so that it has a check mark. This will make the icon&#039;s background transparent.&lt;br /&gt;
## Now, go to the &#039;&#039;Output&#039;&#039; tab &amp;lt;u&amp;gt;on the side panel&amp;lt;/u&amp;gt;. The tab is just below the current one.&lt;br /&gt;
## In the &#039;&#039;Format&#039;&#039; section set &#039;&#039;Resolution X&#039;&#039; to &#039;&#039;64.&#039;&#039; And &#039;&#039;Y&#039;&#039; to &#039;&#039;64&#039;&#039; as well. This will make the icon generated a 64 by 64 pixel image.&lt;br /&gt;
# Go back to the &#039;&#039;Layout&#039;&#039; tab from the top toolbar.&lt;br /&gt;
# Center your view on the object (numpad period or &#039;&#039;View &amp;gt; Frame Selected&#039;&#039;). Adjust it so that the object is how it should be for the icon.&lt;br /&gt;
# Align the camera to the view...&lt;br /&gt;
## Make sure the editor is in &#039;&#039;Layout&#039;&#039; workspace (top toolbar) and in the &#039;&#039;Object Mode...&#039;&#039;&lt;br /&gt;
### Find the drop down in the second toolbar from the top that has options like &#039;&#039;Object Mode, Edit Mode, Sculpt Mode,&#039;&#039; etc.&lt;br /&gt;
### Select &#039;&#039;Object Mode&#039;&#039; from that drop down.&lt;br /&gt;
## Find &#039;&#039;View&#039;&#039; from the second from the top toolbar and open the drop down.&lt;br /&gt;
## Hover &#039;&#039;Align View&#039;&#039; to open the sub-menu.&lt;br /&gt;
## Select &#039;&#039;Align Active Camera To View&#039;&#039;.&lt;br /&gt;
## If the view is slightly off, there is a lock icon on the right side of this panel. Use it to &amp;quot;lock&amp;quot; controls to the camera and tweak it&#039;s view.&lt;br /&gt;
# Now return to the &#039;&#039;Rendering&#039;&#039; tab from the top toolbar.&lt;br /&gt;
# Press the F12 key to start the render. This should complete quickly since 64x64 pixels is a very small render.&lt;br /&gt;
# A window should popup, &#039;&#039;Blender Render&#039;&#039;. This is the icon!&lt;br /&gt;
# From the top tool bar of this &#039;&#039;Blender Render&#039;&#039; window, open the &#039;&#039;Image&#039;&#039; drop down.&lt;br /&gt;
# Select &#039;&#039;Save As...&#039;&#039; to save somewhere on the computer.&lt;br /&gt;
# Return to step 13 and repeat to do larger images if desired. Create a 128 by 128 pixel image too. It will make things smoother later.&lt;br /&gt;
# Save the Blender scene. Not only will it be used later, this will make making a new icon with a small tweak that much easier.&lt;br /&gt;
## &#039;&#039;File&#039;&#039; drop down from top toolbar.&lt;br /&gt;
## &#039;&#039;Save As...&#039;&#039; to save the Blender scene to the computer.&lt;br /&gt;
## Save it to &amp;lt;code&amp;gt;Assets/WikiDemo/MedievalStall - Icon Scene.blend&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Adding to Unity Scene ===&lt;br /&gt;
The developers explain how to create an item in one of ModKit&#039;s read me files (See: &amp;lt;code&amp;gt;Assets/EcoModKit/Docs/README.md&amp;lt;/code&amp;gt;), but this guide will explain it below.&lt;br /&gt;
&lt;br /&gt;
Additionally, &#039;&#039;&#039;TheKye&#039;&#039;&#039; on YouTube covers this in their &#039;&#039;Creating Your First Item&#039;&#039; and &#039;&#039;Creating Your First Item Pt 2&#039;&#039; videos.&lt;br /&gt;
&lt;br /&gt;
Use those additional resource to help troubleshoot issues with item&#039;s icons.&lt;br /&gt;
&lt;br /&gt;
# Open &amp;lt;u&amp;gt;Unity&amp;lt;/u&amp;gt;.&lt;br /&gt;
# In the left panel, the &#039;&#039;Hierarchy&#039;&#039; tab should be selected.&lt;br /&gt;
# Select the top-most object there. It should be a scene. If the editor last loaded the &#039;&#039;Demo&#039;&#039; scene from the medieval assets, it&#039;ll be named &#039;&#039;Demo&#039;&#039;.&lt;br /&gt;
# Right click on this scene and select &#039;&#039;Add New Scene&#039;&#039; from the menu.&lt;br /&gt;
# Right click again on the old scene (&#039;&#039;Demo&#039;&#039;) and select &#039;&#039;Remove Scene&#039;&#039;.&lt;br /&gt;
# Let it save if the changes to the old scene are important. Discard if it was open just for exploration&#039;s sake.&lt;br /&gt;
# Right click the new, &#039;&#039;Untitled&#039;&#039; scene. Click &#039;&#039;Save Scene As...&#039;&#039;&lt;br /&gt;
# Save it to &amp;lt;code&amp;gt;Assets/WikiDemo.unity&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Delete &amp;lt;u&amp;gt;anything&amp;lt;/u&amp;gt; in the scene.&lt;br /&gt;
# Right click the scene, hover &#039;&#039;GameObject&#039;&#039;, and select &#039;&#039;Create Empty&#039;&#039; from the sub-menu.&lt;br /&gt;
# Name this new object &#039;&#039;Objects&#039;&#039;.&lt;br /&gt;
# Select the newly created &#039;&#039;Objects&#039;&#039; object from the &#039;&#039;Hierarchy&#039;&#039; menu.&lt;br /&gt;
# On the far right side of the screen, in the &#039;&#039;Inspector&#039;&#039; menu, click the &#039;&#039;Add Component&#039;&#039; button.&lt;br /&gt;
# Type in &#039;&#039;ModkitPrefabContainer&#039;&#039;. Click on the component from the search to add it. The component now should be listed in the &#039;&#039;Inspector&#039;&#039;.&lt;br /&gt;
# In the &#039;&#039;Hierarchy&#039;&#039; panel right click the scene, hover &#039;&#039;GameObject&#039;&#039;, and select &#039;&#039;Create Empty&#039;&#039;.&lt;br /&gt;
# Name this new object &#039;&#039;Items&#039;&#039;.&lt;br /&gt;
# Right click the scene, hover &#039;&#039;GameObject&#039;&#039;, and select &#039;&#039;Create Empty&#039;&#039;.&lt;br /&gt;
# Name this new object &#039;&#039;Emoji&#039;&#039;.&lt;br /&gt;
# Select the newly created &#039;&#039;Emoji&#039;&#039; object, find the &#039;&#039;Inspector&#039;&#039; menu (far-right), and click the &#039;&#039;Add Component&#039;&#039; button.&lt;br /&gt;
# Type in &#039;&#039;ChatEmoteSetOld&#039;&#039;. Click on the component from the search to add it. That component should now be listed in the &#039;&#039;Inspector&#039;&#039;.&lt;br /&gt;
# Right click the scene, hover &#039;&#039;GameObject&#039;&#039;, and select &#039;&#039;Create Empty&#039;&#039;.&lt;br /&gt;
# Name this new object &#039;&#039;BlockSets&#039;&#039;.&lt;br /&gt;
# Select the newly created &#039;&#039;BlockSets&#039;&#039; object, find the &#039;&#039;Inspector&#039;&#039; menu (far-right), and click &#039;&#039;Add Component&#039;&#039;.&lt;br /&gt;
# Search for &#039;&#039;BlockSetContainer&#039;&#039;. Click on the component from the search to add it. The &#039;&#039;Inspector&#039;&#039; should now show that component as added.&lt;br /&gt;
#Go to &amp;lt;code&amp;gt;Assets/EcoModKit/Prefabs&amp;lt;/code&amp;gt; in the Unity project window.&lt;br /&gt;
# Find the prefab &#039;&#039;ItemTemplate&#039;&#039;.&lt;br /&gt;
# Drag it onto the &#039;&#039;Items&#039;&#039; object in the &#039;&#039;Hierarchy&#039;&#039; panel. It should add it as a &amp;lt;u&amp;gt;child&amp;lt;/u&amp;gt; of the &#039;&#039;Items&#039;&#039; object.&lt;br /&gt;
# Right click on the new &#039;&#039;ItemTemplate&#039;&#039; object, hover &#039;&#039;Prefab&#039;&#039;, and select &#039;&#039;Unpack Completely&#039;&#039;.&lt;br /&gt;
# Right click on the &#039;&#039;ItemTemplate&#039;&#039; object and select &#039;&#039;Rename&#039;&#039;. Name this what you want the item to be called. Example: &#039;&#039;MedievalStallItem&#039;&#039;.&lt;br /&gt;
# Set this item&#039;s background...&lt;br /&gt;
## Here&#039;s the default backgrounds (blue = item, brown = block, green = food): &amp;lt;br&amp;gt;[[File:Eco - Item - Background.png|border|frameless]]        [[File:Eco - Block - Background.png|frameless]]        [[File:Eco - Food - Background.png|frameless]]&lt;br /&gt;
## Download or prepare the background and add it to the &amp;lt;code&amp;gt;Assets&amp;lt;/code&amp;gt; folder in Unity. &lt;br /&gt;
### To follow along lockstep, put the background in a new &amp;lt;code&amp;gt;Assets/WikiDemo&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
### Right click on &amp;lt;code&amp;gt;Assets&amp;lt;/code&amp;gt; folder, hover &#039;&#039;Create&#039;&#039;, select &#039;&#039;Folder&#039;&#039;.&lt;br /&gt;
### Name the folder &#039;&#039;WikiDemo&#039;&#039;.&lt;br /&gt;
## Configure Unity to use these as sprites...&lt;br /&gt;
### Select the background(s) added (Ctrl+Click each one).&lt;br /&gt;
### In the &#039;&#039;Inspector&#039;&#039;, find &#039;&#039;TextureType&#039;&#039; and change that to &#039;&#039;Sprite (2D and UI)&#039;&#039;.&lt;br /&gt;
### Again in the &#039;&#039;Inspector&#039;&#039;, find &#039;&#039;SpriteMode&#039;&#039; and change that to &#039;&#039;Single&#039;&#039;.&lt;br /&gt;
### Then scroll and go to the bottom of the &#039;&#039;Inspector&#039;&#039; and find the &#039;&#039;Apply&#039;&#039; button.&lt;br /&gt;
### This will apply those changes to that file and all other ones highlighted.&lt;br /&gt;
## Select the item being created (&#039;&#039;MedievalStallItem&#039;&#039;).&lt;br /&gt;
## In the &#039;&#039;Inspector&#039;&#039; panel (far-right), scroll and find the &#039;&#039;Item Template (Script)&#039;&#039; section.&lt;br /&gt;
## In here find the &#039;&#039;Background&#039;&#039; input. It&#039;ll say &#039;&#039;Background (Image)&#039;&#039; in it. If clicked that text to reveal and highlight the related object in the &#039;&#039;Hierarchy&#039;&#039; panel.&lt;br /&gt;
## Select the revealed, and highlighted object &#039;&#039;Background&#039;&#039;.&lt;br /&gt;
## In the &#039;&#039;Inspector&#039;&#039; panel, scroll and find the &#039;&#039;Image&#039;&#039; component section.&lt;br /&gt;
## Inside that component&#039;s section, find &#039;&#039;Source Image&#039;&#039;. It&#039;ll say &#039;&#039;Missing (Sprite)&#039;&#039;. Click the &#039;&#039;⦿&#039;&#039; button to the right.&lt;br /&gt;
## The &#039;&#039;Select Sprite&#039;&#039; popup will show. Make sure the &#039;&#039;Assets&#039;&#039; tab is selected, and find the backgrounds desired.&lt;br /&gt;
#Create the foreground image...&lt;br /&gt;
##This is easily accomplished in MS Paint.&lt;br /&gt;
##Get to the background image file in a &amp;lt;u&amp;gt;file explorer&amp;lt;/u&amp;gt;.&lt;br /&gt;
##Right click on it, hover &#039;&#039;Open with...&#039;&#039;, and select &#039;&#039;Paint&#039;&#039;.&lt;br /&gt;
##The solid background should be displayed.&lt;br /&gt;
##Open the &#039;&#039;File&#039;&#039; menu from the top toolbar.&lt;br /&gt;
##Hover &#039;&#039;Import to Canvas&#039;&#039; and select &#039;&#039;From a File&#039;&#039;.&lt;br /&gt;
##Find the icon in the file browser and import it. Match the size of the background image to have it nicely center itself.&lt;br /&gt;
##Now &#039;&#039;File&#039;&#039; from the top toolbar.&lt;br /&gt;
##Hover &#039;&#039;Save As...&#039;&#039; and select &#039;&#039;PNG&#039;&#039;.&lt;br /&gt;
##Save this to the &amp;lt;code&amp;gt;Assets/WikiDemo&amp;lt;/code&amp;gt; folder in Unity.&lt;br /&gt;
##Configure Unity to use these as sprites...&lt;br /&gt;
### Select the foreground image.&lt;br /&gt;
### In the &#039;&#039;Inspector&#039;&#039;, find &#039;&#039;TextureType&#039;&#039; and change that to &#039;&#039;Sprite (2D and UI)&#039;&#039;.&lt;br /&gt;
### Again in the &#039;&#039;Inspector&#039;&#039;, find &#039;&#039;SpriteMode&#039;&#039; and change that to &#039;&#039;Single&#039;&#039;.&lt;br /&gt;
### Then scroll and go to the bottom of the &#039;&#039;Inspector&#039;&#039; and find the &#039;&#039;Apply&#039;&#039; button.&lt;br /&gt;
### This will apply those changes to that file and all other ones highlighted.&lt;br /&gt;
#Set this item&#039;s foreground...&lt;br /&gt;
## Copy the item&#039;s icon into the &amp;lt;code&amp;gt;Assets&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
## Configure Unity to use it as a sprite (see the previous step&#039;s &#039;&#039;Set this item&#039;s background...&#039;&#039; instructions)&lt;br /&gt;
## Select the item being created (&#039;&#039;MedievalStallItem&#039;&#039;).&lt;br /&gt;
## In the &#039;&#039;Inspector&#039;&#039; panel (far-right), scroll and find the &#039;&#039;Item Template (Script)&#039;&#039; section.&lt;br /&gt;
## In here find the &#039;&#039;Foreground&#039;&#039; input. It&#039;ll say &#039;&#039;Foreground (Image)&#039;&#039; in it. If clicked that text to reveal and highlight the related object in the &#039;&#039;Hierarchy&#039;&#039; panel.&lt;br /&gt;
## Select the revealed, and highlighted object &#039;&#039;Foreground&#039;&#039;.&lt;br /&gt;
## Use the &#039;&#039;Inspector&#039;&#039;, find the &#039;&#039;Image&#039;&#039; component, within that component find the &#039;&#039;Source Image&#039;&#039; input. It will say &#039;&#039;Missing (Sprite)&#039;&#039;.&lt;br /&gt;
## Click the &#039;&#039;⦿&#039;&#039; button to the right of that input.&lt;br /&gt;
## From the &#039;&#039;Select Sprite&#039;&#039; popup, ensure the &#039;&#039;Assets&#039;&#039; tab is being searched, and find the icon just created.&lt;br /&gt;
&lt;br /&gt;
=== Export From Unity ===&lt;br /&gt;
&lt;br /&gt;
# Open the &#039;&#039;File&#039;&#039; menu from the top toolbar.&lt;br /&gt;
# Select &#039;&#039;Save.&#039;&#039; Save it to the &amp;lt;code&amp;gt;Assets/WikiDemo&amp;lt;/code&amp;gt; folder.&amp;lt;br&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; Do not skip. The scene must be saved for the ModKit build to work properly.&lt;br /&gt;
# Open the &#039;&#039;Eco Tools&#039;&#039; menu from the top toolbar.&lt;br /&gt;
# Hover &#039;&#039;Mod Kit&#039;&#039; to open the sub-menu.&lt;br /&gt;
# Select &#039;&#039;Build Current Bundle&#039;&#039;.&lt;br /&gt;
# Have it output the bundle to &amp;lt;code&amp;gt;/Eco Server/Mods/UserCode/WikiDemo.unity3d&amp;lt;/code&amp;gt;&lt;br /&gt;
# Wait for this to build. This may take a few minutes.&lt;br /&gt;
&lt;br /&gt;
=== Scripting the Item ===&lt;br /&gt;
For this guide, all code will be placed in a single &amp;lt;code&amp;gt;.cs&amp;lt;/code&amp;gt; file and will not be compiled into a &amp;lt;code&amp;gt;.dll&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
# Create a &amp;lt;code&amp;gt;.cs&amp;lt;/code&amp;gt; file: &amp;lt;code&amp;gt;/Eco Server/Mods/UserCode/WikiDemo.cs&amp;lt;/code&amp;gt;&lt;br /&gt;
# Put the following into the newly created file:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;using Eco.Core.Items;&lt;br /&gt;
using Eco.Gameplay.Items;&lt;br /&gt;
using Eco.Shared.Localization;&lt;br /&gt;
using Eco.Shared.Serialization;&lt;br /&gt;
&lt;br /&gt;
namespace WikiDemo&lt;br /&gt;
{&lt;br /&gt;
    #region Item&lt;br /&gt;
    [Serialized] // Tells the save/load system this object needs to be serialized.&lt;br /&gt;
    [LocDisplayName(&amp;quot;Market Stall&amp;quot;)] // Defines the localized name of the item.&lt;br /&gt;
    [Weight(100)] // Defines how heavy Arrow is.&lt;br /&gt;
    [Ecopedia(&amp;quot;Work Stations&amp;quot;, &amp;quot;Craft Tables&amp;quot;, createAsSubPage: true)]&lt;br /&gt;
    [LocDescription(&amp;quot;A medieval market stall.&amp;quot;)] //The tooltip description for the item.&lt;br /&gt;
    public partial class MedievalStallItem: Item { }&lt;br /&gt;
    #endregion&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Line 8:&#039;&#039;&#039; A region tag. Lets the editor know it can collapse all of that code as a section. The following examples in this guide will just show &amp;lt;code&amp;gt;#region Item&amp;lt;/code&amp;gt; in their code examples.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 13:&#039;&#039;&#039; The implementation of &amp;lt;code&amp;gt;Item&amp;lt;/code&amp;gt; means that Eco will find this and look for Unity assets that matching this class&#039; name, &amp;lt;code&amp;gt;MedivalStallItem&amp;lt;/code&amp;gt;. While this doesn&#039;t do anything fancy, it completes the first step towards a new workbench.&lt;br /&gt;
&lt;br /&gt;
=== Checkpoint #1 ===&lt;br /&gt;
[[File:Eco - Hotbar With Modded Icon.png|thumb|Shows the medieval stall as a modded icon in-game.]]&lt;br /&gt;
Make sure everything is running smoothly by doing the following:&lt;br /&gt;
&lt;br /&gt;
# Double-check that the &amp;lt;code&amp;gt;WikiDemo.unity3d&amp;lt;/code&amp;gt; and the &amp;lt;code&amp;gt;WikiDemo.cs&amp;lt;/code&amp;gt; files are in &amp;lt;code&amp;gt;/Eco Server/Mods/UserCode&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
# Start the server and connect to it.&lt;br /&gt;
# Test it out by typing &amp;lt;code&amp;gt;/give MedievalStall&amp;lt;/code&amp;gt; in chat.&lt;br /&gt;
## It&#039;s also possible to do &amp;lt;code&amp;gt;/give Market Stall&amp;lt;/code&amp;gt; to get the item. How? Line 10: of the the above code declares that name as this item&#039;s &amp;quot;common name&amp;quot;. Neat.&lt;br /&gt;
# The item should appear in the players inventory with a working icon.&lt;br /&gt;
&lt;br /&gt;
== Code the Item&#039;s Recipe ==&lt;br /&gt;
The following goes over how to add a new class and implement the &amp;lt;code&amp;gt;RecipeFamily&amp;lt;/code&amp;gt; interface.&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;using Eco.Core.Items;&lt;br /&gt;
using Eco.Gameplay.Components;&lt;br /&gt;
using Eco.Gameplay.Items;&lt;br /&gt;
using Eco.Gameplay.Items.Recipes;&lt;br /&gt;
using Eco.Gameplay.Skills;&lt;br /&gt;
using Eco.Mods.TechTree;&lt;br /&gt;
using Eco.Shared.Localization;&lt;br /&gt;
using Eco.Shared.Serialization;&lt;br /&gt;
using System.Runtime.Versioning;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
&lt;br /&gt;
namespace WikiDemo&lt;br /&gt;
{&lt;br /&gt;
    #region Item&lt;br /&gt;
&lt;br /&gt;
    #region Recipe&lt;br /&gt;
    [RequiresSkill(typeof(CarpentrySkill), 3)]&lt;br /&gt;
    [Ecopedia(&amp;quot;Work Stations&amp;quot;, &amp;quot;Craft Tables&amp;quot;, subPageName: &amp;quot;Market Stall&amp;quot;)]&lt;br /&gt;
    public partial class MedievalStallRecipe : RecipeFamily&lt;br /&gt;
    {&lt;br /&gt;
        [SupportedOSPlatform(&amp;quot;windows7.0&amp;quot;)]&lt;br /&gt;
        public MedievalStallRecipe()&lt;br /&gt;
        {&lt;br /&gt;
            var recipe = new Recipe();&lt;br /&gt;
            recipe.Init(&lt;br /&gt;
                name: &amp;quot;MedievalStallItem&amp;quot;,&lt;br /&gt;
                displayName: Localizer.DoStr(&amp;quot;Market Stall&amp;quot;),&lt;br /&gt;
                ingredients: new List&amp;lt;IngredientElement&amp;gt;&lt;br /&gt;
                {&lt;br /&gt;
                    new IngredientElement(&amp;quot;Wood&amp;quot;, 40, typeof(Skill)),&lt;br /&gt;
                    new IngredientElement(typeof(CottonFabricItem), 30, typeof(Skill)),&lt;br /&gt;
                    new IngredientElement(typeof(HempMooringRopeItem), 5, true)&lt;br /&gt;
                },&lt;br /&gt;
                items: new List&amp;lt;CraftingElement&amp;gt;&lt;br /&gt;
                {&lt;br /&gt;
                    new CraftingElement&amp;lt;MedievalStallItem&amp;gt;(1)&lt;br /&gt;
                }&lt;br /&gt;
            );&lt;br /&gt;
            this.Recipes = new List&amp;lt;Recipe&amp;gt; { recipe };&lt;br /&gt;
            this.LaborInCalories = CreateLaborInCaloriesValue(800, typeof(Skill));&lt;br /&gt;
            this.CraftMinutes = CreateCraftTimeValue(typeof(MedievalStallRecipe), 10f, typeof(Skill));&lt;br /&gt;
    &lt;br /&gt;
            // Perform pre/post initialization for user mods and initialize our recipe instance with the display name &amp;quot;Market Stall&amp;quot;&lt;br /&gt;
            this.ModsPreInitialize();&lt;br /&gt;
            this.Initialize(displayText: Localizer.DoStr(&amp;quot;Market Stall&amp;quot;), recipeType: typeof(MedievalStallRecipe));&lt;br /&gt;
            this.ModsPostInitialize();&lt;br /&gt;
    &lt;br /&gt;
            // Register our RecipeFamily instance to a work table (in this case the Carpentry Table) so it can be crafted.&lt;br /&gt;
            CraftingComponent.AddRecipe(tableType: typeof(CarpentryTableObject), recipeFamily: this); // NOTE: The table must be the object instance!&lt;br /&gt;
        }&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
        /// &amp;lt;summary&amp;gt;Hook for other mods to customize RecipeFamily before initialization.&amp;lt;/summary&amp;gt;&lt;br /&gt;
        partial void ModsPreInitialize();&lt;br /&gt;
    &lt;br /&gt;
        /// &amp;lt;summary&amp;gt;Hook for other mods to customize RecipeFamily after initialization, but before registration. You can change skill requirements here.&amp;lt;/summary&amp;gt;&lt;br /&gt;
        partial void ModsPostInitialize();&lt;br /&gt;
    }&lt;br /&gt;
    #endregion&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Line 10:&#039;&#039;&#039; Eco will need this explicitly added to the file. Visual Studio will not add this line automatically. It&#039;s used for the &amp;lt;code&amp;gt;List&amp;lt;T&amp;gt;&amp;lt;/code&amp;gt; objects found in this code.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 14:&#039;&#039;&#039; &amp;quot;Collapsed&amp;quot; &amp;lt;code&amp;gt;Item&amp;lt;/code&amp;gt; section. See the earlier sections in this guide for the code that belongs there.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 17:&#039;&#039;&#039; Sets the required skill and skill level to craft this recipe.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 21:&#039;&#039;&#039; &amp;lt;code&amp;gt;[SupportedOSPlatform(&amp;quot;windows7.0&amp;quot;)]&amp;lt;/code&amp;gt; is here to silence some annoying warnings in Visual Studio. It&#039;s optional.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 30-32:&#039;&#039;&#039; Declares the input ingredients used for crafting. &amp;lt;code&amp;gt;typeof(Skill)&amp;lt;/code&amp;gt; gets mapped to the &amp;lt;code&amp;gt;CarpentrySkill&amp;lt;/code&amp;gt; as defined by line 31. In this example the &amp;lt;code&amp;gt;HempMooringRope&amp;lt;/code&amp;gt; is a static input. A static input will not be modified by skills, upgrade modules, or game settings.&amp;lt;br&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; It seems that at the time of writing (4/21/2026, Eco v13.0.2) the only way to get an ingredient to be a dynamic value that is reduced by the table&#039;s upgrade is to pass &amp;lt;code&amp;gt;typeof(Skill)&amp;lt;/code&amp;gt; to it; Passing either &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; makes the this input static.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 34:&#039;&#039;&#039; The &amp;lt;code&amp;gt;items&amp;lt;/code&amp;gt; list declares what items are &amp;lt;u&amp;gt;output&amp;lt;/u&amp;gt; by this recipe.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 36:&#039;&#039;&#039; This line declares that one medieval stall is output from this recipe. Functionally this links this recipe to the &amp;lt;code&amp;gt;MedievalStallItem&amp;lt;/code&amp;gt; (aka &amp;quot;Market Stall&amp;quot;) item created in the last step.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 40:&#039;&#039;&#039; Amount of calories needed to craft this item. For a static value (not modified by upgrades or skill levels) change this line to: &amp;lt;code&amp;gt;this.LaborInCalories = CreateLaborInCaloriesValue(800);&amp;lt;/code&amp;gt;. As it&#039;s written in the example, this item&#039;s calorie cost will be dynamic (modified by upgrades and skill levels). The skill level that will modify it is declared on line 16.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 41:&#039;&#039;&#039;  Minutes needed to craft. Both static and dynamic values for crafting time can be modified by the world difficulty settings. For a static value change this line to: &amp;lt;code&amp;gt;this.CraftMinutes = CreateCraftTimeValue(10f);&amp;lt;/code&amp;gt;. As it&#039;s written in the example, this item&#039;s craft time will be dynamic.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 49:&#039;&#039;&#039; This line assigns the recipe to a workbench. &amp;lt;u&amp;gt;Do not assign&amp;lt;/u&amp;gt; to itself because then the first table could never be made. It&#039;s recommend to use a preexisting vanilla table.&lt;br /&gt;
=== Checkpoint #2 ===&lt;br /&gt;
Check the functionality at this point -- it should be possible to see the recipe in the crafting table.&lt;br /&gt;
&lt;br /&gt;
# Have the &amp;lt;code&amp;gt;.unity3d&amp;lt;/code&amp;gt; and the &amp;lt;code&amp;gt;.cs&amp;lt;/code&amp;gt; file in the &amp;lt;code&amp;gt;/Eco Server/Mods/UserCode&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
# Start the server and log in.&lt;br /&gt;
# Type &amp;lt;code&amp;gt;/give Carpentry Table&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Place the Carpentry Table down and interact to see the what can be crafted.&lt;br /&gt;
# Find the newly added recipe under the name &#039;&#039;Market Stall.&#039;&#039;&lt;br /&gt;
# Type &amp;lt;code&amp;gt;/give Basic Upgrade 4&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Put the basic upgrade into the table.&lt;br /&gt;
# Go back to the recipe for the &#039;&#039;Market Stall&#039;&#039; and make sure the Wood and the Cotton fabric inputs now require less, but the Hemp Mooring Rope still is the same.&amp;lt;br&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; In case the recipe hasn&#039;t changed close that table&#039;s window and interact with it again. It should for the recipes to refresh now that the upgrade is in it.&lt;br /&gt;
&lt;br /&gt;
== Create the World Object ==&lt;br /&gt;
=== Preparing the 3D Asset ===&lt;br /&gt;
# Open &amp;lt;u&amp;gt;Blender&amp;lt;/u&amp;gt;.&lt;br /&gt;
# Load the 3D object created earlier for icon rendering -- &amp;lt;code&amp;gt;Assets/WikiDemo/MedievalStall - Icon Scene.blend&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Cleanup the scene...&lt;br /&gt;
## Delete any light source. Use the &#039;&#039;Scene Collection&#039;&#039; panel on the top-right side of the screen. These will have a 💡 icon and by default are named something like &amp;quot;sun&amp;quot;, &amp;quot;point&amp;quot;, &amp;quot;spot&amp;quot; or &amp;quot;area&amp;quot;.&amp;lt;br&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; If your model is a light source or has one in it, you can leave that light source. The point here is to remove the ambient lights used for icon rendering.&lt;br /&gt;
## Delete any camera(s). Again, use the &#039;&#039;Scene Collection&#039;&#039; panel. These have a 🎥 icon and by default are named something like &amp;quot;camera&amp;quot;.&lt;br /&gt;
# &amp;lt;u&amp;gt;If there are multiple different 3D assets in the scene&amp;lt;/u&amp;gt; (like bags, crates, jars, ect.), join them all together...&lt;br /&gt;
## Select all of the meshes by holding &#039;&#039;Shift&#039;&#039; and clicking on each one in the &#039;&#039;Scene Collection&#039;&#039; panel (right side of window).&amp;lt;br&amp;gt;&#039;&#039;&#039;Tip:&#039;&#039;&#039; Quickly select a group of them by selecting one near the top. Then hold &#039;&#039;Shift&#039;&#039;, &#039;&#039;Ctrl,&#039;&#039; and click on one near the bottom. This will both the one at the top and the one at the bottom, but also every item in between. Neat!&lt;br /&gt;
## Be in &#039;&#039;Layout&#039;&#039; workspace (top toolbar) and in the &#039;&#039;Object Mode...&#039;&#039;&lt;br /&gt;
### Find the drop down in the second toolbar from the top that has options like &#039;&#039;Object Mode, Edit Mode, Sculpt Mode,&#039;&#039; etc.&lt;br /&gt;
### Select &#039;&#039;Object Mode&#039;&#039; from that drop down.&lt;br /&gt;
## Find and open the &#039;&#039;Object&#039;&#039; menu (second toolbar down from the top).&lt;br /&gt;
## Select &#039;&#039;Join&#039;&#039;.&lt;br /&gt;
## In the &#039;&#039;Scene Collection&#039;&#039; panel, double click on the name of the newly joined mesh.&lt;br /&gt;
# Rename the joined mesh to &amp;lt;code&amp;gt;MedievalStallMesh&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Add and position a reference cube...&lt;br /&gt;
## Make sure the editor is in &#039;&#039;Layout&#039;&#039; view (top toolbar) and in the &#039;&#039;Object Mode...&#039;&#039;&lt;br /&gt;
### Find the drop down in the second toolbar from the top that has options like &#039;&#039;Object Mode, Edit Mode, Sculpt Mode,&#039;&#039; etc.&lt;br /&gt;
### Select &#039;&#039;Object Mode&#039;&#039; from that drop down.&lt;br /&gt;
## Then, add a reference cube. Open the &#039;&#039;Add&#039;&#039; menu (second top toolbar down).&lt;br /&gt;
## Hover &#039;&#039;Mesh&#039;&#039;.&lt;br /&gt;
## Select &#039;&#039;Cube.&#039;&#039;&lt;br /&gt;
## Open the &#039;&#039;View&#039;&#039; menu (second toolbar down).&lt;br /&gt;
## Select &#039;&#039;Sidebar&#039;&#039;.&lt;br /&gt;
## A new panel will have expanded.&lt;br /&gt;
## Along the right side of that panel there&#039;s buttons (&#039;&#039;Item, Tool, View, Animation&#039;&#039;). Find and click the &#039;&#039;Item&#039;&#039; button.&lt;br /&gt;
## Find and expand the &#039;&#039;Transform&#039;&#039; section&lt;br /&gt;
## Set the &#039;&#039;Location...&#039;&#039;&lt;br /&gt;
### &#039;&#039;X&#039;&#039; to &#039;&#039;1&#039;&#039;.&lt;br /&gt;
### &#039;&#039;Y&#039;&#039; to &#039;&#039;1&#039;&#039;.&lt;br /&gt;
### &#039;&#039;Z&#039;&#039; to &#039;&#039;1&#039;&#039;.&lt;br /&gt;
## The bottom corner of the cube should be touching the where green and red axis lines meet.&lt;br /&gt;
# Move the reference cube&#039;s origin to &amp;lt;code&amp;gt;(0, 0, 0)&amp;lt;/code&amp;gt;...&lt;br /&gt;
## Be in &#039;&#039;Layout&#039;&#039; workspace (top toolbar) and in the &#039;&#039;Object Mode...&#039;&#039;&lt;br /&gt;
### Find the drop down in the second toolbar from the top that has options like &#039;&#039;Object Mode, Edit Mode, Sculpt Mode,&#039;&#039; etc.&lt;br /&gt;
### Select &#039;&#039;Object Mode&#039;&#039; from that drop down.&lt;br /&gt;
## Open the &#039;&#039;View&#039;&#039; menu (second toolbar down).&lt;br /&gt;
## Select &#039;&#039;Sidebar&#039;&#039;.&lt;br /&gt;
## A new panel will have expanded.&lt;br /&gt;
## Along the right side of that panel there&#039;s buttons (&#039;&#039;Item, Tool, View, Animation&#039;&#039;). Find and click the &#039;&#039;View&#039;&#039; button.&lt;br /&gt;
## Find and expand the &#039;&#039;3D Cursor&#039;&#039; section.&lt;br /&gt;
## Set the 3D cursor&#039;s &#039;&#039;Location&#039;&#039;...&lt;br /&gt;
### &#039;&#039;X&#039;&#039; to &#039;&#039;0&#039;&#039;.&lt;br /&gt;
### &#039;&#039;Y&#039;&#039; to &#039;&#039;0&#039;&#039;.&lt;br /&gt;
### &#039;&#039;Z&#039;&#039; to &#039;&#039;0.&#039;&#039;&lt;br /&gt;
## Now in the &#039;&#039;Scene Collection&#039;&#039; panel, click on the &#039;&#039;Cube&#039;&#039; mesh to highlight and select it.&lt;br /&gt;
## Open the &#039;&#039;Object&#039;&#039; menu from the second toolbar down from the top.&lt;br /&gt;
## Hover &#039;&#039;Set Origin&#039;&#039;.&lt;br /&gt;
## Select &#039;&#039;Origin to 3D Cursor&#039;&#039;.&lt;br /&gt;
# Set the reference cube&#039;s dimensions...&lt;br /&gt;
## Be in &#039;&#039;Layout&#039;&#039; workspace (top toolbar) and in the &#039;&#039;Object Mode...&#039;&#039;&lt;br /&gt;
### Find the drop down in the second toolbar from the top that has options like &#039;&#039;Object Mode, Edit Mode, Sculpt Mode,&#039;&#039; etc.&lt;br /&gt;
### Select &#039;&#039;Object Mode&#039;&#039; from that drop down.&lt;br /&gt;
## Open the &#039;&#039;View&#039;&#039; menu (second toolbar down).&lt;br /&gt;
## Select and check the &#039;&#039;Sidebar&#039;&#039; option&#039;&#039;.&#039;&#039; &lt;br /&gt;
## The &#039;&#039;Sidebar&#039;&#039; menu just expanded over on the right side of the screen.&lt;br /&gt;
## To the right of the &#039;&#039;Sidebar&#039;&#039;, find and click the &#039;&#039;Item&#039;&#039; button.&lt;br /&gt;
## Expand the &#039;&#039;Transform&#039;&#039; section.&lt;br /&gt;
## Set the &#039;&#039;Dimensions...&#039;&#039;&#039;&#039;&#039;&amp;lt;br&amp;gt;Note:&#039;&#039;&#039; These dimensions only make sense for the asset being used for this guide. If using a different one, set the dimensions to the size of the box that model should fit in.&lt;br /&gt;
### &#039;&#039;X&#039;&#039; to &#039;&#039;4&#039;&#039;.&lt;br /&gt;
### &#039;&#039;Y&#039;&#039; to &#039;&#039;3&#039;&#039;.&lt;br /&gt;
### &#039;&#039;Z&#039;&#039; to &#039;&#039;3&#039;&#039;. &lt;br /&gt;
# Adjust the position and scale of the &#039;&#039;MedievalStallMesh&#039;&#039; to fit inside a box.&lt;br /&gt;
## Be in &#039;&#039;Layout&#039;&#039; workspace (top toolbar) and in the &#039;&#039;Object Mode...&#039;&#039;&lt;br /&gt;
### Find the drop down in the second toolbar from the top that has options like &#039;&#039;Object Mode, Edit Mode, Sculpt Mode,&#039;&#039; etc.&lt;br /&gt;
### Select &#039;&#039;Object Mode&#039;&#039; from that drop down.&lt;br /&gt;
## On the left side of the screen there&#039;s a column of icons. Hover over them to see their names.&lt;br /&gt;
## Select the &#039;&#039;Move&#039;&#039; tool.&lt;br /&gt;
## Click on the Medieval Stall to select it. Zoom out and reposition the camera so that the blue, green, and red arrows are visible.&amp;lt;br&amp;gt;&#039;&#039;&#039;Tip:&#039;&#039;&#039; By holding the middle-mouse button and dragging the scene will rotate. By holding the middle-mouse button and the &#039;&#039;Shift&#039;&#039; key, the scene will pan.&amp;lt;br&amp;gt;&#039;&#039;&#039;Tip:&#039;&#039;&#039; If panning or rotating the scene becomes slow or frustrating (especially after zooming), try selecting 3D asset from the &#039;&#039;Scene Collection&#039;&#039; panel, opening the &#039;&#039;View&#039;&#039; menu (second toolbar from top), and selecting &#039;&#039;Frame Selected&#039;&#039;. This will reset the view onto that object and controls should feel normal again.&lt;br /&gt;
## Click and hold one of the arrows. Move the mouse to drag the 3D asset towards the box.&lt;br /&gt;
## Move the 3D asset around till it&#039;s &amp;lt;u&amp;gt;completely inside the box&amp;lt;/u&amp;gt;. If it cannot fit and is too big, continue to the next step.&amp;lt;br&amp;gt;&#039;&#039;&#039;Tip:&#039;&#039;&#039; To select the 3D asset once it disappears, use the &#039;&#039;Scene Collection&#039;&#039; panel. Click on it there and the blue, green, and red arrows will show up again for it.&amp;lt;br&amp;gt;&#039;&#039;&#039;Tip:&#039;&#039;&#039; There are preset views. To use them go to the &#039;&#039;View&#039;&#039; menu (second toolbar from top)&#039;&#039;,&#039;&#039; hover &#039;&#039;Viewpoint&#039;&#039;, and select the view that would be most helpful.&lt;br /&gt;
## Find the &#039;&#039;Scale&#039;&#039; tool from the left side of the screen.&lt;br /&gt;
## Now the blue, green, and red &amp;quot;arrows&amp;quot; don&#039;t really look like arrows anymore. They are lines with boxes at the end.&lt;br /&gt;
## Click and hold on those lines to adjust the scale of the 3D asset to make it fit inside the box.&amp;lt;br&amp;gt;&#039;&#039;&#039;Tip:&#039;&#039;&#039; There are little colored boxes in between the lines that can be dragged to scale the 3D asset more proportionally.&lt;br /&gt;
## Continue using the &#039;&#039;Move&#039;&#039; and &#039;&#039;Scale&#039;&#039; tools till the model fits. This will take patience and time.&amp;lt;br&amp;gt;&#039;&#039;&#039;Tip:&#039;&#039;&#039; Hide the reference cube to see what is happening with the 3D asset. Go to the &#039;&#039;Scene Collections&#039;&#039; panel and click the 👁 button to hide it. Click that button again to show it.&lt;br /&gt;
# Move the reference cube&#039;s origin to &amp;lt;code&amp;gt;(0.5, 0.5, 0.5)&amp;lt;/code&amp;gt;...&lt;br /&gt;
## Be in &#039;&#039;Layout&#039;&#039; workspace (top toolbar) and in the &#039;&#039;Object Mode...&#039;&#039;&lt;br /&gt;
### Find the drop down in the second toolbar from the top that has options like &#039;&#039;Object Mode, Edit Mode, Sculpt Mode,&#039;&#039; etc.&lt;br /&gt;
### Select &#039;&#039;Object Mode&#039;&#039; from that drop down.&lt;br /&gt;
## Open the &#039;&#039;View&#039;&#039; menu (second toolbar down).&lt;br /&gt;
## Select &#039;&#039;Sidebar&#039;&#039;.&lt;br /&gt;
## A new panel will have expanded.&lt;br /&gt;
## Along the right side of that panel there&#039;s buttons (&#039;&#039;Item, Tool, View, Animation&#039;&#039;). Find and click the &#039;&#039;View&#039;&#039; button.&lt;br /&gt;
## Find and expand the &#039;&#039;3D Cursor&#039;&#039; section.&lt;br /&gt;
## Set the 3D cursor&#039;s &#039;&#039;Location&#039;&#039;...&lt;br /&gt;
### &#039;&#039;X&#039;&#039; to &#039;&#039;0&#039;&#039;.5.&lt;br /&gt;
### &#039;&#039;Y&#039;&#039; to &#039;&#039;0.5&#039;&#039;.&lt;br /&gt;
### &#039;&#039;Z&#039;&#039; to &#039;&#039;0.5.&#039;&#039;&lt;br /&gt;
## Select the &#039;&#039;MedievalStallMesh&#039;&#039; using the &#039;&#039;Scene Collection&#039;&#039; panel.&lt;br /&gt;
## Open the &#039;&#039;Object&#039;&#039; menu (second toolbar down).&lt;br /&gt;
## Hover &#039;&#039;Set Origin&#039;&#039;.&lt;br /&gt;
## Select &#039;&#039;Origin to 3D Cursor&#039;&#039;.&lt;br /&gt;
# Select the reference cube named &#039;&#039;Cube&#039;&#039; from the &#039;&#039;Scene Collections&#039;&#039; panel.&lt;br /&gt;
# Open &#039;&#039;Object&#039;&#039; menu (second toolbar down).&lt;br /&gt;
# Select &#039;&#039;Delete&#039;&#039;.&lt;br /&gt;
# Move the &#039;&#039;MedievalStallMesh&#039;&#039; to &amp;lt;code&amp;gt;(0, 0, 0)&amp;lt;/code&amp;gt;...&lt;br /&gt;
## Be in &#039;&#039;Layout&#039;&#039; workspace (top toolbar) and in the &#039;&#039;Object Mode...&#039;&#039;&lt;br /&gt;
### Find the drop down in the second toolbar from the top that has options like &#039;&#039;Object Mode, Edit Mode, Sculpt Mode,&#039;&#039; etc.&lt;br /&gt;
### Select &#039;&#039;Object Mode&#039;&#039; from that drop down.&lt;br /&gt;
## Open the &#039;&#039;View&#039;&#039; menu (second toolbar down).&lt;br /&gt;
## Select &#039;&#039;Sidebar&#039;&#039;.&lt;br /&gt;
## A new panel will have expanded.&lt;br /&gt;
## Along the right side of that panel there&#039;s buttons (&#039;&#039;Item, Tool, View, Animation&#039;&#039;). Find and click the &#039;&#039;Item&#039;&#039; button.&lt;br /&gt;
## Make sure the &#039;&#039;MedievalStallMesh&#039;&#039; is selected. Use the &#039;&#039;Scene Collection&#039;&#039; panel if needed.&lt;br /&gt;
## Find and expand the &#039;&#039;Transform&#039;&#039; section&lt;br /&gt;
## Set the &#039;&#039;Location...&#039;&#039;&lt;br /&gt;
### &#039;&#039;X&#039;&#039; to 0.&lt;br /&gt;
### &#039;&#039;Y&#039;&#039; to 0.&lt;br /&gt;
### &#039;&#039;Z&#039;&#039; to 0.&lt;br /&gt;
# Make sure the &#039;&#039;MedievalStallMesh&#039;&#039; is selected. Use the &#039;&#039;Scene Collection&#039;&#039; panel if needed.&lt;br /&gt;
# Open the &#039;&#039;Object&#039;&#039; menu.&lt;br /&gt;
# Hover &#039;&#039;Apply&#039;&#039;.&lt;br /&gt;
# Select &#039;&#039;All Transformations&#039;&#039;. &#039;&#039;&#039;Note:&#039;&#039;&#039; This step bakes all of the changes into the mesh. It&#039;s very important.&lt;br /&gt;
# Open the &#039;&#039;File&#039;&#039;  menu from the top toolbar.&lt;br /&gt;
# Hover &#039;&#039;Export&#039;&#039; to open the sub-menu.&lt;br /&gt;
# Select &#039;&#039;FBX (.fbx)&#039;&#039; &lt;br /&gt;
# A &#039;&#039;Blender File View&#039;&#039; window will pop-up.&lt;br /&gt;
# On the right side of this window there&#039;s a ⚙️ icon. Click it to expand the settings region.&lt;br /&gt;
# In the expanded region find the &#039;&#039;Include&#039;&#039; section and expand it. Change the following:&lt;br /&gt;
## Find &#039;&#039;Object Types&#039;&#039; and only select &#039;&#039;Mesh.&#039;&#039; No other option should be highlighted for this setting.&lt;br /&gt;
# In the settings region scroll and find the &#039;&#039;Transform&#039;&#039; section and expand it. Change the following:&lt;br /&gt;
## Find &#039;&#039;Apply Scalings&#039;&#039; and set it to &#039;&#039;FBX All&#039;&#039;.&lt;br /&gt;
## Just below that find &#039;&#039;Forward&#039;&#039; and set it to &#039;&#039;Z Forward&#039;&#039;.&lt;br /&gt;
## Ensure that the next setting down, &#039;&#039;Up&#039;&#039;, changed to &#039;&#039;Y Up&#039;&#039;.&lt;br /&gt;
## Find &#039;&#039;Apply Unit&#039;&#039; and make sure it&#039;s checked.&lt;br /&gt;
## Next, find &#039;&#039;Use Space Transform&#039;&#039; check it.&lt;br /&gt;
## Lastly, find &#039;&#039;Apply Transform&#039;&#039; and check it too.&lt;br /&gt;
# Save it to &amp;lt;code&amp;gt;Assets/WikiDemo/MedievalStall.fbx&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Save the Blender scene...&lt;br /&gt;
## &#039;&#039;File&#039;&#039; drop down from top toolbar.&lt;br /&gt;
## &#039;&#039;Save As...&#039;&#039; to save the Blender scene to the computer.&lt;br /&gt;
## Save it to &amp;lt;code&amp;gt;Assets/WikiDemo/MedievalStall - Eco Ready Scene.blend&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Add to Unity Scene ===&lt;br /&gt;
&lt;br /&gt;
# Open &amp;lt;u&amp;gt;Unity&amp;lt;/u&amp;gt;.&lt;br /&gt;
# Select the &amp;lt;code&amp;gt;.fbx&amp;lt;/code&amp;gt; file in the project window.&lt;br /&gt;
# Open the &#039;&#039;Eco Tools&#039;&#039; menu from the top toolbar.&lt;br /&gt;
# Hover &#039;&#039;Mod Kit&#039;&#039;.&lt;br /&gt;
# Select &#039;&#039;World Object Setup.&#039;&#039;&lt;br /&gt;
# A &#039;&#039;World Object Setup&#039;&#039;  window will pop-up.&lt;br /&gt;
# Make sure that &#039;&#039;Selected Objects&#039;&#039; reads &#039;&#039;MedievalStall.&#039;&#039;&lt;br /&gt;
# Also make sure that &#039;&#039;World Object Type&#039;&#039; is set to &#039;&#039;World Object&#039;&#039;.&lt;br /&gt;
# Press the &#039;&#039;Setup World Objects&#039;&#039; button.&lt;br /&gt;
# Notice in the project window that a new &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt; file was created -- &amp;lt;code&amp;gt;MedievalStallObject.prefab&amp;lt;/code&amp;gt;&lt;br /&gt;
# Select the &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt; file in the project window.&lt;br /&gt;
# Select &#039;&#039;Objects&#039;&#039; from &#039;&#039;Hierarchy&#039;&#039; panel (left-side of the window).&lt;br /&gt;
# Find the &#039;&#039;Modkit Prefab Container (Script)&#039;&#039; component.&lt;br /&gt;
# Expand the &#039;&#039;Prefabs&#039;&#039; section in that component.&lt;br /&gt;
# Click the &#039;&#039;+&#039;&#039; button to add an item to the list.&lt;br /&gt;
# Either...&lt;br /&gt;
## Click the &#039;&#039;⦿&#039;&#039; button, switch to the &#039;&#039;Assets&#039;&#039; tab, find or search for &#039;&#039;MedievalStallObject&#039;&#039;, and double click on it. Make sure it&#039;s the medieval stall &amp;lt;u&amp;gt;object&amp;lt;/u&amp;gt; with the &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt; ending.&lt;br /&gt;
## Drag the &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt; file onto the &#039;&#039;⦿&#039;&#039; button&lt;br /&gt;
# Open the &#039;&#039;File&#039;&#039; menu from top toolbar and select &#039;&#039;Save&#039;&#039;.&amp;lt;br&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; Do not skip. The scene must be saved for the ModKit build to work properly.&lt;br /&gt;
# Open the &#039;&#039;Eco Tools&#039;&#039; menu from the top toolbar.&lt;br /&gt;
# Hover &#039;&#039;Mod Kit&#039;&#039;.&lt;br /&gt;
# Select &#039;&#039;Build Current Bundle&#039;&#039;.&lt;br /&gt;
# Save the bundle to &amp;lt;code&amp;gt;/Eco Server/Mods/UserCode/WikiDemo.unity3d&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Scripting the World Object ===&lt;br /&gt;
WIP: Need occupancy code.&lt;br /&gt;
&lt;br /&gt;
Code that links the Item to this World Object.&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
using Eco.Core.Items;&lt;br /&gt;
using Eco.Gameplay.Components;&lt;br /&gt;
using Eco.Gameplay.Items;&lt;br /&gt;
using Eco.Gameplay.Items.Recipes;&lt;br /&gt;
using Eco.Gameplay.Objects;&lt;br /&gt;
using Eco.Gameplay.Skills;&lt;br /&gt;
using Eco.Mods.TechTree;&lt;br /&gt;
using Eco.Shared.Localization;&lt;br /&gt;
using Eco.Shared.Serialization;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Runtime.Versioning;&lt;br /&gt;
using System;&lt;br /&gt;
&lt;br /&gt;
namespace WikiDemo&lt;br /&gt;
{&lt;br /&gt;
    #region Item&lt;br /&gt;
    [Serialized] // Tells the save/load system this object needs to be serialized.&lt;br /&gt;
    [LocDisplayName(&amp;quot;Market Stall&amp;quot;)] // Defines the localized name of the item.&lt;br /&gt;
    [Weight(100)] // Defines how heavy Arrow is.&lt;br /&gt;
    [Ecopedia(&amp;quot;Work Stations&amp;quot;, &amp;quot;Craft Tables&amp;quot;, createAsSubPage: true)]&lt;br /&gt;
    [LocDescription(&amp;quot;A medieval market stall.&amp;quot;)] //The tooltip description for the item.&lt;br /&gt;
    public partial class MedievalStallItem : WorldObjectItem&amp;lt;MedievalStallObject&amp;gt; { }&lt;br /&gt;
    #endregion&lt;br /&gt;
&lt;br /&gt;
    #region Recipe&lt;br /&gt;
&lt;br /&gt;
    #region Object&lt;br /&gt;
    [Serialized]&lt;br /&gt;
    public partial class MedievalStallObject : WorldObject, IRepresentsItem&lt;br /&gt;
    {&lt;br /&gt;
        public Type RepresentedItemType =&amp;gt; typeof(MedievalStallItem);&lt;br /&gt;
    }&lt;br /&gt;
    #endregion&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Line 22:&#039;&#039;&#039; This changes from implementing &amp;lt;code&amp;gt;Item&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;WorldObjectItem&amp;lt;MedievalStallObject&amp;gt;&amp;lt;/code&amp;gt;. This is what gives the item the ability to place the table down in the world.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 25:&#039;&#039;&#039; The &amp;quot;collapsed&amp;quot; Recipe section. See earlier sections in this guide to see what code belongs here.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 29:&#039;&#039;&#039; Declares the &amp;lt;code&amp;gt;MedievalStallObject&amp;lt;/code&amp;gt;. It&#039;s important that this class name is matches exactly the &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt; file name because the name is what links them.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 31:&#039;&#039;&#039; This line is similar in function to line 22, it&#039;s declaring that this &amp;lt;code&amp;gt;MedievalStallObject&amp;lt;/code&amp;gt; is &amp;lt;code&amp;gt;MedievalStallItem&amp;lt;/code&amp;gt; when in inventories.&lt;br /&gt;
&lt;br /&gt;
=== Checkpoint ===&lt;br /&gt;
&#039;&#039;&#039;Warning:&#039;&#039;&#039; In &#039;&#039;Eco&#039;&#039; v13.0.2, free-placed objects may display misaligned ghost cubes, even when configured correctly in your mod. This is a visual-only base-game bug—placement still works as expected, even if the object appears red near edges. &amp;lt;!-- See: https://github.com/StrangeLoopGames/EcoIssues/issues/25834 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Export and see what it does. Ensure it&#039;s not lifting off the ground because of a non-curved shader.&lt;br /&gt;
&lt;br /&gt;
==== Origin Point Editing ====&lt;br /&gt;
Talk about what it does: the point that the simulation considers this world object to be at.&lt;br /&gt;
&lt;br /&gt;
Show how to move it around using blender.&lt;br /&gt;
&lt;br /&gt;
== Final Export ==&lt;br /&gt;
Export.&lt;br /&gt;
&lt;br /&gt;
Package.&lt;br /&gt;
&lt;br /&gt;
Distribute.&lt;/div&gt;</summary>
		<author><name>WugWugg</name></author>
	</entry>
	<entry>
		<id>https://wiki.play.eco/en/index.php?title=From_3D_Asset_to_Working_Worktable&amp;diff=16734</id>
		<title>From 3D Asset to Working Worktable</title>
		<link rel="alternate" type="text/html" href="https://wiki.play.eco/en/index.php?title=From_3D_Asset_to_Working_Worktable&amp;diff=16734"/>
		<updated>2026-04-27T21:11:21Z</updated>

		<summary type="html">&lt;p&gt;WugWugg: Giving up for now.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction =&lt;br /&gt;
Below is a guide on how to take an 3D asset from the Unity Store and make a working workbench in Eco. This includes:&lt;br /&gt;
* Creating a recipe to craft the modded table&lt;br /&gt;
* Creating recipes so the player can use the modded table to craft something&lt;br /&gt;
* Using Blender to generate a modded icon (seen when holding it in inventory)&lt;br /&gt;
* Using Blender to adjust the origin point of the model&lt;br /&gt;
* How to setup all this in a Unity scene and package for Eco&lt;br /&gt;
&lt;br /&gt;
= Setup =&lt;br /&gt;
&lt;br /&gt;
* Already have setup &#039;&#039;&#039;ModKit + Unity&#039;&#039;&#039;&lt;br /&gt;
** See: [[Installing the ModKit]]&lt;br /&gt;
* Have a &#039;&#039;&#039;3D model&#039;&#039;&#039;&lt;br /&gt;
** Just following along? Find the one used here at &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://assetstore.unity.com/packages/3d/props/low-poly-medieval-market-stalls-314286&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* A &#039;&#039;&#039;C# IDE&#039;&#039;&#039; (notepad++, Visual Studio, etc.)&lt;br /&gt;
** Highly encouraged to have an Intellisense setup and linked to the &#039;&#039;&#039;Reference Assemblies&#039;&#039;&#039;. Optional, but its really worth the time to figure out because it will help quickly correct small typos and trivial mistakes.&lt;br /&gt;
** See: [[Getting Started with Eco Modding in Visual Studio 2022]] (generally the same steps apply if using a new version of Visual Studio)&lt;br /&gt;
* &#039;&#039;&#039;Blender&#039;&#039;&#039; installed&lt;br /&gt;
** Homepage: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://www.blender.org/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Importing the Assets ==&lt;br /&gt;
&lt;br /&gt;
# Open the Unity editor to the project.&lt;br /&gt;
# From the top toolbar open the &#039;&#039;Window&#039;&#039; drop down.&lt;br /&gt;
# Hover &#039;&#039;Package Management&#039;&#039; to open sub-menu.&lt;br /&gt;
# Select &#039;&#039;Package Manager&#039;&#039;.&lt;br /&gt;
# The &#039;&#039;Package Manager&#039;&#039; window will pop-up.&lt;br /&gt;
# Install the package containing the assets you want to use...&lt;br /&gt;
## &amp;lt;u&amp;gt;If not using Unity Registry&amp;lt;/u&amp;gt;...&lt;br /&gt;
### Find the &#039;&#039;+▾&#039;&#039; button in the top left and open the drop down.&lt;br /&gt;
### Install the package from one of those options.&lt;br /&gt;
## &amp;lt;u&amp;gt;If using Unity Registry&amp;lt;/u&amp;gt;...&lt;br /&gt;
### Visit &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://assetstore.unity.com&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; and sign in.&lt;br /&gt;
### Search for the asset desired.&lt;br /&gt;
### Go to it&#039;s page (e.g. &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://assetstore.unity.com/packages/3d/props/low-poly-medieval-market-stalls-314286&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;) and click the big blue button, &#039;&#039;Add to My Assets.&#039;&#039;&lt;br /&gt;
### Now, in the Unity editor and back at the &#039;&#039;Package Manager&#039;&#039; window.&lt;br /&gt;
### Find &#039;&#039;My Assets&#039;&#039; on the left menu and navigate to it.&lt;br /&gt;
### Click the &#039;&#039;⟳&#039;&#039; button in the lower-right.&lt;br /&gt;
### The asset should be in the list now. Use the search to filter if needed.&lt;br /&gt;
### Click on the asset in the list. For those following along, &#039;&#039;Low Poly Medieval Market Stalls&#039;&#039;.&lt;br /&gt;
### In the right panel, find the &#039;&#039;Download ⤓&#039;&#039; button. Click it.&lt;br /&gt;
### Once downloaded, a new button should show up, it&#039;ll say something like &#039;&#039;⊕ Import 1.0 to project&#039;&#039; . Click it.&lt;br /&gt;
### The &#039;&#039;Import Unity Package&#039;&#039; window will pop-up.&lt;br /&gt;
### Select &#039;&#039;Import&#039;&#039; on it.&lt;br /&gt;
# Verify you can find your assets from the explorer. If following along, the assets are at &amp;lt;code&amp;gt;Assets/PolyRonin/Medieval Market Stalls&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Load in a demo scene, if provided, and make sure everything looks okay.&lt;br /&gt;
## For those following along, double click on the &#039;&#039;Demo&#039;&#039; scene at &amp;lt;code&amp;gt;Assets/PolyRonin/Medieval Market Stalls/Demo.unity&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:Eco - Unity - View Modes.png|thumb|Underlined in red are the different draw mode buttons. &amp;lt;u&amp;gt;4/20/26&amp;lt;/u&amp;gt;]]&lt;br /&gt;
If something seems off, check the different draw modes and see if changing those allow the scene to render as expected (see picture).&lt;br /&gt;
&lt;br /&gt;
With all that setup, it&#039;s time to get to the creation parts.&lt;br /&gt;
&lt;br /&gt;
= Creating The Worktable =&lt;br /&gt;
This guide will create the worktable in this order:&lt;br /&gt;
&lt;br /&gt;
# Create the item that represents the worktable&lt;br /&gt;
# Make a recipe to craft the worktable item&lt;br /&gt;
# Make the worktable item something that places a world object&lt;br /&gt;
# Give the worktable functionality by adding recipes to it&lt;br /&gt;
&lt;br /&gt;
== Creating the Item ==&lt;br /&gt;
&lt;br /&gt;
=== Item Icon ===&lt;br /&gt;
[[File:TeamstersStall - StallOnly - 256x256.png|thumb|A large (256x256px) icon created of Stall4 from the medieval assets.]]&lt;br /&gt;
This process is also explained here, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://mod.io/g/eco/r/origin-points-icon-images-with-blender&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, check it out if you need more visual reference points as that guide has a lot of pictures.&lt;br /&gt;
&lt;br /&gt;
# Open &amp;lt;u&amp;gt;Blender&amp;lt;/u&amp;gt;.&lt;br /&gt;
# Delete everything in the &#039;&#039;Scene Collection&#039;&#039;. Find this section in the top-right of the application.&lt;br /&gt;
# From the top toolbar, open the &#039;&#039;File&#039;&#039; drop down.&lt;br /&gt;
# Hover &#039;&#039;Import&#039;&#039; to open the sub-menu.&lt;br /&gt;
# Select the type of 3D asset. For those using medieval assets, select &#039;&#039;FBX (.fbx)&#039;&#039;.&lt;br /&gt;
# Find the asset on the computer...&lt;br /&gt;
## Tip: Use Unity to find the &amp;lt;code&amp;gt;.fbx&amp;lt;/code&amp;gt; asset. For the medieval assets, that&#039;s in &amp;lt;code&amp;gt;Assets/PolyRonin/Medieval Market Stalls/Meshes/medieval-market-stalls-1.fbx&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Right click on it and select &#039;&#039;Show in explorer&#039;&#039;.&lt;br /&gt;
## Now copy the address of that folder from Explorer. It might look like &amp;lt;code&amp;gt;C:\Users\Wug\EcoMod--WikiDemo\WikiDemo\Assets\PolyRonin\Medieval Market Stalls\Meshes&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Paste that in the address bar of the &amp;lt;u&amp;gt;Blender&amp;lt;/u&amp;gt; import pop-up.&lt;br /&gt;
# Select the blue &#039;&#039;Import FBX&#039;&#039; button&#039;&#039;.&#039;&#039;&lt;br /&gt;
# From &#039;&#039;Layout&#039;&#039; mode, change the Viewport Shading to Material Preview or Rendered. This is on the second toolbar down, far right of center, but before &#039;&#039;Scene Collection&#039;&#039; section.&lt;br /&gt;
# If you see purple models, Blender will need help finding textures for these meshes...&lt;br /&gt;
## From the top toolbar, open the &#039;&#039;File&#039;&#039; drop down.&lt;br /&gt;
## Hover &#039;&#039;External Data&#039;&#039; to open the sub-menu.&lt;br /&gt;
## Select &#039;&#039;Find Missing Files...&#039;&#039;&lt;br /&gt;
## Point this to the whole directory that the 3D assets came in. For the medieval pack, &amp;lt;code&amp;gt;C:\Users\&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;Wug\EcoMod--WikiDemo\WikiDemo\Assets\PolyRonin&amp;lt;/code&amp;gt;.&lt;br /&gt;
## The proper textures/materials should have now loaded in. If it hasn&#039;t, consult Google because without the textures the following steps won&#039;t produce a usable icon.&lt;br /&gt;
# Add a source of light...&lt;br /&gt;
## Make sure the editor is in the &#039;&#039;Layout&#039;&#039; mode by checking the top most toolbar.&lt;br /&gt;
## From the toolbar just under that one, find and open the &#039;&#039;Add&#039;&#039; drop down.&lt;br /&gt;
## Hover &#039;&#039;Light&#039;&#039; to open that sub-menu.&lt;br /&gt;
## Click &#039;&#039;Sun&#039;&#039;.&lt;br /&gt;
# Add a camera...&lt;br /&gt;
## Again make sure the editor is in the &#039;&#039;Layout&#039;&#039; mode.&lt;br /&gt;
## From the second toolbar down, find and open the &#039;&#039;Add&#039;&#039; drop down.&lt;br /&gt;
## Select &#039;&#039;Camera&#039;&#039;.&lt;br /&gt;
# Setup the scene with the object placement and lighting direction desired.  &#039;&#039;&#039;Tip:&#039;&#039;&#039; To reset the editor to something selected press the period key &amp;lt;u&amp;gt;on the numpad&amp;lt;/u&amp;gt;. Without a numpad, use &#039;&#039;View&#039;&#039; (second toolbar from the top) and select &#039;&#039;Frame Selected&#039;&#039; from it. Alternatively, just set the zoom to zoom to the mouse position: &#039;&#039;Edit&#039;&#039; (top toolbar), &#039;&#039;Preferences&#039;&#039; (from drop down), &#039;&#039;Navigation&#039;&#039; (on left menu), &#039;&#039;Zoom to Mouse Position&#039;&#039; (In the zoom section). This makes moving around a lot more natural feeling.&lt;br /&gt;
# Setup the rendering camera...&lt;br /&gt;
## Go to &#039;&#039;Rendering&#039;&#039;  tab on the top toolbar&lt;br /&gt;
## On the right there will be a side-panel open, it should be the &#039;&#039;Render&#039;&#039; tab. Confirm that.&lt;br /&gt;
## Change &#039;&#039;Render Engine&#039;&#039; to &#039;&#039;Cycles&#039;&#039;.&lt;br /&gt;
## Look down below in the same tab for the &#039;&#039;Film&#039;&#039; section.&lt;br /&gt;
## Expand it and find the &#039;&#039;Transparent&#039;&#039; checkbox and section. Click it so that it has a check mark. This will make the icon&#039;s background transparent.&lt;br /&gt;
## Now, go to the &#039;&#039;Output&#039;&#039; tab &amp;lt;u&amp;gt;on the side panel&amp;lt;/u&amp;gt;. The tab is just below the current one.&lt;br /&gt;
## In the &#039;&#039;Format&#039;&#039; section set &#039;&#039;Resolution X&#039;&#039; to &#039;&#039;64.&#039;&#039; And &#039;&#039;Y&#039;&#039; to &#039;&#039;64&#039;&#039; as well. This will make the icon generated a 64 by 64 pixel image.&lt;br /&gt;
# Go back to the &#039;&#039;Layout&#039;&#039; tab from the top toolbar.&lt;br /&gt;
# Center your view on the object (numpad period or &#039;&#039;View &amp;gt; Frame Selected&#039;&#039;). Adjust it so that the object is how it should be for the icon.&lt;br /&gt;
# Align the camera to the view...&lt;br /&gt;
## Make sure the editor is in &#039;&#039;Layout&#039;&#039; mode (top toolbar).&lt;br /&gt;
## Find &#039;&#039;View&#039;&#039; from the second from the top toolbar and open the drop down.&lt;br /&gt;
## Hover &#039;&#039;Align View&#039;&#039; to open the sub-menu.&lt;br /&gt;
## Select &#039;&#039;Align Active Camera To View&#039;&#039;.&lt;br /&gt;
## If the view is slightly off, there is a lock icon on the right side of this panel. Use it to &amp;quot;lock&amp;quot; controls to the camera and tweak it&#039;s view.&lt;br /&gt;
# Now return to the &#039;&#039;Rendering&#039;&#039; tab from the top toolbar.&lt;br /&gt;
# Press the F12 key to start the render. This should complete quickly since 64x64 pixels is a very small render.&lt;br /&gt;
# A window should popup, &#039;&#039;Blender Render&#039;&#039;. This is the icon!&lt;br /&gt;
# From the top tool bar of this &#039;&#039;Blender Render&#039;&#039; window, open the &#039;&#039;Image&#039;&#039; drop down.&lt;br /&gt;
# Select &#039;&#039;Save As...&#039;&#039; to save somewhere on the computer.&lt;br /&gt;
# Return to step 13 and repeat to do larger images if desired. Create a 128 by 128 pixel image too. It will make things smoother later.&lt;br /&gt;
# Save the Blender scene. Not only will it be used later, this will make making a new icon with a small tweak that much easier.&lt;br /&gt;
## &#039;&#039;File&#039;&#039; drop down from top toolbar.&lt;br /&gt;
## &#039;&#039;Save As...&#039;&#039; to save the Blender scene to the computer.&lt;br /&gt;
## Save it to &amp;lt;code&amp;gt;Assets/WikiDemo/MedievalStall - Icon Scene.blend&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Adding to Unity Scene ===&lt;br /&gt;
The developers explain how to create an item in one of ModKit&#039;s read me files (See: &amp;lt;code&amp;gt;Assets/EcoModKit/Docs/README.md&amp;lt;/code&amp;gt;), but this guide will explain it below.&lt;br /&gt;
&lt;br /&gt;
Additionally, &#039;&#039;&#039;TheKye&#039;&#039;&#039; on YouTube covers this in their &#039;&#039;Creating Your First Item&#039;&#039; and &#039;&#039;Creating Your First Item Pt 2&#039;&#039; videos.&lt;br /&gt;
&lt;br /&gt;
Use those additional resource to help troubleshoot issues with item&#039;s icons.&lt;br /&gt;
&lt;br /&gt;
# Open &amp;lt;u&amp;gt;Unity&amp;lt;/u&amp;gt;.&lt;br /&gt;
# In the left panel, the &#039;&#039;Hierarchy&#039;&#039; tab should be selected.&lt;br /&gt;
# Select the top-most object there. It should be a scene. If the editor last loaded the &#039;&#039;Demo&#039;&#039; scene from the medieval assets, it&#039;ll be named &#039;&#039;Demo&#039;&#039;.&lt;br /&gt;
# Right click on this scene and select &#039;&#039;Add New Scene&#039;&#039; from the menu.&lt;br /&gt;
# Right click again on the old scene (&#039;&#039;Demo&#039;&#039;) and select &#039;&#039;Remove Scene&#039;&#039;.&lt;br /&gt;
# Let it save if the changes to the old scene are important. Discard if it was open just for exploration&#039;s sake.&lt;br /&gt;
# Right click the new, &#039;&#039;Untitled&#039;&#039; scene. Click &#039;&#039;Save Scene As...&#039;&#039;&lt;br /&gt;
# Save it to &amp;lt;code&amp;gt;Assets/WikiDemo.unity&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Delete &amp;lt;u&amp;gt;anything&amp;lt;/u&amp;gt; in the scene.&lt;br /&gt;
# Right click the scene, hover &#039;&#039;GameObject&#039;&#039;, and select &#039;&#039;Create Empty&#039;&#039; from the sub-menu.&lt;br /&gt;
# Name this new object &#039;&#039;Objects&#039;&#039;.&lt;br /&gt;
# Select the newly created &#039;&#039;Objects&#039;&#039; object from the &#039;&#039;Hierarchy&#039;&#039; menu.&lt;br /&gt;
# On the far right side of the screen, in the &#039;&#039;Inspector&#039;&#039; menu, click the &#039;&#039;Add Component&#039;&#039; button.&lt;br /&gt;
# Type in &#039;&#039;ModkitPrefabContainer&#039;&#039;. Click on the component from the search to add it. The component now should be listed in the &#039;&#039;Inspector&#039;&#039;.&lt;br /&gt;
# In the &#039;&#039;Hierarchy&#039;&#039; panel right click the scene, hover &#039;&#039;GameObject&#039;&#039;, and select &#039;&#039;Create Empty&#039;&#039;.&lt;br /&gt;
# Name this new object &#039;&#039;Items&#039;&#039;.&lt;br /&gt;
# Right click the scene, hover &#039;&#039;GameObject&#039;&#039;, and select &#039;&#039;Create Empty&#039;&#039;.&lt;br /&gt;
# Name this new object &#039;&#039;Emoji&#039;&#039;.&lt;br /&gt;
# Select the newly created &#039;&#039;Emoji&#039;&#039; object, find the &#039;&#039;Inspector&#039;&#039; menu (far-right), and click the &#039;&#039;Add Component&#039;&#039; button.&lt;br /&gt;
# Type in &#039;&#039;ChatEmoteSetOld&#039;&#039;. Click on the component from the search to add it. That component should now be listed in the &#039;&#039;Inspector&#039;&#039;.&lt;br /&gt;
# Right click the scene, hover &#039;&#039;GameObject&#039;&#039;, and select &#039;&#039;Create Empty&#039;&#039;.&lt;br /&gt;
# Name this new object &#039;&#039;BlockSets&#039;&#039;.&lt;br /&gt;
# Select the newly created &#039;&#039;BlockSets&#039;&#039; object, find the &#039;&#039;Inspector&#039;&#039; menu (far-right), and click &#039;&#039;Add Component&#039;&#039;.&lt;br /&gt;
# Search for &#039;&#039;BlockSetContainer&#039;&#039;. Click on the component from the search to add it. The &#039;&#039;Inspector&#039;&#039; should now show that component as added.&lt;br /&gt;
#Go to &amp;lt;code&amp;gt;Assets/EcoModKit/Prefabs&amp;lt;/code&amp;gt; in the Unity project window.&lt;br /&gt;
# Find the prefab &#039;&#039;ItemTemplate&#039;&#039;.&lt;br /&gt;
# Drag it onto the &#039;&#039;Items&#039;&#039; object in the &#039;&#039;Hierarchy&#039;&#039; panel. It should add it as a &amp;lt;u&amp;gt;child&amp;lt;/u&amp;gt; of the &#039;&#039;Items&#039;&#039; object.&lt;br /&gt;
# Right click on the new &#039;&#039;ItemTemplate&#039;&#039; object, hover &#039;&#039;Prefab&#039;&#039;, and select &#039;&#039;Unpack Completely&#039;&#039;.&lt;br /&gt;
# Right click on the &#039;&#039;ItemTemplate&#039;&#039; object and select &#039;&#039;Rename&#039;&#039;. Name this what you want the item to be called. Example: &#039;&#039;MedievalStallItem&#039;&#039;.&lt;br /&gt;
# Set this item&#039;s background...&lt;br /&gt;
## Here&#039;s the default backgrounds (blue = item, brown = block, green = food): [[File:Eco - Item - Background.png|border|frameless]]        [[File:Eco - Block - Background.png|frameless]]        [[File:Eco - Food - Background.png|frameless]]&lt;br /&gt;
## Download or prepare the background and add it to the &amp;lt;code&amp;gt;Assets&amp;lt;/code&amp;gt; folder in Unity. &lt;br /&gt;
### To follow along lockstep, put the background in a new &amp;lt;code&amp;gt;Assets/WikiDemo&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
### Right click on &amp;lt;code&amp;gt;Assets&amp;lt;/code&amp;gt; folder, hover &#039;&#039;Create&#039;&#039;, select &#039;&#039;Folder&#039;&#039;.&lt;br /&gt;
### Name the folder &#039;&#039;WikiDemo&#039;&#039;.&lt;br /&gt;
## Configure Unity to use these as sprites...&lt;br /&gt;
### Select the background(s) added (Ctrl+Click each one).&lt;br /&gt;
### In the &#039;&#039;Inspector&#039;&#039;, find &#039;&#039;TextureType&#039;&#039; and change that to &#039;&#039;Sprite (2D and UI)&#039;&#039;.&lt;br /&gt;
### Again in the &#039;&#039;Inspector&#039;&#039;, find &#039;&#039;SpriteMode&#039;&#039; and change that to &#039;&#039;Single&#039;&#039;.&lt;br /&gt;
### Then scroll and go to the bottom of the &#039;&#039;Inspector&#039;&#039; and find the &#039;&#039;Apply&#039;&#039; button.&lt;br /&gt;
### This will apply those changes to that file and all other ones highlighted.&lt;br /&gt;
## Select the item being created (&#039;&#039;MedievalStallItem&#039;&#039;).&lt;br /&gt;
## In the &#039;&#039;Inspector&#039;&#039; panel (far-right), scroll and find the &#039;&#039;Item Template (Script)&#039;&#039; section.&lt;br /&gt;
## In here find the &#039;&#039;Background&#039;&#039; input. It&#039;ll say &#039;&#039;Background (Image)&#039;&#039; in it. If clicked that text to reveal and highlight the related object in the &#039;&#039;Hierarchy&#039;&#039; panel.&lt;br /&gt;
## Select the revealed, and highlighted object &#039;&#039;Background&#039;&#039;.&lt;br /&gt;
## In the &#039;&#039;Inspector&#039;&#039; panel, scroll and find the &#039;&#039;Image&#039;&#039; component section.&lt;br /&gt;
## Inside that component&#039;s section, find &#039;&#039;Source Image&#039;&#039;. It&#039;ll say &#039;&#039;Missing (Sprite)&#039;&#039;. Click the &#039;&#039;⦿&#039;&#039; button to the right.&lt;br /&gt;
## The &#039;&#039;Select Sprite&#039;&#039; popup will show. Make sure the &#039;&#039;Assets&#039;&#039; tab is selected, and find the backgrounds desired.&lt;br /&gt;
#Create the foreground image...&lt;br /&gt;
##This is easily accomplished in MS Paint.&lt;br /&gt;
##Get to the background image file in a &amp;lt;u&amp;gt;file explorer&amp;lt;/u&amp;gt;.&lt;br /&gt;
##Right click on it, hover &#039;&#039;Open with...&#039;&#039;, and select &#039;&#039;Paint&#039;&#039;.&lt;br /&gt;
##The solid background should be displayed.&lt;br /&gt;
##Open the &#039;&#039;File&#039;&#039; menu from the top toolbar.&lt;br /&gt;
##Hover &#039;&#039;Import to Canvas&#039;&#039; and select &#039;&#039;From a File&#039;&#039;.&lt;br /&gt;
##Find the icon in the file browser and import it. Match the size of the background image to have it nicely center itself.&lt;br /&gt;
##Now &#039;&#039;File&#039;&#039; from the top toolbar.&lt;br /&gt;
##Hover &#039;&#039;Save As...&#039;&#039; and select &#039;&#039;PNG&#039;&#039;.&lt;br /&gt;
##Save this to the &amp;lt;code&amp;gt;Assets/WikiDemo&amp;lt;/code&amp;gt; folder in Unity.&lt;br /&gt;
##Configure Unity to use these as sprites...&lt;br /&gt;
### Select the foreground image.&lt;br /&gt;
### In the &#039;&#039;Inspector&#039;&#039;, find &#039;&#039;TextureType&#039;&#039; and change that to &#039;&#039;Sprite (2D and UI)&#039;&#039;.&lt;br /&gt;
### Again in the &#039;&#039;Inspector&#039;&#039;, find &#039;&#039;SpriteMode&#039;&#039; and change that to &#039;&#039;Single&#039;&#039;.&lt;br /&gt;
### Then scroll and go to the bottom of the &#039;&#039;Inspector&#039;&#039; and find the &#039;&#039;Apply&#039;&#039; button.&lt;br /&gt;
### This will apply those changes to that file and all other ones highlighted.&lt;br /&gt;
#Set this item&#039;s foreground...&lt;br /&gt;
## Copy the item&#039;s icon into the &amp;lt;code&amp;gt;Assets&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
## Configure Unity to use it as a sprite (see the previous step&#039;s &#039;&#039;Set this item&#039;s background...&#039;&#039; instructions)&lt;br /&gt;
## Select the item being created (&#039;&#039;MedievalStallItem&#039;&#039;).&lt;br /&gt;
## In the &#039;&#039;Inspector&#039;&#039; panel (far-right), scroll and find the &#039;&#039;Item Template (Script)&#039;&#039; section.&lt;br /&gt;
## In here find the &#039;&#039;Foreground&#039;&#039; input. It&#039;ll say &#039;&#039;Foreground (Image)&#039;&#039; in it. If clicked that text to reveal and highlight the related object in the &#039;&#039;Hierarchy&#039;&#039; panel.&lt;br /&gt;
## Select the revealed, and highlighted object &#039;&#039;Foreground&#039;&#039;.&lt;br /&gt;
## Use the &#039;&#039;Inspector&#039;&#039;, find the &#039;&#039;Image&#039;&#039; component, within that component find the &#039;&#039;Source Image&#039;&#039; input. It will say &#039;&#039;Missing (Sprite)&#039;&#039;.&lt;br /&gt;
## Click the &#039;&#039;⦿&#039;&#039; button to the right of that input.&lt;br /&gt;
## From the &#039;&#039;Select Sprite&#039;&#039; popup, ensure the &#039;&#039;Assets&#039;&#039; tab is being searched, and find the icon just created.&lt;br /&gt;
&lt;br /&gt;
=== Export From Unity ===&lt;br /&gt;
&lt;br /&gt;
# Open the &#039;&#039;File&#039;&#039; menu from the top toolbar.&lt;br /&gt;
# Select &#039;&#039;Save.&#039;&#039; Save it to the &amp;lt;code&amp;gt;Assets/WikiDemo&amp;lt;/code&amp;gt; folder. &#039;&#039;&#039;Note:&#039;&#039;&#039; Do not skip. The scene must be saved for the ModKit build to work properly.&lt;br /&gt;
# Open the &#039;&#039;Eco Tools&#039;&#039; menu from the top toolbar.&lt;br /&gt;
# Hover &#039;&#039;Mod Kit&#039;&#039; to open the sub-menu.&lt;br /&gt;
# Select &#039;&#039;Build Current Bundle&#039;&#039;.&lt;br /&gt;
# Have it output the bundle to &amp;lt;code&amp;gt;/Eco Server/Mods/UserCode/WikiDemo.unity3d&amp;lt;/code&amp;gt;&lt;br /&gt;
# Wait for this to build. This may take a few minutes.&lt;br /&gt;
&lt;br /&gt;
=== Scripting the Item ===&lt;br /&gt;
For a more complex mod, it would be wise to build it into a DLL. See [[Getting Started with Eco Modding in Visual Studio 2022]] for details on that.&lt;br /&gt;
&lt;br /&gt;
# Create a &amp;lt;code&amp;gt;.cs&amp;lt;/code&amp;gt; file: &amp;lt;code&amp;gt;/Eco Server/Mods/UserCode/WikiDemo.cs&amp;lt;/code&amp;gt;&lt;br /&gt;
# Put the following into the newly created file:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;using Eco.Core.Items;&lt;br /&gt;
using Eco.Gameplay.Items;&lt;br /&gt;
using Eco.Shared.Localization;&lt;br /&gt;
using Eco.Shared.Serialization;&lt;br /&gt;
&lt;br /&gt;
namespace WikiDemo&lt;br /&gt;
{&lt;br /&gt;
    #region Item&lt;br /&gt;
    [Serialized] // Tells the save/load system this object needs to be serialized.&lt;br /&gt;
    [LocDisplayName(&amp;quot;Market Stall&amp;quot;)] // Defines the localized name of the item.&lt;br /&gt;
    [Weight(100)] // Defines how heavy Arrow is.&lt;br /&gt;
    [Ecopedia(&amp;quot;Work Stations&amp;quot;, &amp;quot;Craft Tables&amp;quot;, createAsSubPage: true)]&lt;br /&gt;
    [LocDescription(&amp;quot;A medieval market stall.&amp;quot;)] //The tooltip description for the item.&lt;br /&gt;
    public partial class MedievalStallItem: Item { }&lt;br /&gt;
    #endregion&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Line 8:&#039;&#039;&#039; A region tag. Lets the editor know it can collapse all of that code as a section. The following examples in this guide will just show &amp;lt;code&amp;gt;#region Item&amp;lt;/code&amp;gt; in their code examples.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 13:&#039;&#039;&#039; The implementation of &amp;lt;code&amp;gt;Item&amp;lt;/code&amp;gt; means that Eco will find this and look for Unity assets that matching this class&#039; name, &amp;lt;code&amp;gt;MedivalStallItem&amp;lt;/code&amp;gt;. While this doesn&#039;t do anything fancy, it completes the first step towards a new workbench.&lt;br /&gt;
&lt;br /&gt;
=== Checkpoint ===&lt;br /&gt;
[[File:Eco - Hotbar With Modded Icon.png|thumb|Shows the medieval stall as a modded icon in-game.]]&lt;br /&gt;
This was a lot of setup and steps. Make sure everything is running smoothly by doing the following:&lt;br /&gt;
&lt;br /&gt;
# Double-check that the &amp;lt;code&amp;gt;WikiDemo.unity3d&amp;lt;/code&amp;gt; and the &amp;lt;code&amp;gt;WikiDemo.cs&amp;lt;/code&amp;gt; files are in &amp;lt;code&amp;gt;/Eco Server/Mods/UserCode&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
# Start the server and connect to it.&lt;br /&gt;
# Test it out by typing &amp;lt;code&amp;gt;/give MedievalStall&amp;lt;/code&amp;gt; in chat&lt;br /&gt;
## It&#039;s also possible to do &amp;lt;code&amp;gt;/give Market Stall&amp;lt;/code&amp;gt; to get the item. How? Line 10: of the the above code declares that name as this item&#039;s &amp;quot;common name&amp;quot;. Neat.&lt;br /&gt;
# The item should appear in the players inventory with a working icon.&lt;br /&gt;
&lt;br /&gt;
This was the longest &amp;quot;leg&amp;quot; of this journey. All the setup is done and the infrastructure is in place. The following sections will just build on what was taught here.&lt;br /&gt;
&lt;br /&gt;
Keep on, keeping on!&lt;br /&gt;
&lt;br /&gt;
== Code the Item&#039;s Recipe ==&lt;br /&gt;
This section will be much simpler than the last. The following goes over how to add a new class and implement the &amp;lt;code&amp;gt;RecipeFamily&amp;lt;/code&amp;gt; interface.&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;using Eco.Core.Items;&lt;br /&gt;
using Eco.Gameplay.Components;&lt;br /&gt;
using Eco.Gameplay.Items;&lt;br /&gt;
using Eco.Gameplay.Items.Recipes;&lt;br /&gt;
using Eco.Gameplay.Skills;&lt;br /&gt;
using Eco.Mods.TechTree;&lt;br /&gt;
using Eco.Shared.Localization;&lt;br /&gt;
using Eco.Shared.Serialization;&lt;br /&gt;
using System.Runtime.Versioning;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
&lt;br /&gt;
namespace WikiDemo&lt;br /&gt;
{&lt;br /&gt;
    #region Item&lt;br /&gt;
&lt;br /&gt;
    #region Recipe&lt;br /&gt;
    [RequiresSkill(typeof(CarpentrySkill), 3)]&lt;br /&gt;
    [Ecopedia(&amp;quot;Work Stations&amp;quot;, &amp;quot;Craft Tables&amp;quot;, subPageName: &amp;quot;Market Stall&amp;quot;)]&lt;br /&gt;
    public partial class MedievalStallRecipe : RecipeFamily&lt;br /&gt;
    {&lt;br /&gt;
        [SupportedOSPlatform(&amp;quot;windows7.0&amp;quot;)]&lt;br /&gt;
        public MedievalStallRecipe()&lt;br /&gt;
        {&lt;br /&gt;
            var recipe = new Recipe();&lt;br /&gt;
            recipe.Init(&lt;br /&gt;
                name: &amp;quot;MedievalStallItem&amp;quot;,&lt;br /&gt;
                displayName: Localizer.DoStr(&amp;quot;Market Stall&amp;quot;),&lt;br /&gt;
                ingredients: new List&amp;lt;IngredientElement&amp;gt;&lt;br /&gt;
                {&lt;br /&gt;
                    new IngredientElement(&amp;quot;Wood&amp;quot;, 40, typeof(Skill)),&lt;br /&gt;
                    new IngredientElement(typeof(CottonFabricItem), 30, typeof(Skill)),&lt;br /&gt;
                    new IngredientElement(typeof(HempMooringRopeItem), 5, true)&lt;br /&gt;
                },&lt;br /&gt;
                items: new List&amp;lt;CraftingElement&amp;gt;&lt;br /&gt;
                {&lt;br /&gt;
                    new CraftingElement&amp;lt;MedievalStallItem&amp;gt;(1)&lt;br /&gt;
                }&lt;br /&gt;
            );&lt;br /&gt;
            this.Recipes = new List&amp;lt;Recipe&amp;gt; { recipe };&lt;br /&gt;
            this.LaborInCalories = CreateLaborInCaloriesValue(800, typeof(Skill));&lt;br /&gt;
            this.CraftMinutes = CreateCraftTimeValue(typeof(MedievalStallRecipe), 10f, typeof(Skill));&lt;br /&gt;
    &lt;br /&gt;
            // Perform pre/post initialization for user mods and initialize our recipe instance with the display name &amp;quot;Market Stall&amp;quot;&lt;br /&gt;
            this.ModsPreInitialize();&lt;br /&gt;
            this.Initialize(displayText: Localizer.DoStr(&amp;quot;Market Stall&amp;quot;), recipeType: typeof(MedievalStallRecipe));&lt;br /&gt;
            this.ModsPostInitialize();&lt;br /&gt;
    &lt;br /&gt;
            // Register our RecipeFamily instance to a work table (in this case the Carpentry Table) so it can be crafted.&lt;br /&gt;
            CraftingComponent.AddRecipe(tableType: typeof(CarpentryTableObject), recipeFamily: this); // NOTE: The table must be the object instance!&lt;br /&gt;
        }&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
        /// &amp;lt;summary&amp;gt;Hook for other mods to customize RecipeFamily before initialization.&amp;lt;/summary&amp;gt;&lt;br /&gt;
        partial void ModsPreInitialize();&lt;br /&gt;
    &lt;br /&gt;
        /// &amp;lt;summary&amp;gt;Hook for other mods to customize RecipeFamily after initialization, but before registration. You can change skill requirements here.&amp;lt;/summary&amp;gt;&lt;br /&gt;
        partial void ModsPostInitialize();&lt;br /&gt;
    }&lt;br /&gt;
    #endregion&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Line 10:&#039;&#039;&#039; Eco will need this explicitly added to the file. Visual Studio will not add this line automatically. It&#039;s used for the &amp;lt;code&amp;gt;List&amp;lt;T&amp;gt;&amp;lt;/code&amp;gt; objects found in this code.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 14:&#039;&#039;&#039; &amp;quot;Collapsed&amp;quot; &amp;lt;code&amp;gt;Item&amp;lt;/code&amp;gt; section. See the earlier sections in this guide for the code that belongs there.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 17:&#039;&#039;&#039; Sets the required skill and skill level to craft this recipe.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 21:&#039;&#039;&#039; &amp;lt;code&amp;gt;[SupportedOSPlatform(&amp;quot;windows7.0&amp;quot;)]&amp;lt;/code&amp;gt; is here to silence some annoying warnings in Visual Studio. It&#039;s optional.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 30-32:&#039;&#039;&#039; Declares the input ingredients used for crafting. &amp;lt;code&amp;gt;typeof(Skill)&amp;lt;/code&amp;gt; gets mapped to the &amp;lt;code&amp;gt;CarpentrySkill&amp;lt;/code&amp;gt; as defined by line 31. In this example the &amp;lt;code&amp;gt;HempMooringRope&amp;lt;/code&amp;gt; is a static input. A static input will not be modified by skills, upgrade modules, or game settings. &#039;&#039;&#039;Note:&#039;&#039;&#039; It seems that at the time of writing (4/21/2026, Eco v13.0.2) the only way to get an ingredient to be a dynamic value that is reduced by the table&#039;s upgrade is to pass &amp;lt;code&amp;gt;typeof(Skill)&amp;lt;/code&amp;gt; to it; Passing either &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; makes the this input static.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 34:&#039;&#039;&#039; The &amp;lt;code&amp;gt;items&amp;lt;/code&amp;gt; list declares what items are &amp;lt;u&amp;gt;output&amp;lt;/u&amp;gt; by this recipe.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 36:&#039;&#039;&#039; This line declares that one medieval stall is output from this recipe. Functionally this links this recipe to the &amp;lt;code&amp;gt;MedievalStallItem&amp;lt;/code&amp;gt; (aka &amp;quot;Market Stall&amp;quot;) item created in the last step.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 40:&#039;&#039;&#039; Amount of calories needed to craft this item. For a static value (not modified by upgrades or skill levels) change this line to: &amp;lt;code&amp;gt;this.LaborInCalories = CreateLaborInCaloriesValue(800);&amp;lt;/code&amp;gt;. As it&#039;s written in the example, this item&#039;s calorie cost will be dynamic (modified by upgrades and skill levels). The skill level that will modify it is declared on line 16.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 41:&#039;&#039;&#039;  Minutes needed to craft. Both static and dynamic values for crafting time can be modified by the world difficulty settings. For a static value change this line to: &amp;lt;code&amp;gt;this.CraftMinutes = CreateCraftTimeValue(10f);&amp;lt;/code&amp;gt;. As it&#039;s written in the example, this item&#039;s craft time will be dynamic.&#039;&#039;&#039;Line 49:&#039;&#039;&#039; This line assigns the recipe to a workbench. &amp;lt;u&amp;gt;Do not assign&amp;lt;/u&amp;gt; to itself because then the first table could never be made. It&#039;s recommend to use a preexisting vanilla table.&lt;br /&gt;
=== Checkpoint ===&lt;br /&gt;
Check the functionality at this point -- it should be possible to see the recipe in the crafting table.&lt;br /&gt;
&lt;br /&gt;
# Have the &amp;lt;code&amp;gt;.unity3d&amp;lt;/code&amp;gt; and the &amp;lt;code&amp;gt;.cs&amp;lt;/code&amp;gt; file in the &amp;lt;code&amp;gt;/Eco Server/Mods/UserCode&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
# Start the server and log in.&lt;br /&gt;
# Type &amp;lt;code&amp;gt;/give Carpentry Table&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Place the Carpentry Table down and interact to see the what can be crafted.&lt;br /&gt;
# Scroll and find the &#039;&#039;Market Stall&#039;&#039; recipe.&lt;br /&gt;
# Type &amp;lt;code&amp;gt;/give Basic Upgrade 4&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Put the basic upgrade into the table.&lt;br /&gt;
# Go back to the recipe for the &#039;&#039;Market Stall&#039;&#039; and make sure the Wood and the Cotton fabric inputs now require less, but the Hemp Mooring Rope still is the same. &#039;&#039;&#039;Note:&#039;&#039;&#039; In case the recipe hasn&#039;t changed close that table&#039;s window and interact with it again. It should for the recipes to refresh now that the upgrade is in it.&lt;br /&gt;
&lt;br /&gt;
== Create the World Object ==&lt;br /&gt;
=== Preparing the 3D Asset ===&lt;br /&gt;
WIP. Below is &amp;lt;u&amp;gt;incorrect&amp;lt;/u&amp;gt;. The origin point of the object should be a (0.5, 0.5, 0.5). Need to remember to zero out any transforms (translation and rotation) that the world object build scrip applies in Unity.&lt;br /&gt;
&lt;br /&gt;
You must use &amp;quot;override occupancy&amp;quot; for the prefab to be placable. The offset is still magic to me, need to figure that out.&lt;br /&gt;
&lt;br /&gt;
Also the freeplace seems to use the center of the prefab, but the snap place uses the origin. Need to figure out how to use origin for both.&lt;br /&gt;
# Open &amp;lt;u&amp;gt;Blender&amp;lt;/u&amp;gt;.&lt;br /&gt;
# Load the 3D object created earlier for icon rendering -- &amp;lt;code&amp;gt;Assets/WikiDemo/MedievalStall - Icon Scene.blend&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Cleanup the scene...&lt;br /&gt;
## Use the scene collection panel on the top-right side of the screen. Select and &#039;&#039;&#039;delete any light source&#039;&#039;&#039;. These will have a 💡 icon and by default are named something like &amp;quot;sun&amp;quot;, &amp;quot;point&amp;quot;, &amp;quot;spot&amp;quot; or &amp;quot;area&amp;quot;. &#039;&#039;&#039;Note:&#039;&#039;&#039; If your model is a light source or has one in it, you can leave that light source. The point here is to remove the ambient lights used for icon rendering.&lt;br /&gt;
## In the scene collection panel, select and &#039;&#039;&#039;delete any camera(s)&#039;&#039;&#039;. These have a 🎥 icon and by default are named something like &amp;quot;camera&amp;quot;.&lt;br /&gt;
# &amp;lt;u&amp;gt;If there are multiple different 3D assets in the scene&amp;lt;/u&amp;gt; (like bags, crates, jars, ect.), join them all together...&lt;br /&gt;
## Select all of the meshes by holding &#039;&#039;Shift&#039;&#039; and clicking on each one in the &#039;&#039;Scene Collection&#039;&#039; panel (right side of window). &#039;&#039;&#039;Tip:&#039;&#039;&#039; Quickly select a group of them by selecting one near the top. Then hold &#039;&#039;Shift&#039;&#039;, &#039;&#039;Ctrl,&#039;&#039; and click on one near the bottom. This will both the one at the top and the one at the bottom, but also every item in between. Neat!&lt;br /&gt;
## Be in &#039;&#039;Layout&#039;&#039; mode (top toolbar).&lt;br /&gt;
## Find and open the &#039;&#039;Object&#039;&#039; menu (second toolbar down from the top).&lt;br /&gt;
## Select &#039;&#039;Join&#039;&#039;.&lt;br /&gt;
## In the &#039;&#039;Scene Collection&#039;&#039; panel, double click on the name of the newly joined mesh.&lt;br /&gt;
## Rename it to &amp;lt;code&amp;gt;MedievalStallMesh&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Add and position a reference cube...&lt;br /&gt;
## Make sure the editor is in &#039;&#039;Layout&#039;&#039; view (top toolbar).&lt;br /&gt;
## Then, add a reference cube. Open the &#039;&#039;Add&#039;&#039; menu (second top toolbar down).&lt;br /&gt;
## Hover &#039;&#039;Mesh&#039;&#039;.&lt;br /&gt;
## Select &#039;&#039;Cube.&#039;&#039;&lt;br /&gt;
## Find the &#039;&#039;Properties&#039;&#039; panel. It&#039;s just below the &#039;&#039;Scene Collection&#039;&#039; panel on the right side of the window.&lt;br /&gt;
## Now, still inside that panel but on the left side of it there&#039;s a column of icons.&lt;br /&gt;
## Hover them to see their names.&lt;br /&gt;
## Find the one that reads:  &#039;&#039;Object&#039;&#039;  &#039;&#039;Object Properties&#039;&#039;  &#039;&#039;&#039;Tip:&#039;&#039;&#039; It kinda looks like an orange box&lt;br /&gt;
## Find and expand the &#039;&#039;Transform&#039;&#039; section&lt;br /&gt;
## Set &#039;&#039;Location X&#039;&#039; to &#039;&#039;1&#039;&#039;.&lt;br /&gt;
## Just below that, set &#039;&#039;Y&#039;&#039; to &#039;&#039;1&#039;&#039;.&lt;br /&gt;
## Just below that, again, set &#039;&#039;Z&#039;&#039; to &#039;&#039;1&#039;&#039;.&lt;br /&gt;
## The bottom corner of the cube will be touching the green and red axis lines.&lt;br /&gt;
# Move the reference cube&#039;s origin to &amp;lt;code&amp;gt;(0, 0, 0)&amp;lt;/code&amp;gt;...&lt;br /&gt;
## Be in &#039;&#039;Layout&#039;&#039; mode (top toolbar).&lt;br /&gt;
## Open the &#039;&#039;View&#039;&#039; menu (second toolbar down).&lt;br /&gt;
## Select &#039;&#039;Sidebar&#039;&#039;.&lt;br /&gt;
## A new panel will have expanded.&lt;br /&gt;
## Along the right side of that panel there&#039;s buttons (&#039;&#039;Item, Tool, View, Animation&#039;&#039;). Find and click the &#039;&#039;View&#039;&#039; button.&lt;br /&gt;
## Find and expand the &#039;&#039;3D Cursor&#039;&#039; section.&lt;br /&gt;
## Under &#039;&#039;Location&#039;&#039; set &#039;&#039;X&#039;&#039; to &#039;&#039;0&#039;&#039;.&lt;br /&gt;
## &#039;&#039;Y&#039;&#039; to 0.&lt;br /&gt;
## &#039;&#039;Z&#039;&#039; to 0.&lt;br /&gt;
## Now in the &#039;&#039;Scene Collection&#039;&#039; panel, select the &#039;&#039;Cube&#039;&#039; mesh.&lt;br /&gt;
## Open the &#039;&#039;Object&#039;&#039; menu from the second toolbar down from the top.&lt;br /&gt;
## Hover &#039;&#039;Set Origin&#039;&#039;.&lt;br /&gt;
## Select &#039;&#039;Origin to 3D Cursor&#039;&#039;.&lt;br /&gt;
# Set the reference cube&#039;s dimensions...&lt;br /&gt;
## Be in &#039;&#039;Layout&#039;&#039; mode, open the &#039;&#039;View&#039;&#039; menu (second toolbar down), and select and expand the &#039;&#039;Sidebar&#039;&#039; option&#039;&#039;.&#039;&#039;&lt;br /&gt;
## To the right of the sidebar, find and click the &#039;&#039;Item&#039;&#039; button.&lt;br /&gt;
## Expand the &#039;&#039;Transform&#039;&#039; section.&lt;br /&gt;
## Find the &#039;&#039;Dimensions,&#039;&#039; and set &#039;&#039;X&#039;&#039; to &#039;&#039;4&#039;&#039;.&lt;br /&gt;
## &#039;&#039;Y&#039;&#039; to &#039;&#039;3&#039;&#039;.&lt;br /&gt;
## &#039;&#039;Z&#039;&#039; to &#039;&#039;3&#039;&#039;.  &#039;&#039;&#039;Note:&#039;&#039;&#039; These dimensions only make sense for the asset being used for this guide. If using a different one, set the dimensions to the size of the box that model should fit in&lt;br /&gt;
# Adjust the position and scale to fit inside a box. This is important because it ensures that this object won&#039;t clip into other objects when placed.&lt;br /&gt;
## Be in &#039;&#039;Layout&#039;&#039; mode (top toolbar).&lt;br /&gt;
## Find the drop down in the second toolbar from the top that has options like &#039;&#039;Object Mode, Edit Mode, Sculpt Mode,&#039;&#039; etc.&lt;br /&gt;
## Select &#039;&#039;Object Mode&#039;&#039; from that drop down.&lt;br /&gt;
## On the left side of the screen there&#039;s a column of icons. Hover over them to see their names.&lt;br /&gt;
## Select the &#039;&#039;Move&#039;&#039; tool.&lt;br /&gt;
## Click on the Medieval Stall to select it. Zoom out and reposition the camera so that the blue, green, and red arrows are visible.  &#039;&#039;&#039;Tip:&#039;&#039;&#039; By holding the middle-mouse button and dragging the scene will rotate. By holding the middle-mouse button and the &#039;&#039;Shift&#039;&#039; key, the scene will pan.  &#039;&#039;&#039;Tip:&#039;&#039;&#039; If panning or rotating the scene becomes slow or frustrating (especially after zooming), try selecting 3D asset from the &#039;&#039;Scene Collection&#039;&#039; panel, opening the &#039;&#039;View&#039;&#039; menu (second toolbar from top), and selecting &#039;&#039;Frame Selected&#039;&#039;. This will reset the view onto that object and controls should feel normal again.&lt;br /&gt;
## Click and hold one of the arrows. Move the mouse to drag the 3D asset towards the box.&lt;br /&gt;
## Move the 3D asset around till it&#039;s &amp;lt;u&amp;gt;completely inside the box&amp;lt;/u&amp;gt;. If it cannot fit and is too big, continue to the next step.  &#039;&#039;&#039;Tip:&#039;&#039;&#039; To select the 3D asset once it disappears, use the &#039;&#039;Scene Collection&#039;&#039; panel. Click on it there and the blue, green, and red arrows will show up again for it.   &#039;&#039;&#039;Tip:&#039;&#039;&#039; There are preset views. To use them go to the &#039;&#039;View&#039;&#039; menu (second toolbar from top)&#039;&#039;,&#039;&#039; hover &#039;&#039;Viewpoint&#039;&#039;, and select the view that would be most helpful.&lt;br /&gt;
## Find the &#039;&#039;Scale&#039;&#039; tool from the left side of the screen.&lt;br /&gt;
## Now the blue, green, and red &amp;quot;arrows&amp;quot; don&#039;t really look like arrows anymore. They are lines with boxes at the end.&lt;br /&gt;
## Click and hold on those lines to adjust the scale of the 3D asset to make it fit inside the box.  &#039;&#039;&#039;Tip:&#039;&#039;&#039; There are little colored boxes in between the lines that can be dragged to scale the 3D asset more proportionally.&lt;br /&gt;
## Continue using the &#039;&#039;Move&#039;&#039; and &#039;&#039;Scale&#039;&#039; tools till the model fits. This will take patience and time.  &#039;&#039;&#039;Tip:&#039;&#039;&#039; Hide the reference cube to see what is happening with the 3D asset. Go to the &#039;&#039;Scene Collections&#039;&#039; panel and click the 👁 button to hide it. Click that button again to show it.&lt;br /&gt;
# Now set the 3D asset&#039;s origin point... &amp;lt;!-- I still need to determine where the origin point should be based on occupancy code. --&amp;gt;&lt;br /&gt;
## Ensure that the 3D Cursor is still at &amp;lt;code&amp;gt;(0,0,0)&amp;lt;/code&amp;gt;: Open the &#039;&#039;View&#039;&#039; menu (second toolbar down), select and expand the &#039;&#039;Sidebar&#039;&#039;, click the &#039;&#039;View&#039;&#039; button (right side of the Sidebar), find and expand the &#039;&#039;3D cursor&#039;&#039; section, change the &#039;&#039;Location X, Y,&#039;&#039; and &#039;&#039;Z&#039;&#039; to &#039;&#039;0&#039;&#039;.&lt;br /&gt;
## Select the 3D asset using the &#039;&#039;Scene Collection&#039;&#039; panel.&lt;br /&gt;
## Open the &#039;&#039;Object&#039;&#039; menu (second toolbar down).&lt;br /&gt;
## Hover &#039;&#039;Set Origin&#039;&#039;.&lt;br /&gt;
## Select &#039;&#039;Origin to 3D Cursor&#039;&#039;.&lt;br /&gt;
# Select the reference cube from the &#039;&#039;Scene Collections&#039;&#039; panel.&lt;br /&gt;
# Open &#039;&#039;Object&#039;&#039; menu (second toolbar down).&lt;br /&gt;
# Select &#039;&#039;Delete&#039;&#039;.&lt;br /&gt;
# Open the &#039;&#039;Object&#039;&#039; menu.&lt;br /&gt;
# Hover &#039;&#039;Apply&#039;&#039;.&lt;br /&gt;
# Select &#039;&#039;All Transformations&#039;&#039;. &#039;&#039;&#039;TODO:&#039;&#039;&#039; Ensure this step doesn&#039;t alter the origin now that it&#039;s being place in bottom-center, 0.5m off ground&lt;br /&gt;
# Open the &#039;&#039;File&#039;&#039;  menu from the top toolbar.&lt;br /&gt;
# Hover &#039;&#039;Export&#039;&#039; to open the sub-menu.&lt;br /&gt;
# Select &#039;&#039;FBX (.fbx)&#039;&#039; &lt;br /&gt;
# A &#039;&#039;Blender File View&#039;&#039; window will pop-up.&lt;br /&gt;
# On the right side of this window there&#039;s a ⚙️ icon. Click it to expand the settings region.&lt;br /&gt;
# In the expanded region find the &#039;&#039;Include&#039;&#039; section and expand it. Change the following:&lt;br /&gt;
## Find &#039;&#039;Object Types&#039;&#039; and only select &#039;&#039;Mesh.&#039;&#039; No other option should be highlighted for this setting.&lt;br /&gt;
# In the settings region scroll and find the &#039;&#039;Transform&#039;&#039; section and expand it. Change the following:&lt;br /&gt;
## Find &#039;&#039;Apply Scalings&#039;&#039; and set it to &#039;&#039;FBX All&#039;&#039;.&lt;br /&gt;
## Just below that find &#039;&#039;Forward&#039;&#039; and set it to &#039;&#039;-Z Forward&#039;&#039;.&lt;br /&gt;
## Ensure that the next setting down, &#039;&#039;Up&#039;&#039;, changed to &#039;&#039;Y Up&#039;&#039;.&lt;br /&gt;
## Find &#039;&#039;Apply Unit&#039;&#039; and make sure it&#039;s checked.&lt;br /&gt;
## Next, find &#039;&#039;Use Space Transform&#039;&#039; check it.&lt;br /&gt;
## Lastly, find &#039;&#039;Apply Transform&#039;&#039; and check it too.&lt;br /&gt;
# Save it to &amp;lt;code&amp;gt;Assets/WikiDemo/MedievalStall.fbx&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Save the &amp;lt;code&amp;gt;.blend&amp;lt;/code&amp;gt; file too and close Blender.&lt;br /&gt;
&lt;br /&gt;
=== Add to Unity Scene ===&lt;br /&gt;
&lt;br /&gt;
# Open &amp;lt;u&amp;gt;Unity&amp;lt;/u&amp;gt;.&lt;br /&gt;
# Select the &amp;lt;code&amp;gt;.fbx&amp;lt;/code&amp;gt; file in the project window.&lt;br /&gt;
# Open the &#039;&#039;Eco Tools&#039;&#039; menu from the top toolbar.&lt;br /&gt;
# Hover &#039;&#039;Mod Kit&#039;&#039;.&lt;br /&gt;
# Select &#039;&#039;World Object Setup.&#039;&#039;&lt;br /&gt;
# A &#039;&#039;World Object Setup&#039;&#039;  window will pop-up.&lt;br /&gt;
# Make sure that &#039;&#039;Selected Objects&#039;&#039; reads &#039;&#039;MedievalStall.&#039;&#039;&lt;br /&gt;
# Also make sure that &#039;&#039;World Object Type&#039;&#039; is set to &#039;&#039;World Object&#039;&#039;.&lt;br /&gt;
# Press the &#039;&#039;Setup World Objects&#039;&#039; button.&lt;br /&gt;
# Notice in the project window that a new &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt; file was created -- &amp;lt;code&amp;gt;MedievalStallObject.prefab&amp;lt;/code&amp;gt;&lt;br /&gt;
# Select the &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt; file in the project window.&lt;br /&gt;
# In the &#039;&#039;Inspector&#039;&#039; window (right side), scroll and find the &#039;&#039;World Object (Script)&#039;&#039; component.&lt;br /&gt;
# In that component, find the &#039;&#039;Override Occupancy&#039;&#039; checkbox and check it.&lt;br /&gt;
# A new field just appeared, &#039;&#039;Size&#039;&#039;.&lt;br /&gt;
# Set the &#039;&#039;X&#039;&#039; to &#039;&#039;4&#039;&#039;.&lt;br /&gt;
# &#039;&#039;Y&#039;&#039; to &#039;&#039;3&#039;&#039;.&lt;br /&gt;
# &#039;&#039;Z&#039;&#039; to &#039;&#039;3.&#039;&#039; &#039;&#039;&#039;Note:&#039;&#039;&#039; These are the sizes used for the reference cube. If using different sizes make sure you &amp;lt;u&amp;gt;flip the Y and Z coordinates&amp;lt;/u&amp;gt; when reading coordinates from Blender. Blender uses a different coordinate system that Unity!&lt;br /&gt;
# Select &#039;&#039;Objects&#039;&#039; from &#039;&#039;Hierarchy&#039;&#039; panel.&lt;br /&gt;
# Find the &#039;&#039;Modkit Prefab Container (Script)&#039;&#039; component.&lt;br /&gt;
# Expand the &#039;&#039;Prefabs&#039;&#039; section in that component.&lt;br /&gt;
# Click the &#039;&#039;+&#039;&#039; button to add an item to the list.&lt;br /&gt;
# Either...&lt;br /&gt;
## Click the &#039;&#039;⦿&#039;&#039; button, switch to the &#039;&#039;Assets&#039;&#039; tab, find or search for &#039;&#039;MedievalStallObject&#039;&#039;, and double click on it. Make sure it&#039;s the medieval stall &amp;lt;u&amp;gt;object&amp;lt;/u&amp;gt; with the &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt; ending.&lt;br /&gt;
## Drag the &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt; file onto the &#039;&#039;⦿&#039;&#039; button&lt;br /&gt;
# &lt;br /&gt;
# Open the &#039;&#039;File&#039;&#039; menu from top toolbar and select &#039;&#039;Save&#039;&#039;.  &#039;&#039;&#039;Note:&#039;&#039;&#039; Do not skip. The scene must be saved for the ModKit build to work properly.&lt;br /&gt;
# Open the &#039;&#039;Eco Tools&#039;&#039; menu from the top toolbar.&lt;br /&gt;
# Hover &#039;&#039;Mod Kit&#039;&#039;.&lt;br /&gt;
# Select &#039;&#039;Build Current Bundle&#039;&#039;.&lt;br /&gt;
# Save the bundle to &amp;lt;code&amp;gt;/Eco Server/Mods/UserCode/WikiDemo.unity3d&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Scripting the World Object ===&lt;br /&gt;
WIP: Need occupancy code.&lt;br /&gt;
&lt;br /&gt;
Code that links the Item to this World Object.&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
using Eco.Core.Items;&lt;br /&gt;
using Eco.Gameplay.Components;&lt;br /&gt;
using Eco.Gameplay.Items;&lt;br /&gt;
using Eco.Gameplay.Items.Recipes;&lt;br /&gt;
using Eco.Gameplay.Objects;&lt;br /&gt;
using Eco.Gameplay.Skills;&lt;br /&gt;
using Eco.Mods.TechTree;&lt;br /&gt;
using Eco.Shared.Localization;&lt;br /&gt;
using Eco.Shared.Serialization;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Runtime.Versioning;&lt;br /&gt;
using System;&lt;br /&gt;
&lt;br /&gt;
namespace WikiDemo&lt;br /&gt;
{&lt;br /&gt;
    #region Item&lt;br /&gt;
    [Serialized] // Tells the save/load system this object needs to be serialized.&lt;br /&gt;
    [LocDisplayName(&amp;quot;Market Stall&amp;quot;)] // Defines the localized name of the item.&lt;br /&gt;
    [Weight(100)] // Defines how heavy Arrow is.&lt;br /&gt;
    [Ecopedia(&amp;quot;Work Stations&amp;quot;, &amp;quot;Craft Tables&amp;quot;, createAsSubPage: true)]&lt;br /&gt;
    [LocDescription(&amp;quot;A medieval market stall.&amp;quot;)] //The tooltip description for the item.&lt;br /&gt;
    public partial class MedievalStallItem : WorldObjectItem&amp;lt;MedievalStallObject&amp;gt; { }&lt;br /&gt;
    #endregion&lt;br /&gt;
&lt;br /&gt;
    #region Recipe&lt;br /&gt;
&lt;br /&gt;
    #region Object&lt;br /&gt;
    [Serialized]&lt;br /&gt;
    public partial class MedievalStallObject : WorldObject, IRepresentsItem&lt;br /&gt;
    {&lt;br /&gt;
        public Type RepresentedItemType =&amp;gt; typeof(MedievalStallItem);&lt;br /&gt;
    }&lt;br /&gt;
    #endregion&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Line 22:&#039;&#039;&#039; This changes from implementing &amp;lt;code&amp;gt;Item&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;WorldObjectItem&amp;lt;MedievalStallObject&amp;gt;&amp;lt;/code&amp;gt;. This is what gives the item the ability to place the table down in the world.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 25:&#039;&#039;&#039; The &amp;quot;collapsed&amp;quot; Recipe section. See earlier sections in this guide to see what code belongs here.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 29:&#039;&#039;&#039; Declares the &amp;lt;code&amp;gt;MedievalStallObject&amp;lt;/code&amp;gt;. It&#039;s important that this class name is matches exactly the &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt; file name because the name is what links them.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 31:&#039;&#039;&#039; This line is similar in function to line 22, it&#039;s declaring that this &amp;lt;code&amp;gt;MedievalStallObject&amp;lt;/code&amp;gt; is &amp;lt;code&amp;gt;MedievalStallItem&amp;lt;/code&amp;gt; when in inventories.&lt;br /&gt;
&lt;br /&gt;
=== Checkpoint ===&lt;br /&gt;
Export and see what it does. Ensure it&#039;s not lifting off the ground because of a non-curved shader.&lt;br /&gt;
&lt;br /&gt;
==== Origin Point Editing ====&lt;br /&gt;
Talk about what it does: the point that the simulation considers this world object to be at.&lt;br /&gt;
&lt;br /&gt;
Show how to move it around using blender.&lt;br /&gt;
&lt;br /&gt;
== Final Export ==&lt;br /&gt;
Export.&lt;br /&gt;
&lt;br /&gt;
Package.&lt;br /&gt;
&lt;br /&gt;
Distribute.&lt;/div&gt;</summary>
		<author><name>WugWugg</name></author>
	</entry>
	<entry>
		<id>https://wiki.play.eco/en/index.php?title=From_3D_Asset_to_Working_Worktable&amp;diff=16733</id>
		<title>From 3D Asset to Working Worktable</title>
		<link rel="alternate" type="text/html" href="https://wiki.play.eco/en/index.php?title=From_3D_Asset_to_Working_Worktable&amp;diff=16733"/>
		<updated>2026-04-27T06:08:04Z</updated>

		<summary type="html">&lt;p&gt;WugWugg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction =&lt;br /&gt;
Below is a guide on how to take an 3D asset from the Unity Store and make a working workbench in Eco. This includes:&lt;br /&gt;
* Creating a recipe to craft the modded table&lt;br /&gt;
* Creating recipes so the player can use the modded table to craft something&lt;br /&gt;
* Using Blender to generate a modded icon (seen when holding it in inventory)&lt;br /&gt;
* Using Blender to adjust the origin point of the model&lt;br /&gt;
* How to setup all this in a Unity scene and package for Eco&lt;br /&gt;
&lt;br /&gt;
= Setup =&lt;br /&gt;
&lt;br /&gt;
* Already have setup &#039;&#039;&#039;ModKit + Unity&#039;&#039;&#039;&lt;br /&gt;
** See: [[Installing the ModKit]]&lt;br /&gt;
* Have a &#039;&#039;&#039;3D model&#039;&#039;&#039;&lt;br /&gt;
** Just following along? Find the one used here at &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://assetstore.unity.com/packages/3d/props/low-poly-medieval-market-stalls-314286&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* A &#039;&#039;&#039;C# IDE&#039;&#039;&#039; (notepad++, Visual Studio, etc.)&lt;br /&gt;
** Highly encouraged to have an Intellisense setup and linked to the &#039;&#039;&#039;Reference Assemblies&#039;&#039;&#039;. Optional, but its really worth the time to figure out because it will help quickly correct small typos and trivial mistakes.&lt;br /&gt;
** See: [[Getting Started with Eco Modding in Visual Studio 2022]] (generally the same steps apply if using a new version of Visual Studio)&lt;br /&gt;
* &#039;&#039;&#039;Blender&#039;&#039;&#039; installed&lt;br /&gt;
** Homepage: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://www.blender.org/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Importing the Assets ==&lt;br /&gt;
&lt;br /&gt;
# Open the Unity editor to the project.&lt;br /&gt;
# From the top toolbar open the &#039;&#039;Window&#039;&#039; drop down.&lt;br /&gt;
# Hover &#039;&#039;Package Management&#039;&#039; to open sub-menu.&lt;br /&gt;
# Select &#039;&#039;Package Manager&#039;&#039;.&lt;br /&gt;
# The &#039;&#039;Package Manager&#039;&#039; window will pop-up.&lt;br /&gt;
# Install the package containing the assets you want to use...&lt;br /&gt;
## &amp;lt;u&amp;gt;If not using Unity Registry&amp;lt;/u&amp;gt;...&lt;br /&gt;
### Find the &#039;&#039;+▾&#039;&#039; button in the top left and open the drop down.&lt;br /&gt;
### Install the package from one of those options.&lt;br /&gt;
## &amp;lt;u&amp;gt;If using Unity Registry&amp;lt;/u&amp;gt;...&lt;br /&gt;
### Visit &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://assetstore.unity.com&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; and sign in.&lt;br /&gt;
### Search for the asset desired.&lt;br /&gt;
### Go to it&#039;s page (e.g. &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://assetstore.unity.com/packages/3d/props/low-poly-medieval-market-stalls-314286&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;) and click the big blue button, &#039;&#039;Add to My Assets.&#039;&#039;&lt;br /&gt;
### Now, in the Unity editor and back at the &#039;&#039;Package Manager&#039;&#039; window.&lt;br /&gt;
### Find &#039;&#039;My Assets&#039;&#039; on the left menu and navigate to it.&lt;br /&gt;
### Click the &#039;&#039;⟳&#039;&#039; button in the lower-right.&lt;br /&gt;
### The asset should be in the list now. Use the search to filter if needed.&lt;br /&gt;
### Click on the asset in the list. For those following along, &#039;&#039;Low Poly Medieval Market Stalls&#039;&#039;.&lt;br /&gt;
### In the right panel, find the &#039;&#039;Download ⤓&#039;&#039; button. Click it.&lt;br /&gt;
### Once downloaded, a new button should show up, it&#039;ll say something like &#039;&#039;⊕ Import 1.0 to project&#039;&#039; . Click it.&lt;br /&gt;
### The &#039;&#039;Import Unity Package&#039;&#039; window will pop-up.&lt;br /&gt;
### Select &#039;&#039;Import&#039;&#039; on it.&lt;br /&gt;
# Verify you can find your assets from the explorer. If following along, the assets are at &amp;lt;code&amp;gt;Assets/PolyRonin/Medieval Market Stalls&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Load in a demo scene, if provided, and make sure everything looks okay.&lt;br /&gt;
## For those following along, double click on the &#039;&#039;Demo&#039;&#039; scene at &amp;lt;code&amp;gt;Assets/PolyRonin/Medieval Market Stalls/Demo.unity&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:Eco - Unity - View Modes.png|thumb|Underlined in red are the different draw mode buttons. &amp;lt;u&amp;gt;4/20/26&amp;lt;/u&amp;gt;]]&lt;br /&gt;
If something seems off, check the different draw modes and see if changing those allow the scene to render as expected (see picture).&lt;br /&gt;
&lt;br /&gt;
With all that setup, it&#039;s time to get to the creation parts.&lt;br /&gt;
&lt;br /&gt;
= Creating The Worktable =&lt;br /&gt;
This guide will create the worktable in this order:&lt;br /&gt;
&lt;br /&gt;
# Create the item that represents the worktable&lt;br /&gt;
# Make a recipe to craft the worktable item&lt;br /&gt;
# Make the worktable item something that places a world object&lt;br /&gt;
# Give the worktable functionality by adding recipes to it&lt;br /&gt;
&lt;br /&gt;
== Creating the Item ==&lt;br /&gt;
&lt;br /&gt;
=== Item Icon ===&lt;br /&gt;
[[File:TeamstersStall - StallOnly - 256x256.png|thumb|A large (256x256px) icon created of Stall4 from the medieval assets.]]&lt;br /&gt;
This process is also explained here, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://mod.io/g/eco/r/origin-points-icon-images-with-blender&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, check it out if you need more visual reference points as that guide has a lot of pictures.&lt;br /&gt;
&lt;br /&gt;
# Open &amp;lt;u&amp;gt;Blender&amp;lt;/u&amp;gt;.&lt;br /&gt;
# Delete everything in the &#039;&#039;Scene Collection&#039;&#039;. Find this section in the top-right of the application.&lt;br /&gt;
# From the top toolbar, open the &#039;&#039;File&#039;&#039; drop down.&lt;br /&gt;
# Hover &#039;&#039;Import&#039;&#039; to open the sub-menu.&lt;br /&gt;
# Select the type of 3D asset. For those using medieval assets, select &#039;&#039;FBX (.fbx)&#039;&#039;.&lt;br /&gt;
# Find the asset on the computer...&lt;br /&gt;
## Tip: Use Unity to find the &amp;lt;code&amp;gt;.fbx&amp;lt;/code&amp;gt; asset. For the medieval assets, that&#039;s in &amp;lt;code&amp;gt;Assets/PolyRonin/Medieval Market Stalls/Meshes/medieval-market-stalls-1.fbx&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Right click on it and select &#039;&#039;Show in explorer&#039;&#039;.&lt;br /&gt;
## Now copy the address of that folder from Explorer. It might look like &amp;lt;code&amp;gt;C:\Users\Wug\EcoMod--WikiDemo\WikiDemo\Assets\PolyRonin\Medieval Market Stalls\Meshes&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Paste that in the address bar of the &amp;lt;u&amp;gt;Blender&amp;lt;/u&amp;gt; import pop-up.&lt;br /&gt;
# Select the blue &#039;&#039;Import FBX&#039;&#039; button&#039;&#039;.&#039;&#039;&lt;br /&gt;
# From &#039;&#039;Layout&#039;&#039; mode, change the Viewport Shading to Material Preview or Rendered. This is on the second toolbar down, far right of center, but before &#039;&#039;Scene Collection&#039;&#039; section.&lt;br /&gt;
# If you see purple models, Blender will need help finding textures for these meshes...&lt;br /&gt;
## From the top toolbar, open the &#039;&#039;File&#039;&#039; drop down.&lt;br /&gt;
## Hover &#039;&#039;External Data&#039;&#039; to open the sub-menu.&lt;br /&gt;
## Select &#039;&#039;Find Missing Files...&#039;&#039;&lt;br /&gt;
## Point this to the whole directory that the 3D assets came in. For the medieval pack, &amp;lt;code&amp;gt;C:\Users\&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;Wug\EcoMod--WikiDemo\WikiDemo\Assets\PolyRonin&amp;lt;/code&amp;gt;.&lt;br /&gt;
## The proper textures/materials should have now loaded in. If it hasn&#039;t, consult Google because without the textures the following steps won&#039;t produce a usable icon.&lt;br /&gt;
# Add a source of light...&lt;br /&gt;
## Make sure the editor is in the &#039;&#039;Layout&#039;&#039; mode by checking the top most toolbar.&lt;br /&gt;
## From the toolbar just under that one, find and open the &#039;&#039;Add&#039;&#039; drop down.&lt;br /&gt;
## Hover &#039;&#039;Light&#039;&#039; to open that sub-menu.&lt;br /&gt;
## Click &#039;&#039;Sun&#039;&#039;.&lt;br /&gt;
# Add a camera...&lt;br /&gt;
## Again make sure the editor is in the &#039;&#039;Layout&#039;&#039; mode.&lt;br /&gt;
## From the second toolbar down, find and open the &#039;&#039;Add&#039;&#039; drop down.&lt;br /&gt;
## Select &#039;&#039;Camera&#039;&#039;.&lt;br /&gt;
# Setup the scene with the object placement and lighting direction desired.  &#039;&#039;&#039;Tip:&#039;&#039;&#039; To reset the editor to something selected press the period key &amp;lt;u&amp;gt;on the numpad&amp;lt;/u&amp;gt;. Without a numpad, use &#039;&#039;View&#039;&#039; (second toolbar from the top) and select &#039;&#039;Frame Selected&#039;&#039; from it. Alternatively, just set the zoom to zoom to the mouse position: &#039;&#039;Edit&#039;&#039; (top toolbar), &#039;&#039;Preferences&#039;&#039; (from drop down), &#039;&#039;Navigation&#039;&#039; (on left menu), &#039;&#039;Zoom to Mouse Position&#039;&#039; (In the zoom section). This makes moving around a lot more natural feeling.&lt;br /&gt;
# Setup the rendering camera...&lt;br /&gt;
## Go to &#039;&#039;Rendering&#039;&#039;  tab on the top toolbar&lt;br /&gt;
## On the right there will be a side-panel open, it should be the &#039;&#039;Render&#039;&#039; tab. Confirm that.&lt;br /&gt;
## Change &#039;&#039;Render Engine&#039;&#039; to &#039;&#039;Cycles&#039;&#039;.&lt;br /&gt;
## Look down below in the same tab for the &#039;&#039;Film&#039;&#039; section.&lt;br /&gt;
## Expand it and find the &#039;&#039;Transparent&#039;&#039; checkbox and section. Click it so that it has a check mark. This will make the icon&#039;s background transparent.&lt;br /&gt;
## Now, go to the &#039;&#039;Output&#039;&#039; tab &amp;lt;u&amp;gt;on the side panel&amp;lt;/u&amp;gt;. The tab is just below the current one.&lt;br /&gt;
## In the &#039;&#039;Format&#039;&#039; section set &#039;&#039;Resolution X&#039;&#039; to &#039;&#039;64.&#039;&#039; And &#039;&#039;Y&#039;&#039; to &#039;&#039;64&#039;&#039; as well. This will make the icon generated a 64 by 64 pixel image.&lt;br /&gt;
# Go back to the &#039;&#039;Layout&#039;&#039; tab from the top toolbar.&lt;br /&gt;
# Center your view on the object (numpad period or &#039;&#039;View &amp;gt; Frame Selected&#039;&#039;). Adjust it so that the object is how it should be for the icon.&lt;br /&gt;
# Align the camera to the view...&lt;br /&gt;
## Make sure the editor is in &#039;&#039;Layout&#039;&#039; mode (top toolbar).&lt;br /&gt;
## Find &#039;&#039;View&#039;&#039; from the second from the top toolbar and open the drop down.&lt;br /&gt;
## Hover &#039;&#039;Align View&#039;&#039; to open the sub-menu.&lt;br /&gt;
## Select &#039;&#039;Align Active Camera To View&#039;&#039;.&lt;br /&gt;
## If the view is slightly off, there is a lock icon on the right side of this panel. Use it to &amp;quot;lock&amp;quot; controls to the camera and tweak it&#039;s view.&lt;br /&gt;
# Now return to the &#039;&#039;Rendering&#039;&#039; tab from the top toolbar.&lt;br /&gt;
# Press the F12 key to start the render. This should complete quickly since 64x64 pixels is a very small render.&lt;br /&gt;
# A window should popup, &#039;&#039;Blender Render&#039;&#039;. This is the icon!&lt;br /&gt;
# From the top tool bar of this &#039;&#039;Blender Render&#039;&#039; window, open the &#039;&#039;Image&#039;&#039; drop down.&lt;br /&gt;
# Select &#039;&#039;Save As...&#039;&#039; to save somewhere on the computer.&lt;br /&gt;
# Return to step 13 and repeat to do larger images if desired. Create a 128 by 128 pixel image too. It will make things smoother later.&lt;br /&gt;
# Save the Blender scene. Not only will it be used later, this will make making a new icon with a small tweak that much easier.&lt;br /&gt;
## &#039;&#039;File&#039;&#039; drop down from top toolbar.&lt;br /&gt;
## &#039;&#039;Save As...&#039;&#039; to save the Blender scene to the computer.&lt;br /&gt;
## Save it to &amp;lt;code&amp;gt;Assets/WikiDemo/MedievalStall - Icon Scene.blend&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Adding to Unity Scene ===&lt;br /&gt;
The developers explain how to create an item in one of ModKit&#039;s read me files (See: &amp;lt;code&amp;gt;Assets/EcoModKit/Docs/README.md&amp;lt;/code&amp;gt;), but this guide will explain it below.&lt;br /&gt;
&lt;br /&gt;
Additionally, &#039;&#039;&#039;TheKye&#039;&#039;&#039; on YouTube covers this in their &#039;&#039;Creating Your First Item&#039;&#039; and &#039;&#039;Creating Your First Item Pt 2&#039;&#039; videos.&lt;br /&gt;
&lt;br /&gt;
Use those additional resource to help troubleshoot issues with item&#039;s icons.&lt;br /&gt;
&lt;br /&gt;
# Open &amp;lt;u&amp;gt;Unity&amp;lt;/u&amp;gt;.&lt;br /&gt;
# In the left panel, the &#039;&#039;Hierarchy&#039;&#039; tab should be selected.&lt;br /&gt;
# Select the top-most object there. It should be a scene. If the editor last loaded the &#039;&#039;Demo&#039;&#039; scene from the medieval assets, it&#039;ll be named &#039;&#039;Demo&#039;&#039;.&lt;br /&gt;
# Right click on this scene and select &#039;&#039;Add New Scene&#039;&#039; from the menu.&lt;br /&gt;
# Right click again on the old scene (&#039;&#039;Demo&#039;&#039;) and select &#039;&#039;Remove Scene&#039;&#039;.&lt;br /&gt;
# Let it save if the changes to the old scene are important. Discard if it was open just for exploration&#039;s sake.&lt;br /&gt;
# Right click the new, &#039;&#039;Untitled&#039;&#039; scene. Click &#039;&#039;Save Scene As...&#039;&#039;&lt;br /&gt;
# Save it to &amp;lt;code&amp;gt;Assets/WikiDemo.unity&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Delete &amp;lt;u&amp;gt;anything&amp;lt;/u&amp;gt; in the scene.&lt;br /&gt;
# Right click the scene, hover &#039;&#039;GameObject&#039;&#039;, and select &#039;&#039;Create Empty&#039;&#039; from the sub-menu.&lt;br /&gt;
# Name this new object &#039;&#039;Objects&#039;&#039;.&lt;br /&gt;
# Select the newly created &#039;&#039;Objects&#039;&#039; object from the &#039;&#039;Hierarchy&#039;&#039; menu.&lt;br /&gt;
# On the far right side of the screen, in the &#039;&#039;Inspector&#039;&#039; menu, click the &#039;&#039;Add Component&#039;&#039; button.&lt;br /&gt;
# Type in &#039;&#039;ModkitPrefabContainer&#039;&#039;. Click on the component from the search to add it. The component now should be listed in the &#039;&#039;Inspector&#039;&#039;.&lt;br /&gt;
# In the &#039;&#039;Hierarchy&#039;&#039; panel right click the scene, hover &#039;&#039;GameObject&#039;&#039;, and select &#039;&#039;Create Empty&#039;&#039;.&lt;br /&gt;
# Name this new object &#039;&#039;Items&#039;&#039;.&lt;br /&gt;
# Right click the scene, hover &#039;&#039;GameObject&#039;&#039;, and select &#039;&#039;Create Empty&#039;&#039;.&lt;br /&gt;
# Name this new object &#039;&#039;Emoji&#039;&#039;.&lt;br /&gt;
# Select the newly created &#039;&#039;Emoji&#039;&#039; object, find the &#039;&#039;Inspector&#039;&#039; menu (far-right), and click the &#039;&#039;Add Component&#039;&#039; button.&lt;br /&gt;
# Type in &#039;&#039;ChatEmoteSetOld&#039;&#039;. Click on the component from the search to add it. That component should now be listed in the &#039;&#039;Inspector&#039;&#039;.&lt;br /&gt;
# Right click the scene, hover &#039;&#039;GameObject&#039;&#039;, and select &#039;&#039;Create Empty&#039;&#039;.&lt;br /&gt;
# Name this new object &#039;&#039;BlockSets&#039;&#039;.&lt;br /&gt;
# Select the newly created &#039;&#039;BlockSets&#039;&#039; object, find the &#039;&#039;Inspector&#039;&#039; menu (far-right), and click &#039;&#039;Add Component&#039;&#039;.&lt;br /&gt;
# Search for &#039;&#039;BlockSetContainer&#039;&#039;. Click on the component from the search to add it. The &#039;&#039;Inspector&#039;&#039; should now show that component as added.&lt;br /&gt;
#Go to &amp;lt;code&amp;gt;Assets/EcoModKit/Prefabs&amp;lt;/code&amp;gt; in the Unity project window.&lt;br /&gt;
# Find the prefab &#039;&#039;ItemTemplate&#039;&#039;.&lt;br /&gt;
# Drag it onto the &#039;&#039;Items&#039;&#039; object in the &#039;&#039;Hierarchy&#039;&#039; panel. It should add it as a &amp;lt;u&amp;gt;child&amp;lt;/u&amp;gt; of the &#039;&#039;Items&#039;&#039; object.&lt;br /&gt;
# Right click on the new &#039;&#039;ItemTemplate&#039;&#039; object, hover &#039;&#039;Prefab&#039;&#039;, and select &#039;&#039;Unpack Completely&#039;&#039;.&lt;br /&gt;
# Right click on the &#039;&#039;ItemTemplate&#039;&#039; object and select &#039;&#039;Rename&#039;&#039;. Name this what you want the item to be called. Example: &#039;&#039;MedievalStallItem&#039;&#039;.&lt;br /&gt;
# Set this item&#039;s background...&lt;br /&gt;
## Here&#039;s the default backgrounds (blue = item, brown = block, green = food): [[File:Eco - Item - Background.png|border|frameless]]        [[File:Eco - Block - Background.png|frameless]]        [[File:Eco - Food - Background.png|frameless]]&lt;br /&gt;
## Download or prepare the background and add it to the &amp;lt;code&amp;gt;Assets&amp;lt;/code&amp;gt; folder in Unity. &lt;br /&gt;
### To follow along lockstep, put the background in a new &amp;lt;code&amp;gt;Assets/WikiDemo&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
### Right click on &amp;lt;code&amp;gt;Assets&amp;lt;/code&amp;gt; folder, hover &#039;&#039;Create&#039;&#039;, select &#039;&#039;Folder&#039;&#039;.&lt;br /&gt;
### Name the folder &#039;&#039;WikiDemo&#039;&#039;.&lt;br /&gt;
## Configure Unity to use these as sprites...&lt;br /&gt;
### Select the background(s) added (Ctrl+Click each one).&lt;br /&gt;
### In the &#039;&#039;Inspector&#039;&#039;, find &#039;&#039;TextureType&#039;&#039; and change that to &#039;&#039;Sprite (2D and UI)&#039;&#039;.&lt;br /&gt;
### Again in the &#039;&#039;Inspector&#039;&#039;, find &#039;&#039;SpriteMode&#039;&#039; and change that to &#039;&#039;Single&#039;&#039;.&lt;br /&gt;
### Then scroll and go to the bottom of the &#039;&#039;Inspector&#039;&#039; and find the &#039;&#039;Apply&#039;&#039; button.&lt;br /&gt;
### This will apply those changes to that file and all other ones highlighted.&lt;br /&gt;
## Select the item being created (&#039;&#039;MedievalStallItem&#039;&#039;).&lt;br /&gt;
## In the &#039;&#039;Inspector&#039;&#039; panel (far-right), scroll and find the &#039;&#039;Item Template (Script)&#039;&#039; section.&lt;br /&gt;
## In here find the &#039;&#039;Background&#039;&#039; input. It&#039;ll say &#039;&#039;Background (Image)&#039;&#039; in it. If clicked that text to reveal and highlight the related object in the &#039;&#039;Hierarchy&#039;&#039; panel.&lt;br /&gt;
## Select the revealed, and highlighted object &#039;&#039;Background&#039;&#039;.&lt;br /&gt;
## In the &#039;&#039;Inspector&#039;&#039; panel, scroll and find the &#039;&#039;Image&#039;&#039; component section.&lt;br /&gt;
## Inside that component&#039;s section, find &#039;&#039;Source Image&#039;&#039;. It&#039;ll say &#039;&#039;Missing (Sprite)&#039;&#039;. Click the &#039;&#039;⦿&#039;&#039; button to the right.&lt;br /&gt;
## The &#039;&#039;Select Sprite&#039;&#039; popup will show. Make sure the &#039;&#039;Assets&#039;&#039; tab is selected, and find the backgrounds desired.&lt;br /&gt;
#Create the foreground image...&lt;br /&gt;
##This is easily accomplished in MS Paint.&lt;br /&gt;
##Get to the background image file in a &amp;lt;u&amp;gt;file explorer&amp;lt;/u&amp;gt;.&lt;br /&gt;
##Right click on it, hover &#039;&#039;Open with...&#039;&#039;, and select &#039;&#039;Paint&#039;&#039;.&lt;br /&gt;
##The solid background should be displayed.&lt;br /&gt;
##Open the &#039;&#039;File&#039;&#039; menu from the top toolbar.&lt;br /&gt;
##Hover &#039;&#039;Import to Canvas&#039;&#039; and select &#039;&#039;From a File&#039;&#039;.&lt;br /&gt;
##Find the icon in the file browser and import it. Match the size of the background image to have it nicely center itself.&lt;br /&gt;
##Now &#039;&#039;File&#039;&#039; from the top toolbar.&lt;br /&gt;
##Hover &#039;&#039;Save As...&#039;&#039; and select &#039;&#039;PNG&#039;&#039;.&lt;br /&gt;
##Save this to the &amp;lt;code&amp;gt;Assets/WikiDemo&amp;lt;/code&amp;gt; folder in Unity.&lt;br /&gt;
##Configure Unity to use these as sprites...&lt;br /&gt;
### Select the foreground image.&lt;br /&gt;
### In the &#039;&#039;Inspector&#039;&#039;, find &#039;&#039;TextureType&#039;&#039; and change that to &#039;&#039;Sprite (2D and UI)&#039;&#039;.&lt;br /&gt;
### Again in the &#039;&#039;Inspector&#039;&#039;, find &#039;&#039;SpriteMode&#039;&#039; and change that to &#039;&#039;Single&#039;&#039;.&lt;br /&gt;
### Then scroll and go to the bottom of the &#039;&#039;Inspector&#039;&#039; and find the &#039;&#039;Apply&#039;&#039; button.&lt;br /&gt;
### This will apply those changes to that file and all other ones highlighted.&lt;br /&gt;
#Set this item&#039;s foreground...&lt;br /&gt;
## Copy the item&#039;s icon into the &amp;lt;code&amp;gt;Assets&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
## Configure Unity to use it as a sprite (see the previous step&#039;s &#039;&#039;Set this item&#039;s background...&#039;&#039; instructions)&lt;br /&gt;
## Select the item being created (&#039;&#039;MedievalStallItem&#039;&#039;).&lt;br /&gt;
## In the &#039;&#039;Inspector&#039;&#039; panel (far-right), scroll and find the &#039;&#039;Item Template (Script)&#039;&#039; section.&lt;br /&gt;
## In here find the &#039;&#039;Foreground&#039;&#039; input. It&#039;ll say &#039;&#039;Foreground (Image)&#039;&#039; in it. If clicked that text to reveal and highlight the related object in the &#039;&#039;Hierarchy&#039;&#039; panel.&lt;br /&gt;
## Select the revealed, and highlighted object &#039;&#039;Foreground&#039;&#039;.&lt;br /&gt;
## Use the &#039;&#039;Inspector&#039;&#039;, find the &#039;&#039;Image&#039;&#039; component, within that component find the &#039;&#039;Source Image&#039;&#039; input. It will say &#039;&#039;Missing (Sprite)&#039;&#039;.&lt;br /&gt;
## Click the &#039;&#039;⦿&#039;&#039; button to the right of that input.&lt;br /&gt;
## From the &#039;&#039;Select Sprite&#039;&#039; popup, ensure the &#039;&#039;Assets&#039;&#039; tab is being searched, and find the icon just created.&lt;br /&gt;
&lt;br /&gt;
=== Export From Unity ===&lt;br /&gt;
&lt;br /&gt;
# Open the &#039;&#039;File&#039;&#039; menu from the top toolbar.&lt;br /&gt;
# Select &#039;&#039;Save.&#039;&#039; Save it to the &amp;lt;code&amp;gt;Assets/WikiDemo&amp;lt;/code&amp;gt; folder. &#039;&#039;&#039;Note:&#039;&#039;&#039; Do not skip. The scene must be saved for the ModKit build to work properly.&lt;br /&gt;
# Open the &#039;&#039;Eco Tools&#039;&#039; menu from the top toolbar.&lt;br /&gt;
# Hover &#039;&#039;Mod Kit&#039;&#039; to open the sub-menu.&lt;br /&gt;
# Select &#039;&#039;Build Current Bundle&#039;&#039;.&lt;br /&gt;
# Have it output the bundle to &amp;lt;code&amp;gt;/Eco Server/Mods/UserCode/WikiDemo.unity3d&amp;lt;/code&amp;gt;&lt;br /&gt;
# Wait for this to build. This may take a few minutes.&lt;br /&gt;
&lt;br /&gt;
=== Scripting the Item ===&lt;br /&gt;
For a more complex mod, it would be wise to build it into a DLL. See [[Getting Started with Eco Modding in Visual Studio 2022]] for details on that.&lt;br /&gt;
&lt;br /&gt;
# Create a &amp;lt;code&amp;gt;.cs&amp;lt;/code&amp;gt; file: &amp;lt;code&amp;gt;/Eco Server/Mods/UserCode/WikiDemo.cs&amp;lt;/code&amp;gt;&lt;br /&gt;
# Put the following into the newly created file:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;using Eco.Core.Items;&lt;br /&gt;
using Eco.Gameplay.Items;&lt;br /&gt;
using Eco.Shared.Localization;&lt;br /&gt;
using Eco.Shared.Serialization;&lt;br /&gt;
&lt;br /&gt;
namespace WikiDemo&lt;br /&gt;
{&lt;br /&gt;
    #region Item&lt;br /&gt;
    [Serialized] // Tells the save/load system this object needs to be serialized.&lt;br /&gt;
    [LocDisplayName(&amp;quot;Market Stall&amp;quot;)] // Defines the localized name of the item.&lt;br /&gt;
    [Weight(100)] // Defines how heavy Arrow is.&lt;br /&gt;
    [Ecopedia(&amp;quot;Work Stations&amp;quot;, &amp;quot;Craft Tables&amp;quot;, createAsSubPage: true)]&lt;br /&gt;
    [LocDescription(&amp;quot;A medieval market stall.&amp;quot;)] //The tooltip description for the item.&lt;br /&gt;
    public partial class MedievalStallItem: Item { }&lt;br /&gt;
    #endregion&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Line 8:&#039;&#039;&#039; A region tag. Lets the editor know it can collapse all of that code as a section. The following examples in this guide will just show &amp;lt;code&amp;gt;#region Item&amp;lt;/code&amp;gt; in their code examples.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 13:&#039;&#039;&#039; The implementation of &amp;lt;code&amp;gt;Item&amp;lt;/code&amp;gt; means that Eco will find this and look for Unity assets that matching this class&#039; name, &amp;lt;code&amp;gt;MedivalStallItem&amp;lt;/code&amp;gt;. While this doesn&#039;t do anything fancy, it completes the first step towards a new workbench.&lt;br /&gt;
&lt;br /&gt;
=== Checkpoint ===&lt;br /&gt;
[[File:Eco - Hotbar With Modded Icon.png|thumb|Shows the medieval stall as a modded icon in-game.]]&lt;br /&gt;
This was a lot of setup and steps. Make sure everything is running smoothly by doing the following:&lt;br /&gt;
&lt;br /&gt;
# Double-check that the &amp;lt;code&amp;gt;WikiDemo.unity3d&amp;lt;/code&amp;gt; and the &amp;lt;code&amp;gt;WikiDemo.cs&amp;lt;/code&amp;gt; files are in &amp;lt;code&amp;gt;/Eco Server/Mods/UserCode&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
# Start the server and connect to it.&lt;br /&gt;
# Test it out by typing &amp;lt;code&amp;gt;/give MedievalStall&amp;lt;/code&amp;gt; in chat&lt;br /&gt;
## It&#039;s also possible to do &amp;lt;code&amp;gt;/give Market Stall&amp;lt;/code&amp;gt; to get the item. How? Line 10: of the the above code declares that name as this item&#039;s &amp;quot;common name&amp;quot;. Neat.&lt;br /&gt;
# The item should appear in the players inventory with a working icon.&lt;br /&gt;
&lt;br /&gt;
This was the longest &amp;quot;leg&amp;quot; of this journey. All the setup is done and the infrastructure is in place. The following sections will just build on what was taught here.&lt;br /&gt;
&lt;br /&gt;
Keep on, keeping on!&lt;br /&gt;
&lt;br /&gt;
== Code the Item&#039;s Recipe ==&lt;br /&gt;
This section will be much simpler than the last. The following goes over how to add a new class and implement the &amp;lt;code&amp;gt;RecipeFamily&amp;lt;/code&amp;gt; interface.&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;using Eco.Core.Items;&lt;br /&gt;
using Eco.Gameplay.Components;&lt;br /&gt;
using Eco.Gameplay.Items;&lt;br /&gt;
using Eco.Gameplay.Items.Recipes;&lt;br /&gt;
using Eco.Gameplay.Skills;&lt;br /&gt;
using Eco.Mods.TechTree;&lt;br /&gt;
using Eco.Shared.Localization;&lt;br /&gt;
using Eco.Shared.Serialization;&lt;br /&gt;
using System.Runtime.Versioning;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
&lt;br /&gt;
namespace WikiDemo&lt;br /&gt;
{&lt;br /&gt;
    #region Item&lt;br /&gt;
&lt;br /&gt;
    #region Recipe&lt;br /&gt;
    [RequiresSkill(typeof(CarpentrySkill), 3)]&lt;br /&gt;
    [Ecopedia(&amp;quot;Work Stations&amp;quot;, &amp;quot;Craft Tables&amp;quot;, subPageName: &amp;quot;Market Stall&amp;quot;)]&lt;br /&gt;
    public partial class MedievalStallRecipe : RecipeFamily&lt;br /&gt;
    {&lt;br /&gt;
        [SupportedOSPlatform(&amp;quot;windows7.0&amp;quot;)]&lt;br /&gt;
        public MedievalStallRecipe()&lt;br /&gt;
        {&lt;br /&gt;
            var recipe = new Recipe();&lt;br /&gt;
            recipe.Init(&lt;br /&gt;
                name: &amp;quot;MedievalStallItem&amp;quot;,&lt;br /&gt;
                displayName: Localizer.DoStr(&amp;quot;Market Stall&amp;quot;),&lt;br /&gt;
                ingredients: new List&amp;lt;IngredientElement&amp;gt;&lt;br /&gt;
                {&lt;br /&gt;
                    new IngredientElement(&amp;quot;Wood&amp;quot;, 40, typeof(Skill)),&lt;br /&gt;
                    new IngredientElement(typeof(CottonFabricItem), 30, typeof(Skill)),&lt;br /&gt;
                    new IngredientElement(typeof(HempMooringRopeItem), 5, true)&lt;br /&gt;
                },&lt;br /&gt;
                items: new List&amp;lt;CraftingElement&amp;gt;&lt;br /&gt;
                {&lt;br /&gt;
                    new CraftingElement&amp;lt;MedievalStallItem&amp;gt;(1)&lt;br /&gt;
                }&lt;br /&gt;
            );&lt;br /&gt;
            this.Recipes = new List&amp;lt;Recipe&amp;gt; { recipe };&lt;br /&gt;
            this.LaborInCalories = CreateLaborInCaloriesValue(800, typeof(Skill));&lt;br /&gt;
            this.CraftMinutes = CreateCraftTimeValue(typeof(MedievalStallRecipe), 10f, typeof(Skill));&lt;br /&gt;
    &lt;br /&gt;
            // Perform pre/post initialization for user mods and initialize our recipe instance with the display name &amp;quot;Market Stall&amp;quot;&lt;br /&gt;
            this.ModsPreInitialize();&lt;br /&gt;
            this.Initialize(displayText: Localizer.DoStr(&amp;quot;Market Stall&amp;quot;), recipeType: typeof(MedievalStallRecipe));&lt;br /&gt;
            this.ModsPostInitialize();&lt;br /&gt;
    &lt;br /&gt;
            // Register our RecipeFamily instance to a work table (in this case the Carpentry Table) so it can be crafted.&lt;br /&gt;
            CraftingComponent.AddRecipe(tableType: typeof(CarpentryTableObject), recipeFamily: this); // NOTE: The table must be the object instance!&lt;br /&gt;
        }&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
        /// &amp;lt;summary&amp;gt;Hook for other mods to customize RecipeFamily before initialization.&amp;lt;/summary&amp;gt;&lt;br /&gt;
        partial void ModsPreInitialize();&lt;br /&gt;
    &lt;br /&gt;
        /// &amp;lt;summary&amp;gt;Hook for other mods to customize RecipeFamily after initialization, but before registration. You can change skill requirements here.&amp;lt;/summary&amp;gt;&lt;br /&gt;
        partial void ModsPostInitialize();&lt;br /&gt;
    }&lt;br /&gt;
    #endregion&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Line 10:&#039;&#039;&#039; Eco will need this explicitly added to the file. Visual Studio will not add this line automatically. It&#039;s used for the &amp;lt;code&amp;gt;List&amp;lt;T&amp;gt;&amp;lt;/code&amp;gt; objects found in this code.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 14:&#039;&#039;&#039; &amp;quot;Collapsed&amp;quot; &amp;lt;code&amp;gt;Item&amp;lt;/code&amp;gt; section. See the earlier sections in this guide for the code that belongs there.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 17:&#039;&#039;&#039; Sets the required skill and skill level to craft this recipe.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 21:&#039;&#039;&#039; &amp;lt;code&amp;gt;[SupportedOSPlatform(&amp;quot;windows7.0&amp;quot;)]&amp;lt;/code&amp;gt; is here to silence some annoying warnings in Visual Studio. It&#039;s optional.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 30-32:&#039;&#039;&#039; Declares the input ingredients used for crafting. &amp;lt;code&amp;gt;typeof(Skill)&amp;lt;/code&amp;gt; gets mapped to the &amp;lt;code&amp;gt;CarpentrySkill&amp;lt;/code&amp;gt; as defined by line 31. In this example the &amp;lt;code&amp;gt;HempMooringRope&amp;lt;/code&amp;gt; is a static input. A static input will not be modified by skills, upgrade modules, or game settings. &#039;&#039;&#039;Note:&#039;&#039;&#039; It seems that at the time of writing (4/21/2026, Eco v13.0.2) the only way to get an ingredient to be a dynamic value that is reduced by the table&#039;s upgrade is to pass &amp;lt;code&amp;gt;typeof(Skill)&amp;lt;/code&amp;gt; to it; Passing either &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; makes the this input static.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 34:&#039;&#039;&#039; The &amp;lt;code&amp;gt;items&amp;lt;/code&amp;gt; list declares what items are &amp;lt;u&amp;gt;output&amp;lt;/u&amp;gt; by this recipe.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 36:&#039;&#039;&#039; This line declares that one medieval stall is output from this recipe. Functionally this links this recipe to the &amp;lt;code&amp;gt;MedievalStallItem&amp;lt;/code&amp;gt; (aka &amp;quot;Market Stall&amp;quot;) item created in the last step.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 40:&#039;&#039;&#039; Amount of calories needed to craft this item. For a static value (not modified by upgrades or skill levels) change this line to: &amp;lt;code&amp;gt;this.LaborInCalories = CreateLaborInCaloriesValue(800);&amp;lt;/code&amp;gt;. As it&#039;s written in the example, this item&#039;s calorie cost will be dynamic (modified by upgrades and skill levels). The skill level that will modify it is declared on line 16.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 41:&#039;&#039;&#039;  Minutes needed to craft. Both static and dynamic values for crafting time can be modified by the world difficulty settings. For a static value change this line to: &amp;lt;code&amp;gt;this.CraftMinutes = CreateCraftTimeValue(10f);&amp;lt;/code&amp;gt;. As it&#039;s written in the example, this item&#039;s craft time will be dynamic.&#039;&#039;&#039;Line 49:&#039;&#039;&#039; This line assigns the recipe to a workbench. &amp;lt;u&amp;gt;Do not assign&amp;lt;/u&amp;gt; to itself because then the first table could never be made. It&#039;s recommend to use a preexisting vanilla table.&lt;br /&gt;
=== Checkpoint ===&lt;br /&gt;
Check the functionality at this point -- it should be possible to see the recipe in the crafting table.&lt;br /&gt;
&lt;br /&gt;
# Have the &amp;lt;code&amp;gt;.unity3d&amp;lt;/code&amp;gt; and the &amp;lt;code&amp;gt;.cs&amp;lt;/code&amp;gt; file in the &amp;lt;code&amp;gt;/Eco Server/Mods/UserCode&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
# Start the server and log in.&lt;br /&gt;
# Type &amp;lt;code&amp;gt;/give Carpentry Table&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Place the Carpentry Table down and interact to see the what can be crafted.&lt;br /&gt;
# Scroll and find the &#039;&#039;Market Stall&#039;&#039; recipe.&lt;br /&gt;
# Type &amp;lt;code&amp;gt;/give Basic Upgrade 4&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Put the basic upgrade into the table.&lt;br /&gt;
# Go back to the recipe for the &#039;&#039;Market Stall&#039;&#039; and make sure the Wood and the Cotton fabric inputs now require less, but the Hemp Mooring Rope still is the same. &#039;&#039;&#039;Note:&#039;&#039;&#039; In case the recipe hasn&#039;t changed close that table&#039;s window and interact with it again. It should for the recipes to refresh now that the upgrade is in it.&lt;br /&gt;
&lt;br /&gt;
== Create the World Object ==&lt;br /&gt;
=== Preparing the 3D Asset ===&lt;br /&gt;
WIP. Below is &amp;lt;u&amp;gt;incorrect&amp;lt;/u&amp;gt;. The origin point of the object must be in the center, bottom of the object. Instructions for reference cube moving and origin moving will produce bad results!&lt;br /&gt;
# Open &amp;lt;u&amp;gt;Blender&amp;lt;/u&amp;gt;.&lt;br /&gt;
# Load the 3D object created earlier for icon rendering -- &amp;lt;code&amp;gt;Assets/WikiDemo/MedievalStall - Icon Scene.blend&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Cleanup the scene...&lt;br /&gt;
## Use the scene collection panel on the top-right side of the screen. Select and &#039;&#039;&#039;delete any light source&#039;&#039;&#039;. These will have a 💡 icon and by default are named something like &amp;quot;sun&amp;quot;, &amp;quot;point&amp;quot;, &amp;quot;spot&amp;quot; or &amp;quot;area&amp;quot;. &#039;&#039;&#039;Note:&#039;&#039;&#039; If your model is a light source or has one in it, you can leave that light source. The point here is to remove the ambient lights used for icon rendering.&lt;br /&gt;
## In the scene collection panel, select and &#039;&#039;&#039;delete any camera(s)&#039;&#039;&#039;. These have a 🎥 icon and by default are named something like &amp;quot;camera&amp;quot;.&lt;br /&gt;
# &amp;lt;u&amp;gt;If there are multiple different 3D assets in the scene&amp;lt;/u&amp;gt; (like bags, crates, jars, ect.), join them all together...&lt;br /&gt;
## Select all of the meshes by holding &#039;&#039;Shift&#039;&#039; and clicking on each one in the &#039;&#039;Scene Collection&#039;&#039; panel (right side of window). &#039;&#039;&#039;Tip:&#039;&#039;&#039; Quickly select a group of them by selecting one near the top. Then hold &#039;&#039;Shift&#039;&#039;, &#039;&#039;Ctrl,&#039;&#039; and click on one near the bottom. This will both the one at the top and the one at the bottom, but also every item in between. Neat!&lt;br /&gt;
## Be in &#039;&#039;Layout&#039;&#039; mode (top toolbar).&lt;br /&gt;
## Find and open the &#039;&#039;Object&#039;&#039; menu (second toolbar down from the top).&lt;br /&gt;
## Select &#039;&#039;Join&#039;&#039;.&lt;br /&gt;
## In the &#039;&#039;Scene Collection&#039;&#039; panel, double click on the name of the newly joined mesh.&lt;br /&gt;
## Rename it to &amp;lt;code&amp;gt;MedievalStallMesh&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Add and position a reference cube...&lt;br /&gt;
## Make sure the editor is in &#039;&#039;Layout&#039;&#039; view (top toolbar).&lt;br /&gt;
## Then, add a reference cube. Open the &#039;&#039;Add&#039;&#039; menu (second top toolbar down).&lt;br /&gt;
## Hover &#039;&#039;Mesh&#039;&#039;.&lt;br /&gt;
## Select &#039;&#039;Cube.&#039;&#039;&lt;br /&gt;
## Find the &#039;&#039;Properties&#039;&#039; panel. It&#039;s just below the &#039;&#039;Scene Collection&#039;&#039; panel on the right side of the window.&lt;br /&gt;
## Now, still inside that panel but on the left side of it there&#039;s a column of icons.&lt;br /&gt;
## Hover them to see their names.&lt;br /&gt;
## Find the one that reads:  &#039;&#039;Object&#039;&#039;  &#039;&#039;Object Properties&#039;&#039;  &#039;&#039;&#039;Tip:&#039;&#039;&#039; It kinda looks like an orange box&lt;br /&gt;
## Find and expand the &#039;&#039;Transform&#039;&#039; section&lt;br /&gt;
## Set &#039;&#039;Location X&#039;&#039; to &#039;&#039;1&#039;&#039;.&lt;br /&gt;
## Just below that, set &#039;&#039;Y&#039;&#039; to &#039;&#039;1&#039;&#039;.&lt;br /&gt;
## Just below that, again, set &#039;&#039;Z&#039;&#039; to &#039;&#039;1&#039;&#039;.&lt;br /&gt;
## The bottom corner of the cube will be touching the green and red axis lines.&lt;br /&gt;
# Move the reference cube&#039;s origin to &amp;lt;code&amp;gt;(0, 0, 0)&amp;lt;/code&amp;gt;...&lt;br /&gt;
## Be in &#039;&#039;Layout&#039;&#039; mode (top toolbar).&lt;br /&gt;
## Open the &#039;&#039;View&#039;&#039; menu (second toolbar down).&lt;br /&gt;
## Select &#039;&#039;Sidebar&#039;&#039;.&lt;br /&gt;
## A new panel will have expanded.&lt;br /&gt;
## Along the right side of that panel there&#039;s buttons (&#039;&#039;Item, Tool, View, Animation&#039;&#039;). Find and click the &#039;&#039;View&#039;&#039; button.&lt;br /&gt;
## Find and expand the &#039;&#039;3D Cursor&#039;&#039; section.&lt;br /&gt;
## Under &#039;&#039;Location&#039;&#039; set &#039;&#039;X&#039;&#039; to &#039;&#039;0&#039;&#039;.&lt;br /&gt;
## &#039;&#039;Y&#039;&#039; to 0.&lt;br /&gt;
## &#039;&#039;Z&#039;&#039; to 0.&lt;br /&gt;
## Now in the &#039;&#039;Scene Collection&#039;&#039; panel, select the &#039;&#039;Cube&#039;&#039; mesh.&lt;br /&gt;
## Open the &#039;&#039;Object&#039;&#039; menu from the second toolbar down from the top.&lt;br /&gt;
## Hover &#039;&#039;Set Origin&#039;&#039;.&lt;br /&gt;
## Select &#039;&#039;Origin to 3D Cursor&#039;&#039;.&lt;br /&gt;
# Set the reference cube&#039;s dimensions...&lt;br /&gt;
## Be in &#039;&#039;Layout&#039;&#039; mode, open the &#039;&#039;View&#039;&#039; menu (second toolbar down), and select and expand the &#039;&#039;Sidebar&#039;&#039; option&#039;&#039;.&#039;&#039;&lt;br /&gt;
## To the right of the sidebar, find and click the &#039;&#039;Item&#039;&#039; button.&lt;br /&gt;
## Expand the &#039;&#039;Transform&#039;&#039; section.&lt;br /&gt;
## Find the &#039;&#039;Dimensions,&#039;&#039; and set &#039;&#039;X&#039;&#039; to &#039;&#039;4&#039;&#039;.&lt;br /&gt;
## &#039;&#039;Y&#039;&#039; to &#039;&#039;3&#039;&#039;.&lt;br /&gt;
## &#039;&#039;Z&#039;&#039; to &#039;&#039;3&#039;&#039;.  &#039;&#039;&#039;Note:&#039;&#039;&#039; These dimensions only make sense for the asset being used for this guide. If using a different one, set the dimensions to the size of the box that model should fit in&lt;br /&gt;
# Adjust the position and scale to fit inside a box. This is important because it ensures that this object won&#039;t clip into other objects when placed.&lt;br /&gt;
## Be in &#039;&#039;Layout&#039;&#039; mode (top toolbar).&lt;br /&gt;
## Find the drop down in the second toolbar from the top that has options like &#039;&#039;Object Mode, Edit Mode, Sculpt Mode,&#039;&#039; etc.&lt;br /&gt;
## Select &#039;&#039;Object Mode&#039;&#039; from that drop down.&lt;br /&gt;
## On the left side of the screen there&#039;s a column of icons. Hover over them to see their names.&lt;br /&gt;
## Select the &#039;&#039;Move&#039;&#039; tool.&lt;br /&gt;
## Click on the Medieval Stall to select it. Zoom out and reposition the camera so that the blue, green, and red arrows are visible.  &#039;&#039;&#039;Tip:&#039;&#039;&#039; By holding the middle-mouse button and dragging the scene will rotate. By holding the middle-mouse button and the &#039;&#039;Shift&#039;&#039; key, the scene will pan.  &#039;&#039;&#039;Tip:&#039;&#039;&#039; If panning or rotating the scene becomes slow or frustrating (especially after zooming), try selecting 3D asset from the &#039;&#039;Scene Collection&#039;&#039; panel, opening the &#039;&#039;View&#039;&#039; menu (second toolbar from top), and selecting &#039;&#039;Frame Selected&#039;&#039;. This will reset the view onto that object and controls should feel normal again.&lt;br /&gt;
## Click and hold one of the arrows. Move the mouse to drag the 3D asset towards the box.&lt;br /&gt;
## Move the 3D asset around till it&#039;s &amp;lt;u&amp;gt;completely inside the box&amp;lt;/u&amp;gt;. If it cannot fit and is too big, continue to the next step.  &#039;&#039;&#039;Tip:&#039;&#039;&#039; To select the 3D asset once it disappears, use the &#039;&#039;Scene Collection&#039;&#039; panel. Click on it there and the blue, green, and red arrows will show up again for it.   &#039;&#039;&#039;Tip:&#039;&#039;&#039; There are preset views. To use them go to the &#039;&#039;View&#039;&#039; menu (second toolbar from top)&#039;&#039;,&#039;&#039; hover &#039;&#039;Viewpoint&#039;&#039;, and select the view that would be most helpful.&lt;br /&gt;
## Find the &#039;&#039;Scale&#039;&#039; tool from the left side of the screen.&lt;br /&gt;
## Now the blue, green, and red &amp;quot;arrows&amp;quot; don&#039;t really look like arrows anymore. They are lines with boxes at the end.&lt;br /&gt;
## Click and hold on those lines to adjust the scale of the 3D asset to make it fit inside the box.  &#039;&#039;&#039;Tip:&#039;&#039;&#039; There are little colored boxes in between the lines that can be dragged to scale the 3D asset more proportionally.&lt;br /&gt;
## Continue using the &#039;&#039;Move&#039;&#039; and &#039;&#039;Scale&#039;&#039; tools till the model fits. This will take patience and time.  &#039;&#039;&#039;Tip:&#039;&#039;&#039; Hide the reference cube to see what is happening with the 3D asset. Go to the &#039;&#039;Scene Collections&#039;&#039; panel and click the 👁 button to hide it. Click that button again to show it.&lt;br /&gt;
# Now set the 3D asset&#039;s origin point... &amp;lt;!-- I still need to determine where the origin point should be based on occupancy code. --&amp;gt;&lt;br /&gt;
## Ensure that the 3D Cursor is still at &amp;lt;code&amp;gt;(0,0,0)&amp;lt;/code&amp;gt;: Open the &#039;&#039;View&#039;&#039; menu (second toolbar down), select and expand the &#039;&#039;Sidebar&#039;&#039;, click the &#039;&#039;View&#039;&#039; button (right side of the Sidebar), find and expand the &#039;&#039;3D cursor&#039;&#039; section, change the &#039;&#039;Location X, Y,&#039;&#039; and &#039;&#039;Z&#039;&#039; to &#039;&#039;0&#039;&#039;.&lt;br /&gt;
## Select the 3D asset using the &#039;&#039;Scene Collection&#039;&#039; panel.&lt;br /&gt;
## Open the &#039;&#039;Object&#039;&#039; menu (second toolbar down).&lt;br /&gt;
## Hover &#039;&#039;Set Origin&#039;&#039;.&lt;br /&gt;
## Select &#039;&#039;Origin to 3D Cursor&#039;&#039;.&lt;br /&gt;
# Select the reference cube from the &#039;&#039;Scene Collections&#039;&#039; panel.&lt;br /&gt;
# Open &#039;&#039;Object&#039;&#039; menu (second toolbar down).&lt;br /&gt;
# Select &#039;&#039;Delete&#039;&#039;.&lt;br /&gt;
# Open the &#039;&#039;Object&#039;&#039; menu.&lt;br /&gt;
# Hover &#039;&#039;Apply&#039;&#039;.&lt;br /&gt;
# Select &#039;&#039;All Transformations&#039;&#039;. &#039;&#039;&#039;TODO:&#039;&#039;&#039; Ensure this step doesn&#039;t alter the origin now that it&#039;s being place in bottom-center, 0.5m off ground&lt;br /&gt;
# Open the &#039;&#039;File&#039;&#039;  menu from the top toolbar.&lt;br /&gt;
# Hover &#039;&#039;Export&#039;&#039; to open the sub-menu.&lt;br /&gt;
# Select &#039;&#039;FBX (.fbx)&#039;&#039; &lt;br /&gt;
# A &#039;&#039;Blender File View&#039;&#039; window will pop-up.&lt;br /&gt;
# On the right side of this window there&#039;s a ⚙️ icon. Click it to expand the settings region.&lt;br /&gt;
# In the expanded region find the &#039;&#039;Include&#039;&#039; section and expand it. Change the following:&lt;br /&gt;
## Find &#039;&#039;Object Types&#039;&#039; and only select &#039;&#039;Mesh.&#039;&#039; No other option should be highlighted for this setting.&lt;br /&gt;
# In the settings region scroll and find the &#039;&#039;Transform&#039;&#039; section and expand it. Change the following:&lt;br /&gt;
## Find &#039;&#039;Apply Scalings&#039;&#039; and set it to &#039;&#039;FBX All&#039;&#039;.&lt;br /&gt;
## Just below that find &#039;&#039;Forward&#039;&#039; and set it to &#039;&#039;-Z Forward&#039;&#039;.&lt;br /&gt;
## Ensure that the next setting down, &#039;&#039;Up&#039;&#039;, changed to &#039;&#039;Y Up&#039;&#039;.&lt;br /&gt;
## Find &#039;&#039;Apply Unit&#039;&#039; and make sure it&#039;s checked.&lt;br /&gt;
## Next, find &#039;&#039;Use Space Transform&#039;&#039; check it.&lt;br /&gt;
## Lastly, find &#039;&#039;Apply Transform&#039;&#039; and check it too.&lt;br /&gt;
# Save it to &amp;lt;code&amp;gt;Assets/WikiDemo/MedievalStall.fbx&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Save the &amp;lt;code&amp;gt;.blend&amp;lt;/code&amp;gt; file too and close Blender.&lt;br /&gt;
&lt;br /&gt;
=== Add to Unity Scene ===&lt;br /&gt;
&lt;br /&gt;
# Open &amp;lt;u&amp;gt;Unity&amp;lt;/u&amp;gt;.&lt;br /&gt;
# Select the &amp;lt;code&amp;gt;.fbx&amp;lt;/code&amp;gt; file in the project window.&lt;br /&gt;
# Open the &#039;&#039;Eco Tools&#039;&#039; menu from the top toolbar.&lt;br /&gt;
# Hover &#039;&#039;Mod Kit&#039;&#039;.&lt;br /&gt;
# Select &#039;&#039;World Object Setup.&#039;&#039;&lt;br /&gt;
# A &#039;&#039;World Object Setup&#039;&#039;  window will pop-up.&lt;br /&gt;
# Make sure that &#039;&#039;Selected Objects&#039;&#039; reads &#039;&#039;MedievalStall.&#039;&#039;&lt;br /&gt;
# Also make sure that &#039;&#039;World Object Type&#039;&#039; is set to &#039;&#039;World Object&#039;&#039;.&lt;br /&gt;
# Press the &#039;&#039;Setup World Objects&#039;&#039; button.&lt;br /&gt;
# Notice in the project window that a new &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt; file was created -- &amp;lt;code&amp;gt;MedievalStallObject.prefab&amp;lt;/code&amp;gt;&lt;br /&gt;
# Select the &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt; file in the project window.&lt;br /&gt;
# In the &#039;&#039;Inspector&#039;&#039; window (right side), scroll and find the &#039;&#039;World Object (Script)&#039;&#039; component.&lt;br /&gt;
# In that component, find the &#039;&#039;Override Occupancy&#039;&#039; checkbox and check it.&lt;br /&gt;
# A new field just appeared, &#039;&#039;Size&#039;&#039;.&lt;br /&gt;
# Set the &#039;&#039;X&#039;&#039; to &#039;&#039;4&#039;&#039;.&lt;br /&gt;
# &#039;&#039;Y&#039;&#039; to &#039;&#039;3&#039;&#039;.&lt;br /&gt;
# &#039;&#039;Z&#039;&#039; to &#039;&#039;3.&#039;&#039; &#039;&#039;&#039;Note:&#039;&#039;&#039; These are the sizes used for the reference cube. If using different sizes make sure you &amp;lt;u&amp;gt;flip the Y and Z coordinates&amp;lt;/u&amp;gt; when reading coordinates from Blender. Blender uses a different coordinate system that Unity!&lt;br /&gt;
# Select &#039;&#039;Objects&#039;&#039; from &#039;&#039;Hierarchy&#039;&#039; panel.&lt;br /&gt;
# Find the &#039;&#039;Modkit Prefab Container (Script)&#039;&#039; component.&lt;br /&gt;
# Expand the &#039;&#039;Prefabs&#039;&#039; section in that component.&lt;br /&gt;
# Click the &#039;&#039;+&#039;&#039; button to add an item to the list.&lt;br /&gt;
# Either...&lt;br /&gt;
## Click the &#039;&#039;⦿&#039;&#039; button, switch to the &#039;&#039;Assets&#039;&#039; tab, find or search for &#039;&#039;MedievalStallObject&#039;&#039;, and double click on it. Make sure it&#039;s the medieval stall &amp;lt;u&amp;gt;object&amp;lt;/u&amp;gt; with the &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt; ending.&lt;br /&gt;
## Drag the &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt; file onto the &#039;&#039;⦿&#039;&#039; button&lt;br /&gt;
# &lt;br /&gt;
# Open the &#039;&#039;File&#039;&#039; menu from top toolbar and select &#039;&#039;Save&#039;&#039;.  &#039;&#039;&#039;Note:&#039;&#039;&#039; Do not skip. The scene must be saved for the ModKit build to work properly.&lt;br /&gt;
# Open the &#039;&#039;Eco Tools&#039;&#039; menu from the top toolbar.&lt;br /&gt;
# Hover &#039;&#039;Mod Kit&#039;&#039;.&lt;br /&gt;
# Select &#039;&#039;Build Current Bundle&#039;&#039;.&lt;br /&gt;
# Save the bundle to &amp;lt;code&amp;gt;/Eco Server/Mods/UserCode/WikiDemo.unity3d&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TODO:&#039;&#039;&#039; Explain that if the orgin point isn&#039;t at the bottom-left corner of the model, then &#039;&#039;World Object (Script) &amp;gt; Occupancy Offset&#039;&#039; will need adjusted manually.&lt;br /&gt;
&lt;br /&gt;
=== Scripting the World Object ===&lt;br /&gt;
Code that links the Item to this World Object.&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
using Eco.Core.Items;&lt;br /&gt;
using Eco.Gameplay.Components;&lt;br /&gt;
using Eco.Gameplay.Items;&lt;br /&gt;
using Eco.Gameplay.Items.Recipes;&lt;br /&gt;
using Eco.Gameplay.Objects;&lt;br /&gt;
using Eco.Gameplay.Skills;&lt;br /&gt;
using Eco.Mods.TechTree;&lt;br /&gt;
using Eco.Shared.Localization;&lt;br /&gt;
using Eco.Shared.Serialization;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Runtime.Versioning;&lt;br /&gt;
using System;&lt;br /&gt;
&lt;br /&gt;
namespace WikiDemo&lt;br /&gt;
{&lt;br /&gt;
    #region Item&lt;br /&gt;
    [Serialized] // Tells the save/load system this object needs to be serialized.&lt;br /&gt;
    [LocDisplayName(&amp;quot;Market Stall&amp;quot;)] // Defines the localized name of the item.&lt;br /&gt;
    [Weight(100)] // Defines how heavy Arrow is.&lt;br /&gt;
    [Ecopedia(&amp;quot;Work Stations&amp;quot;, &amp;quot;Craft Tables&amp;quot;, createAsSubPage: true)]&lt;br /&gt;
    [LocDescription(&amp;quot;A medieval market stall.&amp;quot;)] //The tooltip description for the item.&lt;br /&gt;
    public partial class MedievalStallItem : WorldObjectItem&amp;lt;MedievalStallObject&amp;gt; { }&lt;br /&gt;
    #endregion&lt;br /&gt;
&lt;br /&gt;
    #region Recipe&lt;br /&gt;
&lt;br /&gt;
    #region Object&lt;br /&gt;
    [Serialized]&lt;br /&gt;
    public partial class MedievalStallObject : WorldObject, IRepresentsItem&lt;br /&gt;
    {&lt;br /&gt;
        public Type RepresentedItemType =&amp;gt; typeof(MedievalStallItem);&lt;br /&gt;
    }&lt;br /&gt;
    #endregion&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Line 22:&#039;&#039;&#039; This changes from implementing &amp;lt;code&amp;gt;Item&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;WorldObjectItem&amp;lt;MedievalStallObject&amp;gt;&amp;lt;/code&amp;gt;. This is what gives the item the ability to place the table down in the world.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 25:&#039;&#039;&#039; The &amp;quot;collapsed&amp;quot; Recipe section. See earlier sections in this guide to see what code belongs here.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 29:&#039;&#039;&#039; Declares the &amp;lt;code&amp;gt;MedievalStallObject&amp;lt;/code&amp;gt;. It&#039;s important that this class name is matches exactly the &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt; file name because the name is what links them.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 31:&#039;&#039;&#039; This line is similar in function to line 22, it&#039;s declaring that this &amp;lt;code&amp;gt;MedievalStallObject&amp;lt;/code&amp;gt; is &amp;lt;code&amp;gt;MedievalStallItem&amp;lt;/code&amp;gt; when in inventories.&lt;br /&gt;
&lt;br /&gt;
=== Checkpoint ===&lt;br /&gt;
Export and see what it does. Ensure it&#039;s not lifting off the ground because of a non-curved shader.&lt;br /&gt;
&lt;br /&gt;
==== Origin Point Editing ====&lt;br /&gt;
Talk about what it does: the point that the simulation considers this world object to be at.&lt;br /&gt;
&lt;br /&gt;
Show how to move it around using blender.&lt;br /&gt;
&lt;br /&gt;
== Final Export ==&lt;br /&gt;
Export.&lt;br /&gt;
&lt;br /&gt;
Package.&lt;br /&gt;
&lt;br /&gt;
Distribute.&lt;/div&gt;</summary>
		<author><name>WugWugg</name></author>
	</entry>
	<entry>
		<id>https://wiki.play.eco/en/index.php?title=From_3D_Asset_to_Working_Worktable&amp;diff=16732</id>
		<title>From 3D Asset to Working Worktable</title>
		<link rel="alternate" type="text/html" href="https://wiki.play.eco/en/index.php?title=From_3D_Asset_to_Working_Worktable&amp;diff=16732"/>
		<updated>2026-04-27T04:56:42Z</updated>

		<summary type="html">&lt;p&gt;WugWugg: Added warning about WIP section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction =&lt;br /&gt;
Below is a guide on how to take an 3D asset from the Unity Store and make a working workbench in Eco. This includes:&lt;br /&gt;
* Creating a recipe to craft the modded table&lt;br /&gt;
* Creating recipes so the player can use the modded table to craft something&lt;br /&gt;
* Using Blender to generate a modded icon (seen when holding it in inventory)&lt;br /&gt;
* Using Blender to adjust the origin point of the model&lt;br /&gt;
* How to setup all this in a Unity scene and package for Eco&lt;br /&gt;
&lt;br /&gt;
= Setup =&lt;br /&gt;
&lt;br /&gt;
* Already have setup &#039;&#039;&#039;ModKit + Unity&#039;&#039;&#039;&lt;br /&gt;
** See: [[Installing the ModKit]]&lt;br /&gt;
* Have a &#039;&#039;&#039;3D model&#039;&#039;&#039;&lt;br /&gt;
** Just following along? Find the one used here at &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://assetstore.unity.com/packages/3d/props/low-poly-medieval-market-stalls-314286&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* A &#039;&#039;&#039;C# IDE&#039;&#039;&#039; (notepad++, Visual Studio, etc.)&lt;br /&gt;
** Highly encouraged to have an Intellisense setup and linked to the &#039;&#039;&#039;Reference Assemblies&#039;&#039;&#039;. Optional, but its really worth the time to figure out because it will help quickly correct small typos and trivial mistakes.&lt;br /&gt;
** See: [[Getting Started with Eco Modding in Visual Studio 2022]] (generally the same steps apply if using a new version of Visual Studio)&lt;br /&gt;
* &#039;&#039;&#039;Blender&#039;&#039;&#039; installed&lt;br /&gt;
** Homepage: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://www.blender.org/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Importing the Assets ==&lt;br /&gt;
&lt;br /&gt;
# Open the Unity editor to the project.&lt;br /&gt;
# From the top toolbar open the &#039;&#039;Window&#039;&#039; drop down.&lt;br /&gt;
# Hover &#039;&#039;Package Management&#039;&#039; to open sub-menu.&lt;br /&gt;
# Select &#039;&#039;Package Manager&#039;&#039;.&lt;br /&gt;
# The &#039;&#039;Package Manager&#039;&#039; window will pop-up.&lt;br /&gt;
# Install the package containing the assets you want to use...&lt;br /&gt;
## &amp;lt;u&amp;gt;If not using Unity Registry&amp;lt;/u&amp;gt;...&lt;br /&gt;
### Find the &#039;&#039;+▾&#039;&#039; button in the top left and open the drop down.&lt;br /&gt;
### Install the package from one of those options.&lt;br /&gt;
## &amp;lt;u&amp;gt;If using Unity Registry&amp;lt;/u&amp;gt;...&lt;br /&gt;
### Visit &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://assetstore.unity.com&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; and sign in.&lt;br /&gt;
### Search for the asset desired.&lt;br /&gt;
### Go to it&#039;s page (e.g. &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://assetstore.unity.com/packages/3d/props/low-poly-medieval-market-stalls-314286&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;) and click the big blue button, &#039;&#039;Add to My Assets.&#039;&#039;&lt;br /&gt;
### Now, in the Unity editor and back at the &#039;&#039;Package Manager&#039;&#039; window.&lt;br /&gt;
### Find &#039;&#039;My Assets&#039;&#039; on the left menu and navigate to it.&lt;br /&gt;
### Click the &#039;&#039;⟳&#039;&#039; button in the lower-right.&lt;br /&gt;
### The asset should be in the list now. Use the search to filter if needed.&lt;br /&gt;
### Click on the asset in the list. For those following along, &#039;&#039;Low Poly Medieval Market Stalls&#039;&#039;.&lt;br /&gt;
### In the right panel, find the &#039;&#039;Download ⤓&#039;&#039; button. Click it.&lt;br /&gt;
### Once downloaded, a new button should show up, it&#039;ll say something like &#039;&#039;⊕ Import 1.0 to project&#039;&#039; . Click it.&lt;br /&gt;
### The &#039;&#039;Import Unity Package&#039;&#039; window will pop-up.&lt;br /&gt;
### Select &#039;&#039;Import&#039;&#039; on it.&lt;br /&gt;
# Verify you can find your assets from the explorer. If following along, the assets are at &amp;lt;code&amp;gt;Assets/PolyRonin/Medieval Market Stalls&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Load in a demo scene, if provided, and make sure everything looks okay.&lt;br /&gt;
## For those following along, double click on the &#039;&#039;Demo&#039;&#039; scene at &amp;lt;code&amp;gt;Assets/PolyRonin/Medieval Market Stalls/Demo.unity&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:Eco - Unity - View Modes.png|thumb|Underlined in red are the different draw mode buttons. &amp;lt;u&amp;gt;4/20/26&amp;lt;/u&amp;gt;]]&lt;br /&gt;
If something seems off, check the different draw modes and see if changing those allow the scene to render as expected (see picture).&lt;br /&gt;
&lt;br /&gt;
With all that setup, it&#039;s time to get to the creation parts.&lt;br /&gt;
&lt;br /&gt;
= Creating The Worktable =&lt;br /&gt;
This guide will create the worktable in this order:&lt;br /&gt;
&lt;br /&gt;
# Create the item that represents the worktable&lt;br /&gt;
# Make a recipe to craft the worktable item&lt;br /&gt;
# Make the worktable item something that places a world object&lt;br /&gt;
# Give the worktable functionality by adding recipes to it&lt;br /&gt;
&lt;br /&gt;
== Creating the Item ==&lt;br /&gt;
&lt;br /&gt;
=== Item Icon ===&lt;br /&gt;
[[File:TeamstersStall - StallOnly - 256x256.png|thumb|A large (256x256px) icon created of Stall4 from the medieval assets.]]&lt;br /&gt;
This process is also explained here, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://mod.io/g/eco/r/origin-points-icon-images-with-blender&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, check it out if you need more visual reference points as that guide has a lot of pictures.&lt;br /&gt;
&lt;br /&gt;
# Open &amp;lt;u&amp;gt;Blender&amp;lt;/u&amp;gt;.&lt;br /&gt;
# Delete everything in the &#039;&#039;Scene Collection&#039;&#039;. Find this section in the top-right of the application.&lt;br /&gt;
# From the top toolbar, open the &#039;&#039;File&#039;&#039; drop down.&lt;br /&gt;
# Hover &#039;&#039;Import&#039;&#039; to open the sub-menu.&lt;br /&gt;
# Select the type of 3D asset. For those using medieval assets, select &#039;&#039;FBX (.fbx)&#039;&#039;.&lt;br /&gt;
# Find the asset on the computer...&lt;br /&gt;
## Tip: Use Unity to find the &amp;lt;code&amp;gt;.fbx&amp;lt;/code&amp;gt; asset. For the medieval assets, that&#039;s in &amp;lt;code&amp;gt;Assets/PolyRonin/Medieval Market Stalls/Meshes/medieval-market-stalls-1.fbx&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Right click on it and select &#039;&#039;Show in explorer&#039;&#039;.&lt;br /&gt;
## Now copy the address of that folder from Explorer. It might look like &amp;lt;code&amp;gt;C:\Users\Wug\EcoMod--WikiDemo\WikiDemo\Assets\PolyRonin\Medieval Market Stalls\Meshes&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Paste that in the address bar of the &amp;lt;u&amp;gt;Blender&amp;lt;/u&amp;gt; import pop-up.&lt;br /&gt;
# Select the blue &#039;&#039;Import FBX&#039;&#039; button&#039;&#039;.&#039;&#039;&lt;br /&gt;
# From &#039;&#039;Layout&#039;&#039; mode, change the Viewport Shading to Material Preview or Rendered. This is on the second toolbar down, far right of center, but before &#039;&#039;Scene Collection&#039;&#039; section.&lt;br /&gt;
# If you see purple models, Blender will need help finding textures for these meshes...&lt;br /&gt;
## From the top toolbar, open the &#039;&#039;File&#039;&#039; drop down.&lt;br /&gt;
## Hover &#039;&#039;External Data&#039;&#039; to open the sub-menu.&lt;br /&gt;
## Select &#039;&#039;Find Missing Files...&#039;&#039;&lt;br /&gt;
## Point this to the whole directory that the 3D assets came in. For the medieval pack, &amp;lt;code&amp;gt;C:\Users\&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;Wug\EcoMod--WikiDemo\WikiDemo\Assets\PolyRonin&amp;lt;/code&amp;gt;.&lt;br /&gt;
## The proper textures/materials should have now loaded in. If it hasn&#039;t, consult Google because without the textures the following steps won&#039;t produce a usable icon.&lt;br /&gt;
# Add a source of light...&lt;br /&gt;
## Make sure the editor is in the &#039;&#039;Layout&#039;&#039; mode by checking the top most toolbar.&lt;br /&gt;
## From the toolbar just under that one, find and open the &#039;&#039;Add&#039;&#039; drop down.&lt;br /&gt;
## Hover &#039;&#039;Light&#039;&#039; to open that sub-menu.&lt;br /&gt;
## Click &#039;&#039;Sun&#039;&#039;.&lt;br /&gt;
# Add a camera...&lt;br /&gt;
## Again make sure the editor is in the &#039;&#039;Layout&#039;&#039; mode.&lt;br /&gt;
## From the second toolbar down, find and open the &#039;&#039;Add&#039;&#039; drop down.&lt;br /&gt;
## Select &#039;&#039;Camera&#039;&#039;.&lt;br /&gt;
# Setup the scene with the object placement and lighting direction desired.  &#039;&#039;&#039;Tip:&#039;&#039;&#039; To reset the editor to something selected press the period key &amp;lt;u&amp;gt;on the numpad&amp;lt;/u&amp;gt;. Without a numpad, use &#039;&#039;View&#039;&#039; (second toolbar from the top) and select &#039;&#039;Frame Selected&#039;&#039; from it. Alternatively, just set the zoom to zoom to the mouse position: &#039;&#039;Edit&#039;&#039; (top toolbar), &#039;&#039;Preferences&#039;&#039; (from drop down), &#039;&#039;Navigation&#039;&#039; (on left menu), &#039;&#039;Zoom to Mouse Position&#039;&#039; (In the zoom section). This makes moving around a lot more natural feeling.&lt;br /&gt;
# Setup the rendering camera...&lt;br /&gt;
## Go to &#039;&#039;Rendering&#039;&#039;  tab on the top toolbar&lt;br /&gt;
## On the right there will be a side-panel open, it should be the &#039;&#039;Render&#039;&#039; tab. Confirm that.&lt;br /&gt;
## Change &#039;&#039;Render Engine&#039;&#039; to &#039;&#039;Cycles&#039;&#039;.&lt;br /&gt;
## Look down below in the same tab for the &#039;&#039;Film&#039;&#039; section.&lt;br /&gt;
## Expand it and find the &#039;&#039;Transparent&#039;&#039; checkbox and section. Click it so that it has a check mark. This will make the icon&#039;s background transparent.&lt;br /&gt;
## Now, go to the &#039;&#039;Output&#039;&#039; tab &amp;lt;u&amp;gt;on the side panel&amp;lt;/u&amp;gt;. The tab is just below the current one.&lt;br /&gt;
## In the &#039;&#039;Format&#039;&#039; section set &#039;&#039;Resolution X&#039;&#039; to &#039;&#039;64.&#039;&#039; And &#039;&#039;Y&#039;&#039; to &#039;&#039;64&#039;&#039; as well. This will make the icon generated a 64 by 64 pixel image.&lt;br /&gt;
# Go back to the &#039;&#039;Layout&#039;&#039; tab from the top toolbar.&lt;br /&gt;
# Center your view on the object (numpad period or &#039;&#039;View &amp;gt; Frame Selected&#039;&#039;). Adjust it so that the object is how it should be for the icon.&lt;br /&gt;
# Align the camera to the view...&lt;br /&gt;
## Make sure the editor is in &#039;&#039;Layout&#039;&#039; mode (top toolbar).&lt;br /&gt;
## Find &#039;&#039;View&#039;&#039; from the second from the top toolbar and open the drop down.&lt;br /&gt;
## Hover &#039;&#039;Align View&#039;&#039; to open the sub-menu.&lt;br /&gt;
## Select &#039;&#039;Align Active Camera To View&#039;&#039;.&lt;br /&gt;
## If the view is slightly off, there is a lock icon on the right side of this panel. Use it to &amp;quot;lock&amp;quot; controls to the camera and tweak it&#039;s view.&lt;br /&gt;
# Now return to the &#039;&#039;Rendering&#039;&#039; tab from the top toolbar.&lt;br /&gt;
# Press the F12 key to start the render. This should complete quickly since 64x64 pixels is a very small render.&lt;br /&gt;
# A window should popup, &#039;&#039;Blender Render&#039;&#039;. This is the icon!&lt;br /&gt;
# From the top tool bar of this &#039;&#039;Blender Render&#039;&#039; window, open the &#039;&#039;Image&#039;&#039; drop down.&lt;br /&gt;
# Select &#039;&#039;Save As...&#039;&#039; to save somewhere on the computer.&lt;br /&gt;
# Return to step 13 and repeat to do larger images if desired. Create a 128 by 128 pixel image too. It will make things smoother later.&lt;br /&gt;
# Save the Blender scene. Not only will it be used later, this will make making a new icon with a small tweak that much easier.&lt;br /&gt;
## &#039;&#039;File&#039;&#039; drop down from top toolbar.&lt;br /&gt;
## &#039;&#039;Save As...&#039;&#039; to save the Blender scene to the computer.&lt;br /&gt;
## Save it to &amp;lt;code&amp;gt;Assets/WikiDemo/MedievalStall - Icon Scene.blend&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Adding to Unity Scene ===&lt;br /&gt;
The developers explain how to create an item in one of ModKit&#039;s read me files (See: &amp;lt;code&amp;gt;Assets/EcoModKit/Docs/README.md&amp;lt;/code&amp;gt;), but this guide will explain it below.&lt;br /&gt;
&lt;br /&gt;
Additionally, &#039;&#039;&#039;TheKye&#039;&#039;&#039; on YouTube covers this in their &#039;&#039;Creating Your First Item&#039;&#039; and &#039;&#039;Creating Your First Item Pt 2&#039;&#039; videos.&lt;br /&gt;
&lt;br /&gt;
Use those additional resource to help troubleshoot issues with item&#039;s icons.&lt;br /&gt;
&lt;br /&gt;
# Open &amp;lt;u&amp;gt;Unity&amp;lt;/u&amp;gt;.&lt;br /&gt;
# In the left panel, the &#039;&#039;Hierarchy&#039;&#039; tab should be selected.&lt;br /&gt;
# Select the top-most object there. It should be a scene. If the editor last loaded the &#039;&#039;Demo&#039;&#039; scene from the medieval assets, it&#039;ll be named &#039;&#039;Demo&#039;&#039;.&lt;br /&gt;
# Right click on this scene and select &#039;&#039;Add New Scene&#039;&#039; from the menu.&lt;br /&gt;
# Right click again on the old scene (&#039;&#039;Demo&#039;&#039;) and select &#039;&#039;Remove Scene&#039;&#039;.&lt;br /&gt;
# Let it save if the changes to the old scene are important. Discard if it was open just for exploration&#039;s sake.&lt;br /&gt;
# Right click the new, &#039;&#039;Untitled&#039;&#039; scene. Click &#039;&#039;Save Scene As...&#039;&#039;&lt;br /&gt;
# Save it to &amp;lt;code&amp;gt;Assets/WikiDemo.unity&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Delete &amp;lt;u&amp;gt;anything&amp;lt;/u&amp;gt; in the scene.&lt;br /&gt;
# Right click the scene, hover &#039;&#039;GameObject&#039;&#039;, and select &#039;&#039;Create Empty&#039;&#039; from the sub-menu.&lt;br /&gt;
# Name this new object &#039;&#039;Objects&#039;&#039;.&lt;br /&gt;
# Select the newly created &#039;&#039;Objects&#039;&#039; object from the &#039;&#039;Hierarchy&#039;&#039; menu.&lt;br /&gt;
# On the far right side of the screen, in the &#039;&#039;Inspector&#039;&#039; menu, click the &#039;&#039;Add Component&#039;&#039; button.&lt;br /&gt;
# Type in &#039;&#039;ModkitPrefabContainer&#039;&#039;. Click on the component from the search to add it. The component now should be listed in the &#039;&#039;Inspector&#039;&#039;.&lt;br /&gt;
# In the &#039;&#039;Hierarchy&#039;&#039; panel right click the scene, hover &#039;&#039;GameObject&#039;&#039;, and select &#039;&#039;Create Empty&#039;&#039;.&lt;br /&gt;
# Name this new object &#039;&#039;Items&#039;&#039;.&lt;br /&gt;
# Right click the scene, hover &#039;&#039;GameObject&#039;&#039;, and select &#039;&#039;Create Empty&#039;&#039;.&lt;br /&gt;
# Name this new object &#039;&#039;Emoji&#039;&#039;.&lt;br /&gt;
# Select the newly created &#039;&#039;Emoji&#039;&#039; object, find the &#039;&#039;Inspector&#039;&#039; menu (far-right), and click the &#039;&#039;Add Component&#039;&#039; button.&lt;br /&gt;
# Type in &#039;&#039;ChatEmoteSetOld&#039;&#039;. Click on the component from the search to add it. That component should now be listed in the &#039;&#039;Inspector&#039;&#039;.&lt;br /&gt;
# Right click the scene, hover &#039;&#039;GameObject&#039;&#039;, and select &#039;&#039;Create Empty&#039;&#039;.&lt;br /&gt;
# Name this new object &#039;&#039;BlockSets&#039;&#039;.&lt;br /&gt;
# Select the newly created &#039;&#039;BlockSets&#039;&#039; object, find the &#039;&#039;Inspector&#039;&#039; menu (far-right), and click &#039;&#039;Add Component&#039;&#039;.&lt;br /&gt;
# Search for &#039;&#039;BlockSetContainer&#039;&#039;. Click on the component from the search to add it. The &#039;&#039;Inspector&#039;&#039; should now show that component as added.&lt;br /&gt;
#Go to &amp;lt;code&amp;gt;Assets/EcoModKit/Prefabs&amp;lt;/code&amp;gt; in the Unity project window.&lt;br /&gt;
# Find the prefab &#039;&#039;ItemTemplate&#039;&#039;.&lt;br /&gt;
# Drag it onto the &#039;&#039;Items&#039;&#039; object in the &#039;&#039;Hierarchy&#039;&#039; panel. It should add it as a &amp;lt;u&amp;gt;child&amp;lt;/u&amp;gt; of the &#039;&#039;Items&#039;&#039; object.&lt;br /&gt;
# Right click on the new &#039;&#039;ItemTemplate&#039;&#039; object, hover &#039;&#039;Prefab&#039;&#039;, and select &#039;&#039;Unpack Completely&#039;&#039;.&lt;br /&gt;
# Right click on the &#039;&#039;ItemTemplate&#039;&#039; object and select &#039;&#039;Rename&#039;&#039;. Name this what you want the item to be called. Example: &#039;&#039;MedievalStallItem&#039;&#039;.&lt;br /&gt;
# Set this item&#039;s background...&lt;br /&gt;
## Here&#039;s the default backgrounds (blue = item, brown = block, green = food): [[File:Eco - Item - Background.png|border|frameless]]        [[File:Eco - Block - Background.png|frameless]]        [[File:Eco - Food - Background.png|frameless]]&lt;br /&gt;
## Download or prepare the background and add it to the &amp;lt;code&amp;gt;Assets&amp;lt;/code&amp;gt; folder in Unity. &lt;br /&gt;
### To follow along lockstep, put the background in a new &amp;lt;code&amp;gt;Assets/WikiDemo&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
### Right click on &amp;lt;code&amp;gt;Assets&amp;lt;/code&amp;gt; folder, hover &#039;&#039;Create&#039;&#039;, select &#039;&#039;Folder&#039;&#039;.&lt;br /&gt;
### Name the folder &#039;&#039;WikiDemo&#039;&#039;.&lt;br /&gt;
## Configure Unity to use these as sprites...&lt;br /&gt;
### Select the background(s) added (Ctrl+Click each one).&lt;br /&gt;
### In the &#039;&#039;Inspector&#039;&#039;, find &#039;&#039;TextureType&#039;&#039; and change that to &#039;&#039;Sprite (2D and UI)&#039;&#039;.&lt;br /&gt;
### Again in the &#039;&#039;Inspector&#039;&#039;, find &#039;&#039;SpriteMode&#039;&#039; and change that to &#039;&#039;Single&#039;&#039;.&lt;br /&gt;
### Then scroll and go to the bottom of the &#039;&#039;Inspector&#039;&#039; and find the &#039;&#039;Apply&#039;&#039; button.&lt;br /&gt;
### This will apply those changes to that file and all other ones highlighted.&lt;br /&gt;
## Select the item being created (&#039;&#039;MedievalStallItem&#039;&#039;).&lt;br /&gt;
## In the &#039;&#039;Inspector&#039;&#039; panel (far-right), scroll and find the &#039;&#039;Item Template (Script)&#039;&#039; section.&lt;br /&gt;
## In here find the &#039;&#039;Background&#039;&#039; input. It&#039;ll say &#039;&#039;Background (Image)&#039;&#039; in it. If clicked that text to reveal and highlight the related object in the &#039;&#039;Hierarchy&#039;&#039; panel.&lt;br /&gt;
## Select the revealed, and highlighted object &#039;&#039;Background&#039;&#039;.&lt;br /&gt;
## In the &#039;&#039;Inspector&#039;&#039; panel, scroll and find the &#039;&#039;Image&#039;&#039; component section.&lt;br /&gt;
## Inside that component&#039;s section, find &#039;&#039;Source Image&#039;&#039;. It&#039;ll say &#039;&#039;Missing (Sprite)&#039;&#039;. Click the &#039;&#039;⦿&#039;&#039; button to the right.&lt;br /&gt;
## The &#039;&#039;Select Sprite&#039;&#039; popup will show. Make sure the &#039;&#039;Assets&#039;&#039; tab is selected, and find the backgrounds desired.&lt;br /&gt;
#Create the foreground image...&lt;br /&gt;
##This is easily accomplished in MS Paint.&lt;br /&gt;
##Get to the background image file in a &amp;lt;u&amp;gt;file explorer&amp;lt;/u&amp;gt;.&lt;br /&gt;
##Right click on it, hover &#039;&#039;Open with...&#039;&#039;, and select &#039;&#039;Paint&#039;&#039;.&lt;br /&gt;
##The solid background should be displayed.&lt;br /&gt;
##Open the &#039;&#039;File&#039;&#039; menu from the top toolbar.&lt;br /&gt;
##Hover &#039;&#039;Import to Canvas&#039;&#039; and select &#039;&#039;From a File&#039;&#039;.&lt;br /&gt;
##Find the icon in the file browser and import it. Match the size of the background image to have it nicely center itself.&lt;br /&gt;
##Now &#039;&#039;File&#039;&#039; from the top toolbar.&lt;br /&gt;
##Hover &#039;&#039;Save As...&#039;&#039; and select &#039;&#039;PNG&#039;&#039;.&lt;br /&gt;
##Save this to the &amp;lt;code&amp;gt;Assets/WikiDemo&amp;lt;/code&amp;gt; folder in Unity.&lt;br /&gt;
##Configure Unity to use these as sprites...&lt;br /&gt;
### Select the foreground image.&lt;br /&gt;
### In the &#039;&#039;Inspector&#039;&#039;, find &#039;&#039;TextureType&#039;&#039; and change that to &#039;&#039;Sprite (2D and UI)&#039;&#039;.&lt;br /&gt;
### Again in the &#039;&#039;Inspector&#039;&#039;, find &#039;&#039;SpriteMode&#039;&#039; and change that to &#039;&#039;Single&#039;&#039;.&lt;br /&gt;
### Then scroll and go to the bottom of the &#039;&#039;Inspector&#039;&#039; and find the &#039;&#039;Apply&#039;&#039; button.&lt;br /&gt;
### This will apply those changes to that file and all other ones highlighted.&lt;br /&gt;
#Set this item&#039;s foreground...&lt;br /&gt;
## Copy the item&#039;s icon into the &amp;lt;code&amp;gt;Assets&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
## Configure Unity to use it as a sprite (see the previous step&#039;s &#039;&#039;Set this item&#039;s background...&#039;&#039; instructions)&lt;br /&gt;
## Select the item being created (&#039;&#039;MedievalStallItem&#039;&#039;).&lt;br /&gt;
## In the &#039;&#039;Inspector&#039;&#039; panel (far-right), scroll and find the &#039;&#039;Item Template (Script)&#039;&#039; section.&lt;br /&gt;
## In here find the &#039;&#039;Foreground&#039;&#039; input. It&#039;ll say &#039;&#039;Foreground (Image)&#039;&#039; in it. If clicked that text to reveal and highlight the related object in the &#039;&#039;Hierarchy&#039;&#039; panel.&lt;br /&gt;
## Select the revealed, and highlighted object &#039;&#039;Foreground&#039;&#039;.&lt;br /&gt;
## Use the &#039;&#039;Inspector&#039;&#039;, find the &#039;&#039;Image&#039;&#039; component, within that component find the &#039;&#039;Source Image&#039;&#039; input. It will say &#039;&#039;Missing (Sprite)&#039;&#039;.&lt;br /&gt;
## Click the &#039;&#039;⦿&#039;&#039; button to the right of that input.&lt;br /&gt;
## From the &#039;&#039;Select Sprite&#039;&#039; popup, ensure the &#039;&#039;Assets&#039;&#039; tab is being searched, and find the icon just created.&lt;br /&gt;
&lt;br /&gt;
=== Export From Unity ===&lt;br /&gt;
&lt;br /&gt;
# Open the &#039;&#039;File&#039;&#039; menu from the top toolbar.&lt;br /&gt;
# Select &#039;&#039;Save.&#039;&#039; Save it to the &amp;lt;code&amp;gt;Assets/WikiDemo&amp;lt;/code&amp;gt; folder. &#039;&#039;&#039;Note:&#039;&#039;&#039; Do not skip. The scene must be saved for the ModKit build to work properly.&lt;br /&gt;
# Open the &#039;&#039;Eco Tools&#039;&#039; menu from the top toolbar.&lt;br /&gt;
# Hover &#039;&#039;Mod Kit&#039;&#039; to open the sub-menu.&lt;br /&gt;
# Select &#039;&#039;Build Current Bundle&#039;&#039;.&lt;br /&gt;
# Have it output the bundle to &amp;lt;code&amp;gt;/Eco Server/Mods/UserCode/WikiDemo.unity3d&amp;lt;/code&amp;gt;&lt;br /&gt;
# Wait for this to build. This may take a few minutes.&lt;br /&gt;
&lt;br /&gt;
=== Scripting the Item ===&lt;br /&gt;
For a more complex mod, it would be wise to build it into a DLL. See [[Getting Started with Eco Modding in Visual Studio 2022]] for details on that.&lt;br /&gt;
&lt;br /&gt;
# Create a &amp;lt;code&amp;gt;.cs&amp;lt;/code&amp;gt; file: &amp;lt;code&amp;gt;/Eco Server/Mods/UserCode/WikiDemo.cs&amp;lt;/code&amp;gt;&lt;br /&gt;
# Put the following into the newly created file:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;using Eco.Core.Items;&lt;br /&gt;
using Eco.Gameplay.Items;&lt;br /&gt;
using Eco.Shared.Localization;&lt;br /&gt;
using Eco.Shared.Serialization;&lt;br /&gt;
&lt;br /&gt;
namespace WikiDemo&lt;br /&gt;
{&lt;br /&gt;
    #region Item&lt;br /&gt;
    [Serialized] // Tells the save/load system this object needs to be serialized.&lt;br /&gt;
    [LocDisplayName(&amp;quot;Market Stall&amp;quot;)] // Defines the localized name of the item.&lt;br /&gt;
    [Weight(100)] // Defines how heavy Arrow is.&lt;br /&gt;
    [Ecopedia(&amp;quot;Work Stations&amp;quot;, &amp;quot;Craft Tables&amp;quot;, createAsSubPage: true)]&lt;br /&gt;
    [LocDescription(&amp;quot;A medieval market stall.&amp;quot;)] //The tooltip description for the item.&lt;br /&gt;
    public partial class MedievalStallItem: Item { }&lt;br /&gt;
    #endregion&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Line 8:&#039;&#039;&#039; A region tag. Lets the editor know it can collapse all of that code as a section. The following examples in this guide will just show &amp;lt;code&amp;gt;#region Item&amp;lt;/code&amp;gt; in their code examples.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 13:&#039;&#039;&#039; The implementation of &amp;lt;code&amp;gt;Item&amp;lt;/code&amp;gt; means that Eco will find this and look for Unity assets that matching this class&#039; name, &amp;lt;code&amp;gt;MedivalStallItem&amp;lt;/code&amp;gt;. While this doesn&#039;t do anything fancy, it completes the first step towards a new workbench.&lt;br /&gt;
&lt;br /&gt;
=== Checkpoint ===&lt;br /&gt;
[[File:Eco - Hotbar With Modded Icon.png|thumb|Shows the medieval stall as a modded icon in-game.]]&lt;br /&gt;
This was a lot of setup and steps. Make sure everything is running smoothly by doing the following:&lt;br /&gt;
&lt;br /&gt;
# Double-check that the &amp;lt;code&amp;gt;WikiDemo.unity3d&amp;lt;/code&amp;gt; and the &amp;lt;code&amp;gt;WikiDemo.cs&amp;lt;/code&amp;gt; files are in &amp;lt;code&amp;gt;/Eco Server/Mods/UserCode&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
# Start the server and connect to it.&lt;br /&gt;
# Test it out by typing &amp;lt;code&amp;gt;/give MedievalStall&amp;lt;/code&amp;gt; in chat&lt;br /&gt;
## It&#039;s also possible to do &amp;lt;code&amp;gt;/give Market Stall&amp;lt;/code&amp;gt; to get the item. How? Line 10: of the the above code declares that name as this item&#039;s &amp;quot;common name&amp;quot;. Neat.&lt;br /&gt;
# The item should appear in the players inventory with a working icon.&lt;br /&gt;
&lt;br /&gt;
This was the longest &amp;quot;leg&amp;quot; of this journey. All the setup is done and the infrastructure is in place. The following sections will just build on what was taught here.&lt;br /&gt;
&lt;br /&gt;
Keep on, keeping on!&lt;br /&gt;
&lt;br /&gt;
== Code the Item&#039;s Recipe ==&lt;br /&gt;
This section will be much simpler than the last. The following goes over how to add a new class and implement the &amp;lt;code&amp;gt;RecipeFamily&amp;lt;/code&amp;gt; interface.&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;using Eco.Core.Items;&lt;br /&gt;
using Eco.Gameplay.Components;&lt;br /&gt;
using Eco.Gameplay.Items;&lt;br /&gt;
using Eco.Gameplay.Items.Recipes;&lt;br /&gt;
using Eco.Gameplay.Skills;&lt;br /&gt;
using Eco.Mods.TechTree;&lt;br /&gt;
using Eco.Shared.Localization;&lt;br /&gt;
using Eco.Shared.Serialization;&lt;br /&gt;
using System.Runtime.Versioning;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
&lt;br /&gt;
namespace WikiDemo&lt;br /&gt;
{&lt;br /&gt;
    #region Item&lt;br /&gt;
&lt;br /&gt;
    #region Recipe&lt;br /&gt;
    [RequiresSkill(typeof(CarpentrySkill), 3)]&lt;br /&gt;
    [Ecopedia(&amp;quot;Work Stations&amp;quot;, &amp;quot;Craft Tables&amp;quot;, subPageName: &amp;quot;Market Stall&amp;quot;)]&lt;br /&gt;
    public partial class MedievalStallRecipe : RecipeFamily&lt;br /&gt;
    {&lt;br /&gt;
        [SupportedOSPlatform(&amp;quot;windows7.0&amp;quot;)]&lt;br /&gt;
        public MedievalStallRecipe()&lt;br /&gt;
        {&lt;br /&gt;
            var recipe = new Recipe();&lt;br /&gt;
            recipe.Init(&lt;br /&gt;
                name: &amp;quot;MedievalStallItem&amp;quot;,&lt;br /&gt;
                displayName: Localizer.DoStr(&amp;quot;Market Stall&amp;quot;),&lt;br /&gt;
                ingredients: new List&amp;lt;IngredientElement&amp;gt;&lt;br /&gt;
                {&lt;br /&gt;
                    new IngredientElement(&amp;quot;Wood&amp;quot;, 40, typeof(Skill)),&lt;br /&gt;
                    new IngredientElement(typeof(CottonFabricItem), 30, typeof(Skill)),&lt;br /&gt;
                    new IngredientElement(typeof(HempMooringRopeItem), 5, true)&lt;br /&gt;
                },&lt;br /&gt;
                items: new List&amp;lt;CraftingElement&amp;gt;&lt;br /&gt;
                {&lt;br /&gt;
                    new CraftingElement&amp;lt;MedievalStallItem&amp;gt;(1)&lt;br /&gt;
                }&lt;br /&gt;
            );&lt;br /&gt;
            this.Recipes = new List&amp;lt;Recipe&amp;gt; { recipe };&lt;br /&gt;
            this.LaborInCalories = CreateLaborInCaloriesValue(800, typeof(Skill));&lt;br /&gt;
            this.CraftMinutes = CreateCraftTimeValue(typeof(MedievalStallRecipe), 10f, typeof(Skill));&lt;br /&gt;
    &lt;br /&gt;
            // Perform pre/post initialization for user mods and initialize our recipe instance with the display name &amp;quot;Market Stall&amp;quot;&lt;br /&gt;
            this.ModsPreInitialize();&lt;br /&gt;
            this.Initialize(displayText: Localizer.DoStr(&amp;quot;Market Stall&amp;quot;), recipeType: typeof(MedievalStallRecipe));&lt;br /&gt;
            this.ModsPostInitialize();&lt;br /&gt;
    &lt;br /&gt;
            // Register our RecipeFamily instance to a work table (in this case the Carpentry Table) so it can be crafted.&lt;br /&gt;
            CraftingComponent.AddRecipe(tableType: typeof(CarpentryTableObject), recipeFamily: this); // NOTE: The table must be the object instance!&lt;br /&gt;
        }&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
        /// &amp;lt;summary&amp;gt;Hook for other mods to customize RecipeFamily before initialization.&amp;lt;/summary&amp;gt;&lt;br /&gt;
        partial void ModsPreInitialize();&lt;br /&gt;
    &lt;br /&gt;
        /// &amp;lt;summary&amp;gt;Hook for other mods to customize RecipeFamily after initialization, but before registration. You can change skill requirements here.&amp;lt;/summary&amp;gt;&lt;br /&gt;
        partial void ModsPostInitialize();&lt;br /&gt;
    }&lt;br /&gt;
    #endregion&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Line 10:&#039;&#039;&#039; Eco will need this explicitly added to the file. Visual Studio will not add this line automatically. It&#039;s used for the &amp;lt;code&amp;gt;List&amp;lt;T&amp;gt;&amp;lt;/code&amp;gt; objects found in this code.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 14:&#039;&#039;&#039; &amp;quot;Collapsed&amp;quot; &amp;lt;code&amp;gt;Item&amp;lt;/code&amp;gt; section. See the earlier sections in this guide for the code that belongs there.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 17:&#039;&#039;&#039; Sets the required skill and skill level to craft this recipe.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 21:&#039;&#039;&#039; &amp;lt;code&amp;gt;[SupportedOSPlatform(&amp;quot;windows7.0&amp;quot;)]&amp;lt;/code&amp;gt; is here to silence some annoying warnings in Visual Studio. It&#039;s optional.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 30-32:&#039;&#039;&#039; Declares the input ingredients used for crafting. &amp;lt;code&amp;gt;typeof(Skill)&amp;lt;/code&amp;gt; gets mapped to the &amp;lt;code&amp;gt;CarpentrySkill&amp;lt;/code&amp;gt; as defined by line 31. In this example the &amp;lt;code&amp;gt;HempMooringRope&amp;lt;/code&amp;gt; is a static input. A static input will not be modified by skills, upgrade modules, or game settings. &#039;&#039;&#039;Note:&#039;&#039;&#039; It seems that at the time of writing (4/21/2026, Eco v13.0.2) the only way to get an ingredient to be a dynamic value that is reduced by the table&#039;s upgrade is to pass &amp;lt;code&amp;gt;typeof(Skill)&amp;lt;/code&amp;gt; to it; Passing either &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; makes the this input static.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 34:&#039;&#039;&#039; The &amp;lt;code&amp;gt;items&amp;lt;/code&amp;gt; list declares what items are &amp;lt;u&amp;gt;output&amp;lt;/u&amp;gt; by this recipe.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 36:&#039;&#039;&#039; This line declares that one medieval stall is output from this recipe. Functionally this links this recipe to the &amp;lt;code&amp;gt;MedievalStallItem&amp;lt;/code&amp;gt; (aka &amp;quot;Market Stall&amp;quot;) item created in the last step.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 40:&#039;&#039;&#039; Amount of calories needed to craft this item. For a static value (not modified by upgrades or skill levels) change this line to: &amp;lt;code&amp;gt;this.LaborInCalories = CreateLaborInCaloriesValue(800);&amp;lt;/code&amp;gt;. As it&#039;s written in the example, this item&#039;s calorie cost will be dynamic (modified by upgrades and skill levels). The skill level that will modify it is declared on line 16.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 41:&#039;&#039;&#039;  Minutes needed to craft. Both static and dynamic values for crafting time can be modified by the world difficulty settings. For a static value change this line to: &amp;lt;code&amp;gt;this.CraftMinutes = CreateCraftTimeValue(10f);&amp;lt;/code&amp;gt;. As it&#039;s written in the example, this item&#039;s craft time will be dynamic.&#039;&#039;&#039;Line 49:&#039;&#039;&#039; This line assigns the recipe to a workbench. &amp;lt;u&amp;gt;Do not assign&amp;lt;/u&amp;gt; to itself because then the first table could never be made. It&#039;s recommend to use a preexisting vanilla table.&lt;br /&gt;
=== Checkpoint ===&lt;br /&gt;
Check the functionality at this point -- it should be possible to see the recipe in the crafting table.&lt;br /&gt;
&lt;br /&gt;
# Have the &amp;lt;code&amp;gt;.unity3d&amp;lt;/code&amp;gt; and the &amp;lt;code&amp;gt;.cs&amp;lt;/code&amp;gt; file in the &amp;lt;code&amp;gt;/Eco Server/Mods/UserCode&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
# Start the server and log in.&lt;br /&gt;
# Type &amp;lt;code&amp;gt;/give Carpentry Table&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Place the Carpentry Table down and interact to see the what can be crafted.&lt;br /&gt;
# Scroll and find the &#039;&#039;Market Stall&#039;&#039; recipe.&lt;br /&gt;
# Type &amp;lt;code&amp;gt;/give Basic Upgrade 4&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Put the basic upgrade into the table.&lt;br /&gt;
# Go back to the recipe for the &#039;&#039;Market Stall&#039;&#039; and make sure the Wood and the Cotton fabric inputs now require less, but the Hemp Mooring Rope still is the same. &#039;&#039;&#039;Note:&#039;&#039;&#039; In case the recipe hasn&#039;t changed close that table&#039;s window and interact with it again. It should for the recipes to refresh now that the upgrade is in it.&lt;br /&gt;
&lt;br /&gt;
== Create the World Object ==&lt;br /&gt;
=== Preparing the 3D Asset ===&lt;br /&gt;
WIP. Below is &amp;lt;u&amp;gt;incorrect&amp;lt;/u&amp;gt;. The origin point of the object must be in the center, bottom of the object. Instructions for reference cube moving and origin moving will produce bad results!&lt;br /&gt;
# Open &amp;lt;u&amp;gt;Blender&amp;lt;/u&amp;gt;.&lt;br /&gt;
# Load the 3D object created earlier for icon rendering -- &amp;lt;code&amp;gt;Assets/WikiDemo/MedievalStall - Icon Scene.blend&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Cleanup the scene...&lt;br /&gt;
## Use the scene collection panel on the top-right side of the screen. Select and &#039;&#039;&#039;delete any light source&#039;&#039;&#039;. These will have a 💡 icon and by default are named something like &amp;quot;sun&amp;quot;, &amp;quot;point&amp;quot;, &amp;quot;spot&amp;quot; or &amp;quot;area&amp;quot;. &#039;&#039;&#039;Note:&#039;&#039;&#039; If your model is a light source or has one in it, you can leave that light source. The point here is to remove the ambient lights used for icon rendering.&lt;br /&gt;
## In the scene collection panel, select and &#039;&#039;&#039;delete any camera(s)&#039;&#039;&#039;. These have a 🎥 icon and by default are named something like &amp;quot;camera&amp;quot;.&lt;br /&gt;
# &amp;lt;u&amp;gt;If there are multiple different 3D assets in the scene&amp;lt;/u&amp;gt; (like bags, crates, jars, ect.), join them all together...&lt;br /&gt;
## Select all of the meshes by holding &#039;&#039;Shift&#039;&#039; and clicking on each one in the &#039;&#039;Scene Collection&#039;&#039; panel (right side of window). &#039;&#039;&#039;Tip:&#039;&#039;&#039; Quickly select a group of them by selecting one near the top. Then hold &#039;&#039;Shift&#039;&#039;, &#039;&#039;Ctrl,&#039;&#039; and click on one near the bottom. This will both the one at the top and the one at the bottom, but also every item in between. Neat!&lt;br /&gt;
## Be in &#039;&#039;Layout&#039;&#039; mode (top toolbar).&lt;br /&gt;
## Find and open the &#039;&#039;Object&#039;&#039; menu (second toolbar down from the top).&lt;br /&gt;
## Select &#039;&#039;Join&#039;&#039;.&lt;br /&gt;
## In the &#039;&#039;Scene Collection&#039;&#039; panel, double click on the name of the newly joined mesh.&lt;br /&gt;
## Rename it to &amp;lt;code&amp;gt;MedievalStallMesh&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Add and position a reference cube...&lt;br /&gt;
## Make sure the editor is in &#039;&#039;Layout&#039;&#039; view (top toolbar).&lt;br /&gt;
## Then, add a reference cube. Open the &#039;&#039;Add&#039;&#039; menu (second top toolbar down).&lt;br /&gt;
## Hover &#039;&#039;Mesh&#039;&#039;.&lt;br /&gt;
## Select &#039;&#039;Cube.&#039;&#039;&lt;br /&gt;
## Find the &#039;&#039;Properties&#039;&#039; panel. It&#039;s just below the &#039;&#039;Scene Collection&#039;&#039; panel on the right side of the window.&lt;br /&gt;
## Now, still inside that panel but on the left side of it there&#039;s a column of icons.&lt;br /&gt;
## Hover them to see their names.&lt;br /&gt;
## Find the one that reads:  &#039;&#039;Object&#039;&#039;  &#039;&#039;Object Properties&#039;&#039;  &#039;&#039;&#039;Tip:&#039;&#039;&#039; It kinda looks like an orange box&lt;br /&gt;
## Find and expand the &#039;&#039;Transform&#039;&#039; section&lt;br /&gt;
## Set &#039;&#039;Location X&#039;&#039; to &#039;&#039;1&#039;&#039;.&lt;br /&gt;
## Just below that, set &#039;&#039;Y&#039;&#039; to &#039;&#039;1&#039;&#039;.&lt;br /&gt;
## Just below that, again, set &#039;&#039;Z&#039;&#039; to &#039;&#039;1&#039;&#039;.&lt;br /&gt;
## The bottom corner of the cube will be touching the green and red axis lines.&lt;br /&gt;
# Move the reference cube&#039;s origin to &amp;lt;code&amp;gt;(0, 0, 0)&amp;lt;/code&amp;gt;...&lt;br /&gt;
## Be in &#039;&#039;Layout&#039;&#039; mode (top toolbar).&lt;br /&gt;
## Open the &#039;&#039;View&#039;&#039; menu (second toolbar down).&lt;br /&gt;
## Select &#039;&#039;Sidebar&#039;&#039;.&lt;br /&gt;
## A new panel will have expanded.&lt;br /&gt;
## Along the right side of that panel there&#039;s buttons (&#039;&#039;Item, Tool, View, Animation&#039;&#039;). Find and click the &#039;&#039;View&#039;&#039; button.&lt;br /&gt;
## Find and expand the &#039;&#039;3D Cursor&#039;&#039; section.&lt;br /&gt;
## Under &#039;&#039;Location&#039;&#039; set &#039;&#039;X&#039;&#039; to &#039;&#039;0&#039;&#039;.&lt;br /&gt;
## &#039;&#039;Y&#039;&#039; to 0.&lt;br /&gt;
## &#039;&#039;Z&#039;&#039; to 0.&lt;br /&gt;
## Now in the &#039;&#039;Scene Collection&#039;&#039; panel, select the &#039;&#039;Cube&#039;&#039; mesh.&lt;br /&gt;
## Open the &#039;&#039;Object&#039;&#039; menu from the second toolbar down from the top.&lt;br /&gt;
## Hover &#039;&#039;Set Origin&#039;&#039;.&lt;br /&gt;
## Select &#039;&#039;Origin to 3D Cursor&#039;&#039;.&lt;br /&gt;
# Set the reference cube&#039;s dimensions...&lt;br /&gt;
## Be in &#039;&#039;Layout&#039;&#039; mode, open the &#039;&#039;View&#039;&#039; menu (second toolbar down), and select and expand the &#039;&#039;Sidebar&#039;&#039; option&#039;&#039;.&#039;&#039;&lt;br /&gt;
## To the right of the sidebar, find and click the &#039;&#039;Item&#039;&#039; button.&lt;br /&gt;
## Expand the &#039;&#039;Transform&#039;&#039; section.&lt;br /&gt;
## Find the &#039;&#039;Dimensions,&#039;&#039; and set &#039;&#039;X&#039;&#039; to &#039;&#039;4&#039;&#039;.&lt;br /&gt;
## &#039;&#039;Y&#039;&#039; to &#039;&#039;3&#039;&#039;.&lt;br /&gt;
## &#039;&#039;Z&#039;&#039; to &#039;&#039;3&#039;&#039;.  &#039;&#039;&#039;Note:&#039;&#039;&#039; These dimensions only make sense for the asset being used for this guide. If using a different one, set the dimensions to the size of the box that model should fit in&lt;br /&gt;
# Adjust the position and scale to fit inside a box. This is important because it ensures that this object won&#039;t clip into other objects when placed.&lt;br /&gt;
## Be in &#039;&#039;Layout&#039;&#039; mode (top toolbar).&lt;br /&gt;
## Find the drop down in the second toolbar from the top that has options like &#039;&#039;Object Mode, Edit Mode, Sculpt Mode,&#039;&#039; etc.&lt;br /&gt;
## Select &#039;&#039;Object Mode&#039;&#039; from that drop down.&lt;br /&gt;
## On the left side of the screen there&#039;s a column of icons. Hover over them to see their names.&lt;br /&gt;
## Select the &#039;&#039;Move&#039;&#039; tool.&lt;br /&gt;
## Click on the Medieval Stall to select it. Zoom out and reposition the camera so that the blue, green, and red arrows are visible.  &#039;&#039;&#039;Tip:&#039;&#039;&#039; By holding the middle-mouse button and dragging the scene will rotate. By holding the middle-mouse button and the &#039;&#039;Shift&#039;&#039; key, the scene will pan.  &#039;&#039;&#039;Tip:&#039;&#039;&#039; If panning or rotating the scene becomes slow or frustrating (especially after zooming), try selecting 3D asset from the &#039;&#039;Scene Collection&#039;&#039; panel, opening the &#039;&#039;View&#039;&#039; menu (second toolbar from top), and selecting &#039;&#039;Frame Selected&#039;&#039;. This will reset the view onto that object and controls should feel normal again.&lt;br /&gt;
## Click and hold one of the arrows. Move the mouse to drag the 3D asset towards the box.&lt;br /&gt;
## Move the 3D asset around till it&#039;s &amp;lt;u&amp;gt;completely inside the box&amp;lt;/u&amp;gt;. If it cannot fit and is too big, continue to the next step.  &#039;&#039;&#039;Tip:&#039;&#039;&#039; To select the 3D asset once it disappears, use the &#039;&#039;Scene Collection&#039;&#039; panel. Click on it there and the blue, green, and red arrows will show up again for it.   &#039;&#039;&#039;Tip:&#039;&#039;&#039; There are preset views. To use them go to the &#039;&#039;View&#039;&#039; menu (second toolbar from top)&#039;&#039;,&#039;&#039; hover &#039;&#039;Viewpoint&#039;&#039;, and select the view that would be most helpful.&lt;br /&gt;
## Find the &#039;&#039;Scale&#039;&#039; tool from the left side of the screen.&lt;br /&gt;
## Now the blue, green, and red &amp;quot;arrows&amp;quot; don&#039;t really look like arrows anymore. They are lines with boxes at the end.&lt;br /&gt;
## Click and hold on those lines to adjust the scale of the 3D asset to make it fit inside the box.  &#039;&#039;&#039;Tip:&#039;&#039;&#039; There are little colored boxes in between the lines that can be dragged to scale the 3D asset more proportionally.&lt;br /&gt;
## Continue using the &#039;&#039;Move&#039;&#039; and &#039;&#039;Scale&#039;&#039; tools till the model fits. This will take patience and time.  &#039;&#039;&#039;Tip:&#039;&#039;&#039; Hide the reference cube to see what is happening with the 3D asset. Go to the &#039;&#039;Scene Collections&#039;&#039; panel and click the 👁 button to hide it. Click that button again to show it.&lt;br /&gt;
# Now set the 3D asset&#039;s origin point... &amp;lt;!-- I still need to determine where the origin point should be based on occupancy code. --&amp;gt;&lt;br /&gt;
## Ensure that the 3D Cursor is still at &amp;lt;code&amp;gt;(0,0,0)&amp;lt;/code&amp;gt;: Open the &#039;&#039;View&#039;&#039; menu (second toolbar down), select and expand the &#039;&#039;Sidebar&#039;&#039;, click the &#039;&#039;View&#039;&#039; button (right side of the Sidebar), find and expand the &#039;&#039;3D cursor&#039;&#039; section, change the &#039;&#039;Location X, Y,&#039;&#039; and &#039;&#039;Z&#039;&#039; to &#039;&#039;0&#039;&#039;.&lt;br /&gt;
## Select the 3D asset using the &#039;&#039;Scene Collection&#039;&#039; panel.&lt;br /&gt;
## Open the &#039;&#039;Object&#039;&#039; menu (second toolbar down).&lt;br /&gt;
## Hover &#039;&#039;Set Origin&#039;&#039;.&lt;br /&gt;
## Select &#039;&#039;Origin to 3D Cursor&#039;&#039;.&lt;br /&gt;
# Select the reference cube from the &#039;&#039;Scene Collections&#039;&#039; panel.&lt;br /&gt;
# Open &#039;&#039;Object&#039;&#039; menu (second toolbar down).&lt;br /&gt;
# Select &#039;&#039;Delete&#039;&#039;.&lt;br /&gt;
# Open the &#039;&#039;Object&#039;&#039; menu.&lt;br /&gt;
# Hover &#039;&#039;Apply&#039;&#039;.&lt;br /&gt;
# Select &#039;&#039;All Transformations&#039;&#039;.&lt;br /&gt;
# Open the &#039;&#039;File&#039;&#039;  menu from the top toolbar.&lt;br /&gt;
# Hover &#039;&#039;Export&#039;&#039; to open the sub-menu.&lt;br /&gt;
# Select &#039;&#039;FBX (.fbx)&#039;&#039; &lt;br /&gt;
# A &#039;&#039;Blender File View&#039;&#039; window will pop-up.&lt;br /&gt;
# On the right side of this window there&#039;s a ⚙️ icon. Click it to expand the settings region.&lt;br /&gt;
# In the expanded region find the &#039;&#039;Include&#039;&#039; section and expand it. Change the following:&lt;br /&gt;
## Find &#039;&#039;Object Types&#039;&#039; and only select &#039;&#039;Mesh.&#039;&#039; No other option should be highlighted for this setting.&lt;br /&gt;
# In the settings region scroll and find the &#039;&#039;Transform&#039;&#039; section and expand it. Change the following:&lt;br /&gt;
## Find &#039;&#039;Apply Scalings&#039;&#039; and set it to &#039;&#039;FBX All&#039;&#039;.&lt;br /&gt;
## Just below that find &#039;&#039;Forward&#039;&#039; and set it to &#039;&#039;-Z Forward&#039;&#039;.&lt;br /&gt;
## Ensure that the next setting down, &#039;&#039;Up&#039;&#039;, changed to &#039;&#039;Y Up&#039;&#039;.&lt;br /&gt;
## Find &#039;&#039;Apply Unit&#039;&#039; and make sure it&#039;s checked.&lt;br /&gt;
## Next, find &#039;&#039;Use Space Transform&#039;&#039; check it.&lt;br /&gt;
## Lastly, find &#039;&#039;Apply Transform&#039;&#039; and check it too.&lt;br /&gt;
# Save it to &amp;lt;code&amp;gt;Assets/WikiDemo/MedievalStall.fbx&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Save the &amp;lt;code&amp;gt;.blend&amp;lt;/code&amp;gt; file too and close Blender.&lt;br /&gt;
&lt;br /&gt;
=== Add to Unity Scene ===&lt;br /&gt;
&lt;br /&gt;
# Open &amp;lt;u&amp;gt;Unity&amp;lt;/u&amp;gt;.&lt;br /&gt;
# Select the &amp;lt;code&amp;gt;.fbx&amp;lt;/code&amp;gt; file in the project window.&lt;br /&gt;
# Open the &#039;&#039;Eco Tools&#039;&#039; menu from the top toolbar.&lt;br /&gt;
# Hover &#039;&#039;Mod Kit&#039;&#039;.&lt;br /&gt;
# Select &#039;&#039;World Object Setup.&#039;&#039;&lt;br /&gt;
# A &#039;&#039;World Object Setup&#039;&#039;  window will pop-up.&lt;br /&gt;
# Make sure that &#039;&#039;Selected Objects&#039;&#039; reads &#039;&#039;MedievalStall.&#039;&#039;&lt;br /&gt;
# Also make sure that &#039;&#039;World Object Type&#039;&#039; is set to &#039;&#039;World Object&#039;&#039;.&lt;br /&gt;
# Press the &#039;&#039;Setup World Objects&#039;&#039; button.&lt;br /&gt;
# Notice in the project window that a new &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt; file was created -- &amp;lt;code&amp;gt;MedievalStallObject.prefab&amp;lt;/code&amp;gt;&lt;br /&gt;
# Select the &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt; file in the project window.&lt;br /&gt;
# In the &#039;&#039;Inspector&#039;&#039; window (right side), scroll and find the &#039;&#039;World Object (Script)&#039;&#039; component.&lt;br /&gt;
# In that component, find the &#039;&#039;Override Occupancy&#039;&#039; checkbox and check it.&lt;br /&gt;
# A new field just appeared, &#039;&#039;Size&#039;&#039;.&lt;br /&gt;
# Set the &#039;&#039;X&#039;&#039; to &#039;&#039;4&#039;&#039;.&lt;br /&gt;
# &#039;&#039;Y&#039;&#039; to &#039;&#039;3&#039;&#039;.&lt;br /&gt;
# &#039;&#039;Z&#039;&#039; to &#039;&#039;3.&#039;&#039; &#039;&#039;&#039;Note:&#039;&#039;&#039; These are the sizes used for the reference cube. If using different sizes make sure you &amp;lt;u&amp;gt;flip the Y and Z coordinates&amp;lt;/u&amp;gt; when reading coordinates from Blender. Blender uses a different coordinate system that Unity!&lt;br /&gt;
# Select &#039;&#039;Objects&#039;&#039; from &#039;&#039;Hierarchy&#039;&#039; panel.&lt;br /&gt;
# Find the &#039;&#039;Modkit Prefab Container (Script)&#039;&#039; component.&lt;br /&gt;
# Expand the &#039;&#039;Prefabs&#039;&#039; section in that component.&lt;br /&gt;
# Click the &#039;&#039;+&#039;&#039; button to add an item to the list.&lt;br /&gt;
# Either...&lt;br /&gt;
## Click the &#039;&#039;⦿&#039;&#039; button, switch to the &#039;&#039;Assets&#039;&#039; tab, find or search for &#039;&#039;MedievalStallObject&#039;&#039;, and double click on it. Make sure it&#039;s the medieval stall &amp;lt;u&amp;gt;object&amp;lt;/u&amp;gt; with the &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt; ending.&lt;br /&gt;
## Drag the &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt; file onto the &#039;&#039;⦿&#039;&#039; button&lt;br /&gt;
# &lt;br /&gt;
# Open the &#039;&#039;File&#039;&#039; menu from top toolbar and select &#039;&#039;Save&#039;&#039;.  &#039;&#039;&#039;Note:&#039;&#039;&#039; Do not skip. The scene must be saved for the ModKit build to work properly.&lt;br /&gt;
# Open the &#039;&#039;Eco Tools&#039;&#039; menu from the top toolbar.&lt;br /&gt;
# Hover &#039;&#039;Mod Kit&#039;&#039;.&lt;br /&gt;
# Select &#039;&#039;Build Current Bundle&#039;&#039;.&lt;br /&gt;
# Save the bundle to &amp;lt;code&amp;gt;/Eco Server/Mods/UserCode/WikiDemo.unity3d&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TODO:&#039;&#039;&#039; Explain that if the orgin point isn&#039;t at the bottom-left corner of the model, then &#039;&#039;World Object (Script) &amp;gt; Occupancy Offset&#039;&#039; will need adjusted manually.&lt;br /&gt;
&lt;br /&gt;
=== Scripting the World Object ===&lt;br /&gt;
Code that links the Item to this World Object.&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
using Eco.Core.Items;&lt;br /&gt;
using Eco.Gameplay.Components;&lt;br /&gt;
using Eco.Gameplay.Items;&lt;br /&gt;
using Eco.Gameplay.Items.Recipes;&lt;br /&gt;
using Eco.Gameplay.Objects;&lt;br /&gt;
using Eco.Gameplay.Skills;&lt;br /&gt;
using Eco.Mods.TechTree;&lt;br /&gt;
using Eco.Shared.Localization;&lt;br /&gt;
using Eco.Shared.Serialization;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Runtime.Versioning;&lt;br /&gt;
using System;&lt;br /&gt;
&lt;br /&gt;
namespace WikiDemo&lt;br /&gt;
{&lt;br /&gt;
    #region Item&lt;br /&gt;
    [Serialized] // Tells the save/load system this object needs to be serialized.&lt;br /&gt;
    [LocDisplayName(&amp;quot;Market Stall&amp;quot;)] // Defines the localized name of the item.&lt;br /&gt;
    [Weight(100)] // Defines how heavy Arrow is.&lt;br /&gt;
    [Ecopedia(&amp;quot;Work Stations&amp;quot;, &amp;quot;Craft Tables&amp;quot;, createAsSubPage: true)]&lt;br /&gt;
    [LocDescription(&amp;quot;A medieval market stall.&amp;quot;)] //The tooltip description for the item.&lt;br /&gt;
    public partial class MedievalStallItem : WorldObjectItem&amp;lt;MedievalStallObject&amp;gt; { }&lt;br /&gt;
    #endregion&lt;br /&gt;
&lt;br /&gt;
    #region Recipe&lt;br /&gt;
&lt;br /&gt;
    #region Object&lt;br /&gt;
    [Serialized]&lt;br /&gt;
    public partial class MedievalStallObject : WorldObject, IRepresentsItem&lt;br /&gt;
    {&lt;br /&gt;
        public Type RepresentedItemType =&amp;gt; typeof(MedievalStallItem);&lt;br /&gt;
    }&lt;br /&gt;
    #endregion&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Line 22:&#039;&#039;&#039; This changes from implementing &amp;lt;code&amp;gt;Item&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;WorldObjectItem&amp;lt;MedievalStallObject&amp;gt;&amp;lt;/code&amp;gt;. This is what gives the item the ability to place the table down in the world.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 25:&#039;&#039;&#039; The &amp;quot;collapsed&amp;quot; Recipe section. See earlier sections in this guide to see what code belongs here.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 29:&#039;&#039;&#039; Declares the &amp;lt;code&amp;gt;MedievalStallObject&amp;lt;/code&amp;gt;. It&#039;s important that this class name is matches exactly the &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt; file name because the name is what links them.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 31:&#039;&#039;&#039; This line is similar in function to line 22, it&#039;s declaring that this &amp;lt;code&amp;gt;MedievalStallObject&amp;lt;/code&amp;gt; is &amp;lt;code&amp;gt;MedievalStallItem&amp;lt;/code&amp;gt; when in inventories.&lt;br /&gt;
&lt;br /&gt;
=== Checkpoint ===&lt;br /&gt;
Export and see what it does. Ensure it&#039;s not lifting off the ground because of a non-curved shader.&lt;br /&gt;
&lt;br /&gt;
==== Origin Point Editing ====&lt;br /&gt;
Talk about what it does: the point that the simulation considers this world object to be at.&lt;br /&gt;
&lt;br /&gt;
Show how to move it around using blender.&lt;br /&gt;
&lt;br /&gt;
== Final Export ==&lt;br /&gt;
Export.&lt;br /&gt;
&lt;br /&gt;
Package.&lt;br /&gt;
&lt;br /&gt;
Distribute.&lt;/div&gt;</summary>
		<author><name>WugWugg</name></author>
	</entry>
	<entry>
		<id>https://wiki.play.eco/en/index.php?title=From_3D_Asset_to_Working_Worktable&amp;diff=16731</id>
		<title>From 3D Asset to Working Worktable</title>
		<link rel="alternate" type="text/html" href="https://wiki.play.eco/en/index.php?title=From_3D_Asset_to_Working_Worktable&amp;diff=16731"/>
		<updated>2026-04-26T23:16:09Z</updated>

		<summary type="html">&lt;p&gt;WugWugg: WIP&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction =&lt;br /&gt;
Below is a guide on how to take an 3D asset from the Unity Store and make a working workbench in Eco. This includes:&lt;br /&gt;
* Creating a recipe to craft the modded table&lt;br /&gt;
* Creating recipes so the player can use the modded table to craft something&lt;br /&gt;
* Using Blender to generate a modded icon (seen when holding it in inventory)&lt;br /&gt;
* Using Blender to adjust the origin point of the model&lt;br /&gt;
* How to setup all this in a Unity scene and package for Eco&lt;br /&gt;
&lt;br /&gt;
= Setup =&lt;br /&gt;
&lt;br /&gt;
* Already have setup &#039;&#039;&#039;ModKit + Unity&#039;&#039;&#039;&lt;br /&gt;
** See: [[Installing the ModKit]]&lt;br /&gt;
* Have a &#039;&#039;&#039;3D model&#039;&#039;&#039;&lt;br /&gt;
** Just following along? Find the one used here at &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://assetstore.unity.com/packages/3d/props/low-poly-medieval-market-stalls-314286&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* A &#039;&#039;&#039;C# IDE&#039;&#039;&#039; (notepad++, Visual Studio, etc.)&lt;br /&gt;
** Highly encouraged to have an Intellisense setup and linked to the &#039;&#039;&#039;Reference Assemblies&#039;&#039;&#039;. Optional, but its really worth the time to figure out because it will help quickly correct small typos and trivial mistakes.&lt;br /&gt;
** See: [[Getting Started with Eco Modding in Visual Studio 2022]] (generally the same steps apply if using a new version of Visual Studio)&lt;br /&gt;
* &#039;&#039;&#039;Blender&#039;&#039;&#039; installed&lt;br /&gt;
** Homepage: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://www.blender.org/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Importing the Assets ==&lt;br /&gt;
&lt;br /&gt;
# Open the Unity editor to the project.&lt;br /&gt;
# From the top toolbar open the &#039;&#039;Window&#039;&#039; drop down.&lt;br /&gt;
# Hover &#039;&#039;Package Management&#039;&#039; to open sub-menu.&lt;br /&gt;
# Select &#039;&#039;Package Manager&#039;&#039;.&lt;br /&gt;
# The &#039;&#039;Package Manager&#039;&#039; window will pop-up.&lt;br /&gt;
# Install the package containing the assets you want to use...&lt;br /&gt;
## &amp;lt;u&amp;gt;If not using Unity Registry&amp;lt;/u&amp;gt;...&lt;br /&gt;
### Find the &#039;&#039;+▾&#039;&#039; button in the top left and open the drop down.&lt;br /&gt;
### Install the package from one of those options.&lt;br /&gt;
## &amp;lt;u&amp;gt;If using Unity Registry&amp;lt;/u&amp;gt;...&lt;br /&gt;
### Visit &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://assetstore.unity.com&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; and sign in.&lt;br /&gt;
### Search for the asset desired.&lt;br /&gt;
### Go to it&#039;s page (e.g. &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://assetstore.unity.com/packages/3d/props/low-poly-medieval-market-stalls-314286&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;) and click the big blue button, &#039;&#039;Add to My Assets.&#039;&#039;&lt;br /&gt;
### Now, in the Unity editor and back at the &#039;&#039;Package Manager&#039;&#039; window.&lt;br /&gt;
### Find &#039;&#039;My Assets&#039;&#039; on the left menu and navigate to it.&lt;br /&gt;
### Click the &#039;&#039;⟳&#039;&#039; button in the lower-right.&lt;br /&gt;
### The asset should be in the list now. Use the search to filter if needed.&lt;br /&gt;
### Click on the asset in the list. For those following along, &#039;&#039;Low Poly Medieval Market Stalls&#039;&#039;.&lt;br /&gt;
### In the right panel, find the &#039;&#039;Download ⤓&#039;&#039; button. Click it.&lt;br /&gt;
### Once downloaded, a new button should show up, it&#039;ll say something like &#039;&#039;⊕ Import 1.0 to project&#039;&#039; . Click it.&lt;br /&gt;
### The &#039;&#039;Import Unity Package&#039;&#039; window will pop-up.&lt;br /&gt;
### Select &#039;&#039;Import&#039;&#039; on it.&lt;br /&gt;
# Verify you can find your assets from the explorer. If following along, the assets are at &amp;lt;code&amp;gt;Assets/PolyRonin/Medieval Market Stalls&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Load in a demo scene, if provided, and make sure everything looks okay.&lt;br /&gt;
## For those following along, double click on the &#039;&#039;Demo&#039;&#039; scene at &amp;lt;code&amp;gt;Assets/PolyRonin/Medieval Market Stalls/Demo.unity&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:Eco - Unity - View Modes.png|thumb|Underlined in red are the different draw mode buttons. &amp;lt;u&amp;gt;4/20/26&amp;lt;/u&amp;gt;]]&lt;br /&gt;
If something seems off, check the different draw modes and see if changing those allow the scene to render as expected (see picture).&lt;br /&gt;
&lt;br /&gt;
With all that setup, it&#039;s time to get to the creation parts.&lt;br /&gt;
&lt;br /&gt;
= Creating The Worktable =&lt;br /&gt;
This guide will create the worktable in this order:&lt;br /&gt;
&lt;br /&gt;
# Create the item that represents the worktable&lt;br /&gt;
# Make a recipe to craft the worktable item&lt;br /&gt;
# Make the worktable item something that places a world object&lt;br /&gt;
# Give the worktable functionality by adding recipes to it&lt;br /&gt;
&lt;br /&gt;
== Creating the Item ==&lt;br /&gt;
&lt;br /&gt;
=== Item Icon ===&lt;br /&gt;
[[File:TeamstersStall - StallOnly - 256x256.png|thumb|A large (256x256px) icon created of Stall4 from the medieval assets.]]&lt;br /&gt;
This process is also explained here, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://mod.io/g/eco/r/origin-points-icon-images-with-blender&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, check it out if you need more visual reference points as that guide has a lot of pictures.&lt;br /&gt;
&lt;br /&gt;
# Open &amp;lt;u&amp;gt;Blender&amp;lt;/u&amp;gt;.&lt;br /&gt;
# Delete everything in the &#039;&#039;Scene Collection&#039;&#039;. Find this section in the top-right of the application.&lt;br /&gt;
# From the top toolbar, open the &#039;&#039;File&#039;&#039; drop down.&lt;br /&gt;
# Hover &#039;&#039;Import&#039;&#039; to open the sub-menu.&lt;br /&gt;
# Select the type of 3D asset. For those using medieval assets, select &#039;&#039;FBX (.fbx)&#039;&#039;.&lt;br /&gt;
# Find the asset on the computer...&lt;br /&gt;
## Tip: Use Unity to find the &amp;lt;code&amp;gt;.fbx&amp;lt;/code&amp;gt; asset. For the medieval assets, that&#039;s in &amp;lt;code&amp;gt;Assets/PolyRonin/Medieval Market Stalls/Meshes/medieval-market-stalls-1.fbx&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Right click on it and select &#039;&#039;Show in explorer&#039;&#039;.&lt;br /&gt;
## Now copy the address of that folder from Explorer. It might look like &amp;lt;code&amp;gt;C:\Users\Wug\EcoMod--WikiDemo\WikiDemo\Assets\PolyRonin\Medieval Market Stalls\Meshes&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Paste that in the address bar of the &amp;lt;u&amp;gt;Blender&amp;lt;/u&amp;gt; import pop-up.&lt;br /&gt;
# Select the blue &#039;&#039;Import FBX&#039;&#039; button&#039;&#039;.&#039;&#039;&lt;br /&gt;
# From &#039;&#039;Layout&#039;&#039; mode, change the Viewport Shading to Material Preview or Rendered. This is on the second toolbar down, far right of center, but before &#039;&#039;Scene Collection&#039;&#039; section.&lt;br /&gt;
# If you see purple models, Blender will need help finding textures for these meshes...&lt;br /&gt;
## From the top toolbar, open the &#039;&#039;File&#039;&#039; drop down.&lt;br /&gt;
## Hover &#039;&#039;External Data&#039;&#039; to open the sub-menu.&lt;br /&gt;
## Select &#039;&#039;Find Missing Files...&#039;&#039;&lt;br /&gt;
## Point this to the whole directory that the 3D assets came in. For the medieval pack, &amp;lt;code&amp;gt;C:\Users\&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;Wug\EcoMod--WikiDemo\WikiDemo\Assets\PolyRonin&amp;lt;/code&amp;gt;.&lt;br /&gt;
## The proper textures/materials should have now loaded in. If it hasn&#039;t, consult Google because without the textures the following steps won&#039;t produce a usable icon.&lt;br /&gt;
# Add a source of light...&lt;br /&gt;
## Make sure the editor is in the &#039;&#039;Layout&#039;&#039; mode by checking the top most toolbar.&lt;br /&gt;
## From the toolbar just under that one, find and open the &#039;&#039;Add&#039;&#039; drop down.&lt;br /&gt;
## Hover &#039;&#039;Light&#039;&#039; to open that sub-menu.&lt;br /&gt;
## Click &#039;&#039;Sun&#039;&#039;.&lt;br /&gt;
# Add a camera...&lt;br /&gt;
## Again make sure the editor is in the &#039;&#039;Layout&#039;&#039; mode.&lt;br /&gt;
## From the second toolbar down, find and open the &#039;&#039;Add&#039;&#039; drop down.&lt;br /&gt;
## Select &#039;&#039;Camera&#039;&#039;.&lt;br /&gt;
# Setup the scene with the object placement and lighting direction desired.  &#039;&#039;&#039;Tip:&#039;&#039;&#039; To reset the editor to something selected press the period key &amp;lt;u&amp;gt;on the numpad&amp;lt;/u&amp;gt;. Without a numpad, use &#039;&#039;View&#039;&#039; (second toolbar from the top) and select &#039;&#039;Frame Selected&#039;&#039; from it. Alternatively, just set the zoom to zoom to the mouse position: &#039;&#039;Edit&#039;&#039; (top toolbar), &#039;&#039;Preferences&#039;&#039; (from drop down), &#039;&#039;Navigation&#039;&#039; (on left menu), &#039;&#039;Zoom to Mouse Position&#039;&#039; (In the zoom section). This makes moving around a lot more natural feeling.&lt;br /&gt;
# Setup the rendering camera...&lt;br /&gt;
## Go to &#039;&#039;Rendering&#039;&#039;  tab on the top toolbar&lt;br /&gt;
## On the right there will be a side-panel open, it should be the &#039;&#039;Render&#039;&#039; tab. Confirm that.&lt;br /&gt;
## Change &#039;&#039;Render Engine&#039;&#039; to &#039;&#039;Cycles&#039;&#039;.&lt;br /&gt;
## Look down below in the same tab for the &#039;&#039;Film&#039;&#039; section.&lt;br /&gt;
## Expand it and find the &#039;&#039;Transparent&#039;&#039; checkbox and section. Click it so that it has a check mark. This will make the icon&#039;s background transparent.&lt;br /&gt;
## Now, go to the &#039;&#039;Output&#039;&#039; tab &amp;lt;u&amp;gt;on the side panel&amp;lt;/u&amp;gt;. The tab is just below the current one.&lt;br /&gt;
## In the &#039;&#039;Format&#039;&#039; section set &#039;&#039;Resolution X&#039;&#039; to &#039;&#039;64.&#039;&#039; And &#039;&#039;Y&#039;&#039; to &#039;&#039;64&#039;&#039; as well. This will make the icon generated a 64 by 64 pixel image.&lt;br /&gt;
# Go back to the &#039;&#039;Layout&#039;&#039; tab from the top toolbar.&lt;br /&gt;
# Center your view on the object (numpad period or &#039;&#039;View &amp;gt; Frame Selected&#039;&#039;). Adjust it so that the object is how it should be for the icon.&lt;br /&gt;
# Align the camera to the view...&lt;br /&gt;
## Make sure the editor is in &#039;&#039;Layout&#039;&#039; mode (top toolbar).&lt;br /&gt;
## Find &#039;&#039;View&#039;&#039; from the second from the top toolbar and open the drop down.&lt;br /&gt;
## Hover &#039;&#039;Align View&#039;&#039; to open the sub-menu.&lt;br /&gt;
## Select &#039;&#039;Align Active Camera To View&#039;&#039;.&lt;br /&gt;
## If the view is slightly off, there is a lock icon on the right side of this panel. Use it to &amp;quot;lock&amp;quot; controls to the camera and tweak it&#039;s view.&lt;br /&gt;
# Now return to the &#039;&#039;Rendering&#039;&#039; tab from the top toolbar.&lt;br /&gt;
# Press the F12 key to start the render. This should complete quickly since 64x64 pixels is a very small render.&lt;br /&gt;
# A window should popup, &#039;&#039;Blender Render&#039;&#039;. This is the icon!&lt;br /&gt;
# From the top tool bar of this &#039;&#039;Blender Render&#039;&#039; window, open the &#039;&#039;Image&#039;&#039; drop down.&lt;br /&gt;
# Select &#039;&#039;Save As...&#039;&#039; to save somewhere on the computer.&lt;br /&gt;
# Return to step 13 and repeat to do larger images if desired. Create a 128 by 128 pixel image too. It will make things smoother later.&lt;br /&gt;
# Save the Blender scene. Not only will it be used later, this will make making a new icon with a small tweak that much easier.&lt;br /&gt;
## &#039;&#039;File&#039;&#039; drop down from top toolbar.&lt;br /&gt;
## &#039;&#039;Save As...&#039;&#039; to save the Blender scene to the computer.&lt;br /&gt;
## Save it to &amp;lt;code&amp;gt;Assets/WikiDemo/MedievalStall - Icon Scene.blend&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Adding to Unity Scene ===&lt;br /&gt;
The developers explain how to create an item in one of ModKit&#039;s read me files (See: &amp;lt;code&amp;gt;Assets/EcoModKit/Docs/README.md&amp;lt;/code&amp;gt;), but this guide will explain it below.&lt;br /&gt;
&lt;br /&gt;
Additionally, &#039;&#039;&#039;TheKye&#039;&#039;&#039; on YouTube covers this in their &#039;&#039;Creating Your First Item&#039;&#039; and &#039;&#039;Creating Your First Item Pt 2&#039;&#039; videos.&lt;br /&gt;
&lt;br /&gt;
Use those additional resource to help troubleshoot issues with item&#039;s icons.&lt;br /&gt;
&lt;br /&gt;
# Open &amp;lt;u&amp;gt;Unity&amp;lt;/u&amp;gt;.&lt;br /&gt;
# In the left panel, the &#039;&#039;Hierarchy&#039;&#039; tab should be selected.&lt;br /&gt;
# Select the top-most object there. It should be a scene. If the editor last loaded the &#039;&#039;Demo&#039;&#039; scene from the medieval assets, it&#039;ll be named &#039;&#039;Demo&#039;&#039;.&lt;br /&gt;
# Right click on this scene and select &#039;&#039;Add New Scene&#039;&#039; from the menu.&lt;br /&gt;
# Right click again on the old scene (&#039;&#039;Demo&#039;&#039;) and select &#039;&#039;Remove Scene&#039;&#039;.&lt;br /&gt;
# Let it save if the changes to the old scene are important. Discard if it was open just for exploration&#039;s sake.&lt;br /&gt;
# Right click the new, &#039;&#039;Untitled&#039;&#039; scene. Click &#039;&#039;Save Scene As...&#039;&#039;&lt;br /&gt;
# Save it to &amp;lt;code&amp;gt;Assets/WikiDemo.unity&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Delete &amp;lt;u&amp;gt;anything&amp;lt;/u&amp;gt; in the scene.&lt;br /&gt;
# Right click the scene, hover &#039;&#039;GameObject&#039;&#039;, and select &#039;&#039;Create Empty&#039;&#039; from the sub-menu.&lt;br /&gt;
# Name this new object &#039;&#039;Objects&#039;&#039;.&lt;br /&gt;
# Select the newly created &#039;&#039;Objects&#039;&#039; object from the &#039;&#039;Hierarchy&#039;&#039; menu.&lt;br /&gt;
# On the far right side of the screen, in the &#039;&#039;Inspector&#039;&#039; menu, click the &#039;&#039;Add Component&#039;&#039; button.&lt;br /&gt;
# Type in &#039;&#039;ModkitPrefabContainer&#039;&#039;. Click on the component from the search to add it. The component now should be listed in the &#039;&#039;Inspector&#039;&#039;.&lt;br /&gt;
# In the &#039;&#039;Hierarchy&#039;&#039; panel right click the scene, hover &#039;&#039;GameObject&#039;&#039;, and select &#039;&#039;Create Empty&#039;&#039;.&lt;br /&gt;
# Name this new object &#039;&#039;Items&#039;&#039;.&lt;br /&gt;
# Right click the scene, hover &#039;&#039;GameObject&#039;&#039;, and select &#039;&#039;Create Empty&#039;&#039;.&lt;br /&gt;
# Name this new object &#039;&#039;Emoji&#039;&#039;.&lt;br /&gt;
# Select the newly created &#039;&#039;Emoji&#039;&#039; object, find the &#039;&#039;Inspector&#039;&#039; menu (far-right), and click the &#039;&#039;Add Component&#039;&#039; button.&lt;br /&gt;
# Type in &#039;&#039;ChatEmoteSetOld&#039;&#039;. Click on the component from the search to add it. That component should now be listed in the &#039;&#039;Inspector&#039;&#039;.&lt;br /&gt;
# Right click the scene, hover &#039;&#039;GameObject&#039;&#039;, and select &#039;&#039;Create Empty&#039;&#039;.&lt;br /&gt;
# Name this new object &#039;&#039;BlockSets&#039;&#039;.&lt;br /&gt;
# Select the newly created &#039;&#039;BlockSets&#039;&#039; object, find the &#039;&#039;Inspector&#039;&#039; menu (far-right), and click &#039;&#039;Add Component&#039;&#039;.&lt;br /&gt;
# Search for &#039;&#039;BlockSetContainer&#039;&#039;. Click on the component from the search to add it. The &#039;&#039;Inspector&#039;&#039; should now show that component as added.&lt;br /&gt;
#Go to &amp;lt;code&amp;gt;Assets/EcoModKit/Prefabs&amp;lt;/code&amp;gt; in the Unity project window.&lt;br /&gt;
# Find the prefab &#039;&#039;ItemTemplate&#039;&#039;.&lt;br /&gt;
# Drag it onto the &#039;&#039;Items&#039;&#039; object in the &#039;&#039;Hierarchy&#039;&#039; panel. It should add it as a &amp;lt;u&amp;gt;child&amp;lt;/u&amp;gt; of the &#039;&#039;Items&#039;&#039; object.&lt;br /&gt;
# Right click on the new &#039;&#039;ItemTemplate&#039;&#039; object, hover &#039;&#039;Prefab&#039;&#039;, and select &#039;&#039;Unpack Completely&#039;&#039;.&lt;br /&gt;
# Right click on the &#039;&#039;ItemTemplate&#039;&#039; object and select &#039;&#039;Rename&#039;&#039;. Name this what you want the item to be called. Example: &#039;&#039;MedievalStallItem&#039;&#039;.&lt;br /&gt;
# Set this item&#039;s background...&lt;br /&gt;
## Here&#039;s the default backgrounds (blue = item, brown = block, green = food): [[File:Eco - Item - Background.png|border|frameless]]        [[File:Eco - Block - Background.png|frameless]]        [[File:Eco - Food - Background.png|frameless]]&lt;br /&gt;
## Download or prepare the background and add it to the &amp;lt;code&amp;gt;Assets&amp;lt;/code&amp;gt; folder in Unity. &lt;br /&gt;
### To follow along lockstep, put the background in a new &amp;lt;code&amp;gt;Assets/WikiDemo&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
### Right click on &amp;lt;code&amp;gt;Assets&amp;lt;/code&amp;gt; folder, hover &#039;&#039;Create&#039;&#039;, select &#039;&#039;Folder&#039;&#039;.&lt;br /&gt;
### Name the folder &#039;&#039;WikiDemo&#039;&#039;.&lt;br /&gt;
## Configure Unity to use these as sprites...&lt;br /&gt;
### Select the background(s) added (Ctrl+Click each one).&lt;br /&gt;
### In the &#039;&#039;Inspector&#039;&#039;, find &#039;&#039;TextureType&#039;&#039; and change that to &#039;&#039;Sprite (2D and UI)&#039;&#039;.&lt;br /&gt;
### Again in the &#039;&#039;Inspector&#039;&#039;, find &#039;&#039;SpriteMode&#039;&#039; and change that to &#039;&#039;Single&#039;&#039;.&lt;br /&gt;
### Then scroll and go to the bottom of the &#039;&#039;Inspector&#039;&#039; and find the &#039;&#039;Apply&#039;&#039; button.&lt;br /&gt;
### This will apply those changes to that file and all other ones highlighted.&lt;br /&gt;
## Select the item being created (&#039;&#039;MedievalStallItem&#039;&#039;).&lt;br /&gt;
## In the &#039;&#039;Inspector&#039;&#039; panel (far-right), scroll and find the &#039;&#039;Item Template (Script)&#039;&#039; section.&lt;br /&gt;
## In here find the &#039;&#039;Background&#039;&#039; input. It&#039;ll say &#039;&#039;Background (Image)&#039;&#039; in it. If clicked that text to reveal and highlight the related object in the &#039;&#039;Hierarchy&#039;&#039; panel.&lt;br /&gt;
## Select the revealed, and highlighted object &#039;&#039;Background&#039;&#039;.&lt;br /&gt;
## In the &#039;&#039;Inspector&#039;&#039; panel, scroll and find the &#039;&#039;Image&#039;&#039; component section.&lt;br /&gt;
## Inside that component&#039;s section, find &#039;&#039;Source Image&#039;&#039;. It&#039;ll say &#039;&#039;Missing (Sprite)&#039;&#039;. Click the &#039;&#039;⦿&#039;&#039; button to the right.&lt;br /&gt;
## The &#039;&#039;Select Sprite&#039;&#039; popup will show. Make sure the &#039;&#039;Assets&#039;&#039; tab is selected, and find the backgrounds desired.&lt;br /&gt;
#Create the foreground image...&lt;br /&gt;
##This is easily accomplished in MS Paint.&lt;br /&gt;
##Get to the background image file in a &amp;lt;u&amp;gt;file explorer&amp;lt;/u&amp;gt;.&lt;br /&gt;
##Right click on it, hover &#039;&#039;Open with...&#039;&#039;, and select &#039;&#039;Paint&#039;&#039;.&lt;br /&gt;
##The solid background should be displayed.&lt;br /&gt;
##Open the &#039;&#039;File&#039;&#039; menu from the top toolbar.&lt;br /&gt;
##Hover &#039;&#039;Import to Canvas&#039;&#039; and select &#039;&#039;From a File&#039;&#039;.&lt;br /&gt;
##Find the icon in the file browser and import it. Match the size of the background image to have it nicely center itself.&lt;br /&gt;
##Now &#039;&#039;File&#039;&#039; from the top toolbar.&lt;br /&gt;
##Hover &#039;&#039;Save As...&#039;&#039; and select &#039;&#039;PNG&#039;&#039;.&lt;br /&gt;
##Save this to the &amp;lt;code&amp;gt;Assets/WikiDemo&amp;lt;/code&amp;gt; folder in Unity.&lt;br /&gt;
##Configure Unity to use these as sprites...&lt;br /&gt;
### Select the foreground image.&lt;br /&gt;
### In the &#039;&#039;Inspector&#039;&#039;, find &#039;&#039;TextureType&#039;&#039; and change that to &#039;&#039;Sprite (2D and UI)&#039;&#039;.&lt;br /&gt;
### Again in the &#039;&#039;Inspector&#039;&#039;, find &#039;&#039;SpriteMode&#039;&#039; and change that to &#039;&#039;Single&#039;&#039;.&lt;br /&gt;
### Then scroll and go to the bottom of the &#039;&#039;Inspector&#039;&#039; and find the &#039;&#039;Apply&#039;&#039; button.&lt;br /&gt;
### This will apply those changes to that file and all other ones highlighted.&lt;br /&gt;
#Set this item&#039;s foreground...&lt;br /&gt;
## Copy the item&#039;s icon into the &amp;lt;code&amp;gt;Assets&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
## Configure Unity to use it as a sprite (see the previous step&#039;s &#039;&#039;Set this item&#039;s background...&#039;&#039; instructions)&lt;br /&gt;
## Select the item being created (&#039;&#039;MedievalStallItem&#039;&#039;).&lt;br /&gt;
## In the &#039;&#039;Inspector&#039;&#039; panel (far-right), scroll and find the &#039;&#039;Item Template (Script)&#039;&#039; section.&lt;br /&gt;
## In here find the &#039;&#039;Foreground&#039;&#039; input. It&#039;ll say &#039;&#039;Foreground (Image)&#039;&#039; in it. If clicked that text to reveal and highlight the related object in the &#039;&#039;Hierarchy&#039;&#039; panel.&lt;br /&gt;
## Select the revealed, and highlighted object &#039;&#039;Foreground&#039;&#039;.&lt;br /&gt;
## Use the &#039;&#039;Inspector&#039;&#039;, find the &#039;&#039;Image&#039;&#039; component, within that component find the &#039;&#039;Source Image&#039;&#039; input. It will say &#039;&#039;Missing (Sprite)&#039;&#039;.&lt;br /&gt;
## Click the &#039;&#039;⦿&#039;&#039; button to the right of that input.&lt;br /&gt;
## From the &#039;&#039;Select Sprite&#039;&#039; popup, ensure the &#039;&#039;Assets&#039;&#039; tab is being searched, and find the icon just created.&lt;br /&gt;
&lt;br /&gt;
=== Export From Unity ===&lt;br /&gt;
&lt;br /&gt;
# Open the &#039;&#039;File&#039;&#039; menu from the top toolbar.&lt;br /&gt;
# Select &#039;&#039;Save.&#039;&#039; Save it to the &amp;lt;code&amp;gt;Assets/WikiDemo&amp;lt;/code&amp;gt; folder. &#039;&#039;&#039;Note:&#039;&#039;&#039; Do not skip. The scene must be saved for the ModKit build to work properly.&lt;br /&gt;
# Open the &#039;&#039;Eco Tools&#039;&#039; menu from the top toolbar.&lt;br /&gt;
# Hover &#039;&#039;Mod Kit&#039;&#039; to open the sub-menu.&lt;br /&gt;
# Select &#039;&#039;Build Current Bundle&#039;&#039;.&lt;br /&gt;
# Have it output the bundle to &amp;lt;code&amp;gt;/Eco Server/Mods/UserCode/WikiDemo.unity3d&amp;lt;/code&amp;gt;&lt;br /&gt;
# Wait for this to build. This may take a few minutes.&lt;br /&gt;
&lt;br /&gt;
=== Scripting the Item ===&lt;br /&gt;
For a more complex mod, it would be wise to build it into a DLL. See [[Getting Started with Eco Modding in Visual Studio 2022]] for details on that.&lt;br /&gt;
&lt;br /&gt;
# Create a &amp;lt;code&amp;gt;.cs&amp;lt;/code&amp;gt; file: &amp;lt;code&amp;gt;/Eco Server/Mods/UserCode/WikiDemo.cs&amp;lt;/code&amp;gt;&lt;br /&gt;
# Put the following into the newly created file:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;using Eco.Core.Items;&lt;br /&gt;
using Eco.Gameplay.Items;&lt;br /&gt;
using Eco.Shared.Localization;&lt;br /&gt;
using Eco.Shared.Serialization;&lt;br /&gt;
&lt;br /&gt;
namespace WikiDemo&lt;br /&gt;
{&lt;br /&gt;
    #region Item&lt;br /&gt;
    [Serialized] // Tells the save/load system this object needs to be serialized.&lt;br /&gt;
    [LocDisplayName(&amp;quot;Market Stall&amp;quot;)] // Defines the localized name of the item.&lt;br /&gt;
    [Weight(100)] // Defines how heavy Arrow is.&lt;br /&gt;
    [Ecopedia(&amp;quot;Work Stations&amp;quot;, &amp;quot;Craft Tables&amp;quot;, createAsSubPage: true)]&lt;br /&gt;
    [LocDescription(&amp;quot;A medieval market stall.&amp;quot;)] //The tooltip description for the item.&lt;br /&gt;
    public partial class MedievalStallItem: Item { }&lt;br /&gt;
    #endregion&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Line 8:&#039;&#039;&#039; A region tag. Lets the editor know it can collapse all of that code as a section. The following examples in this guide will just show &amp;lt;code&amp;gt;#region Item&amp;lt;/code&amp;gt; in their code examples.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 13:&#039;&#039;&#039; The implementation of &amp;lt;code&amp;gt;Item&amp;lt;/code&amp;gt; means that Eco will find this and look for Unity assets that matching this class&#039; name, &amp;lt;code&amp;gt;MedivalStallItem&amp;lt;/code&amp;gt;. While this doesn&#039;t do anything fancy, it completes the first step towards a new workbench.&lt;br /&gt;
&lt;br /&gt;
=== Checkpoint ===&lt;br /&gt;
[[File:Eco - Hotbar With Modded Icon.png|thumb|Shows the medieval stall as a modded icon in-game.]]&lt;br /&gt;
This was a lot of setup and steps. Make sure everything is running smoothly by doing the following:&lt;br /&gt;
&lt;br /&gt;
# Double-check that the &amp;lt;code&amp;gt;WikiDemo.unity3d&amp;lt;/code&amp;gt; and the &amp;lt;code&amp;gt;WikiDemo.cs&amp;lt;/code&amp;gt; files are in &amp;lt;code&amp;gt;/Eco Server/Mods/UserCode&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
# Start the server and connect to it.&lt;br /&gt;
# Test it out by typing &amp;lt;code&amp;gt;/give MedievalStall&amp;lt;/code&amp;gt; in chat&lt;br /&gt;
## It&#039;s also possible to do &amp;lt;code&amp;gt;/give Market Stall&amp;lt;/code&amp;gt; to get the item. How? Line 10: of the the above code declares that name as this item&#039;s &amp;quot;common name&amp;quot;. Neat.&lt;br /&gt;
# The item should appear in the players inventory with a working icon.&lt;br /&gt;
&lt;br /&gt;
This was the longest &amp;quot;leg&amp;quot; of this journey. All the setup is done and the infrastructure is in place. The following sections will just build on what was taught here.&lt;br /&gt;
&lt;br /&gt;
Keep on, keeping on!&lt;br /&gt;
&lt;br /&gt;
== Code the Item&#039;s Recipe ==&lt;br /&gt;
This section will be much simpler than the last. The following goes over how to add a new class and implement the &amp;lt;code&amp;gt;RecipeFamily&amp;lt;/code&amp;gt; interface.&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;using Eco.Core.Items;&lt;br /&gt;
using Eco.Gameplay.Components;&lt;br /&gt;
using Eco.Gameplay.Items;&lt;br /&gt;
using Eco.Gameplay.Items.Recipes;&lt;br /&gt;
using Eco.Gameplay.Skills;&lt;br /&gt;
using Eco.Mods.TechTree;&lt;br /&gt;
using Eco.Shared.Localization;&lt;br /&gt;
using Eco.Shared.Serialization;&lt;br /&gt;
using System.Runtime.Versioning;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
&lt;br /&gt;
namespace WikiDemo&lt;br /&gt;
{&lt;br /&gt;
    #region Item&lt;br /&gt;
&lt;br /&gt;
    #region Recipe&lt;br /&gt;
    [RequiresSkill(typeof(CarpentrySkill), 3)]&lt;br /&gt;
    [Ecopedia(&amp;quot;Work Stations&amp;quot;, &amp;quot;Craft Tables&amp;quot;, subPageName: &amp;quot;Market Stall&amp;quot;)]&lt;br /&gt;
    public partial class MedievalStallRecipe : RecipeFamily&lt;br /&gt;
    {&lt;br /&gt;
        [SupportedOSPlatform(&amp;quot;windows7.0&amp;quot;)]&lt;br /&gt;
        public MedievalStallRecipe()&lt;br /&gt;
        {&lt;br /&gt;
            var recipe = new Recipe();&lt;br /&gt;
            recipe.Init(&lt;br /&gt;
                name: &amp;quot;MedievalStallItem&amp;quot;,&lt;br /&gt;
                displayName: Localizer.DoStr(&amp;quot;Market Stall&amp;quot;),&lt;br /&gt;
                ingredients: new List&amp;lt;IngredientElement&amp;gt;&lt;br /&gt;
                {&lt;br /&gt;
                    new IngredientElement(&amp;quot;Wood&amp;quot;, 40, typeof(Skill)),&lt;br /&gt;
                    new IngredientElement(typeof(CottonFabricItem), 30, typeof(Skill)),&lt;br /&gt;
                    new IngredientElement(typeof(HempMooringRopeItem), 5, true)&lt;br /&gt;
                },&lt;br /&gt;
                items: new List&amp;lt;CraftingElement&amp;gt;&lt;br /&gt;
                {&lt;br /&gt;
                    new CraftingElement&amp;lt;MedievalStallItem&amp;gt;(1)&lt;br /&gt;
                }&lt;br /&gt;
            );&lt;br /&gt;
            this.Recipes = new List&amp;lt;Recipe&amp;gt; { recipe };&lt;br /&gt;
            this.LaborInCalories = CreateLaborInCaloriesValue(800, typeof(Skill));&lt;br /&gt;
            this.CraftMinutes = CreateCraftTimeValue(typeof(MedievalStallRecipe), 10f, typeof(Skill));&lt;br /&gt;
    &lt;br /&gt;
            // Perform pre/post initialization for user mods and initialize our recipe instance with the display name &amp;quot;Market Stall&amp;quot;&lt;br /&gt;
            this.ModsPreInitialize();&lt;br /&gt;
            this.Initialize(displayText: Localizer.DoStr(&amp;quot;Market Stall&amp;quot;), recipeType: typeof(MedievalStallRecipe));&lt;br /&gt;
            this.ModsPostInitialize();&lt;br /&gt;
    &lt;br /&gt;
            // Register our RecipeFamily instance to a work table (in this case the Carpentry Table) so it can be crafted.&lt;br /&gt;
            CraftingComponent.AddRecipe(tableType: typeof(CarpentryTableObject), recipeFamily: this); // NOTE: The table must be the object instance!&lt;br /&gt;
        }&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
        /// &amp;lt;summary&amp;gt;Hook for other mods to customize RecipeFamily before initialization.&amp;lt;/summary&amp;gt;&lt;br /&gt;
        partial void ModsPreInitialize();&lt;br /&gt;
    &lt;br /&gt;
        /// &amp;lt;summary&amp;gt;Hook for other mods to customize RecipeFamily after initialization, but before registration. You can change skill requirements here.&amp;lt;/summary&amp;gt;&lt;br /&gt;
        partial void ModsPostInitialize();&lt;br /&gt;
    }&lt;br /&gt;
    #endregion&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Line 10:&#039;&#039;&#039; Eco will need this explicitly added to the file. Visual Studio will not add this line automatically. It&#039;s used for the &amp;lt;code&amp;gt;List&amp;lt;T&amp;gt;&amp;lt;/code&amp;gt; objects found in this code.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 14:&#039;&#039;&#039; &amp;quot;Collapsed&amp;quot; &amp;lt;code&amp;gt;Item&amp;lt;/code&amp;gt; section. See the earlier sections in this guide for the code that belongs there.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 17:&#039;&#039;&#039; Sets the required skill and skill level to craft this recipe.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 21:&#039;&#039;&#039; &amp;lt;code&amp;gt;[SupportedOSPlatform(&amp;quot;windows7.0&amp;quot;)]&amp;lt;/code&amp;gt; is here to silence some annoying warnings in Visual Studio. It&#039;s optional.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 30-32:&#039;&#039;&#039; Declares the input ingredients used for crafting. &amp;lt;code&amp;gt;typeof(Skill)&amp;lt;/code&amp;gt; gets mapped to the &amp;lt;code&amp;gt;CarpentrySkill&amp;lt;/code&amp;gt; as defined by line 31. In this example the &amp;lt;code&amp;gt;HempMooringRope&amp;lt;/code&amp;gt; is a static input. A static input will not be modified by skills, upgrade modules, or game settings. &#039;&#039;&#039;Note:&#039;&#039;&#039; It seems that at the time of writing (4/21/2026, Eco v13.0.2) the only way to get an ingredient to be a dynamic value that is reduced by the table&#039;s upgrade is to pass &amp;lt;code&amp;gt;typeof(Skill)&amp;lt;/code&amp;gt; to it; Passing either &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; makes the this input static.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 34:&#039;&#039;&#039; The &amp;lt;code&amp;gt;items&amp;lt;/code&amp;gt; list declares what items are &amp;lt;u&amp;gt;output&amp;lt;/u&amp;gt; by this recipe.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 36:&#039;&#039;&#039; This line declares that one medieval stall is output from this recipe. Functionally this links this recipe to the &amp;lt;code&amp;gt;MedievalStallItem&amp;lt;/code&amp;gt; (aka &amp;quot;Market Stall&amp;quot;) item created in the last step.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 40:&#039;&#039;&#039; Amount of calories needed to craft this item. For a static value (not modified by upgrades or skill levels) change this line to: &amp;lt;code&amp;gt;this.LaborInCalories = CreateLaborInCaloriesValue(800);&amp;lt;/code&amp;gt;. As it&#039;s written in the example, this item&#039;s calorie cost will be dynamic (modified by upgrades and skill levels). The skill level that will modify it is declared on line 16.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 41:&#039;&#039;&#039;  Minutes needed to craft. Both static and dynamic values for crafting time can be modified by the world difficulty settings. For a static value change this line to: &amp;lt;code&amp;gt;this.CraftMinutes = CreateCraftTimeValue(10f);&amp;lt;/code&amp;gt;. As it&#039;s written in the example, this item&#039;s craft time will be dynamic.&#039;&#039;&#039;Line 49:&#039;&#039;&#039; This line assigns the recipe to a workbench. &amp;lt;u&amp;gt;Do not assign&amp;lt;/u&amp;gt; to itself because then the first table could never be made. It&#039;s recommend to use a preexisting vanilla table.&lt;br /&gt;
=== Checkpoint ===&lt;br /&gt;
Check the functionality at this point -- it should be possible to see the recipe in the crafting table.&lt;br /&gt;
&lt;br /&gt;
# Have the &amp;lt;code&amp;gt;.unity3d&amp;lt;/code&amp;gt; and the &amp;lt;code&amp;gt;.cs&amp;lt;/code&amp;gt; file in the &amp;lt;code&amp;gt;/Eco Server/Mods/UserCode&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
# Start the server and log in.&lt;br /&gt;
# Type &amp;lt;code&amp;gt;/give Carpentry Table&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Place the Carpentry Table down and interact to see the what can be crafted.&lt;br /&gt;
# Scroll and find the &#039;&#039;Market Stall&#039;&#039; recipe.&lt;br /&gt;
# Type &amp;lt;code&amp;gt;/give Basic Upgrade 4&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Put the basic upgrade into the table.&lt;br /&gt;
# Go back to the recipe for the &#039;&#039;Market Stall&#039;&#039; and make sure the Wood and the Cotton fabric inputs now require less, but the Hemp Mooring Rope still is the same. &#039;&#039;&#039;Note:&#039;&#039;&#039; In case the recipe hasn&#039;t changed close that table&#039;s window and interact with it again. It should for the recipes to refresh now that the upgrade is in it.&lt;br /&gt;
&lt;br /&gt;
== Create the World Object ==&lt;br /&gt;
=== Preparing the 3D Asset ===&lt;br /&gt;
&lt;br /&gt;
# Open &amp;lt;u&amp;gt;Blender&amp;lt;/u&amp;gt;.&lt;br /&gt;
# Load the 3D object created earlier for icon rendering -- &amp;lt;code&amp;gt;Assets/WikiDemo/MedievalStall - Icon Scene.blend&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Cleanup the scene...&lt;br /&gt;
## Use the scene collection panel on the top-right side of the screen. Select and &#039;&#039;&#039;delete any light source&#039;&#039;&#039;. These will have a 💡 icon and by default are named something like &amp;quot;sun&amp;quot;, &amp;quot;point&amp;quot;, &amp;quot;spot&amp;quot; or &amp;quot;area&amp;quot;. &#039;&#039;&#039;Note:&#039;&#039;&#039; If your model is a light source or has one in it, you can leave that light source. The point here is to remove the ambient lights used for icon rendering.&lt;br /&gt;
## In the scene collection panel, select and &#039;&#039;&#039;delete any camera(s)&#039;&#039;&#039;. These have a 🎥 icon and by default are named something like &amp;quot;camera&amp;quot;.&lt;br /&gt;
# &amp;lt;u&amp;gt;If there are multiple different 3D assets in the scene&amp;lt;/u&amp;gt; (like bags, crates, jars, ect.), join them all together...&lt;br /&gt;
## Select all of the meshes by holding &#039;&#039;Shift&#039;&#039; and clicking on each one in the &#039;&#039;Scene Collection&#039;&#039; panel (right side of window). &#039;&#039;&#039;Tip:&#039;&#039;&#039; Quickly select a group of them by selecting one near the top. Then hold &#039;&#039;Shift&#039;&#039;, &#039;&#039;Ctrl,&#039;&#039; and click on one near the bottom. This will both the one at the top and the one at the bottom, but also every item in between. Neat!&lt;br /&gt;
## Be in &#039;&#039;Layout&#039;&#039; mode (top toolbar).&lt;br /&gt;
## Find and open the &#039;&#039;Object&#039;&#039; menu (second toolbar down from the top).&lt;br /&gt;
## Select &#039;&#039;Join&#039;&#039;.&lt;br /&gt;
## In the &#039;&#039;Scene Collection&#039;&#039; panel, double click on the name of the newly joined mesh.&lt;br /&gt;
## Rename it to &amp;lt;code&amp;gt;MedievalStallMesh&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Add and position a reference cube...&lt;br /&gt;
## Make sure the editor is in &#039;&#039;Layout&#039;&#039; view (top toolbar).&lt;br /&gt;
## Then, add a reference cube. Open the &#039;&#039;Add&#039;&#039; menu (second top toolbar down).&lt;br /&gt;
## Hover &#039;&#039;Mesh&#039;&#039;.&lt;br /&gt;
## Select &#039;&#039;Cube.&#039;&#039;&lt;br /&gt;
## Find the &#039;&#039;Properties&#039;&#039; panel. It&#039;s just below the &#039;&#039;Scene Collection&#039;&#039; panel on the right side of the window.&lt;br /&gt;
## Now, still inside that panel but on the left side of it there&#039;s a column of icons.&lt;br /&gt;
## Hover them to see their names.&lt;br /&gt;
## Find the one that reads:  &#039;&#039;Object&#039;&#039;  &#039;&#039;Object Properties&#039;&#039;  &#039;&#039;&#039;Tip:&#039;&#039;&#039; It kinda looks like an orange box&lt;br /&gt;
## Find and expand the &#039;&#039;Transform&#039;&#039; section&lt;br /&gt;
## Set &#039;&#039;Location X&#039;&#039; to &#039;&#039;1&#039;&#039;.&lt;br /&gt;
## Just below that, set &#039;&#039;Y&#039;&#039; to &#039;&#039;1&#039;&#039;.&lt;br /&gt;
## Just below that, again, set &#039;&#039;Z&#039;&#039; to &#039;&#039;1&#039;&#039;.&lt;br /&gt;
## The bottom corner of the cube will be touching the green and red axis lines.&lt;br /&gt;
# Move the reference cube&#039;s origin to &amp;lt;code&amp;gt;(0, 0, 0)&amp;lt;/code&amp;gt;...&lt;br /&gt;
## Be in &#039;&#039;Layout&#039;&#039; mode (top toolbar).&lt;br /&gt;
## Open the &#039;&#039;View&#039;&#039; menu (second toolbar down).&lt;br /&gt;
## Select &#039;&#039;Sidebar&#039;&#039;.&lt;br /&gt;
## A new panel will have expanded.&lt;br /&gt;
## Along the right side of that panel there&#039;s buttons (&#039;&#039;Item, Tool, View, Animation&#039;&#039;). Find and click the &#039;&#039;View&#039;&#039; button.&lt;br /&gt;
## Find and expand the &#039;&#039;3D Cursor&#039;&#039; section.&lt;br /&gt;
## Under &#039;&#039;Location&#039;&#039; set &#039;&#039;X&#039;&#039; to &#039;&#039;0&#039;&#039;.&lt;br /&gt;
## &#039;&#039;Y&#039;&#039; to 0.&lt;br /&gt;
## &#039;&#039;Z&#039;&#039; to 0.&lt;br /&gt;
## Now in the &#039;&#039;Scene Collection&#039;&#039; panel, select the &#039;&#039;Cube&#039;&#039; mesh.&lt;br /&gt;
## Open the &#039;&#039;Object&#039;&#039; menu from the second toolbar down from the top.&lt;br /&gt;
## Hover &#039;&#039;Set Origin&#039;&#039;.&lt;br /&gt;
## Select &#039;&#039;Origin to 3D Cursor&#039;&#039;.&lt;br /&gt;
# Set the reference cube&#039;s dimensions...&lt;br /&gt;
## Be in &#039;&#039;Layout&#039;&#039; mode, open the &#039;&#039;View&#039;&#039; menu (second toolbar down), and select and expand the &#039;&#039;Sidebar&#039;&#039; option&#039;&#039;.&#039;&#039;&lt;br /&gt;
## To the right of the sidebar, find and click the &#039;&#039;Item&#039;&#039; button.&lt;br /&gt;
## Expand the &#039;&#039;Transform&#039;&#039; section.&lt;br /&gt;
## Find the &#039;&#039;Dimensions,&#039;&#039; and set &#039;&#039;X&#039;&#039; to &#039;&#039;4&#039;&#039;.&lt;br /&gt;
## &#039;&#039;Y&#039;&#039; to &#039;&#039;3&#039;&#039;.&lt;br /&gt;
## &#039;&#039;Z&#039;&#039; to &#039;&#039;3&#039;&#039;.  &#039;&#039;&#039;Note:&#039;&#039;&#039; These dimensions only make sense for the asset being used for this guide. If using a different one, set the dimensions to the size of the box that model should fit in&lt;br /&gt;
# Adjust the position and scale to fit inside a box. This is important because it ensures that this object won&#039;t clip into other objects when placed.&lt;br /&gt;
## Be in &#039;&#039;Layout&#039;&#039; mode (top toolbar).&lt;br /&gt;
## Find the drop down in the second toolbar from the top that has options like &#039;&#039;Object Mode, Edit Mode, Sculpt Mode,&#039;&#039; etc.&lt;br /&gt;
## Select &#039;&#039;Object Mode&#039;&#039; from that drop down.&lt;br /&gt;
## On the left side of the screen there&#039;s a column of icons. Hover over them to see their names.&lt;br /&gt;
## Select the &#039;&#039;Move&#039;&#039; tool.&lt;br /&gt;
## Click on the Medieval Stall to select it. Zoom out and reposition the camera so that the blue, green, and red arrows are visible.  &#039;&#039;&#039;Tip:&#039;&#039;&#039; By holding the middle-mouse button and dragging the scene will rotate. By holding the middle-mouse button and the &#039;&#039;Shift&#039;&#039; key, the scene will pan.  &#039;&#039;&#039;Tip:&#039;&#039;&#039; If panning or rotating the scene becomes slow or frustrating (especially after zooming), try selecting 3D asset from the &#039;&#039;Scene Collection&#039;&#039; panel, opening the &#039;&#039;View&#039;&#039; menu (second toolbar from top), and selecting &#039;&#039;Frame Selected&#039;&#039;. This will reset the view onto that object and controls should feel normal again.&lt;br /&gt;
## Click and hold one of the arrows. Move the mouse to drag the 3D asset towards the box.&lt;br /&gt;
## Move the 3D asset around till it&#039;s &amp;lt;u&amp;gt;completely inside the box&amp;lt;/u&amp;gt;. If it cannot fit and is too big, continue to the next step.  &#039;&#039;&#039;Tip:&#039;&#039;&#039; To select the 3D asset once it disappears, use the &#039;&#039;Scene Collection&#039;&#039; panel. Click on it there and the blue, green, and red arrows will show up again for it.   &#039;&#039;&#039;Tip:&#039;&#039;&#039; There are preset views. To use them go to the &#039;&#039;View&#039;&#039; menu (second toolbar from top)&#039;&#039;,&#039;&#039; hover &#039;&#039;Viewpoint&#039;&#039;, and select the view that would be most helpful.&lt;br /&gt;
## Find the &#039;&#039;Scale&#039;&#039; tool from the left side of the screen.&lt;br /&gt;
## Now the blue, green, and red &amp;quot;arrows&amp;quot; don&#039;t really look like arrows anymore. They are lines with boxes at the end.&lt;br /&gt;
## Click and hold on those lines to adjust the scale of the 3D asset to make it fit inside the box.  &#039;&#039;&#039;Tip:&#039;&#039;&#039; There are little colored boxes in between the lines that can be dragged to scale the 3D asset more proportionally.&lt;br /&gt;
## Continue using the &#039;&#039;Move&#039;&#039; and &#039;&#039;Scale&#039;&#039; tools till the model fits. This will take patience and time.  &#039;&#039;&#039;Tip:&#039;&#039;&#039; Hide the reference cube to see what is happening with the 3D asset. Go to the &#039;&#039;Scene Collections&#039;&#039; panel and click the 👁 button to hide it. Click that button again to show it.&lt;br /&gt;
# Now set the 3D asset&#039;s origin point... &amp;lt;!-- I still need to determine where the origin point should be based on occupancy code. --&amp;gt;&lt;br /&gt;
## Ensure that the 3D Cursor is still at &amp;lt;code&amp;gt;(0,0,0)&amp;lt;/code&amp;gt;: Open the &#039;&#039;View&#039;&#039; menu (second toolbar down), select and expand the &#039;&#039;Sidebar&#039;&#039;, click the &#039;&#039;View&#039;&#039; button (right side of the Sidebar), find and expand the &#039;&#039;3D cursor&#039;&#039; section, change the &#039;&#039;Location X, Y,&#039;&#039; and &#039;&#039;Z&#039;&#039; to &#039;&#039;0&#039;&#039;.&lt;br /&gt;
## Select the 3D asset using the &#039;&#039;Scene Collection&#039;&#039; panel.&lt;br /&gt;
## Open the &#039;&#039;Object&#039;&#039; menu (second toolbar down).&lt;br /&gt;
## Hover &#039;&#039;Set Origin&#039;&#039;.&lt;br /&gt;
## Select &#039;&#039;Origin to 3D Cursor&#039;&#039;.&lt;br /&gt;
# Select the reference cube from the &#039;&#039;Scene Collections&#039;&#039; panel.&lt;br /&gt;
# Open &#039;&#039;Object&#039;&#039; menu (second toolbar down).&lt;br /&gt;
# Select &#039;&#039;Delete&#039;&#039;.&lt;br /&gt;
# Open the &#039;&#039;Object&#039;&#039; menu.&lt;br /&gt;
# Hover &#039;&#039;Apply&#039;&#039;.&lt;br /&gt;
# Select &#039;&#039;All Transformations&#039;&#039;.&lt;br /&gt;
# Open the &#039;&#039;File&#039;&#039;  menu from the top toolbar.&lt;br /&gt;
# Hover &#039;&#039;Export&#039;&#039; to open the sub-menu.&lt;br /&gt;
# Select &#039;&#039;FBX (.fbx)&#039;&#039; &lt;br /&gt;
# A &#039;&#039;Blender File View&#039;&#039; window will pop-up.&lt;br /&gt;
# On the right side of this window there&#039;s a ⚙️ icon. Click it to expand the settings region.&lt;br /&gt;
# In the expanded region find the &#039;&#039;Include&#039;&#039; section and expand it. Change the following:&lt;br /&gt;
## Find &#039;&#039;Object Types&#039;&#039; and only select &#039;&#039;Mesh.&#039;&#039; No other option should be highlighted for this setting.&lt;br /&gt;
# In the settings region scroll and find the &#039;&#039;Transform&#039;&#039; section and expand it. Change the following:&lt;br /&gt;
## Find &#039;&#039;Apply Scalings&#039;&#039; and set it to &#039;&#039;FBX All&#039;&#039;.&lt;br /&gt;
## Just below that find &#039;&#039;Forward&#039;&#039; and set it to &#039;&#039;-Z Forward&#039;&#039;.&lt;br /&gt;
## Ensure that the next setting down, &#039;&#039;Up&#039;&#039;, changed to &#039;&#039;Y Up&#039;&#039;.&lt;br /&gt;
## Find &#039;&#039;Apply Unit&#039;&#039; and make sure it&#039;s checked.&lt;br /&gt;
## Next, find &#039;&#039;Use Space Transform&#039;&#039; check it.&lt;br /&gt;
## Lastly, find &#039;&#039;Apply Transform&#039;&#039; and check it too.&lt;br /&gt;
# Save it to &amp;lt;code&amp;gt;Assets/WikiDemo/MedievalStall.fbx&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Save the &amp;lt;code&amp;gt;.blend&amp;lt;/code&amp;gt; file too and close Blender.&lt;br /&gt;
&lt;br /&gt;
=== Add to Unity Scene ===&lt;br /&gt;
&lt;br /&gt;
# Open &amp;lt;u&amp;gt;Unity&amp;lt;/u&amp;gt;.&lt;br /&gt;
# Select the &amp;lt;code&amp;gt;.fbx&amp;lt;/code&amp;gt; file in the project window.&lt;br /&gt;
# Open the &#039;&#039;Eco Tools&#039;&#039; menu from the top toolbar.&lt;br /&gt;
# Hover &#039;&#039;Mod Kit&#039;&#039;.&lt;br /&gt;
# Select &#039;&#039;World Object Setup.&#039;&#039;&lt;br /&gt;
# A &#039;&#039;World Object Setup&#039;&#039;  window will pop-up.&lt;br /&gt;
# Make sure that &#039;&#039;Selected Objects&#039;&#039; reads &#039;&#039;MedievalStall.&#039;&#039;&lt;br /&gt;
# Also make sure that &#039;&#039;World Object Type&#039;&#039; is set to &#039;&#039;World Object&#039;&#039;.&lt;br /&gt;
# Press the &#039;&#039;Setup World Objects&#039;&#039; button.&lt;br /&gt;
# Notice in the project window that a new &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt; file was created -- &amp;lt;code&amp;gt;MedievalStallObject.prefab&amp;lt;/code&amp;gt;&lt;br /&gt;
# Select the &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt; file in the project window.&lt;br /&gt;
# In the &#039;&#039;Inspector&#039;&#039; window (right side), scroll and find the &#039;&#039;World Object (Script)&#039;&#039; component.&lt;br /&gt;
# In that component, find the &#039;&#039;Override Occupancy&#039;&#039; checkbox and check it.&lt;br /&gt;
# A new field just appeared, &#039;&#039;Size&#039;&#039;.&lt;br /&gt;
# Set the &#039;&#039;X&#039;&#039; to &#039;&#039;4&#039;&#039;.&lt;br /&gt;
# &#039;&#039;Y&#039;&#039; to &#039;&#039;3&#039;&#039;.&lt;br /&gt;
# &#039;&#039;Z&#039;&#039; to &#039;&#039;3.&#039;&#039; &#039;&#039;&#039;Note:&#039;&#039;&#039; These are the sizes used for the reference cube. If using different sizes make sure you &amp;lt;u&amp;gt;flip the Y and Z coordinates&amp;lt;/u&amp;gt; when reading coordinates from Blender. Blender uses a different coordinate system that Unity!&lt;br /&gt;
# Select &#039;&#039;Objects&#039;&#039; from &#039;&#039;Hierarchy&#039;&#039; panel.&lt;br /&gt;
# Find the &#039;&#039;Modkit Prefab Container (Script)&#039;&#039; component.&lt;br /&gt;
# Expand the &#039;&#039;Prefabs&#039;&#039; section in that component.&lt;br /&gt;
# Click the &#039;&#039;+&#039;&#039; button to add an item to the list.&lt;br /&gt;
# Either...&lt;br /&gt;
## Click the &#039;&#039;⦿&#039;&#039; button, switch to the &#039;&#039;Assets&#039;&#039; tab, find or search for &#039;&#039;MedievalStallObject&#039;&#039;, and double click on it. Make sure it&#039;s the medieval stall &amp;lt;u&amp;gt;object&amp;lt;/u&amp;gt; with the &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt; ending.&lt;br /&gt;
## Drag the &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt; file onto the &#039;&#039;⦿&#039;&#039; button&lt;br /&gt;
# &lt;br /&gt;
# Open the &#039;&#039;File&#039;&#039; menu from top toolbar and select &#039;&#039;Save&#039;&#039;.  &#039;&#039;&#039;Note:&#039;&#039;&#039; Do not skip. The scene must be saved for the ModKit build to work properly.&lt;br /&gt;
# Open the &#039;&#039;Eco Tools&#039;&#039; menu from the top toolbar.&lt;br /&gt;
# Hover &#039;&#039;Mod Kit&#039;&#039;.&lt;br /&gt;
# Select &#039;&#039;Build Current Bundle&#039;&#039;.&lt;br /&gt;
# Save the bundle to &amp;lt;code&amp;gt;/Eco Server/Mods/UserCode/WikiDemo.unity3d&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TODO:&#039;&#039;&#039; Explain that if the orgin point isn&#039;t at the bottom-left corner of the model, then &#039;&#039;World Object (Script) &amp;gt; Occupancy Offset&#039;&#039; will need adjusted manually.&lt;br /&gt;
&lt;br /&gt;
=== Scripting the World Object ===&lt;br /&gt;
Code that links the Item to this World Object.&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
using Eco.Core.Items;&lt;br /&gt;
using Eco.Gameplay.Components;&lt;br /&gt;
using Eco.Gameplay.Items;&lt;br /&gt;
using Eco.Gameplay.Items.Recipes;&lt;br /&gt;
using Eco.Gameplay.Objects;&lt;br /&gt;
using Eco.Gameplay.Skills;&lt;br /&gt;
using Eco.Mods.TechTree;&lt;br /&gt;
using Eco.Shared.Localization;&lt;br /&gt;
using Eco.Shared.Serialization;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Runtime.Versioning;&lt;br /&gt;
using System;&lt;br /&gt;
&lt;br /&gt;
namespace WikiDemo&lt;br /&gt;
{&lt;br /&gt;
    #region Item&lt;br /&gt;
    [Serialized] // Tells the save/load system this object needs to be serialized.&lt;br /&gt;
    [LocDisplayName(&amp;quot;Market Stall&amp;quot;)] // Defines the localized name of the item.&lt;br /&gt;
    [Weight(100)] // Defines how heavy Arrow is.&lt;br /&gt;
    [Ecopedia(&amp;quot;Work Stations&amp;quot;, &amp;quot;Craft Tables&amp;quot;, createAsSubPage: true)]&lt;br /&gt;
    [LocDescription(&amp;quot;A medieval market stall.&amp;quot;)] //The tooltip description for the item.&lt;br /&gt;
    public partial class MedievalStallItem : WorldObjectItem&amp;lt;MedievalStallObject&amp;gt; { }&lt;br /&gt;
    #endregion&lt;br /&gt;
&lt;br /&gt;
    #region Recipe&lt;br /&gt;
&lt;br /&gt;
    #region Object&lt;br /&gt;
    [Serialized]&lt;br /&gt;
    public partial class MedievalStallObject : WorldObject, IRepresentsItem&lt;br /&gt;
    {&lt;br /&gt;
        public Type RepresentedItemType =&amp;gt; typeof(MedievalStallItem);&lt;br /&gt;
    }&lt;br /&gt;
    #endregion&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Line 22:&#039;&#039;&#039; This changes from implementing &amp;lt;code&amp;gt;Item&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;WorldObjectItem&amp;lt;MedievalStallObject&amp;gt;&amp;lt;/code&amp;gt;. This is what gives the item the ability to place the table down in the world.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 25:&#039;&#039;&#039; The &amp;quot;collapsed&amp;quot; Recipe section. See earlier sections in this guide to see what code belongs here.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 29:&#039;&#039;&#039; Declares the &amp;lt;code&amp;gt;MedievalStallObject&amp;lt;/code&amp;gt;. It&#039;s important that this class name is matches exactly the &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt; file name because the name is what links them.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 31:&#039;&#039;&#039; This line is similar in function to line 22, it&#039;s declaring that this &amp;lt;code&amp;gt;MedievalStallObject&amp;lt;/code&amp;gt; is &amp;lt;code&amp;gt;MedievalStallItem&amp;lt;/code&amp;gt; when in inventories.&lt;br /&gt;
&lt;br /&gt;
=== Checkpoint ===&lt;br /&gt;
Export and see what it does. Ensure it&#039;s not lifting off the ground because of a non-curved shader.&lt;br /&gt;
&lt;br /&gt;
==== Origin Point Editing ====&lt;br /&gt;
Talk about what it does: the point that the simulation considers this world object to be at.&lt;br /&gt;
&lt;br /&gt;
Show how to move it around using blender.&lt;br /&gt;
&lt;br /&gt;
== Final Export ==&lt;br /&gt;
Export.&lt;br /&gt;
&lt;br /&gt;
Package.&lt;br /&gt;
&lt;br /&gt;
Distribute.&lt;/div&gt;</summary>
		<author><name>WugWugg</name></author>
	</entry>
	<entry>
		<id>https://wiki.play.eco/en/index.php?title=From_3D_Asset_to_Working_Worktable&amp;diff=16712</id>
		<title>From 3D Asset to Working Worktable</title>
		<link rel="alternate" type="text/html" href="https://wiki.play.eco/en/index.php?title=From_3D_Asset_to_Working_Worktable&amp;diff=16712"/>
		<updated>2026-04-21T19:20:52Z</updated>

		<summary type="html">&lt;p&gt;WugWugg: Working on recipe code.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction =&lt;br /&gt;
Below is a guide on how to take an 3D asset from the Unity Store and make a working workbench in Eco. This includes:&lt;br /&gt;
* Creating a recipe to craft the modded table&lt;br /&gt;
* Creating recipes so the player can use the modded table to craft something&lt;br /&gt;
* Using Blender to generate a modded icon (seen when holding it in inventory)&lt;br /&gt;
* Using Blender to adjust the origin point of the model&lt;br /&gt;
* How to setup all this in a Unity scene and package for Eco&lt;br /&gt;
&lt;br /&gt;
= Setup =&lt;br /&gt;
&lt;br /&gt;
* Already have setup &#039;&#039;&#039;ModKit + Unity&#039;&#039;&#039;&lt;br /&gt;
** See: [[Installing the ModKit]]&lt;br /&gt;
* Have a &#039;&#039;&#039;3D model&#039;&#039;&#039;&lt;br /&gt;
** Just following along? Find the one used here at &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://assetstore.unity.com/packages/3d/props/low-poly-medieval-market-stalls-314286&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* A &#039;&#039;&#039;C# IDE&#039;&#039;&#039; (notepad++, Visual Studio, etc.)&lt;br /&gt;
** Highly encouraged to have an Intellisense setup and linked to the &#039;&#039;&#039;Reference Assemblies&#039;&#039;&#039;. Optional, but its really worth the time to figure out because it will help quickly correct small typos and trivial mistakes.&lt;br /&gt;
** See: [[Getting Started with Eco Modding in Visual Studio 2022]] (generally the same steps apply if using a new version of Visual Studio)&lt;br /&gt;
* &#039;&#039;&#039;Blender&#039;&#039;&#039; installed&lt;br /&gt;
** Homepage: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://www.blender.org/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Importing the Assets ==&lt;br /&gt;
&lt;br /&gt;
# Open the Unity editor to the project.&lt;br /&gt;
# From the top toolbar open the &#039;&#039;Window&#039;&#039; drop down.&lt;br /&gt;
# Hover &#039;&#039;Package Management&#039;&#039; to open sub-menu.&lt;br /&gt;
# Select &#039;&#039;Package Manager&#039;&#039;.&lt;br /&gt;
# The &#039;&#039;Package Manager&#039;&#039; window will pop-up.&lt;br /&gt;
# Install the package containing the assets you want to use...&lt;br /&gt;
## &amp;lt;u&amp;gt;If not using Unity Registry&amp;lt;/u&amp;gt;...&lt;br /&gt;
### Find the &#039;&#039;+▾&#039;&#039; button in the top left and open the drop down.&lt;br /&gt;
### Install the package from one of those options.&lt;br /&gt;
## &amp;lt;u&amp;gt;If using Unity Registry&amp;lt;/u&amp;gt;...&lt;br /&gt;
### Visit &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://assetstore.unity.com&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; and sign in.&lt;br /&gt;
### Search for the asset desired.&lt;br /&gt;
### Go to it&#039;s page (e.g. &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://assetstore.unity.com/packages/3d/props/low-poly-medieval-market-stalls-314286&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;) and click the big blue button, &#039;&#039;Add to My Assets.&#039;&#039;&lt;br /&gt;
### Now, in the Unity editor and back at the &#039;&#039;Package Manager&#039;&#039; window.&lt;br /&gt;
### Find &#039;&#039;My Assets&#039;&#039; on the left menu and navigate to it.&lt;br /&gt;
### Click the &#039;&#039;⟳&#039;&#039; button in the lower-right.&lt;br /&gt;
### The asset should be in the list now. Use the search to filter if needed.&lt;br /&gt;
### Click on the asset in the list. For those following along, &#039;&#039;Low Poly Medieval Market Stalls&#039;&#039;.&lt;br /&gt;
### In the right panel, find the &#039;&#039;Download ⤓&#039;&#039; button. Click it.&lt;br /&gt;
### Once downloaded, a new button should show up, it&#039;ll say something like &#039;&#039;⊕ Import 1.0 to project&#039;&#039; . Click it.&lt;br /&gt;
### The &#039;&#039;Import Unity Package&#039;&#039; window will pop-up.&lt;br /&gt;
### Select &#039;&#039;Import&#039;&#039; on it.&lt;br /&gt;
# Verify you can find your assets from the explorer. If following along, the assets are at &amp;lt;code&amp;gt;Assets/PolyRonin/Medieval Market Stalls&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Load in a demo scene, if provided, and make sure everything looks okay.&lt;br /&gt;
## For those following along, double click on the &#039;&#039;Demo&#039;&#039; scene at &amp;lt;code&amp;gt;Assets/PolyRonin/Medieval Market Stalls/Demo.unity&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:Eco - Unity - View Modes.png|thumb|Underlined in red are the different draw mode buttons. &amp;lt;u&amp;gt;4/20/26&amp;lt;/u&amp;gt;]]&lt;br /&gt;
If something seems off, check the different draw modes and see if changing those allow the scene to render as expected (see picture).&lt;br /&gt;
&lt;br /&gt;
With all that setup, it&#039;s time to get to the creation parts.&lt;br /&gt;
&lt;br /&gt;
= Creating The Worktable =&lt;br /&gt;
This guide will create the worktable in this order:&lt;br /&gt;
&lt;br /&gt;
# Create the item that represents the worktable&lt;br /&gt;
# Make a recipe to craft the worktable item&lt;br /&gt;
# Make the worktable item something that places a world object&lt;br /&gt;
# Give the worktable functionality by adding recipes to it&lt;br /&gt;
&lt;br /&gt;
== Creating the Item ==&lt;br /&gt;
&lt;br /&gt;
=== Item Icon ===&lt;br /&gt;
[[File:TeamstersStall - StallOnly - 256x256.png|thumb|A large (256x256px) icon created of Stall4 from the medieval assets.]]&lt;br /&gt;
This process is also explained here, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://mod.io/g/eco/r/origin-points-icon-images-with-blender&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, check it out if you need more visual reference points as that guide has a lot of pictures.&lt;br /&gt;
&lt;br /&gt;
# Open &amp;lt;u&amp;gt;Blender&amp;lt;/u&amp;gt;.&lt;br /&gt;
# Delete everything in the &#039;&#039;Scene Collection&#039;&#039;. Find this section in the top-right of the application.&lt;br /&gt;
# From the top toolbar, open the &#039;&#039;File&#039;&#039; drop down.&lt;br /&gt;
# Hover &#039;&#039;Import&#039;&#039; to open the sub-menu.&lt;br /&gt;
# Select the type of 3D asset. For those using medieval assets, select &#039;&#039;FBX (.fbx)&#039;&#039;.&lt;br /&gt;
# Find the asset on the computer...&lt;br /&gt;
## Tip: Use Unity to find the &amp;lt;code&amp;gt;.fbx&amp;lt;/code&amp;gt; asset. For the medieval assets, that&#039;s in &amp;lt;code&amp;gt;Assets/PolyRonin/Medieval Market Stalls/Meshes/medieval-market-stalls-1.fbx&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Right click on it and select &#039;&#039;Show in explorer&#039;&#039;.&lt;br /&gt;
## Now copy the address of that folder from Explorer. It might look like &amp;lt;code&amp;gt;C:\Users\Wug\EcoMod--WikiDemo\WikiDemo\Assets\PolyRonin\Medieval Market Stalls\Meshes&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Paste that in the address bar of the &amp;lt;u&amp;gt;Blender&amp;lt;/u&amp;gt; import pop-up.&lt;br /&gt;
# Select the blue &#039;&#039;Import FBX&#039;&#039; button&#039;&#039;.&#039;&#039;&lt;br /&gt;
# From &#039;&#039;Layout&#039;&#039; mode, change the Viewport Shading to Material Preview or Rendered. This is on the second toolbar down, far right of center, but before &#039;&#039;Scene Collection&#039;&#039; section.&lt;br /&gt;
# If you see purple models, Blender will need help finding textures for these meshes...&lt;br /&gt;
## From the top toolbar, open the &#039;&#039;File&#039;&#039; drop down.&lt;br /&gt;
## Hover &#039;&#039;External Data&#039;&#039; to open the sub-menu.&lt;br /&gt;
## Select &#039;&#039;Find Missing Files...&#039;&#039;&lt;br /&gt;
## Point this to the whole directory that the 3D assets came in. For the medieval pack, &amp;lt;code&amp;gt;C:\Users\&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;Wug\EcoMod--WikiDemo\WikiDemo\Assets\PolyRonin&amp;lt;/code&amp;gt;.&lt;br /&gt;
## The proper textures/materials should have now loaded in. If it hasn&#039;t, consult Google because without the textures the following steps won&#039;t produce a usable icon.&lt;br /&gt;
# Add a source of light...&lt;br /&gt;
## Make sure the editor is in the &#039;&#039;Layout&#039;&#039; mode by checking the top most toolbar.&lt;br /&gt;
## From the toolbar just under that one, find and open the &#039;&#039;Add&#039;&#039; drop down.&lt;br /&gt;
## Hover &#039;&#039;Light&#039;&#039; to open that sub-menu.&lt;br /&gt;
## Click &#039;&#039;Sun&#039;&#039;.&lt;br /&gt;
# Add a camera...&lt;br /&gt;
## Again make sure the editor is in the &#039;&#039;Layout&#039;&#039; mode.&lt;br /&gt;
## From the second toolbar down, find and open the &#039;&#039;Add&#039;&#039; drop down.&lt;br /&gt;
## Select &#039;&#039;Camera&#039;&#039;.&lt;br /&gt;
# Setup the scene with the object placement and lighting direction desired.  &#039;&#039;&#039;Tip:&#039;&#039;&#039; To reset the editor to something selected press the period key &amp;lt;u&amp;gt;on the numpad&amp;lt;/u&amp;gt;. Without a numpad, use &#039;&#039;View&#039;&#039; (second toolbar from the top) and select &#039;&#039;Frame Selected&#039;&#039; from it. Alternatively, just set the zoom to zoom to the mouse position: &#039;&#039;Edit&#039;&#039; (top toolbar), &#039;&#039;Preferences&#039;&#039; (from drop down), &#039;&#039;Navigation&#039;&#039; (on left menu), &#039;&#039;Zoom to Mouse Position&#039;&#039; (In the zoom section). This makes moving around a lot more natural feeling.&lt;br /&gt;
# Setup the rendering camera...&lt;br /&gt;
## Go to &#039;&#039;Rendering&#039;&#039;  tab on the top toolbar&lt;br /&gt;
## On the right there will be a side-panel open, it should be the &#039;&#039;Render&#039;&#039; tab. Confirm that.&lt;br /&gt;
## Change &#039;&#039;Render Engine&#039;&#039; to &#039;&#039;Cycles&#039;&#039;.&lt;br /&gt;
## Look down below in the same tab for the &#039;&#039;Film&#039;&#039; section.&lt;br /&gt;
## Expand it and find the &#039;&#039;Transparent&#039;&#039; checkbox and section. Click it so that it has a check mark. This will make the icon&#039;s background transparent.&lt;br /&gt;
## Now, go to the &#039;&#039;Output&#039;&#039; tab &amp;lt;u&amp;gt;on the side panel&amp;lt;/u&amp;gt;. The tab is just below the current one.&lt;br /&gt;
## In the &#039;&#039;Format&#039;&#039; section set &#039;&#039;Resolution X&#039;&#039; to &#039;&#039;64.&#039;&#039; And &#039;&#039;Y&#039;&#039; to &#039;&#039;64&#039;&#039; as well. This will make the icon generated a 64 by 64 pixel image.&lt;br /&gt;
# Go back to the &#039;&#039;Layout&#039;&#039; tab from the top toolbar.&lt;br /&gt;
# Center your view on the object (numpad period or &#039;&#039;View &amp;gt; Frame Selected&#039;&#039;). Adjust it so that the object is how it should be for the icon.&lt;br /&gt;
# Align the camera to the view...&lt;br /&gt;
## Make sure the editor is in &#039;&#039;Layout&#039;&#039; mode (top toolbar).&lt;br /&gt;
## Find &#039;&#039;View&#039;&#039; from the second from the top toolbar and open the drop down.&lt;br /&gt;
## Hover &#039;&#039;Align View&#039;&#039; to open the sub-menu.&lt;br /&gt;
## Select &#039;&#039;Align Active Camera To View&#039;&#039;.&lt;br /&gt;
## If the view is slightly off, there is a lock icon on the right side of this panel. Use it to &amp;quot;lock&amp;quot; controls to the camera and tweak it&#039;s view.&lt;br /&gt;
# Now return to the &#039;&#039;Rendering&#039;&#039; tab from the top toolbar.&lt;br /&gt;
# Press the F12 key to start the render. This should complete quickly since 64x64 pixels is a very small render.&lt;br /&gt;
# A window should popup, &#039;&#039;Blender Render&#039;&#039;. This is the icon!&lt;br /&gt;
# From the top tool bar of this &#039;&#039;Blender Render&#039;&#039; window, open the &#039;&#039;Image&#039;&#039; drop down.&lt;br /&gt;
# Select &#039;&#039;Save As...&#039;&#039; to save somewhere on the computer.&lt;br /&gt;
# Return to step 13 and repeat to do larger images if desired. Create a 128 by 128 pixel image too. It will make things smoother later.&lt;br /&gt;
# It&#039;s recommended to save the Blender scene too. This will make making a new icon with a small tweak that much easier...&lt;br /&gt;
## &#039;&#039;File&#039;&#039; drop down from top toolbar.&lt;br /&gt;
## &#039;&#039;Save As...&#039;&#039; to save the Blender scene to the computer.&lt;br /&gt;
&lt;br /&gt;
=== Adding to Unity Scene ===&lt;br /&gt;
The developers explain how to create an item in one of ModKit&#039;s read me files (See: &amp;lt;code&amp;gt;Assets/EcoModKit/Docs/README.md&amp;lt;/code&amp;gt;), but this guide will explain it below.&lt;br /&gt;
&lt;br /&gt;
Additionally, &#039;&#039;&#039;TheKye&#039;&#039;&#039; on YouTube covers this in their &#039;&#039;Creating Your First Item&#039;&#039; and &#039;&#039;Creating Your First Item Pt 2&#039;&#039; videos.&lt;br /&gt;
&lt;br /&gt;
Use those additional resource to help troubleshoot issues with item&#039;s icons.&lt;br /&gt;
&lt;br /&gt;
# Open &amp;lt;u&amp;gt;Unity&amp;lt;/u&amp;gt;.&lt;br /&gt;
# In the left panel, the &#039;&#039;Hierarchy&#039;&#039; tab should be selected.&lt;br /&gt;
# Select the top-most object there. It should be a scene. If the editor last loaded the &#039;&#039;Demo&#039;&#039; scene from the medieval assets, it&#039;ll be named &#039;&#039;Demo&#039;&#039;.&lt;br /&gt;
# Right click on this scene and select &#039;&#039;Add New Scene&#039;&#039; from the menu.&lt;br /&gt;
# Right click again on the old scene (&#039;&#039;Demo&#039;&#039;) and select &#039;&#039;Remove Scene&#039;&#039;.&lt;br /&gt;
# Let it save if the changes to the old scene are important. Discard if it was open just for exploration&#039;s sake.&lt;br /&gt;
# Right click the new, &#039;&#039;Untitled&#039;&#039; scene. Click &#039;&#039;Save Scene As...&#039;&#039;&lt;br /&gt;
# Save it somewhere on the computer and give it a name. Example: &#039;&#039;WikiDemo&#039;&#039;.&lt;br /&gt;
# Delete &amp;lt;u&amp;gt;anything&amp;lt;/u&amp;gt; in the scene.&lt;br /&gt;
# Right click the scene, hover &#039;&#039;GameObject&#039;&#039;, and select &#039;&#039;Create Empty&#039;&#039; from the sub-menu.&lt;br /&gt;
# Name this new object &#039;&#039;Objects&#039;&#039;.&lt;br /&gt;
# Select the newly created &#039;&#039;Objects&#039;&#039; object from the &#039;&#039;Hierarchy&#039;&#039; menu.&lt;br /&gt;
# On the far right side of the screen, in the &#039;&#039;Inspector&#039;&#039; menu, click the &#039;&#039;Add Component&#039;&#039; button.&lt;br /&gt;
# Type in &#039;&#039;ModkitPrefabContainer&#039;&#039;. Click on the component from the search to add it. The component now should be listed in the &#039;&#039;Inspector&#039;&#039;.&lt;br /&gt;
# In the &#039;&#039;Hierarchy&#039;&#039; panel right click the scene, hover &#039;&#039;GameObject&#039;&#039;, and select &#039;&#039;Create Empty&#039;&#039;.&lt;br /&gt;
# Name this new object &#039;&#039;Items&#039;&#039;.&lt;br /&gt;
# Right click the scene, hover &#039;&#039;GameObject&#039;&#039;, and select &#039;&#039;Create Empty&#039;&#039;.&lt;br /&gt;
# Name this new object &#039;&#039;Emoji&#039;&#039;.&lt;br /&gt;
# Select the newly created &#039;&#039;Emoji&#039;&#039; object, find the &#039;&#039;Inspector&#039;&#039; menu (far-right), and click the &#039;&#039;Add Component&#039;&#039; button.&lt;br /&gt;
# Type in &#039;&#039;ChatEmoteSetOld&#039;&#039;. Click on the component from the search to add it. That component should now be listed in the &#039;&#039;Inspector&#039;&#039;.&lt;br /&gt;
# Right click the scene, hover &#039;&#039;GameObject&#039;&#039;, and select &#039;&#039;Create Empty&#039;&#039;.&lt;br /&gt;
# Name this new object &#039;&#039;BlockSets&#039;&#039;.&lt;br /&gt;
# Select the newly created &#039;&#039;BlockSets&#039;&#039; object, find the &#039;&#039;Inspector&#039;&#039; menu (far-right), and click &#039;&#039;Add Component&#039;&#039;.&lt;br /&gt;
# Search for &#039;&#039;BlockSetContainer&#039;&#039;. Click on the component from the search to add it. The &#039;&#039;Inspector&#039;&#039; should now show that component as added.&lt;br /&gt;
# Go to &amp;lt;code&amp;gt;Assets/EcoModKit/Prefabs&amp;lt;/code&amp;gt; in the Unity browser.&lt;br /&gt;
# Find the prefab &#039;&#039;ItemTemplate&#039;&#039;.&lt;br /&gt;
# Drag it onto the &#039;&#039;Items&#039;&#039; object in the &#039;&#039;Hierarchy&#039;&#039; panel. It should add it as a &amp;lt;u&amp;gt;child&amp;lt;/u&amp;gt; of the &#039;&#039;Items&#039;&#039; object.&lt;br /&gt;
# Right click on the new &#039;&#039;ItemTemplate&#039;&#039; object, hover &#039;&#039;Prefab&#039;&#039;, and select &#039;&#039;Unpack Completely&#039;&#039;.&lt;br /&gt;
# Right click on the &#039;&#039;ItemTemplate&#039;&#039; object and select &#039;&#039;Rename&#039;&#039;. Name this what you want the item to be called. Example: &#039;&#039;MedievalStallItem&#039;&#039;.&lt;br /&gt;
# Set this item&#039;s background...&lt;br /&gt;
## Here&#039;s the default backgrounds (blue = item, brown = block, green = food): [[File:Eco - Item - Background.png|border|frameless]]        [[File:Eco - Block - Background.png|frameless]]        [[File:Eco - Food - Background.png|frameless]]&lt;br /&gt;
## Download or prepare the background and add it to the &amp;lt;code&amp;gt;Assets&amp;lt;/code&amp;gt; folder in Unity. &lt;br /&gt;
### To follow along lockstep, put the background in a new &amp;lt;code&amp;gt;Assets/WikiDemo&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
### Right click on &amp;lt;code&amp;gt;Assets&amp;lt;/code&amp;gt; folder, hover &#039;&#039;Create&#039;&#039;, select &#039;&#039;Folder&#039;&#039;.&lt;br /&gt;
### Name the folder &#039;&#039;WikiDemo&#039;&#039;.&lt;br /&gt;
## Configure Unity to use these as sprites...&lt;br /&gt;
### Select the background(s) added (Ctrl+Click each one).&lt;br /&gt;
### In the &#039;&#039;Inspector&#039;&#039;, find &#039;&#039;TextureType&#039;&#039; and change that to &#039;&#039;Sprite (2D and UI)&#039;&#039;.&lt;br /&gt;
### Again in the &#039;&#039;Inspector&#039;&#039;, find &#039;&#039;SpriteMode&#039;&#039; and change that to &#039;&#039;Single&#039;&#039;.&lt;br /&gt;
### Then scroll and go to the bottom of the &#039;&#039;Inspector&#039;&#039; and find the &#039;&#039;Apply&#039;&#039; button.&lt;br /&gt;
### This will apply those changes to that file and all other ones highlighted.&lt;br /&gt;
## Select the item being created (&#039;&#039;MedievalStallItem&#039;&#039;).&lt;br /&gt;
## In the &#039;&#039;Inspector&#039;&#039; panel (far-right), scroll and find the &#039;&#039;Item Template (Script)&#039;&#039; section.&lt;br /&gt;
## In here find the &#039;&#039;Background&#039;&#039; input. It&#039;ll say &#039;&#039;Background (Image)&#039;&#039; in it. If clicked that text to reveal and highlight the related object in the &#039;&#039;Hierarchy&#039;&#039; panel.&lt;br /&gt;
## Select the revealed, and highlighted object &#039;&#039;Background&#039;&#039;.&lt;br /&gt;
## In the &#039;&#039;Inspector&#039;&#039; panel, scroll and find the &#039;&#039;Image&#039;&#039; component section.&lt;br /&gt;
## Inside that component&#039;s section, find &#039;&#039;Source Image&#039;&#039;. It&#039;ll say &#039;&#039;Missing (Sprite)&#039;&#039;. Click the &#039;&#039;⦿&#039;&#039; button to the right.&lt;br /&gt;
## The &#039;&#039;Select Sprite&#039;&#039; popup will show. Make sure the &#039;&#039;Assets&#039;&#039; tab is selected, and find the backgrounds desired.&lt;br /&gt;
#Create the foreground image...&lt;br /&gt;
##This is easily accomplished in MS Paint.&lt;br /&gt;
##Get to the background image file in a &amp;lt;u&amp;gt;file explorer&amp;lt;/u&amp;gt;.&lt;br /&gt;
##Right click on it, hover &#039;&#039;Open with...&#039;&#039;, and select &#039;&#039;Paint&#039;&#039;.&lt;br /&gt;
##The solid background should be displayed.&lt;br /&gt;
##Open the &#039;&#039;File&#039;&#039; menu from the top toolbar.&lt;br /&gt;
##Hover &#039;&#039;Import to Canvas&#039;&#039; and select &#039;&#039;From a File&#039;&#039;.&lt;br /&gt;
##Find the icon in the file browser and import it. Match the size of the background image to have it nicely center itself.&lt;br /&gt;
##Now &#039;&#039;File&#039;&#039; from the top toolbar.&lt;br /&gt;
##Hover &#039;&#039;Save As...&#039;&#039; and select &#039;&#039;PNG&#039;&#039;.&lt;br /&gt;
##Save this to the &amp;lt;code&amp;gt;Assets/WikiDemo&amp;lt;/code&amp;gt; folder in Unity.&lt;br /&gt;
##Configure Unity to use these as sprites...&lt;br /&gt;
### Select the foreground image.&lt;br /&gt;
### In the &#039;&#039;Inspector&#039;&#039;, find &#039;&#039;TextureType&#039;&#039; and change that to &#039;&#039;Sprite (2D and UI)&#039;&#039;.&lt;br /&gt;
### Again in the &#039;&#039;Inspector&#039;&#039;, find &#039;&#039;SpriteMode&#039;&#039; and change that to &#039;&#039;Single&#039;&#039;.&lt;br /&gt;
### Then scroll and go to the bottom of the &#039;&#039;Inspector&#039;&#039; and find the &#039;&#039;Apply&#039;&#039; button.&lt;br /&gt;
### This will apply those changes to that file and all other ones highlighted.&lt;br /&gt;
#Set this item&#039;s foreground...&lt;br /&gt;
## Copy the item&#039;s icon into the &amp;lt;code&amp;gt;Assets&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
## Configure Unity to use it as a sprite (see the previous step&#039;s &#039;&#039;Set this item&#039;s background...&#039;&#039; instructions)&lt;br /&gt;
## Select the item being created (&#039;&#039;MedievalStallItem&#039;&#039;).&lt;br /&gt;
## In the &#039;&#039;Inspector&#039;&#039; panel (far-right), scroll and find the &#039;&#039;Item Template (Script)&#039;&#039; section.&lt;br /&gt;
## In here find the &#039;&#039;Foreground&#039;&#039; input. It&#039;ll say &#039;&#039;Foreground (Image)&#039;&#039; in it. If clicked that text to reveal and highlight the related object in the &#039;&#039;Hierarchy&#039;&#039; panel.&lt;br /&gt;
## Select the revealed, and highlighted object &#039;&#039;Foreground&#039;&#039;.&lt;br /&gt;
## Use the &#039;&#039;Inspector&#039;&#039;, find the &#039;&#039;Image&#039;&#039; component, within that component find the &#039;&#039;Source Image&#039;&#039; input. It will say &#039;&#039;Missing (Sprite)&#039;&#039;.&lt;br /&gt;
## Click the &#039;&#039;⦿&#039;&#039; button to the right of that input.&lt;br /&gt;
## From the &#039;&#039;Select Sprite&#039;&#039; popup, ensure the &#039;&#039;Assets&#039;&#039; tab is being searched, and find the icon just created.&lt;br /&gt;
&lt;br /&gt;
=== Scripting the Item ===&lt;br /&gt;
For a more complex mod, it would be wise to build it into a DLL. See [[Getting Started with Eco Modding in Visual Studio 2022]] for details on that.&lt;br /&gt;
&lt;br /&gt;
For now, just create a &amp;lt;code&amp;gt;.cs&amp;lt;/code&amp;gt; file in the Eco mod directory, &amp;lt;code&amp;gt;/Eco Server/Mods/UserCode/WikiDemo.cs&amp;lt;/code&amp;gt;. The file name doesn&#039;t matter.&lt;br /&gt;
&lt;br /&gt;
To register the item, put the following into the newly created file:&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;using Eco.Core.Items;&lt;br /&gt;
using Eco.Gameplay.Items;&lt;br /&gt;
using Eco.Shared.Localization;&lt;br /&gt;
using Eco.Shared.Serialization;&lt;br /&gt;
&lt;br /&gt;
namespace WikiDemo&lt;br /&gt;
{&lt;br /&gt;
    #region Item&lt;br /&gt;
    [Serialized] // Tells the save/load system this object needs to be serialized.&lt;br /&gt;
    [LocDisplayName(&amp;quot;Market Stall&amp;quot;)] // Defines the localized name of the item.&lt;br /&gt;
    [Weight(100)] // Defines how heavy Arrow is.&lt;br /&gt;
    [Ecopedia(&amp;quot;Work Stations&amp;quot;, &amp;quot;Craft Tables&amp;quot;, createAsSubPage: true)]&lt;br /&gt;
    [LocDescription(&amp;quot;A medieval market stall.&amp;quot;)] //The tooltip description for the item.&lt;br /&gt;
    public partial class MedievalStallItem: Item { }&lt;br /&gt;
    #endregion&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Line 8:&#039;&#039;&#039; A region tag. Lets the editor know it can collapse all of that code as a section. The following examples in this guide will just show &amp;lt;code&amp;gt;#region Item&amp;lt;/code&amp;gt; in their code examples.&#039;&#039;&#039;Line 13:&#039;&#039;&#039; The implementation of &amp;lt;code&amp;gt;Item&amp;lt;/code&amp;gt; means that Eco will find this and look for Unity assets that matching this class&#039; name, &amp;lt;code&amp;gt;MedivalStallItem&amp;lt;/code&amp;gt;. While this doesn&#039;t do anything fancy, it completes the first step towards a new workbench.&lt;br /&gt;
&lt;br /&gt;
=== Checkpoint ===&lt;br /&gt;
[[File:Eco - Hotbar With Modded Icon.png|thumb|Shows the medieval stall as a modded icon in-game.]]&lt;br /&gt;
This was a lot of setup and steps. Make sure everything is running smoothly by doing the following:&lt;br /&gt;
&lt;br /&gt;
# In &amp;lt;u&amp;gt;Unity&amp;lt;/u&amp;gt;.&lt;br /&gt;
# Open the &#039;&#039;Eco Tools&#039;&#039; drop down from the top toolbar.&lt;br /&gt;
# Hover &#039;&#039;Mod Kit&#039;&#039;.&lt;br /&gt;
# Select &#039;&#039;Build Current Bundle&#039;&#039;.&lt;br /&gt;
# A file explorer window will popup. Point it to where you want the newly created bundle to be save.&lt;br /&gt;
# Copy that bundle into the Eco mod directory, &amp;lt;code&amp;gt;/Eco Server/Mods/UserCode&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Start the server and connect to it.&lt;br /&gt;
# Test it out by typing &amp;lt;code&amp;gt;/give MedievalStall&amp;lt;/code&amp;gt; in chat (or &amp;lt;code&amp;gt;/give&amp;lt;/code&amp;gt; whatever your item is named)&lt;br /&gt;
## It&#039;s also possible to do &amp;lt;code&amp;gt;/give Market Stall&amp;lt;/code&amp;gt; to get the item. How? &#039;&#039;&#039;Line 9&#039;&#039;&#039;: of the the above code declares that name as this item&#039;s &amp;quot;common name&amp;quot;. Neat.&lt;br /&gt;
# The item should appear in the players inventory with a working icon.&lt;br /&gt;
&lt;br /&gt;
This was the longest &amp;quot;leg&amp;quot; of this journey. All the setup is done and the infrastructure is in place. The following sections will just build on what was taught here.&lt;br /&gt;
&lt;br /&gt;
Keep on, keeping on!&lt;br /&gt;
&lt;br /&gt;
== Code the Item&#039;s Recipe ==&lt;br /&gt;
This section will be much simpler than the last. The following goes over how to add a new class and implement the &amp;lt;code&amp;gt;RecipeFamily&amp;lt;/code&amp;gt; interface.&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;using Eco.Core.Items;&lt;br /&gt;
using Eco.Gameplay.Components;&lt;br /&gt;
using Eco.Gameplay.Items;&lt;br /&gt;
using Eco.Gameplay.Items.Recipes;&lt;br /&gt;
using Eco.Gameplay.Skills;&lt;br /&gt;
using Eco.Mods.TechTree;&lt;br /&gt;
using Eco.Shared.Localization;&lt;br /&gt;
using Eco.Shared.Serialization;&lt;br /&gt;
using System.Runtime.Versioning;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
&lt;br /&gt;
namespace WikiDemo&lt;br /&gt;
{&lt;br /&gt;
    #region Item&lt;br /&gt;
&lt;br /&gt;
    [RequiresSkill(typeof(CarpentrySkill), 3)]&lt;br /&gt;
    [Ecopedia(&amp;quot;Work Stations&amp;quot;, &amp;quot;Craft Tables&amp;quot;, subPageName: &amp;quot;Market Stall&amp;quot;)]&lt;br /&gt;
    public partial class MedievalStallRecipe : RecipeFamily&lt;br /&gt;
    {&lt;br /&gt;
        [SupportedOSPlatform(&amp;quot;windows7.0&amp;quot;)]&lt;br /&gt;
        public MedievalStallRecipe()&lt;br /&gt;
        {&lt;br /&gt;
            var recipe = new Recipe();&lt;br /&gt;
            recipe.Init(&lt;br /&gt;
                name: &amp;quot;MedievalStallItem&amp;quot;,&lt;br /&gt;
                displayName: Localizer.DoStr(&amp;quot;Market Stall&amp;quot;),&lt;br /&gt;
                ingredients: new List&amp;lt;IngredientElement&amp;gt;&lt;br /&gt;
                {&lt;br /&gt;
                    new IngredientElement(&amp;quot;Wood&amp;quot;, 40, typeof(Skill)),&lt;br /&gt;
                    new IngredientElement(typeof(CottonFabricItem), 30, typeof(Skill)),&lt;br /&gt;
                    new IngredientElement(typeof(HempMooringRopeItem), 5, true) &lt;br /&gt;
                },&lt;br /&gt;
                items: new List&amp;lt;CraftingElement&amp;gt;&lt;br /&gt;
                {&lt;br /&gt;
                    new CraftingElement&amp;lt;MedievalStallItem&amp;gt;(1)&lt;br /&gt;
                }&lt;br /&gt;
            );&lt;br /&gt;
            this.Recipes = new List&amp;lt;Recipe&amp;gt; { recipe };&lt;br /&gt;
            this.LaborInCalories = CreateLaborInCaloriesValue(800, typeof(Skill));&lt;br /&gt;
            this.CraftMinutes = CreateCraftTimeValue(typeof(MedievalStallRecipe), 10f, typeof(Skill));&lt;br /&gt;
&lt;br /&gt;
            // Perform pre/post initialization for user mods and initialize our recipe instance with the display name &amp;quot;Market Stall&amp;quot;&lt;br /&gt;
            this.ModsPreInitialize();&lt;br /&gt;
            this.Initialize(displayText: Localizer.DoStr(&amp;quot;Market Stall&amp;quot;), recipeType: typeof(MedievalStallRecipe));&lt;br /&gt;
            this.ModsPostInitialize();&lt;br /&gt;
&lt;br /&gt;
            // Register our RecipeFamily instance to a work table (in this case the Carpentry Table) so it can be crafted.&lt;br /&gt;
            CraftingComponent.AddRecipe(tableType: typeof(CarpentryTableObject), recipeFamily: this); // NOTE: The table must be the object instance!&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            /// &amp;lt;summary&amp;gt;Hook for other mods to customize RecipeFamily before initialization.&amp;lt;/summary&amp;gt;&lt;br /&gt;
            partial void ModsPreInitialize();&lt;br /&gt;
&lt;br /&gt;
            /// &amp;lt;summary&amp;gt;Hook for other mods to customize RecipeFamily after initialization, but before registration. You can change skill requirements here.&amp;lt;/summary&amp;gt;&lt;br /&gt;
            partial void ModsPostInitialize();&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Line 10:&#039;&#039;&#039; Eco will need this explicitly added to the file. Visual Studio will not add this line automatically. It&#039;s used for the &amp;lt;code&amp;gt;List&amp;lt;T&amp;gt;&amp;lt;/code&amp;gt; objects found in this code.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 14:&#039;&#039;&#039; &amp;quot;Collapsed&amp;quot; &amp;lt;code&amp;gt;Item&amp;lt;/code&amp;gt; section. See the earlier sections in this guide for the code that belongs there.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 16:&#039;&#039;&#039; Sets the required skill and skill level to craft this recipe.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 20:&#039;&#039;&#039; &amp;lt;code&amp;gt;[SupportedOSPlatform(&amp;quot;windows7.0&amp;quot;)]&amp;lt;/code&amp;gt; is here to silence some annoying warnings in Visual Studio. It&#039;s optional.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 29-31:&#039;&#039;&#039; Declares the input ingredients used for crafting. &amp;lt;code&amp;gt;typeof(Skill)&amp;lt;/code&amp;gt; gets mapped to the &amp;lt;code&amp;gt;CarpentrySkill&amp;lt;/code&amp;gt; as defined by line 31. In this example the &amp;lt;code&amp;gt;HempMooringRope&amp;lt;/code&amp;gt; is a static input. A static input will not be modified by skills, upgrade modules, or game settings. &#039;&#039;&#039;Note:&#039;&#039;&#039; It seems that at the time of writing (4/21/2026, Eco v13.0.2) the only way to get an ingredient to be a dynamic value that is reduced by the table&#039;s upgrade is to pass &amp;lt;code&amp;gt;typeof(Skill)&amp;lt;/code&amp;gt; to it; Passing either &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; makes the this input static.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 33:&#039;&#039;&#039; The &amp;lt;code&amp;gt;items&amp;lt;/code&amp;gt; list declares what items are &amp;lt;u&amp;gt;output&amp;lt;/u&amp;gt; by this recipe.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 35:&#039;&#039;&#039; This line functionally links this recipe to the &amp;lt;code&amp;gt;MedievalStallItem&amp;lt;/code&amp;gt; (aka &amp;quot;Market Stall&amp;quot;) item created in the last step.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 39:&#039;&#039;&#039; Amount of calories needed to craft this item. For a static value (not modified by upgrades or skill levels) change this line to: &amp;lt;code&amp;gt;this.LaborInCalories = CreateLaborInCaloriesValue(800);&amp;lt;/code&amp;gt;. As it&#039;s written in the example, this item&#039;s calorie cost will be dynamic (modified by upgrades and skill levels). The skill level that will modify it is declared on line 16.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 40:&#039;&#039;&#039;  Minutes needed to craft. Both static and dynamic values for crafting time can be modified by the world difficulty settings. For a static value change this line to: &amp;lt;code&amp;gt;this.CraftMinutes = CreateCraftTimeValue(10f);&amp;lt;/code&amp;gt;. As it&#039;s written in the example, this item&#039;s craft time will be dynamic.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
vvv WIP vvv&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Line 83:&#039;&#039;&#039; This line assigns the recipe to a workbench. &amp;lt;u&amp;gt;Do not assign&amp;lt;/u&amp;gt; to itself because then the first table could never be made. It&#039;s recommend to use a pre-existing vanilla table.&lt;br /&gt;
&lt;br /&gt;
=== Checkpoint ===&lt;br /&gt;
Export, run local, try to craft the item&lt;br /&gt;
&lt;br /&gt;
== Create the World Object ==&lt;br /&gt;
BELOW IS ALL WIP~&lt;br /&gt;
&lt;br /&gt;
=== Add to Unity Scene ===&lt;br /&gt;
Same as Creating the Item, Add to Unity Scene.&lt;br /&gt;
&lt;br /&gt;
Explore what the ModKit utility &#039;&#039;World Object Setup&#039;&#039; does. In Unity editor, top toolbar, &amp;lt;code&amp;gt;Eco Tools &amp;gt; Mod Kit &amp;gt; World Object Setup&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Scripting the World Object ===&lt;br /&gt;
Barebones code that registers the world object.&lt;br /&gt;
&lt;br /&gt;
Code that links the Item to this World Object.&lt;br /&gt;
&lt;br /&gt;
=== Checkpoint ===&lt;br /&gt;
Export and see what it does. Ensure it&#039;s not lifting off the ground because of a non-curved shader.&lt;br /&gt;
&lt;br /&gt;
==== Origin Point Editing ====&lt;br /&gt;
Talk about what it does: the point that the simulation considers this world object to be at.&lt;br /&gt;
&lt;br /&gt;
Show how to move it around using blender.&lt;br /&gt;
&lt;br /&gt;
== Final Export ==&lt;br /&gt;
Export.&lt;br /&gt;
&lt;br /&gt;
Package.&lt;br /&gt;
&lt;br /&gt;
Distribute.&lt;/div&gt;</summary>
		<author><name>WugWugg</name></author>
	</entry>
	<entry>
		<id>https://wiki.play.eco/en/index.php?title=From_3D_Asset_to_Working_Worktable&amp;diff=16711</id>
		<title>From 3D Asset to Working Worktable</title>
		<link rel="alternate" type="text/html" href="https://wiki.play.eco/en/index.php?title=From_3D_Asset_to_Working_Worktable&amp;diff=16711"/>
		<updated>2026-04-21T03:50:44Z</updated>

		<summary type="html">&lt;p&gt;WugWugg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction =&lt;br /&gt;
Below is a guide on how to take an 3D asset from the Unity Store and make a working workbench in Eco. This includes:&lt;br /&gt;
* Creating a recipe to craft the modded table&lt;br /&gt;
* Creating recipes so the player can use the modded table to craft something&lt;br /&gt;
* Using Blender to generate a modded icon (seen when holding it in inventory)&lt;br /&gt;
* Using Blender to adjust the origin point of the model&lt;br /&gt;
* How to setup all this in a Unity scene and package for Eco&lt;br /&gt;
&lt;br /&gt;
= Setup =&lt;br /&gt;
&lt;br /&gt;
* Already have setup &#039;&#039;&#039;ModKit + Unity&#039;&#039;&#039;&lt;br /&gt;
** See: [[Installing the ModKit]]&lt;br /&gt;
* Have a &#039;&#039;&#039;3D model&#039;&#039;&#039;&lt;br /&gt;
** Just following along? Find the one used here at &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://assetstore.unity.com/packages/3d/props/low-poly-medieval-market-stalls-314286&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* A &#039;&#039;&#039;C# IDE&#039;&#039;&#039; (notepad++, Visual Studio, etc.)&lt;br /&gt;
** Highly encouraged to have an Intellisense setup and linked to the &#039;&#039;&#039;Reference Assemblies&#039;&#039;&#039;. Optional, but its really worth the time to figure out because it will help quickly correct small typos and trivial mistakes.&lt;br /&gt;
** See: [[Getting Started with Eco Modding in Visual Studio 2022]] (generally the same steps apply if using a new version of Visual Studio)&lt;br /&gt;
* &#039;&#039;&#039;Blender&#039;&#039;&#039; installed&lt;br /&gt;
** Homepage: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://www.blender.org/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Importing the Assets ==&lt;br /&gt;
&lt;br /&gt;
# Open the Unity editor to the project.&lt;br /&gt;
# From the top toolbar open the &#039;&#039;Window&#039;&#039; drop down.&lt;br /&gt;
# Hover &#039;&#039;Package Management&#039;&#039; to open sub-menu.&lt;br /&gt;
# Select &#039;&#039;Package Manager&#039;&#039;.&lt;br /&gt;
# The &#039;&#039;Package Manager&#039;&#039; window will pop-up.&lt;br /&gt;
# Install the package containing the assets you want to use...&lt;br /&gt;
## &amp;lt;u&amp;gt;If not using Unity Registry&amp;lt;/u&amp;gt;...&lt;br /&gt;
### Find the &#039;&#039;+▾&#039;&#039; button in the top left and open the drop down.&lt;br /&gt;
### Install the package from one of those options.&lt;br /&gt;
## &amp;lt;u&amp;gt;If using Unity Registry&amp;lt;/u&amp;gt;...&lt;br /&gt;
### Visit &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://assetstore.unity.com&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; and sign in.&lt;br /&gt;
### Search for the asset desired.&lt;br /&gt;
### Go to it&#039;s page (e.g. &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://assetstore.unity.com/packages/3d/props/low-poly-medieval-market-stalls-314286&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;) and click the big blue button, &#039;&#039;Add to My Assets.&#039;&#039;&lt;br /&gt;
### Now, in the Unity editor and back at the &#039;&#039;Package Manager&#039;&#039; window.&lt;br /&gt;
### Find &#039;&#039;My Assets&#039;&#039; on the left menu and navigate to it.&lt;br /&gt;
### Click the &#039;&#039;⟳&#039;&#039; button in the lower-right.&lt;br /&gt;
### The asset should be in the list now. Use the search to filter if needed.&lt;br /&gt;
### Click on the asset in the list. For those following along, &#039;&#039;Low Poly Medieval Market Stalls&#039;&#039;.&lt;br /&gt;
### In the right panel, find the &#039;&#039;Download ⤓&#039;&#039; button. Click it.&lt;br /&gt;
### Once downloaded, a new button should show up, it&#039;ll say something like &#039;&#039;⊕ Import 1.0 to project&#039;&#039; . Click it.&lt;br /&gt;
### The &#039;&#039;Import Unity Package&#039;&#039; window will pop-up.&lt;br /&gt;
### Select &#039;&#039;Import&#039;&#039; on it.&lt;br /&gt;
# Verify you can find your assets from the explorer. If following along, the assets are at &amp;lt;code&amp;gt;Assets/PolyRonin/Medieval Market Stalls&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Load in a demo scene, if provided, and make sure everything looks okay.&lt;br /&gt;
## For those following along, double click on the &#039;&#039;Demo&#039;&#039; scene at &amp;lt;code&amp;gt;Assets/PolyRonin/Medieval Market Stalls/Demo.unity&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:Eco - Unity - View Modes.png|thumb|Underlined in red are the different draw mode buttons. &amp;lt;u&amp;gt;4/20/26&amp;lt;/u&amp;gt;]]&lt;br /&gt;
If something seems off, check the different draw modes and see if changing those allow the scene to render as expected (see picture).&lt;br /&gt;
&lt;br /&gt;
With all that setup, it&#039;s time to get to the creation parts.&lt;br /&gt;
&lt;br /&gt;
= Creating The Worktable =&lt;br /&gt;
This guide will create the worktable in this order:&lt;br /&gt;
&lt;br /&gt;
# Create the item that represents the worktable&lt;br /&gt;
# Make a recipe to craft the worktable item&lt;br /&gt;
# Make the worktable item something that places a world object&lt;br /&gt;
# Give the worktable functionality by adding recipes to it&lt;br /&gt;
&lt;br /&gt;
== Creating the Item ==&lt;br /&gt;
&lt;br /&gt;
=== Item Icon ===&lt;br /&gt;
[[File:TeamstersStall - StallOnly - 256x256.png|thumb|A large (256x256px) icon created of Stall4 from the medieval assets.]]&lt;br /&gt;
This process is also explained here, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://mod.io/g/eco/r/origin-points-icon-images-with-blender&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, check it out if you need more visual reference points as that guide has a lot of pictures.&lt;br /&gt;
&lt;br /&gt;
# Open &amp;lt;u&amp;gt;Blender&amp;lt;/u&amp;gt;.&lt;br /&gt;
# Delete everything in the &#039;&#039;Scene Collection&#039;&#039;. Find this section in the top-right of the application.&lt;br /&gt;
# From the top toolbar, open the &#039;&#039;File&#039;&#039; drop down.&lt;br /&gt;
# Hover &#039;&#039;Import&#039;&#039; to open the sub-menu.&lt;br /&gt;
# Select the type of 3D asset. For those using medieval assets, select &#039;&#039;FBX (.fbx)&#039;&#039;.&lt;br /&gt;
# Find the asset on the computer...&lt;br /&gt;
## Tip: Use Unity to find the &amp;lt;code&amp;gt;.fbx&amp;lt;/code&amp;gt; asset. For the medieval assets, that&#039;s in &amp;lt;code&amp;gt;Assets/PolyRonin/Medieval Market Stalls/Meshes/medieval-market-stalls-1.fbx&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Right click on it and select &#039;&#039;Show in explorer&#039;&#039;.&lt;br /&gt;
## Now copy the address of that folder from Explorer. It might look like &amp;lt;code&amp;gt;C:\Users\Wug\EcoMod--WikiDemo\WikiDemo\Assets\PolyRonin\Medieval Market Stalls\Meshes&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Paste that in the address bar of the &amp;lt;u&amp;gt;Blender&amp;lt;/u&amp;gt; import pop-up.&lt;br /&gt;
# Select the blue &#039;&#039;Import FBX&#039;&#039; button&#039;&#039;.&#039;&#039;&lt;br /&gt;
# From &#039;&#039;Layout&#039;&#039; mode, change the Viewport Shading to Material Preview or Rendered. This is on the second toolbar down, far right of center, but before &#039;&#039;Scene Collection&#039;&#039; section.&lt;br /&gt;
# If you see purple models, Blender will need help finding textures for these meshes...&lt;br /&gt;
## From the top toolbar, open the &#039;&#039;File&#039;&#039; drop down.&lt;br /&gt;
## Hover &#039;&#039;External Data&#039;&#039; to open the sub-menu.&lt;br /&gt;
## Select &#039;&#039;Find Missing Files...&#039;&#039;&lt;br /&gt;
## Point this to the whole directory that the 3D assets came in. For the medieval pack, &amp;lt;code&amp;gt;C:\Users\&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;Wug\EcoMod--WikiDemo\WikiDemo\Assets\PolyRonin&amp;lt;/code&amp;gt;.&lt;br /&gt;
## The proper textures/materials should have now loaded in. If it hasn&#039;t, consult Google because without the textures the following steps won&#039;t produce a usable icon.&lt;br /&gt;
# Add a source of light...&lt;br /&gt;
## Make sure the editor is in the &#039;&#039;Layout&#039;&#039; mode by checking the top most toolbar.&lt;br /&gt;
## From the toolbar just under that one, find and open the &#039;&#039;Add&#039;&#039; drop down.&lt;br /&gt;
## Hover &#039;&#039;Light&#039;&#039; to open that sub-menu.&lt;br /&gt;
## Click &#039;&#039;Sun&#039;&#039;.&lt;br /&gt;
# Add a camera...&lt;br /&gt;
## Again make sure the editor is in the &#039;&#039;Layout&#039;&#039; mode.&lt;br /&gt;
## From the second toolbar down, find and open the &#039;&#039;Add&#039;&#039; drop down.&lt;br /&gt;
## Select &#039;&#039;Camera&#039;&#039;.&lt;br /&gt;
# Setup the scene with the object placement and lighting direction desired.  &#039;&#039;&#039;Tip:&#039;&#039;&#039; To reset the editor to something selected press the period key &amp;lt;u&amp;gt;on the numpad&amp;lt;/u&amp;gt;. Without a numpad, use &#039;&#039;View&#039;&#039; (second toolbar from the top) and select &#039;&#039;Frame Selected&#039;&#039; from it. Alternatively, just set the zoom to zoom to the mouse position: &#039;&#039;Edit&#039;&#039; (top toolbar), &#039;&#039;Preferences&#039;&#039; (from drop down), &#039;&#039;Navigation&#039;&#039; (on left menu), &#039;&#039;Zoom to Mouse Position&#039;&#039; (In the zoom section). This makes moving around a lot more natural feeling.&lt;br /&gt;
# Setup the rendering camera...&lt;br /&gt;
## Go to &#039;&#039;Rendering&#039;&#039;  tab on the top toolbar&lt;br /&gt;
## On the right there will be a side-panel open, it should be the &#039;&#039;Render&#039;&#039; tab. Confirm that.&lt;br /&gt;
## Change &#039;&#039;Render Engine&#039;&#039; to &#039;&#039;Cycles&#039;&#039;.&lt;br /&gt;
## Look down below in the same tab for the &#039;&#039;Film&#039;&#039; section.&lt;br /&gt;
## Expand it and find the &#039;&#039;Transparent&#039;&#039; checkbox and section. Click it so that it has a check mark. This will make the icon&#039;s background transparent.&lt;br /&gt;
## Now, go to the &#039;&#039;Output&#039;&#039; tab &amp;lt;u&amp;gt;on the side panel&amp;lt;/u&amp;gt;. The tab is just below the current one.&lt;br /&gt;
## In the &#039;&#039;Format&#039;&#039; section set &#039;&#039;Resolution X&#039;&#039; to &#039;&#039;64.&#039;&#039; And &#039;&#039;Y&#039;&#039; to &#039;&#039;64&#039;&#039; as well. This will make the icon generated a 64 by 64 pixel image.&lt;br /&gt;
# Go back to the &#039;&#039;Layout&#039;&#039; tab from the top toolbar.&lt;br /&gt;
# Center your view on the object (numpad period or &#039;&#039;View &amp;gt; Frame Selected&#039;&#039;). Adjust it so that the object is how it should be for the icon.&lt;br /&gt;
# Align the camera to the view...&lt;br /&gt;
## Make sure the editor is in &#039;&#039;Layout&#039;&#039; mode (top toolbar).&lt;br /&gt;
## Find &#039;&#039;View&#039;&#039; from the second from the top toolbar and open the drop down.&lt;br /&gt;
## Hover &#039;&#039;Align View&#039;&#039; to open the sub-menu.&lt;br /&gt;
## Select &#039;&#039;Align Active Camera To View&#039;&#039;.&lt;br /&gt;
## If the view is slightly off, there is a lock icon on the right side of this panel. Use it to &amp;quot;lock&amp;quot; controls to the camera and tweak it&#039;s view.&lt;br /&gt;
# Now return to the &#039;&#039;Rendering&#039;&#039; tab from the top toolbar.&lt;br /&gt;
# Press the F12 key to start the render. This should complete quickly since 64x64 pixels is a very small render.&lt;br /&gt;
# A window should popup, &#039;&#039;Blender Render&#039;&#039;. This is the icon!&lt;br /&gt;
# From the top tool bar of this &#039;&#039;Blender Render&#039;&#039; window, open the &#039;&#039;Image&#039;&#039; drop down.&lt;br /&gt;
# Select &#039;&#039;Save As...&#039;&#039; to save somewhere on the computer.&lt;br /&gt;
# Return to step 13 and repeat to do larger images if desired. Create a 128 by 128 pixel image too. It will make things smoother later.&lt;br /&gt;
# It&#039;s recommended to save the Blender scene too. This will make making a new icon with a small tweak that much easier...&lt;br /&gt;
## &#039;&#039;File&#039;&#039; drop down from top toolbar.&lt;br /&gt;
## &#039;&#039;Save As...&#039;&#039; to save the Blender scene to the computer.&lt;br /&gt;
&lt;br /&gt;
=== Adding to Unity Scene ===&lt;br /&gt;
The developers explain how to create an item in one of ModKit&#039;s read me files (See: &amp;lt;code&amp;gt;Assets/EcoModKit/Docs/README.md&amp;lt;/code&amp;gt;), but this guide will explain it below.&lt;br /&gt;
&lt;br /&gt;
Additionally, &#039;&#039;&#039;TheKye&#039;&#039;&#039; on YouTube covers this in their &#039;&#039;Creating Your First Item&#039;&#039; and &#039;&#039;Creating Your First Item Pt 2&#039;&#039; videos.&lt;br /&gt;
&lt;br /&gt;
Use those additional resource to help troubleshoot issues with item&#039;s icons.&lt;br /&gt;
&lt;br /&gt;
# Open &amp;lt;u&amp;gt;Unity&amp;lt;/u&amp;gt;.&lt;br /&gt;
# In the left panel, the &#039;&#039;Hierarchy&#039;&#039; tab should be selected.&lt;br /&gt;
# Select the top-most object there. It should be a scene. If the editor last loaded the &#039;&#039;Demo&#039;&#039; scene from the medieval assets, it&#039;ll be named &#039;&#039;Demo&#039;&#039;.&lt;br /&gt;
# Right click on this scene and select &#039;&#039;Add New Scene&#039;&#039; from the menu.&lt;br /&gt;
# Right click again on the old scene (&#039;&#039;Demo&#039;&#039;) and select &#039;&#039;Remove Scene&#039;&#039;.&lt;br /&gt;
# Let it save if the changes to the old scene are important. Discard if it was open just for exploration&#039;s sake.&lt;br /&gt;
# Right click the new, &#039;&#039;Untitled&#039;&#039; scene. Click &#039;&#039;Save Scene As...&#039;&#039;&lt;br /&gt;
# Save it somewhere on the computer and give it a name. Example: &#039;&#039;WikiDemo&#039;&#039;.&lt;br /&gt;
# Delete &amp;lt;u&amp;gt;anything&amp;lt;/u&amp;gt; in the scene.&lt;br /&gt;
# Right click the scene, hover &#039;&#039;GameObject&#039;&#039;, and select &#039;&#039;Create Empty&#039;&#039; from the sub-menu.&lt;br /&gt;
# Name this new object &#039;&#039;Objects&#039;&#039;.&lt;br /&gt;
# Select the newly created &#039;&#039;Objects&#039;&#039; object from the &#039;&#039;Hierarchy&#039;&#039; menu.&lt;br /&gt;
# On the far right side of the screen, in the &#039;&#039;Inspector&#039;&#039; menu, click the &#039;&#039;Add Component&#039;&#039; button.&lt;br /&gt;
# Type in &#039;&#039;ModkitPrefabContainer&#039;&#039;. Click on the component from the search to add it. The component now should be listed in the &#039;&#039;Inspector&#039;&#039;.&lt;br /&gt;
# In the &#039;&#039;Hierarchy&#039;&#039; panel right click the scene, hover &#039;&#039;GameObject&#039;&#039;, and select &#039;&#039;Create Empty&#039;&#039;.&lt;br /&gt;
# Name this new object &#039;&#039;Items&#039;&#039;.&lt;br /&gt;
# Right click the scene, hover &#039;&#039;GameObject&#039;&#039;, and select &#039;&#039;Create Empty&#039;&#039;.&lt;br /&gt;
# Name this new object &#039;&#039;Emoji&#039;&#039;.&lt;br /&gt;
# Select the newly created &#039;&#039;Emoji&#039;&#039; object, find the &#039;&#039;Inspector&#039;&#039; menu (far-right), and click the &#039;&#039;Add Component&#039;&#039; button.&lt;br /&gt;
# Type in &#039;&#039;ChatEmoteSetOld&#039;&#039;. Click on the component from the search to add it. That component should now be listed in the &#039;&#039;Inspector&#039;&#039;.&lt;br /&gt;
# Right click the scene, hover &#039;&#039;GameObject&#039;&#039;, and select &#039;&#039;Create Empty&#039;&#039;.&lt;br /&gt;
# Name this new object &#039;&#039;BlockSets&#039;&#039;.&lt;br /&gt;
# Select the newly created &#039;&#039;BlockSets&#039;&#039; object, find the &#039;&#039;Inspector&#039;&#039; menu (far-right), and click &#039;&#039;Add Component&#039;&#039;.&lt;br /&gt;
# Search for &#039;&#039;BlockSetContainer&#039;&#039;. Click on the component from the search to add it. The &#039;&#039;Inspector&#039;&#039; should now show that component as added.&lt;br /&gt;
# Go to &amp;lt;code&amp;gt;Assets/EcoModKit/Prefabs&amp;lt;/code&amp;gt; in the Unity browser.&lt;br /&gt;
# Find the prefab &#039;&#039;ItemTemplate&#039;&#039;.&lt;br /&gt;
# Drag it onto the &#039;&#039;Items&#039;&#039; object in the &#039;&#039;Hierarchy&#039;&#039; panel. It should add it as a &amp;lt;u&amp;gt;child&amp;lt;/u&amp;gt; of the &#039;&#039;Items&#039;&#039; object.&lt;br /&gt;
# Right click on the new &#039;&#039;ItemTemplate&#039;&#039; object, hover &#039;&#039;Prefab&#039;&#039;, and select &#039;&#039;Unpack Completely&#039;&#039;.&lt;br /&gt;
# Right click on the &#039;&#039;ItemTemplate&#039;&#039; object and select &#039;&#039;Rename&#039;&#039;. Name this what you want the item to be called. Example: &#039;&#039;MedievalStallItem&#039;&#039;.&lt;br /&gt;
# Set this item&#039;s background...&lt;br /&gt;
## Here&#039;s the default backgrounds (blue = item, brown = block, green = food): [[File:Eco - Item - Background.png|border|frameless]]        [[File:Eco - Block - Background.png|frameless]]        [[File:Eco - Food - Background.png|frameless]]&lt;br /&gt;
## Download or prepare the background and add it to the &amp;lt;code&amp;gt;Assets&amp;lt;/code&amp;gt; folder in Unity. &lt;br /&gt;
### To follow along lockstep, put the background in a new &amp;lt;code&amp;gt;Assets/WikiDemo&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
### Right click on &amp;lt;code&amp;gt;Assets&amp;lt;/code&amp;gt; folder, hover &#039;&#039;Create&#039;&#039;, select &#039;&#039;Folder&#039;&#039;.&lt;br /&gt;
### Name the folder &#039;&#039;WikiDemo&#039;&#039;.&lt;br /&gt;
## Configure Unity to use these as sprites...&lt;br /&gt;
### Select the background(s) added (Ctrl+Click each one).&lt;br /&gt;
### In the &#039;&#039;Inspector&#039;&#039;, find &#039;&#039;TextureType&#039;&#039; and change that to &#039;&#039;Sprite (2D and UI)&#039;&#039;.&lt;br /&gt;
### Again in the &#039;&#039;Inspector&#039;&#039;, find &#039;&#039;SpriteMode&#039;&#039; and change that to &#039;&#039;Single&#039;&#039;.&lt;br /&gt;
### Then scroll and go to the bottom of the &#039;&#039;Inspector&#039;&#039; and find the &#039;&#039;Apply&#039;&#039; button.&lt;br /&gt;
### This will apply those changes to that file and all other ones highlighted.&lt;br /&gt;
## Select the item being created (&#039;&#039;MedievalStallItem&#039;&#039;).&lt;br /&gt;
## In the &#039;&#039;Inspector&#039;&#039; panel (far-right), scroll and find the &#039;&#039;Item Template (Script)&#039;&#039; section.&lt;br /&gt;
## In here find the &#039;&#039;Background&#039;&#039; input. It&#039;ll say &#039;&#039;Background (Image)&#039;&#039; in it. If clicked that text to reveal and highlight the related object in the &#039;&#039;Hierarchy&#039;&#039; panel.&lt;br /&gt;
## Select the revealed, and highlighted object &#039;&#039;Background&#039;&#039;.&lt;br /&gt;
## In the &#039;&#039;Inspector&#039;&#039; panel, scroll and find the &#039;&#039;Image&#039;&#039; component section.&lt;br /&gt;
## Inside that component&#039;s section, find &#039;&#039;Source Image&#039;&#039;. It&#039;ll say &#039;&#039;Missing (Sprite)&#039;&#039;. Click the &#039;&#039;⦿&#039;&#039; button to the right.&lt;br /&gt;
## The &#039;&#039;Select Sprite&#039;&#039; popup will show. Make sure the &#039;&#039;Assets&#039;&#039; tab is selected, and find the backgrounds desired.&lt;br /&gt;
#Create the foreground image...&lt;br /&gt;
##This is easily accomplished in MS Paint.&lt;br /&gt;
##Get to the background image file in a &amp;lt;u&amp;gt;file explorer&amp;lt;/u&amp;gt;.&lt;br /&gt;
##Right click on it, hover &#039;&#039;Open with...&#039;&#039;, and select &#039;&#039;Paint&#039;&#039;.&lt;br /&gt;
##The solid background should be displayed.&lt;br /&gt;
##Open the &#039;&#039;File&#039;&#039; menu from the top toolbar.&lt;br /&gt;
##Hover &#039;&#039;Import to Canvas&#039;&#039; and select &#039;&#039;From a File&#039;&#039;.&lt;br /&gt;
##Find the icon in the file browser and import it. Match the size of the background image to have it nicely center itself.&lt;br /&gt;
##Now &#039;&#039;File&#039;&#039; from the top toolbar.&lt;br /&gt;
##Hover &#039;&#039;Save As...&#039;&#039; and select &#039;&#039;PNG&#039;&#039;.&lt;br /&gt;
##Save this to the &amp;lt;code&amp;gt;Assets/WikiDemo&amp;lt;/code&amp;gt; folder in Unity.&lt;br /&gt;
##Configure Unity to use these as sprites...&lt;br /&gt;
### Select the foreground image.&lt;br /&gt;
### In the &#039;&#039;Inspector&#039;&#039;, find &#039;&#039;TextureType&#039;&#039; and change that to &#039;&#039;Sprite (2D and UI)&#039;&#039;.&lt;br /&gt;
### Again in the &#039;&#039;Inspector&#039;&#039;, find &#039;&#039;SpriteMode&#039;&#039; and change that to &#039;&#039;Single&#039;&#039;.&lt;br /&gt;
### Then scroll and go to the bottom of the &#039;&#039;Inspector&#039;&#039; and find the &#039;&#039;Apply&#039;&#039; button.&lt;br /&gt;
### This will apply those changes to that file and all other ones highlighted.&lt;br /&gt;
#Set this item&#039;s foreground...&lt;br /&gt;
## Copy the item&#039;s icon into the &amp;lt;code&amp;gt;Assets&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
## Configure Unity to use it as a sprite (see the previous step&#039;s &#039;&#039;Set this item&#039;s background...&#039;&#039; instructions)&lt;br /&gt;
## Select the item being created (&#039;&#039;MedievalStallItem&#039;&#039;).&lt;br /&gt;
## In the &#039;&#039;Inspector&#039;&#039; panel (far-right), scroll and find the &#039;&#039;Item Template (Script)&#039;&#039; section.&lt;br /&gt;
## In here find the &#039;&#039;Foreground&#039;&#039; input. It&#039;ll say &#039;&#039;Foreground (Image)&#039;&#039; in it. If clicked that text to reveal and highlight the related object in the &#039;&#039;Hierarchy&#039;&#039; panel.&lt;br /&gt;
## Select the revealed, and highlighted object &#039;&#039;Foreground&#039;&#039;.&lt;br /&gt;
## Use the &#039;&#039;Inspector&#039;&#039;, find the &#039;&#039;Image&#039;&#039; component, within that component find the &#039;&#039;Source Image&#039;&#039; input. It will say &#039;&#039;Missing (Sprite)&#039;&#039;.&lt;br /&gt;
## Click the &#039;&#039;⦿&#039;&#039; button to the right of that input.&lt;br /&gt;
## From the &#039;&#039;Select Sprite&#039;&#039; popup, ensure the &#039;&#039;Assets&#039;&#039; tab is being searched, and find the icon just created.&lt;br /&gt;
&lt;br /&gt;
=== Scripting the Item ===&lt;br /&gt;
Registering the item in the code is as simple as:&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;using Eco.Core.Items;&lt;br /&gt;
using Eco.Gameplay.Items;&lt;br /&gt;
using Eco.Shared.Localization;&lt;br /&gt;
using Eco.Shared.Serialization;&lt;br /&gt;
&lt;br /&gt;
namespace WikiDemo&lt;br /&gt;
{&lt;br /&gt;
    [Serialized] // Tells the save/load system this object needs to be serialized.&lt;br /&gt;
    [LocDisplayName(&amp;quot;Market Stall&amp;quot;)] // Defines the localized name of the item.&lt;br /&gt;
    [Weight(100)] // Defines how heavy Arrow is.&lt;br /&gt;
    [Ecopedia(&amp;quot;Work Stations&amp;quot;, &amp;quot;Craft Tables&amp;quot;, createAsSubPage: true)]&lt;br /&gt;
    [LocDescription(&amp;quot;A medieval market stall.&amp;quot;)] //The tooltip description for the item.&lt;br /&gt;
    public partial class MedievalStallItem: Item { }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Line 13:&#039;&#039;&#039; The implementation of &amp;lt;code&amp;gt;Item&amp;lt;/code&amp;gt; means that Eco will find this and look for Unity assets that matching this class&#039; name, &amp;lt;code&amp;gt;MedivalStallItem&amp;lt;/code&amp;gt;. While this doesn&#039;t do anything fancy, it completes the first step towards a new workbench.&lt;br /&gt;
&lt;br /&gt;
=== Checkpoint ===&lt;br /&gt;
[[File:Eco - Hotbar With Modded Icon.png|thumb|Shows the medieval stall as a modded icon in-game.]]&lt;br /&gt;
This was a lot of setup and steps. Make sure everything is running smoothly by doing the following:&lt;br /&gt;
&lt;br /&gt;
# In &amp;lt;u&amp;gt;Unity&amp;lt;/u&amp;gt;.&lt;br /&gt;
# Open the &#039;&#039;Eco Tools&#039;&#039; drop down from the top toolbar.&lt;br /&gt;
# Hover &#039;&#039;Mod Kit&#039;&#039;.&lt;br /&gt;
# Select &#039;&#039;Build Current Bundle&#039;&#039;.&lt;br /&gt;
# A file explorer window will popup. Point it to where you want the newly created bundle to be save.&lt;br /&gt;
# Copy that bundle into the Eco mod directory, &amp;lt;code&amp;gt;/Eco Server/Mods/UserCode&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Start the server and connect to it.&lt;br /&gt;
# Test it out by typing &amp;lt;code&amp;gt;/give MedievalStall&amp;lt;/code&amp;gt; in chat (or &amp;lt;code&amp;gt;/give&amp;lt;/code&amp;gt; whatever your item is named)&lt;br /&gt;
## It&#039;s also possible to do &amp;lt;code&amp;gt;/give Market Stall&amp;lt;/code&amp;gt; to get the item. How? &#039;&#039;&#039;Line 9&#039;&#039;&#039;: of the the above code declares that name as this item&#039;s &amp;quot;common name&amp;quot;. Neat.&lt;br /&gt;
# The item should appear in the players inventory with a working icon.&lt;br /&gt;
&lt;br /&gt;
This was the longest &amp;quot;leg&amp;quot; of this journey. All the setup is done and the infrastructure is in place. The following sections will just build on what was taught here.&lt;br /&gt;
&lt;br /&gt;
Keep on, keeping on!&lt;br /&gt;
&lt;br /&gt;
== Code the Item&#039;s Recipe ==&lt;br /&gt;
BELOW IS ALL WIP~&lt;br /&gt;
&lt;br /&gt;
Time for an easy one, add a block of code to tell the game how to craft the worktable item. Assign to &amp;lt;u&amp;gt;an existing&amp;lt;/u&amp;gt; worktable.&lt;br /&gt;
&lt;br /&gt;
Talk about how the Item name in Unity and the class name in code is what joins the items. Must be exactly the same!&lt;br /&gt;
&lt;br /&gt;
=== Checkpoint ===&lt;br /&gt;
Export, run local, try to craft the item&lt;br /&gt;
&lt;br /&gt;
== Create the World Object ==&lt;br /&gt;
&lt;br /&gt;
=== Add to Unity Scene ===&lt;br /&gt;
Same as Creating the Item, Add to Unity Scene.&lt;br /&gt;
&lt;br /&gt;
Explore what the ModKit utility &#039;&#039;World Object Setup&#039;&#039; does. In Unity editor, top toolbar, &amp;lt;code&amp;gt;Eco Tools &amp;gt; Mod Kit &amp;gt; World Object Setup&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Scripting the World Object ===&lt;br /&gt;
Barebones code that registers the world object.&lt;br /&gt;
&lt;br /&gt;
Code that links the Item to this World Object.&lt;br /&gt;
&lt;br /&gt;
=== Checkpoint ===&lt;br /&gt;
Export and see what it does. Ensure it&#039;s not lifting off the ground because of a non-curved shader.&lt;br /&gt;
&lt;br /&gt;
==== Origin Point Editing ====&lt;br /&gt;
Talk about what it does: the point that the simulation considers this world object to be at.&lt;br /&gt;
&lt;br /&gt;
Show how to move it around using blender.&lt;br /&gt;
&lt;br /&gt;
== Final Export ==&lt;br /&gt;
Export.&lt;br /&gt;
&lt;br /&gt;
Package.&lt;br /&gt;
&lt;br /&gt;
Distribute.&lt;/div&gt;</summary>
		<author><name>WugWugg</name></author>
	</entry>
	<entry>
		<id>https://wiki.play.eco/en/index.php?title=From_3D_Asset_to_Working_Worktable&amp;diff=16710</id>
		<title>From 3D Asset to Working Worktable</title>
		<link rel="alternate" type="text/html" href="https://wiki.play.eco/en/index.php?title=From_3D_Asset_to_Working_Worktable&amp;diff=16710"/>
		<updated>2026-04-21T01:39:18Z</updated>

		<summary type="html">&lt;p&gt;WugWugg: Finished Creating the Item section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction =&lt;br /&gt;
Below is a guide on how to take an 3D asset from the Unity Store and make a working workbench in Eco. This includes:&lt;br /&gt;
* Creating a recipe to craft the modded table&lt;br /&gt;
* Creating recipes so the player can use the modded table to craft something&lt;br /&gt;
* Using Blender to generate a modded icon (seen when holding it in inventory)&lt;br /&gt;
* Using Blender to adjust the origin point of the model&lt;br /&gt;
* How to setup all this in a Unity scene and package for Eco&lt;br /&gt;
&lt;br /&gt;
= Setup =&lt;br /&gt;
&lt;br /&gt;
* Already have setup &#039;&#039;&#039;ModKit + Unity&#039;&#039;&#039;&lt;br /&gt;
** See: [[Installing the ModKit]]&lt;br /&gt;
* Have a &#039;&#039;&#039;3D model&#039;&#039;&#039;&lt;br /&gt;
** Just following along? Find the one used here at &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://assetstore.unity.com/packages/3d/props/low-poly-medieval-market-stalls-314286&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* A &#039;&#039;&#039;C# IDE&#039;&#039;&#039; (notepad++, Visual Studio, etc.)&lt;br /&gt;
** Highly encouraged to have an Intellisense setup and linked to the &#039;&#039;&#039;Reference Assemblies&#039;&#039;&#039;. Optional, but its really worth the time to figure out because it will help quickly correct small typos and trivial mistakes.&lt;br /&gt;
** See: [[Getting Started with Eco Modding in Visual Studio 2022]] (generally the same steps apply if using a new version of Visual Studio)&lt;br /&gt;
* &#039;&#039;&#039;Blender&#039;&#039;&#039; installed&lt;br /&gt;
** Homepage: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://www.blender.org/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Importing the Assets ==&lt;br /&gt;
&lt;br /&gt;
# Open the Unity editor to the project.&lt;br /&gt;
# From the top toolbar open the &#039;&#039;Window&#039;&#039; drop down.&lt;br /&gt;
# Hover &#039;&#039;Package Management&#039;&#039; to open sub-menu.&lt;br /&gt;
# Select &#039;&#039;Package Manager&#039;&#039;.&lt;br /&gt;
# The &#039;&#039;Package Manager&#039;&#039; window will pop-up.&lt;br /&gt;
# Install the package containing the assets you want to use...&lt;br /&gt;
## &amp;lt;u&amp;gt;If not using Unity Registry&amp;lt;/u&amp;gt;...&lt;br /&gt;
### Find the &#039;&#039;+▾&#039;&#039; button in the top left and open the drop down.&lt;br /&gt;
### Install the package from one of those options.&lt;br /&gt;
## &amp;lt;u&amp;gt;If using Unity Registry&amp;lt;/u&amp;gt;...&lt;br /&gt;
### Visit &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://assetstore.unity.com&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; and sign in.&lt;br /&gt;
### Search for the asset desired.&lt;br /&gt;
### Go to it&#039;s page (e.g. &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://assetstore.unity.com/packages/3d/props/low-poly-medieval-market-stalls-314286&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;) and click the big blue button, &#039;&#039;Add to My Assets.&#039;&#039;&lt;br /&gt;
### Now, in the Unity editor and back at the &#039;&#039;Package Manager&#039;&#039; window.&lt;br /&gt;
### Find &#039;&#039;My Assets&#039;&#039; on the left menu and navigate to it.&lt;br /&gt;
### Click the &#039;&#039;⟳&#039;&#039; button in the lower-right.&lt;br /&gt;
### The asset should be in the list now. Use the search to filter if needed.&lt;br /&gt;
### Click on the asset in the list. For those following along, &#039;&#039;Low Poly Medieval Market Stalls&#039;&#039;.&lt;br /&gt;
### In the right panel, find the &#039;&#039;Download ⤓&#039;&#039; button. Click it.&lt;br /&gt;
### Once downloaded, a new button should show up, it&#039;ll say something like &#039;&#039;⊕ Import 1.0 to project&#039;&#039; . Click it.&lt;br /&gt;
### The &#039;&#039;Import Unity Package&#039;&#039; window will pop-up.&lt;br /&gt;
### Select &#039;&#039;Import&#039;&#039; on it.&lt;br /&gt;
# Verify you can find your assets from the explorer. If following along, the assets are at &amp;lt;code&amp;gt;Assets/PolyRonin/Medieval Market Stalls&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Load in a demo scene, if provided, and make sure everything looks okay.&lt;br /&gt;
## For those following along, double click on the &#039;&#039;Demo&#039;&#039; scene at &amp;lt;code&amp;gt;Assets/PolyRonin/Medieval Market Stalls/Demo.unity&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:Eco - Unity - View Modes.png|thumb|Underlined in red are the different draw mode buttons. &amp;lt;u&amp;gt;4/20/26&amp;lt;/u&amp;gt;]]&lt;br /&gt;
If something seems off, check the different draw modes and see if changing those allow the scene to render as expected (see picture).&lt;br /&gt;
&lt;br /&gt;
With all that setup, it&#039;s time to get to the creation parts.&lt;br /&gt;
&lt;br /&gt;
= Creating The Worktable =&lt;br /&gt;
This guide will create the worktable in this order:&lt;br /&gt;
&lt;br /&gt;
# Create the item that represents the worktable&lt;br /&gt;
# Make a recipe to craft the worktable item&lt;br /&gt;
# Make the worktable item something that places a world object&lt;br /&gt;
# Give the worktable functionality by adding recipes to it&lt;br /&gt;
&lt;br /&gt;
== Creating the Item ==&lt;br /&gt;
&lt;br /&gt;
=== Item Icon ===&lt;br /&gt;
[[File:TeamstersStall - StallOnly - 256x256.png|thumb|A large (256x256px) icon created of Stall4 from the medieval assets.]]&lt;br /&gt;
This process is also explained here, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://mod.io/g/eco/r/origin-points-icon-images-with-blender&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, check it out if you need more visual reference points as that guide has a lot of pictures.&lt;br /&gt;
&lt;br /&gt;
# Open &amp;lt;u&amp;gt;Blender&amp;lt;/u&amp;gt;.&lt;br /&gt;
# Delete everything in the &#039;&#039;Scene Collection&#039;&#039;. Find this section in the top-right of the application.&lt;br /&gt;
# From the top toolbar, open the &#039;&#039;File&#039;&#039; drop down.&lt;br /&gt;
# Hover &#039;&#039;Import&#039;&#039; to open the sub-menu.&lt;br /&gt;
# Select the type of 3D asset. For those using medieval assets, select &#039;&#039;FBX (.fbx)&#039;&#039;.&lt;br /&gt;
# Find the asset on the computer...&lt;br /&gt;
## Tip: Use Unity to find the &amp;lt;code&amp;gt;.fbx&amp;lt;/code&amp;gt; asset. For the medieval assets, that&#039;s in &amp;lt;code&amp;gt;Assets/PolyRonin/Medieval Market Stalls/Meshes/medieval-market-stalls-1.fbx&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Right click on it and select &#039;&#039;Show in explorer&#039;&#039;.&lt;br /&gt;
## Now copy the address of that folder from Explorer. It might look like &amp;lt;code&amp;gt;C:\Users\Wug\EcoMod--WikiDemo\WikiDemo\Assets\PolyRonin\Medieval Market Stalls\Meshes&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Paste that in the address bar of the &amp;lt;u&amp;gt;Blender&amp;lt;/u&amp;gt; import pop-up.&lt;br /&gt;
# Select the blue &#039;&#039;Import FBX&#039;&#039; button&#039;&#039;.&#039;&#039;&lt;br /&gt;
# From &#039;&#039;Layout&#039;&#039; mode, change the Viewport Shading to Material Preview or Rendered. This is on the second toolbar down, far right of center, but before &#039;&#039;Scene Collection&#039;&#039; section.&lt;br /&gt;
# If you see purple models, Blender will need help finding textures for these meshes...&lt;br /&gt;
## From the top toolbar, open the &#039;&#039;File&#039;&#039; drop down.&lt;br /&gt;
## Hover &#039;&#039;External Data&#039;&#039; to open the sub-menu.&lt;br /&gt;
## Select &#039;&#039;Find Missing Files...&#039;&#039;&lt;br /&gt;
## Point this to the whole directory that the 3D assets came in. For the medieval pack, &amp;lt;code&amp;gt;C:\Users\&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;Wug\EcoMod--WikiDemo\WikiDemo\Assets\PolyRonin&amp;lt;/code&amp;gt;.&lt;br /&gt;
## The proper textures/materials should have now loaded in. If it hasn&#039;t, consult Google because without the textures the following steps won&#039;t produce a usable icon.&lt;br /&gt;
# Add a source of light...&lt;br /&gt;
## Make sure the editor is in the &#039;&#039;Layout&#039;&#039; mode by checking the top most toolbar.&lt;br /&gt;
## From the toolbar just under that one, find and open the &#039;&#039;Add&#039;&#039; drop down.&lt;br /&gt;
## Hover &#039;&#039;Light&#039;&#039; to open that sub-menu.&lt;br /&gt;
## Click &#039;&#039;Sun&#039;&#039;.&lt;br /&gt;
# Add a camera...&lt;br /&gt;
## Again make sure the editor is in the &#039;&#039;Layout&#039;&#039; mode.&lt;br /&gt;
## From the second toolbar down, find and open the &#039;&#039;Add&#039;&#039; drop down.&lt;br /&gt;
## Select &#039;&#039;Camera&#039;&#039;.&lt;br /&gt;
# Setup the scene with the object placement and lighting direction desired.  &#039;&#039;&#039;Tip:&#039;&#039;&#039; To reset the editor to something selected press the period key &amp;lt;u&amp;gt;on the numpad&amp;lt;/u&amp;gt;. Without a numpad, use &#039;&#039;View&#039;&#039; (second toolbar from the top) and select &#039;&#039;Frame Selected&#039;&#039; from it. Alternatively, just set the zoom to zoom to the mouse position: &#039;&#039;Edit&#039;&#039; (top toolbar), &#039;&#039;Preferences&#039;&#039; (from drop down), &#039;&#039;Navigation&#039;&#039; (on left menu), &#039;&#039;Zoom to Mouse Position&#039;&#039; (In the zoom section). This makes moving around a lot more natural feeling.&lt;br /&gt;
# Setup the rendering camera...&lt;br /&gt;
## Go to &#039;&#039;Rendering&#039;&#039;  tab on the top toolbar&lt;br /&gt;
## On the right there will be a side-panel open, it should be the &#039;&#039;Render&#039;&#039; tab. Confirm that.&lt;br /&gt;
## Change &#039;&#039;Render Engine&#039;&#039; to &#039;&#039;Cycles&#039;&#039;.&lt;br /&gt;
## Look down below in the same tab for the &#039;&#039;Film&#039;&#039; section.&lt;br /&gt;
## Expand it and find the &#039;&#039;Transparent&#039;&#039; checkbox and section. Click it so that it has a check mark. This will make the icon&#039;s background transparent.&lt;br /&gt;
## Now, go to the &#039;&#039;Output&#039;&#039; tab &amp;lt;u&amp;gt;on the side panel&amp;lt;/u&amp;gt;. The tab is just below the current one.&lt;br /&gt;
## In the &#039;&#039;Format&#039;&#039; section set &#039;&#039;Resolution X&#039;&#039; to &#039;&#039;64.&#039;&#039; And &#039;&#039;Y&#039;&#039; to &#039;&#039;64&#039;&#039; as well. This will make the icon generated a 64 by 64 pixel image. If a bigger image is desired (e.g. 128x128px) change that here.&lt;br /&gt;
# Go back to the &#039;&#039;Layout&#039;&#039; tab from the top toolbar.&lt;br /&gt;
# Center your view on the object (numpad period or &#039;&#039;View &amp;gt; Frame Selected&#039;&#039;). Adjust it so that the object is how it should be for the icon.&lt;br /&gt;
# Align the camera to the view...&lt;br /&gt;
## Make sure the editor is in &#039;&#039;Layout&#039;&#039; mode (top toolbar).&lt;br /&gt;
## Find &#039;&#039;View&#039;&#039; from the second from the top toolbar and open the drop down.&lt;br /&gt;
## Hover &#039;&#039;Align View&#039;&#039; to open the sub-menu.&lt;br /&gt;
## Select &#039;&#039;Align Active Camera To View&#039;&#039;.&lt;br /&gt;
## If the view is slightly off, there is a lock icon on the right side of this panel. Use it to &amp;quot;lock&amp;quot; controls to the camera and tweak it&#039;s view.&lt;br /&gt;
# Now return to the &#039;&#039;Rendering&#039;&#039; tab from the top toolbar.&lt;br /&gt;
# Press the F12 key to start the render. This should complete quickly since 64x64 pixels is a very small render.&lt;br /&gt;
# A window should popup, &#039;&#039;Blender Render&#039;&#039;. This is the icon!&lt;br /&gt;
# From the top tool bar of this &#039;&#039;Blender Render&#039;&#039; window, open the &#039;&#039;Image&#039;&#039; drop down.&lt;br /&gt;
# Select &#039;&#039;Save As...&#039;&#039; to save somewhere on the computer.&lt;br /&gt;
# Return to step 13 and repeat to do larger images if desired. &lt;br /&gt;
# It&#039;s recommended to save the Blender scene too. This will make making a new icon with a small tweak that much easier...&lt;br /&gt;
## &#039;&#039;File&#039;&#039; drop down from top toolbar.&lt;br /&gt;
## &#039;&#039;Save As...&#039;&#039; to save the Blender scene to the computer.&lt;br /&gt;
&lt;br /&gt;
=== Adding to Unity Scene ===&lt;br /&gt;
The developers explain how to create an item in one of ModKit&#039;s read me files (See: &amp;lt;code&amp;gt;Assets/EcoModKit/Docs/README.md&amp;lt;/code&amp;gt;), but this guide will explain it below.&lt;br /&gt;
&lt;br /&gt;
Additionally, &#039;&#039;&#039;TheKye&#039;&#039;&#039; on YouTube covers this in their &#039;&#039;Creating Your First Item&#039;&#039; and &#039;&#039;Creating Your First Item Pt 2&#039;&#039; videos.&lt;br /&gt;
&lt;br /&gt;
Use those additional resource to help troubleshoot issues with item&#039;s icons.&lt;br /&gt;
&lt;br /&gt;
# Open &amp;lt;u&amp;gt;Unity&amp;lt;/u&amp;gt;.&lt;br /&gt;
# In the left panel, the &#039;&#039;Hierarchy&#039;&#039; tab should be selected.&lt;br /&gt;
# Select the top-most object there. It should be a scene. If the editor last loaded the &#039;&#039;Demo&#039;&#039; scene from the medieval assets, it&#039;ll be named &#039;&#039;Demo&#039;&#039;.&lt;br /&gt;
# Right click on this scene and select &#039;&#039;Add New Scene&#039;&#039; from the menu.&lt;br /&gt;
# Right click again on the old scene (&#039;&#039;Demo&#039;&#039;) and select &#039;&#039;Remove Scene&#039;&#039;.&lt;br /&gt;
# Let it save if the changes to the old scene are important. Discard if it was open just for exploration&#039;s sake.&lt;br /&gt;
# Right click the new, &#039;&#039;Untitled&#039;&#039; scene. Click &#039;&#039;Save Scene As...&#039;&#039;&lt;br /&gt;
# Save it somewhere on the computer and give it a name. Example: &#039;&#039;WikiDemo&#039;&#039;.&lt;br /&gt;
# Delete &amp;lt;u&amp;gt;anything&amp;lt;/u&amp;gt; in the scene.&lt;br /&gt;
# Right click the scene, hover &#039;&#039;GameObject&#039;&#039;, and select &#039;&#039;Create Empty&#039;&#039; from the sub-menu.&lt;br /&gt;
# Name this new object &#039;&#039;Objects&#039;&#039;.&lt;br /&gt;
# Select the newly created &#039;&#039;Objects&#039;&#039; object from the &#039;&#039;Hierarchy&#039;&#039; menu.&lt;br /&gt;
# On the far right side of the screen, in the &#039;&#039;Inspector&#039;&#039; menu, click the &#039;&#039;Add Component&#039;&#039; button.&lt;br /&gt;
# Type in &#039;&#039;ModkitPrefabContainer&#039;&#039;. Click on the component from the search to add it. The component now should be listed in the &#039;&#039;Inspector&#039;&#039;.&lt;br /&gt;
# In the &#039;&#039;Hierarchy&#039;&#039; panel right click the scene, hover &#039;&#039;GameObject&#039;&#039;, and select &#039;&#039;Create Empty&#039;&#039;.&lt;br /&gt;
# Name this new object &#039;&#039;Items&#039;&#039;.&lt;br /&gt;
# Right click the scene, hover &#039;&#039;GameObject&#039;&#039;, and select &#039;&#039;Create Empty&#039;&#039;.&lt;br /&gt;
# Name this new object &#039;&#039;Emoji&#039;&#039;.&lt;br /&gt;
# Select the newly created &#039;&#039;Emoji&#039;&#039; object, find the &#039;&#039;Inspector&#039;&#039; menu (far-right), and click the &#039;&#039;Add Component&#039;&#039; button.&lt;br /&gt;
# Type in &#039;&#039;ChatEmoteSetOld&#039;&#039;. Click on the component from the search to add it. That component should now be listed in the &#039;&#039;Inspector&#039;&#039;.&lt;br /&gt;
# Right click the scene, hover &#039;&#039;GameObject&#039;&#039;, and select &#039;&#039;Create Empty&#039;&#039;.&lt;br /&gt;
# Name this new object &#039;&#039;BlockSets&#039;&#039;.&lt;br /&gt;
# Select the newly created &#039;&#039;BlockSets&#039;&#039; object, find the &#039;&#039;Inspector&#039;&#039; menu (far-right), and click &#039;&#039;Add Component&#039;&#039;.&lt;br /&gt;
# Search for &#039;&#039;BlockSetContainer&#039;&#039;. Click on the component from the search to add it. The &#039;&#039;Inspector&#039;&#039; should now show that component as added.&lt;br /&gt;
# Go to &amp;lt;code&amp;gt;Assets/EcoModKit/Prefabs&amp;lt;/code&amp;gt; in the Unity browser.&lt;br /&gt;
# Find the prefab &#039;&#039;ItemTemplate&#039;&#039;.&lt;br /&gt;
# Drag it onto the &#039;&#039;Items&#039;&#039; object in the &#039;&#039;Hierarchy&#039;&#039; panel. It should add it as a &amp;lt;u&amp;gt;child&amp;lt;/u&amp;gt; of the &#039;&#039;Items&#039;&#039; object.&lt;br /&gt;
# Right click on the new &#039;&#039;ItemTemplate&#039;&#039; object, hover &#039;&#039;Prefab&#039;&#039;, and select &#039;&#039;Unpack Completely&#039;&#039;.&lt;br /&gt;
# Right click on the &#039;&#039;ItemTemplate&#039;&#039; object and select &#039;&#039;Rename&#039;&#039;. Name this what you want the item to be called. Example: &#039;&#039;MedievalStallItem&#039;&#039;.&lt;br /&gt;
# Set this item&#039;s background...&lt;br /&gt;
## Here&#039;s the default backgrounds (blue = item, brown = block, green = food): [[File:Eco - Item - Background.png|border|frameless]]        [[File:Eco - Block - Background.png|frameless]]        [[File:Eco - Food - Background.png|frameless]]&lt;br /&gt;
## Download or prepare the background and add it to the &amp;lt;code&amp;gt;Assets&amp;lt;/code&amp;gt; folder in Unity. &lt;br /&gt;
### To follow along lockstep, put the background in a new &amp;lt;code&amp;gt;Assets/WikiDemo&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
### Right click on &amp;lt;code&amp;gt;Assets&amp;lt;/code&amp;gt; folder, hover &#039;&#039;Create&#039;&#039;, select &#039;&#039;Folder&#039;&#039;.&lt;br /&gt;
### Name the folder &#039;&#039;WikiDemo&#039;&#039;.&lt;br /&gt;
## Configure Unity to use these as sprites...&lt;br /&gt;
### Select the background(s) added (Ctrl+Click each one).&lt;br /&gt;
### In the &#039;&#039;Inspector&#039;&#039;, find &#039;&#039;TextureType&#039;&#039; and change that to &#039;&#039;Sprite (2D and UI)&#039;&#039;.&lt;br /&gt;
### Again in the &#039;&#039;Inspector&#039;&#039;, find &#039;&#039;SpriteMode&#039;&#039; and change that to &#039;&#039;Single&#039;&#039;.&lt;br /&gt;
### Then scroll and go to the bottom of the &#039;&#039;Inspector&#039;&#039; and find the &#039;&#039;Apply&#039;&#039; button.&lt;br /&gt;
### This will apply those changes to that file and all other ones highlighted.&lt;br /&gt;
## Select the item being created (&#039;&#039;MedievalStallItem&#039;&#039;).&lt;br /&gt;
## In the &#039;&#039;Inspector&#039;&#039; panel (far-right), scroll and find the &#039;&#039;Item Template (Script)&#039;&#039; section.&lt;br /&gt;
## In here find the &#039;&#039;Background&#039;&#039; input. It&#039;ll say &#039;&#039;Background (Image)&#039;&#039; in it. If clicked that text to reveal and highlight the related object in the &#039;&#039;Hierarchy&#039;&#039; panel.&lt;br /&gt;
## Select the revealed, and highlighted object &#039;&#039;Background&#039;&#039;.&lt;br /&gt;
## In the &#039;&#039;Inspector&#039;&#039; panel, scroll and find the &#039;&#039;Image&#039;&#039; component section.&lt;br /&gt;
## Inside that component&#039;s section, find &#039;&#039;Source Image&#039;&#039;. It&#039;ll say &#039;&#039;Missing (Sprite)&#039;&#039;. Click the &#039;&#039;⦿&#039;&#039; button to the right.&lt;br /&gt;
## The &#039;&#039;Select Sprite&#039;&#039; popup will show. Make sure the &#039;&#039;Assets&#039;&#039; tab is selected, and find the backgrounds desired.&lt;br /&gt;
# Set this item&#039;s foreground...&lt;br /&gt;
## Copy the item&#039;s icon into the &amp;lt;code&amp;gt;Assets&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
## Configure Unity to use it as a sprite (see the previous step&#039;s &#039;&#039;Set this item&#039;s background...&#039;&#039; instructions)&lt;br /&gt;
## Select the item being created (&#039;&#039;MedievalStallItem&#039;&#039;).&lt;br /&gt;
## In the &#039;&#039;Inspector&#039;&#039; panel (far-right), scroll and find the &#039;&#039;Item Template (Script)&#039;&#039; section.&lt;br /&gt;
## In here find the &#039;&#039;Foreground&#039;&#039; input. It&#039;ll say &#039;&#039;Foreground (Image)&#039;&#039; in it. If clicked that text to reveal and highlight the related object in the &#039;&#039;Hierarchy&#039;&#039; panel.&lt;br /&gt;
## Select the revealed, and highlighted object &#039;&#039;Foreground&#039;&#039;.&lt;br /&gt;
## Use the &#039;&#039;Inspector&#039;&#039;, find the &#039;&#039;Image&#039;&#039; component, within that component find the &#039;&#039;Source Image&#039;&#039; input. It will say &#039;&#039;Missing (Sprite)&#039;&#039;.&lt;br /&gt;
## Click the &#039;&#039;⦿&#039;&#039; button to the right of that input.&lt;br /&gt;
## From the &#039;&#039;Select Sprite&#039;&#039; popup, ensure the &#039;&#039;Assets&#039;&#039; tab is being searched, and find the icon.&lt;br /&gt;
&lt;br /&gt;
=== Scripting the Item ===&lt;br /&gt;
Registering the item in the code is as simple as:&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;using Eco.Core.Items;&lt;br /&gt;
using Eco.Gameplay.Items;&lt;br /&gt;
using Eco.Shared.Localization;&lt;br /&gt;
using Eco.Shared.Serialization;&lt;br /&gt;
&lt;br /&gt;
namespace WikiDemo&lt;br /&gt;
{&lt;br /&gt;
    [Serialized] // Tells the save/load system this object needs to be serialized.&lt;br /&gt;
    [LocDisplayName(&amp;quot;Market Stall&amp;quot;)] // Defines the localized name of the item.&lt;br /&gt;
    [Weight(100)] // Defines how heavy Arrow is.&lt;br /&gt;
    [Ecopedia(&amp;quot;Work Stations&amp;quot;, &amp;quot;Craft Tables&amp;quot;, createAsSubPage: true)]&lt;br /&gt;
    [LocDescription(&amp;quot;A medieval market stall.&amp;quot;)] //The tooltip description for the item.&lt;br /&gt;
    public partial class MedievalStallItem: Item { }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Line 13:&#039;&#039;&#039; The implementation of &amp;lt;code&amp;gt;Item&amp;lt;/code&amp;gt; means that Eco will find this and look for Unity assets that matching this class&#039; name, &amp;lt;code&amp;gt;MedivalStallItem&amp;lt;/code&amp;gt;. While this doesn&#039;t do anything fancy, it completes the first step towards a new workbench.&lt;br /&gt;
&lt;br /&gt;
=== Checkpoint ===&lt;br /&gt;
This was a lot of setup and steps. Make sure everything is running smoothly by doing the following:&lt;br /&gt;
&lt;br /&gt;
# In &amp;lt;u&amp;gt;Unity&amp;lt;/u&amp;gt;.&lt;br /&gt;
# Open the &#039;&#039;Eco Tools&#039;&#039; drop down from the top toolbar.&lt;br /&gt;
# Hover &#039;&#039;Mod Kit&#039;&#039;.&lt;br /&gt;
# Select &#039;&#039;Build Current Bundle&#039;&#039;.&lt;br /&gt;
# A file explorer window will popup. Point it to where you want the newly created bundle to be save.&lt;br /&gt;
# Copy that bundle into the Eco mod directory, &amp;lt;code&amp;gt;/Eco Server/Mods/UserCode&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Start the server and connect to it.&lt;br /&gt;
# Test it out by typing &amp;lt;code&amp;gt;/give MedievalStall&amp;lt;/code&amp;gt; in chat (or &amp;lt;code&amp;gt;/give&amp;lt;/code&amp;gt; whatever your item is named)&lt;br /&gt;
# The item should appear in the players inventory with a working icon.&lt;br /&gt;
&lt;br /&gt;
This was the longest &amp;quot;leg&amp;quot; of this journey. All the setup is done and the infrastructure is in place. The following sections will just build on what was taught here.&lt;br /&gt;
&lt;br /&gt;
Keep on, keeping on!&lt;br /&gt;
&lt;br /&gt;
== Code the Item&#039;s Recipe ==&lt;br /&gt;
Time for an easy one, add a block of code to tell the game how to craft the worktable item. Assign to &amp;lt;u&amp;gt;an existing&amp;lt;/u&amp;gt; worktable.&lt;br /&gt;
&lt;br /&gt;
Talk about how the Item name in Unity and the class name in code is what joins the items. Must be exactly the same!&lt;br /&gt;
&lt;br /&gt;
=== Checkpoint ===&lt;br /&gt;
Export, run local, try to craft the item&lt;br /&gt;
&lt;br /&gt;
== Create the World Object ==&lt;br /&gt;
&lt;br /&gt;
=== Add to Unity Scene ===&lt;br /&gt;
Same as Creating the Item, Add to Unity Scene.&lt;br /&gt;
&lt;br /&gt;
Explore what the ModKit utility &#039;&#039;World Object Setup&#039;&#039; does. In Unity editor, top toolbar, &amp;lt;code&amp;gt;Eco Tools &amp;gt; Mod Kit &amp;gt; World Object Setup&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Scripting the World Object ===&lt;br /&gt;
Barebones code that registers the world object.&lt;br /&gt;
&lt;br /&gt;
Code that links the Item to this World Object.&lt;br /&gt;
&lt;br /&gt;
=== Checkpoint ===&lt;br /&gt;
Export and see what it does. Ensure it&#039;s not lifting off the ground because of a non-curved shader.&lt;br /&gt;
&lt;br /&gt;
==== Origin Point Editing ====&lt;br /&gt;
Talk about what it does: the point that the simulation considers this world object to be at.&lt;br /&gt;
&lt;br /&gt;
Show how to move it around using blender.&lt;br /&gt;
&lt;br /&gt;
== Final Export ==&lt;br /&gt;
Export.&lt;br /&gt;
&lt;br /&gt;
Package.&lt;br /&gt;
&lt;br /&gt;
Distribute.&lt;/div&gt;</summary>
		<author><name>WugWugg</name></author>
	</entry>
	<entry>
		<id>https://wiki.play.eco/en/index.php?title=From_3D_Asset_to_Working_Worktable&amp;diff=16709</id>
		<title>From 3D Asset to Working Worktable</title>
		<link rel="alternate" type="text/html" href="https://wiki.play.eco/en/index.php?title=From_3D_Asset_to_Working_Worktable&amp;diff=16709"/>
		<updated>2026-04-20T20:59:52Z</updated>

		<summary type="html">&lt;p&gt;WugWugg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction =&lt;br /&gt;
Below is a guide on how to take an 3D asset from the Unity Store and make a working workbench in Eco. This includes:&lt;br /&gt;
* Creating a recipe to craft the modded table&lt;br /&gt;
* Creating recipes so the player can use the modded table to craft something&lt;br /&gt;
* Using Blender to generate a modded icon (seen when holding it in inventory)&lt;br /&gt;
* Using Blender to adjust the origin point of the model&lt;br /&gt;
* How to setup all this in a Unity scene and package for Eco&lt;br /&gt;
&lt;br /&gt;
= Setup =&lt;br /&gt;
&lt;br /&gt;
* Already have setup &#039;&#039;&#039;ModKit + Unity&#039;&#039;&#039;&lt;br /&gt;
** See: [[Installing the ModKit]]&lt;br /&gt;
* Have a &#039;&#039;&#039;3D model&#039;&#039;&#039;&lt;br /&gt;
** Just following along? Find the one used here at &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://assetstore.unity.com/packages/3d/props/low-poly-medieval-market-stalls-314286&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* A &#039;&#039;&#039;C# IDE&#039;&#039;&#039; (notepad++, Visual Studio, etc.)&lt;br /&gt;
** Highly encouraged to have an Intellisense setup and linked to the &#039;&#039;&#039;Reference Assemblies&#039;&#039;&#039;. Optional, but its really worth the time to figure out because it will help quickly correct small typos and trivial mistakes.&lt;br /&gt;
** See: [[Getting Started with Eco Modding in Visual Studio 2022]] (generally the same steps apply if using a new version of Visual Studio)&lt;br /&gt;
* &#039;&#039;&#039;Blender&#039;&#039;&#039; installed&lt;br /&gt;
** Homepage: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://www.blender.org/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Importing the Assets ==&lt;br /&gt;
&lt;br /&gt;
# Open the Unity editor to the project.&lt;br /&gt;
# From the top toolbar open the &#039;&#039;Window&#039;&#039; drop down.&lt;br /&gt;
# Hover &#039;&#039;Package Management&#039;&#039; to open sub-menu.&lt;br /&gt;
# Select &#039;&#039;Package Manager&#039;&#039;.&lt;br /&gt;
# The &#039;&#039;Package Manager&#039;&#039; window will pop-up.&lt;br /&gt;
# Install the package containing the assets you want to use...&lt;br /&gt;
## &amp;lt;u&amp;gt;If not using Unity Registry&amp;lt;/u&amp;gt;...&lt;br /&gt;
### Find the &#039;&#039;+▾&#039;&#039; button in the top left and open the drop down.&lt;br /&gt;
### Install the package from one of those options.&lt;br /&gt;
## &amp;lt;u&amp;gt;If using Unity Registry&amp;lt;/u&amp;gt;...&lt;br /&gt;
### Visit &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://assetstore.unity.com&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; and sign in.&lt;br /&gt;
### Search for the asset desired.&lt;br /&gt;
### Go to it&#039;s page (e.g. &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://assetstore.unity.com/packages/3d/props/low-poly-medieval-market-stalls-314286&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;) and click the big blue button, &#039;&#039;Add to My Assets.&#039;&#039;&lt;br /&gt;
### Now, in the Unity editor and back at the &#039;&#039;Package Manager&#039;&#039; window.&lt;br /&gt;
### Find &#039;&#039;My Assets&#039;&#039; on the left menu and navigate to it.&lt;br /&gt;
### Click the &#039;&#039;⟳&#039;&#039; button in the lower-right.&lt;br /&gt;
### The asset should be in the list now. Use the search to filter if needed.&lt;br /&gt;
### Click on the asset in the list. For those following along, &#039;&#039;Low Poly Medieval Market Stalls&#039;&#039;.&lt;br /&gt;
### In the right panel, find the &#039;&#039;Download ⤓&#039;&#039; button. Click it.&lt;br /&gt;
### Once downloaded, a new button should show up, it&#039;ll say something like &#039;&#039;⊕ Import 1.0 to project&#039;&#039; . Click it.&lt;br /&gt;
### The &#039;&#039;Import Unity Package&#039;&#039; window will pop-up.&lt;br /&gt;
### Select &#039;&#039;Import&#039;&#039; on it.&lt;br /&gt;
# Verify you can find your assets from the explorer. If following along, the assets are at &amp;lt;code&amp;gt;Assets/PolyRonin/Medieval Market Stalls&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Load in a demo scene, if provided, and make sure everything looks okay.&lt;br /&gt;
## For those following along, double click on the &#039;&#039;Demo&#039;&#039; scene at &amp;lt;code&amp;gt;Assets/PolyRonin/Medieval Market Stalls/Demo.unity&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:Eco - Unity - View Modes.png|thumb|Underlined in red are the different draw mode buttons. &amp;lt;u&amp;gt;4/20/26&amp;lt;/u&amp;gt;]]&lt;br /&gt;
If something seems off, check the different draw modes and see if changing those allow the scene to render as expected (see picture).&lt;br /&gt;
&lt;br /&gt;
With all that setup, it&#039;s time to get to the creation parts.&lt;br /&gt;
&lt;br /&gt;
= Creating The Worktable =&lt;br /&gt;
This guide will create the worktable in this order:&lt;br /&gt;
&lt;br /&gt;
# Create the item that represents the worktable&lt;br /&gt;
# Make a recipe to craft the worktable item&lt;br /&gt;
# Make the worktable item something that places a world object&lt;br /&gt;
# Give the worktable functionality by adding recipes to it&lt;br /&gt;
&lt;br /&gt;
== Creating the Item ==&lt;br /&gt;
&lt;br /&gt;
=== Item Icon ===&lt;br /&gt;
Rehash old guide from &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://mod.io/g/eco/r/origin-points-icon-images-with-blender&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Adding to Unity Scene ===&lt;br /&gt;
Follow steps in Unity &amp;lt;code&amp;gt;Assets/EcoModKit/Docs/README.md&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fill in the gaps with &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://www.youtube.com/watch?v=-4JcxeB27jU&amp;amp;list=PLlDdwsO1CKN7OJgfQOmwzoULoBqHUqxBm&amp;amp;index=7&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Scripting the Item ===&lt;br /&gt;
Barebones code that registers the item + standard features (weight, ecopedia page, etc.).&lt;br /&gt;
&lt;br /&gt;
=== Checkpoint ===&lt;br /&gt;
Export, run local, try &amp;lt;code&amp;gt;/give myItem&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Code the Item&#039;s Recipe ==&lt;br /&gt;
Time for an easy one, add a block of code to tell the game how to craft the worktable item. Assign to &amp;lt;u&amp;gt;an existing&amp;lt;/u&amp;gt; worktable.&lt;br /&gt;
&lt;br /&gt;
Talk about how the Item name in Unity and the class name in code is what joins the items. Must be exactly the same!&lt;br /&gt;
&lt;br /&gt;
=== Checkpoint ===&lt;br /&gt;
Export, run local, try to craft the item&lt;br /&gt;
&lt;br /&gt;
== Create the World Object ==&lt;br /&gt;
&lt;br /&gt;
=== Add to Unity Scene ===&lt;br /&gt;
Same as Creating the Item, Add to Unity Scene.&lt;br /&gt;
&lt;br /&gt;
Explore what the ModKit utility &#039;&#039;World Object Setup&#039;&#039; does. In Unity editor, top toolbar, &amp;lt;code&amp;gt;Eco Tools &amp;gt; Mod Kit &amp;gt; World Object Setup&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Scripting the World Object ===&lt;br /&gt;
Barebones code that registers the world object.&lt;br /&gt;
&lt;br /&gt;
Code that links the Item to this World Object.&lt;br /&gt;
&lt;br /&gt;
=== Checkpoint ===&lt;br /&gt;
Export and see what it does. Ensure it&#039;s not lifting off the ground because of a non-curved shader.&lt;br /&gt;
&lt;br /&gt;
==== Origin Point Editing ====&lt;br /&gt;
Talk about what it does: the point that the simulation considers this world object to be at.&lt;br /&gt;
&lt;br /&gt;
Show how to move it around using blender.&lt;br /&gt;
&lt;br /&gt;
== Final Export ==&lt;br /&gt;
Export.&lt;br /&gt;
&lt;br /&gt;
Package.&lt;br /&gt;
&lt;br /&gt;
Distribute.&lt;/div&gt;</summary>
		<author><name>WugWugg</name></author>
	</entry>
	<entry>
		<id>https://wiki.play.eco/en/index.php?title=From_3D_Asset_to_Working_Worktable&amp;diff=16708</id>
		<title>From 3D Asset to Working Worktable</title>
		<link rel="alternate" type="text/html" href="https://wiki.play.eco/en/index.php?title=From_3D_Asset_to_Working_Worktable&amp;diff=16708"/>
		<updated>2026-04-20T20:58:14Z</updated>

		<summary type="html">&lt;p&gt;WugWugg: WIP&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction =&lt;br /&gt;
Below is a guide on how to take an 3D asset from the Unity Store and make a working workbench in Eco. This includes:&lt;br /&gt;
* Creating a recipe to craft the modded table&lt;br /&gt;
* Creating recipes so the player can use the modded table to craft something&lt;br /&gt;
* Using Blender to generate a modded icon (seen when holding it in inventory)&lt;br /&gt;
* Using Blender to adjust the origin point of the model&lt;br /&gt;
* How to setup all this in a Unity scene and package for Eco&lt;br /&gt;
&lt;br /&gt;
= Setup =&lt;br /&gt;
&lt;br /&gt;
* Already have setup &#039;&#039;&#039;ModKit + Unity&#039;&#039;&#039;&lt;br /&gt;
** See: [[Installing the ModKit]]&lt;br /&gt;
* Have a &#039;&#039;&#039;3D model&#039;&#039;&#039;&lt;br /&gt;
** Just following along? Find the one used here at &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://assetstore.unity.com/packages/3d/props/low-poly-medieval-market-stalls-314286&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* A &#039;&#039;&#039;C# IDE&#039;&#039;&#039; (notepad++, Visual Studio, etc.)&lt;br /&gt;
** Highly encouraged to have an Intellisense setup and linked to the &#039;&#039;&#039;Reference Assemblies&#039;&#039;&#039;. Optional, but its really worth the time to figure out because it will help quickly correct small typos and trivial mistakes.&lt;br /&gt;
** See: [[Getting Started with Eco Modding in Visual Studio 2022]] (generally the same steps apply if using a new version of Visual Studio)&lt;br /&gt;
* &#039;&#039;&#039;Blender&#039;&#039;&#039; installed&lt;br /&gt;
** Homepage: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://www.blender.org/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Importing the Assets ==&lt;br /&gt;
&lt;br /&gt;
# Open the Unity editor to the project.&lt;br /&gt;
# From the top toolbar open the &#039;&#039;Window&#039;&#039; drop down.&lt;br /&gt;
# Hover &#039;&#039;Package Management&#039;&#039; to open sub-menu.&lt;br /&gt;
# Select &#039;&#039;Package Manager&#039;&#039;.&lt;br /&gt;
# The &#039;&#039;Package Manager&#039;&#039; window will pop-up.&lt;br /&gt;
# Install the package containing the assets you want to use...&lt;br /&gt;
## &amp;lt;u&amp;gt;If not using Unity Registry&amp;lt;/u&amp;gt;...&lt;br /&gt;
### Find the &#039;&#039;+▾&#039;&#039; button in the top left and open the drop down.&lt;br /&gt;
### Install the package from one of those options.&lt;br /&gt;
## &amp;lt;u&amp;gt;If using Unity Registry&amp;lt;/u&amp;gt;...&lt;br /&gt;
### Visit &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://assetstore.unity.com&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; and sign in.&lt;br /&gt;
### Search for the asset desired.&lt;br /&gt;
### Go to it&#039;s page (e.g. &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://assetstore.unity.com/packages/3d/props/low-poly-medieval-market-stalls-314286&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;) and click the big blue button, &#039;&#039;Add to My Assets.&#039;&#039;&lt;br /&gt;
### Now, in the Unity editor and back at the &#039;&#039;Package Manager&#039;&#039; window.&lt;br /&gt;
### Find &#039;&#039;My Assets&#039;&#039; on the left menu and navigate to it.&lt;br /&gt;
### Click the &#039;&#039;⟳&#039;&#039; button in the lower-right.&lt;br /&gt;
### The asset should be in the list now. Use the search to filter if needed.&lt;br /&gt;
### Click on the asset in the list. For those following along, &#039;&#039;Low Poly Medieval Market Stalls&#039;&#039;.&lt;br /&gt;
### In the right panel, find the &#039;&#039;Download ⤓&#039;&#039; button. Click it.&lt;br /&gt;
### Once downloaded, a new button should show up, it&#039;ll say something like &#039;&#039;⊕ Import 1.0 to project&#039;&#039; . Click it.&lt;br /&gt;
### The &#039;&#039;Import Unity Package&#039;&#039; window will pop-up.&lt;br /&gt;
### Select &#039;&#039;Import&#039;&#039; on it.&lt;br /&gt;
# Verify you can find your assets from the explorer. If following along, the assets are at &amp;lt;code&amp;gt;Assets/PolyRonin/Medieval Market Stalls&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Load in a demo scene, if provided, and make sure everything looks okay.&lt;br /&gt;
&lt;br /&gt;
[[File:Eco - Unity - View Modes.png|thumb|Underlined in red are the different draw mode buttons. &amp;lt;u&amp;gt;4/20/26&amp;lt;/u&amp;gt;]]&lt;br /&gt;
If something seems off, check the different draw modes and see if changing those allow the scene to render as expected (see picture).&lt;br /&gt;
&lt;br /&gt;
With all that setup, it&#039;s time to get to the creation parts.&lt;br /&gt;
&lt;br /&gt;
= Creating The Worktable =&lt;br /&gt;
This guide will create the worktable in this order:&lt;br /&gt;
&lt;br /&gt;
# Create the item that represents the worktable&lt;br /&gt;
# Make a recipe to craft the worktable item&lt;br /&gt;
# Make the worktable item something that places a world object&lt;br /&gt;
# Give the worktable functionality by adding recipes to it&lt;br /&gt;
&lt;br /&gt;
== Creating the Item ==&lt;br /&gt;
&lt;br /&gt;
=== Item Icon ===&lt;br /&gt;
Rehash old guide from &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://mod.io/g/eco/r/origin-points-icon-images-with-blender&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Adding to Unity Scene ===&lt;br /&gt;
Follow steps in Unity &amp;lt;code&amp;gt;Assets/EcoModKit/Docs/README.md&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fill in the gaps with &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://www.youtube.com/watch?v=-4JcxeB27jU&amp;amp;list=PLlDdwsO1CKN7OJgfQOmwzoULoBqHUqxBm&amp;amp;index=7&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Scripting the Item ===&lt;br /&gt;
Barebones code that registers the item + standard features (weight, ecopedia page, etc.).&lt;br /&gt;
&lt;br /&gt;
=== Checkpoint ===&lt;br /&gt;
Export, run local, try &amp;lt;code&amp;gt;/give myItem&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Code the Item&#039;s Recipe ==&lt;br /&gt;
Time for an easy one, add a block of code to tell the game how to craft the worktable item. Assign to &amp;lt;u&amp;gt;an existing&amp;lt;/u&amp;gt; worktable.&lt;br /&gt;
&lt;br /&gt;
Talk about how the Item name in Unity and the class name in code is what joins the items. Must be exactly the same!&lt;br /&gt;
&lt;br /&gt;
=== Checkpoint ===&lt;br /&gt;
Export, run local, try to craft the item&lt;br /&gt;
&lt;br /&gt;
== Create the World Object ==&lt;br /&gt;
&lt;br /&gt;
=== Add to Unity Scene ===&lt;br /&gt;
Same as Creating the Item, Add to Unity Scene.&lt;br /&gt;
&lt;br /&gt;
Explore what the ModKit utility &#039;&#039;World Object Setup&#039;&#039; does. In Unity editor, top toolbar, &amp;lt;code&amp;gt;Eco Tools &amp;gt; Mod Kit &amp;gt; World Object Setup&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Scripting the World Object ===&lt;br /&gt;
Barebones code that registers the world object.&lt;br /&gt;
&lt;br /&gt;
Code that links the Item to this World Object.&lt;br /&gt;
&lt;br /&gt;
=== Checkpoint ===&lt;br /&gt;
Export and see what it does. Ensure it&#039;s not lifting off the ground because of a non-curved shader.&lt;br /&gt;
&lt;br /&gt;
==== Origin Point Editing ====&lt;br /&gt;
Talk about what it does: the point that the simulation considers this world object to be at.&lt;br /&gt;
&lt;br /&gt;
Show how to move it around using blender.&lt;br /&gt;
&lt;br /&gt;
== Final Export ==&lt;br /&gt;
Export.&lt;br /&gt;
&lt;br /&gt;
Package.&lt;br /&gt;
&lt;br /&gt;
Distribute.&lt;/div&gt;</summary>
		<author><name>WugWugg</name></author>
	</entry>
	<entry>
		<id>https://wiki.play.eco/en/index.php?title=Installing_the_ModKit&amp;diff=16707</id>
		<title>Installing the ModKit</title>
		<link rel="alternate" type="text/html" href="https://wiki.play.eco/en/index.php?title=Installing_the_ModKit&amp;diff=16707"/>
		<updated>2026-04-20T20:21:31Z</updated>

		<summary type="html">&lt;p&gt;WugWugg: Correcting project template style from URP 3D to 3D (Built-In Render Pipeline)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= What is ModKit =&lt;br /&gt;
ModKit is the freely available code and 3D assets used to modify Eco&#039;s game play.&lt;br /&gt;
&lt;br /&gt;
With ModKit you can create new:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;World Objects*&#039;&#039;&#039; - Objects in the game server (e.g. workbenches)&lt;br /&gt;
* &#039;&#039;&#039;Items*&#039;&#039;&#039; - These are the icons for items and world objects.&lt;br /&gt;
* &#039;&#039;&#039;Block Sets*&#039;&#039;&#039; - The variations of a block&#039;s shape for building.&lt;br /&gt;
* &#039;&#039;&#039;Emoji Sets*&#039;&#039;&#039; - A collection of icon assets (PNG / sprite sheets).&lt;br /&gt;
* &#039;&#039;&#039;Plugins&#039;&#039;&#039; - These are code that changes how the server behaves (from adding a recipe to adding a new mechanic).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; Requires Unity&lt;br /&gt;
&lt;br /&gt;
= Get ModKit =&lt;br /&gt;
[[File:Eco - Game Downloads - ModKit - Marked Up.png|thumb|The &#039;&#039;Game Downloads&#039;&#039; section where the &#039;&#039;ModKit&#039;&#039; download is. &amp;lt;u&amp;gt;4/20/2026&amp;lt;/u&amp;gt;]]&lt;br /&gt;
# Go to https://play.eco/account and login (create your account, if necessary).&lt;br /&gt;
# Then on the account page find the &#039;&#039;Game Downloads&#039;&#039; section. Inside of that section there will be a button titled &#039;&#039;ModKit.&#039;&#039;&lt;br /&gt;
## &amp;lt;u&amp;gt;If targeting the current release&amp;lt;/u&amp;gt;, click on the only button that says &#039;&#039;ModKit&#039;&#039; near the top of that section.&lt;br /&gt;
## I&amp;lt;u&amp;gt;f targeting the staging (preview of next release) version&amp;lt;/u&amp;gt;, click the &#039;&#039;More Downloads&#039;&#039; button in the top right. Then find the &#039;&#039;ModKit&#039;&#039; button in the bottom section. The button will be under a header that says &amp;quot;For advanced users that want to test the most recent, unstable version&amp;quot;.&lt;br /&gt;
## &amp;lt;u&amp;gt;Unsure&amp;lt;/u&amp;gt;&amp;lt;u&amp;gt;?&amp;lt;/u&amp;gt; Go with the current release version.&lt;br /&gt;
# Let it download.&lt;br /&gt;
# Unzip or Extract the ModKit archive.&lt;br /&gt;
&lt;br /&gt;
= Installing ModKit =&lt;br /&gt;
&lt;br /&gt;
== Installing Unity ==&lt;br /&gt;
[[File:Eco - Unity Installer - Engine Install Screen.png|thumb|Shows the Unity Hub&#039;s editor installation screen. &amp;lt;u&amp;gt;4/20/2026&amp;lt;/u&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
# Determine what version of Unity editor is needed. &amp;lt;u&amp;gt;As of 4/20/2026&amp;lt;/u&amp;gt;, the Unity editor is &amp;lt;code&amp;gt;Unity 6.3&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Look for the &amp;lt;code&amp;gt;ProjectVersion.txt&amp;lt;/code&amp;gt; file inside the ModKit folder.&lt;br /&gt;
## Find the line that looks like &amp;lt;code&amp;gt;m_EditorVersion: 0000.0.000&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Figure the matching Unity editor version.&lt;br /&gt;
### For &amp;lt;code&amp;gt;6000.3.6f1&amp;lt;/code&amp;gt; that means install &#039;&#039;Unity 6.3.&#039;&#039;&lt;br /&gt;
### If it was &amp;lt;code&amp;gt;2030.1.1de&amp;lt;/code&amp;gt; then install &#039;&#039;Unity 2030.1&#039;&#039; (this version doesn&#039;t exist, just using it as an example).&lt;br /&gt;
## If the version has &#039;&#039;LTS&#039;&#039; in it, just ignore that. It just means Long Term Support and doesn&#039;t change that version&#039;s number. For example, if given &amp;lt;code&amp;gt;6000.3.6f1&amp;lt;/code&amp;gt;  then it is reasonable that both &#039;&#039;Unity 6.3&#039;&#039; and &#039;&#039;Unity 6.3 LTS&#039;&#039; will be compatible.&lt;br /&gt;
# Go to &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://unity.com/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Download and install the &#039;&#039;Unity Hub&#039;&#039;.  &#039;&#039;&#039;Note:&#039;&#039;&#039; On first start Unity Hub will being downloading the most recent version of the Unity editor. View this by clicking on the download icon in the very top-right of the window (just left of the exit button on windows). If it is not downloading the version determined in step 1, cancel that download. Save some time and disk space this way.&lt;br /&gt;
# Install the correct version of Unity engine. &lt;br /&gt;
## On the left menu find &#039;&#039;Installs&#039;&#039; and navigate to that page.&lt;br /&gt;
## In the top right click the &#039;&#039;Install Editor&#039;&#039; button.&lt;br /&gt;
## A pop-up should appear where you can search, scroll, and find the version determined in step 1.&lt;br /&gt;
&lt;br /&gt;
== The Unity Project ==&lt;br /&gt;
[[File:Eco - Unity Installer - Project Creation.png|thumb|&#039;&#039;3D (Built-In Render Pipeline)&#039;&#039; project setup on Unity Hub. &amp;lt;u&amp;gt;4/20/2026&amp;lt;/u&amp;gt;]]&lt;br /&gt;
ModKit is just a bundle of assets that is imported into a Unity project. If you already have a project you&#039;d like to use the ModKit, open that project and skip to the &#039;&#039;Importing ModKit&#039;&#039; section below.&lt;br /&gt;
&lt;br /&gt;
To create a new project, open Unity Hub and follow along:&lt;br /&gt;
&lt;br /&gt;
# On the left menu find &#039;&#039;Projects&#039;&#039; and navigate to that page.&lt;br /&gt;
# In the top right click the &#039;&#039;+ New Project&#039;&#039; button.&lt;br /&gt;
# Here select the &#039;&#039;3D&#039;&#039; (&#039;&#039;Built-In Render Pipeline)&#039;&#039; template. It may have to download the template first.&lt;br /&gt;
# &amp;lt;u&amp;gt;If you installed multiple versions of Unity&amp;lt;/u&amp;gt;&#039;&#039;,&#039;&#039; double check the &#039;&#039;Editor version&#039;&#039; box here. Make sure the first four numbers and the numbers after the first dot (e.g.&amp;lt;code&amp;gt;6000.3&amp;lt;/code&amp;gt;) match what is in the &amp;lt;code&amp;gt;ProjectVersion.txt&amp;lt;/code&amp;gt; file.&lt;br /&gt;
# Name the project.&lt;br /&gt;
# Select where it will save to.&lt;br /&gt;
# Consider using a &#039;&#039;Source Control Provider&#039;&#039;. Optional.&lt;br /&gt;
# Click &#039;&#039;+ Create project&#039;&#039;.&lt;br /&gt;
# The Unity editor will setup this project. This process may take several minutes.&lt;br /&gt;
&lt;br /&gt;
== Importing ModKit ==&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Importing ModKit into a pre-existing project will override some of the project&#039;s settings. Make a backup of your work proceeding!&lt;br /&gt;
&lt;br /&gt;
Open the project you want to load ModKit into and follow along:&lt;br /&gt;
# From the top toolbar find and open the &#039;&#039;Assets&#039;&#039; drop down&lt;br /&gt;
# Hover the &#039;&#039;Import Package&#039;&#039; option to expand the sub-menu&lt;br /&gt;
# Select and click on &#039;&#039;Custom Package...&#039;&#039; A file browser should appear.&lt;br /&gt;
# Navigate to the ModKit folder.&lt;br /&gt;
# Select the &amp;lt;code&amp;gt;EcoModKit.unitypackage&amp;lt;/code&amp;gt; file. &lt;br /&gt;
# Press &#039;&#039;Open&#039;&#039;. &lt;br /&gt;
# A warning will pop-up. &lt;br /&gt;
## If this is a fresh new project&#039;&#039;,&#039;&#039; click &#039;&#039;Import.&#039;&#039;&lt;br /&gt;
## If this is a project with stuff in it, make a backup copy before continuing. Continue by clicking &#039;&#039;Import&#039;&#039;.&lt;br /&gt;
# A window will pop-up titled &#039;&#039;Import Unity Package&#039;&#039;. It&#039;s listing all the changes being made.&lt;br /&gt;
# Click &#039;&#039;Next.&#039;&#039;&lt;br /&gt;
# The window will now show any destructive changes it&#039;s going to make.&lt;br /&gt;
# Continue when ready by clicking &#039;&#039;Import.&#039;&#039;&lt;br /&gt;
# The editor will import the ModKit assets. This process may take a few minutes.&lt;br /&gt;
# Install Text Mesh Pro features.&lt;br /&gt;
## From the top toolbar find and open the &#039;&#039;Window&#039;&#039; drop down.&lt;br /&gt;
## Hover &#039;&#039;TextMeshPro&#039;&#039; to expand the sub-menu.&lt;br /&gt;
## Select &#039;&#039;Import TextMeshPro Essential Resources&#039;&#039;&lt;br /&gt;
## Review the import screen showing changes made.&lt;br /&gt;
## Click &#039;&#039;Import&#039;&#039;.&lt;br /&gt;
&amp;lt;u&amp;gt;For older versions only&amp;lt;/u&amp;gt; (&amp;lt;code&amp;gt;Unity 2019.#&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Unity 2020.#&amp;lt;/code&amp;gt;) of the Unity editor there are more steps:&lt;br /&gt;
&lt;br /&gt;
# From the top toolbar find and open the &#039;&#039;Window&#039;&#039; drop down.&lt;br /&gt;
# Hover &#039;&#039;Package Management&#039;&#039; to open the sub-menu.&lt;br /&gt;
# Select &#039;&#039;Package Manager&#039;&#039;.&lt;br /&gt;
# The &#039;&#039;Package Manager&#039;&#039; window should pop-up.&lt;br /&gt;
# In the top-left find and click the &#039;&#039;In Project&#039;&#039; tab.&lt;br /&gt;
# From it, select &#039;&#039;Unity Registry&#039;&#039;.&lt;br /&gt;
# Select &#039;&#039;Collections&#039;&#039; from the list.&lt;br /&gt;
## In &amp;lt;code&amp;gt;Unity 2019.#&amp;lt;/code&amp;gt;, if the &#039;&#039;Collections&#039;&#039; package is missing turn on &#039;&#039;Preview packages.&#039;&#039; To turn that feature on, find the &#039;&#039;Advanced&#039;&#039; drop down inside the &#039;&#039;Package Manager.&#039;&#039;  From the &#039;&#039;Advanced&#039;&#039; drop down, check &#039;&#039;Show preview packages.&#039;&#039;&lt;br /&gt;
## In &amp;lt;code&amp;gt;Unity 2020.#&amp;lt;/code&amp;gt;, some packages are hidden entirely. Install these packages by clicking on the &#039;&#039;+&#039;&#039; (add) button in the &#039;&#039;Package Manager&#039;&#039;. Select the &#039;&#039;Add packages from git URL&#039;&#039; option. Input &amp;lt;code&amp;gt;com.unity.collections&amp;lt;/code&amp;gt; and click the &#039;&#039;Add&#039;&#039; button.&lt;br /&gt;
# Go down the list and click &#039;&#039;Install&#039;&#039; on all list items.&lt;br /&gt;
&lt;br /&gt;
= Using ModKit =&lt;br /&gt;
[[File:Eco - Unity - ModKit - TemplateScene.png|thumb|ModKit &#039;&#039;Template Scene&#039;&#039; Asset. &amp;lt;u&amp;gt;4/20/2026&amp;lt;/u&amp;gt;]]&lt;br /&gt;
In Unity&#039;s editor, ModKit assets can be found at &amp;lt;code&amp;gt;Assets/EcoModKit&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Read the &#039;&#039;README&#039;&#039; files in &amp;lt;code&amp;gt;Assets/EcoModKit/README.md&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Assets/EcoModKit/Docs/README.md&amp;lt;/code&amp;gt;. The second one explains better what can be accomplished with ModKit.&lt;br /&gt;
&lt;br /&gt;
See the ModKit tutorials on [[Mod Development]] page for guides on how to use ModKit and Unity to construct a mod.&lt;br /&gt;
&lt;br /&gt;
== Exporting ==&lt;br /&gt;
Once finished with developing a mod&#039;s assets in Unity, it must be exported. ModKit provides a special script for this purpose. Open your Unity project and follow along to export:&lt;br /&gt;
&lt;br /&gt;
# From the top toolbar find and open &#039;&#039;Eco Tools&#039;&#039; drop down.&lt;br /&gt;
# Hover &#039;&#039;Mod Kit&#039;&#039; and expand the sub-menu.&lt;br /&gt;
# Select &#039;&#039;Build Current Bundle.&#039;&#039;&lt;br /&gt;
# A file explorer will pop-up.&lt;br /&gt;
## Select where to save the mod&#039;s assets. &lt;br /&gt;
## Give them a name.&lt;br /&gt;
# Unity will build the package. This may take several minutes.&lt;br /&gt;
# Once it finishes, that file ending in &amp;lt;code&amp;gt;.unity3d&amp;lt;/code&amp;gt; is the asset you distribute and use in the Mods folder at &amp;lt;code&amp;gt;../Eco Server/Mods/UserCode&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Happy Modding!&lt;br /&gt;
[[Category: Modding]]&lt;/div&gt;</summary>
		<author><name>WugWugg</name></author>
	</entry>
	<entry>
		<id>https://wiki.play.eco/en/index.php?title=Installing_the_ModKit&amp;diff=16706</id>
		<title>Installing the ModKit</title>
		<link rel="alternate" type="text/html" href="https://wiki.play.eco/en/index.php?title=Installing_the_ModKit&amp;diff=16706"/>
		<updated>2026-04-20T19:03:38Z</updated>

		<summary type="html">&lt;p&gt;WugWugg: Added export functionality description.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= What is ModKit =&lt;br /&gt;
ModKit is the freely available code and 3D assets used to modify Eco&#039;s game play.&lt;br /&gt;
&lt;br /&gt;
With ModKit you can create new:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;World Objects*&#039;&#039;&#039; - Objects in the game server (e.g. workbenches)&lt;br /&gt;
* &#039;&#039;&#039;Items*&#039;&#039;&#039; - These are the icons for items and world objects.&lt;br /&gt;
* &#039;&#039;&#039;Block Sets*&#039;&#039;&#039; - The variations of a block&#039;s shape for building.&lt;br /&gt;
* &#039;&#039;&#039;Emoji Sets*&#039;&#039;&#039; - A collection of icon assets (PNG / sprite sheets).&lt;br /&gt;
* &#039;&#039;&#039;Plugins&#039;&#039;&#039; - These are code that changes how the server behaves (from adding a recipe to adding a new mechanic).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; Requires Unity&lt;br /&gt;
&lt;br /&gt;
= Get ModKit =&lt;br /&gt;
[[File:Eco - Game Downloads - ModKit - Marked Up.png|thumb|The &#039;&#039;Game Downloads&#039;&#039; section where the &#039;&#039;ModKit&#039;&#039; download is. &amp;lt;u&amp;gt;4/20/2026&amp;lt;/u&amp;gt;]]&lt;br /&gt;
# Go to https://play.eco/account and login (create your account, if necessary).&lt;br /&gt;
# Then on the account page find the &#039;&#039;Game Downloads&#039;&#039; section. Inside of that section there will be a button titled &#039;&#039;ModKit.&#039;&#039;&lt;br /&gt;
## &amp;lt;u&amp;gt;If targeting the current release&amp;lt;/u&amp;gt;, click on the only button that says &#039;&#039;ModKit&#039;&#039; near the top of that section.&lt;br /&gt;
## I&amp;lt;u&amp;gt;f targeting the staging (preview of next release) version&amp;lt;/u&amp;gt;, click the &#039;&#039;More Downloads&#039;&#039; button in the top right. Then find the &#039;&#039;ModKit&#039;&#039; button in the bottom section. The button will be under a header that says &amp;quot;For advanced users that want to test the most recent, unstable version&amp;quot;.&lt;br /&gt;
## &amp;lt;u&amp;gt;Unsure&amp;lt;/u&amp;gt;&amp;lt;u&amp;gt;?&amp;lt;/u&amp;gt; Go with the current release version.&lt;br /&gt;
# Let it download.&lt;br /&gt;
# Unzip or Extract the ModKit archive.&lt;br /&gt;
&lt;br /&gt;
= Installing ModKit =&lt;br /&gt;
&lt;br /&gt;
== Installing Unity ==&lt;br /&gt;
[[File:Eco - Unity Installer - Engine Install Screen.png|thumb|Shows the Unity Hub&#039;s editor installation screen. &amp;lt;u&amp;gt;4/20/2026&amp;lt;/u&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
# Determine what version of Unity editor is needed. &amp;lt;u&amp;gt;As of 4/20/2026&amp;lt;/u&amp;gt;, the Unity editor is &amp;lt;code&amp;gt;Unity 6.3&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Look for the &amp;lt;code&amp;gt;ProjectVersion.txt&amp;lt;/code&amp;gt; file inside the ModKit folder.&lt;br /&gt;
## Find the line that looks like &amp;lt;code&amp;gt;m_EditorVersion: 0000.0.000&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Figure the matching Unity editor version.&lt;br /&gt;
### For &amp;lt;code&amp;gt;6000.3.6f1&amp;lt;/code&amp;gt; that means install &#039;&#039;Unity 6.3.&#039;&#039;&lt;br /&gt;
### If it was &amp;lt;code&amp;gt;2030.1.1de&amp;lt;/code&amp;gt; then install &#039;&#039;Unity 2030.1&#039;&#039; (this version doesn&#039;t exist, just using it as an example).&lt;br /&gt;
## If the version has &#039;&#039;LTS&#039;&#039; in it, just ignore that. It just means Long Term Support and doesn&#039;t change that version&#039;s number. For example, if given &amp;lt;code&amp;gt;6000.3.6f1&amp;lt;/code&amp;gt;  then it is reasonable that both &#039;&#039;Unity 6.3&#039;&#039; and &#039;&#039;Unity 6.3 LTS&#039;&#039; will be compatible.&lt;br /&gt;
# Go to &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://unity.com/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Download and install the &#039;&#039;Unity Hub&#039;&#039;.  &#039;&#039;&#039;Note:&#039;&#039;&#039; On first start Unity Hub will being downloading the most recent version of the Unity editor. View this by clicking on the download icon in the very top-right of the window (just left of the exit button on windows). If it is not downloading the version determined in step 1, cancel that download. Save some time and disk space this way.&lt;br /&gt;
# Install the correct version of Unity engine. &lt;br /&gt;
## On the left menu find &#039;&#039;Installs&#039;&#039; and navigate to that page.&lt;br /&gt;
## In the top right click the &#039;&#039;Install Editor&#039;&#039; button.&lt;br /&gt;
## A pop-up should appear where you can search, scroll, and find the version determined in step 1.&lt;br /&gt;
&lt;br /&gt;
== The Unity Project ==&lt;br /&gt;
[[File:Eco - Unity Installer - Project Creation.png|thumb|&#039;&#039;Universal 3D&#039;&#039; project setup on Unity Hub. &amp;lt;u&amp;gt;4/20/2026&amp;lt;/u&amp;gt;]]&lt;br /&gt;
ModKit is just a bundle of assets that is imported into a Unity project. If you already have a project you&#039;d like to use the ModKit, open that project and skip to the &#039;&#039;Importing ModKit&#039;&#039; section below.&lt;br /&gt;
&lt;br /&gt;
To create a new project, open Unity Hub and follow along:&lt;br /&gt;
&lt;br /&gt;
# On the left menu find &#039;&#039;Projects&#039;&#039; and navigate to that page.&lt;br /&gt;
# In the top right click the &#039;&#039;+ New Project&#039;&#039; button.&lt;br /&gt;
# Here select the &#039;&#039;Universal 3D&#039;&#039; template.&lt;br /&gt;
# &amp;lt;u&amp;gt;If you installed multiple versions of Unity&amp;lt;/u&amp;gt;&#039;&#039;,&#039;&#039; double check the &#039;&#039;Editor version&#039;&#039; box here. Make sure the first four numbers and the numbers after the first dot (e.g.&amp;lt;code&amp;gt;6000.3&amp;lt;/code&amp;gt;) match what is in the &amp;lt;code&amp;gt;ProjectVersion.txt&amp;lt;/code&amp;gt; file.&lt;br /&gt;
# Name the project.&lt;br /&gt;
# Select where it will save to.&lt;br /&gt;
# Consider using a &#039;&#039;Source Control Provider&#039;&#039;. Optional.&lt;br /&gt;
# Click &#039;&#039;+ Create project&#039;&#039;.&lt;br /&gt;
# The Unity editor will setup this project. This process may take several minutes.&lt;br /&gt;
&lt;br /&gt;
== Importing ModKit ==&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Importing ModKit into a pre-existing project will override some of the project&#039;s settings. Make a backup of your work proceeding!&lt;br /&gt;
&lt;br /&gt;
Open the project you want to load ModKit into and follow along:&lt;br /&gt;
# From the top toolbar find and open the &#039;&#039;Assets&#039;&#039; drop down&lt;br /&gt;
# Hover the &#039;&#039;Import Package&#039;&#039; option to expand the sub-menu&lt;br /&gt;
# Select and click on &#039;&#039;Custom Package...&#039;&#039; A file browser should appear.&lt;br /&gt;
# Navigate to the ModKit folder.&lt;br /&gt;
# Select the &amp;lt;code&amp;gt;EcoModKit.unitypackage&amp;lt;/code&amp;gt; file. &lt;br /&gt;
# Press &#039;&#039;Open&#039;&#039;. &lt;br /&gt;
# A warning will pop-up. &lt;br /&gt;
## If this is a fresh new project&#039;&#039;,&#039;&#039; click &#039;&#039;Import.&#039;&#039;&lt;br /&gt;
## If this is a project with stuff in it, make a backup copy before continuing. Continue by clicking &#039;&#039;Import&#039;&#039;.&lt;br /&gt;
# A window will pop-up titled &#039;&#039;Import Unity Package&#039;&#039;. It&#039;s listing all the changes being made.&lt;br /&gt;
# Click &#039;&#039;Next.&#039;&#039;&lt;br /&gt;
# The window will now show any destructive changes it&#039;s going to make.&lt;br /&gt;
# Continue when ready by clicking &#039;&#039;Import.&#039;&#039;&lt;br /&gt;
# The editor will import the ModKit assets. This process may take a few minutes.&lt;br /&gt;
# Install Text Mesh Pro features.&lt;br /&gt;
## From the top toolbar find and open the &#039;&#039;Window&#039;&#039; drop down.&lt;br /&gt;
## Hover &#039;&#039;TextMeshPro&#039;&#039; to expand the sub-menu.&lt;br /&gt;
## Select &#039;&#039;Import TextMeshPro Essential Resources&#039;&#039;&lt;br /&gt;
## Review the import screen showing changes made.&lt;br /&gt;
## Click &#039;&#039;Import&#039;&#039;.&lt;br /&gt;
&amp;lt;u&amp;gt;For older versions only&amp;lt;/u&amp;gt; (&amp;lt;code&amp;gt;Unity 2019.#&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Unity 2020.#&amp;lt;/code&amp;gt;) of the Unity editor there are more steps:&lt;br /&gt;
&lt;br /&gt;
# From the top toolbar find and open the &#039;&#039;Window&#039;&#039; drop down.&lt;br /&gt;
# Hover &#039;&#039;Package Management&#039;&#039; to open the sub-menu.&lt;br /&gt;
# Select &#039;&#039;Package Manager&#039;&#039;.&lt;br /&gt;
# The &#039;&#039;Package Manager&#039;&#039; window should pop-up.&lt;br /&gt;
# In the top-left find and click the &#039;&#039;In Project&#039;&#039; tab.&lt;br /&gt;
# From it, select &#039;&#039;Unity Registry&#039;&#039;.&lt;br /&gt;
# Select &#039;&#039;Collections&#039;&#039; from the list.&lt;br /&gt;
## In &amp;lt;code&amp;gt;Unity 2019.#&amp;lt;/code&amp;gt;, if the &#039;&#039;Collections&#039;&#039; package is missing turn on &#039;&#039;Preview packages.&#039;&#039; To turn that feature on, find the &#039;&#039;Advanced&#039;&#039; drop down inside the &#039;&#039;Package Manager.&#039;&#039;  From the &#039;&#039;Advanced&#039;&#039; drop down, check &#039;&#039;Show preview packages.&#039;&#039;&lt;br /&gt;
## In &amp;lt;code&amp;gt;Unity 2020.#&amp;lt;/code&amp;gt;, some packages are hidden entirely. Install these packages by clicking on the &#039;&#039;+&#039;&#039; (add) button in the &#039;&#039;Package Manager&#039;&#039;. Select the &#039;&#039;Add packages from git URL&#039;&#039; option. Input &amp;lt;code&amp;gt;com.unity.collections&amp;lt;/code&amp;gt; and click the &#039;&#039;Add&#039;&#039; button.&lt;br /&gt;
# Go down the list and click &#039;&#039;Install&#039;&#039; on all list items.&lt;br /&gt;
&lt;br /&gt;
= Using ModKit =&lt;br /&gt;
[[File:Eco - Unity - ModKit - TemplateScene.png|thumb|ModKit &#039;&#039;Template Scene&#039;&#039; Asset. &amp;lt;u&amp;gt;4/20/2026&amp;lt;/u&amp;gt;]]&lt;br /&gt;
In Unity&#039;s editor, ModKit assets can be found at &amp;lt;code&amp;gt;Assets/EcoModKit&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Read the &#039;&#039;README&#039;&#039; files in &amp;lt;code&amp;gt;Assets/EcoModKit/README.md&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Assets/EcoModKit/Docs/README.md&amp;lt;/code&amp;gt;. The second one explains better what can be accomplished with ModKit.&lt;br /&gt;
&lt;br /&gt;
See the ModKit tutorials on [[Mod Development]] page for guides on how to use ModKit and Unity to construct a mod.&lt;br /&gt;
&lt;br /&gt;
== Exporting ==&lt;br /&gt;
Once finished with developing a mod&#039;s assets in Unity, it must be exported. ModKit provides a special script for this purpose. Open your Unity project and follow along to export:&lt;br /&gt;
&lt;br /&gt;
# From the top toolbar find and open &#039;&#039;Eco Tools&#039;&#039; drop down.&lt;br /&gt;
# Hover &#039;&#039;Mod Kit&#039;&#039; and expand the sub-menu.&lt;br /&gt;
# Select &#039;&#039;Build Current Bundle.&#039;&#039;&lt;br /&gt;
# A file explorer will pop-up.&lt;br /&gt;
## Select where to save the mod&#039;s assets. &lt;br /&gt;
## Give them a name.&lt;br /&gt;
# Unity will build the package. This may take several minutes.&lt;br /&gt;
# Once it finishes, that file ending in &amp;lt;code&amp;gt;.unity3d&amp;lt;/code&amp;gt; is the asset you distribute and use in the Mods folder at &amp;lt;code&amp;gt;../Eco Server/Mods/UserCode&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Happy Modding!&lt;br /&gt;
[[Category: Modding]]&lt;/div&gt;</summary>
		<author><name>WugWugg</name></author>
	</entry>
	<entry>
		<id>https://wiki.play.eco/en/index.php?title=Installing_the_ModKit&amp;diff=16705</id>
		<title>Installing the ModKit</title>
		<link rel="alternate" type="text/html" href="https://wiki.play.eco/en/index.php?title=Installing_the_ModKit&amp;diff=16705"/>
		<updated>2026-04-20T18:44:41Z</updated>

		<summary type="html">&lt;p&gt;WugWugg: Updating. Adding more detail, but mostly just spreading previous steps into step-by-step instructions.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= What is ModKit =&lt;br /&gt;
ModKit is the freely available code and 3D assets used to modify Eco&#039;s game play.&lt;br /&gt;
&lt;br /&gt;
With ModKit you can create new:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;World Objects*&#039;&#039;&#039; - Objects in the game server (e.g. workbenches)&lt;br /&gt;
* &#039;&#039;&#039;Items*&#039;&#039;&#039; - These are the icons for items and world objects.&lt;br /&gt;
* &#039;&#039;&#039;Block Sets*&#039;&#039;&#039; - The variations of a block&#039;s shape for building.&lt;br /&gt;
* &#039;&#039;&#039;Emoji Sets*&#039;&#039;&#039; - A collection of icon assets (PNG / sprite sheets).&lt;br /&gt;
* &#039;&#039;&#039;Plugins&#039;&#039;&#039; - These are code that changes how the server behaves (from adding a recipe to adding a new mechanic).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; Requires Unity&lt;br /&gt;
&lt;br /&gt;
= Get ModKit =&lt;br /&gt;
[[File:Eco - Game Downloads - ModKit - Marked Up.png|thumb|The &#039;&#039;Game Downloads&#039;&#039; section where the &#039;&#039;ModKit&#039;&#039; download is. &amp;lt;u&amp;gt;4/20/2026&amp;lt;/u&amp;gt;]]&lt;br /&gt;
# Go to https://play.eco/account and login (create your account, if necessary).&lt;br /&gt;
# Then on the account page find the &#039;&#039;Game Downloads&#039;&#039; section. Inside of that section there will be a button titled &#039;&#039;ModKit.&#039;&#039;&lt;br /&gt;
## &amp;lt;u&amp;gt;If targeting the current release&amp;lt;/u&amp;gt;, click on the only button that says &#039;&#039;ModKit&#039;&#039; near the top of that section.&lt;br /&gt;
## I&amp;lt;u&amp;gt;f targeting the staging (preview of next release) version&amp;lt;/u&amp;gt;, click the &#039;&#039;More Downloads&#039;&#039; button in the top right. Then find the &#039;&#039;ModKit&#039;&#039; button in the bottom section. The button will be under a header that says &amp;quot;For advanced users that want to test the most recent, unstable version&amp;quot;.&lt;br /&gt;
## &amp;lt;u&amp;gt;Unsure&amp;lt;/u&amp;gt;&amp;lt;u&amp;gt;?&amp;lt;/u&amp;gt; Go with the current release version.&lt;br /&gt;
# Let it download.&lt;br /&gt;
# Unzip or Extract the ModKit archive.&lt;br /&gt;
&lt;br /&gt;
= Installing ModKit =&lt;br /&gt;
&lt;br /&gt;
== Installing Unity ==&lt;br /&gt;
[[File:Eco - Unity Installer - Engine Install Screen.png|thumb|Shows the Unity Hub&#039;s editor installation screen. &amp;lt;u&amp;gt;4/20/2026&amp;lt;/u&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
# Determine what version of Unity editor is needed. &amp;lt;u&amp;gt;As of 4/20/2026&amp;lt;/u&amp;gt;, the Unity editor is &amp;lt;code&amp;gt;Unity 6.3&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Look for the &amp;lt;code&amp;gt;ProjectVersion.txt&amp;lt;/code&amp;gt; file inside the ModKit folder.&lt;br /&gt;
## Find the line that looks like &amp;lt;code&amp;gt;m_EditorVersion: 0000.0.000&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Figure the matching Unity editor version.&lt;br /&gt;
### For &amp;lt;code&amp;gt;6000.3.6f1&amp;lt;/code&amp;gt; that means install &#039;&#039;Unity 6.3.&#039;&#039;&lt;br /&gt;
### If it was &amp;lt;code&amp;gt;2030.1.1de&amp;lt;/code&amp;gt; then install &#039;&#039;Unity 2030.1&#039;&#039; (this version doesn&#039;t exist, just using it as an example).&lt;br /&gt;
## If the version has &#039;&#039;LTS&#039;&#039; in it, just ignore that. It just means Long Term Support and doesn&#039;t change that version&#039;s number. For example, if given &amp;lt;code&amp;gt;6000.3.6f1&amp;lt;/code&amp;gt;  then it is reasonable that both &#039;&#039;Unity 6.3&#039;&#039; and &#039;&#039;Unity 6.3 LTS&#039;&#039; will be compatible.&lt;br /&gt;
# Go to &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://unity.com/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Download and install the &#039;&#039;Unity Hub&#039;&#039;.  &#039;&#039;&#039;Note:&#039;&#039;&#039; On first start Unity Hub will being downloading the most recent version of the Unity editor. View this by clicking on the download icon in the very top-right of the window (just left of the exit button on windows). If it is not downloading the version determined in step 1, cancel that download. Save some time and disk space this way.&lt;br /&gt;
# Install the correct version of Unity engine. &lt;br /&gt;
## On the left menu find &#039;&#039;Installs&#039;&#039; and navigate to that page.&lt;br /&gt;
## In the top right click the &#039;&#039;Install Editor&#039;&#039; button.&lt;br /&gt;
## A pop-up should appear where you can search, scroll, and find the version determined in step 1.&lt;br /&gt;
&lt;br /&gt;
== The Unity Project ==&lt;br /&gt;
[[File:Eco - Unity Installer - Project Creation.png|thumb|&#039;&#039;Universal 3D&#039;&#039; project setup on Unity Hub. &amp;lt;u&amp;gt;4/20/2026&amp;lt;/u&amp;gt;]]&lt;br /&gt;
ModKit is just a bundle of assets that is imported into a Unity project. If you already have a project you&#039;d like to use the ModKit, open that project and skip to the &#039;&#039;Importing ModKit&#039;&#039; section below.&lt;br /&gt;
&lt;br /&gt;
To create a new project, open Unity Hub and follow along:&lt;br /&gt;
&lt;br /&gt;
# On the left menu find &#039;&#039;Projects&#039;&#039; and navigate to that page.&lt;br /&gt;
# In the top right click the &#039;&#039;+ New Project&#039;&#039; button.&lt;br /&gt;
# Here select the &#039;&#039;Universal 3D&#039;&#039; template.&lt;br /&gt;
# &amp;lt;u&amp;gt;If you installed multiple versions of Unity&amp;lt;/u&amp;gt;&#039;&#039;,&#039;&#039; double check the &#039;&#039;Editor version&#039;&#039; box here. Make sure the first four numbers and the numbers after the first dot (e.g.&amp;lt;code&amp;gt;6000.3&amp;lt;/code&amp;gt;) match what is in the &amp;lt;code&amp;gt;ProjectVersion.txt&amp;lt;/code&amp;gt; file.&lt;br /&gt;
# Name the project.&lt;br /&gt;
# Select where it will save to.&lt;br /&gt;
# Consider using a &#039;&#039;Source Control Provider&#039;&#039;. Optional.&lt;br /&gt;
# Click &#039;&#039;+ Create project&#039;&#039;.&lt;br /&gt;
# The Unity editor will setup this project. This process may take several minutes.&lt;br /&gt;
&lt;br /&gt;
== Importing ModKit ==&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Importing ModKit into a pre-existing project will override some of the project&#039;s settings. Make a backup of your work proceeding!&lt;br /&gt;
&lt;br /&gt;
Open the project you want to load ModKit into and follow along:&lt;br /&gt;
# From the top toolbar find and open the &#039;&#039;Assets&#039;&#039; drop down&lt;br /&gt;
# Hover the &#039;&#039;Import Package&#039;&#039; option to expand the sub-menu&lt;br /&gt;
# Select and click on &#039;&#039;Custom Package...&#039;&#039; A file browser should appear.&lt;br /&gt;
# Navigate to the ModKit folder.&lt;br /&gt;
# Select the &amp;lt;code&amp;gt;EcoModKit.unitypackage&amp;lt;/code&amp;gt; file. &lt;br /&gt;
# Press &#039;&#039;Open&#039;&#039;. &lt;br /&gt;
# A warning will pop-up. &lt;br /&gt;
## If this is a fresh new project&#039;&#039;,&#039;&#039; click &#039;&#039;Import.&#039;&#039;&lt;br /&gt;
## If this is a project with stuff in it, make a backup copy before continuing. Continue by clicking &#039;&#039;Import&#039;&#039;.&lt;br /&gt;
# A window will pop-up titled &#039;&#039;Import Unity Package&#039;&#039;. It&#039;s listing all the changes being made.&lt;br /&gt;
# Click &#039;&#039;Next.&#039;&#039;&lt;br /&gt;
# The window will now show any destructive changes it&#039;s going to make.&lt;br /&gt;
# Continue when ready by clicking &#039;&#039;Import.&#039;&#039;&lt;br /&gt;
# The editor will import the ModKit assets. This process may take a few minutes.&lt;br /&gt;
# Install Text Mesh Pro features.&lt;br /&gt;
## From the top toolbar find and open the &#039;&#039;Window&#039;&#039; drop down.&lt;br /&gt;
## Hover &#039;&#039;TextMeshPro&#039;&#039; to expand the sub-menu.&lt;br /&gt;
## Select &#039;&#039;Import TextMeshPro Essential Resources&#039;&#039;&lt;br /&gt;
## Review the import screen showing changes made.&lt;br /&gt;
## Click &#039;&#039;Import&#039;&#039;.&lt;br /&gt;
&amp;lt;u&amp;gt;For older versions only&amp;lt;/u&amp;gt; (&amp;lt;code&amp;gt;Unity 2019.#&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Unity 2020.#&amp;lt;/code&amp;gt;) of the Unity editor there are more steps:&lt;br /&gt;
&lt;br /&gt;
# From the top toolbar find and open the &#039;&#039;Window&#039;&#039; drop down.&lt;br /&gt;
# Hover &#039;&#039;Package Management&#039;&#039; to open the sub-menu.&lt;br /&gt;
# Select &#039;&#039;Package Manager&#039;&#039;.&lt;br /&gt;
# The &#039;&#039;Package Manager&#039;&#039; window should pop-up.&lt;br /&gt;
# In the top-left find and click the &#039;&#039;In Project&#039;&#039; tab.&lt;br /&gt;
# From it, select &#039;&#039;Unity Registry&#039;&#039;.&lt;br /&gt;
# Select &#039;&#039;Collections&#039;&#039; from the list.&lt;br /&gt;
## In &amp;lt;code&amp;gt;Unity 2019.#&amp;lt;/code&amp;gt;, if the &#039;&#039;Collections&#039;&#039; package is missing turn on &#039;&#039;Preview packages.&#039;&#039; To turn that feature on, find the &#039;&#039;Advanced&#039;&#039; drop down inside the &#039;&#039;Package Manager.&#039;&#039;  From the &#039;&#039;Advanced&#039;&#039; drop down, check &#039;&#039;Show preview packages.&#039;&#039;&lt;br /&gt;
## In &amp;lt;code&amp;gt;Unity 2020.#&amp;lt;/code&amp;gt;, some packages are hidden entirely. Install these packages by clicking on the &#039;&#039;+&#039;&#039; (add) button in the &#039;&#039;Package Manager&#039;&#039;. Select the &#039;&#039;Add packages from git URL&#039;&#039; option. Input &amp;lt;code&amp;gt;com.unity.collections&amp;lt;/code&amp;gt; and click the &#039;&#039;Add&#039;&#039; button.&lt;br /&gt;
# Go down the list and click &#039;&#039;Install&#039;&#039; on all list items.&lt;br /&gt;
&lt;br /&gt;
= Using ModKit =&lt;br /&gt;
[[File:Eco - Unity - ModKit - TemplateScene.png|thumb|ModKit &#039;&#039;Template Scene&#039;&#039; Asset. &amp;lt;u&amp;gt;4/20/2026&amp;lt;/u&amp;gt;]]&lt;br /&gt;
In Unity&#039;s editor, ModKit assets can be found at &amp;lt;code&amp;gt;Assets/EcoModKit&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Read the &#039;&#039;README&#039;&#039; files in &amp;lt;code&amp;gt;Assets/EcoModKit/README.md&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Assets/EcoModKit/Docs/README.md&amp;lt;/code&amp;gt;. The second one explains better what can be accomplished with ModKit.&lt;br /&gt;
&lt;br /&gt;
For more tutorials on using ModKit see the [[Mod Development]] page.&lt;br /&gt;
&lt;br /&gt;
[[Category: Modding]]&lt;/div&gt;</summary>
		<author><name>WugWugg</name></author>
	</entry>
	<entry>
		<id>https://wiki.play.eco/en/index.php?title=Getting_Started_with_Eco_Modding_in_Visual_Studio&amp;diff=16664</id>
		<title>Getting Started with Eco Modding in Visual Studio</title>
		<link rel="alternate" type="text/html" href="https://wiki.play.eco/en/index.php?title=Getting_Started_with_Eco_Modding_in_Visual_Studio&amp;diff=16664"/>
		<updated>2026-04-09T09:11:21Z</updated>

		<summary type="html">&lt;p&gt;WugWugg: Updated project setup to mention .net10 now that it&amp;#039;s LTS and ECO uses it&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
This guide covers how you could use Visual Studio 2022 as the development environment for your Eco mods — from creating your project to building, testing, and releasing a mod.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;This guide won’t teach you how to code or write a mod&amp;lt;/u&amp;gt;, but it will help you get everything set up so you’re ready to start learning. There will be helpful resources for learning listed at the bottom of this guide.&lt;br /&gt;
&lt;br /&gt;
=== Have Ready ===&lt;br /&gt;
* A copy of the Eco game installed&lt;br /&gt;
* A file explorer and the file-path to &amp;lt;code&amp;gt;Eco&amp;lt;/code&amp;gt; folder&lt;br /&gt;
** &amp;lt;u&amp;gt;At the time of writing,&amp;lt;/u&amp;gt; within this folder there&#039;s folders like &amp;lt;code&amp;gt;D3D12&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Eco_Data&amp;lt;/code&amp;gt;. Also, you&#039;ll find the &amp;lt;code&amp;gt;Eco.exe&amp;lt;/code&amp;gt; file here. There are other files and folder here too, but this list is just to help you know what the folder looks like.&lt;br /&gt;
 &lt;br /&gt;
==== Note: Find Folder with Steam ====&lt;br /&gt;
&#039;&#039;&#039;Steam&#039;&#039;&#039; users can find the install folder by right-clicking on the game in your Steam Library:&lt;br /&gt;
&lt;br /&gt;
[[File:Steam Library -- Browse Local Files.png|alt=Shows a Steam Library with a menu open over the Eco game. Highlighted in that menu is a &amp;quot;Manage&amp;quot; option, opening a sub-menu. The sub-menu has &amp;quot;Browse local files&amp;quot; highlighted.|frameless|border|upright=3|location=center|link=]]&lt;br /&gt;
&lt;br /&gt;
== Installing Visual Studio 2022 ==&lt;br /&gt;
Visual Studio 2022 (VS2022) has a completely free to use version called the &#039;&#039;&#039;Community Edition&#039;&#039;&#039;. This guide is written assuming that&#039;s the version used. &lt;br /&gt;
&lt;br /&gt;
Go to https://visualstudio.microsoft.com/downloads/#visual-studio-community-2022 and look for the &amp;quot;&#039;&#039;&#039;Visual Studio Community 2022&#039;&#039;&#039;&amp;quot; download. &amp;lt;u&amp;gt;At the time of writing,&amp;lt;/u&amp;gt; the download button looked like:&lt;br /&gt;
&lt;br /&gt;
[[File:VisualStudio2022 DownloadPage.png|alt=A picture of a website showing a row. The first column has the name &amp;quot;Visual Studio Community 2022&amp;quot; and there&#039;s a &amp;quot;Download&amp;quot; button two columns to the right, past it&#039;s description text.|frameless|location=center|link=|border|upright=4]]&lt;br /&gt;
&lt;br /&gt;
Start the download by clicking on the Download button.&lt;br /&gt;
&lt;br /&gt;
Then, run the installer till this the installer gets to the Workloads page. On this page, select these workloads:&lt;br /&gt;
* &#039;&#039;&#039;.NET desktop development&#039;&#039;&#039; -- Required for any mod development&lt;br /&gt;
* ASP.NET and web development -- Optional. If you want to interact with external websites or Eco&#039;s own web server (e.g. Discord&#039;s web-hooks or extending the API)&lt;br /&gt;
&#039;&#039;&#039;Note&#039;&#039;&#039;: Using the Workflow installation page is easy, but will install a few extra things (e.g. GitHub Copilot). If you want &#039;&#039;&#039;to keep the tooling minimal&#039;&#039;&#039; you can just install .NET from &amp;lt;code&amp;gt;dotnet.microsoft.com/en-us/download&amp;lt;/code&amp;gt;. &amp;lt;u&amp;gt;At the time of writing&amp;lt;/u&amp;gt;, Eco supports &#039;&#039;&#039;.NET version 8.0&#039;&#039;&#039;. See the later section [https://wiki.play.eco/en/index.php?title=Getting_Started_with_Eco_Modding_in_Visual_Studio_2022&amp;amp;veaction=edit&amp;amp;section=7 .NET Version] of this guide to learn how to check if that has changed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;At the time of writing,&amp;lt;/u&amp;gt; this is what the Workloads page looks like with those options selected:&lt;br /&gt;
&lt;br /&gt;
[[File:VisualStudioCommunity2022 Workloads.png|alt=Workloads screen during VS2022 installation. Options selected are &amp;quot;ASP.NET and web development&amp;quot; and &amp;quot;.NET desktop development&amp;quot;. |frameless|location=center|upright=4|link=|border]]&lt;br /&gt;
&lt;br /&gt;
Click the Install button. It will take a few minutes to complete installation. By default, it should launch VS2022 after it installs.&lt;br /&gt;
&lt;br /&gt;
It will ask you to sign in. &#039;&#039;&#039;You do not need to&#039;&#039;&#039; and can completely avoid this by clicking the &#039;&#039;Skip and add accounts later&#039;&#039; option in tiny text below the buttons. &lt;br /&gt;
&lt;br /&gt;
If you plan to upload your mod to Github, VS2022 does have integrated support for GitHub. So consider signing in with GitHub to make that process easier.&lt;br /&gt;
&lt;br /&gt;
This guide is continuing as if the &#039;&#039;Skip and add accounts later&#039;&#039; option was selected. Finally, it might ask what color theme you&#039;d like. Select your preference and continue. &lt;br /&gt;
&lt;br /&gt;
Installation Complete!&lt;br /&gt;
&lt;br /&gt;
== The Mod ==&lt;br /&gt;
&lt;br /&gt;
With Eco and VS2022 are installed all of the tools needed to code, build, and run a mod are ready!&lt;br /&gt;
&lt;br /&gt;
=== Creating a New Project ===&lt;br /&gt;
&lt;br /&gt;
When VS2022 first opens it will show you a dashboard where you can quickly select what you want to do. On the left, are any recent projects opened. There won&#039;t be any if this is the first time installing it. &lt;br /&gt;
&lt;br /&gt;
On the right there will be a few options, from here select the &#039;&#039;Create a new project&#039;&#039; option.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 OpeningDashboard.png|alt=VS2022&#039;s launch dashboard showing recent projects on the left and quick action buttons on the right. Highlighted is a button titled &amp;quot;Create a new project&amp;quot;.|frameless|border|link=|location=center|upright=4]]&lt;br /&gt;
&lt;br /&gt;
Now, it&#039;s time to go through the new project wizard. First, the wizard asks what kind of project is being made. &lt;br /&gt;
&lt;br /&gt;
To mod Eco we need to make a &#039;&#039;&#039;C# Class Library&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
To find the template, search &amp;lt;code&amp;gt;C# library&amp;lt;/code&amp;gt; in the search bar. Select the C# option titled &#039;&#039;Class Library&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
It&#039;s important to &#039;&#039;&#039;pay attention to the icon and chips&#039;&#039;&#039; below the title and description. Make sure you &#039;&#039;&#039;select the &amp;lt;code&amp;gt;C#&amp;lt;/code&amp;gt; option&#039;&#039;&#039; as there are other options similarly named &#039;&#039;Class Library&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 NewProjectWizard Templates.png|frameless|border|location=center|upright=4|link=]]&lt;br /&gt;
&lt;br /&gt;
The next page will ask you what the Project Name should be. Type the name of the mod being created.&lt;br /&gt;
&lt;br /&gt;
The other options like the Location and the Solution Name do not need edited. &lt;br /&gt;
&lt;br /&gt;
Leave the box &#039;&#039;Place solution and project in the same directory&#039;&#039; unchecked.&lt;br /&gt;
&lt;br /&gt;
Click the Next button and continue along in the next section of this guide.&lt;br /&gt;
&lt;br /&gt;
=== .NET Version ===&lt;br /&gt;
&amp;lt;u&amp;gt;As of April of 2026&amp;lt;/u&amp;gt;, &#039;&#039;&#039;Eco targets .NET 10.0&#039;&#039;&#039; and the mod should too.&lt;br /&gt;
&lt;br /&gt;
It&#039;s suggested to confirm the version of .NET that Eco uses by looking at the .NET version the reference assemblies use.&lt;br /&gt;
&lt;br /&gt;
The reference assemblies can be found on the NuGet Gallery by searching for &amp;lt;code&amp;gt;Eco.ReferenceAssemblies&amp;lt;/code&amp;gt;. See: &amp;lt;code&amp;gt;www.nuget.org/packages?q=Eco.ReferenceAssemblies&amp;lt;/code&amp;gt;&amp;lt;!-- I&#039;m not directly linking to the package as there is no way to link to the latest version. So as a workaround I&#039;m using the search to point the reader to the latest version. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Find the package with the name &#039;&#039;Eco.ReferenceAssemblies&#039;&#039; made by &#039;&#039;StrangeLoopGames&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
There will be a chip underneath of it with the &#039;&#039;.NET&#039;&#039; version it targets. &amp;lt;u&amp;gt;At the time of writing,&amp;lt;/u&amp;gt; this is what that page looked like:&lt;br /&gt;
&lt;br /&gt;
[[File:NuGetGallery -- Eco.ReferenceAssemblies Search.png|alt=Shows the search result of Eco.ReferenceAssemblies. In a blue chip the text &amp;quot;.NET 8.0&amp;quot; can be seen.|frameless|upright=4|location=center|link=|border]]&lt;br /&gt;
&lt;br /&gt;
By clicking on that search result (shown above), a more detailed page opens is show. Again, there&#039;s chips showing what version of .NET to use:&lt;br /&gt;
&lt;br /&gt;
[[File:NuGetGallery--Eco.ReferenceAssemblies Details.png|alt=Show the package page for &amp;quot;Eco.ReferenceAssemblies&amp;quot; on NuGet Gallery. Circled in red are two chips with some version of the text &amp;quot;.NET 8.0&amp;quot; inside them.|frameless|link=|border|location=center|upright=3]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Back to VS2022&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
On the Additional Information page, there&#039;s the Framework drop-down. Select the same version of .NET Eco uses (as described above).&lt;br /&gt;
&lt;br /&gt;
Click the Create button to finish creating the mod!&lt;br /&gt;
&lt;br /&gt;
=== Linking to Eco Assemblies ===&lt;br /&gt;
Look for the Solution Explorer on the right-hand side of VS2022. It should look something like this:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note&#039;&#039;&#039;: If the solution explorer isn&#039;t there, open it from the top menu. Click the &#039;&#039;View&#039;&#039; button and select &#039;&#039;Solution Explorer&#039;&#039; from the menu.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Solution Explorer.png|alt=A picture of a basic layout in Visual Studio 2022 with the Solution Explorer open on the right-hand side. The solution explorer is circled in red.|frameless|link=|upright=4|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
From the Solution Explorer, find the &#039;&#039;References&#039;&#039; line and right-click on it. On that menu select &#039;&#039;Manage NuGet packages...&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 Solution Explorer -- Manage NuGet Packages.png|alt=Shows VS2022&#039;s Solution Explorer with project expanded. The References line is highlighted and a menu is open. On that menu the &amp;quot;Manage NuGet Packages&amp;quot; line is highlighted.|frameless|link=|upright=4|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
This will open a new tab. Above the search bar there&#039;s sub-tabs. &#039;&#039;&#039;Select the &#039;&#039;Browse&#039;&#039; sub-tab.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Type &amp;lt;code&amp;gt;Eco.ReferenceAssemblies&amp;lt;/code&amp;gt; into the search bar.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Check the &#039;&#039;Include prerelease&#039;&#039; check-box.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Find the option with the name &#039;&#039;Eco.ReferenceAssemblies&#039;&#039; made by &#039;&#039;StrangeLoopGames&#039;&#039;. Click on it.&lt;br /&gt;
&lt;br /&gt;
A details panel will show up to the right. It will show the version of the reference assemblies being targeted. By default it chooses the latest and can be left at it&#039;s default.&lt;br /&gt;
&lt;br /&gt;
Click the Install button.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- NuGet Install Eco.ReferenceAssemblies.png|alt=VS2022 is open to the NuGet tab and is searching with the text Eco.ReferenceAssemblies. The checkbox to the right of the search is checked -- include prerelease. The only search result is selected. There is yellow highlights over part of the photo.|frameless|link=|upright=4|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
Click the &#039;&#039;Apply&#039;&#039; button on the popup to finish adding the references.&lt;br /&gt;
&lt;br /&gt;
The reference assemblies have now been added! When coding VS2022 will provide IntelliSense popups. Try it out by going back to the &amp;lt;code&amp;gt;Class1.cs&amp;lt;/code&amp;gt; file and typing &amp;lt;code&amp;gt;Eco.&amp;lt;/code&amp;gt; and you will see suggestion pop up. It’s an essential tool for a lot of modders.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Intellisense.png|alt=Shows a text editor with a basic class file. Inside there&#039;s the text &amp;quot;Eco.&amp;quot; and a menu that show the suggested namespaces within.|frameless|link=|upright=4|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
=== Building The Dynamic Linked Library (DLL) ===&lt;br /&gt;
&lt;br /&gt;
==== Building for Development ====&lt;br /&gt;
To build the mod makes the &amp;lt;code&amp;gt;.dll&amp;lt;/code&amp;gt;that can be used to test with.&lt;br /&gt;
&lt;br /&gt;
To build, open the &#039;&#039;Build&#039;&#039; menu from the top of VS2022.&lt;br /&gt;
&lt;br /&gt;
Select &#039;&#039;Build Solution&#039;&#039;. This will produce non-optimized DLL used for testing and development.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Build Menu.png|alt=VS2022 top menu &amp;quot;Build&amp;quot; is open with &amp;quot;build solution&amp;quot; highlighted (ctrl + shift + b).|frameless|link=|upright=4|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
To find the file VS2022 just built, right click on the project in the Solution Explorer. &lt;br /&gt;
&lt;br /&gt;
Select &#039;&#039;Open Folder in File Explorer.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Project Menu.png|alt=VS2022&#039;s solution explorer is shown with the projects right-click menu open. Highlighted is &amp;quot;Open folder in File Explorer&amp;quot;|frameless|link=|upright=4|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
From here, the mod&#039;s DLL will be in the &amp;lt;code&amp;gt;bin/Debug/net8.0/&amp;lt;/code&amp;gt;folder. The file will be named with mod&#039;s name, like &amp;lt;code&amp;gt;TheMod.dll&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Copy the mod&#039;s DLL file.&lt;br /&gt;
&lt;br /&gt;
Paste it into the folder &amp;lt;code&amp;gt;Eco/Eco_Data/Server/Mods/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
To run a game with that mod &#039;&#039;&#039;create a local world&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
The mod should be running. Check the logs at &amp;lt;code&amp;gt;Eco/Eco_Data/Server/Logs/&amp;lt;/code&amp;gt; to verify. Open the &amp;lt;u&amp;gt;most recent&amp;lt;/u&amp;gt; log file here.&lt;br /&gt;
&lt;br /&gt;
If the mod was loaded it there will be a line mentioning the file-name of the DLL. If the DLL was named &amp;lt;code&amp;gt;TheMod.dll&amp;lt;/code&amp;gt; this is what to look for in the log file:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;[13:55:54.815] [4] [ Info] [Eco] Starting ModKitPlugin                             ...  &lt;br /&gt;
[13:56:27.399] [4] [ Info] [Eco] Starting ModKitPlugin                             ... Finished in 32.584 sec&lt;br /&gt;
 &lt;br /&gt;
[13:56:27.439] [4] [ Info] [Eco] Loading mods                                      ...  &lt;br /&gt;
[13:56:27.439] [9] [ Info] [Eco] Loading TheMod...&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Tip: Setup File Explorer to Sort By Date =====&lt;br /&gt;
It&#039;s suggested to setup the file view to &#039;&#039;Details&#039;&#039; in this folder because it will show the &#039;&#039;Date Modified&#039;&#039; for each file.&lt;br /&gt;
&lt;br /&gt;
[[File:File Explorer -- View Settings Menu.png|alt=Show Window&#039;s File Explorer&#039;s view setting menu with the &amp;quot;details&amp;quot; option highlighted.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
Additionally, clicking on the &#039;&#039;Date Modified&#039;&#039; header sorts all files. Sort it so the most recent is on top and every time the server starts the log file is easily found -- it&#039;s the one on top!&lt;br /&gt;
&lt;br /&gt;
[[File:File Explorer -- Details Example.png|alt=Show&#039;s window&#039;s File Explorer with the date modified header highlighted.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
==== Building for Release ====&lt;br /&gt;
To build for release, click on the mod&#039;s project in the Solution Explorer to highlight it.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Solution Explorer Project Highlight.png|alt=Shows VS2022&#039;s solution explorer with the project highlighted.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
Then, open the &#039;&#039;Build&#039;&#039; menu from the top of VS2022 and select &#039;&#039;Publish Selection&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Set the target &#039;&#039;as Folder&#039;&#039;. Click the &#039;&#039;Next&#039;&#039; button.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Publish Wizard.png|alt=VS2022&#039;s publish wizard showing the target selection screen. The Folder option is highlighted.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
Leave the folder location as default. Click the &#039;&#039;Finish&#039;&#039; button.&lt;br /&gt;
&lt;br /&gt;
Click the &#039;&#039;Close&#039;&#039; button.&lt;br /&gt;
&lt;br /&gt;
Finally, click the &#039;&#039;Publish&#039;&#039; button to start the build.&lt;br /&gt;
&lt;br /&gt;
A green alert will pop up when the build is completed:&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Publish Screen.png|alt=Show&#039;s VS2022 publish screen. There&#039;s publish button at the top of this screen.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Either use the blue links on this page to find the file or browse the project&#039;s files as shown in &amp;quot;Building for Development&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Inside the project, the file will be in &amp;lt;code&amp;gt;bin/Release/net8.0/publish&amp;lt;/code&amp;gt;. The file will be named with the mod project&#039;s name. For example, &amp;lt;code&amp;gt;TheMod.dll&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Since the reference assemblies are already included in the game, do not worry about the other files here.  &lt;br /&gt;
&lt;br /&gt;
To share this mod, the only file needed is the mod&#039;s dll -- &amp;lt;code&amp;gt;TheMod.dll&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Post Build Scripts: Automatic Copy ===&lt;br /&gt;
With a post build script VS2022 will automatically copy the files each build. It&#039;s a very nice feature to have when developing and rebuilding every 5 minutes to test something new.&lt;br /&gt;
&lt;br /&gt;
First, add the variables about where &amp;lt;code&amp;gt;EcoServer.exe&amp;lt;/code&amp;gt; is located to the project file.&lt;br /&gt;
&lt;br /&gt;
Right-click on the project in the Solution Explorer and select the &#039;&#039;Edit Project File&#039;&#039; option.&lt;br /&gt;
&lt;br /&gt;
Add the properties &amp;lt;code&amp;gt;EcoServerExe&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;EcoServerDir&amp;lt;/code&amp;gt; &amp;lt;u&amp;gt;inside of the &amp;lt;code&amp;gt;PropertyGroup&amp;lt;/code&amp;gt; tag.&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; Tip: By holding shift and right-clicking on a file in the file explorer a old-school menu pops up. Midway down this menu is an option to &#039;&#039;Copy As Path&#039;&#039;. Neat!&lt;br /&gt;
&lt;br /&gt;
The project file should look something like this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;Project Sdk=&amp;quot;Microsoft.NET.Sdk&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;PropertyGroup&amp;gt;&lt;br /&gt;
    &amp;lt;TargetFramework&amp;gt;net8.0&amp;lt;/TargetFramework&amp;gt;&lt;br /&gt;
    &amp;lt;ImplicitUsings&amp;gt;enable&amp;lt;/ImplicitUsings&amp;gt;&lt;br /&gt;
    &amp;lt;Nullable&amp;gt;enable&amp;lt;/Nullable&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;EcoServerExe&amp;gt;$(EcoServerDir)\EcoServer.exe&amp;lt;/EcoServerExe&amp;gt;&lt;br /&gt;
    &amp;lt;EcoServerDir&amp;gt;C:\Program Files (x86)\Steam\steamapps\common\Eco\Eco_Data\Server&amp;lt;/EcoServerDir&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
  &amp;lt;/PropertyGroup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;ItemGroup&amp;gt;&lt;br /&gt;
    &amp;lt;PackageReference Include=&amp;quot;Eco.ReferenceAssemblies&amp;quot; Version=&amp;quot;0.11.1.13-beta-release-887&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/ItemGroup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/Project&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Next, add the &amp;lt;code&amp;gt;PostBuild&amp;lt;/code&amp;gt; property inside the &amp;lt;code&amp;gt;Project&amp;lt;/code&amp;gt; tag.&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Project Sdk=&amp;quot;Microsoft.NET.Sdk&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;PropertyGroup&amp;gt;&lt;br /&gt;
    ... SNIP ...&lt;br /&gt;
  &amp;lt;/PropertyGroup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;ItemGroup&amp;gt;&lt;br /&gt;
    ... SNIP ...&lt;br /&gt;
  &amp;lt;/ItemGroup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;Target Name=&amp;quot;PostBuild&amp;quot; AfterTargets=&amp;quot;PostBuildEvent&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;Exec Command=&#039;call PostBuild.bat &amp;quot;$(EcoServerDir)&amp;quot; &amp;quot;$(OutDir)&amp;quot; &amp;quot;$(MSBuildProjectName)&amp;quot;&#039;/&amp;gt;&lt;br /&gt;
  &amp;lt;/Target&amp;gt;&lt;br /&gt;
&amp;lt;/Project&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Finally create a new file directly inside the project by right-clicking on the project in the Solution Explorer. Select the &#039;&#039;Add&#039;&#039; and click on &#039;&#039;New Item...&#039;&#039; from the sub-menu.&lt;br /&gt;
&lt;br /&gt;
Use the name &amp;lt;code&amp;gt;PostBuild.bat&amp;lt;/code&amp;gt; for this new file.&lt;br /&gt;
&lt;br /&gt;
Open it and put the following in the PostBuild file:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;batch&amp;quot;&amp;gt;REM reading in arguements to sensible variables&lt;br /&gt;
set serverDir=%1&lt;br /&gt;
set outDir=%2&lt;br /&gt;
set projName=%3&lt;br /&gt;
&lt;br /&gt;
REM removing double-quotes added to variables for concatenation&lt;br /&gt;
set serverDir=%serverDir:&amp;quot;=%&lt;br /&gt;
set outDir=%outDir:&amp;quot;=%&lt;br /&gt;
set projName=%projName:&amp;quot;=%&lt;br /&gt;
&lt;br /&gt;
REM Copy mod dll to Mods dir&lt;br /&gt;
set dllFile=%outDir%%projName%.dll&lt;br /&gt;
echo Copying mod dll file: %dllFile%&lt;br /&gt;
copy &amp;quot;%dllFile%&amp;quot; &amp;quot;%serverDir%\Mods&amp;quot;&lt;br /&gt;
&lt;br /&gt;
REM Copy mod pdb to directory where EcoServer.exe is&lt;br /&gt;
set pdbFile=%outDir%%projName%.pdb&lt;br /&gt;
echo Copying mod pdb file: %pdbFile%&lt;br /&gt;
copy &amp;quot;%pdbFile%&amp;quot; &amp;quot;%serverDir%&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;Now try running a rebuild of the project. The output should report copying files and inside the &amp;lt;code&amp;gt;Eco/Eco_Data/Server/Mods&amp;lt;/code&amp;gt; folder should be &amp;lt;code&amp;gt;TheMod.dll&amp;lt;/code&amp;gt; file&lt;br /&gt;
&lt;br /&gt;
=== Setting up Debugging ===&lt;br /&gt;
&#039;&#039;&#039;Special thanks to Monzun#0606 on Eco&#039;s Discord for helping developing research the following information.&#039;&#039;&#039;&lt;br /&gt;
To setup debugging, &amp;lt;u&amp;gt;make sure that the project is setup with the post build script described above&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Debugging is a &amp;lt;u&amp;gt;powerful&amp;lt;/u&amp;gt; tool to a developer and allows the developer to set breakpoints anywhere in the code to stop execution. When execution is stopped the developer can review every variable&#039;s value and incrementally continue the code. This is invaluable when tracking down bugs or trying to understand a complex piece of code.&lt;br /&gt;
&lt;br /&gt;
From the top menu, select &#039;&#039;Debug&#039;&#039; and click on the option &#039;&#039;TheMod Debug Properties&#039;&#039; at the bottom of the menu.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Debug Menu.png|alt=VS2022&#039;s debug menu is open from the top of the application. Highlighted is the last option &amp;quot;Debug Properties&amp;quot;.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
Find the &#039;&#039;Create a new profile&#039;&#039; button &#039;&#039;&#039;in the top-left&#039;&#039;&#039; of this new window. Select &#039;&#039;Executable&#039;&#039; from the drop-down menu.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Debugger Launch Profiles.png|alt=VS2022&#039;s launch profile window is open. Underlined and pointed to by a red mark is the &amp;quot;Create a new profile&amp;quot; button, located in the top-left of the window. Highlighted from the menu under it is the option reading &amp;quot;Executable&amp;quot;.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
Set the &#039;&#039;Executable&#039;&#039; field to the full path to the &amp;lt;code&amp;gt;EcoServer.exe&amp;lt;/code&amp;gt; file. For example, &amp;lt;code&amp;gt;C:\Program Files (x86)\Steam\steamapps\common\Eco\Eco_Data\Server&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;\EcoServer.exe&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Set the &#039;&#039;Working Directory&#039;&#039; field to the full path to the folder containing the &amp;lt;code&amp;gt;EcoServer.exe&amp;lt;/code&amp;gt; file. For example, &amp;lt;code&amp;gt;C:\Program Files (x86)\Steam\steamapps\common\Eco\Eco_Data\Server&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Eco Debugging Profile.png|alt=A fully configured profile ready to debug Eco on VS2022&#039;s launch profile page.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
To use this newly configured profile, switch to it by clicking the small arrow to the right of the play icon (see image).  Select the newly created profile -- &#039;&#039;Profile 1&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Debugger Profile Selection.png|alt=VS2022&#039;s debugger profile selection menu is open with the newly created &amp;quot;Profile 1&amp;quot; highlighted.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
To see how breakpoints work, put the following in &amp;lt;code&amp;gt;Class1.cs&amp;lt;/code&amp;gt; file:&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot;&amp;gt;&lt;br /&gt;
using Eco.Core.Plugins.Interfaces;&lt;br /&gt;
using Eco.Core.Utils;&lt;br /&gt;
using Eco.ModKit;&lt;br /&gt;
&lt;br /&gt;
namespace Test&lt;br /&gt;
{&lt;br /&gt;
    public class Class1 : IModKitPlugin, IInitializablePlugin&lt;br /&gt;
    {&lt;br /&gt;
        public string GetCategory() =&amp;gt; &amp;quot;Tutorial&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        public string GetStatus() =&amp;gt; this._status;&lt;br /&gt;
        string _status = string.Empty;&lt;br /&gt;
&lt;br /&gt;
        public void Initialize(TimedTask timer)&lt;br /&gt;
        {&lt;br /&gt;
            this._status = &amp;quot;Ok&amp;quot;;&lt;br /&gt;
            bool yes = true;&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;This code creates a basic plugin, called &amp;lt;code&amp;gt;Class1&amp;lt;/code&amp;gt;, that Eco will load and initialize on startup. Eco knows to do this because this class inherits the &amp;lt;code&amp;gt;IModKitPlugin&amp;lt;/code&amp;gt; interface (causes it to be loaded) and the &amp;lt;code&amp;gt;IInitializablePlugin&amp;lt;/code&amp;gt; interface (causes it to be initialized).&lt;br /&gt;
&lt;br /&gt;
Add a breakpoint to the code by right-clicking on the line &amp;lt;code&amp;gt;bool yes = true;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Adding a breakpoint.png|alt=A boilerplate example of a mod is shown in the VS2022 text editor. A line has a menu open above it with the option &amp;quot;Breakpoint&amp;quot; expanded and the option &amp;quot;Insert Breakpoint&amp;quot; highlighted on the sub-menu.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
Now hit the play button. The server will start and VS2022 will flash back on screen once Eco tries to initialize the mod&#039;s plugin.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Launch Debugger.png|alt=Highlighted is the play button for VS2022&#039;s debugger. The &amp;quot;Profile 1&amp;quot; is still selected from before.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After a little bit the server will start-up and hit the breakpoint set. When it does VS2022 will keep startup from continuing and allow detailed inspection to happen.&lt;br /&gt;
&lt;br /&gt;
In the bottom left (circled in red) is a table of all of the variables within scope. Use this to see what is happening (especially useful in loops!).&lt;br /&gt;
&lt;br /&gt;
At the middle-top (circled in red) are some of the debugger controls. Clicking the highlighted &#039;&#039;Continue&#039;&#039; button resumes normal operation. Using the buttons to the right that are highlighted will allow the developer to step through the codes execution to see exactly how each line is performing. Debugging is a deep and rich topic that this guide will not explain further, but there&#039;s a great video by Microsoft Visual Studio on YouTube called Basics of Debugging. In that 45 minute video (don&#039;t worry there&#039;s annotations to jump to just what is interesting) a whole gamut of information about how to use debugging is covered.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2022 -- Debugger LIve.png|alt=Shows a simple plugin&#039;s code in the editor of VS2022. In the bottom-left is a table of all variables used in the function. It is circled in red. On the top of the image also circled in red is the debugger controls. Highlighted within is the continue button and the &amp;quot;step over&amp;quot; button.|frameless|link=|upright=2|location=center|border]]&lt;br /&gt;
&lt;br /&gt;
== Releasing a Mod ==&lt;br /&gt;
&lt;br /&gt;
=== Mod.io ===&lt;br /&gt;
&amp;lt;u&amp;gt;At the time of writing&amp;lt;/u&amp;gt;, mod.io is where creators share their mods with players and others.&lt;br /&gt;
&lt;br /&gt;
To share a new mod here all that is necessary is an account.&lt;br /&gt;
&lt;br /&gt;
Head over to &amp;lt;code&amp;gt;mod.io/g/eco&amp;lt;/code&amp;gt; and click &#039;&#039;Login&#039;&#039; in the top-right corner. &lt;br /&gt;
&lt;br /&gt;
Finish signing-up with whatever account type you prefer.&lt;br /&gt;
&lt;br /&gt;
Click the &#039;&#039;Add Mod&#039;&#039; button in the top-right.&lt;br /&gt;
&lt;br /&gt;
Follow the upload wizard as directed.&lt;br /&gt;
&lt;br /&gt;
Once on the &#039;&#039;File Manager&#039;&#039; section, a zip file is needed.&lt;br /&gt;
&lt;br /&gt;
Zip the mod&#039;s &amp;lt;u&amp;gt;release&amp;lt;/u&amp;gt; dll and any other assets necessary (e.g. Unity bundles) by putting all the files into a folder. Then right-click on that folder and select &#039;&#039;Compress To...&#039;&#039; and from the sub-menu select &#039;&#039;ZIP file&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Upload that zip file. Considering naming it with a version number to help stay organized (e.g. &#039;&#039;v1&#039;&#039;). Next release, increase that number by 1 (e.g. &#039;&#039;v2&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Congratulations on releasing the mod!&lt;br /&gt;
&lt;br /&gt;
=== Discord Ads ===&lt;br /&gt;
Consider posting a entry on the official {{EcoDiscord}}. There&#039;s a channel for mods called &#039;&#039;mod-ads&#039;&#039;. &lt;br /&gt;
Please read the rules before posting.&lt;br /&gt;
&lt;br /&gt;
== Where to Next? ==&lt;br /&gt;
&lt;br /&gt;
* Where to learn modding logic (Eco Modding Wiki, Discord, sample mods)&lt;br /&gt;
**[[Helpful Examples for Modding]]&lt;br /&gt;
* Consider learning source control (Git). Completely optional, but can help you keep things organized as development continues.&lt;br /&gt;
* Explore Eco’s open-source mod projects for ideas (search on GitHub &amp;quot;Eco Mods&amp;quot; to find some real-life examples)&lt;/div&gt;</summary>
		<author><name>WugWugg</name></author>
	</entry>
	<entry>
		<id>https://wiki.play.eco/en/index.php?title=Module:IconUtils&amp;diff=16419</id>
		<title>Module:IconUtils</title>
		<link rel="alternate" type="text/html" href="https://wiki.play.eco/en/index.php?title=Module:IconUtils&amp;diff=16419"/>
		<updated>2026-02-24T14:52:45Z</updated>

		<summary type="html">&lt;p&gt;WugWugg: Despite the last commit working on Template:Icon page it does not work for item pages. Full revert to stable.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.main(param)&lt;br /&gt;
    local Utils = require(&#039;Module:Utils&#039;)&lt;br /&gt;
&lt;br /&gt;
    local Icon = &#039;&#039;&lt;br /&gt;
    local IconStyle = &#039;&#039;&lt;br /&gt;
    local IconSize = &#039;&#039;&lt;br /&gt;
    local IconLink = &#039;&#039;&lt;br /&gt;
    local IconBorder = &#039;&#039;&lt;br /&gt;
    local IconCount = &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
    local args = Utils.normalise(param)&lt;br /&gt;
&lt;br /&gt;
    if args.id == nil or args.name == &#039;&#039; then return &#039;Module:IconUtils \&#039;id\&#039; must be specified.&#039; end&lt;br /&gt;
&lt;br /&gt;
    local Icon = args.id .. &#039;_Icon.png&#039;&lt;br /&gt;
&lt;br /&gt;
    if args.size == nil or args.size == &#039;&#039; then IconSize = 28 else IconSize = args.size end&lt;br /&gt;
    if args.style == nil or args.style == &#039;&#039; then IconStyle = &#039;1&#039; else IconStyle = args.style end&lt;br /&gt;
    if args.link == nil or args.link == &#039;&#039; then IconLink = &#039;&#039; else IconLink = &#039;[[&#039; .. args.link .. &#039;]]&#039; end   &lt;br /&gt;
    if args.link == &#039;1&#039; then IconLink = &#039;[[&#039; .. args.name .. &#039;]]&#039; end&lt;br /&gt;
    if IconLink == &#039;&#039; then IconTextLine = &#039;  &#039; .. args.name IconTextBr = &#039;&amp;lt;br&amp;gt;&#039; .. args.name else IconTextLine = &#039;  &#039; .. IconLink IconTextBr = &#039;&amp;lt;br&amp;gt;&#039; .. IconLink end&lt;br /&gt;
    if args.count == nil or args.count == &#039;&#039; then IconCount = &#039;1&#039; else IconCount = args.count end&lt;br /&gt;
    if args.border == nil or args.border == &#039;&#039; then IconBorder = &#039; borderwhite&#039; else IconBorder = &#039; border&#039; .. args.border end&lt;br /&gt;
&lt;br /&gt;
    if IconStyle == &#039;1&#039; then return &#039;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=&#039;.. IconLink ..&#039;]]&#039; end&lt;br /&gt;
    if IconStyle == &#039;2&#039; then return &#039;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=&#039;.. IconLink ..&#039;]]&#039; .. IconTextLine end&lt;br /&gt;
    if IconStyle == &#039;3&#039; then return &#039;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=&#039;.. IconLink ..&#039;]]&#039; .. IconTextBr end&lt;br /&gt;
    if IconStyle == &#039;4&#039; then return &#039;&amp;lt;div class=&amp;quot;IconFrame&amp;quot;&amp;gt;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=&#039;.. IconLink ..&#039;]]&#039; .. IconTextBr .. &#039;&amp;lt;/div&amp;gt;&#039; end&lt;br /&gt;
    if IconStyle == &#039;5&#039; then return &#039;&amp;lt;div class=&amp;quot;recipeitem withcount&#039; .. IconBorder .. &#039;&amp;quot; style=&amp;quot;font-size:&#039; .. IconSize .. &#039;px&amp;quot;&amp;gt;&#039; .. &#039;&amp;lt;div class=&amp;quot;recipeitemicon&amp;quot;&amp;gt;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=]]&amp;lt;/div&amp;gt;&amp;lt;span class=&amp;quot;recipeitemcount&amp;quot;&amp;gt;&#039; .. IconCount .. &#039;&amp;lt;/span&amp;gt;&#039; .. &#039;[[&#039; .. args.link .. &#039;|&amp;lt;div class=&amp;quot;recipeitemlink&amp;quot; title=&amp;quot;&#039; .. args.link .. &#039;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;]]&amp;lt;/div&amp;gt;&#039; end&lt;br /&gt;
    if IconStyle == &#039;6&#039; then return &#039;&amp;lt;div class=&amp;quot;recipeitem&#039; .. IconBorder .. &#039;&amp;quot; style=&amp;quot;font-size:&#039; .. IconSize .. &#039;px&amp;quot;&amp;gt;&#039; .. &#039;&amp;lt;div class=&amp;quot;recipeitemicon&amp;quot;&amp;gt;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=]]&amp;lt;/div&amp;gt;[[&#039; .. args.link .. &#039;|&amp;lt;div class=&amp;quot;recipeitemlink&amp;quot; title=&amp;quot;&#039; .. args.link .. &#039;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;]]&amp;lt;/div&amp;gt;&#039; end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>WugWugg</name></author>
	</entry>
	<entry>
		<id>https://wiki.play.eco/en/index.php?title=Module:IconUtils&amp;diff=16417</id>
		<title>Module:IconUtils</title>
		<link rel="alternate" type="text/html" href="https://wiki.play.eco/en/index.php?title=Module:IconUtils&amp;diff=16417"/>
		<updated>2026-02-24T14:35:05Z</updated>

		<summary type="html">&lt;p&gt;WugWugg: Adding comment to note weird behavior&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.main(param)&lt;br /&gt;
    local Utils = require(&#039;Module:Utils&#039;)&lt;br /&gt;
&lt;br /&gt;
    local Icon = &#039;&#039;&lt;br /&gt;
    local IconStyle = &#039;&#039;&lt;br /&gt;
    local IconSize = &#039;&#039;&lt;br /&gt;
    local IconLink = &#039;&#039;&lt;br /&gt;
    local IconBorder = &#039;&#039;&lt;br /&gt;
    local IconCount = &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
    local args = Utils.normalise(param)&lt;br /&gt;
&lt;br /&gt;
    if args.id == nil or args.name == &#039;&#039; then return &#039;Module:IconUtils \&#039;id\&#039; must be specified.&#039; end&lt;br /&gt;
&lt;br /&gt;
    local Icon = args.id .. &#039;_Icon.png&#039;&lt;br /&gt;
&lt;br /&gt;
    if args.size == nil or args.size == &#039;&#039; then IconSize = 28 else IconSize = args.size end&lt;br /&gt;
    if args.style == nil or args.style == &#039;&#039; then IconStyle = &#039;1&#039; else IconStyle = args.style end&lt;br /&gt;
    if args.link == nil or args.link == &#039;&#039; then IconLink = &#039;&#039; else IconLink = &#039;[[&#039; .. args.link .. &#039;]]&#039; end   &lt;br /&gt;
    if args.link == &#039;1&#039; then &lt;br /&gt;
    	-- It is important to use &amp;lt;span&amp;gt; here instead of &amp;lt;div&amp;gt;. This ensures the Wiki doesn&#039;t strip it because it&#039;s an empty tag.&lt;br /&gt;
        if args.style == &#039;5&#039; then IconLink = &#039;[[&#039; .. args.name ..&#039;|&amp;lt;span class=&amp;quot;recipeitemlink&amp;quot; title=&amp;quot;&#039; .. args.name .. &#039;&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;]]&#039;&lt;br /&gt;
        else IconLink = &#039;[[&#039; .. args.name .. &#039;]]&#039; end&lt;br /&gt;
    end&lt;br /&gt;
    if IconLink == &#039;&#039; then IconTextLine = &#039;  &#039; .. args.name IconTextBr = &#039;&amp;lt;br&amp;gt;&#039; .. args.name else IconTextLine = &#039;  &#039; .. IconLink IconTextBr = &#039;&amp;lt;br&amp;gt;&#039; .. IconLink end&lt;br /&gt;
    if args.count == nil or args.count == &#039;&#039; then IconCount = &#039;1&#039; else IconCount = args.count end&lt;br /&gt;
    if args.border == nil or args.border == &#039;&#039; then IconBorder = &#039; borderwhite&#039; else IconBorder = &#039; border&#039; .. args.border end&lt;br /&gt;
&lt;br /&gt;
    if IconStyle == &#039;1&#039; then return &#039;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=&#039;.. IconLink ..&#039;]]&#039; end&lt;br /&gt;
    if IconStyle == &#039;2&#039; then return &#039;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=&#039;.. IconLink ..&#039;]]&#039; .. IconTextLine end&lt;br /&gt;
    if IconStyle == &#039;3&#039; then return &#039;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=&#039;.. IconLink ..&#039;]]&#039; .. IconTextBr end&lt;br /&gt;
    if IconStyle == &#039;4&#039; then return &#039;&amp;lt;div class=&amp;quot;IconFrame&amp;quot;&amp;gt;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=&#039;.. IconLink ..&#039;]]&#039; .. IconTextBr .. &#039;&amp;lt;/div&amp;gt;&#039; end&lt;br /&gt;
    if IconStyle == &#039;5&#039; then return &#039;&amp;lt;div class=&amp;quot;recipeitem withcount&#039; .. IconBorder .. &#039;&amp;quot; style=&amp;quot;font-size:&#039; .. IconSize .. &#039;px&amp;quot;&amp;gt;&#039; .. &#039;&amp;lt;div class=&amp;quot;recipeitemicon&amp;quot;&amp;gt;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=]]&amp;lt;/div&amp;gt;&amp;lt;span class=&amp;quot;recipeitemcount&amp;quot;&amp;gt;&#039; .. IconCount .. &#039;&amp;lt;/span&amp;gt; &#039; .. IconLink ..&#039;&amp;lt;/div&amp;gt;&#039; end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>WugWugg</name></author>
	</entry>
	<entry>
		<id>https://wiki.play.eco/en/index.php?title=Module:IconUtils&amp;diff=16415</id>
		<title>Module:IconUtils</title>
		<link rel="alternate" type="text/html" href="https://wiki.play.eco/en/index.php?title=Module:IconUtils&amp;diff=16415"/>
		<updated>2026-02-24T14:26:27Z</updated>

		<summary type="html">&lt;p&gt;WugWugg: Minor Nit: Swapping to using span here for inline display type.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.main(param)&lt;br /&gt;
    local Utils = require(&#039;Module:Utils&#039;)&lt;br /&gt;
&lt;br /&gt;
    local Icon = &#039;&#039;&lt;br /&gt;
    local IconStyle = &#039;&#039;&lt;br /&gt;
    local IconSize = &#039;&#039;&lt;br /&gt;
    local IconLink = &#039;&#039;&lt;br /&gt;
    local IconBorder = &#039;&#039;&lt;br /&gt;
    local IconCount = &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
    local args = Utils.normalise(param)&lt;br /&gt;
&lt;br /&gt;
    if args.id == nil or args.name == &#039;&#039; then return &#039;Module:IconUtils \&#039;id\&#039; must be specified.&#039; end&lt;br /&gt;
&lt;br /&gt;
    local Icon = args.id .. &#039;_Icon.png&#039;&lt;br /&gt;
&lt;br /&gt;
    if args.size == nil or args.size == &#039;&#039; then IconSize = 28 else IconSize = args.size end&lt;br /&gt;
    if args.style == nil or args.style == &#039;&#039; then IconStyle = &#039;1&#039; else IconStyle = args.style end&lt;br /&gt;
    if args.link == nil or args.link == &#039;&#039; then IconLink = &#039;&#039; else IconLink = &#039;[[&#039; .. args.link .. &#039;]]&#039; end   &lt;br /&gt;
    if args.link == &#039;1&#039; then &lt;br /&gt;
        if args.style == &#039;5&#039; then IconLink = &#039;[[&#039; .. args.name ..&#039;|&amp;lt;span class=&amp;quot;recipeitemlink&amp;quot; title=&amp;quot;&#039; .. args.name .. &#039;&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;]]&#039;&lt;br /&gt;
        else IconLink = &#039;[[&#039; .. args.name .. &#039;]]&#039; end&lt;br /&gt;
    end&lt;br /&gt;
    if IconLink == &#039;&#039; then IconTextLine = &#039;  &#039; .. args.name IconTextBr = &#039;&amp;lt;br&amp;gt;&#039; .. args.name else IconTextLine = &#039;  &#039; .. IconLink IconTextBr = &#039;&amp;lt;br&amp;gt;&#039; .. IconLink end&lt;br /&gt;
    if args.count == nil or args.count == &#039;&#039; then IconCount = &#039;1&#039; else IconCount = args.count end&lt;br /&gt;
    if args.border == nil or args.border == &#039;&#039; then IconBorder = &#039; borderwhite&#039; else IconBorder = &#039; border&#039; .. args.border end&lt;br /&gt;
&lt;br /&gt;
    if IconStyle == &#039;1&#039; then return &#039;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=&#039;.. IconLink ..&#039;]]&#039; end&lt;br /&gt;
    if IconStyle == &#039;2&#039; then return &#039;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=&#039;.. IconLink ..&#039;]]&#039; .. IconTextLine end&lt;br /&gt;
    if IconStyle == &#039;3&#039; then return &#039;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=&#039;.. IconLink ..&#039;]]&#039; .. IconTextBr end&lt;br /&gt;
    if IconStyle == &#039;4&#039; then return &#039;&amp;lt;div class=&amp;quot;IconFrame&amp;quot;&amp;gt;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=&#039;.. IconLink ..&#039;]]&#039; .. IconTextBr .. &#039;&amp;lt;/div&amp;gt;&#039; end&lt;br /&gt;
    if IconStyle == &#039;5&#039; then return &#039;&amp;lt;div class=&amp;quot;recipeitem withcount&#039; .. IconBorder .. &#039;&amp;quot; style=&amp;quot;font-size:&#039; .. IconSize .. &#039;px&amp;quot;&amp;gt;&#039; .. &#039;&amp;lt;div class=&amp;quot;recipeitemicon&amp;quot;&amp;gt;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=]]&amp;lt;/div&amp;gt;&amp;lt;span class=&amp;quot;recipeitemcount&amp;quot;&amp;gt;&#039; .. IconCount .. &#039;&amp;lt;/span&amp;gt; &#039; .. IconLink ..&#039;&amp;lt;/div&amp;gt;&#039; end&lt;br /&gt;
    if IconStyle == &#039;6&#039; then return &#039;&amp;lt;div class=&amp;quot;recipeitem&#039; .. IconBorder .. &#039;&amp;quot; style=&amp;quot;font-size:&#039; .. IconSize .. &#039;px&amp;quot;&amp;gt;&#039; .. &#039;&amp;lt;div class=&amp;quot;recipeitemicon&amp;quot;&amp;gt;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=]]&amp;lt;/div&amp;gt;[[&#039; .. args.link .. &#039;|&amp;lt;div class=&amp;quot;recipeitemlink&amp;quot; title=&amp;quot;&#039; .. args.link .. &#039;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;]]&amp;lt;/div&amp;gt;&#039; end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>WugWugg</name></author>
	</entry>
	<entry>
		<id>https://wiki.play.eco/en/index.php?title=Module:IconUtils&amp;diff=16414</id>
		<title>Module:IconUtils</title>
		<link rel="alternate" type="text/html" href="https://wiki.play.eco/en/index.php?title=Module:IconUtils&amp;diff=16414"/>
		<updated>2026-02-24T14:16:58Z</updated>

		<summary type="html">&lt;p&gt;WugWugg: Bug Fix: Link not working? Removing unnecessary spaces&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.main(param)&lt;br /&gt;
    local Utils = require(&#039;Module:Utils&#039;)&lt;br /&gt;
&lt;br /&gt;
    local Icon = &#039;&#039;&lt;br /&gt;
    local IconStyle = &#039;&#039;&lt;br /&gt;
    local IconSize = &#039;&#039;&lt;br /&gt;
    local IconLink = &#039;&#039;&lt;br /&gt;
    local IconBorder = &#039;&#039;&lt;br /&gt;
    local IconCount = &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
    local args = Utils.normalise(param)&lt;br /&gt;
&lt;br /&gt;
    if args.id == nil or args.name == &#039;&#039; then return &#039;Module:IconUtils \&#039;id\&#039; must be specified.&#039; end&lt;br /&gt;
&lt;br /&gt;
    local Icon = args.id .. &#039;_Icon.png&#039;&lt;br /&gt;
&lt;br /&gt;
    if args.size == nil or args.size == &#039;&#039; then IconSize = 28 else IconSize = args.size end&lt;br /&gt;
    if args.style == nil or args.style == &#039;&#039; then IconStyle = &#039;1&#039; else IconStyle = args.style end&lt;br /&gt;
    if args.link == nil or args.link == &#039;&#039; then IconLink = &#039;&#039; else IconLink = &#039;[[&#039; .. args.link .. &#039;]]&#039; end   &lt;br /&gt;
    if args.link == &#039;1&#039; then &lt;br /&gt;
        if args.style == &#039;5&#039; then IconLink = &#039;[[&#039; .. args.name ..&#039;|&amp;lt;div class=&amp;quot;recipeitemlink&amp;quot; title=&amp;quot;&#039; .. args.name .. &#039;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;]]&#039;&lt;br /&gt;
        else IconLink = &#039;[[&#039; .. args.name .. &#039;]]&#039; end&lt;br /&gt;
    end&lt;br /&gt;
    if IconLink == &#039;&#039; then IconTextLine = &#039;  &#039; .. args.name IconTextBr = &#039;&amp;lt;br&amp;gt;&#039; .. args.name else IconTextLine = &#039;  &#039; .. IconLink IconTextBr = &#039;&amp;lt;br&amp;gt;&#039; .. IconLink end&lt;br /&gt;
    if args.count == nil or args.count == &#039;&#039; then IconCount = &#039;1&#039; else IconCount = args.count end&lt;br /&gt;
    if args.border == nil or args.border == &#039;&#039; then IconBorder = &#039; borderwhite&#039; else IconBorder = &#039; border&#039; .. args.border end&lt;br /&gt;
&lt;br /&gt;
    if IconStyle == &#039;1&#039; then return &#039;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=&#039;.. IconLink ..&#039;]]&#039; end&lt;br /&gt;
    if IconStyle == &#039;2&#039; then return &#039;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=&#039;.. IconLink ..&#039;]]&#039; .. IconTextLine end&lt;br /&gt;
    if IconStyle == &#039;3&#039; then return &#039;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=&#039;.. IconLink ..&#039;]]&#039; .. IconTextBr end&lt;br /&gt;
    if IconStyle == &#039;4&#039; then return &#039;&amp;lt;div class=&amp;quot;IconFrame&amp;quot;&amp;gt;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=&#039;.. IconLink ..&#039;]]&#039; .. IconTextBr .. &#039;&amp;lt;/div&amp;gt;&#039; end&lt;br /&gt;
    if IconStyle == &#039;5&#039; then return &#039;&amp;lt;div class=&amp;quot;recipeitem withcount&#039; .. IconBorder .. &#039;&amp;quot; style=&amp;quot;font-size:&#039; .. IconSize .. &#039;px&amp;quot;&amp;gt;&#039; .. &#039;&amp;lt;div class=&amp;quot;recipeitemicon&amp;quot;&amp;gt;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=]]&amp;lt;/div&amp;gt;&amp;lt;span class=&amp;quot;recipeitemcount&amp;quot;&amp;gt;&#039; .. IconCount .. &#039;&amp;lt;/span&amp;gt; &#039; .. IconLink ..&#039;&amp;lt;/div&amp;gt;&#039; end&lt;br /&gt;
    if IconStyle == &#039;6&#039; then return &#039;&amp;lt;div class=&amp;quot;recipeitem&#039; .. IconBorder .. &#039;&amp;quot; style=&amp;quot;font-size:&#039; .. IconSize .. &#039;px&amp;quot;&amp;gt;&#039; .. &#039;&amp;lt;div class=&amp;quot;recipeitemicon&amp;quot;&amp;gt;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=]]&amp;lt;/div&amp;gt;[[&#039; .. args.link .. &#039;|&amp;lt;div class=&amp;quot;recipeitemlink&amp;quot; title=&amp;quot;&#039; .. args.link .. &#039;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;]]&amp;lt;/div&amp;gt;&#039; end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>WugWugg</name></author>
	</entry>
	<entry>
		<id>https://wiki.play.eco/en/index.php?title=Module:IconUtils&amp;diff=16413</id>
		<title>Module:IconUtils</title>
		<link rel="alternate" type="text/html" href="https://wiki.play.eco/en/index.php?title=Module:IconUtils&amp;diff=16413"/>
		<updated>2026-02-24T14:14:58Z</updated>

		<summary type="html">&lt;p&gt;WugWugg: Bug Fix: Adding back the link (accidentally removed during the confusion)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.main(param)&lt;br /&gt;
    local Utils = require(&#039;Module:Utils&#039;)&lt;br /&gt;
&lt;br /&gt;
    local Icon = &#039;&#039;&lt;br /&gt;
    local IconStyle = &#039;&#039;&lt;br /&gt;
    local IconSize = &#039;&#039;&lt;br /&gt;
    local IconLink = &#039;&#039;&lt;br /&gt;
    local IconBorder = &#039;&#039;&lt;br /&gt;
    local IconCount = &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
    local args = Utils.normalise(param)&lt;br /&gt;
&lt;br /&gt;
    if args.id == nil or args.name == &#039;&#039; then return &#039;Module:IconUtils \&#039;id\&#039; must be specified.&#039; end&lt;br /&gt;
&lt;br /&gt;
    local Icon = args.id .. &#039;_Icon.png&#039;&lt;br /&gt;
&lt;br /&gt;
    if args.size == nil or args.size == &#039;&#039; then IconSize = 28 else IconSize = args.size end&lt;br /&gt;
    if args.style == nil or args.style == &#039;&#039; then IconStyle = &#039;1&#039; else IconStyle = args.style end&lt;br /&gt;
    if args.link == nil or args.link == &#039;&#039; then IconLink = &#039;&#039; else IconLink = &#039;[[&#039; .. args.link .. &#039;]]&#039; end   &lt;br /&gt;
    if args.link == &#039;1&#039; then &lt;br /&gt;
        if args.style == &#039;5&#039; then IconLink = &#039;[[&#039; .. args.name ..&#039;| &amp;lt;div class=&amp;quot;recipeitemlink&amp;quot; title=&amp;quot;&#039; .. args.name .. &#039;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt; ]]&#039;&lt;br /&gt;
        else IconLink = &#039;[[&#039; .. args.name .. &#039;]]&#039; end&lt;br /&gt;
    end&lt;br /&gt;
    if IconLink == &#039;&#039; then IconTextLine = &#039;  &#039; .. args.name IconTextBr = &#039;&amp;lt;br&amp;gt;&#039; .. args.name else IconTextLine = &#039;  &#039; .. IconLink IconTextBr = &#039;&amp;lt;br&amp;gt;&#039; .. IconLink end&lt;br /&gt;
    if args.count == nil or args.count == &#039;&#039; then IconCount = &#039;1&#039; else IconCount = args.count end&lt;br /&gt;
    if args.border == nil or args.border == &#039;&#039; then IconBorder = &#039; borderwhite&#039; else IconBorder = &#039; border&#039; .. args.border end&lt;br /&gt;
&lt;br /&gt;
    if IconStyle == &#039;1&#039; then return &#039;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=&#039;.. IconLink ..&#039;]]&#039; end&lt;br /&gt;
    if IconStyle == &#039;2&#039; then return &#039;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=&#039;.. IconLink ..&#039;]]&#039; .. IconTextLine end&lt;br /&gt;
    if IconStyle == &#039;3&#039; then return &#039;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=&#039;.. IconLink ..&#039;]]&#039; .. IconTextBr end&lt;br /&gt;
    if IconStyle == &#039;4&#039; then return &#039;&amp;lt;div class=&amp;quot;IconFrame&amp;quot;&amp;gt;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=&#039;.. IconLink ..&#039;]]&#039; .. IconTextBr .. &#039;&amp;lt;/div&amp;gt;&#039; end&lt;br /&gt;
    if IconStyle == &#039;5&#039; then return &#039;&amp;lt;div class=&amp;quot;recipeitem withcount&#039; .. IconBorder .. &#039;&amp;quot; style=&amp;quot;font-size:&#039; .. IconSize .. &#039;px&amp;quot;&amp;gt;&#039; .. &#039;&amp;lt;div class=&amp;quot;recipeitemicon&amp;quot;&amp;gt;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=]]&amp;lt;/div&amp;gt;&amp;lt;span class=&amp;quot;recipeitemcount&amp;quot;&amp;gt;&#039; .. IconCount .. &#039;&amp;lt;/span&amp;gt; &#039; .. IconLink ..&#039;&amp;lt;/div&amp;gt;&#039; end&lt;br /&gt;
    if IconStyle == &#039;6&#039; then return &#039;&amp;lt;div class=&amp;quot;recipeitem&#039; .. IconBorder .. &#039;&amp;quot; style=&amp;quot;font-size:&#039; .. IconSize .. &#039;px&amp;quot;&amp;gt;&#039; .. &#039;&amp;lt;div class=&amp;quot;recipeitemicon&amp;quot;&amp;gt;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=]]&amp;lt;/div&amp;gt;[[&#039; .. args.link .. &#039;|&amp;lt;div class=&amp;quot;recipeitemlink&amp;quot; title=&amp;quot;&#039; .. args.link .. &#039;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;]]&amp;lt;/div&amp;gt;&#039; end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>WugWugg</name></author>
	</entry>
	<entry>
		<id>https://wiki.play.eco/en/index.php?title=Module:IconUtils&amp;diff=16412</id>
		<title>Module:IconUtils</title>
		<link rel="alternate" type="text/html" href="https://wiki.play.eco/en/index.php?title=Module:IconUtils&amp;diff=16412"/>
		<updated>2026-02-24T14:12:27Z</updated>

		<summary type="html">&lt;p&gt;WugWugg: Bug Fix: IconStyle not being equal to 5? Changing to match on args.style&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.main(param)&lt;br /&gt;
    local Utils = require(&#039;Module:Utils&#039;)&lt;br /&gt;
&lt;br /&gt;
    local Icon = &#039;&#039;&lt;br /&gt;
    local IconStyle = &#039;&#039;&lt;br /&gt;
    local IconSize = &#039;&#039;&lt;br /&gt;
    local IconLink = &#039;&#039;&lt;br /&gt;
    local IconBorder = &#039;&#039;&lt;br /&gt;
    local IconCount = &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
    local args = Utils.normalise(param)&lt;br /&gt;
&lt;br /&gt;
    if args.id == nil or args.name == &#039;&#039; then return &#039;Module:IconUtils \&#039;id\&#039; must be specified.&#039; end&lt;br /&gt;
&lt;br /&gt;
    local Icon = args.id .. &#039;_Icon.png&#039;&lt;br /&gt;
&lt;br /&gt;
    if args.size == nil or args.size == &#039;&#039; then IconSize = 28 else IconSize = args.size end&lt;br /&gt;
    if args.style == nil or args.style == &#039;&#039; then IconStyle = &#039;1&#039; else IconStyle = args.style end&lt;br /&gt;
    if args.link == nil or args.link == &#039;&#039; then IconLink = &#039;&#039; else IconLink = &#039;[[&#039; .. args.link .. &#039;]]&#039; end   &lt;br /&gt;
    if args.link == &#039;1&#039; then &lt;br /&gt;
        if args.style == &#039;5&#039; then IconLink = &#039;&amp;lt;div class=&amp;quot;recipeitemlink&amp;quot; title=&amp;quot;&#039; .. args.name .. &#039;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
        else IconLink = &#039;[[&#039; .. args.name .. &#039;]]&#039; end&lt;br /&gt;
    end&lt;br /&gt;
    if IconLink == &#039;&#039; then IconTextLine = &#039;  &#039; .. args.name IconTextBr = &#039;&amp;lt;br&amp;gt;&#039; .. args.name else IconTextLine = &#039;  &#039; .. IconLink IconTextBr = &#039;&amp;lt;br&amp;gt;&#039; .. IconLink end&lt;br /&gt;
    if args.count == nil or args.count == &#039;&#039; then IconCount = &#039;1&#039; else IconCount = args.count end&lt;br /&gt;
    if args.border == nil or args.border == &#039;&#039; then IconBorder = &#039; borderwhite&#039; else IconBorder = &#039; border&#039; .. args.border end&lt;br /&gt;
&lt;br /&gt;
    if IconStyle == &#039;1&#039; then return &#039;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=&#039;.. IconLink ..&#039;]]&#039; end&lt;br /&gt;
    if IconStyle == &#039;2&#039; then return &#039;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=&#039;.. IconLink ..&#039;]]&#039; .. IconTextLine end&lt;br /&gt;
    if IconStyle == &#039;3&#039; then return &#039;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=&#039;.. IconLink ..&#039;]]&#039; .. IconTextBr end&lt;br /&gt;
    if IconStyle == &#039;4&#039; then return &#039;&amp;lt;div class=&amp;quot;IconFrame&amp;quot;&amp;gt;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=&#039;.. IconLink ..&#039;]]&#039; .. IconTextBr .. &#039;&amp;lt;/div&amp;gt;&#039; end&lt;br /&gt;
    if IconStyle == &#039;5&#039; then return &#039;&amp;lt;div class=&amp;quot;recipeitem withcount&#039; .. IconBorder .. &#039;&amp;quot; style=&amp;quot;font-size:&#039; .. IconSize .. &#039;px&amp;quot;&amp;gt;&#039; .. &#039;&amp;lt;div class=&amp;quot;recipeitemicon&amp;quot;&amp;gt;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=]]&amp;lt;/div&amp;gt;&amp;lt;span class=&amp;quot;recipeitemcount&amp;quot;&amp;gt;&#039; .. IconCount .. &#039;&amp;lt;/span&amp;gt; &#039; .. IconLink ..&#039;&amp;lt;/div&amp;gt;&#039; end&lt;br /&gt;
    if IconStyle == &#039;6&#039; then return &#039;&amp;lt;div class=&amp;quot;recipeitem&#039; .. IconBorder .. &#039;&amp;quot; style=&amp;quot;font-size:&#039; .. IconSize .. &#039;px&amp;quot;&amp;gt;&#039; .. &#039;&amp;lt;div class=&amp;quot;recipeitemicon&amp;quot;&amp;gt;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=]]&amp;lt;/div&amp;gt;[[&#039; .. args.link .. &#039;|&amp;lt;div class=&amp;quot;recipeitemlink&amp;quot; title=&amp;quot;&#039; .. args.link .. &#039;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;]]&amp;lt;/div&amp;gt;&#039; end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>WugWugg</name></author>
	</entry>
	<entry>
		<id>https://wiki.play.eco/en/index.php?title=Module:IconUtils&amp;diff=16411</id>
		<title>Module:IconUtils</title>
		<link rel="alternate" type="text/html" href="https://wiki.play.eco/en/index.php?title=Module:IconUtils&amp;diff=16411"/>
		<updated>2026-02-24T14:09:16Z</updated>

		<summary type="html">&lt;p&gt;WugWugg: Bug Fix: IconStyle was matching on a numeral not a string causing style 5 and link 1 logic to not apply.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.main(param)&lt;br /&gt;
    local Utils = require(&#039;Module:Utils&#039;)&lt;br /&gt;
&lt;br /&gt;
    local Icon = &#039;&#039;&lt;br /&gt;
    local IconStyle = &#039;&#039;&lt;br /&gt;
    local IconSize = &#039;&#039;&lt;br /&gt;
    local IconLink = &#039;&#039;&lt;br /&gt;
    local IconBorder = &#039;&#039;&lt;br /&gt;
    local IconCount = &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
    local args = Utils.normalise(param)&lt;br /&gt;
&lt;br /&gt;
    if args.id == nil or args.name == &#039;&#039; then return &#039;Module:IconUtils \&#039;id\&#039; must be specified.&#039; end&lt;br /&gt;
&lt;br /&gt;
    local Icon = args.id .. &#039;_Icon.png&#039;&lt;br /&gt;
&lt;br /&gt;
    if args.size == nil or args.size == &#039;&#039; then IconSize = 28 else IconSize = args.size end&lt;br /&gt;
    if args.style == nil or args.style == &#039;&#039; then IconStyle = &#039;1&#039; else IconStyle = args.style end&lt;br /&gt;
    if args.link == nil or args.link == &#039;&#039; then IconLink = &#039;&#039; else IconLink = &#039;[[&#039; .. args.link .. &#039;]]&#039; end   &lt;br /&gt;
    if args.link == &#039;1&#039; then &lt;br /&gt;
        if IconStyle == &#039;5&#039; then IconLink = &#039;&amp;lt;div class=&amp;quot;recipeitemlink&amp;quot; title=&amp;quot;&#039; .. args.name .. &#039;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
        else IconLink = &#039;[[&#039; .. args.name .. &#039;]]&#039; end&lt;br /&gt;
    end&lt;br /&gt;
    if IconLink == &#039;&#039; then IconTextLine = &#039;  &#039; .. args.name IconTextBr = &#039;&amp;lt;br&amp;gt;&#039; .. args.name else IconTextLine = &#039;  &#039; .. IconLink IconTextBr = &#039;&amp;lt;br&amp;gt;&#039; .. IconLink end&lt;br /&gt;
    if args.count == nil or args.count == &#039;&#039; then IconCount = &#039;1&#039; else IconCount = args.count end&lt;br /&gt;
    if args.border == nil or args.border == &#039;&#039; then IconBorder = &#039; borderwhite&#039; else IconBorder = &#039; border&#039; .. args.border end&lt;br /&gt;
&lt;br /&gt;
    if IconStyle == &#039;1&#039; then return &#039;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=&#039;.. IconLink ..&#039;]]&#039; end&lt;br /&gt;
    if IconStyle == &#039;2&#039; then return &#039;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=&#039;.. IconLink ..&#039;]]&#039; .. IconTextLine end&lt;br /&gt;
    if IconStyle == &#039;3&#039; then return &#039;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=&#039;.. IconLink ..&#039;]]&#039; .. IconTextBr end&lt;br /&gt;
    if IconStyle == &#039;4&#039; then return &#039;&amp;lt;div class=&amp;quot;IconFrame&amp;quot;&amp;gt;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=&#039;.. IconLink ..&#039;]]&#039; .. IconTextBr .. &#039;&amp;lt;/div&amp;gt;&#039; end&lt;br /&gt;
    if IconStyle == &#039;5&#039; then return &#039;&amp;lt;div class=&amp;quot;recipeitem withcount&#039; .. IconBorder .. &#039;&amp;quot; style=&amp;quot;font-size:&#039; .. IconSize .. &#039;px&amp;quot;&amp;gt;&#039; .. &#039;&amp;lt;div class=&amp;quot;recipeitemicon&amp;quot;&amp;gt;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=]]&amp;lt;/div&amp;gt;&amp;lt;span class=&amp;quot;recipeitemcount&amp;quot;&amp;gt;&#039; .. IconCount .. &#039;&amp;lt;/span&amp;gt; &#039; .. IconLink ..&#039;&amp;lt;/div&amp;gt;&#039; end&lt;br /&gt;
    if IconStyle == &#039;6&#039; then return &#039;&amp;lt;div class=&amp;quot;recipeitem&#039; .. IconBorder .. &#039;&amp;quot; style=&amp;quot;font-size:&#039; .. IconSize .. &#039;px&amp;quot;&amp;gt;&#039; .. &#039;&amp;lt;div class=&amp;quot;recipeitemicon&amp;quot;&amp;gt;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=]]&amp;lt;/div&amp;gt;[[&#039; .. args.link .. &#039;|&amp;lt;div class=&amp;quot;recipeitemlink&amp;quot; title=&amp;quot;&#039; .. args.link .. &#039;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;]]&amp;lt;/div&amp;gt;&#039; end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>WugWugg</name></author>
	</entry>
	<entry>
		<id>https://wiki.play.eco/en/index.php?title=Module:IconUtils&amp;diff=16410</id>
		<title>Module:IconUtils</title>
		<link rel="alternate" type="text/html" href="https://wiki.play.eco/en/index.php?title=Module:IconUtils&amp;diff=16410"/>
		<updated>2026-02-24T14:06:11Z</updated>

		<summary type="html">&lt;p&gt;WugWugg: Undo revision 16409 by WugWugg (talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.main(param)&lt;br /&gt;
    local Utils = require(&#039;Module:Utils&#039;)&lt;br /&gt;
&lt;br /&gt;
    local Icon = &#039;&#039;&lt;br /&gt;
    local IconStyle = &#039;&#039;&lt;br /&gt;
    local IconSize = &#039;&#039;&lt;br /&gt;
    local IconLink = &#039;&#039;&lt;br /&gt;
    local IconBorder = &#039;&#039;&lt;br /&gt;
    local IconCount = &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
    local args = Utils.normalise(param)&lt;br /&gt;
&lt;br /&gt;
    if args.id == nil or args.name == &#039;&#039; then return &#039;Module:IconUtils \&#039;id\&#039; must be specified.&#039; end&lt;br /&gt;
&lt;br /&gt;
    local Icon = args.id .. &#039;_Icon.png&#039;&lt;br /&gt;
&lt;br /&gt;
    if args.size == nil or args.size == &#039;&#039; then IconSize = 28 else IconSize = args.size end&lt;br /&gt;
    if args.style == nil or args.style == &#039;&#039; then IconStyle = &#039;1&#039; else IconStyle = args.style end&lt;br /&gt;
    if args.link == nil or args.link == &#039;&#039; then IconLink = &#039;&#039; else IconLink = &#039;[[&#039; .. args.link .. &#039;]]&#039; end   &lt;br /&gt;
    if args.link == &#039;1&#039; then &lt;br /&gt;
        if IconStyle == 5 then IconLink = &#039;&amp;lt;div class=&amp;quot;recipeitemlink&amp;quot; title=&amp;quot;&#039; .. args.name .. &#039;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
        else IconLink = &#039;[[&#039; .. args.name .. &#039;]]&#039; end&lt;br /&gt;
    end&lt;br /&gt;
    if IconLink == &#039;&#039; then IconTextLine = &#039;  &#039; .. args.name IconTextBr = &#039;&amp;lt;br&amp;gt;&#039; .. args.name else IconTextLine = &#039;  &#039; .. IconLink IconTextBr = &#039;&amp;lt;br&amp;gt;&#039; .. IconLink end&lt;br /&gt;
    if args.count == nil or args.count == &#039;&#039; then IconCount = &#039;1&#039; else IconCount = args.count end&lt;br /&gt;
    if args.border == nil or args.border == &#039;&#039; then IconBorder = &#039; borderwhite&#039; else IconBorder = &#039; border&#039; .. args.border end&lt;br /&gt;
&lt;br /&gt;
    if IconStyle == &#039;1&#039; then return &#039;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=&#039;.. IconLink ..&#039;]]&#039; end&lt;br /&gt;
    if IconStyle == &#039;2&#039; then return &#039;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=&#039;.. IconLink ..&#039;]]&#039; .. IconTextLine end&lt;br /&gt;
    if IconStyle == &#039;3&#039; then return &#039;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=&#039;.. IconLink ..&#039;]]&#039; .. IconTextBr end&lt;br /&gt;
    if IconStyle == &#039;4&#039; then return &#039;&amp;lt;div class=&amp;quot;IconFrame&amp;quot;&amp;gt;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=&#039;.. IconLink ..&#039;]]&#039; .. IconTextBr .. &#039;&amp;lt;/div&amp;gt;&#039; end&lt;br /&gt;
    if IconStyle == &#039;5&#039; then return &#039;&amp;lt;div class=&amp;quot;recipeitem withcount&#039; .. IconBorder .. &#039;&amp;quot; style=&amp;quot;font-size:&#039; .. IconSize .. &#039;px&amp;quot;&amp;gt;&#039; .. &#039;&amp;lt;div class=&amp;quot;recipeitemicon&amp;quot;&amp;gt;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=]]&amp;lt;/div&amp;gt;&amp;lt;span class=&amp;quot;recipeitemcount&amp;quot;&amp;gt;&#039; .. IconCount .. &#039;&amp;lt;/span&amp;gt; &#039; .. IconLink ..&#039;&amp;lt;/div&amp;gt;&#039; end&lt;br /&gt;
    if IconStyle == &#039;6&#039; then return &#039;&amp;lt;div class=&amp;quot;recipeitem&#039; .. IconBorder .. &#039;&amp;quot; style=&amp;quot;font-size:&#039; .. IconSize .. &#039;px&amp;quot;&amp;gt;&#039; .. &#039;&amp;lt;div class=&amp;quot;recipeitemicon&amp;quot;&amp;gt;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=]]&amp;lt;/div&amp;gt;[[&#039; .. args.link .. &#039;|&amp;lt;div class=&amp;quot;recipeitemlink&amp;quot; title=&amp;quot;&#039; .. args.link .. &#039;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;]]&amp;lt;/div&amp;gt;&#039; end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>WugWugg</name></author>
	</entry>
	<entry>
		<id>https://wiki.play.eco/en/index.php?title=Module:IconUtils&amp;diff=16409</id>
		<title>Module:IconUtils</title>
		<link rel="alternate" type="text/html" href="https://wiki.play.eco/en/index.php?title=Module:IconUtils&amp;diff=16409"/>
		<updated>2026-02-24T14:04:22Z</updated>

		<summary type="html">&lt;p&gt;WugWugg: Moving the Link to outside the icon.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.main(param)&lt;br /&gt;
    local Utils = require(&#039;Module:Utils&#039;)&lt;br /&gt;
&lt;br /&gt;
    local Icon = &#039;&#039;&lt;br /&gt;
    local IconStyle = &#039;&#039;&lt;br /&gt;
    local IconSize = &#039;&#039;&lt;br /&gt;
    local IconLink = &#039;&#039;&lt;br /&gt;
    local IconBorder = &#039;&#039;&lt;br /&gt;
    local IconCount = &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
    local args = Utils.normalise(param)&lt;br /&gt;
&lt;br /&gt;
    if args.id == nil or args.name == &#039;&#039; then return &#039;Module:IconUtils \&#039;id\&#039; must be specified.&#039; end&lt;br /&gt;
&lt;br /&gt;
    local Icon = args.id .. &#039;_Icon.png&#039;&lt;br /&gt;
&lt;br /&gt;
    if args.size == nil or args.size == &#039;&#039; then IconSize = 28 else IconSize = args.size end&lt;br /&gt;
    if args.style == nil or args.style == &#039;&#039; then IconStyle = &#039;1&#039; else IconStyle = args.style end&lt;br /&gt;
    if args.link == nil or args.link == &#039;&#039; then IconLink = &#039;&#039; else IconLink = &#039;[[&#039; .. args.link .. &#039;]]&#039; end   &lt;br /&gt;
    if args.link == &#039;1&#039; then &lt;br /&gt;
        if IconStyle == 5 then IconLink = &#039;&amp;lt;div class=&amp;quot;recipeitemlink&amp;quot; title=&amp;quot;&#039; .. args.name .. &#039;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
        else IconLink = &#039;[[&#039; .. args.name .. &#039;]]&#039; end&lt;br /&gt;
    end&lt;br /&gt;
    if IconLink == &#039;&#039; then IconTextLine = &#039;  &#039; .. args.name IconTextBr = &#039;&amp;lt;br&amp;gt;&#039; .. args.name else IconTextLine = &#039;  &#039; .. IconLink IconTextBr = &#039;&amp;lt;br&amp;gt;&#039; .. IconLink end&lt;br /&gt;
    if args.count == nil or args.count == &#039;&#039; then IconCount = &#039;1&#039; else IconCount = args.count end&lt;br /&gt;
    if args.border == nil or args.border == &#039;&#039; then IconBorder = &#039; borderwhite&#039; else IconBorder = &#039; border&#039; .. args.border end&lt;br /&gt;
&lt;br /&gt;
    if IconStyle == &#039;1&#039; then return &#039;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=&#039;.. IconLink ..&#039;]]&#039; end&lt;br /&gt;
    if IconStyle == &#039;2&#039; then return &#039;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=&#039;.. IconLink ..&#039;]]&#039; .. IconTextLine end&lt;br /&gt;
    if IconStyle == &#039;3&#039; then return &#039;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=&#039;.. IconLink ..&#039;]]&#039; .. IconTextBr end&lt;br /&gt;
    if IconStyle == &#039;4&#039; then return &#039;&amp;lt;div class=&amp;quot;IconFrame&amp;quot;&amp;gt;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=&#039;.. IconLink ..&#039;]]&#039; .. IconTextBr .. &#039;&amp;lt;/div&amp;gt;&#039; end&lt;br /&gt;
    if IconStyle == &#039;5&#039; then return &#039;&amp;lt;div class=&amp;quot;recipeitem withcount&#039; .. IconBorder .. &#039;&amp;quot; style=&amp;quot;font-size:&#039; .. IconSize .. &#039;px&amp;quot;&amp;gt;&#039; .. &#039;&amp;lt;div class=&amp;quot;recipeitemicon&amp;quot;&amp;gt;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=]]&amp;lt;/div&amp;gt;&amp;lt;span class=&amp;quot;recipeitemcount&amp;quot;&amp;gt;&#039; .. IconCount .. &#039;&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&#039; .. IconLink end&lt;br /&gt;
    if IconStyle == &#039;6&#039; then return &#039;&amp;lt;div class=&amp;quot;recipeitem&#039; .. IconBorder .. &#039;&amp;quot; style=&amp;quot;font-size:&#039; .. IconSize .. &#039;px&amp;quot;&amp;gt;&#039; .. &#039;&amp;lt;div class=&amp;quot;recipeitemicon&amp;quot;&amp;gt;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=]]&amp;lt;/div&amp;gt;[[&#039; .. args.link .. &#039;|&amp;lt;div class=&amp;quot;recipeitemlink&amp;quot; title=&amp;quot;&#039; .. args.link .. &#039;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;]]&amp;lt;/div&amp;gt;&#039; end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>WugWugg</name></author>
	</entry>
	<entry>
		<id>https://wiki.play.eco/en/index.php?title=Module:IconUtils&amp;diff=16408</id>
		<title>Module:IconUtils</title>
		<link rel="alternate" type="text/html" href="https://wiki.play.eco/en/index.php?title=Module:IconUtils&amp;diff=16408"/>
		<updated>2026-02-24T13:59:02Z</updated>

		<summary type="html">&lt;p&gt;WugWugg: Bug Fix: Fixing the link for style 5&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.main(param)&lt;br /&gt;
    local Utils = require(&#039;Module:Utils&#039;)&lt;br /&gt;
&lt;br /&gt;
    local Icon = &#039;&#039;&lt;br /&gt;
    local IconStyle = &#039;&#039;&lt;br /&gt;
    local IconSize = &#039;&#039;&lt;br /&gt;
    local IconLink = &#039;&#039;&lt;br /&gt;
    local IconBorder = &#039;&#039;&lt;br /&gt;
    local IconCount = &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
    local args = Utils.normalise(param)&lt;br /&gt;
&lt;br /&gt;
    if args.id == nil or args.name == &#039;&#039; then return &#039;Module:IconUtils \&#039;id\&#039; must be specified.&#039; end&lt;br /&gt;
&lt;br /&gt;
    local Icon = args.id .. &#039;_Icon.png&#039;&lt;br /&gt;
&lt;br /&gt;
    if args.size == nil or args.size == &#039;&#039; then IconSize = 28 else IconSize = args.size end&lt;br /&gt;
    if args.style == nil or args.style == &#039;&#039; then IconStyle = &#039;1&#039; else IconStyle = args.style end&lt;br /&gt;
    if args.link == nil or args.link == &#039;&#039; then IconLink = &#039;&#039; else IconLink = &#039;[[&#039; .. args.link .. &#039;]]&#039; end   &lt;br /&gt;
    if args.link == &#039;1&#039; then &lt;br /&gt;
        if IconStyle == 5 then IconLink = &#039;&amp;lt;div class=&amp;quot;recipeitemlink&amp;quot; title=&amp;quot;&#039; .. args.name .. &#039;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
        else IconLink = &#039;[[&#039; .. args.name .. &#039;]]&#039; end&lt;br /&gt;
    end&lt;br /&gt;
    if IconLink == &#039;&#039; then IconTextLine = &#039;  &#039; .. args.name IconTextBr = &#039;&amp;lt;br&amp;gt;&#039; .. args.name else IconTextLine = &#039;  &#039; .. IconLink IconTextBr = &#039;&amp;lt;br&amp;gt;&#039; .. IconLink end&lt;br /&gt;
    if args.count == nil or args.count == &#039;&#039; then IconCount = &#039;1&#039; else IconCount = args.count end&lt;br /&gt;
    if args.border == nil or args.border == &#039;&#039; then IconBorder = &#039; borderwhite&#039; else IconBorder = &#039; border&#039; .. args.border end&lt;br /&gt;
&lt;br /&gt;
    if IconStyle == &#039;1&#039; then return &#039;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=&#039;.. IconLink ..&#039;]]&#039; end&lt;br /&gt;
    if IconStyle == &#039;2&#039; then return &#039;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=&#039;.. IconLink ..&#039;]]&#039; .. IconTextLine end&lt;br /&gt;
    if IconStyle == &#039;3&#039; then return &#039;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=&#039;.. IconLink ..&#039;]]&#039; .. IconTextBr end&lt;br /&gt;
    if IconStyle == &#039;4&#039; then return &#039;&amp;lt;div class=&amp;quot;IconFrame&amp;quot;&amp;gt;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=&#039;.. IconLink ..&#039;]]&#039; .. IconTextBr .. &#039;&amp;lt;/div&amp;gt;&#039; end&lt;br /&gt;
    if IconStyle == &#039;5&#039; then return &#039;&amp;lt;div class=&amp;quot;recipeitem withcount&#039; .. IconBorder .. &#039;&amp;quot; style=&amp;quot;font-size:&#039; .. IconSize .. &#039;px&amp;quot;&amp;gt;&#039; .. &#039;&amp;lt;div class=&amp;quot;recipeitemicon&amp;quot;&amp;gt;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=]]&amp;lt;/div&amp;gt;&amp;lt;span class=&amp;quot;recipeitemcount&amp;quot;&amp;gt;&#039; .. IconCount .. &#039;&amp;lt;/span&amp;gt; &#039; .. IconLink ..&#039;&amp;lt;/div&amp;gt;&#039; end&lt;br /&gt;
    if IconStyle == &#039;6&#039; then return &#039;&amp;lt;div class=&amp;quot;recipeitem&#039; .. IconBorder .. &#039;&amp;quot; style=&amp;quot;font-size:&#039; .. IconSize .. &#039;px&amp;quot;&amp;gt;&#039; .. &#039;&amp;lt;div class=&amp;quot;recipeitemicon&amp;quot;&amp;gt;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=]]&amp;lt;/div&amp;gt;[[&#039; .. args.link .. &#039;|&amp;lt;div class=&amp;quot;recipeitemlink&amp;quot; title=&amp;quot;&#039; .. args.link .. &#039;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;]]&amp;lt;/div&amp;gt;&#039; end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>WugWugg</name></author>
	</entry>
	<entry>
		<id>https://wiki.play.eco/en/index.php?title=Module:IconUtils&amp;diff=16407</id>
		<title>Module:IconUtils</title>
		<link rel="alternate" type="text/html" href="https://wiki.play.eco/en/index.php?title=Module:IconUtils&amp;diff=16407"/>
		<updated>2026-02-24T13:53:42Z</updated>

		<summary type="html">&lt;p&gt;WugWugg: Bug Fix: Removing double-double brackets&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.main(param)&lt;br /&gt;
    local Utils = require(&#039;Module:Utils&#039;)&lt;br /&gt;
&lt;br /&gt;
    local Icon = &#039;&#039;&lt;br /&gt;
    local IconStyle = &#039;&#039;&lt;br /&gt;
    local IconSize = &#039;&#039;&lt;br /&gt;
    local IconLink = &#039;&#039;&lt;br /&gt;
    local IconBorder = &#039;&#039;&lt;br /&gt;
    local IconCount = &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
    local args = Utils.normalise(param)&lt;br /&gt;
&lt;br /&gt;
    if args.id == nil or args.name == &#039;&#039; then return &#039;Module:IconUtils \&#039;id\&#039; must be specified.&#039; end&lt;br /&gt;
&lt;br /&gt;
    local Icon = args.id .. &#039;_Icon.png&#039;&lt;br /&gt;
&lt;br /&gt;
    if args.size == nil or args.size == &#039;&#039; then IconSize = 28 else IconSize = args.size end&lt;br /&gt;
    if args.style == nil or args.style == &#039;&#039; then IconStyle = &#039;1&#039; else IconStyle = args.style end&lt;br /&gt;
    if args.link == nil or args.link == &#039;&#039; then IconLink = &#039;&#039; else IconLink = &#039;[[&#039; .. args.link .. &#039;]]&#039; end   &lt;br /&gt;
    if args.link == &#039;1&#039; then &lt;br /&gt;
        if IconStyle == 5 then IconLink = &#039;[[&#039; .. args.name .. &#039;|&amp;lt;div class=&amp;quot;recipeitemlink&amp;quot; title=&amp;quot;&#039; .. args.name .. &#039;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;]]&#039;&lt;br /&gt;
        else IconLink = &#039;[[&#039; .. args.name .. &#039;]]&#039; end&lt;br /&gt;
    end&lt;br /&gt;
    if IconLink == &#039;&#039; then IconTextLine = &#039;  &#039; .. args.name IconTextBr = &#039;&amp;lt;br&amp;gt;&#039; .. args.name else IconTextLine = &#039;  &#039; .. IconLink IconTextBr = &#039;&amp;lt;br&amp;gt;&#039; .. IconLink end&lt;br /&gt;
    if args.count == nil or args.count == &#039;&#039; then IconCount = &#039;1&#039; else IconCount = args.count end&lt;br /&gt;
    if args.border == nil or args.border == &#039;&#039; then IconBorder = &#039; borderwhite&#039; else IconBorder = &#039; border&#039; .. args.border end&lt;br /&gt;
&lt;br /&gt;
    if IconStyle == &#039;1&#039; then return &#039;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=&#039;.. IconLink ..&#039;]]&#039; end&lt;br /&gt;
    if IconStyle == &#039;2&#039; then return &#039;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=&#039;.. IconLink ..&#039;]]&#039; .. IconTextLine end&lt;br /&gt;
    if IconStyle == &#039;3&#039; then return &#039;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=&#039;.. IconLink ..&#039;]]&#039; .. IconTextBr end&lt;br /&gt;
    if IconStyle == &#039;4&#039; then return &#039;&amp;lt;div class=&amp;quot;IconFrame&amp;quot;&amp;gt;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=&#039;.. IconLink ..&#039;]]&#039; .. IconTextBr .. &#039;&amp;lt;/div&amp;gt;&#039; end&lt;br /&gt;
    if IconStyle == &#039;5&#039; then return &#039;&amp;lt;div class=&amp;quot;recipeitem withcount&#039; .. IconBorder .. &#039;&amp;quot; style=&amp;quot;font-size:&#039; .. IconSize .. &#039;px&amp;quot;&amp;gt;&#039; .. &#039;&amp;lt;div class=&amp;quot;recipeitemicon&amp;quot;&amp;gt;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=]]&amp;lt;/div&amp;gt;&amp;lt;span class=&amp;quot;recipeitemcount&amp;quot;&amp;gt;&#039; .. IconCount .. &#039;&amp;lt;/span&amp;gt; &#039; .. IconLink ..&#039;&amp;lt;/div&amp;gt;&#039; end&lt;br /&gt;
    if IconStyle == &#039;6&#039; then return &#039;&amp;lt;div class=&amp;quot;recipeitem&#039; .. IconBorder .. &#039;&amp;quot; style=&amp;quot;font-size:&#039; .. IconSize .. &#039;px&amp;quot;&amp;gt;&#039; .. &#039;&amp;lt;div class=&amp;quot;recipeitemicon&amp;quot;&amp;gt;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=]]&amp;lt;/div&amp;gt;[[&#039; .. args.link .. &#039;|&amp;lt;div class=&amp;quot;recipeitemlink&amp;quot; title=&amp;quot;&#039; .. args.link .. &#039;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;]]&amp;lt;/div&amp;gt;&#039; end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>WugWugg</name></author>
	</entry>
	<entry>
		<id>https://wiki.play.eco/en/index.php?title=Module:IconUtils&amp;diff=16406</id>
		<title>Module:IconUtils</title>
		<link rel="alternate" type="text/html" href="https://wiki.play.eco/en/index.php?title=Module:IconUtils&amp;diff=16406"/>
		<updated>2026-02-24T13:51:23Z</updated>

		<summary type="html">&lt;p&gt;WugWugg: All links worked. Changing style 5 to use new IconLink.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.main(param)&lt;br /&gt;
    local Utils = require(&#039;Module:Utils&#039;)&lt;br /&gt;
&lt;br /&gt;
    local Icon = &#039;&#039;&lt;br /&gt;
    local IconStyle = &#039;&#039;&lt;br /&gt;
    local IconSize = &#039;&#039;&lt;br /&gt;
    local IconLink = &#039;&#039;&lt;br /&gt;
    local IconBorder = &#039;&#039;&lt;br /&gt;
    local IconCount = &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
    local args = Utils.normalise(param)&lt;br /&gt;
&lt;br /&gt;
    if args.id == nil or args.name == &#039;&#039; then return &#039;Module:IconUtils \&#039;id\&#039; must be specified.&#039; end&lt;br /&gt;
&lt;br /&gt;
    local Icon = args.id .. &#039;_Icon.png&#039;&lt;br /&gt;
&lt;br /&gt;
    if args.size == nil or args.size == &#039;&#039; then IconSize = 28 else IconSize = args.size end&lt;br /&gt;
    if args.style == nil or args.style == &#039;&#039; then IconStyle = &#039;1&#039; else IconStyle = args.style end&lt;br /&gt;
    if args.link == nil or args.link == &#039;&#039; then IconLink = &#039;&#039; else IconLink = &#039;[[&#039; .. args.link .. &#039;]]&#039; end   &lt;br /&gt;
    if args.link == &#039;1&#039; then &lt;br /&gt;
        if IconStyle == 5 then IconLink = &#039;[[&#039; .. args.name .. &#039;|&amp;lt;div class=&amp;quot;recipeitemlink&amp;quot; title=&amp;quot;&#039; .. args.name .. &#039;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;]]&#039;&lt;br /&gt;
        else IconLink = &#039;[[&#039; .. args.name .. &#039;]]&#039; end&lt;br /&gt;
    end&lt;br /&gt;
    if IconLink == &#039;&#039; then IconTextLine = &#039;  &#039; .. args.name IconTextBr = &#039;&amp;lt;br&amp;gt;&#039; .. args.name else IconTextLine = &#039;  &#039; .. IconLink IconTextBr = &#039;&amp;lt;br&amp;gt;&#039; .. IconLink end&lt;br /&gt;
    if args.count == nil or args.count == &#039;&#039; then IconCount = &#039;1&#039; else IconCount = args.count end&lt;br /&gt;
    if args.border == nil or args.border == &#039;&#039; then IconBorder = &#039; borderwhite&#039; else IconBorder = &#039; border&#039; .. args.border end&lt;br /&gt;
&lt;br /&gt;
    if IconStyle == &#039;1&#039; then return &#039;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=&#039;.. IconLink ..&#039;]]&#039; end&lt;br /&gt;
    if IconStyle == &#039;2&#039; then return &#039;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=&#039;.. IconLink ..&#039;]]&#039; .. IconTextLine end&lt;br /&gt;
    if IconStyle == &#039;3&#039; then return &#039;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=&#039;.. IconLink ..&#039;]]&#039; .. IconTextBr end&lt;br /&gt;
    if IconStyle == &#039;4&#039; then return &#039;&amp;lt;div class=&amp;quot;IconFrame&amp;quot;&amp;gt;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=&#039;.. IconLink ..&#039;]]&#039; .. IconTextBr .. &#039;&amp;lt;/div&amp;gt;&#039; end&lt;br /&gt;
    if IconStyle == &#039;5&#039; then return &#039;&amp;lt;div class=&amp;quot;recipeitem withcount&#039; .. IconBorder .. &#039;&amp;quot; style=&amp;quot;font-size:&#039; .. IconSize .. &#039;px&amp;quot;&amp;gt;&#039; .. &#039;&amp;lt;div class=&amp;quot;recipeitemicon&amp;quot;&amp;gt;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=]]&amp;lt;/div&amp;gt;&amp;lt;span class=&amp;quot;recipeitemcount&amp;quot;&amp;gt;&#039; .. IconCount .. &#039;&amp;lt;/span&amp;gt; [[&#039; .. IconLink ..&#039;]]&amp;lt;/div&amp;gt;&#039; end&lt;br /&gt;
    if IconStyle == &#039;6&#039; then return &#039;&amp;lt;div class=&amp;quot;recipeitem&#039; .. IconBorder .. &#039;&amp;quot; style=&amp;quot;font-size:&#039; .. IconSize .. &#039;px&amp;quot;&amp;gt;&#039; .. &#039;&amp;lt;div class=&amp;quot;recipeitemicon&amp;quot;&amp;gt;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=]]&amp;lt;/div&amp;gt;[[&#039; .. args.link .. &#039;|&amp;lt;div class=&amp;quot;recipeitemlink&amp;quot; title=&amp;quot;&#039; .. args.link .. &#039;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;]]&amp;lt;/div&amp;gt;&#039; end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>WugWugg</name></author>
	</entry>
	<entry>
		<id>https://wiki.play.eco/en/index.php?title=Module:IconUtils&amp;diff=16405</id>
		<title>Module:IconUtils</title>
		<link rel="alternate" type="text/html" href="https://wiki.play.eco/en/index.php?title=Module:IconUtils&amp;diff=16405"/>
		<updated>2026-02-24T13:47:52Z</updated>

		<summary type="html">&lt;p&gt;WugWugg: Making link=1 and style=5 correctly link to default page. Should not affect anything but style 5.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.main(param)&lt;br /&gt;
    local Utils = require(&#039;Module:Utils&#039;)&lt;br /&gt;
&lt;br /&gt;
    local Icon = &#039;&#039;&lt;br /&gt;
    local IconStyle = &#039;&#039;&lt;br /&gt;
    local IconSize = &#039;&#039;&lt;br /&gt;
    local IconLink = &#039;&#039;&lt;br /&gt;
    local IconBorder = &#039;&#039;&lt;br /&gt;
    local IconCount = &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
    local args = Utils.normalise(param)&lt;br /&gt;
&lt;br /&gt;
    if args.id == nil or args.name == &#039;&#039; then return &#039;Module:IconUtils \&#039;id\&#039; must be specified.&#039; end&lt;br /&gt;
&lt;br /&gt;
    local Icon = args.id .. &#039;_Icon.png&#039;&lt;br /&gt;
&lt;br /&gt;
    if args.size == nil or args.size == &#039;&#039; then IconSize = 28 else IconSize = args.size end&lt;br /&gt;
    if args.style == nil or args.style == &#039;&#039; then IconStyle = &#039;1&#039; else IconStyle = args.style end&lt;br /&gt;
    if args.link == nil or args.link == &#039;&#039; then IconLink = &#039;&#039; else IconLink = &#039;[[&#039; .. args.link .. &#039;]]&#039; end   &lt;br /&gt;
    if args.link == &#039;1&#039; then &lt;br /&gt;
    	if IconStyle == 5 then IconLink = &#039;[[&#039; .. args.name .. &#039;|&amp;lt;div class=&amp;quot;recipeitemlink&amp;quot; title=&amp;quot;&#039; .. args.name .. &#039;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;]]&#039;&lt;br /&gt;
		else IconLink = &#039;[[&#039; .. args.name .. &#039;]]&#039; end&lt;br /&gt;
    end&lt;br /&gt;
    if IconLink == &#039;&#039; then IconTextLine = &#039;  &#039; .. args.name IconTextBr = &#039;&amp;lt;br&amp;gt;&#039; .. args.name else IconTextLine = &#039;  &#039; .. IconLink IconTextBr = &#039;&amp;lt;br&amp;gt;&#039; .. IconLink end&lt;br /&gt;
    if args.count == nil or args.count == &#039;&#039; then IconCount = &#039;1&#039; else IconCount = args.count end&lt;br /&gt;
    if args.border == nil or args.border == &#039;&#039; then IconBorder = &#039; borderwhite&#039; else IconBorder = &#039; border&#039; .. args.border end&lt;br /&gt;
&lt;br /&gt;
    if IconStyle == &#039;1&#039; then return &#039;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=&#039;.. IconLink ..&#039;]]&#039; end&lt;br /&gt;
    if IconStyle == &#039;2&#039; then return &#039;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=&#039;.. IconLink ..&#039;]]&#039; .. IconTextLine end&lt;br /&gt;
    if IconStyle == &#039;3&#039; then return &#039;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=&#039;.. IconLink ..&#039;]]&#039; .. IconTextBr end&lt;br /&gt;
    if IconStyle == &#039;4&#039; then return &#039;&amp;lt;div class=&amp;quot;IconFrame&amp;quot;&amp;gt;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=&#039;.. IconLink ..&#039;]]&#039; .. IconTextBr .. &#039;&amp;lt;/div&amp;gt;&#039; end&lt;br /&gt;
    if IconStyle == &#039;5&#039; then return &#039;&amp;lt;div class=&amp;quot;recipeitem withcount&#039; .. IconBorder .. &#039;&amp;quot; style=&amp;quot;font-size:&#039; .. IconSize .. &#039;px&amp;quot;&amp;gt;&#039; .. &#039;&amp;lt;div class=&amp;quot;recipeitemicon&amp;quot;&amp;gt;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=]]&amp;lt;/div&amp;gt;&amp;lt;span class=&amp;quot;recipeitemcount&amp;quot;&amp;gt;&#039; .. IconCount .. &#039;&amp;lt;/span&amp;gt;&#039; .. &#039;[[&#039; .. args.link .. &#039;|&amp;lt;div class=&amp;quot;recipeitemlink&amp;quot; title=&amp;quot;&#039; .. args.link .. &#039;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;]]&amp;lt;/div&amp;gt;&#039; end&lt;br /&gt;
    if IconStyle == &#039;6&#039; then return &#039;&amp;lt;div class=&amp;quot;recipeitem&#039; .. IconBorder .. &#039;&amp;quot; style=&amp;quot;font-size:&#039; .. IconSize .. &#039;px&amp;quot;&amp;gt;&#039; .. &#039;&amp;lt;div class=&amp;quot;recipeitemicon&amp;quot;&amp;gt;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=]]&amp;lt;/div&amp;gt;[[&#039; .. args.link .. &#039;|&amp;lt;div class=&amp;quot;recipeitemlink&amp;quot; title=&amp;quot;&#039; .. args.link .. &#039;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;]]&amp;lt;/div&amp;gt;&#039; end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>WugWugg</name></author>
	</entry>
	<entry>
		<id>https://wiki.play.eco/en/index.php?title=Template:Demo_RecipeItemIcon/styles.css&amp;diff=16356</id>
		<title>Template:Demo RecipeItemIcon/styles.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.play.eco/en/index.php?title=Template:Demo_RecipeItemIcon/styles.css&amp;diff=16356"/>
		<updated>2026-02-21T14:44:39Z</updated>

		<summary type="html">&lt;p&gt;WugWugg: Undo revision 16349 by WugWugg (talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* NOTE: The size of &#039;em&#039; is set in the template via inline styles setting &#039;font-size&#039; */&lt;br /&gt;
.recipe-item-icon {&lt;br /&gt;
	position: relative;&lt;br /&gt;
	width: fit-content;&lt;br /&gt;
	height: fit-content;&lt;br /&gt;
	overflow: hidden;&lt;br /&gt;
	border-width: clamp(3px, 0.05em, 8px);&lt;br /&gt;
	border-radius: clamp(4px, 0.1em, 16px);&lt;br /&gt;
	box-shadow:&lt;br /&gt;
	  0 0.04em 0.06em rgba(0,0,0,0.75),&lt;br /&gt;
	  0 0.09em 0.14em rgba(0,0,0,0.45);&lt;br /&gt;
	margin: 0.1em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.recipe-item-icon.border-white {&lt;br /&gt;
	background-color: white;&lt;br /&gt;
	border-color: white;&lt;br /&gt;
	border-style: solid;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.recipe-item-icon.border-yellow {&lt;br /&gt;
	background-color: yellow;&lt;br /&gt;
	border-color: yellow;&lt;br /&gt;
	border-style: solid;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.recipe-item-icon.border-green {&lt;br /&gt;
	background-color: lime;&lt;br /&gt;
	border-color: lime;&lt;br /&gt;
	border-style: solid;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.recipe-item-icon.has-count::after {&lt;br /&gt;
	content: &amp;quot;&amp;quot;;&lt;br /&gt;
	position: absolute;&lt;br /&gt;
	z-index: 1;&lt;br /&gt;
	bottom: 0;&lt;br /&gt;
	right: 0;&lt;br /&gt;
	width: 100%;&lt;br /&gt;
	height: 100%;&lt;br /&gt;
	/* Known Limit/Bug: When an icon has a count the icon&#039;s image link cannot be clicked*/&lt;br /&gt;
	/* Solution add pointer-events to this Wiki&#039;s supported CSS features*/&lt;br /&gt;
	/* pointer-events: none;*/&lt;br /&gt;
	background: linear-gradient(&lt;br /&gt;
		315deg,&lt;br /&gt;
		rgba(0,0,0,0.55) 0%,&lt;br /&gt;
		rgba(0,0,0,0.4) 28%,&lt;br /&gt;
		rgba(0,0,0,0.2) 35%,&lt;br /&gt;
		rgba(0,0,0,0) 42%&lt;br /&gt;
	);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.recipe-item-icon__img-container {&lt;br /&gt;
	width: 1em;&lt;br /&gt;
	height: 1em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.recipe-item-icon__img-container img {&lt;br /&gt;
	display: block;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.recipe-item-icon__count {&lt;br /&gt;
	position: absolute;&lt;br /&gt;
	z-index: 2;&lt;br /&gt;
	bottom: clamp(4px, 0.1em, 16px);&lt;br /&gt;
	right: clamp(4px, 0.1em, 16px);&lt;br /&gt;
	line-height: 1;&lt;br /&gt;
	color: #fff;&lt;br /&gt;
	text-shadow: 0 1px 2px rgba(0,0,0,0.85);&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
	font-size: 0.25em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Kill VE filler paragraph after the icon, only in the demo table */&lt;br /&gt;
.recipe-icon-demo td .recipe-item-icon + p {&lt;br /&gt;
  margin: 0 !important;&lt;br /&gt;
  line-height: 0 !important;&lt;br /&gt;
  height: 0 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.recipe-icon-demo td .recipe-item-icon + p &amp;gt; br {&lt;br /&gt;
  display: none;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>WugWugg</name></author>
	</entry>
	<entry>
		<id>https://wiki.play.eco/en/index.php?title=Template:Demo_RecipeItemIcon/styles.css&amp;diff=16355</id>
		<title>Template:Demo RecipeItemIcon/styles.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.play.eco/en/index.php?title=Template:Demo_RecipeItemIcon/styles.css&amp;diff=16355"/>
		<updated>2026-02-21T14:44:27Z</updated>

		<summary type="html">&lt;p&gt;WugWugg: Undo revision 16352 by WugWugg (talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* NOTE: The size of &#039;em&#039; is set in the template via inline styles setting &#039;font-size&#039; */&lt;br /&gt;
.recipe-item-icon {&lt;br /&gt;
	position: relative;&lt;br /&gt;
	width: fit-content;&lt;br /&gt;
	height: fit-content;&lt;br /&gt;
	overflow: hidden;&lt;br /&gt;
	border-width: clamp(3px, 0.05em, 8px);&lt;br /&gt;
	border-radius: clamp(4px, 0.1em, 16px);&lt;br /&gt;
	box-shadow:&lt;br /&gt;
	  0 0.04em 0.06em rgba(0,0,0,0.75),&lt;br /&gt;
	  0 0.09em 0.14em rgba(0,0,0,0.45);&lt;br /&gt;
	margin: 0.1em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.recipe-item-icon.border-white {&lt;br /&gt;
	background-color: white;&lt;br /&gt;
	border-color: white;&lt;br /&gt;
	border-style: solid;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.recipe-item-icon.border-yellow {&lt;br /&gt;
	background-color: yellow;&lt;br /&gt;
	border-color: yellow;&lt;br /&gt;
	border-style: solid;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.recipe-item-icon.border-green {&lt;br /&gt;
	background-color: lime;&lt;br /&gt;
	border-color: lime;&lt;br /&gt;
	border-style: solid;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.recipe-item-icon.has-count::after {&lt;br /&gt;
	content: &amp;quot;&amp;quot;;&lt;br /&gt;
	position: absolute;&lt;br /&gt;
	z-index: 1;&lt;br /&gt;
	bottom: 0;&lt;br /&gt;
	right: 0;&lt;br /&gt;
	width: 100%;&lt;br /&gt;
	height: 100%;&lt;br /&gt;
	/* Known Limit/Bug: When an icon has a count the icon&#039;s image link cannot be clicked*/&lt;br /&gt;
	/* Solution add pointer-events to this Wiki&#039;s supported CSS features*/&lt;br /&gt;
	/* pointer-events: none;*/&lt;br /&gt;
	background: linear-gradient(&lt;br /&gt;
		315deg,&lt;br /&gt;
		rgba(0,0,0,0.55) 0%,&lt;br /&gt;
		rgba(0,0,0,0.4) 28%,&lt;br /&gt;
		rgba(0,0,0,0.2) 35%,&lt;br /&gt;
		rgba(0,0,0,0) 42%&lt;br /&gt;
	);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.recipe-item-icon__img-container {&lt;br /&gt;
	width: 1em;&lt;br /&gt;
	height: 1em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.recipe-item-icon__img-container img {&lt;br /&gt;
	display: block;&lt;br /&gt;
	width: 100% !important;&lt;br /&gt;
	height: 100% !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.recipe-item-icon__count {&lt;br /&gt;
	position: absolute;&lt;br /&gt;
	z-index: 2;&lt;br /&gt;
	bottom: clamp(4px, 0.1em, 16px);&lt;br /&gt;
	right: clamp(4px, 0.1em, 16px);&lt;br /&gt;
	line-height: 1;&lt;br /&gt;
	color: #fff;&lt;br /&gt;
	text-shadow: 0 1px 2px rgba(0,0,0,0.85);&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
	font-size: 0.25em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Kill VE filler paragraph after the icon, only in the demo table */&lt;br /&gt;
.recipe-icon-demo td .recipe-item-icon + p {&lt;br /&gt;
  margin: 0 !important;&lt;br /&gt;
  line-height: 0 !important;&lt;br /&gt;
  height: 0 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.recipe-icon-demo td .recipe-item-icon + p &amp;gt; br {&lt;br /&gt;
  display: none;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>WugWugg</name></author>
	</entry>
	<entry>
		<id>https://wiki.play.eco/en/index.php?title=Template:Demo_RecipeItemIcon&amp;diff=16354</id>
		<title>Template:Demo RecipeItemIcon</title>
		<link rel="alternate" type="text/html" href="https://wiki.play.eco/en/index.php?title=Template:Demo_RecipeItemIcon&amp;diff=16354"/>
		<updated>2026-02-21T14:43:57Z</updated>

		<summary type="html">&lt;p&gt;WugWugg: Undo revision 16350 by WugWugg (talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;templatestyles src=&amp;quot;Template:Demo_RecipeItemIcon/styles.css&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;includeonly&amp;gt;&amp;lt;div class=&amp;quot;recipe-item-icon {{#if: {{{count|}}} | has-count }} {{#switch: {{{border|}}} | yellow = border-yellow | white = border-white | green = border-green | #default = border-white}}&amp;quot; style=&amp;quot;font-size:{{{size|64}}}px&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;recipe-item-icon__img-container&amp;quot;&amp;gt;[[File:{{{icon}}}|{{{size|64}}}px]]&amp;lt;/div&amp;gt;&amp;lt;span class=&amp;quot;recipe-item-icon__count&amp;quot;&amp;gt;{{{count|}}}&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
=== Visual Goals ===&lt;br /&gt;
[[File:DaisyItem--Icon Yellow.png|frameless|border|upright=3|location=center|link=]]&lt;br /&gt;
[[File:DaisyItem--Icon White--No-Count.png|border|upright=3|location=center|link=]]&lt;br /&gt;
[[File:DaisyItem--Icon White.png|frameless|border|upright=3|location=center|link=]]&lt;br /&gt;
[[File:DaisyItem--Icon White--100.png|border|upright=3|location=center|link=]]&lt;br /&gt;
&lt;br /&gt;
=== Template Examples ===&lt;br /&gt;
{| class=&amp;quot;wikitable recipe-icon-demo&amp;quot;&lt;br /&gt;
|+ Border Colors&lt;br /&gt;
! Color !! Example&lt;br /&gt;
|-&lt;br /&gt;
| White &#039;&#039;(Default)&#039;&#039; ||{{Demo RecipeItemIcon|icon=DaisyItem_Icon.png}}&lt;br /&gt;
|-&lt;br /&gt;
| Yellow ||{{Demo RecipeItemIcon|icon=DaisyItem_Icon.png|border=yellow}}&lt;br /&gt;
|-&lt;br /&gt;
| Green ||{{Demo RecipeItemIcon|icon=DaisyItem_Icon.png|border=green}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable recipe-icon-demo&amp;quot;&lt;br /&gt;
|+ Responsive Sizing&lt;br /&gt;
! Size !! Example&lt;br /&gt;
|-&lt;br /&gt;
| 64px &#039;&#039;(Default)&#039;&#039; ||{{Demo RecipeItemIcon|icon=DaisyItem_Icon.png|count=10|size=64}}&lt;br /&gt;
|-&lt;br /&gt;
| 128px ||{{Demo RecipeItemIcon|icon=DaisyItem_Icon.png|count=10|size=128}}&lt;br /&gt;
|-&lt;br /&gt;
| 256px ||{{Demo RecipeItemIcon|icon=DaisyItem_Icon.png|count=10|size=256}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable recipe-icon-demo&amp;quot;&lt;br /&gt;
|+ Count Shadow&lt;br /&gt;
! Count !! Example&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;No Count/Shadow&#039;&#039; ||{{Demo RecipeItemIcon|icon=DaisyItem_Icon.png}}&lt;br /&gt;
|-&lt;br /&gt;
| 10 ||{{Demo RecipeItemIcon|icon=DaisyItem_Icon.png|count=10}}&lt;br /&gt;
|-&lt;br /&gt;
| 100 ||{{Demo RecipeItemIcon|icon=DaisyItem_Icon.png|count=100}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Grid Demo ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row g-2 mb-3&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;col-xs-12 col-sm-6 col-md-4 col-lg-3&amp;quot;&amp;gt;{{Demo RecipeItemIcon|icon=DaisyItem_Icon.png|count=100|size=128}}&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;col-xs-12 col-sm-6 col-md-4 col-lg-3&amp;quot;&amp;gt;{{Demo RecipeItemIcon|icon=TulipItem Icon.png|count=100|border=yellow|size=128}}&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;col-xs-12 col-sm-6 col-md-4 col-lg-3&amp;quot;&amp;gt;{{Demo RecipeItemIcon|icon=LupineItem Icon.png|size=128}}&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;col-xs-12 col-sm-6 col-md-4 col-lg-3&amp;quot;&amp;gt;{{Demo RecipeItemIcon|icon=RoseItem Icon.png|count=10|border=yellow|size=128}}&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;col-xs-12 col-sm-6 col-md-4 col-lg-3&amp;quot;&amp;gt;{{Demo RecipeItemIcon|icon=FlaxFlowerItem Icon.png|count=67|border=green|size=128}}&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;col-xs-12 col-sm-6 col-md-4 col-lg-3&amp;quot;&amp;gt;{{Demo RecipeItemIcon|icon=Flower Icon.png|border=green|size=128}}&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;col-xs-12 col-sm-6 col-md-4 col-lg-3&amp;quot;&amp;gt;{{Demo RecipeItemIcon|icon=EcoBookItem Icon.png|size=128}}&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;col-xs-12 col-sm-6 col-md-4 col-lg-3&amp;quot;&amp;gt;{{Demo RecipeItemIcon|icon=RiceFlourItem Icon.png|border=green|size=128}}&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;col-xs-12 col-sm-6 col-md-4 col-lg-3&amp;quot;&amp;gt;{{Demo RecipeItemIcon|icon=NailItem Icon.png|border=yellow|size=128}}&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;col-xs-12 col-sm-6 col-md-4 col-lg-3&amp;quot;&amp;gt;{{Demo RecipeItemIcon|icon=AdobeItem Icon.png|border=green|size=128}}&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;col-xs-12 col-sm-6 col-md-4 col-lg-3&amp;quot;&amp;gt;{{Demo RecipeItemIcon|icon=JoshuaLogItem Icon.png|size=128}}&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;col-xs-12 col-sm-6 col-md-4 col-lg-3&amp;quot;&amp;gt;{{Demo RecipeItemIcon|icon=IronOreItem Icon.png|border=yellow|size=128}}&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Recipe Demo ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row g-2 mb-3 align-items-center justify-content-center&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;col-xs-12 col-sm-4 col-md-3 col-lg-2&amp;quot;&amp;gt;{{Demo RecipeItemIcon|icon=NailItem Icon.png|border=yellow|size=128|count=2}}&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;col-xs-12 col-sm-2 col-md-1&amp;quot;&amp;gt;&amp;lt;i class=&amp;quot;fas fa-plus&amp;quot; style=&amp;quot;font-size:64px&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;col-xs-12 col-sm-4 col-md-3 col-lg-2&amp;quot;&amp;gt;{{Demo RecipeItemIcon|icon=FlaxseedOilItem_Icon.png|border=yellow|size=128|count=0.5}}&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;col-xs-12 col-sm-2 col-md-1&amp;quot;&amp;gt;&amp;lt;i class=&amp;quot;fas fa-plus&amp;quot; style=&amp;quot;font-size:64px&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;col-xs-12 col-sm-4 col-md-3 col-lg-2&amp;quot;&amp;gt;{{Demo RecipeItemIcon|icon=WoodBoard_Icon.png|border=yellow|size=128|count=10}}&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;col-xs-12 col-sm-2 col-md-1&amp;quot;&amp;gt;&amp;lt;i class=&amp;quot;fas fa-equals&amp;quot; style=&amp;quot;font-size:64px&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;col-xs-12 col-sm-4 col-md-3 col-lg-2&amp;quot;&amp;gt;{{Demo RecipeItemIcon|icon=LumberItem_Icon.png|size=128|count=2}}&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;templatedata&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;params&amp;quot;: {&lt;br /&gt;
		&amp;quot;size&amp;quot;: {&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;Size in pixels (numbers only)&amp;quot;,&lt;br /&gt;
			&amp;quot;example&amp;quot;: &amp;quot;64&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;number&amp;quot;,&lt;br /&gt;
			&amp;quot;suggestedvalues&amp;quot;: [&lt;br /&gt;
				&amp;quot;64&amp;quot;,&lt;br /&gt;
				&amp;quot;128&amp;quot;&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;default&amp;quot;: &amp;quot;64&amp;quot;,&lt;br /&gt;
			&amp;quot;autovalue&amp;quot;: &amp;quot;64&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;icon&amp;quot;: {&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;File name for icon.&amp;quot;,&lt;br /&gt;
			&amp;quot;example&amp;quot;: &amp;quot;DaisyItem_Icon.png&amp;quot;,&lt;br /&gt;
			&amp;quot;required&amp;quot;: true,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;count&amp;quot;: {&lt;br /&gt;
			&amp;quot;aliases&amp;quot;: [&lt;br /&gt;
				&amp;quot;num&amp;quot;&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;A number to display over this icon&#039;s image. Useful for showing counts.&amp;quot;,&lt;br /&gt;
			&amp;quot;example&amp;quot;: &amp;quot;10&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;number&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;border&amp;quot;: {&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;Border color&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
			&amp;quot;suggestedvalues&amp;quot;: [&lt;br /&gt;
				&amp;quot;white&amp;quot;,&lt;br /&gt;
				&amp;quot;yellow&amp;quot;,&lt;br /&gt;
				&amp;quot;green&amp;quot;&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;default&amp;quot;: &amp;quot;white&amp;quot;,&lt;br /&gt;
			&amp;quot;autovalue&amp;quot;: &amp;quot;white&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/templatedata&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>WugWugg</name></author>
	</entry>
	<entry>
		<id>https://wiki.play.eco/en/index.php?title=Template:Demo_RecipeItemIcon&amp;diff=16353</id>
		<title>Template:Demo RecipeItemIcon</title>
		<link rel="alternate" type="text/html" href="https://wiki.play.eco/en/index.php?title=Template:Demo_RecipeItemIcon&amp;diff=16353"/>
		<updated>2026-02-21T14:43:38Z</updated>

		<summary type="html">&lt;p&gt;WugWugg: Undo revision 16351 by WugWugg (talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;templatestyles src=&amp;quot;Template:Demo_RecipeItemIcon/styles.css&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;includeonly&amp;gt;&amp;lt;div class=&amp;quot;recipe-item-icon {{#if: {{{count|}}} | has-count }} {{#switch: {{{border|}}} | yellow = border-yellow | white = border-white | green = border-green | #default = border-white}}&amp;quot; style=&amp;quot;font-size:{{{size|64}}}px&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;recipe-item-icon__img-container&amp;quot;&amp;gt;[[File:{{{icon}}}]]&amp;lt;/div&amp;gt;&amp;lt;span class=&amp;quot;recipe-item-icon__count&amp;quot;&amp;gt;{{{count|}}}&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
=== Visual Goals ===&lt;br /&gt;
[[File:DaisyItem--Icon Yellow.png|frameless|border|upright=3|location=center|link=]]&lt;br /&gt;
[[File:DaisyItem--Icon White--No-Count.png|border|upright=3|location=center|link=]]&lt;br /&gt;
[[File:DaisyItem--Icon White.png|frameless|border|upright=3|location=center|link=]]&lt;br /&gt;
[[File:DaisyItem--Icon White--100.png|border|upright=3|location=center|link=]]&lt;br /&gt;
&lt;br /&gt;
=== Template Examples ===&lt;br /&gt;
{| class=&amp;quot;wikitable recipe-icon-demo&amp;quot;&lt;br /&gt;
|+ Border Colors&lt;br /&gt;
! Color !! Example&lt;br /&gt;
|-&lt;br /&gt;
| White &#039;&#039;(Default)&#039;&#039; ||{{Demo RecipeItemIcon|icon=DaisyItem_Icon.png}}&lt;br /&gt;
|-&lt;br /&gt;
| Yellow ||{{Demo RecipeItemIcon|icon=DaisyItem_Icon.png|border=yellow}}&lt;br /&gt;
|-&lt;br /&gt;
| Green ||{{Demo RecipeItemIcon|icon=DaisyItem_Icon.png|border=green}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable recipe-icon-demo&amp;quot;&lt;br /&gt;
|+ Responsive Sizing&lt;br /&gt;
! Size !! Example&lt;br /&gt;
|-&lt;br /&gt;
| 64px &#039;&#039;(Default)&#039;&#039; ||{{Demo RecipeItemIcon|icon=DaisyItem_Icon.png|count=10|size=64}}&lt;br /&gt;
|-&lt;br /&gt;
| 128px ||{{Demo RecipeItemIcon|icon=DaisyItem_Icon.png|count=10|size=128}}&lt;br /&gt;
|-&lt;br /&gt;
| 256px ||{{Demo RecipeItemIcon|icon=DaisyItem_Icon.png|count=10|size=256}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable recipe-icon-demo&amp;quot;&lt;br /&gt;
|+ Count Shadow&lt;br /&gt;
! Count !! Example&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;No Count/Shadow&#039;&#039; ||{{Demo RecipeItemIcon|icon=DaisyItem_Icon.png}}&lt;br /&gt;
|-&lt;br /&gt;
| 10 ||{{Demo RecipeItemIcon|icon=DaisyItem_Icon.png|count=10}}&lt;br /&gt;
|-&lt;br /&gt;
| 100 ||{{Demo RecipeItemIcon|icon=DaisyItem_Icon.png|count=100}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Grid Demo ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row g-2 mb-3&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;col-xs-12 col-sm-6 col-md-4 col-lg-3&amp;quot;&amp;gt;{{Demo RecipeItemIcon|icon=DaisyItem_Icon.png|count=100|size=128}}&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;col-xs-12 col-sm-6 col-md-4 col-lg-3&amp;quot;&amp;gt;{{Demo RecipeItemIcon|icon=TulipItem Icon.png|count=100|border=yellow|size=128}}&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;col-xs-12 col-sm-6 col-md-4 col-lg-3&amp;quot;&amp;gt;{{Demo RecipeItemIcon|icon=LupineItem Icon.png|size=128}}&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;col-xs-12 col-sm-6 col-md-4 col-lg-3&amp;quot;&amp;gt;{{Demo RecipeItemIcon|icon=RoseItem Icon.png|count=10|border=yellow|size=128}}&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;col-xs-12 col-sm-6 col-md-4 col-lg-3&amp;quot;&amp;gt;{{Demo RecipeItemIcon|icon=FlaxFlowerItem Icon.png|count=67|border=green|size=128}}&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;col-xs-12 col-sm-6 col-md-4 col-lg-3&amp;quot;&amp;gt;{{Demo RecipeItemIcon|icon=Flower Icon.png|border=green|size=128}}&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;col-xs-12 col-sm-6 col-md-4 col-lg-3&amp;quot;&amp;gt;{{Demo RecipeItemIcon|icon=EcoBookItem Icon.png|size=128}}&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;col-xs-12 col-sm-6 col-md-4 col-lg-3&amp;quot;&amp;gt;{{Demo RecipeItemIcon|icon=RiceFlourItem Icon.png|border=green|size=128}}&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;col-xs-12 col-sm-6 col-md-4 col-lg-3&amp;quot;&amp;gt;{{Demo RecipeItemIcon|icon=NailItem Icon.png|border=yellow|size=128}}&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;col-xs-12 col-sm-6 col-md-4 col-lg-3&amp;quot;&amp;gt;{{Demo RecipeItemIcon|icon=AdobeItem Icon.png|border=green|size=128}}&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;col-xs-12 col-sm-6 col-md-4 col-lg-3&amp;quot;&amp;gt;{{Demo RecipeItemIcon|icon=JoshuaLogItem Icon.png|size=128}}&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;col-xs-12 col-sm-6 col-md-4 col-lg-3&amp;quot;&amp;gt;{{Demo RecipeItemIcon|icon=IronOreItem Icon.png|border=yellow|size=128}}&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Recipe Demo ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row g-2 mb-3 align-items-center justify-content-center&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;col-xs-12 col-sm-4 col-md-3 col-lg-2&amp;quot;&amp;gt;{{Demo RecipeItemIcon|icon=NailItem Icon.png|border=yellow|size=128|count=2}}&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;col-xs-12 col-sm-2 col-md-1&amp;quot;&amp;gt;&amp;lt;i class=&amp;quot;fas fa-plus&amp;quot; style=&amp;quot;font-size:64px&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;col-xs-12 col-sm-4 col-md-3 col-lg-2&amp;quot;&amp;gt;{{Demo RecipeItemIcon|icon=FlaxseedOilItem_Icon.png|border=yellow|size=128|count=0.5}}&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;col-xs-12 col-sm-2 col-md-1&amp;quot;&amp;gt;&amp;lt;i class=&amp;quot;fas fa-plus&amp;quot; style=&amp;quot;font-size:64px&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;col-xs-12 col-sm-4 col-md-3 col-lg-2&amp;quot;&amp;gt;{{Demo RecipeItemIcon|icon=WoodBoard_Icon.png|border=yellow|size=128|count=10}}&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;col-xs-12 col-sm-2 col-md-1&amp;quot;&amp;gt;&amp;lt;i class=&amp;quot;fas fa-equals&amp;quot; style=&amp;quot;font-size:64px&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;col-xs-12 col-sm-4 col-md-3 col-lg-2&amp;quot;&amp;gt;{{Demo RecipeItemIcon|icon=LumberItem_Icon.png|size=128|count=2}}&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;templatedata&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;params&amp;quot;: {&lt;br /&gt;
		&amp;quot;size&amp;quot;: {&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;Size in pixels (numbers only)&amp;quot;,&lt;br /&gt;
			&amp;quot;example&amp;quot;: &amp;quot;64&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;number&amp;quot;,&lt;br /&gt;
			&amp;quot;suggestedvalues&amp;quot;: [&lt;br /&gt;
				&amp;quot;64&amp;quot;,&lt;br /&gt;
				&amp;quot;128&amp;quot;&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;default&amp;quot;: &amp;quot;64&amp;quot;,&lt;br /&gt;
			&amp;quot;autovalue&amp;quot;: &amp;quot;64&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;icon&amp;quot;: {&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;File name for icon.&amp;quot;,&lt;br /&gt;
			&amp;quot;example&amp;quot;: &amp;quot;DaisyItem_Icon.png&amp;quot;,&lt;br /&gt;
			&amp;quot;required&amp;quot;: true,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;count&amp;quot;: {&lt;br /&gt;
			&amp;quot;aliases&amp;quot;: [&lt;br /&gt;
				&amp;quot;num&amp;quot;&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;A number to display over this icon&#039;s image. Useful for showing counts.&amp;quot;,&lt;br /&gt;
			&amp;quot;example&amp;quot;: &amp;quot;10&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;number&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;border&amp;quot;: {&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;Border color&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
			&amp;quot;suggestedvalues&amp;quot;: [&lt;br /&gt;
				&amp;quot;white&amp;quot;,&lt;br /&gt;
				&amp;quot;yellow&amp;quot;,&lt;br /&gt;
				&amp;quot;green&amp;quot;&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;default&amp;quot;: &amp;quot;white&amp;quot;,&lt;br /&gt;
			&amp;quot;autovalue&amp;quot;: &amp;quot;white&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/templatedata&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>WugWugg</name></author>
	</entry>
	<entry>
		<id>https://wiki.play.eco/en/index.php?title=Template:Demo_RecipeItemIcon/styles.css&amp;diff=16352</id>
		<title>Template:Demo RecipeItemIcon/styles.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.play.eco/en/index.php?title=Template:Demo_RecipeItemIcon/styles.css&amp;diff=16352"/>
		<updated>2026-02-21T14:08:49Z</updated>

		<summary type="html">&lt;p&gt;WugWugg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* NOTE: The size of &#039;em&#039; is set in the template via inline styles setting &#039;font-size&#039; */&lt;br /&gt;
.recipe-item-icon {&lt;br /&gt;
	position: relative;&lt;br /&gt;
	width: fit-content;&lt;br /&gt;
	height: fit-content;&lt;br /&gt;
	overflow: hidden;&lt;br /&gt;
	border-width: clamp(3px, 0.05em, 8px);&lt;br /&gt;
	border-radius: clamp(4px, 0.1em, 16px);&lt;br /&gt;
	box-shadow:&lt;br /&gt;
	  0 0.04em 0.06em rgba(0,0,0,0.75),&lt;br /&gt;
	  0 0.09em 0.14em rgba(0,0,0,0.45);&lt;br /&gt;
	margin: 0.1em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.recipe-item-icon.border-white {&lt;br /&gt;
	background-color: white;&lt;br /&gt;
	border-color: white;&lt;br /&gt;
	border-style: solid;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.recipe-item-icon.border-yellow {&lt;br /&gt;
	background-color: yellow;&lt;br /&gt;
	border-color: yellow;&lt;br /&gt;
	border-style: solid;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.recipe-item-icon.border-green {&lt;br /&gt;
	background-color: lime;&lt;br /&gt;
	border-color: lime;&lt;br /&gt;
	border-style: solid;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.recipe-item-icon.has-count::after {&lt;br /&gt;
	content: &amp;quot;&amp;quot;;&lt;br /&gt;
	position: absolute;&lt;br /&gt;
	z-index: 1;&lt;br /&gt;
	bottom: 0;&lt;br /&gt;
	right: 0;&lt;br /&gt;
	width: 100%;&lt;br /&gt;
	height: 100%;&lt;br /&gt;
	/* Known Limit/Bug: When an icon has a count the icon&#039;s image link cannot be clicked*/&lt;br /&gt;
	/* Solution add pointer-events to this Wiki&#039;s supported CSS features*/&lt;br /&gt;
	/* pointer-events: none;*/&lt;br /&gt;
	background: linear-gradient(&lt;br /&gt;
		315deg,&lt;br /&gt;
		rgba(0,0,0,0.55) 0%,&lt;br /&gt;
		rgba(0,0,0,0.4) 28%,&lt;br /&gt;
		rgba(0,0,0,0.2) 35%,&lt;br /&gt;
		rgba(0,0,0,0) 42%&lt;br /&gt;
	);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*.recipe-item-icon__img-container {}*/&lt;br /&gt;
&lt;br /&gt;
.recipe-item-icon__img-container img {&lt;br /&gt;
	display: block;&lt;br /&gt;
	width: 100% !important;&lt;br /&gt;
	height: 100% !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.recipe-item-icon__count {&lt;br /&gt;
	position: absolute;&lt;br /&gt;
	z-index: 2;&lt;br /&gt;
	bottom: clamp(4px, 0.1em, 16px);&lt;br /&gt;
	right: clamp(4px, 0.1em, 16px);&lt;br /&gt;
	line-height: 1;&lt;br /&gt;
	color: #fff;&lt;br /&gt;
	text-shadow: 0 1px 2px rgba(0,0,0,0.85);&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
	font-size: 0.25em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Kill VE filler paragraph after the icon, only in the demo table */&lt;br /&gt;
.recipe-icon-demo td .recipe-item-icon + p {&lt;br /&gt;
  margin: 0 !important;&lt;br /&gt;
  line-height: 0 !important;&lt;br /&gt;
  height: 0 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.recipe-icon-demo td .recipe-item-icon + p &amp;gt; br {&lt;br /&gt;
  display: none;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>WugWugg</name></author>
	</entry>
	<entry>
		<id>https://wiki.play.eco/en/index.php?title=Template:Demo_RecipeItemIcon&amp;diff=16351</id>
		<title>Template:Demo RecipeItemIcon</title>
		<link rel="alternate" type="text/html" href="https://wiki.play.eco/en/index.php?title=Template:Demo_RecipeItemIcon&amp;diff=16351"/>
		<updated>2026-02-21T14:07:20Z</updated>

		<summary type="html">&lt;p&gt;WugWugg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;templatestyles src=&amp;quot;Template:Demo_RecipeItemIcon/styles.css&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;includeonly&amp;gt;&amp;lt;div class=&amp;quot;recipe-item-icon {{#if: {{{count|}}} | has-count }} {{#switch: {{{border|}}} | yellow = border-yellow | white = border-white | green = border-green | #default = border-white}}&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;recipe-item-icon__img-container&amp;quot;&amp;gt;[[File:{{{icon}}}]]&amp;lt;/div&amp;gt;&amp;lt;span class=&amp;quot;recipe-item-icon__count&amp;quot;&amp;gt;{{{count|}}}&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
=== Visual Goals ===&lt;br /&gt;
[[File:DaisyItem--Icon Yellow.png|frameless|border|upright=3|location=center|link=]]&lt;br /&gt;
[[File:DaisyItem--Icon White--No-Count.png|border|upright=3|location=center|link=]]&lt;br /&gt;
[[File:DaisyItem--Icon White.png|frameless|border|upright=3|location=center|link=]]&lt;br /&gt;
[[File:DaisyItem--Icon White--100.png|border|upright=3|location=center|link=]]&lt;br /&gt;
&lt;br /&gt;
=== Template Examples ===&lt;br /&gt;
{| class=&amp;quot;wikitable recipe-icon-demo&amp;quot;&lt;br /&gt;
|+ Border Colors&lt;br /&gt;
! Color !! Example&lt;br /&gt;
|-&lt;br /&gt;
| White &#039;&#039;(Default)&#039;&#039; ||{{Demo RecipeItemIcon|icon=DaisyItem_Icon.png}}&lt;br /&gt;
|-&lt;br /&gt;
| Yellow ||{{Demo RecipeItemIcon|icon=DaisyItem_Icon.png|border=yellow}}&lt;br /&gt;
|-&lt;br /&gt;
| Green ||{{Demo RecipeItemIcon|icon=DaisyItem_Icon.png|border=green}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable recipe-icon-demo&amp;quot;&lt;br /&gt;
|+ Responsive Sizing&lt;br /&gt;
! Size !! Example&lt;br /&gt;
|-&lt;br /&gt;
| 64px &#039;&#039;(Default)&#039;&#039; ||{{Demo RecipeItemIcon|icon=DaisyItem_Icon.png|count=10|size=64}}&lt;br /&gt;
|-&lt;br /&gt;
| 128px ||{{Demo RecipeItemIcon|icon=DaisyItem_Icon.png|count=10|size=128}}&lt;br /&gt;
|-&lt;br /&gt;
| 256px ||{{Demo RecipeItemIcon|icon=DaisyItem_Icon.png|count=10|size=256}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable recipe-icon-demo&amp;quot;&lt;br /&gt;
|+ Count Shadow&lt;br /&gt;
! Count !! Example&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;No Count/Shadow&#039;&#039; ||{{Demo RecipeItemIcon|icon=DaisyItem_Icon.png}}&lt;br /&gt;
|-&lt;br /&gt;
| 10 ||{{Demo RecipeItemIcon|icon=DaisyItem_Icon.png|count=10}}&lt;br /&gt;
|-&lt;br /&gt;
| 100 ||{{Demo RecipeItemIcon|icon=DaisyItem_Icon.png|count=100}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Grid Demo ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row g-2 mb-3&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;col-xs-12 col-sm-6 col-md-4 col-lg-3&amp;quot;&amp;gt;{{Demo RecipeItemIcon|icon=DaisyItem_Icon.png|count=100|size=128}}&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;col-xs-12 col-sm-6 col-md-4 col-lg-3&amp;quot;&amp;gt;{{Demo RecipeItemIcon|icon=TulipItem Icon.png|count=100|border=yellow|size=128}}&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;col-xs-12 col-sm-6 col-md-4 col-lg-3&amp;quot;&amp;gt;{{Demo RecipeItemIcon|icon=LupineItem Icon.png|size=128}}&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;col-xs-12 col-sm-6 col-md-4 col-lg-3&amp;quot;&amp;gt;{{Demo RecipeItemIcon|icon=RoseItem Icon.png|count=10|border=yellow|size=128}}&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;col-xs-12 col-sm-6 col-md-4 col-lg-3&amp;quot;&amp;gt;{{Demo RecipeItemIcon|icon=FlaxFlowerItem Icon.png|count=67|border=green|size=128}}&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;col-xs-12 col-sm-6 col-md-4 col-lg-3&amp;quot;&amp;gt;{{Demo RecipeItemIcon|icon=Flower Icon.png|border=green|size=128}}&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;col-xs-12 col-sm-6 col-md-4 col-lg-3&amp;quot;&amp;gt;{{Demo RecipeItemIcon|icon=EcoBookItem Icon.png|size=128}}&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;col-xs-12 col-sm-6 col-md-4 col-lg-3&amp;quot;&amp;gt;{{Demo RecipeItemIcon|icon=RiceFlourItem Icon.png|border=green|size=128}}&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;col-xs-12 col-sm-6 col-md-4 col-lg-3&amp;quot;&amp;gt;{{Demo RecipeItemIcon|icon=NailItem Icon.png|border=yellow|size=128}}&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;col-xs-12 col-sm-6 col-md-4 col-lg-3&amp;quot;&amp;gt;{{Demo RecipeItemIcon|icon=AdobeItem Icon.png|border=green|size=128}}&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;col-xs-12 col-sm-6 col-md-4 col-lg-3&amp;quot;&amp;gt;{{Demo RecipeItemIcon|icon=JoshuaLogItem Icon.png|size=128}}&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;col-xs-12 col-sm-6 col-md-4 col-lg-3&amp;quot;&amp;gt;{{Demo RecipeItemIcon|icon=IronOreItem Icon.png|border=yellow|size=128}}&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Recipe Demo ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row g-2 mb-3 align-items-center justify-content-center&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;col-xs-12 col-sm-4 col-md-3 col-lg-2&amp;quot;&amp;gt;{{Demo RecipeItemIcon|icon=NailItem Icon.png|border=yellow|size=128|count=2}}&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;col-xs-12 col-sm-2 col-md-1&amp;quot;&amp;gt;&amp;lt;i class=&amp;quot;fas fa-plus&amp;quot; style=&amp;quot;font-size:64px&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;col-xs-12 col-sm-4 col-md-3 col-lg-2&amp;quot;&amp;gt;{{Demo RecipeItemIcon|icon=FlaxseedOilItem_Icon.png|border=yellow|size=128|count=0.5}}&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;col-xs-12 col-sm-2 col-md-1&amp;quot;&amp;gt;&amp;lt;i class=&amp;quot;fas fa-plus&amp;quot; style=&amp;quot;font-size:64px&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;col-xs-12 col-sm-4 col-md-3 col-lg-2&amp;quot;&amp;gt;{{Demo RecipeItemIcon|icon=WoodBoard_Icon.png|border=yellow|size=128|count=10}}&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;col-xs-12 col-sm-2 col-md-1&amp;quot;&amp;gt;&amp;lt;i class=&amp;quot;fas fa-equals&amp;quot; style=&amp;quot;font-size:64px&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;col-xs-12 col-sm-4 col-md-3 col-lg-2&amp;quot;&amp;gt;{{Demo RecipeItemIcon|icon=LumberItem_Icon.png|size=128|count=2}}&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;templatedata&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;params&amp;quot;: {&lt;br /&gt;
		&amp;quot;size&amp;quot;: {&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;Size in pixels (numbers only)&amp;quot;,&lt;br /&gt;
			&amp;quot;example&amp;quot;: &amp;quot;64&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;number&amp;quot;,&lt;br /&gt;
			&amp;quot;suggestedvalues&amp;quot;: [&lt;br /&gt;
				&amp;quot;64&amp;quot;,&lt;br /&gt;
				&amp;quot;128&amp;quot;&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;default&amp;quot;: &amp;quot;64&amp;quot;,&lt;br /&gt;
			&amp;quot;autovalue&amp;quot;: &amp;quot;64&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;icon&amp;quot;: {&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;File name for icon.&amp;quot;,&lt;br /&gt;
			&amp;quot;example&amp;quot;: &amp;quot;DaisyItem_Icon.png&amp;quot;,&lt;br /&gt;
			&amp;quot;required&amp;quot;: true,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;count&amp;quot;: {&lt;br /&gt;
			&amp;quot;aliases&amp;quot;: [&lt;br /&gt;
				&amp;quot;num&amp;quot;&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;A number to display over this icon&#039;s image. Useful for showing counts.&amp;quot;,&lt;br /&gt;
			&amp;quot;example&amp;quot;: &amp;quot;10&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;number&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;border&amp;quot;: {&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;Border color&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
			&amp;quot;suggestedvalues&amp;quot;: [&lt;br /&gt;
				&amp;quot;white&amp;quot;,&lt;br /&gt;
				&amp;quot;yellow&amp;quot;,&lt;br /&gt;
				&amp;quot;green&amp;quot;&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;default&amp;quot;: &amp;quot;white&amp;quot;,&lt;br /&gt;
			&amp;quot;autovalue&amp;quot;: &amp;quot;white&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/templatedata&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>WugWugg</name></author>
	</entry>
</feed>