Advertisement
NicK_PB

Actors v0.2 R1-2

Apr 24th, 2017
452
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 37.15 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. v0.1 R4 - 24/05/2015:
  19. - Comando /exportaractors. Gera um script semi pronto com todos os actors criados para um arquivo desejado.
  20. ################################################################################
  21. v0.2 - 24/04/2017:
  22. - Possibilidade de usar o plugin streamer (v2.9+).
  23. Defina USE_STREAMER. Com isto, o LIMITE foi aumentado!
  24. - Comando /alteraractornome para /nomeactor.
  25. - Novo comando: /editaractor (mover o actor como se fosse objeto)
  26. - Adicionado comandos abreviados
  27. v0.2 R1-2 - 25/04/2017:
  28. - Correções de bugs
  29.  
  30.  
  31.  
  32.  
  33. *******************************************************************************/
  34. #include <a_samp>
  35. #include <zcmd>
  36. #include <sscanf2>
  37.  
  38. #define USE_STREAMER
  39. #if defined USE_STREAMER
  40. #include <streamer> // 2.9++
  41. #if !defined CreateDynamicActor
  42. #error Plugin Streamer Desatualizado!
  43. #endif
  44. #undef MAX_ACTORS
  45. #define MAX_ACTORS 10000 // Seu Limite
  46. #endif
  47.  
  48. #define DIALOG_ACTORCMDS 3202
  49. #define DIALOG_VERACTORS 3203
  50.  
  51. enum cmd_infos
  52. {
  53. Comando[128],
  54. Abreviado[128],
  55. Descricao[128]
  56. };
  57. new cmds_Actor[][cmd_infos] = {
  58. {"/criaractor [skin id] [nome]", "/cac", "Cria um actor com a skin desejada e com um nome"},
  59. {"/destruiractor [actor id]", "/dac", "Destroi um actor"},
  60. {"/destruirtodosactors", "/dta", "Destrói todos os actors do servidor"},
  61. {"/animaractor [actor id] [animlib] [animname] [loop]", "/ania", "Anima um actor"},
  62. {"/pararanimactor [actor id]", "/pana", "Para a animação de um actor"},
  63. {"/animtodosactors [animlib] [animname] [loop]", "/anta", "Anima todos os actors do servidor"},
  64. {"/pararanimtodosactors", "/panta", "Para a animação de todos os actors"},
  65. {"/actorpos [actor id] [x] [y] [z] [rotação]", "/apos", "Seta a posição de um actor"},
  66. {"/actormundo [actor id] [mundo virtual]", "/amun", "Seta o mundo virtual de um actor"},
  67. {"/actorvuneravel [actor id]", "/acin", "Deixa um actor vuneravel/invuneravel"},
  68. {"/actorvida [actor id] [vida]", "/acv", "Seta a vida de um actor"},
  69. {"/reviveractor [actor id]", "/reva", "Revive um actor"},
  70. {"/nomeactor [actor id] [novo nome]", "/nac", "Altera o nome de um actor"},
  71. {"/editaractor [actor id]", "/eda", "Edita a posição de um actor"},
  72. {"/veractors", "/va", "Visualiza os actors criados"},
  73. {"/exportaractors [arquivo.pwn]", "/exa", "Gera um script semi-pronto para uso dos actors criados"},
  74. {"/comandosactor", "/acmd", "Visualiza a página de comandos de actors"}
  75. };
  76.  
  77. enum i_actor
  78. {
  79. ActorNome[32],
  80. ActorSkin,
  81. Text3D:ActorLabel,
  82. ActorObject // v0.2
  83. };
  84. new ActorData[MAX_ACTORS][i_actor];
  85.  
  86. public OnFilterScriptInit()
  87. {
  88. for(new i; i < MAX_ACTORS; i++) {
  89. ActorData[i][ActorSkin] = -1;
  90. ActorData[i][ActorLabel] = Text3D:INVALID_3DTEXT_ID;
  91. format(ActorData[i][ActorNome], 32, "");
  92. }
  93. print("*****************************************");
  94. print("**** Actor debug - básico [CARREGADO]****");
  95. #if defined USE_STREAMER
  96. print("******* Utilizando plugin: streamer ******");
  97. #endif
  98. print("*****************************************");
  99. return 1;
  100. }
  101.  
  102. public OnFilterScriptExit()
  103. {
  104. for(new i; i <= GetActorPoolSize(); i++) {
  105. #if !defined USE_STREAMER
  106. if(!IsValidActor(i)) continue;
  107. #else
  108. if(!IsValidDynamicActor(i)) continue;
  109. #endif
  110. if(ActorData[i][ActorSkin] != -1) {
  111. #if !defined USE_STREAMER
  112. DestroyActor(i);
  113. Delete3DTextLabel(ActorData[i][ActorLabel]);
  114. DestroyObject(ActorData[i][ActorObject]);
  115. #else
  116. DestroyDynamicActor(i);
  117. DestroyDynamic3DTextLabel(ActorData[i][ActorLabel]);
  118. DestroyDynamicObject(ActorData[i][ActorObject]);
  119. #endif
  120. ActorData[i][ActorSkin] = -1;
  121. format(ActorData[i][ActorNome], 32, "");
  122. }
  123. }
  124. print("*****************************************");
  125. print("**** Actor debug - básico [DESLIGADO]****");
  126. print("*****************************************");
  127. return 1;
  128. }
  129.  
  130. public OnPlayerSpawn(playerid) {
  131. if(IsPlayerAdmin(playerid)) return SendClientMessage(playerid, -1, "{FFFF00}* Sistema de Testes de Actors está ligado. Use /acmd para ver os comandos!");
  132. return 1;
  133. }
  134. /////////// Comandos //////////////
  135. CMD:criaractor(playerid, params[]) {
  136. if(!IsPlayerAdmin(playerid)) return 0;
  137. new skin_actor, Nome[32];
  138. if(sscanf(params, "is[32]", skin_actor, Nome)) return SendClientMessage(playerid, -1, "{FF0000}Use: /criaractor [skin id] [nome]");
  139. if(skin_actor < 0 || skin_actor > 311) return SendClientMessage(playerid, -1, "{FF0000}O id é inválido!");
  140. new Float:pP[4], Msg[144], Actorid;
  141. GetPlayerPos(playerid, pP[0], pP[1], pP[2]);
  142. GetPlayerFacingAngle(playerid, pP[3]);
  143. #if !defined USE_STREAMER
  144. Actorid = CreateActor(skin_actor, pP[0], pP[1], pP[2], pP[3]);
  145. if(!IsValidActor(Actorid)) return SendClientMessage(playerid, -1, "{FF0000}Ocorreu um erro. Provavelmente o máximo de actors foi atingido!");
  146. SetActorVirtualWorld(Actorid, GetPlayerVirtualWorld(playerid));
  147. format(Msg, 144, "%s (%i)", Nome, Actorid);
  148. ActorData[Actorid][ActorLabel] = Create3DTextLabel(Msg, 0xFFFF00AA, pP[0], pP[1], pP[2] + 1.0, 30.0, GetPlayerVirtualWorld(playerid));
  149. ActorData[Actorid][ActorObject] = CreateObject(1924, pP[0], pP[1], pP[2], 0.0, 0.0, pP[3]);
  150. SetObjectMaterialText(ActorData[Actorid][ActorObject], " ");
  151. #else
  152. Actorid = CreateDynamicActor(skin_actor, pP[0], pP[1], pP[2], pP[3], _, _, GetPlayerVirtualWorld(playerid));
  153. if(!IsValidDynamicActor(Actorid)) return SendClientMessage(playerid, -1, "{FF0000}Ocorreu um erro. Provavelmente o máximo de actors foi atingido!");
  154. if(Actorid >= MAX_ACTORS) return DestroyDynamicActor(Actorid), SendClientMessage(playerid, -1, "{FF0000}Você atingiu o limite de actors.");
  155. format(Msg, 144, "%s (%i)", Nome, Actorid);
  156. ActorData[Actorid][ActorLabel] = CreateDynamic3DTextLabel(Msg, 0xFFFF00AA, pP[0], pP[1], pP[2] + 1.0, 30.0, INVALID_PLAYER_ID, INVALID_VEHICLE_ID, 0, GetPlayerVirtualWorld(playerid));
  157. ActorData[Actorid][ActorObject] = CreateDynamicObject(1924, pP[0], pP[1], pP[2], 0.0, 0.0, pP[3]);
  158. SetDynamicObjectMaterialText(ActorData[Actorid][ActorObject], 0, " ");
  159. #endif
  160. ActorData[Actorid][ActorSkin] = skin_actor;
  161. format(ActorData[Actorid][ActorNome], 32, Nome);
  162. format(Msg, 144, "{FFFF00}Actor id: %i (Skin: %i) (Nome: %s)", Actorid, skin_actor, Nome);
  163. SendClientMessage(playerid, -1, Msg);
  164. SetPlayerPos(playerid, pP[0] + 1.0, pP[1] + 1.0, pP[2]);
  165. return 1;
  166. }
  167. CMD:destruiractor(playerid, params[]) {
  168. if(!IsPlayerAdmin(playerid)) return 0;
  169. new actorid, Msg[144];
  170. if(sscanf(params, "i", actorid)) return SendClientMessage(playerid, -1, "{FF0000}Use: /destruiractor [actor id]");
  171. #if !defined USE_STREAMER
  172. if(!IsValidActor(actorid)) return SendClientMessage(playerid, -1, "{FF0000}Actor inválido.");
  173. DestroyActor(actorid);
  174. Delete3DTextLabel(ActorData[actorid][ActorLabel]);
  175. DestroyObject(ActorData[actorid][ActorObject]);
  176. #else
  177. if(!IsValidDynamicActor(actorid)) return SendClientMessage(playerid, -1, "{FF0000}Actor inválido.");
  178. DestroyDynamicActor(actorid);
  179. DestroyDynamic3DTextLabel(ActorData[actorid][ActorLabel]);
  180. DestroyDynamicObject(ActorData[actorid][ActorObject]);
  181. #endif
  182. format(Msg, 144, "{FFFF00}Actor %s (%i) foi destruido.", ActorData[actorid][ActorNome], actorid);
  183. SendClientMessage(playerid, -1, Msg);
  184. ActorData[actorid][ActorSkin] = -1;
  185. format(ActorData[actorid][ActorNome], 32, "");
  186. return 1;
  187. }
  188. CMD:destruirtodosactors(playerid, params[]) {
  189. if(!IsPlayerAdmin(playerid)) return 0;
  190. new Msg[144], actors, amax;
  191. #if !defined USE_STREAMER
  192. amax = GetActorPoolSize();
  193. #else
  194. amax = Streamer_CountItems(STREAMER_TYPE_ACTOR, 1);
  195. #endif
  196. for(new i; i <= amax; i++) {
  197. if(ActorData[i][ActorSkin] == -1) continue;
  198. #if !defined USE_STREAMER
  199. if(!IsValidActor(i)) continue;
  200. Delete3DTextLabel(ActorData[i][ActorLabel]);
  201. DestroyObject(ActorData[i][ActorObject]);
  202. DestroyActor(i);
  203. #else
  204. if(!IsValidDynamicActor(i)) continue;
  205. DestroyDynamic3DTextLabel(ActorData[i][ActorLabel]);
  206. DestroyDynamicObject(ActorData[i][ActorObject]);
  207. DestroyDynamicActor(i);
  208. #endif
  209. ActorData[i][ActorSkin] = -1;
  210. format(ActorData[i][ActorNome], 32, "");
  211. actors++;
  212. }
  213. if(actors==0) return SendClientMessage(playerid, -1, "{FF0000}Não há actors!");
  214. format(Msg, 144, "{FFFF00}Foram destruidos %i actors.", actors);
  215. return SendClientMessage(playerid, -1, Msg);
  216. }
  217. CMD:animaractor(playerid, params[]) {
  218. if(!IsPlayerAdmin(playerid)) return 0;
  219. new actorid, animlib[32], animname[32], loop, Msg[144];
  220. 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)");
  221. #if !defined USE_STREAMER
  222. if(!IsValidActor(actorid)) return SendClientMessage(playerid, -1, "{FF0000}Actor inválido.");
  223. ClearActorAnimations(actorid);
  224. ApplyActorAnimation(actorid, animlib, animname, 4.1, loop, 1, 1, 0, 0);
  225. #else
  226. if(!IsValidDynamicActor(actorid)) return SendClientMessage(playerid, -1, "{FF0000}Actor inválido.");
  227. ClearDynamicActorAnimations(actorid);
  228. ApplyDynamicActorAnimation(actorid, animlib, animname, 4.1, loop, 1, 1, 0, 0);
  229. #endif
  230. 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")));
  231. return SendClientMessage(playerid, -1, Msg);
  232. }
  233. CMD:pararanimactor(playerid, params[]) {
  234. if(!IsPlayerAdmin(playerid)) return 0;
  235. new actorid, Msg[144];
  236. if(sscanf(params, "i", actorid)) return SendClientMessage(playerid, -1, "{FF0000}Use: /pararanimactor [actor id]");
  237. #if !defined USE_STREAMER
  238. if(!IsValidActor(actorid)) return SendClientMessage(playerid, -1, "{FF0000}Actor inválido.");
  239. ClearActorAnimations(actorid);
  240. #else
  241. if(!IsValidDynamicActor(actorid)) return SendClientMessage(playerid, -1, "{FF0000}Actor inválido.");
  242. ClearDynamicActorAnimations(actorid);
  243. #endif
  244. format(Msg, 144, "{a9c4e4}Animação do actor %s (%i) foi parada!", ActorData[actorid][ActorNome], actorid);
  245. return SendClientMessage(playerid, -1, Msg);
  246. }
  247. CMD:animtodosactors(playerid, params[]) {
  248. if(!IsPlayerAdmin(playerid)) return 0;
  249. new animlib[32], animname[32], loop, Msg[144];
  250. if(sscanf(params, "s[32]s[32]i", animlib,animname,loop)) return SendClientMessage(playerid, -1, "{FF0000}Use: /animtodosactos [animlib] [animname] [loop (0-1)]");
  251. #if !defined USE_STREAMER
  252. for(new i; i <= GetActorPoolSize(); i++) {
  253. if(!IsValidActor(i)) continue;
  254. ClearActorAnimations(i);
  255. ApplyActorAnimation(i, animlib, animname, 4.1, loop, 1, 1, 0, 0);
  256. }
  257. #else
  258. for(new i; i <= Streamer_CountItems(STREAMER_TYPE_ACTOR, 1); i++) {
  259. if(!IsValidDynamicActor(i)) continue;
  260. ClearDynamicActorAnimations(i);
  261. ApplyDynamicActorAnimation(i, animlib, animname, 4.1, loop, 1, 1, 0, 0);
  262. }
  263. #endif
  264. 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")));
  265. return SendClientMessage(playerid, -1, Msg);
  266. }
  267. CMD:pararanimtodosactors(playerid, params[]) {
  268. if(!IsPlayerAdmin(playerid)) return 0;
  269. #if !defined USE_STREAMER
  270. for(new i; i <= GetActorPoolSize(); i++) {
  271. if(!IsValidActor(i)) continue;
  272. ClearActorAnimations(i);
  273. }
  274. #else
  275. for(new i; i <= Streamer_CountItems(STREAMER_TYPE_ACTOR, 1); i++) {
  276. if(!IsValidDynamicActor(i)) continue;
  277. ClearDynamicActorAnimations(i);
  278. }
  279. #endif
  280. return SendClientMessage(playerid, -1, "{FFFF00}A animação de todos os actors existentes foram paradas.");
  281. }
  282. CMD:actorpos(playerid, params[]) {
  283. if(!IsPlayerAdmin(playerid)) return 0;
  284. new actorid, Float:apos[4], Msg[144];
  285. 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]");
  286. #if !defined USE_STREAMER
  287. if(!IsValidActor(actorid)) return SendClientMessage(playerid, -1, "{FF0000}Actor inválido.");
  288. DestroyObject(ActorData[actorid][ActorObject]);
  289. SetActorPos(actorid, apos[0], apos[1], apos[2]);
  290. SetActorFacingAngle(actorid, apos[3]);
  291. ActorData[actorid][ActorObject] = CreateObject(1924, apos[0], apos[1], apos[2], 0.0, 0.0, apos[3]);
  292. SetObjectMaterialText(ActorData[actorid][ActorObject], " ");
  293. Delete3DTextLabel(ActorData[actorid][ActorLabel]);
  294. format(Msg, 144, "%s (%i)", ActorData[actorid][ActorNome], actorid);
  295. ActorData[actorid][ActorLabel] = Create3DTextLabel(Msg, 0xFFFF00AA, apos[0], apos[1], apos[2] + 1.0, 30.0, GetActorVirtualWorld(actorid));
  296. #else
  297. if(!IsValidDynamicActor(actorid)) return SendClientMessage(playerid, -1, "{FF0000}Actor inválido.");
  298. DestroyDynamicObject(ActorData[actorid][ActorObject]);
  299. SetDynamicActorPos(actorid, apos[0], apos[1], apos[2]);
  300. SetDynamicActorFacingAngle(actorid, apos[3]);
  301. ActorData[actorid][ActorObject] = CreateDynamicObject(1924, apos[0], apos[1], apos[2], 0.0, 0.0, apos[3]);
  302. SetDynamicObjectMaterialText(ActorData[actorid][ActorObject], 0, " ");
  303. DestroyDynamic3DTextLabel(ActorData[actorid][ActorLabel]);
  304. format(Msg, 144, "%s (%i)", ActorData[actorid][ActorNome], actorid);
  305. ActorData[actorid][ActorLabel] = CreateDynamic3DTextLabel(Msg, 0xFFFF00AA, apos[0], apos[1], apos[2] + 1.0, 30.0, INVALID_PLAYER_ID, INVALID_VEHICLE_ID, 0, GetPlayerVirtualWorld(playerid));
  306. #endif
  307. 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]);
  308. return SendClientMessage(playerid, -1, Msg);
  309. }
  310. CMD:actormundo(playerid, params[]) {
  311. if(!IsPlayerAdmin(playerid)) return 0;
  312. new actorid, amundo, Msg[144], Float:apos[3];
  313. if(sscanf(params, "ii", actorid, amundo)) return SendClientMessage(playerid, -1, "{FF0000}Use: /actormundo [actorid] [mundo]");
  314. #if !defined USE_STREAMER
  315. if(!IsValidActor(actorid)) return SendClientMessage(playerid, -1, "{FF0000}Actor inválido.");
  316. GetActorPos(actorid, apos[0], apos[1], apos[2]);
  317. SetActorVirtualWorld(actorid, amundo);
  318. Delete3DTextLabel(ActorData[actorid][ActorLabel]);
  319. format(Msg, 144, "%s (%i)", ActorData[actorid][ActorNome], actorid);
  320. ActorData[actorid][ActorLabel] = Create3DTextLabel(Msg, 0xFFFF00AA, apos[0], apos[1], apos[2] + 1.0, 30.0, amundo);
  321. #else
  322. if(!IsValidDynamicActor(actorid)) return SendClientMessage(playerid, -1, "{FF0000}Actor inválido.");
  323. GetDynamicActorPos(actorid, apos[0], apos[1], apos[2]);
  324. SetDynamicActorVirtualWorld(actorid, amundo);
  325. DestroyDynamic3DTextLabel(ActorData[actorid][ActorLabel]);
  326. format(Msg, 144, "%s (%i)", ActorData[actorid][ActorNome], actorid);
  327. ActorData[actorid][ActorLabel] = CreateDynamic3DTextLabel(Msg, 0xFFFF00AA, apos[0], apos[1], apos[2] + 1.0, 30.0, INVALID_PLAYER_ID, INVALID_VEHICLE_ID, 0, amundo);
  328. #endif
  329. format(Msg, 144, "{a9c4e4}Actor %s (%i) em mundo %i.", ActorData[actorid][ActorNome], actorid, amundo);
  330. SendClientMessage(playerid, -1, Msg);
  331. return 1;
  332. }
  333. CMD:actorvuneravel(playerid, params[]) {
  334. if(!IsPlayerAdmin(playerid)) return 0;
  335. new actorid, Msg[144];
  336. if(sscanf(params, "i", actorid)) return SendClientMessage(playerid, -1, "{FF0000}Use:/actorvuneravel [actorid]");
  337. #if !defined USE_STREAMER
  338. if(!IsValidActor(actorid)) return SendClientMessage(playerid, -1, "{FF0000}Actor inválido.");
  339. if(IsActorInvulnerable(actorid)) {
  340. SetActorInvulnerable(actorid, false);
  341. format(Msg, 144, "{FFFF00}Actor %s (%i) agora é vunerável.", ActorData[actorid][ActorNome], actorid);
  342. }
  343. else {
  344. SetActorInvulnerable(actorid, true);
  345. format(Msg, 144, "{FFFF00}Actor %s (%i) agora é invunerável.", ActorData[actorid][ActorNome], actorid);
  346. }
  347. #else
  348. if(!IsValidDynamicActor(actorid)) return SendClientMessage(playerid, -1, "{FF0000}Actor inválido.");
  349. if(IsDynamicActorInvulnerable(actorid)) {
  350. SetDynamicActorInvulnerable(actorid, false);
  351. format(Msg, 144, "{FFFF00}Actor %s (%i) agora é vunerável.", ActorData[actorid][ActorNome], actorid);
  352. }
  353. else {
  354. SetDynamicActorInvulnerable(actorid, true);
  355. format(Msg, 144, "{FFFF00}Actor %s (%i) agora é invunerável.", ActorData[actorid][ActorNome], actorid);
  356. }
  357. #endif
  358. SendClientMessage(playerid, -1, Msg);
  359. return 1;
  360. }
  361. CMD:actorvida(playerid, params[]) {
  362. if(!IsPlayerAdmin(playerid)) return 0;
  363. new actorid, Float:avida, Msg[144];
  364. if(sscanf(params, "if", actorid, avida)) return SendClientMessage(playerid, -1, "{FF0000}Use: /actorvida [actorid] [vida]");
  365. #if !defined USE_STREAMER
  366. if(!IsValidActor(actorid)) return SendClientMessage(playerid, -1, "{FF0000}Actor inválido.");
  367. SetActorHealth(actorid, avida);
  368. #else
  369. if(!IsValidDynamicActor(actorid)) return SendClientMessage(playerid, -1, "{FF0000}Actor inválido.");
  370. SetDynamicActorHealth(actorid, avida);
  371. #endif
  372. format(Msg, 144, "{a9c4e4}Vida do actor %s (%i) foi setada para: %4.2f", ActorData[actorid][ActorNome], actorid, avida);
  373. SendClientMessage(playerid, -1, Msg);
  374. return 1;
  375. }
  376. CMD:reviveractor(playerid, params[]) {
  377. if(!IsPlayerAdmin(playerid)) return 0;
  378. new actorid, Msg[144];
  379. if(sscanf(params, "i", actorid)) return SendClientMessage(playerid, -1, "{FF0000}Use: /reviveractor [actorid]");
  380. if(!ResyncActor(actorid)) return SendClientMessage(playerid, -1, "{FF0000}Ocorreu um erro e o actor não pode reviver :(");
  381. format(Msg, 144, "{FFFF00}Actor %s (%i) revivido!", ActorData[actorid][ActorNome], actorid);
  382. SendClientMessage(playerid, -1, Msg);
  383. return 1;
  384. }
  385. CMD:nomeactor(playerid,params[]) {
  386. if(!IsPlayerAdmin(playerid)) return 0;
  387. new actorid, novoNome[32], Msg[144];
  388. if(sscanf(params, "is[32]", actorid, novoNome)) return SendClientMessage(playerid, -1, "{FF0000}Use: /nomeactor [actor id] [novo nome]");
  389. #if !defined USE_STREAMER
  390. if(!IsValidActor(actorid)) return SendClientMessage(playerid, -1, "{FF0000}Actor inválido.");
  391. #else
  392. if(!IsValidDynamicActor(actorid)) return SendClientMessage(playerid, -1, "{FF0000}Actor inválido.");
  393. #endif
  394. if(!strcmp(ActorData[actorid][ActorNome], novoNome, true)) return SendClientMessage(playerid, -1, "{FF0000}O novo nome é o atual do actor!");
  395. format(Msg, 144, "{a9c4e4}Você alterou o nome do actor %s (%i) para %s.", ActorData[actorid][ActorNome], actorid, novoNome);
  396. SendClientMessage(playerid, -1, Msg);
  397. format(ActorData[actorid][ActorNome], 32, "%s", novoNome);
  398. format(Msg, 144, "%s (%i)", novoNome, actorid);
  399. #if !defined USE_STREAMER
  400. Update3DTextLabelText(ActorData[actorid][ActorLabel], 0xFFFF00AA, Msg);
  401. #else
  402. UpdateDynamic3DTextLabelText(ActorData[actorid][ActorLabel], 0xFFFF00AA, Msg);
  403. #endif
  404. return 1;
  405. }
  406. CMD:exportaractors(playerid, params[]) {
  407. if(!IsPlayerAdmin(playerid)) return 0;
  408. new arquivo_nome[128];
  409. if(sscanf(params, "s[128]", arquivo_nome)) return SendClientMessage(playerid, -1, "{FF0000}Use: /exportaractors [nome do arquivo.pwn]");
  410. if(fexist(arquivo_nome)) return SendClientMessage(playerid, -1, "{FF0000}Este arquivo existe no diretório. Por favor insira outro nome!");
  411. new File:pActor, str[100], Msg[144];
  412. pActor = fopen(arquivo_nome, io_append);
  413. #if !defined USE_STREAMER
  414. fwrite(pActor, "#include a_samp\r\n\r\n");
  415. format(str, sizeof(str), "new xActors[%i];\r\n", GetActorPoolSize() + 1);
  416. #else
  417. fwrite(pActor, "#include a_samp\r\n#include streamer\r\n\r\n");
  418. format(str, sizeof(str), "new xActors[%i];\r\n", Streamer_CountItems(STREAMER_TYPE_ACTOR, 1));
  419. #endif
  420. fwrite(pActor, str);
  421. fwrite(pActor, "\r\npublic OnFilterScriptInit()\r\n{\r\n");
  422. #if !defined USE_STREAMER
  423. for(new i; i <= GetActorPoolSize(); i++) {
  424. if(ActorData[i][ActorSkin] == -1) continue;
  425. new Float:posAc[4];
  426. GetActorPos(i, posAc[0], posAc[1], posAc[2]);
  427. GetActorFacingAngle(i, posAc[3]);
  428. format(str, sizeof(str), "\txActors[%i] = CreateActor(%i, %4.2f, %4.2f, %4.2f, %4.2f); // %s \r\n",, ActorData[i][ActorSkin], posAc[0], posAc[1], posAc[2], posAc[3], ActorData[i][ActorNome]);
  429. fwrite(pActor, str);
  430. }
  431. fwrite(pActor, "\tprint(\"[FS EXPORTADO] Actors criados!\");\r\n\treturn 1;\r\n}\r\n");
  432. fwrite(pActor, "public OnFilterScriptExit()\r\n{\r\n\tfor(new x; x < sizeof(xActors); x++) {\r\n\
  433. \t\tDestroyActor(xActors[x]);\r\n\t}\r\n\treturn 1;\r\n}");
  434. #else
  435. for(new i; i <= Streamer_CountItems(STREAMER_TYPE_ACTOR, 1); i++) {
  436. if(ActorData[i][ActorSkin] == -1) continue;
  437. new Float:posAc[4];
  438. GetDynamicActorPos(i, posAc[0], posAc[1], posAc[2]);
  439. GetDynamicActorFacingAngle(i, posAc[3]);
  440. format(str, sizeof(str), "\txActors[%i] = CreateDynamicActor(%i, %4.2f, %4.2f, %4.2f, %4.2f, 1, 100.0, %i); // %s \r\n",i-1,ActorData[i][ActorSkin], posAc[0], posAc[1], posAc[2], posAc[3], GetDynamicActorVirtualWorld(i), ActorData[i][ActorNome]);
  441. fwrite(pActor, str);
  442. }
  443. fwrite(pActor, "\tprint(\"[FS EXPORTADO] Actors dynamicos criados!\");\r\n\treturn 1;\r\n}\r\n");
  444. fwrite(pActor, "public OnFilterScriptExit()\r\n{\r\n\tfor(new x; x < sizeof(xActors); x++) {\r\n\
  445. \t\tDestroyDynamicActor(xActors[x]);\r\n\t}\r\n\treturn 1;\r\n}");
  446. #endif
  447.  
  448. fwrite(pActor, "\r\n\r\n/**************************************************\r\n\
  449. Este FilterScript foi exportado pelo Test Actor\r\n\
  450. \t\twww.brasilmegatrucker.com\r\n\
  451. ***************************************************/");
  452. fclose(pActor);
  453. format(Msg, 144, "{a9c4e4}Exportado actors para o arquivo {ffffff}%s{a9c4e4} com sucesso!", arquivo_nome);
  454. SendClientMessage(playerid, -1, Msg);
  455. return 1;
  456. }
  457. CMD:veractors(playerid, params[]) {
  458. if(!IsPlayerAdmin(playerid)) return 0;
  459. SetPVarInt(playerid,"dialog_lista", 0);
  460. return VerActors(playerid);
  461. }
  462. CMD:comandosactor(playerid) {
  463. if(!IsPlayerAdmin(playerid)) return 0;
  464. new di_actor[1500];
  465. strcat(di_actor, "Comando\tAbreviado\tDescrição\n");
  466. for(new i; i < sizeof(cmds_Actor); i++) {
  467. strcat(di_actor, cmds_Actor[i][Comando]);
  468. strcat(di_actor, "\t");
  469. strcat(di_actor, cmds_Actor[i][Abreviado]);
  470. strcat(di_actor, "\t");
  471. strcat(di_actor, cmds_Actor[i][Descricao]);
  472. strcat(di_actor, "\n");
  473. }
  474. return ShowPlayerDialog(playerid, DIALOG_ACTORCMDS, DIALOG_STYLE_TABLIST_HEADERS, "{FF0000}# {FFFFFF}Comando de actors", di_actor, "Ok", "");
  475. }
  476.  
  477. CMD:editaractor(playerid, params[]) {
  478. new actorid, Msg[144];
  479. if(sscanf(params, "i", actorid)) return SendClientMessage(playerid, -1, "{FF0000}Use: /editaractor [actorid]");
  480. #if !defined USE_STREAMER
  481. if(!IsValidActor(actorid) || !IsValidObject(ActorData[actorid][ActorObject])) return SendClientMessage(playerid, -1, "{FF0000}Actor inválido para edição.");
  482. EditObject(playerid, ActorData[actorid][ActorObject]);
  483. #else
  484. if(!IsValidDynamicActor(actorid) || !IsValidDynamicObject(ActorData[actorid][ActorObject])) return SendClientMessage(playerid, -1, "{FF0000}Actor inválido para edição.");
  485. EditDynamicObject(playerid, ActorData[actorid][ActorObject]);
  486. #endif
  487. format(Msg, sizeof(Msg), "{FFFF00}* Editando actor %s (%i)", ActorData[actorid][ActorNome], actorid);
  488. return SendClientMessage(playerid, -1, Msg);
  489. }
  490. // Retorno de Comandos
  491. CMD:cac(playerid, params[]) return cmd_criaractor(playerid, params);
  492. CMD:dac(playerid, params[]) return cmd_destruiractor(playerid, params);
  493. CMD:dta(playerid, params[]) return cmd_destruirtodosactors(playerid, params);
  494. CMD:ania(playerid, params[]) return cmd_animaractor(playerid, params);
  495. CMD:pana(playerid, params[]) return cmd_pararanimactor(playerid, params);
  496. CMD:anta(playerid, params[]) return cmd_animtodosactors(playerid, params);
  497. CMD:panta(playerid, params[]) return cmd_pararanimtodosactors(playerid, params);
  498. CMD:apos(playerid, params[]) return cmd_actorpos(playerid, params);
  499. CMD:amun(playerid, params[]) return cmd_actormundo(playerid, params);
  500. CMD:acin(playerid, params[]) return cmd_actorvuneravel(playerid, params);
  501. CMD:acv(playerid, params[]) return cmd_actorvida(playerid, params);
  502. CMD:reva(playerid, params[]) return cmd_reviveractor(playerid, params);
  503. CMD:nac(playerid, params[]) return cmd_nomeactor(playerid, params);
  504. CMD:eda(playerid, params[]) return cmd_editaractor(playerid, params);
  505. CMD:va(playerid, params[]) return cmd_veractors(playerid, params);
  506. CMD:exa(playerid, params[]) return cmd_exportaractors(playerid, params);
  507. CMD:acmd(playerid) return cmd_comandosactor(playerid);
  508.  
  509. /////////////////////////////////////////////////////////////////////////////
  510. public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) {
  511. switch (dialogid) {
  512. case DIALOG_ACTORCMDS: {
  513. if(!response) return 0;
  514. new Msg[144];
  515. format(Msg, 144, "{FFFF00}%s (%s): %s", cmds_Actor[listitem][Comando], cmds_Actor[listitem][Abreviado], cmds_Actor[listitem][Descricao]);
  516. SendClientMessage(playerid, -1, Msg);
  517. return 0;
  518. }
  519. case DIALOG_VERACTORS: {
  520. if(!response) return 0;
  521. new actors, Float:apos[4], Msg[144];
  522. if(listitem > 25) {
  523. SetPVarInt(playerid, "dialog_lista", GetPVarInt(playerid, "dialog_proxima_lista"));
  524. SetPVarInt(playerid, "dialog_proxima_lista", 0);
  525. VerActors(playerid);
  526. return 0;
  527. }
  528. #if !defined USE_STREAMER
  529. for(new i = GetPVarInt(playerid, "dialog_lista"); i <= GetActorPoolSize(); i++) {
  530. if(!IsValidActor(i)) continue;
  531. if(listitem == actors) {
  532. GetActorPos(i, apos[0], apos[1], apos[2]);
  533. GetActorFacingAngle(i, apos[3]);
  534. SetPlayerPos(playerid, apos[0] + 1.0, apos[1] + 1.0, apos[2] + 1.5);
  535. SetPlayerFacingAngle(i, apos[3]);
  536. format(Msg, 144, "{a9c4e4}Você foi teleportado ao actor %s (%i)", ActorData[i][ActorNome], i);
  537. SendClientMessage(playerid, -1, Msg);
  538. break;
  539. }
  540. actors++;
  541. }
  542. #else
  543. for(new i = GetPVarInt(playerid, "dialog_lista"); i <= Streamer_CountItems(STREAMER_TYPE_ACTOR, 1); i++) {
  544. if(!IsValidDynamicActor(i)) continue;
  545. if(listitem == actors) {
  546. GetDynamicActorPos(i, apos[0], apos[1], apos[2]);
  547. GetDynamicActorFacingAngle(i, apos[3]);
  548. SetPlayerPos(playerid, apos[0] + 1.0, apos[1] + 1.0, apos[2] + 1.5);
  549. SetPlayerFacingAngle(i, apos[3]);
  550. format(Msg, 144, "{a9c4e4}Você foi teleportado ao actor %s (%i)", ActorData[i][ActorNome], i);
  551. SendClientMessage(playerid, -1, Msg);
  552. break;
  553. }
  554. actors++;
  555. }
  556. #endif
  557. return 0;
  558. }
  559. }
  560. return 1;
  561. }
  562. #if !defined USE_STREAMER
  563. public OnPlayerGiveDamageActor(playerid, damaged_actorid, Float:amount, weaponid, bodypart)
  564. {
  565. if(!IsActorInvulnerable(damaged_actorid)) {
  566. new Float:aVida;
  567. GetActorHealth(damaged_actorid, aVida);
  568. SetActorHealth(damaged_actorid, aVida-amount);
  569. }
  570. return 1;
  571. }
  572. public OnPlayerEditObject(playerid, playerobject, objectid, response, Float:fX, Float:fY, Float:fZ, Float:fRotX, Float:fRotY, Float:fRotZ)
  573. {
  574. if(playerobject) return 1;
  575. new Float:oldPos[6], Msg[144];
  576. GetObjectPos(objectid, oldPos[0], oldPos[1], oldPos[2]);
  577. GetObjectRot(objectid, oldPos[3], oldPos[4], oldPos[5]);
  578. for(new i; i <= GetActorPoolSize(); i++) {
  579. if(ActorData[i][ActorObject] == objectid) {
  580. switch(response) {
  581. case EDIT_RESPONSE_CANCEL:{
  582. SetObjectPos(objectid, oldPos[0], oldPos[1], oldPos[2]);
  583. SetObjectRot(objectid, oldPos[3], oldPos[4], oldPos[5]);
  584. SetActorPos(i, oldPos[0], oldPos[1], oldPos[2]);
  585. SetActorFacingAngle(i, oldPos[5]);
  586. ResyncActor(i);
  587. }
  588. case EDIT_RESPONSE_UPDATE: {
  589. SetActorPos(i, fX, fY, fZ);
  590. SetActorFacingAngle(i, fRotZ);
  591. }
  592. case EDIT_RESPONSE_FINAL: {
  593. SetActorPos(i, fX, fY, fZ);
  594. SetActorFacingAngle(i, fRotZ);
  595. SetObjectPos(objectid, fX, fY, fZ);
  596. SetObjectRot(objectid, 0.0, 0.0, fRotZ);
  597. Delete3DTextLabel(ActorData[i][ActorLabel]);
  598. format(Msg, sizeof(Msg), "%s (%i)", ActorData[i][ActorNome], i);
  599. ActorData[i][ActorLabel] = Create3DTextLabel(Msg, 0xFFFF00AA, fX, fY, fZ + 1.0, 30.0, GetActorVirtualWorld(i));
  600. ResyncActor(i);
  601. }
  602. }
  603. break;
  604. }
  605. }
  606. return 0;
  607. }
  608. #else
  609. public OnPlayerGiveDamageDynamicActor(playerid, actorid, Float:amount, weaponid, bodypart) {
  610. if(!IsDynamicActorInvulnerable(actorid)) {
  611. new Float:aVida;
  612. GetDynamicActorHealth(actorid, aVida);
  613. SetDynamicActorHealth(actorid, aVida-amount);
  614. }
  615. return 1;
  616. }
  617. public OnPlayerEditDynamicObject(playerid, objectid, response, Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz) {
  618. new Float:oldPos[6], Msg[144];
  619. GetDynamicObjectPos(objectid, oldPos[0], oldPos[1], oldPos[2]);
  620. GetDynamicObjectRot(objectid, oldPos[3], oldPos[4], oldPos[5]);
  621. for(new i; i <= Streamer_CountItems(STREAMER_TYPE_ACTOR, 1); i++) {
  622. if(ActorData[i][ActorObject] == objectid) {
  623. switch(response) {
  624. case EDIT_RESPONSE_CANCEL:{
  625. SetDynamicObjectPos(objectid, oldPos[0], oldPos[1], oldPos[2]);
  626. SetDynamicObjectRot(objectid, oldPos[3], oldPos[4], oldPos[5]);
  627. SetDynamicActorPos(i, oldPos[0], oldPos[1], oldPos[2]);
  628. SetDynamicActorFacingAngle(i, oldPos[5]);
  629. }
  630. case EDIT_RESPONSE_UPDATE: {
  631. SetDynamicActorPos(i, x, y, z);
  632. SetDynamicActorFacingAngle(i, rz);
  633. }
  634. case EDIT_RESPONSE_FINAL: {
  635. SetDynamicActorPos(i, x, y, z);
  636. SetDynamicActorFacingAngle(i, rz);
  637. SetDynamicObjectPos(objectid, x, y, z);
  638. SetDynamicObjectRot(objectid, 0.0, 0.0, rz);
  639. DestroyDynamic3DTextLabel(ActorData[i][ActorLabel]);
  640. format(Msg, sizeof(Msg), "%s (%i)", ActorData[i][ActorNome], i);
  641. ActorData[i][ActorLabel] = CreateDynamic3DTextLabel(Msg, 0xFFFF00AA, x, y, z + 1.0, 30.0, INVALID_PLAYER_ID, INVALID_VEHICLE_ID, 0, GetActorVirtualWorld(i));
  642. }
  643. }
  644. break;
  645. }
  646. }
  647. return 0;
  648. }
  649. #endif
  650. public OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, Float:fX, Float:fY, Float:fZ)
  651. {
  652. //printf("[DEBUG] OnPlayerWeaponShot(%i, %i, %i, %i, %f, %f, %f)", playerid, weaponid, hittype, hitid, fX, fY, fZ);
  653. return 1;
  654. }
  655. // Funções do FS
  656. stock VerActors(playerid) {
  657. new di[2500], actors, Float:pA[3], Float:aVida;
  658. strcat(di, "Actor\tCoordenadas\tMundo\tVida\n");
  659. #if !defined USE_STREAMER
  660. for(new i = GetPVarInt(playerid, "dialog_lista"); i <= GetActorPoolSize(); i++) {
  661. if(!IsValidActor(i)) continue;
  662. if(actors > 25) {
  663. SetPVarInt(playerid, "dialog_proxima_lista", i);
  664. strcat(di, "{FFFF00}Próxima página\n");
  665. break;
  666. }
  667. GetActorPos(i, pA[0], pA[1], pA[2]);
  668. GetActorHealth(i, aVida);
  669. format(di, sizeof(di), "%s%s (id: %i) [skin: %i]\tx=%4.2f y=%4.2f z=%4.2f\t%i\t%4.2f\n", di,ActorData[i][ActorNome],ActorData[i][ActorSkin],i,pA[0],pA[1],pA[2],GetActorVirtualWorld(i),aVida);
  670. actors++;
  671. }
  672. #else
  673. for(new i = GetPVarInt(playerid, "dialog_lista"); i <= Streamer_CountItems(STREAMER_TYPE_ACTOR, 1); i++) {
  674. if(!IsValidDynamicActor(i)) continue;
  675. if(actors > 25) {
  676. SetPVarInt(playerid, "dialog_proxima_lista", i);
  677. strcat(di, "{FFFF00}Próxima página\n");
  678. break;
  679. }
  680. GetDynamicActorPos(i, pA[0], pA[1], pA[2]);
  681. GetDynamicActorHealth(i, aVida);
  682. format(di, sizeof(di), "%s%s (id: %i) [skin: %i]\tx=%4.2f y=%4.2f z=%4.2f\t%i\t%4.2f\n", di,ActorData[i][ActorNome],i,ActorData[i][ActorSkin],pA[0],pA[1],pA[2],GetDynamicActorVirtualWorld(i),aVida);
  683. actors++;
  684. }
  685. #endif
  686. if(actors==0) return SendClientMessage(playerid, -1, "{FF0000}Não há actors!");
  687. ShowPlayerDialog(playerid, DIALOG_VERACTORS, DIALOG_STYLE_TABLIST_HEADERS, "{FF0000}# {FFFFFF}Visualizando actors", di, "Ok", "Cancelar");
  688. return 1;
  689. }
  690. //by Emmet
  691. stock ResyncActor(actorid)
  692. {
  693. new Float:x,Float:y, Float:z, worldid;
  694. #if !defined USE_STREAMER
  695. if(IsValidActor(actorid))
  696. {
  697. worldid = GetActorVirtualWorld(actorid);
  698. GetActorPos(actorid, x, y, z);
  699. SetActorPos(actorid, 1000.0, -2000.0, 500.0);
  700. SetActorVirtualWorld(actorid, random(cellmax));
  701. SetTimerEx("RestoreActor", 850, 0, "iifff", actorid, worldid, x, y, z);
  702. return 1;
  703. }
  704. #else
  705. if(IsValidDynamicActor(actorid))
  706. {
  707. worldid = GetDynamicActorVirtualWorld(actorid);
  708. GetDynamicActorPos(actorid, x, y, z);
  709. SetDynamicActorPos(actorid, 1000.0, -2000.0, 500.0);
  710. SetDynamicActorVirtualWorld(actorid, random(cellmax));
  711. SetTimerEx("RestoreActor", 850, 0, "iifff", actorid, worldid, x, y, z);
  712. return 1;
  713. }
  714. #endif
  715. return 0;
  716. }
  717.  
  718. forward RestoreActor(actorid, worldid, Float:x, Float:y, Float:z);
  719. public RestoreActor(actorid, worldid, Float:x, Float:y, Float:z)
  720. {
  721. #if !defined USE_STREAMER
  722. SetActorVirtualWorld(actorid, worldid);
  723. SetActorPos(actorid, x, y, z);
  724. SetActorHealth(actorid, 100.0);
  725. #else
  726. SetDynamicActorVirtualWorld(actorid, worldid);
  727. SetDynamicActorPos(actorid, x, y, z);
  728. SetDynamicActorHealth(actorid, 100.0);
  729. #endif
  730. return 1;
  731. }
  732.  
  733. /*********************************************************************************************************
  734. ********** ************
  735. ********** Feito por Nícolas Corrêa ************
  736. ********** www.brasilmegatrucker.com ************
  737. ********** ************
  738. *********************************************************************************************************/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement