Intermediário 💬 Social

Criando Interações Personalizadas

Aprenda a criar interações entre Sims, incluindo menus, testes de validade e execução.

⏱️ 60 minutos 📊 Nível: Intermediário
🎯 Objetivo

Criar uma interação social completa que aparece no menu de interações, testa condições e executa ações quando selecionada.

1️⃣

Estrutura da Interação

Uma interação completa tem duas partes principais:

InteractionDefinition

Define o nome, menu path, testes de validade e cria instâncias.

SocialInteraction

Contém a lógica de execução (método Run).

2️⃣

Código Completo da Interação

using System;
using Sims3.Gameplay.Actors;
using Sims3.Gameplay.Interactions;
using Sims3.Gameplay.Socializing;
using Sims3.Gameplay.Utilities;
using Sims3.SimIFace;

namespace SeuMod.Interactions
{
    public class OlaPersonalizado : SocialInteraction
    {
        // Singleton da definição
        public static readonly InteractionDefinition Singleton;
        
        static OlaPersonalizado()
        {
            Singleton = new Definition();
        }

        // Método executado quando a interação roda
        public override bool Run()
        {
            try
            {
                // 1. Entrar na postura social
                Actor.EnterSocializingPosture(Target);
                
                // 2. Configurar sistema social
                Actor.SocialComponent.UpdateUI = false;
                Target.SocialComponent.UpdateUI = false;
                Actor.SocialComponent.StartSocializingWith(Target);
                
                // 3. Iniciar interação social
                if (BeginSocialInteraction(
                    new SocialInteractionB.Definition(null, "ola", false),
                    pairedSocial: true,
                    doCallOver: false))
                {
                    // 4. Atualizar relacionamento (+10 LTR)
                    Relationship rel = Relationship.Get(Actor, Target, true);
                    if (rel != null && rel.LTR != null)
                    {
                        rel.LTR.UpdateLikingAndShowLikingVFX(10.0f, Actor, Target);
                    }
                    
                    // 5. Adicionar buff de felicidade
                    Target.BuffManager.AddElement(
                        BuffNames.Happy,
                        Origin.FromCustomSource
                    );
                    
                    // 6. Finalizar
                    EndCommodityUpdates(true);
                }
            }
            catch (Exception ex)
            {
                // Log erro
            }
            return true;
        }

        // Definição da interação
        public class Definition : InteractionDefinition<Sim, Sim, OlaPersonalizado>
        {
            // Nome exibido no menu
            public override string GetInteractionName(Sim actor, Sim target, InteractionObjectPair iop)
            {
                return "Olá Personalizado";
            }

            // Caminho do menu (ex: Amigável... → Olá Personalizado)
            public override string[] GetPath(bool isFemale)
            {
                return new string[] { "Amigável..." };
            }

            // Testes de validade
            protected override bool Test(Sim actor, Sim target, bool isAutonomous, ref GreyedOutTooltipCallback greyedOutTooltipCallback)
            {
                // Não pode ser em si mesmo
                if (target == actor) return false;
                
                // Precisa ser Teen ou acima
                if (!target.SimDescription.TeenOrAbove) return false;
                
                // Precisa estar na mesma casa ou lote
                if (!actor.IsOnSameLot(target)) return false;
                
                // Relacionamento mínimo (opcional)
                Relationship rel = Relationship.Get(actor, target, false);
                if (rel != null && rel.LTR.Liking < -50f) return false;
                
                return true;
            }
        }
    }
}
3️⃣

Adicionando a Interação ao Jogo

No seu ModMain.cs, adicione a interação aos Sims:

public static void AddInteractions(Sim sim)
{
    if (sim == null) return;

    // Adicionar interação a todos os Sims que o Sim encontrar
    sim.AddInteraction(OlaPersonalizado.Singleton);
}
💡 Dica

Use sim.AddInteraction() no callback OnWorldLoadFinished para adicionar interações quando o mundo carregar.

4️⃣

Testes de Validade Comuns

Teste Código
Mesmo lote actor.IsOnSameLot(target)
Teen ou acima target.SimDescription.TeenOrAbove
É humano target.IsHuman
Relacionamento > 50 rel.LTR.Liking >= 50f
Não é roomie !target.IsRoomie
É casado target.MarriagePartner != null