Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * Autor: "SHARIVAN do clã ZM Brasil (ΖмBя.™ Clan)
- *
- * Descrição:
- * Quarta aula de programação em sourcepawn 1.7.
- * Nesta lição será abordado um exemplo de plugin que use as APIs ClientCommand e FakeClientCommand.
- *
- * Para maiores informações sobre como programar plugins de sourcemod, recomendo ter as seguintes competências:
- *
- * - Conhecimento de matemática básica, principalmente geometria euclidiana, geometria analítica e vetores.
- * - Lógica da programação
- * - Conhecimento básico e intermediário das linguagens C e C++
- * - Linguagem Pawn
- *
- * Segue abaixo alguns links importantes:
- *
- * Manual do sourcepawn:
- * Pré 1.7: https://wiki.alliedmods.net/Introduction_to_sourcepawn
- * Pós 1.7: https://wiki.alliedmods.net/Introduction_to_SourcePawn_1.7
- *
- * API do sourcemod:
- * Pré 1.7: https://sm.alliedmods.net/api/
- * Pós 1.7: https://sm.alliedmods.net/new-api/
- *
- * Realçador de sintaxe do sourcepawn para Notepad++: https://forums.alliedmods.net/showthread.php?t=120037
- *
- * Pawn Studio: http://sourceforge.net/projects/pawnstudio/
- *
- */
- #pragma semicolon 1
- // Includes
- #include <sourcemod>
- #include <sdktools>
- #include <smlib>
- // Versão
- #define VERSION "1.0"
- // Constantes
- #define MAX_COMMAND_NAME_LENGTH 256
- #define MAX_COMMAND_ARGS 32
- // Variáveis globais
- bool g_bFake[MAXPLAYERS + 1]; // Pra cada usuário, define se o comando programado é fake ou não.
- float g_fInterval[MAXPLAYERS + 1]; // Armazena o intervalo do comando programado para cada usuário.
- char g_sCommand[MAXPLAYERS + 1][MAX_COMMAND_NAME_LENGTH]; // Armazena o comando programado para cada usuário.
- 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.
- // Info
- public Plugin myinfo = {
- name = "Aula 4",
- author = "SHARIVAN from ΖмBя.™ Clan",
- description = "Quarta aula de sourcepawn",
- version = VERSION,
- url = "http://www.zmbrasil.com.br/"
- };
- // Forwards
- public void OnPluginStart() {
- AutoExecConfig(true, "lession4");
- RegConsoleCmd("l4_programe_comando", Command_ScheludeCommand, "Programa um comando para executar em um determinado intervalo de tempo.");
- // Inicializa as variáveis globais
- for (int client = 1; client <= MaxClients; client++) {
- g_bFake[client] = false;
- g_fInterval[client] = 0.0;
- g_hCommandTimer[client] = null;
- }
- }
- public void OnPluginStop() {
- // Finaliza os timers
- for (int client = 1; client <= MaxClients; client++)
- if (g_hCommandTimer[client] != null) {
- KillTimer(g_hCommandTimer[client]); // Lembre-se de sempre usar KillTimer para finalizar um timer fora de seu callback, nunca utilize CloseHandle ou delete.
- g_hCommandTimer[client] = null;
- }
- }
- // Inicializa as variáveis globais para cada usuário que entrar no jogo.
- public void OnClientPutInServer(int client) {
- g_bFake[client] = false;
- g_fInterval[client] = 0.0;
- g_hCommandTimer[client] = null;
- }
- // Finaliza o timer do usuário se ele sair do jogo.
- public void OnClientDisconnect(int client) {
- if (g_hCommandTimer[client] != null) {
- KillTimer(g_hCommandTimer[client]);
- g_hCommandTimer[client] = null;
- }
- }
- // Comandos
- /*
- *
- * l4_programe_comando float:intervalo bool:fake string:comando [string:arg1] [string:arg2] ...
- *
- */
- public Action Command_ScheludeCommand(int client, int args) {
- if (args < 3) { // Valida o número de argumentos.
- ReplyToCommand(client, "O número de argumentos deve ser pelo menos igual a 3.");
- return Plugin_Handled;
- }
- char sInterval[16];
- GetCmdArg(1, sInterval, sizeof(sInterval)); // Primeiro parâmetro = intervalo.
- g_fInterval[client] = StringToFloat(sInterval);
- char sIsFake[16];
- GetCmdArg(2, sIsFake, sizeof(sIsFake)); // Terceiro parâmetro = fake.
- g_bFake[client] = StrEqual(sIsFake, "1", false) || StrEqual(sIsFake, "true", false) || StrEqual(sIsFake, "sim", false) || StrEqual(sIsFake, "on", false);
- GetCmdArg(3, g_sCommand[client], MAX_COMMAND_NAME_LENGTH); // Segundo parâmetro = comando.
- // Do quarto parâmetro em diante são os argumentos do comando.
- if (args > 3) {
- int n = args - 3;
- for (int i = 0; i < n; i++) {
- char sArg[MAX_COMMAND_NAME_LENGTH];
- GetCmdArg(i + 4, sArg, sizeof(sArg));
- Format(g_sCommand[client], MAX_COMMAND_NAME_LENGTH, "%s %s", g_sCommand[client], sArg);
- }
- }
- if (g_hCommandTimer[client] != null) // Se o timer já estiver ativo, destrua-o.
- KillTimer(g_hCommandTimer[client]);
- g_hCommandTimer[client] = CreateTimer(g_fInterval[client], OnCommandTimer, client, TIMER_REPEAT); // Cria-se um novo timer
- return Plugin_Handled;
- }
- // Callbacks
- public Action OnCommandTimer(Handle timer, any client) {
- if (!Client_IsIngame(client)) { // Se o usuário não estiver em jogo interrompe a execução do timer.
- g_hCommandTimer[client] = null;
- return Plugin_Stop; // Lembrando que para finalizar um timer dentro de seu callback deve-se retornar Plugin_Stop.
- }
- if (g_bFake[client])
- 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.
- else
- 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.
- return Plugin_Continue;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement