Iniciante 📁 Projeto C#

Estrutura Básica de um Mod

Configure seu ambiente, crie o projeto e entenda a estrutura fundamental de um mod de script puro.

⏱️ 30-40 minutos 📊 Nível: Fundamentos
🎯 Objetivo

Criar um mod que usa o padrão [Tunable] + World.OnWorldLoadFinishedEventHandler para executar código automaticamente quando o mundo carrega.

1️⃣

Configurando o Projeto

Crie um Novo Projeto

Abra o Visual Studio e crie um novo projeto Class Library (Biblioteca de Classes) em C#.

💡 Framework Target

Use .NET Framework 3.5 ou .NET Framework 2.0. O The Sims 3 foi construído sobre estas versões.

Referencie as DLLs do Jogo

Adicione referências às seguintes DLLs:

📁 Referências:
  ├── ScriptCore.dll
  ├── SimIFace.dll
  ├── Sims3GameplaySystems.dll
  ├── Sims3GameplayObjects.dll
  ├── UI.dll
  ├── mscorlib.dll
  ├── System.dll
  └── System.Core.dll
2️⃣

AssemblyInfo.cs com [Tunable]

Adicione o atributo [assembly: Tunable] para permitir que o jogo leia suas variáveis via XML:

using System.Reflection;
using System.Runtime.InteropServices;
using Sims3.SimIFace;

[assembly: Tunable]
[assembly: Guid("12345678-1234-1234-1234-123456789abc")]
⚠️ Importante

Sem o atributo [Tunable] no assembly, o jogo NÃO conseguirá ler suas variáveis via XML e o mod não será inicializado.

3️⃣

Classe Principal (ModMain.cs)

using System;
using Sims3.Gameplay;
using Sims3.Gameplay.Actors;
using Sims3.SimIFace;

namespace SeuNamespace
{
    public static class ModMain
    {
        // Esta variável é lida pelo XML de tuning
        [Tunable]
        internal static bool kInstantiator = false;

        // Construtor estático - executado quando a classe é inicializada
        static ModMain()
        {
            // Registra o callback para quando o mundo terminar de carregar
            World.sOnWorldLoadFinishedEventHandler += new EventHandler(OnWorldLoadFinished);
        }

        // Método chamado quando o mundo termina de carregar
        private static void OnWorldLoadFinished(object sender, EventArgs e)
        {
            try
            {
                // Seu código aqui!
                Sim[] sims = World.GetObjects<Sim>();
                foreach (Sim sim in sims)
                {
                    if (sim != null && sim.SimDescription.TeenOrAbove)
                    {
                        AddInteractions(sim);
                    }
                }
            }
            catch (Exception ex)
            {
                // Log de erro
            }
        }

        public static void AddInteractions(Sim sim)
        {
            if (sim == null) return;
            // Adicionar interações personalizadas
        }
    }
}
4️⃣

Arquivo de Tuning XML

Crie um arquivo SeuMod+Instantiator.tuning na pasta ITUN/:

<?xml version="1.0" encoding="utf-8"?>
<C>
  <T n="SeuNamespace.ModMain,SeuMod">
    <L n="_TunableFields">
      <T>kInstantiator</T>
    </L>
    <T n="kInstantiator" type="Boolean">true</T>
  </T>
</C>
💡 Como Funciona

O XML define que a classe SeuNamespace.ModMain tem um campo tunable chamado kInstantiator. Quando o jogo lê o XML e tenta atribuir true, o .NET inicializa a classe, disparando o construtor estático.

5️⃣

Compilar e Empacotar

Compile o Projeto

# No Windows (Visual Studio)
# Build → Build Solution

# No Linux/Mono
xbuild /p:Configuration=Release SeuMod.csproj

Crie o Package (.package)

Use o S3PE para criar o arquivo package:

  1. Abra o S3PE e crie um novo arquivo
  2. Adicione um recurso do tipo S3SA (Script Assembly)
  3. Importe sua DLL compilada
  4. Adicione um recurso do tipo ITUN (Tuning)
  5. Importe seu arquivo XML
  6. Salve como SeuMod.package

Checklist Final

  • ✅ Projeto configurado com .NET 3.5
  • ✅ DLLs do jogo referenciadas
  • [assembly: Tunable] no AssemblyInfo
  • ✅ Classe com campo [Tunable] estático
  • ✅ Construtor estático registrando evento
  • ✅ Arquivo XML ITUN configurado
  • ✅ Package montado no S3PE