O Sim BR Fórum - The Sims 3 - The Sims 4 - Downloads - Download - Códigos / Cheats - Tutoriais - Fórum - Notícias
IPB

Bem-vindo, visitante ( Entrar | Registrar )

 
Reply to this topicStart new topic
Criando MODs avançados em C# (Parte 4), Hora das Interações!
Daniel
post 01/02/14, 20:17
Post #1


The Sims 4 Ao Trabalho
**************

Grupo: Membros
Posts: 2272
Registrado: 07/07/13
Membro N°: 265976



Atenção:
Criando MODs avançados em C# (Parte 1)
-> Preparando ambiente de trabalho e arquivos.


Criando MODs avançados em C# (Parte 2)
-> Criando um Projeto compatível.


Criando MODs avançados em C# (Parte 3)
-> Criando o primeiro MOD!

-----------------------------

Muito bem. Estamos nos aprofundando cada vez mais nos códigos do The Sims 3. Neste tutorial, iremos ter muitos resultados interessantes. Além das funções do The Sims 3, irei ensinar como criar as suas próprias funções para auxiliar em seu Projeto!

Metas: criar e adicionar interações nos Sims; aprender a base das interações;
-----------------------------


1. A base da Base

Você irá criar um projeto compatível (Parte 2) e irá aproveitar o código feito na Parte 3.

Relembrando:
-> use um namespace próprio, tendo certeza que o nome escolhido não exista.
-> também, na sua booleana, use um nome próprio.

Assim como eu já disse, o código base será o mesmo feito na Parte 3:
CODE
using System;
using System.Collections.Generic;
using System.Text;
using Sims3.SimIFace;
using Sims3.Gameplay.Core;
using Sims3.Gameplay.Interactions;

namespace NomeDoSeuNamespace
{
    public class NomeDaSuaClassPrincipal
    {
        [Tunable]
        public static bool NomeDaSuaBooleana;

        static NomeDaSuaClassPrincipal()
        {
            World.OnWorldLoadFinishedEventHandler += new EventHandler(OnWorldLoadFinished);
        }//static

        private static void OnWorldLoadFinished(object sender, EventArgs e)
        {
        }//OnWorldLoadFinished

    }//ClassMestre
}//namespace


A única alteração que eu fiz, foi remover o auto testingcheatsenabled true (Commands.EnableTestingCheats();) encontrado dentro de OnWorldLoadFinished. Isso fica ao seu critério.

Meu projeto está dessa forma:


[A]: Novas definições
-----------------------------

Dependendo do que o seu MOD irá fazer, precisamos adicionar novas definições. Se lembra o que são? Definições são os termos using no começo do código.

Além das definições que o seu código já tem, logo abaixo, coloque as novas definições:
CODE
using Sims3.Gameplay;
using Sims3.Gameplay.Actors;
using Sims3.Gameplay.Autonomy;
using Sims3.Gameplay.EventSystem;
using Sims3.Gameplay.Utilities;
using Sims3.UI;


- Por que usar novas definições?
R: Cada definição traz muitas funções específicas.
Como por exemplo, a definição using Sims3.Gameplay.Actors; traz consigo os Sims e suas funções.

- E se eu não adicionar novas definições?
R: Seu código irá dar erro, não será possível continuar nem gerar a DLL.

[B]: Como saber quais definições usar?
-----------------------------

Eu vou utilizar meus próprios termos para criar uma explicação. Pois de qualquer forma, se você não tentar descobrir, nunca irá conseguir aprender nada, nem mesmo com meus esforços.

Você sabe o que significa:
QUOTE
using Sims3.Gameplay.Actors;

Sabe? Isso nada mais é do que um namespace! Todas as Classes que tiverem o namespace Sims3.Gameplay.Actors serão chamadas. Dessa vez você já começa a entender um pouco mais como são as definições.

Olhe essa foto de tela:


Observe que todas as Classes ali tem o mesmo namespace: Sims3.Gameplay.Actors
Portanto, quando usamos a definição: using Sims3.Gameplay.Actors todas aquelas classes vieram junto.

[C]: Agora como sei as funções de cada DLL do TS3?
-----------------------------

Já sabemos como as definições funcionam, agora precisamos saber quando usa-las. Para tal, antes de mais nada, é necessário saber a função de cada DLL que extraímos do The Sims 3.

DLLs e suas funções:

ScriptCore
Namespace: ScriptCore
Suas classes contêm: a interface do núcleo de Scripts e a Engine do Jogo;

Sims3GameplaySystems
Namespace: existem muitos, todos começam com: Sims3.Gameplay
Suas classes contêm: seu nome já é auto-explicativo, contêm os sistemas do modo de Simulação (como por exemplo: as necessidades), além dos próprios Sims em si. Por algum motivo, algumas funções de objetos são encontradas aqui;

Sims3GameplayObjects
Namespace: existem muitos, todos começam com: Sims3.Gameplay.Objects
Suas classes contêm: todas as funções dos Objetos do Jogo. Assim como já foi dito, algumas funções são encontradas em Sims3GameplaySystems, isso ocorre por algum motivo de desorganização desconhecido da EA.

Sims3MetaData
Namespace: existem 4, todos começam com: Sims3.Metadata
Suas classes contêm: contêm a codificação para a manipulação de compositores de textura, tons de pele etc.;

SimIFace
Namespace: existem muitos, todos começam com: Sims3.SimIFace
Suas classes contêm: a interface entre ScriptCore entre outras DLLs (eu não entendo muito o seu funcionamento);

UI
Namespace: existem muitos, todos começam com: Sims3.UI
Suas classes contêm: um pouco da parte gráfica passa por aqui. Cuida do estilo das janelas do Jogo, até mesmo do CAS;

Sims3StoreObjects
Namespace: existem muitos, todos começam com: Sims3.Store.Objects
Suas classes contêm: as funções dos Objetos da Store estão aqui. Eles não ficam juntos com os outros objetos;

[b]mscorlib, [b]System.Xml
e System
Não são do The Sim 3. São DLLs do .NET

[D]: Como posso ver as Classes que existem nas DLLs?
-----------------------------

Isso é muito importante! Não basta saber qual a função de cada uma, é necessário ver na prática as classes que existem e dar uma olhada em suas respectivas funções.

Na Parte 1 existe o link para download do programa ILSPY, ele é um descompilador gratuito de DLLs. Abra ele, vá até ao menu superior File > Abrir. Na nova Janela, selecione todas as DLLs do The Sims 3. Pronto, agora fuce bastante.

2. Iniciando a base

Com todas as informações necessárias explicadas e ensinadas é hora de dar continuidade.
Dentro de OnWorldLoadFinishedHandler adicione a seguinte função:

CODE
foreach (Sim Sims in Sims3.Gameplay.Queries.GetObjects<Sim>())
            {
                if (Sims != null)
                {
                    AdicionarInteracao(Sims);
                }
            }//foreach


A função Foreach (saiba mais aqui e aqui) é um laço de repetição. O que isso faz? A função fica se repetindo até mandarmos ela parar. Neste código acima, estamos Selecionando todos os Sims encontrados na vizinhança. Na verdade, os Sims não são selecionados de uma só vez. Irá se executar uma vez, seleciona um Sim, seleciona o próximo, o próximo [...] até acabar os Sims. Não se preocupe, tudo isso é executado em menos de um segundo.

Então, a primeira linha foreach (Sim Sims in Sims3.Gameplay.Queries.GetObjects<Sim>()) encontra um Sim e o armazena na variável Sims. Na terceira linha temos uma condição if (saiba mais.) Essa condição verifica se o Sim que está na variável Sims é válido, se sim, o código continua e chama a função AdicionarInteracao(Sims).

E agora? Agora o código volta na primeira linha, e começa tudo tudo de novo... até acabar todos os Sims.

A função AdicionarInteracao(Sims) não é do The Sims 3 (você já deve ter notado que está em português), e sim, nossa. Iremos criar a nossa própria função. Eu vou explicar como é simples criar a sua própria no fim deste tutorial, ou em outro. Perceba que entre parênteses colocamos a variável Sims. O que isso significa? Estamos enviando o Sim selecionado para outra função, isso é muito útil em questões de organização e produtividade. Não pense que é só abrir parênteses e escrever qualquer coisa, em AdicionarInteracao() está definido o que pode colocar em parênteses, isso também será ensinando em breve.

Continuando. Agora fora de OnWorldLoadFinishedHandler iremos criar nossa nova função:
CODE
public static void AdicionarInteracao(Sim Sims)
        {
            Sims.AddInteraction(PrimeiraInteracao.Singleton);
        }//AdicionarInteracao


Quando se cria uma função que precisa de dados externos, ou seja, uma outra função irá fornecer valores, temos que definir que tipo de dados será inserido entre parênteses. Veja: (Sim Sims). O primeiro termo é o tipo de valor, no caso, só podemos inserir Sims, o segundo termo é o nome que ele ira receber, isso não influência em nada.

[A]: Me explique um pouco sobre Funções!
-----------------------------
Conceitos básicos:
Dados do tipo texto, se chamam String;
Dados do tipo numérico, se chamam int;
[...]

O que isso quer dizer? Veja esse exemplo:
CODE
public static void MinhaFuncao()
{
FazerContasDeMais(5, 10);
}

public static int FazerContaDeMais (int Valor1, int Valor2)
{
  int Resultado = Valor1 + Valor2;
  return Resultado;
}


Isso é um exemplo muito simples. Quando criei a função FazerContaDeMais, eu defini que ela depende de dados externos enviados de outra função. Também defini que esses dados são do tipo int, ou seja, só podem ser números. Você pode usar quantos termos quiser entre parênteses, cada um tem que ter um nome diferente.

Então, em MinhaFuncao eu quis fazer uma conta utilizando a nova função, simplesmente chamei ela FazerContasDeMais() e forneci os seus dados, no caso os números que eu quero somar: FazerContasDeMais(5, 10);

Se você se perguntar: Hmmm.... mas por que você criou uma função para isso?
É bem simples, uma função, pode ser chamada mais de uma vez, economizando muito código:
CODE
public static void MinhaFuncao()
{
FazerContasDeMais(5, 10);
FazerContasDeMais(9, 30);
FazerContasDeMais(462, 45453);
}


Se eu não usasse a função, e mesmo assim eu quisesse fazer contas... olhe só o que iria virar:
CODE
public static void MinhaFuncao()
{
int numero1;
int numero2;
int resultado;

numero1 = 5;
numero2 = 10;
resultado = numero1 + numero2;

numero1 = 9;
numero2 = 30;
resultado = numero1 + numero2;

numero1 = 162;
numero2 = 45453;
resultado =  numero1 + numero2;

12 linhas de código e no outro exemplo apenas 3 linhas. Já ficou bem claro, certo? Não se preocupe que ainda irá chegar uma parte só ensinando fazer funções.
}

-----------------------------

Voltando ao Foco...
Na nova função, nesta linha Sims.AddInteraction(PrimeiraInteracao.Singleton); estamos usando outra função dos Sims, a AddInteraction, nem preciso explicar o que ela faz, certo? Entre parênteses temos que definir o nome que a nossa interação irá ter, no meu caso: PrimeiraInteracao. Esse nome só serve para orientação via-código, o nome que irá aparecer no Jogo será definido daqui a pouco.

AddInteraction já é uma função do The Sims 3.
Até aqui, temos uma base: o Jogo seleciona todos os Sims e adiciona uma interação. Portanto, agora precisamos programar a interação!

O meu código até agora está assim:

CODE
using System;
using System.Collections.Generic;
using System.Text;
using Sims3.SimIFace;
using Sims3.Gameplay.Core;
using Sims3.Gameplay.Interactions;
using Sims3.Gameplay;
using Sims3.Gameplay.Actors;
using Sims3.Gameplay.Autonomy;
using Sims3.Gameplay.EventSystem;
using Sims3.Gameplay.Utilities;
using Sims3.UI;

namespace DanielOSimBr_MinhaPrimeiraInteracao
{
    public class ClasseMestre
    {
        [Tunable]
        public static bool kAtivador;

        static ClasseMestre()
        {
            World.OnWorldLoadFinishedEventHandler += new EventHandler(OnWorldLoadFinished);
        }//static

        private static void OnWorldLoadFinished(object sender, EventArgs e)
        {
            foreach (Sim Sims in Sims3.Gameplay.Queries.GetObjects<Sim>())
            {
                if (Sims != null)
                {
                    AdicionarInteracao(Sims);
                }
            }//foreach
        }//OnWorldLoadFinished

        public static void AdicionarInteracao(Sim Sims)
        {
            Sims.AddInteraction(PrimeiraInteracao.Singleton);

        }//AdicionarInteracao

    }//ClassMestre
}//namespace


3. Estrutura de uma Interação

Fico feliz por ter chegado nessa parte. A explicação do namespace irá fazer tanto sentido aqui... você vai ver!
Como eu já disse, a bendita base para as interações já está criada. Definimos um nome, que no meu caso é PrimeiraInteracao. O Jogo já irá reconhecer, mas agora ele precisa encontrar a programação dessa interação. A base das interações para SIMS é essa:

QUOTE
public sealed class NomeDaInteracao: ImmediateInteraction<Sim, Sim>{

public static readonly InteractionDefinition Singleton = new Definition();

protected override bool Run(){
return true;
}


[DoesntRequireTuning]
private sealed class Definition : ImmediateInteractionDefinition<Sim, Sim, NomeDaInteracao>{

protected override string GetInteractionName(Sim a, Sim target, InteractionObjectPair interaction){
return "Nome da interação que ira aparecer no Jogo";
}


protected override bool Test(Sim a, Sim target, bool isAutonomous, ref GreyedOutTooltipCallback greyedOutTooltipCallback){
return true;
}
}
}


Compreendendo:

Existem dois lugares em que aparece: NomeDaInteracao. Você irá substituir ambos pelo nome que está definido no código base, dentro de AdicionarInteracao(). Você se lembra que no meu caso eu defini o nome como: PrimeiraInteracao? Então é esse nome que irá para o código.

Em:
CODE
protected override bool Run(){

return true;
}

É o coração da interação! Quando você clicar no Sim, e depois na interação, o Jogo irá executar tudo o que estiver dentro dessa função. Ou seja, tudo o que acontece em qualquer interação do Jogo, está dentro de protected override bool Run(), até mesmo nas interações de objetos. Essa função, independente do que você fizer, sempre terá que ter return true;.
-----------------------------

Em:
CODE
protected override string GetInteractionName(Sim a, Sim target, InteractionObjectPair interaction){
return "Nome da interação que ira aparecer no Jogo";
}

Tudo o que estiver após return e entre aspas, é o nome da interação que irá aparecer no Jogo. Mais uma explicação: em qualquer linguagem de programação, textos/frases/palavras que não são códigos, sempre devem ficar entre aspas. wink.gif

Por exemplo, a interação Beijar, está assim:
CODE
protected override string GetInteractionName(Sim a, Sim target, InteractionObjectPair interaction){
return "Beijar";
}


Mais um exemplo, a interação Roubar alguma coisa, está dessa forma:
CODE
protected override string GetInteractionName(Sim a, Sim target, InteractionObjectPair interaction){
return "Roubar alguma coisa";
}

-----------------------------

4. Hora da ação!

Cada interação que for feita, será criada uma nova classe e será colado o código base das interações.
Vamos começar criando uma Classe para a primeira interação:

-> No seu projeto, pressione: Shift + Alt + C;
-> Na nova Janela, selecione Class;
-> Logo abaixo, no campo Name, escolha um nome. Lembre-se que ele não irá interferir em nada, certifique-se de manter a extensão .cs;
-> Em seguida clique em Add;

Apague todo o código da nova Classe, deixe-o em branco.
Precisamos das definições, copie e cole as da Classe Mestre:
CODE
using System;
using System.Collections.Generic;
using System.Text;
using Sims3.SimIFace;
using Sims3.Gameplay.Core;
using Sims3.Gameplay.Interactions;
using Sims3.Gameplay;
using Sims3.Gameplay.Actors;
using Sims3.Gameplay.Autonomy;
using Sims3.Gameplay.EventSystem;
using Sims3.Gameplay.Utilities;


Agora o namespace deve ser o mesmo da Classe Mestre, toda as outras classes deverão ter o mesmo. Desta forma, pode-se dizer, que estamos fazendo uma união. No meu caso, fica desta forma:
CODE
namespace DanielOSimBr_MinhaPrimeiraInteracao


O código da minha nova Classe está assim:
CODE
using System;
using System.Collections.Generic;
using System.Text;
using Sims3.SimIFace;
using Sims3.Gameplay.Core;
using Sims3.Gameplay.Interactions;
using Sims3.Gameplay;
using Sims3.Gameplay.Actors;
using Sims3.Gameplay.Autonomy;
using Sims3.Gameplay.EventSystem;
using Sims3.Gameplay.Utilities;

namespace DanielOSimBr_MinhaPrimeiraInteracao{

}


Dentro do namespace, cole o código base das interações.
Agora, substitua NomeDaInteracao pelo nome definido na Classe Mestre. No meu caso: PrimeiraInteracao.

Em GetInteractionName defina o nome que irá aparecer no Jogo. A minha interação irá se chamar: "Gerar Simoleons".

Com todas as modificações feitas, seu código final estará mais ou menos assim:
CODE
using System;
using System.Collections.Generic;
using System.Text;
using Sims3.SimIFace;
using Sims3.Gameplay.Core;
using Sims3.Gameplay.Interactions;
using Sims3.Gameplay;
using Sims3.Gameplay.Actors;
using Sims3.Gameplay.Autonomy;
using Sims3.Gameplay.EventSystem;
using Sims3.Gameplay.Utilities;

namespace DanielOSimBr_MinhaPrimeiraInteracao{

    public sealed class PrimeiraInteracao : ImmediateInteraction<Sim, Sim>
    {

        public static readonly InteractionDefinition Singleton = new Definition();

        protected override bool Run()
        {
            return true;
        }

        [DoesntRequireTuning]
        private sealed class Definition : ImmediateInteractionDefinition<Sim, Sim, PrimeiraInteracao>
        {

            protected override string GetInteractionName(Sim a, Sim target, InteractionObjectPair interaction)
            {
                return "Gerar Simoleons";
            }

            protected override bool Test(Sim a, Sim target, bool isAutonomous, ref GreyedOutTooltipCallback greyedOutTooltipCallback)
            {
                return true;
            }
        }
    }
}


Esse tutorial é só uma base para você prosseguir sozinho. Note que em Run() não tem nada, ou seja, quando clicar na interação nada irá acontecer. Mas você deve ter achado o nome Gerar Simoleons bem auto-explicativo sobre o que iremos fazer, certo? Essa interação irá gerar §50.00 Simoleons para o Sim clicado.

Agora todo o código a seguir irá ocorrer quando a interação for executada, tudo dentro de protected override bool Run().

Conceitos básicos:
base.Actor é o Sim que executa a interação;
Target é o Sim clicado;

Qual a diferença?! É bem simples: se algo irá acontecer apenas com o Sim clicado, iremos usar Target, ou se algo for acontecer apenas com o Sim que executa a interação, iremos usar base.Actor.

Como eu disse, o Sim clicado irá receber 50 mil Simoleons, então iremos usar Target.
Daqui em diante é fundamental fuçar. Comece escrevendo dentro de Run():
CODE
Target.

Veja que ao colocar um ponto, apareceu MUITAS funções dos Sims. Como iremos mexer com Simoleons, isso está relacionado a família ativa. Nos códigos, a família ativa é chamada de Household.

Continue:
CODE
Target.Household.

Mais um ponto, agora irá aparecer as funções em relação a família do Sim clicado. Para Adicionar ou Remover Simoleons, iremos usar SetFamilyFunds.

Continue:
CODE
Target.Household.SetFamilyFunds

Neste momento nos deparamos com uma função que necessita de dados externos, se lembra?! Como iremos dar §50.00 Simoleons, entre parênteses fica: (+50000), sem pontos. Caso for retirar Simoleons, coloque um sinal de menos: (-50000).

Portanto:
CODE
Target.Household.SetFamilyFunds(+50000);


Código final:
CODE
using System;
using System.Collections.Generic;
using System.Text;
using Sims3.SimIFace;
using Sims3.Gameplay.Core;
using Sims3.Gameplay.Interactions;
using Sims3.Gameplay;
using Sims3.Gameplay.Actors;
using Sims3.Gameplay.Autonomy;
using Sims3.Gameplay.EventSystem;
using Sims3.Gameplay.Utilities;

namespace DanielOSimBr_MinhaPrimeiraInteracao
{

    public sealed class PrimeiraInteracao : ImmediateInteraction<Sim, Sim>
    {

        public static readonly InteractionDefinition Singleton = new Definition();

        protected override bool Run()
        {
            Target.Household.SetFamilyFunds(+50000);
            return true;
        }

        [DoesntRequireTuning]
        private sealed class Definition : ImmediateInteractionDefinition<Sim, Sim, PrimeiraInteracao>
        {

            protected override string GetInteractionName(Sim a, Sim target, InteractionObjectPair interaction)
            {
                return "Gerar Simoleons";
            }

            protected override bool Test(Sim a, Sim target, bool isAutonomous, ref GreyedOutTooltipCallback greyedOutTooltipCallback)
            {
                return true;
            }
        }
    }
}


Ufa! Meus parabéns! Sua primeira interação está pronta. Agora siga os passos da Parte 3, gere a DLL, crie um .package e.... vá testar! Veja como ficou:






5. Limitações técnicas para resolver

Feliz e emocionando com seu MOD com uma interação criada por você?! Espero que sim.
Mas, existe uma limitação em nosso MOD. Nenhum novato é capaz de perceber o que tem de errado nisso tudo... então pense comigo bem atento aos detalhes:

A Classe Mestre seleciona todos os Sims da vizinhança quando o Mundo termina de carregar, certo? Estes Sims selecionados são enviados para uma Classe, na mesma é adicionada nossa interação.

Hm.... E se você criar um novo Sim...? Ele foi carregado junto com o mundo...? Não.
E se a Progressão de História criar novos Sims... eles foram carregados junto com o mundo..? Não!

Notou? A interação só é adicionada para os Sims que já estão salvos no seu Save, se eles não existirem antes da tela de carregamento, eles não irão ter nossas interações.

Não é o fim do Mundo, não corte os pulsos. Eu ensinei a forma Simples para ficar mais fácil entender como funciona. O código base da Classe Mestre ensinado até aqui não será mais usado daqui em diante. Mas o código base das interações irá continuar o mesmo, não se preocupe. Veja como será o novo código:

CODE
using Sims3.Gameplay.Objects.Seating.Mimics;
using Sims3.Gameplay.Interactions;
using Sims3.Gameplay.EventSystem;
using Sims3.Gameplay.Utilities;
using Sims3.Gameplay.Autonomy;
using Sims3.Gameplay.Objects;
using Sims3.Gameplay.Actors;
using Sims3.Gameplay.Core;
using Sims3.SimIFace;
using Sims3.Gameplay;
using System;

namespace NomeDoSeuNamespace{

    public class NomeDaSuaClassPrincipal
    {
        [Tunable]
        protected static bool NomeDaSuaBooleana;
        private static EventListener sSimInstantiatedListener = null;

        static NomeDaSuaClassPrincipal(){
            World.OnWorldLoadFinishedEventHandler += new EventHandler(OnWorldLoadFinishedHandler);
        }

        public static void OnWorldLoadFinishedHandler(object sender, System.EventArgs e){
            foreach (Sim sim in Sims3.Gameplay.Queries.GetObjects<Sim>()){
                AdicionarInteracao(sim);
            }

            sSimInstantiatedListener = EventTracker.AddListener(EventTypeId.kSimInstantiated, new ProcessEventDelegate(OnSimInstantiated));
        }

        protected static ListenerAction OnSimInstantiated(Event e){
            Sim sim = e.TargetObject as Sim;
            if (sim != null){
                AdicionarInteracao(sim);
            }
            return ListenerAction.Keep;
        }

        public static void AdicionarInteracao(Sim Sims){
            foreach (InteractionObjectPair pair in Sims.Interactions){
                if (pair.InteractionDefinition.GetType() == NomeDaInteracao.Singleton.GetType()){
                    return;
                }
            }

            Sims.AddInteraction(NomeDaInteracao.Singleton);

        }
    }
}


As alterações são simples, mas cruciais na resolução do problema representado. Com este novo código, seu MOD estará com 100% de precisão quando o assunto é adicionar interações. biggrin.gif

Agora para definir o nome das interações via código, mudou pouca coisa, veja:
CODE
        public static void AdicionarInteracao(Sim Sims){
            foreach (InteractionObjectPair pair in Sims.Interactions){
                if (pair.InteractionDefinition.GetType() == NomeDaInteracao.Singleton.GetType()){
                    return;
                }
            }

            Sims.AddInteraction(NomeDaInteracao.Singleton);

        }


Simplesmente, você irá definir o NomeDaInteracao duas vezes. A primeira vez em:
CODE
                if (pair.InteractionDefinition.GetType() == NomeDaInteracao.Singleton.GetType()){
                    return;
                }


E a segunda em:
CODE
Sims.AddInteraction(NomeDaInteracao.Singleton);


Para finalizar, é possível adicionar quantas interações quiser. Neste caso, é só copiar e colar o código em vermelho:
QUOTE
public static void AdicionarInteracao(Sim Sims){
foreach (InteractionObjectPair pair in Sims.Interactions){

if (pair.InteractionDefinition.GetType() == NomeDaInteracao.Singleton.GetType()){
return;
}


}

Sims.AddInteraction(NomeDaInteracao.Singleton);
}


Quantas vezes forem necessárias. Observe:

CODE
if (pair.InteractionDefinition.GetType() == PrimeiraInteracao.Singleton.GetType()){
return;
}

if (pair.InteractionDefinition.GetType() == SegundaInteracao.Singleton.GetType()){
return;
}

if (pair.InteractionDefinition.GetType() == TerceiraInteracao.Singleton.GetType()){
return;
}
}

Sims.AddInteraction(PrimeiraInteracao.Singleton);
Sims.AddInteraction(SegundaInteracao.Singleton);
Sims.AddInteraction(TerceiraInteracao.Singleton);


Assim como ensinado, PrimeiraInteracao, SegundaInteracao, TerceiraInteracao terão as suas próprias classes com o código base das Interações. Bem simples, concorda?

-----------------------------
Me desculpem pelo tutorial enorme, mas sinto a necessidade de explicar em detalhes.
Na primeira vez é difícil, imagine eu que tive que aprender com tutoriais em inglês, desatualizados e errados?! Não pense que eu decorei tudo isso e que sei de tudo, muito pelo contrário. Os códigos bases deixo salvo no bloco de notas, sempre que preciso copio e colo. Não há necessidade de entender tudo, o importante é conhecer as principais partes.

Os próximos tutoriais serão focados em sisteminhas legais. Iremos criar diversas funções próprias. Tudo será colocado em interações. wink.gif

BÔNUS:
Projeto + Package: MEDIAFIRE.
-----------------------------


A ideia original do Tutorial se encontra aqui.
O mesmo é o único existente. Ele está desatualizado, de forma que o MOD não funciona no Jogo, eu mesmo descobri a causa e estou adaptando por conta própria, facilitando as etapas e detalhes.

Esse é o único tutorial em português, e talvez, é o segundo tutorial após o do ModTheSims.
Se for postar em seu WebSite, dê meus devidos créditos


Este post foi editado por Daniel: 01/02/14, 20:20
Go to the top of the page
 
+Quote Post
Visitante Arthur Krell
post 01/02/14, 21:41
Post #2





Guests






Parabéns Daniel, ótimo trabalho. Sei o quanto você se esforçou! wink.gif
Go to the top of the page
 
+Quote Post
Daniel
post 01/02/14, 22:13
Post #3


The Sims 4 Ao Trabalho
**************

Grupo: Membros
Posts: 2272
Registrado: 07/07/13
Membro N°: 265976



QUOTE(Arthur Krell @ 01/02/14, 22:42) *
Parabéns Daniel, ótimo trabalho. Sei o quanto você se esforçou! wink.gif


Muito obrigado, Arthur! smile.gif
Estou me esforçando bastante, e vou ter que me sacrificar para postar os próximos. rçrçrçr
Go to the top of the page
 
+Quote Post
Visitante Tab
post 02/02/14, 01:32
Post #4





Guests






Enfim saiu! *--------------------*

Tentarei fazer algo e lhe darei notícias. Não li ainda, vou ver e depois digo o que achei, mas a primeira vista está muito detalhado.

Parabéns!
Go to the top of the page
 
+Quote Post
Daniel
post 02/02/14, 10:27
Post #5


The Sims 4 Ao Trabalho
**************

Grupo: Membros
Posts: 2272
Registrado: 07/07/13
Membro N°: 265976



QUOTE(Tab @ 02/02/14, 02:33) *
Enfim saiu! *--------------------*

Tentarei fazer algo e lhe darei notícias. Não li ainda, vou ver e depois digo o que achei, mas a primeira vista está muito detalhado.

Parabéns!


Obrigado, Tab! \o/
Boa sorte para você, não deixe de relatar todas as suas dificuldades se tiver. smile.gif
Go to the top of the page
 
+Quote Post
Visitante Tab
post 02/02/14, 18:43
Post #6





Guests






Nossa, Daniel, que trem difícil! Chorando aqui. T_T

Quando entrou na parte "Iniciando a base", não entendi quase nada. É muito complicado. x_x

Eu vou tentar mexer nisso quando tiver mais tempo.
Go to the top of the page
 
+Quote Post
Daniel
post 03/02/14, 18:09
Post #7


The Sims 4 Ao Trabalho
**************

Grupo: Membros
Posts: 2272
Registrado: 07/07/13
Membro N°: 265976



Tab, assim como conversamos no Eu Confesso é necessário de tempo e refazer várias vezes. Eu demorei umas três semanas até conseguir entender algo e fazer funcionar... (já expliquei como funciona os tutoriais no MTS).
Vá se orientando pelo código pronto, é mais fácil ter noção. smile.gif
Go to the top of the page
 
+Quote Post
luiksa
post 27/03/14, 01:47
Post #8


The Sims Fazendo a Festa
**

Grupo: Membros
Posts: 70
Registrado: 02/09/09
Membro N°: 186480



Nossa, muito bom. Muito bom mesmo!
Espero que tenha a continuação, tô adorando o tutorial... ainda mais que preciso aprender a programar em Assembly e C esse ano wink.gif
Go to the top of the page
 
+Quote Post
Daniel
post 17/04/14, 20:24
Post #9


The Sims 4 Ao Trabalho
**************

Grupo: Membros
Posts: 2272
Registrado: 07/07/13
Membro N°: 265976



QUOTE(luiksa @ 27/03/14, 01:48) *
Nossa, muito bom. Muito bom mesmo!
Espero que tenha a continuação, tô adorando o tutorial... ainda mais que preciso aprender a programar em Assembly e C esse ano wink.gif


Olá! Agradeço pelos comentários.
Irei fazer o possível para dar continuidade, mas meu tempo está muito curto.
Até mais. wink.gif

ps: você já chegou a realizar os tutoriais na prática? ^^

Este post foi editado por Daniel: 17/04/14, 20:25
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
2 usuário(s) está(ão) lendo este tópico (2 visitantes e 0 usuários anônimos)
0 membros:

 

Modos de Exibição: Padrão · Mudar para: Linear+ · Mudar para: Outline


RSS Versão Simples Horário: 20/07/19 - 17:21