Advertisement
Guest User

[FS] Actor Test v0.1 R3-3

a guest
May 23rd, 2015
161
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 18.38 KB | None | 0 0
  1. /*******************************************************************************
  2.                         # Changelog
  3.     v0.1 - 07/05/2015:
  4.         - Script Criado.
  5.         - Comandos para criar, destruir e alterar actors.
  6.         - Lista de comandos para saber de todos os comandos disponíveis.
  7.         - Possível executar/parar animação em um ou todos actors.
  8.     v0.1 R2 - 07/05/2015:
  9.         - Comando /criaractor corrigido, setando a posição do jogador para o lado, para não ocorrer bugs.
  10.         - Debugs desabilitados.
  11.     v0.1 R3 - 08/05/2015:
  12.         - Comando /criaractor alterado. Agora actors podem ser identificados com nomes.
  13.         - Novo comando: /reviveractor. Ele revive o actor na mesma posição.
  14.         - Labels identificam os actors com seu id e nome.
  15.         - Novo comando: /alteraractornome. Alterar o nome do actor.
  16.         - Os comandos só podem ser utilizados por administradores (RCON).
  17.         - Comando /veractors exibe agora 25 resultados por página.
  18.  
  19.  
  20. *******************************************************************************/
  21. #include <a_samp>
  22. #include <zcmd>
  23. #include <sscanf2>
  24.  
  25. #define DIALOG_ACTORCMDS 32002
  26. #define DIALOG_VERACTORS 32003
  27.  
  28. enum cmd_infos
  29. {
  30.     Comando[128],
  31.     Descricao[128]
  32. };
  33. new cmds_Actor[][cmd_infos] = {
  34.     {"/criaractor [skin id] [nome]", "Cria um actor com a skin desejada e com um nome"},
  35.     {"/destruiractor [actor id]", "Destroi um actor"},
  36.     {"/destruirtodosactors", "Destrói todos os actors do servidor"},
  37.     {"/animaractor [actor id] [animlib] [animname] [loop]", "Anima um actor"},
  38.     {"/pararanimactor [actor id]", "Para a animação de um actor"},
  39.     {"/animtodosactors [animlib] [animname] [loop]", "Anima todos os actors do servidor"},
  40.     {"/pararanimtodosactors", "Para a animação de todos os actors"},
  41.     {"/actorpos [actor id] [x] [y] [z] [rotação]", "Seta a posição de um actor"},
  42.     {"/actormundo [actor id] [mundo virtual]", "Seta o mundo virtual de um actor"},
  43.     {"/actorvuneravel [actor id]", "Deixa um actor vuneravel/invuneravel"},
  44.     {"/actorvida [actor id] [vida]", "Seta a vida de um actor"},
  45.     {"/reviveractor [actor id]", "Revive um actor"},
  46.     {"/alteraractornome [actor id] [novo nome]", "Altera o nome de um actor"},
  47.     {"/veractors", "Visualiza os actors criados"}
  48. };
  49.  
  50. enum i_actor
  51. {
  52.     ActorNome[32],
  53.     ActorSkin,
  54.     Text3D:ActorLabel
  55. };
  56. new ActorData[MAX_ACTORS][i_actor];
  57.  
  58. public OnFilterScriptInit()
  59. {
  60.     for(new i; i < MAX_ACTORS; i++) {
  61.         ActorData[i][ActorSkin] = -1;
  62.         ActorData[i][ActorLabel] = Text3D:INVALID_3DTEXT_ID;
  63.         format(ActorData[i][ActorNome], 32, "");
  64.     }
  65.     print("*****************************************");
  66.     print("**** Actor debug - básico [CARREGADO]****");
  67.     print("*****************************************");
  68.     return 1;
  69. }
  70.  
  71. public OnFilterScriptExit()
  72. {
  73.     for(new i; i <= GetActorPoolSize(); i++) {
  74.         if(!IsValidActor(i)) continue;
  75.         if(ActorData[i][ActorSkin] != -1) {
  76.             DestroyActor(i);
  77.             ActorData[i][ActorSkin] = -1;
  78.             Delete3DTextLabel(ActorData[i][ActorLabel]);
  79.             format(ActorData[i][ActorNome], 32, "");
  80.         }
  81.     }
  82.     print("*****************************************");
  83.     print("**** Actor debug - básico [DESLIGADO]****");
  84.     print("*****************************************");
  85.     return 1;
  86. }
  87.  
  88.  
  89. CMD:criaractor(playerid, params[]) {
  90.     if(!IsPlayerAdmin(playerid)) return 0;
  91.     new skin_actor, Nome[32];
  92.     if(sscanf(params, "is[32]", skin_actor, Nome)) return SendClientMessage(playerid, -1, "{FF0000}Use: /criaractor [skin id] [nome]");
  93.     if(skin_actor < 0 || skin_actor > 311) return SendClientMessage(playerid, -1, "{FF0000}O id é inválido!");
  94.     new Float:pP[4], Msg[144], Actorid;
  95.     GetPlayerPos(playerid, pP[0], pP[1], pP[2]);
  96.     GetPlayerFacingAngle(playerid, pP[3]);
  97.     Actorid = CreateActor(skin_actor, pP[0], pP[1], pP[2], pP[3]);
  98.     if(!IsValidActor(Actorid)) return SendClientMessage(playerid, -1, "{FF0000}Ocorreu um erro. Provavelmente o máximo de actors foi atingido!");
  99.     ActorData[Actorid][ActorSkin] = skin_actor;
  100.     format(ActorData[Actorid][ActorNome], 32, Nome);
  101.     format(Msg, 144, "{FFFF00}Actor id: %i (Skin: %i) (Nome: %s)", Actorid, skin_actor, Nome);
  102.     SendClientMessage(playerid, -1, Msg);
  103.     SetActorVirtualWorld(Actorid, GetPlayerVirtualWorld(playerid));
  104.     format(Msg, 144, "%s (%i)", Nome, Actorid);
  105.     ActorData[Actorid][ActorLabel] = Create3DTextLabel(Msg, 0xFFFF00AA, pP[0], pP[1], pP[2] + 1.0, 30.0, GetPlayerVirtualWorld(playerid));
  106.     SetPlayerPos(playerid, pP[0] + 1.0, pP[1] + 1.0, pP[2]);
  107.     return 1;
  108. }
  109. CMD:destruiractor(playerid, params[]) {
  110.     if(!IsPlayerAdmin(playerid)) return 0;
  111.     new actorid;
  112.     if(sscanf(params, "i", actorid)) return SendClientMessage(playerid, -1, "{FF0000}Use: /destruiractor [actor id]");
  113.     if(!IsValidActor(actorid)) return SendClientMessage(playerid, -1, "{FF0000}Actor inválido.");
  114.     new Msg[144];
  115.     DestroyActor(actorid);
  116.     ActorData[actorid][ActorSkin] = -1;
  117.     Delete3DTextLabel(ActorData[actorid][ActorLabel]);
  118.     format(ActorData[actorid][ActorNome], 32, "");
  119.     format(Msg, 144, "{FFFF00}Actor %s (%i) foi destruido.", ActorData[actorid][ActorNome], actorid);
  120.     SendClientMessage(playerid, -1, Msg);
  121.     return 1;
  122. }
  123. CMD:destruirtodosactors(playerid, params[]) {
  124.     if(!IsPlayerAdmin(playerid)) return 0;
  125.     new Msg[144], actors;
  126.     for(new i; i <= GetActorPoolSize(); i++) {
  127.         if(!IsValidActor(i)) continue;
  128.         DestroyActor(i);
  129.         ActorData[i][ActorSkin] = -1;
  130.         Delete3DTextLabel(ActorData[i][ActorLabel]);
  131.         format(ActorData[i][ActorNome], 32, "");
  132.         actors++;
  133.     }
  134.     if(actors==0) return SendClientMessage(playerid, -1, "{FF0000}Não há actors!");
  135.     format(Msg, 144, "{FFFF00}Foram destruidos %i actors.", actors);
  136.     SendClientMessage(playerid, -1, Msg);
  137.     return 1;
  138. }
  139. CMD:animaractor(playerid, params[]) {
  140.     if(!IsPlayerAdmin(playerid)) return 0;
  141.     new actorid, animlib[32], animname[32], loop;
  142.     if(sscanf(params, "is[32]s[32]i", actorid, animlib, animname, loop)) return SendClientMessage(playerid, -1, "{FF0000}Use: /animaractor [actor id] [animlib] [animname] [loop (0-1)");
  143.     if(!IsValidActor(actorid)) return SendClientMessage(playerid, -1, "{FF0000}Actor inválido.");
  144.     new Msg[144];
  145.     ClearActorAnimations(actorid);
  146.     ApplyActorAnimation(actorid, animlib, animname, 4.1, loop, 1, 1, 0, 0);
  147.     format(Msg, 144, "{00FF00}Actor %s (%i) executando animação da lib %s animação %s (%s)", ActorData[actorid][ActorNome], actorid, animlib, animname, (loop == 0 ? ("sem loop") : ("com loop")));
  148.     SendClientMessage(playerid, -1, Msg);
  149.     return 1;
  150. }
  151. CMD:pararanimactor(playerid, params[]) {
  152.     if(!IsPlayerAdmin(playerid)) return 0;
  153.     new actorid;
  154.     if(sscanf(params, "i", actorid)) return SendClientMessage(playerid, -1, "{FF0000}Use: /pararanimactor [actor id]");
  155.     if(!IsValidActor(actorid)) return SendClientMessage(playerid, -1, "{FF0000}Actor inválido.");
  156.     new Msg[144];
  157.     ClearActorAnimations(actorid);
  158.     format(Msg, 144, "{a9c4e4}Animação do actor %s (%i) foi parada!", ActorData[actorid][ActorNome], actorid);
  159.     SendClientMessage(playerid, -1, Msg);
  160.     return 1;
  161. }
  162. CMD:animtodosactors(playerid, params[]) {
  163.     if(!IsPlayerAdmin(playerid)) return 0;
  164.     new animlib[32], animname[32], loop;
  165.     if(sscanf(params, "s[32]s[32]i", animlib,animname,loop)) return SendClientMessage(playerid, -1, "{FF0000}Use: /animtodosactos [animlib] [animname] [loop (0-1)]");
  166.     new Msg[144];
  167.     for(new i; i <= GetActorPoolSize(); i++) {
  168.         if(!IsValidActor(i)) continue;
  169.         ClearActorAnimations(i);
  170.         ApplyActorAnimation(i, animlib, animname, 4.1, loop, 1, 1, 0, 0);
  171.     }
  172.     format(Msg, 144, "{00FF00}Todos os actors estão executando a animação da lib %s animação %s (%s)", animlib, animname, (loop == 0 ? ("sem loop") : ("com loop")));
  173.     SendClientMessage(playerid, -1, Msg);
  174.     return 1;
  175. }
  176. CMD:pararanimtodosactors(playerid, params[]) {
  177.     if(!IsPlayerAdmin(playerid)) return 0;
  178.     for(new i; i <= GetActorPoolSize(); i++) {
  179.         if(!IsValidActor(i)) continue;
  180.         ClearActorAnimations(i);
  181.     }
  182.     SendClientMessage(playerid, -1, "{FFFF00}A animação de todos os actors existentes foram paradas.");
  183.     return 1;
  184. }
  185. CMD:actorpos(playerid, params[]) {
  186.     if(!IsPlayerAdmin(playerid)) return 0;
  187.     new actorid, Float:apos[4];
  188.     if(sscanf(params, "iffff", actorid, apos[0], apos[1], apos[2], apos[3])) return SendClientMessage(playerid, -1, "{FF0000}Use: /actorpos [actorid] [x] [y] [z] [rotação]");
  189.     if(!IsValidActor(actorid)) return SendClientMessage(playerid, -1, "{FF0000}Actor inválido.");
  190.     new Msg[144];
  191.     SetActorPos(actorid, apos[0], apos[1], apos[2]);
  192.     SetActorFacingAngle(actorid, apos[3]);
  193.     format(Msg, 144, "{a9c4e4}Actor %s (%i) em x=%4.2f - y=%4.2f - z=%4.2f - rotação=%4.2f", ActorData[actorid][ActorNome], actorid, apos[0], apos[1], apos[2], apos[3]);
  194.     SendClientMessage(playerid, -1, Msg);
  195.     Delete3DTextLabel(ActorData[actorid][ActorLabel]);
  196.     format(Msg, 144, "%s (%i)", ActorData[actorid][ActorNome], actorid);
  197.     ActorData[actorid][ActorLabel] = Create3DTextLabel(Msg, 0xFFFF00AA, apos[0], apos[1], apos[2] + 1.0, 30.0, GetActorVirtualWorld(actorid));
  198.     return 1;
  199. }
  200. CMD:actormundo(playerid, params[]) {
  201.     if(!IsPlayerAdmin(playerid)) return 0;
  202.     new actorid, amundo;
  203.     if(sscanf(params, "ii", actorid, amundo)) return SendClientMessage(playerid, -1, "{FF0000}Use: /actormundo [actorid] [mundo]");
  204.     if(!IsValidActor(actorid)) return SendClientMessage(playerid, -1, "{FF0000}Actor inválido.");
  205.     new Msg[144], Float:apos[3];
  206.     GetActorPos(actorid, apos[0], apos[1], apos[2]);
  207.     SetActorVirtualWorld(actorid, amundo);
  208.     format(Msg, 144, "{a9c4e4}Actor %s (%i) em mundo %i.", ActorData[actorid][ActorNome], actorid, amundo);
  209.     SendClientMessage(playerid, -1, Msg);
  210.     Delete3DTextLabel(ActorData[actorid][ActorLabel]);
  211.     format(Msg, 144, "%s (%i)", ActorData[actorid][ActorNome], actorid);
  212.     ActorData[actorid][ActorLabel] = Create3DTextLabel(Msg, 0xFFFF00AA, apos[0], apos[1], apos[2] + 1.0, 30.0, amundo);
  213.     return 1;
  214. }
  215. CMD:actorvuneravel(playerid, params[]) {
  216.     if(!IsPlayerAdmin(playerid)) return 0;
  217.     new actorid;
  218.     if(sscanf(params, "i", actorid)) return SendClientMessage(playerid, -1, "{FF0000}Use:/actorvuneravel [actorid]");
  219.     if(!IsValidActor(actorid)) return SendClientMessage(playerid, -1, "{FF0000}Actor inválido.");
  220.     new Msg[144];
  221.     if(IsActorInvulnerable(actorid)) {
  222.         SetActorInvulnerable(actorid, false);
  223.         format(Msg, 144, "{FFFF00}Actor %s (%i) agora é vunerável.", ActorData[actorid][ActorNome], actorid);
  224.     }
  225.     else {
  226.         SetActorInvulnerable(actorid, true);
  227.         format(Msg, 144, "{FFFF00}Actor %s (%i) agora é invunerável.", ActorData[actorid][ActorNome], actorid);
  228.     }
  229.     SendClientMessage(playerid, -1, Msg);
  230.     return 1;
  231. }
  232. CMD:actorvida(playerid, params[]) {
  233.     if(!IsPlayerAdmin(playerid)) return 0;
  234.     new actorid, Float:avida;
  235.     if(sscanf(params, "if", actorid, avida)) return SendClientMessage(playerid, -1, "{FF0000}Use: /actorvida [actorid] [vida]");
  236.     if(!IsValidActor(actorid)) return SendClientMessage(playerid, -1, "{FF0000}Actor inválido.");
  237.     new Msg[144];
  238.     SetActorHealth(actorid, avida);
  239.     format(Msg, 144, "{a9c4e4}Vida do actor %s (%i) foi setada para: %4.2f", ActorData[actorid][ActorNome], actorid, avida);
  240.     SendClientMessage(playerid, -1, Msg);
  241.     return 1;
  242. }
  243. CMD:reviveractor(playerid, params[]) {
  244.     if(!IsPlayerAdmin(playerid)) return 0;
  245.     new actorid;
  246.     if(sscanf(params, "i", actorid)) return SendClientMessage(playerid, -1, "{FF0000}Use: /reviveractor [actorid]");
  247.     if(!ResyncActor(actorid)) return SendClientMessage(playerid, -1, "{FF0000}Ocorreu um erro e o actor não pode reviver :(");
  248.     new Msg[144];
  249.     format(Msg, 144, "{FFFF00}Actor %s (%i) revivido!", ActorData[actorid][ActorNome], actorid);
  250.     SendClientMessage(playerid, -1, Msg);
  251.     return 1;
  252. }
  253. CMD:alteraractornome(playerid,params[]) {
  254.     if(!IsPlayerAdmin(playerid)) return 0;
  255.     new actorid, novoNome[32];
  256.     if(sscanf(params, "is[32]", actorid, novoNome)) return SendClientMessage(playerid, -1, "{FF0000}Use: /alteraractornome [actor id] [novo nome]");
  257.     if(!IsValidActor(actorid)) return SendClientMessage(playerid, -1, "{FF0000}Actor inválido.");
  258.     if(!strcmp(ActorData[actorid][ActorNome], novoNome, true)) return SendClientMessage(playerid, -1, "{FF0000}O novo nome é o atual do actor!");
  259.     new Msg[144];
  260.     format(Msg, 144, "{a9c4e4}Você alterou o nome do actor %s (%i) para %s.", ActorData[actorid][ActorNome], actorid, novoNome);
  261.     SendClientMessage(playerid, -1, Msg);
  262.     format(ActorData[actorid][ActorNome], 32, "%s", novoNome);
  263.     format(Msg, 144, "%s (%i)", novoNome, actorid);
  264.     Update3DTextLabelText(ActorData[actorid][ActorLabel], 0xFFFF00AA, Msg);
  265.     return 1;
  266. }
  267. CMD:veractors(playerid, params[]) {
  268.     if(!IsPlayerAdmin(playerid)) return 0;
  269.     SetPVarInt(playerid,"dialog_lista", 0);
  270.     return VerActors(playerid);
  271. }
  272. CMD:comandosactor(playerid) {
  273.     if(!IsPlayerAdmin(playerid)) return 0;
  274.     new di_actor[1000];
  275.     strcat(di_actor, "Comando\tDescrição\n");
  276.     for(new i; i < sizeof(cmds_Actor); i++) {
  277.         strcat(di_actor, cmds_Actor[i][Comando]);
  278.         strcat(di_actor, "\t");
  279.         strcat(di_actor, cmds_Actor[i][Descricao]);
  280.         strcat(di_actor, "\n");
  281.     }
  282.     ShowPlayerDialog(playerid, DIALOG_ACTORCMDS, DIALOG_STYLE_TABLIST_HEADERS, "{FF0000}# {FFFFFF}Comando de actors", di_actor, "Ok", "");
  283.     return 1;
  284. }
  285.  
  286. public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) {
  287.     switch (dialogid) {
  288.         case DIALOG_ACTORCMDS: {
  289.             if(!response) return 0;
  290.             new Msg[144];
  291.             format(Msg, 144, "{FFFF00}%s - %s", cmds_Actor[listitem][Comando], cmds_Actor[listitem][Descricao]);
  292.             SendClientMessage(playerid, -1, Msg);
  293.             return 0;
  294.         }
  295.         case DIALOG_VERACTORS: {
  296.             if(!response) return 0;
  297.             new actors;
  298.             if(listitem > 25) {
  299.                 SetPVarInt(playerid, "dialog_lista", GetPVarInt(playerid, "dialog_proxima_lista"));
  300.                 SetPVarInt(playerid, "dialog_proxima_lista", 0);
  301.                 VerActors(playerid);
  302.                 return 0;
  303.             }
  304.             for(new i = GetPVarInt(playerid, "dialog_lista"); i <= GetActorPoolSize(); i++) {
  305.                 if(!IsValidActor(i)) continue;
  306.                 if(listitem == actors) {
  307.                     new Float:apos[4], Msg[144];
  308.                     GetActorPos(i, apos[0], apos[1], apos[2]);
  309.                     GetActorFacingAngle(i, apos[3]);
  310.                     SetPlayerPos(playerid, apos[0] + 1.0, apos[1] + 1.0, apos[2] + 1.5);
  311.                     SetPlayerFacingAngle(i, apos[3]);
  312.                     format(Msg, 144, "{a9c4e4}Você foi teleportado ao actor %s (%i)", ActorData[i][ActorNome], i);
  313.                     SendClientMessage(playerid, -1, Msg);
  314.                     break;
  315.                 }
  316.                 actors++;
  317.             }
  318.             return 0;
  319.         }
  320.     }
  321.     return 1;
  322. }
  323.  
  324. public OnPlayerGiveDamageActor(playerid, damaged_actorid, Float:amount, weaponid, bodypart)
  325. {
  326.     //printf("[DEBUG] OnPlayerGiveDamageActor(%i, %i, %f, %i, %i)", playerid, damaged_actorid, amount, weaponid, bodypart);
  327.     if(!IsActorInvulnerable(damaged_actorid)) {
  328.         new Float:aVida;
  329.         GetActorHealth(damaged_actorid, aVida);
  330.         SetActorHealth(damaged_actorid, aVida-amount);
  331.         /*new Msg[144];
  332.         format(Msg, 144, "{FF0000}* Actor %i sofreu %4.2f de dano. Agora ele tem %4.2f de vida.", damaged_actorid, amount, (aVida-amount));
  333.         SendClientMessage(playerid, -1, Msg);    */
  334.     }
  335.     return 1;
  336. }
  337.  
  338. public OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, Float:fX, Float:fY, Float:fZ)
  339. {
  340.     //printf("[DEBUG] OnPlayerWeaponShot(%i, %i, %i, %i, %f, %f, %f)", playerid, weaponid, hittype, hitid, fX, fY, fZ);
  341.     return 1;
  342. }
  343.  
  344. stock VerActors(playerid) {
  345.     new di[2500], actors;
  346.     strcat(di, "Actor\tCoordenadas de Posição\tMundo - Skin\tVida\n");
  347.     for(new i = GetPVarInt(playerid, "dialog_lista"); i <= GetActorPoolSize(); i++) {
  348.         if(!IsValidActor(i)) continue;
  349.         if(actors > 25) {
  350.             SetPVarInt(playerid, "dialog_proxima_lista", i);
  351.             strcat(di, "{FFFF00}Próxima página\n");
  352.             break;
  353.         }
  354.         new Float:pA[3], Float:aVida;
  355.         GetActorPos(i, pA[0], pA[1], pA[2]);
  356.         GetActorHealth(i, aVida);
  357.         format(di, sizeof(di), "%s%s (%i)\tx=%4.2f y=%4.2f z=%4.2f\t%i - %i\t%4.2f\n", di,ActorData[i][ActorNome], i,pA[0],pA[1],pA[2],GetActorVirtualWorld(i),ActorData[i][ActorSkin],aVida);
  358.         actors++;
  359.     }
  360.     if(actors==0) return SendClientMessage(playerid, -1, "{FF0000}Não há actors!");
  361.     ShowPlayerDialog(playerid, DIALOG_VERACTORS, DIALOG_STYLE_TABLIST_HEADERS, "{FF0000}# {FFFFFF}Visualizando actors", di, "Ok", "Cancelar");
  362.     return 1;
  363. }
  364. //by Emmet
  365. stock ResyncActor(actorid)
  366. {
  367.     if(IsValidActor(actorid))
  368.     {
  369.         new  Float:x,Float:y, Float:z,
  370.         worldid = GetActorVirtualWorld(actorid);
  371.         GetActorPos(actorid, x, y, z);
  372.         SetActorPos(actorid, 1000.0, -2000.0, 500.0);
  373.         SetActorVirtualWorld(actorid, random(cellmax));
  374.         SetTimerEx("RestoreActor", 850, 0, "iifff", actorid, worldid, x, y, z);
  375.         return 1;
  376.     }
  377.     return 0;
  378. }
  379.  
  380. forward RestoreActor(actorid, worldid, Float:x, Float:y, Float:z);
  381. public RestoreActor(actorid, worldid, Float:x, Float:y, Float:z)
  382. {
  383.     SetActorVirtualWorld(actorid, worldid);
  384.     SetActorPos(actorid, x, y, z);
  385.     SetActorHealth(actorid, 100.0);
  386.     return 1;
  387. }
  388. /*********************************************************************************************************
  389. **********                                                                                    ************
  390. **********                  Gerado em 07/05/2015 por Nícolas Corrêa                           ************
  391. **********                         www.brasilmegatrucker.com                                  ************
  392. **********                                                                                    ************
  393. *********************************************************************************************************/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement