Advertisement
ipsBruno

(C++) INPC

Oct 22nd, 2013
466
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.09 KB | None | 0 0
  1. /*
  2.  
  3.     Copyright (c) 2013 ipsBruno
  4.  
  5.  
  6.  
  7. */
  8. #include "../incs/sdk/amx/amx.h"
  9. #include "../incs/sdk/plugincommon.h"
  10.  
  11. #include <windows.h>
  12.  
  13. #include <tchar.h>
  14. #include <strsafe.h>
  15.  
  16. #include <string>
  17. #include <vector>
  18.  
  19. #include <cstdlib>
  20. #include <ctime>
  21.  
  22. #pragma warning( disable : 4996 )
  23.  
  24.  
  25. using namespace std;
  26.  
  27. #define alloca _alloca
  28.  
  29. typedef void (*logprintf_t)(char* format, ...);
  30. logprintf_t logprintf;
  31.  
  32. AMX * pAMX;
  33.  
  34. extern void *pAMXFunctions;
  35.  
  36. #define PI 3.14159265
  37. #define pow2(a)                                            ((a) * (a))
  38. #define distance(aa,ab,ac,ba,bb,bc)                        sqrt(pow2(aa - ba) + pow2(ab - bb) + pow2(ac - bc))
  39.  
  40. bool JogadorProcessado [ 1000 ] ;
  41.  
  42. float FOOT_RATE = 130.0f;
  43.  
  44.  
  45. void EscreverRota(char * c, int tempo, short leftright, short updown, short addkey, float x, float y, float z, float wq, float zq, int vida, int colete, int armaid, int acao, float velocidadex, float velocidadey, float velocidadez, float surfx, float surfy, float surfz, short surfid, short animeid, short animeidx) {
  46.  
  47.  
  48.     c[0] = (tempo & 0x000000FF);
  49.     c[1] = (tempo & 0x0000FF00) >> 8;
  50.     c[2] = (tempo & 0x00FF0000) >> 16;
  51.     c[3] = (tempo & 0xFF000000) >> 24;
  52.     c[4] = (leftright & 0x00FF);
  53.     c[5] = (leftright & 0xFF00) >> 8;
  54.     c[6] = (updown & 0x00FF);
  55.     c[7] = (updown & 0xFF00) >> 8;
  56.     c[8] = (addkey & 0x00FF);
  57.     c[9] = (addkey & 0xFF00) >> 8;
  58.  
  59.     char * fstrx = (char*) &x;
  60.     c[10] = fstrx[0];
  61.     c[11] = fstrx[1];
  62.     c[12] = fstrx[2];
  63.     c[13] = fstrx[3];
  64.  
  65.     char * fstry = (char*) &y;
  66.     c[14] = fstry[0];
  67.     c[15] = fstry[1];
  68.     c[16] = fstry[2];
  69.     c[17] = fstry[3];
  70.  
  71.  
  72.     char * fstrz = (char*) &z;
  73.     c[18] = fstrz[0];
  74.     c[19] = fstrz[1];
  75.     c[20] = fstrz[2];
  76.     c[21] = fstrz[3];  
  77.  
  78.     char * fstrw = (char*) &wq;
  79.     c[22] = fstrw[0];
  80.     c[23] = fstrw[1];
  81.     c[24] = fstrw[2];
  82.     c[25] = fstrw[3];  
  83.  
  84.  
  85.     float null = 0.0;
  86.     char * fstrn = (char*) &null;
  87.  
  88.     c[26] = fstrn[0];
  89.     c[27] = fstrn[1];
  90.     c[28] = fstrn[2];
  91.     c[29] = fstrn[3];  
  92.     c[30] = fstrn[0];
  93.     c[31] = fstrn[1];
  94.     c[32] = fstrn[2];
  95.     c[33] = fstrn[3];
  96.  
  97.     char * fstrzq = (char*) &zq;  
  98.  
  99.     c[34] = fstrzq[0];
  100.     c[35] = fstrzq[1];
  101.     c[36] = fstrzq[2];
  102.     c[37] = fstrzq[3];  
  103.     c[38] = vida;
  104.     c[39] = colete;      
  105.     c[40] = armaid;
  106.     c[41] = acao;
  107.  
  108.  
  109.     char * fstrvx = (char*) &velocidadex;
  110.     c[42] = fstrvx[0];
  111.     c[43] = fstrvx[1];
  112.     c[44] = fstrvx[2];
  113.     c[45] = fstrvx[3];  
  114.  
  115.  
  116.     char * fstrvy = (char*) &velocidadey;
  117.     c[46] = fstrvy[0];
  118.     c[47] = fstrvy[1];
  119.     c[48] = fstrvy[2];
  120.     c[49] = fstrvy[3];  
  121.  
  122.     char * fstrvz = (char*) &velocidadez;
  123.     c[50] = fstrvz[0];
  124.     c[51] = fstrvz[1];
  125.     c[52] = fstrvz[2];
  126.     c[53] = fstrvz[3];  
  127.  
  128.  
  129.     for(int i = 54; i <68; i++) c[i] = 0;
  130.  
  131.     c[68] = (animeid & 0x00FF);
  132.     c[69] = (animeid & 0xFF00) >> 8;
  133.     c[70] = (animeidx & 0x00FF);
  134.     c[71] = (animeidx & 0xFF00) >> 8;
  135.  
  136.  
  137.  
  138. }
  139.  
  140. struct THREAD_PARAMS
  141. {
  142.     int id;
  143.     float infos_0;
  144.     float infos_1;
  145.     float infos_2;
  146.     float infos_3;
  147.     float infos_4;
  148.     float infos_5;
  149.     float infos_6;
  150.     float infos_7;
  151.  
  152. };
  153.  
  154.  
  155. DWORD WINAPI  ProcessarRota(LPVOID lpStatus)
  156. {
  157.     THREAD_PARAMS* args = reinterpret_cast<THREAD_PARAMS*>(lpStatus);
  158.    
  159.     float origemX       = args->infos_3;
  160.     float origemY       = args->infos_4;
  161.     float origemZ       = args->infos_5;
  162.  
  163.     float objetivoX     = args->infos_0;
  164.     float objetivoY     = args->infos_1;
  165.     float objetivoZ     = args->infos_2;
  166.     float velocidade    = args->infos_6;
  167.  
  168.     int slot = args->id;
  169.    
  170.     printf("PROCESSANDO ROTA %d\n",slot );
  171.  
  172.  
  173.  
  174.     float distancia = distance(origemX, origemY, origemZ, objetivoX, objetivoY, objetivoZ);
  175.  
  176.     float angulo =   (atan2(objetivoY - origemY,  objetivoX - origemX));
  177.  
  178.  
  179.     float tempo = distancia / velocidade ;
  180.  
  181.     float blocos =   tempo / FOOT_RATE  ;
  182.  
  183.     float velocidadeX =  cos(angulo) * velocidade;
  184.     float velocidadeY =  sin(angulo) * velocidade;
  185.  
  186.     float velocidadeZ =  0.0;
  187.  
  188.     angulo = (-angulo) / 0.01745329251f + 90.0f;
  189.  
  190.     float passosX  = (objetivoX - origemX) /  blocos;
  191.     float passosY  = (objetivoY - origemY) /  blocos;
  192.  
  193.     float passosZ  = (objetivoZ - origemZ) /  blocos;
  194.  
  195.  
  196.     angulo = angulo / 114.591559157f;
  197.  
  198.     float x = 0.0f, y = 0.0f;
  199.     float wq = cos(angulo);      
  200.     float zq = sin(angulo);
  201.  
  202.     char header[8] = {
  203.         (char)
  204.         0xE8 ,
  205.         0x03 ,
  206.         0x00 ,
  207.         0x00 ,
  208.         0x01 ,
  209.         0x00 ,
  210.         0x00 ,
  211.         0x00
  212.     } ;
  213.  
  214.     FILE * npcFile = fopen("npcmodes/recordings/npc.rec", "wb");
  215.  
  216.  
  217.     fwrite(header, 1, 8, npcFile);
  218.  
  219.     float passoAtual = 0.0f ;
  220.  
  221.     tempo = tempo / blocos;
  222.  
  223.     int correr = velocidade > 0.0020f ? 0x00FF : 0xFFFF;
  224.  
  225.  
  226.     while(blocos) {
  227.  
  228.         char script[73];
  229.  
  230.         float x = origemX + (passosX * passoAtual);
  231.         float y = origemY + (passosY * passoAtual);
  232.         float z = origemZ + (passosZ * passoAtual);
  233.  
  234.         int vida = 100;
  235.         int colete = 0;
  236.         int arma = 0;
  237.         int acao = 0;
  238.  
  239.  
  240.  
  241.         EscreverRota(script, (short)floor((tempo * passoAtual)+0.5f), 0,  correr, 0, x, y, z, wq, zq, vida, colete, arma, acao, velocidadeX, velocidadeY, velocidadeZ,  0.0, 0.0,0.0, 0, 0, 0);
  242.  
  243.         passoAtual += 1.0f;
  244.  
  245.         fwrite(script, 1, 72, npcFile);
  246.  
  247.  
  248.         if(passoAtual > blocos - 2) break;
  249.  
  250.     }
  251.  
  252.     fclose(npcFile);
  253.    
  254.     JogadorProcessado[slot] = true;
  255.  
  256.     return true;
  257. }
  258.  
  259. /*
  260. *
  261. * MoverNPC( Float: x, Float: y, Float: z, npcid )
  262. *
  263. */
  264.  
  265.  
  266.  
  267. AMX* amxGlobal ;
  268. cell AMX_NATIVE_CALL MoverNPC(AMX* amx, cell* params)
  269. {  
  270.    
  271.     amxGlobal = amx;
  272.  
  273.     int slot = (int)params[4];
  274.  
  275.     float objetivoX = amx_ctof(params[1]);
  276.     float objetivoY = amx_ctof(params[2]);
  277.     float objetivoZ = amx_ctof(params[3]);
  278.  
  279.     float origemX = amx_ctof(params[5]);
  280.     float origemY = amx_ctof(params[6]);
  281.     float origemZ = amx_ctof(params[7]);
  282.  
  283.     float velocidade = amx_ctof(params[8]);
  284.  
  285.     THREAD_PARAMS * passArgs = new THREAD_PARAMS();
  286.  
  287.     passArgs->id = slot;
  288.    
  289.     passArgs->infos_0 = objetivoX;
  290.     passArgs->infos_1 = objetivoY;
  291.     passArgs->infos_2 = objetivoZ;
  292.  
  293.     passArgs->infos_3 = origemX;
  294.     passArgs->infos_4 = origemY;
  295.     passArgs->infos_5 = origemZ;
  296.     passArgs->infos_6 = velocidade;
  297.    
  298.     CreateThread(0, 0, reinterpret_cast<LPTHREAD_START_ROUTINE>(ProcessarRota), passArgs, 0, NULL);
  299.  
  300.  
  301.     return true;
  302. }
  303.    
  304.  
  305.  
  306. AMX_NATIVE_INFO natives[ ] =
  307. {
  308.     {"MoverINPC", MoverNPC},
  309.     {0,0}
  310. };
  311.  
  312. PLUGIN_EXPORT unsigned int PLUGIN_CALL Supports()
  313. {
  314.     return SUPPORTS_VERSION | SUPPORTS_AMX_NATIVES | SUPPORTS_PROCESS_TICK;
  315. }
  316.  
  317.  
  318. PLUGIN_EXPORT bool PLUGIN_CALL Load( void **ppData )
  319. {  
  320.     pAMXFunctions = ppData[PLUGIN_DATA_AMX_EXPORTS];
  321.     logprintf = (logprintf_t) ppData[PLUGIN_DATA_LOGPRINTF];
  322.        
  323.     return true;
  324. }
  325.  
  326.  
  327. PLUGIN_EXPORT void PLUGIN_CALL Unload( )
  328. {
  329.  
  330. }
  331.  
  332. PLUGIN_EXPORT int PLUGIN_CALL AmxLoad( AMX *amx )
  333. {
  334.     return amx_Register( amx, natives, -1 );
  335. }
  336.  
  337. PLUGIN_EXPORT int PLUGIN_CALL AmxUnload( AMX *amx )
  338. {
  339.  
  340.     return AMX_ERR_NONE;
  341. }
  342.  
  343.  
  344. PLUGIN_EXPORT void PLUGIN_CALL ProcessTick()
  345.  
  346. {
  347.     static int contar ;
  348.  
  349.     if( GetTickCount() - contar > FOOT_RATE) {
  350.  
  351.         for(int i = 0; i != 1000; i++) {
  352.  
  353.             if(JogadorProcessado[i] == true) {
  354.  
  355.                 int idx;
  356.  
  357.                 if (!amx_FindPublic( amxGlobal , "OnCompleteRec", &idx))
  358.                 {
  359.                     cell retVal             ;
  360.  
  361.                     amx_Push(amxGlobal, i);
  362.                     amx_Exec(amxGlobal, &retVal, idx);
  363.  
  364.                 }
  365.  
  366.                 JogadorProcessado[i] = false;
  367.             }
  368.         }
  369.     }
  370.     else {
  371.         contar = GetTickCount();
  372.     }
  373. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement