sharivan

lession2.sp

Oct 1st, 2015
164
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.  *   Segunda aula de programação em sourcepawn 1.7.
  6.  *   Nesta lição serão abordados os seguintes assuntos:
  7.  *      - Manipulação de convars.
  8.  *      - Criação de comandos de console.
  9.  *
  10.  *   Para maiores informações sobre como programar plugins de sourcemod, recomendo ter as seguintes competências:
  11.  *
  12.  *   - Conhecimento de matemática básica, principalmente geometria euclidiana, geometria analítica e vetores.
  13.  *   - Lógica da programação
  14.  *   - Conhecimento básico e intermediário das linguagens C e C++
  15.  *   - Linguagem Pawn
  16.  *
  17.  *   Segue abaixo alguns links importantes:
  18.  *
  19.  *   Manual do sourcepawn:
  20.  *     Pré 1.7: https://wiki.alliedmods.net/Introduction_to_sourcepawn
  21.  *     Pós 1.7: https://wiki.alliedmods.net/Introduction_to_SourcePawn_1.7
  22.  *
  23.  *   API do sourcemod:
  24.  *     Pré 1.7: https://sm.alliedmods.net/api/
  25.  *     Pós 1.7: https://sm.alliedmods.net/new-api/
  26.  *
  27.  *   Realçador de sintaxe do sourcepawn para Notepad++: https://forums.alliedmods.net/showthread.php?t=120037
  28.  *
  29.  *   Pawn Studio: http://sourceforge.net/projects/pawnstudio/
  30.  *
  31.  *
  32.  */
  33.  
  34. #pragma semicolon 1
  35.  
  36. #include <sourcemod>
  37. #include <sdktools>
  38.  
  39. #define VERSION "1.0"
  40.  
  41. // convars criadas ou vinculadas a um plugin devem ter uma variável do tipo/classe Handle associada a elas, porém é recomendável que seja usada a classe (methodmap) ConVar (que é uma subclasse da classe Handle) e por oferecer maior facildade e robustez para acessar as propriedades e métodos para manipulação de convars.
  42. ConVar g_cvarEnabled = null;
  43. ConVar g_cvarTimeLimit = null;
  44.  
  45. public Plugin myinfo = {
  46.     name = "Aula 2",
  47.     author = "SHARIVAN from ΖмBя.™ Clan",
  48.     description = "Segunda aula de sourcepawn",
  49.     version = VERSION,
  50.     url = "http://www.zmbrasil.com.br/"
  51. };
  52.  
  53. // Forwards
  54.  
  55. public void OnPluginStart() {
  56.     // Criação de convars
  57.     g_cvarEnabled = CreateConVar("l2_enabled", "1", "Habilitada/Desabilia o funcionamento deste plugin."); // Cria-se uma nova convar com o nome l2_enabled.
  58.     g_cvarTimeLimit = CreateConVar("mp_timelimit", "45", ""); // Aqui neste caso não é criada a convar mp_timelimit pois ela já existe. Neste caso é apenas atribuído um handle da convar já existente a nossa variável g_cvarTimeLimit de forma que possamos controla-la.
  59.    
  60.     AutoExecConfig(true, "lession2"); // Carrega o arquivo de configuração deste plugin. Como o primeiro parâmetro passado foi true, caso o arquivo não exista entãO ele será criado automaticamente.
  61.    
  62.     g_cvarEnabled.AddChangeHook(OnConVarChanged); // Atribui um hook de modificação à nossa convar l2_enabled. Caso ela seja modificada, a função OnConVarChanged será chamada.
  63.    
  64.     RegConsoleCmd("l2_muda_tempo_do_mapa", Command_ChangeTimeLimit, "Altera o tempo do mapa."); // Registra um comando de console. Este comando estará acessível a todos os jogadores do servidor.
  65. }
  66.  
  67. public void OnClientPutInServer(int client) {
  68.     if (g_cvarEnabled.IntValue == 1) // Verfica se a convar l2_enabled está setada com o valor 1
  69.         CreateTimer(2.0, OnMsgTimer, client, TIMER_FLAG_NO_MAPCHANGE) // Se sim, cria um timer com o intervalo de 2 segundos. O parâmetro TIMER_FLAG_NO_MAPCHANGE especificado nas flags indica que este timer será finalizado em caso de troca de mapa.
  70. }
  71.  
  72. public Action OnMsgTimer(Handle timer, any client) {
  73.     PrintToChat(client, "Fala seu noob!"); // Envia uma mensagem somente para um usuário específico.
  74.     return Plugin_Stop; // O valor de retorno Plugin_Stop dentro de um timer callback sinaliza indica que o timer deverá ser destruído.
  75. }
  76.  
  77. // Hooks
  78.  
  79. // Toda função de callback para um hook de evento convar change deve ter a assinatura abaixo.
  80. public void OnConVarChanged(ConVar convar, const char[] oldValue, const char[] newValue) {
  81.     if (convar == g_cvarEnabled) { // Verifica se a convar modificada é a nossa convar l2_enabled
  82.         int antigoValor =  StringToInt(oldValue); // Realiza uma conversão de uma string para um inteiro.
  83.         int novoValor = StringToInt(newValue);
  84.         PrintToChatAll("O valor da convar l2_enabled foi alterado de %d para %d", antigoValor, novoValor); // Envia uma mensagem para todos os usuários no servidor. Para informações sobre instruções de formatação usados em funções com suporte a formating, veja final do arquivo.
  85.     }
  86. }
  87.  
  88. // Comandos
  89.  
  90. // Toda função de callback para um comando deve ter a assinatura abaixo. O parâmetro client é o Client Index de quem usou o comando, args é o número de argumentos passados no comando. O retorno desta função deve ser do tipo Action, caso seja uma convar criada por este plugin então retorne sempre o valor Plugin_Handled.
  91. public Action Command_ChangeTimeLimit(int client, int args) {
  92.     if (args != 1) {
  93.         ReplyToCommand(client, "Este comando deve conter somente um parâmetro!"); // Envia uma mensagem para o meio no qual o usuário enviou o comando. Se foi enviado pelo chat, a mensagem será enviada par ao chat. Se foi enviada pelo console, será enviada para o console.
  94.         return Plugin_Handled;
  95.     }
  96.    
  97.     char sValue[16];
  98.     GetCmdArg(1, sValue, sizeof(sValue)); // Obtém o primeiro parâmetro passado pelo comando enviado pelo usuário. Os parâmetros passados por um comando sempre são do tipo string, somente depois deverão ser feitas as devidas validações e/ou conversões em caso de parâmetros numéricos ou que estejam restritos a um conjunto específico de valores.
  99.    
  100.     g_cvarTimeLimit.SetString(sValue, true, true); // Altera o valor de uma convar.
  101.    
  102.     PrintToChatAll("%N alterou o valor do tempo do mapa para %s", client, sValue); // Envia uma mensagem para todos os usuários no servidor.
  103.    
  104.     return Plugin_Handled;
  105. }
  106.  
  107. /*
  108.  *
  109.  * Algumas instruções de formatação. Cada uma delas indica que deverá ser convertido o parâmetro correspondente para:
  110.  *
  111.  *   %d - Inteiro para string.
  112.  *   %f - Ponto flutuante para string.
  113.  *   %s - String (não realiza conversão nenhuma)
  114.  *   %N - Client Index para Client Name (nome do jogador usado durante o jogo)
  115.  *   %t - Chave para frase traduzida (contida no arquivo de traduções) correspondente a linguagem usada pelo cliente alvo
  116.  *   %T - Client Index (ou SERVER_LANG) e Chave para frase traduzida (contida no arquivo de traduções). A diferença deste para o %t é que pode-se especificar qual linguagem será usada para traduzir, se será a do usuário ou do servidor.
  117.  *
  118.  */
RAW Paste Data