Advertisement
Guest User

scm.cpp

a guest
Jun 17th, 2011
317
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.04 KB | None | 0 0
  1. /*
  2.  
  3. CODED BY        ManU (ManUthps)
  4. TESTED BY       YEAHMK & ManU
  5. SCM-HOOK BY     Spookie & op9080
  6.  
  7. Little trainer, to spawn peds in GTA: San Andreas.
  8. There are some random crashes and crashes at spawning main-chars
  9. like Sweet, Claude, etc. But its working :)
  10.  
  11. Its my first released trainer, and iam not a 1337-l33thaXx0r,
  12. so pls dont flame like assholes beceause this code is not perfect
  13. or something like else!
  14.  
  15. TrainerVideo    http://www.youtube.com/watch?v=2Rmbho9nkoM
  16. If u like my video and my work, pls sub me :) thanks!
  17.  
  18. */
  19.  
  20. #include <stdio.h>
  21. #include <windows.h>
  22.  
  23. #include "scm.h"
  24.  
  25. #pragma warning(disable:4312)
  26.  
  27. const FARPROC ProcessOneCommand = (FARPROC)0x469F00;
  28.  
  29. DWORD SCRIPT_BASE = 0xA49960;
  30. GAME_SCRIPT_THREAD gst;            
  31. BYTE ScriptBuf[MAX_SCRIPT_SIZE];
  32. DWORD ScriptVars[MAX_SCRIPT_VARS];
  33.  
  34. int __declspec(naked) ExecuteScriptBuf()
  35. {
  36.     __asm
  37.     {
  38.         mov ecx, OFFSET ScriptBuf
  39.         mov gst.dwScriptIP, ecx
  40.         mov ecx, OFFSET gst  
  41.         call ProcessOneCommand
  42.         xor eax, eax  
  43.         mov al, gst.bJumpFlag
  44.         ret
  45.     }
  46. }
  47.  
  48. int ScriptCommand(const SCRIPT_COMMAND* ScriptCommand, ...)
  49. {
  50.     va_list ap;
  51.     const char* p = ScriptCommand->Params;         
  52.     va_start(ap, ScriptCommand);                   
  53.     memcpy(&ScriptBuf, &ScriptCommand->OpCode, 2);
  54.     int buf_pos = 2;   
  55.     int var_pos = 0;   
  56.  
  57.     while(*p)          
  58.     {
  59.         switch(*p)     
  60.         {
  61.             case 'i':  
  62.             {
  63.                 long i = va_arg(ap, long);     
  64.                 if ((i >= -128) && (i <= 127)) 
  65.                 {
  66.                     char ch = (char)i;         
  67.                     ScriptBuf[buf_pos] = 0x04; 
  68.                     buf_pos++;                 
  69.                     ScriptBuf[buf_pos] = ch;   
  70.                     buf_pos++;                 
  71.                 }
  72.                 else if ((i >= -32768) && (i <= 32767))
  73.                 {
  74.                     short sh = (short)i;               
  75.                     ScriptBuf[buf_pos] = 0x05;         
  76.                     buf_pos++;                         
  77.                     memcpy(&ScriptBuf[buf_pos], &sh, 2);
  78.                     buf_pos += 2;                      
  79.                 }
  80.                 else                                   
  81.                 {
  82.                     ScriptBuf[buf_pos] = 0x01;         
  83.                     buf_pos++;;                        
  84.                     memcpy(&ScriptBuf[buf_pos], &i, 4);
  85.                     buf_pos += 4;                      
  86.                 }
  87.                 break;
  88.             }
  89.             case 'f':  
  90.             {
  91.                 float f = (float)va_arg(ap, double);
  92.                 ScriptBuf[buf_pos] = 0x06;         
  93.                 buf_pos++;                             
  94.                 memcpy(&ScriptBuf[buf_pos], &f, 4);    
  95.                 buf_pos += 4;                          
  96.                 break;
  97.             }
  98.             case 'v':
  99.             {
  100.                 DWORD* v = va_arg(ap, DWORD*);                         
  101.                 ScriptBuf[buf_pos] = 0x02;                             
  102.                 buf_pos++;                                             
  103.                 WORD var_offs = var_pos * 4;                           
  104.                 DWORD* ScriptVar = (DWORD*)(SCRIPT_BASE + var_offs);   
  105.                 ScriptVars[var_pos] = *ScriptVar;                      
  106.                 *ScriptVar = *v;                                       
  107.                 memcpy(&ScriptBuf[buf_pos], &var_offs, 2);             
  108.                 buf_pos += 2;                                          
  109.                 var_pos++;                                             
  110.                 break;
  111.             }
  112.             /*case 's':
  113.             {
  114.                 char* s1 = va_arg(ap, char*);          
  115.                 char s2[8];                            
  116.                 ZeroMemory(s2, 8);                     
  117.                 strncpy(s2, s1, 8);                    
  118.                 memcpy(&ScriptBuf[buf_pos], s2, 8);    
  119.                 buf_pos += 8;                      
  120.                 break;
  121.             }*/
  122.             case 's':   // If string... Updated 13th Jan 06.. (kyeman) SA string support
  123.             {
  124.                 char* sz = va_arg(ap, char*);
  125.                 unsigned char aLen = (int)strlen(sz);
  126.                 ScriptBuf[buf_pos] = 0x0E;
  127.                 buf_pos++;
  128.                 ScriptBuf[buf_pos] = aLen;
  129.                 buf_pos++;
  130.                 memcpy(&ScriptBuf[buf_pos],sz,aLen);               
  131.                 buf_pos += aLen;
  132.                 break;
  133.             }
  134.         }
  135.         ++p;       
  136.     }
  137.     va_end(ap);    
  138.  
  139.     BYTE WaitBuf[4] = {0x01, 0x00, 0x04, 0x00};
  140.     memcpy((void*)&ScriptBuf[buf_pos], (void*)&WaitBuf[0], 4);
  141.  
  142.     if (var_pos)   
  143.     {
  144.         int result = ExecuteScriptBuf();   
  145.  
  146.         p = ScriptCommand->Params;     
  147.         va_start(ap, ScriptCommand);   
  148.         var_pos = 0;                   
  149.         while(*p)                      
  150.         {
  151.             switch(*p)                 
  152.             {
  153.                 case 'i':              
  154.                 {
  155.                     va_arg(ap, long);  
  156.                     break;
  157.                 }
  158.                 case 'f':              
  159.                 {
  160.                     va_arg(ap, double);
  161.                     break;
  162.                 }
  163.                 case 'v':              
  164.                 {
  165.                     DWORD* v = va_arg(ap, DWORD*);                         
  166.                     DWORD* ScriptVar = (DWORD*)(SCRIPT_BASE + (var_pos*4));
  167.                     *v = *ScriptVar;                                       
  168.                     *ScriptVar = ScriptVars[var_pos];                      
  169.                     var_pos++;                                             
  170.                     break;
  171.                 }
  172.                 case 's':              
  173.                 {
  174.                     va_arg(ap, char*); 
  175.                     break;
  176.                 }
  177.             }
  178.             ++p;       
  179.         }
  180.         va_end(ap);    
  181.  
  182.         return result; 
  183.     } else {
  184.         return ExecuteScriptBuf();
  185.     }
  186. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement