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.
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).
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;
}
}
}
}
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.
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 |