[Tutorial] Sistema de Atores (Actor System)
#1

O que й um Actor?

De uma forma direta e simplificada de explicar, sгo considerados NPC's estбticos, nгo ocuparгo SLOTS em seu servidor. Sabe aqueles NPC's que ficam parados atrбs de balcхes? O ator(Actor) й a mesma coisa. Diferente do NPC normal, ele tem uma funcionalidade limitada.

OBS: O limite mбximo de Actors й 1000 (MAX_ACTORS).


Quais sгo as funзхes?

CreateActor(modelid, Float:X, Float:Y, Float:Z, Float:Rotation)

Descriзгo: A funзгo jб fala por si sу, criarб um novo ator no game.

Especificaзхes da funзгo:
Код:
modelid - ID da Skin que o ator receberб.
Float:X - A Coordenada X da posiзгo do Ator.
Float:Y - A Coordenada Y da posiзгo do Ator.
Float:Z - A Coordenada Z da posiзгo do Ator.
Float:Rotation - O Вngulo (Rotaзгo) do Ator.
Modo de uso:
PHP код:
new SashaGray;
 
public 
OnGameModeInit()
{
    
// Criarб um novo actor, com a skin ID 306 (WFYCLPD) na posiзгo 1480.94, -1764.35, 18.79 e rotaзгo 0.60
    
SashaGray CreateActor(3061480.94, -1764.3518.790.60);

DestroyActor(actorid)
Descriзгo: Destruirб um Ator desejado, para usar esta funзгo, antes terб que criб-lo com a funзгo CreateActor.

Especificaзхes da funзгo:
Код:
actorid - O ID do Ator, usado em CreateActor.
Modo de uso:
PHP код:
new SashaGray;
 
public 
OnGameModeInit()
{
    
SashaGray CreateActor(3061480.94, -1764.3518.790.60);
}
public 
OnGameModeExit()
{
    
DestroyActor(SashaGray);

IsValidActor(actorid)
Descriзгo: Verificarб se um Ator й vбlido ou nгo.

Especificaзхes da funзгo:
Код:
actorid - O ID do Ator para checar.

Valores que retornarгo:
0 - O ator nгo й vбlido.
1 - O ator й vбlido.
Modo de uso:
PHP код:
new SashaGray;
public 
OnFilterScriptInit()
{
    
SashaGray CreateActor(3061480.94, -1764.3518.790.60);
    if(
IsValidActor(SashaGray)) //Verificando se o Ator 'SashaGray' й vбlido, se sim, executa o cуdigo abaixo:
    
{
        print(
"Ator 'SashaGray' vбlido, aquela safadinha, adoro :)");
    }
    else 
//Se o Ator nгo for vбlido, entгo executa o cуdigo abaixo:
    
{
        print(
"Ator 'SashaGray' invбlido, deve tб fazendo outro filme porno :(");
    }
    return 
1;

GetActorPos(actorid, &Float:X, &Float:Y, &Float:Z)

Descriзгo: Muito parecida com a funзгo GetPlayerPos, esta funзгo geta a posiзгo X, Y, Z do Ator.

Especificaзхes da funзгo:
Код:
actorid - O ID do Ator, usado em CreateActor.
&Float:X - Uma variбvel flutuante (float) que receberб o valor da posiзгo X do ator.
&Float:Y - Uma variбvel flutuante (float) que receberб o valor da posiзгo Y do ator.
&Float:Z - Uma variбvel flutuante (float) que receberб o valor da posiзгo Z do ator.
Modo de uso:
PHP код:
new SashaGray;
public 
OnFilterScriptInit()
{
    
SashaGray CreateActor(3061480.94, -1764.3518.790.60);
    
    new 
Float:xFloat:yFloat:z//Criando as variбveis flutuantes x, y, z
    
GetActorPos(SashaGrayxyz); //Pegando e atribuindo os valores аs variбveis criadas
    //ou
    
new Float:PosActor[3];
    
GetActorPos(SashaGrayPosActor[0], PosActor[1], PosActor[2]);
    return 
1;

⇡ Debug ⇡


SetActorPos(actorid, Float:X, Float:Y, Float:Z)

Descriзгo: Setarб a posiзгo do Ator para algum lugar desejado.

Especificaзхes da funзгo:
Код:
actorid - O ID do Ator, usado em CreateActor.
Float:X - A Coordenada X que o ator se teleportarб.
Float:Y - A Coordenada Y que o ator se teleportarб.
Float:Z - A Coordenada Z que o ator se teleportarб.
Modo de uso:
PHP код:
new SashaGray;
public 
OnFilterScriptInit()
{
    
SashaGray CreateActor(3061480.94, -1764.3518.790.60);
    
SetActorPos(SashaGray2176.64, -986.6964.46); //Teletransportarб o Ator para 2176.64, -986.69, 64.46
    
return 1;

SetActorVirtualWorld(actorid, vworld)
Descriзгo: Setarб o Virtual World (Mundo Virtual) de um Ator.

Especificaзхes da funзгo:
Код:
actorid - O ID do Ator, usado em CreateActor.
vworld - O ID do Virtual World que o Ator serб colocado.
Modo de uso:
PHP код:
new SashaGray;
public 
OnFilterScriptInit()
{
    
SashaGray CreateActor(3061480.94, -1764.3518.790.60);
    
SetActorVirtualWorld(SashaGray24); //Colocando o Ator no Virtual World(Mundo virtual) 24
    
return 1;

GetActorVirtualWorld(actorid)
Descriзгo: Pegarб o Virtual World (Mundo Virtual) de um Ator. O Virtual World por padrгo, ou seja, quando o Ator for criado, й 0.

Especificaзхes da funзгo:
Код:
actorid - O ID do Ator, usado em CreateActor.
Modo de uso:
PHP код:
new SashaGray;
public 
OnFilterScriptInit()
{
    
SashaGray CreateActor(3061480.94, -1764.3518.790.60);
    
SetActorVirtualWorld(SashaGray24); //Colocando o Ator no Virtual World(Mundo virtual) 24
    
    
if(GetActorVirtualWorld(SashaGray) == 24//Se o Virtual World do Ator for 24, entгo...
    
{
        
//Reaзгo...
    
}
    return 
1;

SetActorInvulnerable(actorid, invulnerable = true)
Descriзгo: Alterar invulnerabilidade de um Ator. Uma vez que o Ator й invulnerбvel, nгo chama a Callback OnPlayerGiveDamageActor.

Especificaзхes da funзгo:
Код:
actorid - O ID do Ator, usado em CreateActor.
invulnerable - Coloque 0 (false) para tornб-lo vulnerбvel ou coloque 1 (true) para tornб-lo invulnerбvel.
Modo de uso:
PHP код:
new SashaGray;
public 
OnFilterScriptInit()
{
    
SashaGray CreateActor(3061480.94, -1764.3518.790.60);
    
SetActorInvulnerable(SashaGraytrue); //Tornarб o Ator invulnerбvel, vocк tambйm poderia usar apenas SetActorInvulnerable(SashaGray); para fazer o mesmo.
    
return 1;

IsActorInvulnerable(actorid)
Descriзгo: Verificarб se um Ator й invulnerбvel ou nгo.

Especificaзхes da funзгo:
Код:
actorid - O ID do Ator, usado em CreateActor para chegar se й invulnerбvel ou nгo.

Valores que retornarгo:
0 - O ator й vulnerбvel, ou seja, sofrerб dano.
1 - O ator й invulnerбvel, ou seja, nгo sofrerб dano.
Modo de uso:
PHP код:
new SashaGray;
public 
OnFilterScriptInit()
{
    
SashaGray CreateActor(3061480.94, -1764.3518.790.60);
    if(
IsActorInvulnerable(SashaGray)) //Verificando se o Ator 'SashaGray' й Invulnerбvel, se sim, executa o cуdigo abaixo:
    
{
        print(
"O Ator й invulnerбvel, nгo sofrerб dano.");
    }
    else 
//Se nгo for invulnerбvel, executa o cуdigo abaixo:
    
{
        print(
"O Ator й vulnerбvel, vamos matar esse fi de rapariga.");
    }
    return 
1;

SetActorHealth(actorid, Float:health)
Descriзгo: Setarб a vida de um determinado Ator.

Especificaзхes da funзгo:
Код:
actorid - O ID do Ator, usado em CreateActor.
Float:health - A quantidade de vida que o serб atribuнda ao Ator.
Modo de uso:
PHP код:
new SashaGray;
public 
OnFilterScriptInit()
{
    
SashaGray CreateActor(3061480.94, -1764.3518.790.60);
    
SetActorHealth(SashaGray100); //Seta a vida do Ator para 100
    
return 1;

GetActorHealth(actorid, &Float:health)
Descriзгo: Pega a vida de um determinado Ator.

Especificaзхes da funзгo:
Код:
actorid - O ID do Ator, usado em CreateActor.
&Float:health - A variбvel flutuante (float) que armazenarб a quantidade de vida do Ator.
Modo de uso:
PHP код:
new SashaGray;
public 
OnFilterScriptInit()
{
    
SashaGray CreateActor(3061480.94, -1764.3518.790.60);
    
SetActorHealth(SashaGray100); //Seta a vida do Ator para 100
    
    
new Float:Health_Actor//Criando a variбvel que armazenarб o quantidade de vida
    
GetActorHealth(SashaGrayHealth_Actor); //Pegando e atribuindo a vida do Ator а variбvel
    
printf("A vida do Ator ID %d й %.2f"SashaGrayHealth_Actor); //[DEBUG]
    
return 1;

⇡ Debug ⇡


SetActorFacingAngle(actorid, Float:ang)
Descriзгo: Setarб o вngulo (rotaзгo) de um determinado Ator.

Especificaзхes da funзгo:
Код:
actorid - O ID do Ator, usado em CreateActor.
Float:ang - O вngulo (rotaзгo) desejado que o Ator ficarб.
Modo de uso:
PHP код:
new SashaGray;
public 
OnFilterScriptInit()
{
    
SashaGray CreateActor(3061480.94, -1764.3518.790.60);
    
SetActorFacingAngle(SashaGray180.0); //Setarб a rotaзгo do Ator para 180.0
    
return 1;

GetActorFacingAngle(actorid, &Float:ang)
Descriзгo: Pegarб o вngulo (rotaзгo) de um determinado Ator existente.

Especificaзхes da funзгo:
Код:
actorid - O ID do Ator, usado em CreateActor.
&Float:ang - Variбvel flutuante (float) que armazenarб a rotaзгo do Ator.
Modo de uso:
PHP код:
new SashaGray;
public 
OnFilterScriptInit()
{
    
SashaGray CreateActor(3061480.94, -1764.3518.790.60);
    
    new 
Float:AnguloAtor//Criando a variбvel que armazenarб o valor da rotaзгo do Ator
    
GetActorFacingAngle(SashaGrayAnguloAtor); //Pegando e atribuindo o valor da rotaзгo а variбvel criada acima
    
printf("O вngulo(rotaзгo) do Ator ID %d й %.2f"SashaGrayAnguloAtor); //[DEBUG]
    
return 1;

⇡ Debug ⇡


ApplyActorAnimation
(actorid, animlib[], animname[], Float:fDelta, loop, lockx, locky, freeze, time)
Descriзгo: Aplicarб uma animaзгo a um determinado Ator existente.

Especificaзхes da funзгo:
Код:
actorid - O ID do Ator, usado em CreateActor.
animlib[] - A biblioteca que a animaзгo pertence.
animname[] - O nome da animaзгo da biblioteca especificada.
fDelta - A velocidade para reproduzir a animaзгo (use 4.1).
loop - Se definido como 1, a animaзгo se repetirб. Se definido como 0, a animaзгo vai reproduzir apenas uma vez.
lockx - Se definido como 0, o Ator й devolvido а sua antiga posiзгo (X) e uma vez que a animaзгo й completa (para animaзхes que movem o ator, como caminhar). Se definido como 1, nгo vai devolvк-lo а antiga posiзгo.
locky - O mesmo que acima, mas para o eixo Y. Deve ser mantido o mesmo que o parвmetro anterior.
freeze - Se definido como 1, irб congelar o Ator no final da animaзгo, se definido como 0, isso nгo acontecerб.
time - Tempo em milissegundos. Para um loop sem fim deverб colocar 0.
Modo de uso: (Listei algumas animaзхes, se quiserem й sу clicar aqui)
PHP код:
new SashaGray;
public 
OnFilterScriptInit()
{
    
SashaGray CreateActor(3061480.94, -1764.3518.790.60);
    
ApplyActorAnimation(SashaGray"DEALER""shop_pay"4.100000); // Pay anim
    
return 1;

Descriзгo: Pararб a animaзгo executada por um determinado Ator.

Especificaзхes da funзгo:
Код:
actorid - O ID do Ator, usado em CreateActor.
Modo de uso:
PHP код:
new SashaGray;
public 
OnFilterScriptInit()
{
    
SashaGray CreateActor(3061480.94, -1764.3518.790.60);
    
ApplyActorAnimation(SashaGray"DEALER""shop_pay"4.100000); // Pay anim
    
return 1;
}
//Coloque em alguma funзгo, comando, public e etc...
ClearActorAnimations(SashaGray); //Pararб a animaзгo que o determinado Ator estiver executando 
GetPlayerTargetActor(playerid)
Descriзгo: Obtйm o id de um Ator que estб sendo mirado por um jogador. Nгo funciona para joypads / controladores, depois de uma certa distвncia e tambйm nгo funciona se o jogador estiver mirando com rifle sniper.

Код:
playerid - O ID do Jogador que estб mirando para algum Ator.
Modo de uso:
PHP код:
public OnPlayerUpdate(playerid)
{
    new 
AtorMirado GetPlayerTargetActor(playerid); //Criado uma variбvel e atribuindo-a o ID do ator que o jogador estб mirando
    
if(IsValidActor(AtorMirado) && GetPlayerWeapon(playerid) != 0//Verifica se o Ator que estб sendo mirado й vбlido e se o jogador estб desarmado, se o Ator for invбlido ou o jogador estiver sem armas, nгo й executado o cуdigo abaixo.
    
{
        new 
WeaponName[24], String[128]; //Criando as variбveis para armazenar Textos, como o nome da arma(WeaponName) e a mensagem que serб transmitida(String).
    
        
GetWeaponName(GetPlayerWeapon(playerid), WeaponNamesizeof(WeaponName)); //Pegando o nome da arma que o jogador estб segurando na mгo
        
format(Stringsizeof(String), "{00FF00}Vocк estб mirando para o Actor de ID {FF8000}%d {00FF00}com a arma {FF8000}%s"AtorMiradoWeaponName); //Formatando a mensagem que serб transmitida
        
SendClientMessage(playerid, -1String); //Enviando a mensagem - isso й como se fosse um debug
    
}
    return 
1;


GetActorPoolSize()
Descriзгo: Obtйm a maior ActorID(ID do Ator) criado no servidor.

Modo de uso:
PHP код:
public OnFilterScriptInit()
{
    
CreateActor(3061480.94, -1764.3518.790.60); //ID 0
    
CreateActor(2280.00.00.00.90); //ID 1
    
CreateActor(2283.02.00.00.90); //ID 2
    
CreateActor(2286.04.00.00.90); //ID 3
    
CreateActor(2289.06.00.00.90); //ID 4
    
CreateActor(22812.08.00.00.90); //ID 5
    
    
for(new j<= GetActorPoolSize(); ++j//Criando um loop, se a variбvel 'j' for menor ou igual ao maior Actor ID criado no servidor, o cуdigo abaixo й executado
    
{
        if(
IsValidActor(j)) //Se o Actor ID 'j' for vбlido entгo...
        
{
            
SetActorVirtualWorld(j69); //Setando o Virtual World (Mundo Virtual) do Ator ID 'j' para 69
            
SetActorInvulnerable(jfalse); //Deixando o Ator ID 'j' vulnerбvel
            
SetActorHealth(j100.0); //Setando a vida do Ator ID 'j' para 100
        
}
    }
    
    
printf("Maior ActorID do servidor: %d"GetActorPoolSize()); //[DEBUG]
    
return 1;

⇡ Debug ⇡


GetPlayerCameraTargetActor(playerid)
Descriзгo: Pega o ID do Ator que o jogador estб olhando. Esta funзгo й desabilitada por padrгo para economizar largura de banda. Terб que usar primeiro a funзгo EnablePlayerCameraTarget para habilitб-lo para cada jogador.

Код:
playerid - O ID do Jogador que estб olhando para algum Ator.
Modo de uso:
PHP код:
public OnPlayerConnect(playerid)
{
    
EnablePlayerCameraTarget(playerid1); //Como dito na descriзгo da funзгo, isso deverб ser habilitado para que o cуdigo funcione.
    
return 1;
}
public 
OnPlayerUpdate(playerid)
{
    new 
AtorObservado GetPlayerCameraTargetActor(playerid); //Criando uma variбvel e atribuindo-a o ID de algum ator que o jogador estб olhando
    
new String[128];
    if(
AtorObservado != INVALID_ACTOR_ID//Verificando se o jogador nгo й invбlido, se ele for vбlido, executa o cуdigo abaixo:
    
{
        
format(Stringsizeof(String), "Vocк estб olhando para o Actor ID %d"AtorObservado); //Formata uma mensagem onde diz qual o ID do Ator que o jogador estб observando.
        
SendClientMessage(playerid, -1String); //Enviando a mensagem no chat
    
}
    return 
1;

VEJA O VНDEO DO CУDIGO ACIMA EM AЗГO

IsActorStreamedIn(actorid, forplayerid)
Descriзгo: Essa funзгo verificarб se existe hб um determinado Ator(actorid) no campo de visгo do Jogador(forplayerid).

Especificaзхes da funзгo:
Код:
actorid - actorid - O ID do Ator, usado em CreateActor.
forplayerid - O ID do jogador que estб vendo ou nгo o Ator (actorid).
Modo de uso:
PHP код:
new SashaGray;
public 
OnFilterScriptInit()
{
    
SashaGray CreateActor(3061480.94, -1764.3518.790.60);
    return 
1;
}
public 
OnPlayerSpawn(playerid)
{
    if(
IsActorStreamedIn(SashaGrayplayerid)) //Verificando se o playerid estб vendo o Ator 'SashaGray' no seu campo de visгo, se sim, executa o cуdigo abaixo:
    
{
        
SendClientMessage(playerid, -1"O Ator 'SashaGray' estб em seu campo de visгo.");
    }
    else 
//Se o jogador (playerid) nгo estiver vendo o Ator 'SashaGray' no campo de visгo, executa o cуdigo abaixo:
    
{
        
SendClientMessage(playerid, -1"O Ator 'SashaGray' nгo estб em seu campo de visгo.");
    }
    return 
1;

Quais sгo as Callbacks?

OnPlayerGiveDamageActor
(playerid, damaged_actorid, Float:amount, weaponid, bodypart)

Descriзгo: Essa callback й chamada quando um jogador dб dano a um ator que й vulnerбvel.

Especificaзхes da funзгo:
Код:
playerid - O ID do jogador que deu danos ao Ator(damaged_actorid).
damaged_actorid - O ID do Ator que recebeu danos.
Float:amount - A quantidade de vida/colete que o Ator perdeu.
weaponid - O ID da arma que causou o dano, ou seja, a arma que o jogador estava usando quando deu dano ao Ator.
bodypart - A parte do corpo que foi atingida.
Modo de uso:
PHP код:
public OnPlayerGiveDamageActor(playeriddamaged_actoridFloatamountweaponidbodypart)
{
    new 
StringActor[150], WeaponName[24]; //Criando as variбveis que amazenarб o nome da arma(WeaponName) e a mensagem que serб transmitida no chat(StringActor)
    
GetWeaponName(weaponidWeaponNamesizeof (WeaponName)); //Pegando o nome da arma que foi usada para causa dano ao Ator
    
if(!IsActorInvulnerable(damaged_actorid)) //Verificando se o Ator й vulnerбvel, se sim, segue o cуdigo. Se nгo, o cуdigo abaixo nгo й executado
    
{
        new 
Float:Actor_Health//Criando a variбvel que armazenarб a vida do Ator
        
GetActorHealth(damaged_actoridActor_Health); //Pegando a vida atual do Ator
        
SetActorHealth(damaged_actoridActor_Health-amount); //Aplicando o dano ao Ator
        
format(StringActorsizeof(StringActor), "ActorID: %d | VW: %d | Arma: %s | BodyPartID: %d | Dano: %.0f | Vida: %.0f"damaged_actoridGetActorVirtualWorld(damaged_actorid), WeaponNamebodypartamountActor_Health-amount); //Formatando a mensagem que serб enviada no chat
        
SendClientMessage(playerid, -1StringActor); //Enviando a mensagem no chat
    
}
    return 
1;

OnActorStreamIn(actorid, forplayerid)

Descriзгo: Essa Callback й chamada quando um Ator (actorid) entra no campo de visгo de um jogador (forplayerid).

Especificaзхes da funзгo:
Код:
actorid - O ID do Ator que entra no campo de visгo do jogador (forplayerid).
forplayerid - O ID do jogador que estб vendo o Ator (actorid).
Modo de uso:
PHP код:
public OnActorStreamIn(actoridforplayerid)
{
    new 
String[40]; //Criando uma variбvel que armazenarб Textos, aqui no caso, serб uma mensagem formatada.
    
format(Stringsizeof(String), "Ator ID %d entrou no seu campo de visгo."actorid); //Formatando a mensagem, mostrarб qual o ID de qualquer ator que entrar no campo de visгo do jogador.
    
SendClientMessage(forplayerid0xFFFFFFFFString); //Enviando a mensagem no Chat
    
return 1;

OnActorStreamOut(actorid, forplayerid)

Descriзгo: Essa Callback й chamada quando um Ator (actorid) sai do campo de visгo de um jogador (forplayerid), e lembrando: isto nгo й aplicado apenas a distвncia, se o Jogador(forplayerid) e o Ator(actorid) ficarem em mundos(Virtual World) diferentes, tambйm chamarб a Callback.

Especificaзхes da funзгo:
Код:
actorid - O ID do Ator que sai do campo de visгo do jogador (forplayerid).
forplayerid - O ID do jogador que estб vendo ou nгo o Ator (actorid).
Modo de uso:
PHP код:
public OnActorStreamOut(actoridforplayerid)
{
    new 
String[40]; //Criando uma variбvel que armazenarб Textos, aqui no caso, serб uma mensagem formatada.
    
format(Stringsizeof(String), "Ator ID %d saiu do seu campo de visгo."actorid); //Formatando a mensagem, mostrarб qual o ID de qualquer ator que sair do campo de visгo do jogador.
    
SendClientMessage(forplayerid0xFFFFFFFFString); //Enviando a mensagem no Chat
    
return 1;

Cуdigos ъteis, sistemas e exemplos

1. A vida do Ator chega a 0, ele morre e fica deitado no chгo, como faзo pare revivк-lo?
2. Outros cуdigos?
3. Existe alguma include que adiciona novas funзхes?

Sim! A Include do Emmet_, clique aqui para visitar o tуpico. Agradecimentos ao Nickvj7 que me passou o link.
Код:
Funзхes Adicionadas:
ResyncActor(actorid);
RespawnActor(actorid);
IsActorDead(actorid);
SetActorRespawnTime(actorid, time);
IsPlayerInRangeOfActor(playerid, actorid, Float:radius = 5.0);
Text3D:Attach3DTextLabelToActor(actorid, text[], color, Float:fOffsetX, Float:fOffsetY, Float:fOffsetZ, Float:distance = 10.0, worldid = 0, testlos = 0);
Callbacks Adicionadas:
OnActorDeath(actorid, killerid, reason)
OnActorSpawn(actorid)
OnPlayerTargetActor(playerid, newtarget, oldtarget)
4. Algum sistema demonstrativo?
Este tуpico serб atualizado frequentemente.
Reply
#2

Bom tutorial, Bastante explicado. Sera muuiiiiiiiiiittttoo ъtil,
Parabйns pelo trabalho

++Rep
Reply
#3

"SashaGray" Eu sei quem e ( ͡° ͜ʖ ͡°)
Reply
#4

Muito bacana seu tуpico, parabйns pelo tutorial.

Abraзos.
Reply
#5

Gostei do tutorial,

Bom trabalho.
Reply
#6

Muito bom parabйns.
Reply
#7

Mutio bem feito, organizado e bem explicado.
Congratz. +rep
Reply
#8

A estruturaзгo do tуpico estб bastante boa e agradбvel, limpo e ъtil.
Bom tutorial rapaz.
Reply
#9

Bastante bacana o tutorial. Bem explicativo. Parabйns
Reply
#10

Уtimo, vai ajudar muitas pessoas. Tуpico bem organizado, explicando direitinho!
Realmente, parabйns.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)