sharivan

lession4.sp

Oct 6th, 2015
204
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2.  * Autor: "SHARIVAN do clã ZM Brasil (ΖмBя.™ Clan)
  3.  *
  4.  * Descrição:
  5.  *   Quarta aula de programação em sourcepawn 1.7.
  6.  *   Nesta lição será abordado um exemplo de plugin que use as APIs ClientCommand e FakeClientCommand.
  7.  *
  8.  *   Para maiores informações sobre como programar plugins de sourcemod, recomendo ter as seguintes competências:
  9.  *
  10.  *   - Conhecimento de matemática básica, principalmente geometria euclidiana, geometria analítica e vetores.
  11.  *   - Lógica da programação
  12.  *   - Conhecimento básico e intermediário das linguagens C e C++
  13.  *   - Linguagem Pawn
  14.  *
  15.  *   Segue abaixo alguns links importantes:
  16.  *
  17.  *   Manual do sourcepawn:
  18.  *     Pré 1.7: https://wiki.alliedmods.net/Introduction_to_sourcepawn
  19.  *     Pós 1.7: https://wiki.alliedmods.net/Introduction_to_SourcePawn_1.7
  20.  *
  21.  *   API do sourcemod:
  22.  *     Pré 1.7: https://sm.alliedmods.net/api/
  23.  *     Pós 1.7: https://sm.alliedmods.net/new-api/
  24.  *
  25.  *   Realçador de sintaxe do sourcepawn para Notepad++: https://forums.alliedmods.net/showthread.php?t=120037
  26.  *
  27.  *   Pawn Studio: http://sourceforge.net/projects/pawnstudio/
  28.  *
  29.  */
  30.  
  31. #pragma semicolon 1
  32.  
  33. // Includes
  34.  
  35. #include <sourcemod>
  36. #include <sdktools>
  37. #include <smlib>
  38.  
  39. // Versão
  40.  
  41. #define VERSION "1.0"
  42.  
  43. // Constantes
  44.  
  45. #define MAX_COMMAND_NAME_LENGTH     256
  46. #define MAX_COMMAND_ARGS            32
  47.  
  48. // Variáveis globais
  49.  
  50. bool g_bFake[MAXPLAYERS + 1]; // Pra cada usuário, define se o comando programado é fake ou não.
  51. float g_fInterval[MAXPLAYERS + 1]; // Armazena o intervalo do comando programado para cada usuário.
  52. char g_sCommand[MAXPLAYERS + 1][MAX_COMMAND_NAME_LENGTH]; // Armazena o comando programado para cada usuário.
  53. Handle g_hCommandTimer[MAXPLAYERS + 1]; // Para cada usuário, se diferente de null representa o objeto timer que executa o comando programado repetidamente usando um intervalo determinado pelo próprio usuário.
  54.  
  55. // Info
  56.  
  57. public Plugin myinfo = {
  58.     name = "Aula 4",
  59.     author = "SHARIVAN from ΖмBя.™ Clan",
  60.     description = "Quarta aula de sourcepawn",
  61.     version = VERSION,
  62.     url = "http://www.zmbrasil.com.br/"
  63. };
  64.  
  65. // Forwards
  66.  
  67. public void OnPluginStart() {
  68.     AutoExecConfig(true, "lession4");
  69.    
  70.     RegConsoleCmd("l4_programe_comando", Command_ScheludeCommand, "Programa um comando para executar em um determinado intervalo de tempo.");
  71.    
  72.     // Inicializa as variáveis globais
  73.     for (int client = 1; client <= MaxClients; client++) {
  74.         g_bFake[client] = false;
  75.         g_fInterval[client] = 0.0;
  76.         g_hCommandTimer[client] = null;
  77.     }
  78. }
  79.  
  80. public void OnPluginStop() {
  81.     // Finaliza os timers
  82.     for (int client = 1; client <= MaxClients; client++)
  83.         if (g_hCommandTimer[client] != null) {
  84.             KillTimer(g_hCommandTimer[client]); // Lembre-se de sempre usar KillTimer para finalizar um timer fora de seu callback, nunca utilize CloseHandle ou delete.
  85.             g_hCommandTimer[client] = null;
  86.         }
  87. }
  88.  
  89. // Inicializa as variáveis globais para cada usuário que entrar no jogo.
  90. public void OnClientPutInServer(int client) {
  91.     g_bFake[client] = false;
  92.     g_fInterval[client] = 0.0;
  93.     g_hCommandTimer[client] = null;
  94. }
  95.  
  96. // Finaliza o timer do usuário se ele sair do jogo.
  97. public void OnClientDisconnect(int client) {
  98.     if (g_hCommandTimer[client] != null) {
  99.         KillTimer(g_hCommandTimer[client]);
  100.         g_hCommandTimer[client] = null;
  101.     }
  102. }
  103.  
  104. // Comandos
  105.  
  106. /*
  107.  *
  108.  * l4_programe_comando float:intervalo bool:fake string:comando [string:arg1] [string:arg2] ...
  109.  *
  110.  */
  111. public Action Command_ScheludeCommand(int client, int args) {
  112.     if (args < 3) { // Valida o número de argumentos.
  113.         ReplyToCommand(client, "O número de argumentos deve ser pelo menos igual a 3.");
  114.         return Plugin_Handled;
  115.     }
  116.    
  117.     char sInterval[16];
  118.     GetCmdArg(1, sInterval, sizeof(sInterval)); // Primeiro parâmetro = intervalo.
  119.     g_fInterval[client] = StringToFloat(sInterval);
  120.    
  121.     char sIsFake[16];
  122.     GetCmdArg(2, sIsFake, sizeof(sIsFake)); // Terceiro parâmetro = fake.
  123.     g_bFake[client] = StrEqual(sIsFake, "1", false) || StrEqual(sIsFake, "true", false) || StrEqual(sIsFake, "sim", false) || StrEqual(sIsFake, "on", false);
  124.  
  125.     GetCmdArg(3, g_sCommand[client], MAX_COMMAND_NAME_LENGTH); // Segundo parâmetro = comando.
  126.    
  127.     // Do quarto parâmetro em diante são os argumentos do comando.
  128.     if (args > 3) {
  129.         int n = args - 3;
  130.         for (int i = 0; i < n; i++) {
  131.             char sArg[MAX_COMMAND_NAME_LENGTH];
  132.             GetCmdArg(i + 4, sArg, sizeof(sArg));
  133.             Format(g_sCommand[client], MAX_COMMAND_NAME_LENGTH, "%s %s", g_sCommand[client], sArg);
  134.         }
  135.     }
  136.    
  137.     if (g_hCommandTimer[client] != null) // Se o timer já estiver ativo, destrua-o.
  138.         KillTimer(g_hCommandTimer[client]);
  139.  
  140.     g_hCommandTimer[client] = CreateTimer(g_fInterval[client], OnCommandTimer, client, TIMER_REPEAT); // Cria-se um novo timer
  141.    
  142.     return Plugin_Handled;
  143. }
  144.  
  145. // Callbacks
  146.  
  147. public Action OnCommandTimer(Handle timer, any client) {
  148.     if (!Client_IsIngame(client)) { // Se o usuário não estiver em jogo interrompe a execução do timer.
  149.         g_hCommandTimer[client] = null;
  150.         return Plugin_Stop; // Lembrando que para finalizar um timer dentro de seu callback deve-se retornar Plugin_Stop.
  151.     }
  152.    
  153.     if (g_bFake[client])
  154.         FakeClientCommand(client, g_sCommand[client]); // A API FakeClientCommand executa um comando de usuário diretamente no servidor sem realizar a propagação pela rede (networking). Um exemplo de comando que deve ser usado somente com essa função é o comando say.
  155.     else
  156.         ClientCommand(client, g_sCommand[client]); // Enquanto a API ClientCommand executa um comando de usuário realizando o networking para os clientes. Essa função não irá funcionar em clientes que estiverem com a convar cl_restrict_server_commands setada como um valor diferente de zero.
  157.    
  158.     return Plugin_Continue;
  159. }
RAW Paste Data