Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * Autor: "SHARIVAN do clã ZM Brasil (ΖмBя.™ Clan)
- *
- * Descrição:
- * Este plugin é apenas um exemplo simples de plugin para sourcemod escrito na nova sintaxe do sourcepawn. Ele alterna as skins dos humanos entre as skins de masterchief e para os zumbis alterna entre as skins do re5dog e do alien. Além disso, para os zumbis o tamanho de cada skin é alternado variando de 1 até 10.
- * Para que este plugin funcione é necessário que tenha o Zombie:Reloaded instalado em seu servidor e que tenha todos os models do masterchief, re5dog e alien instalados. Estes models foram usados apenas como exemplos, se preferir pode usar o model que quiser desde que isso não cause erros de semântica neste plugin.
- *
- * 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 // Força o uso de ponto e vírgula ao final de casa instrução (exceto aquelas terminadas com })
- // Includes
- #include <sourcemod> // API do sourcemod
- #include <sdktools> // API da sdk tools
- #include <zombiereloaded> // API do zombie reloaded
- // Constantes
- #define ResizeType_Generic 0
- #define ResizeType_Head 1
- #define ResizeType_Torso 2
- #define ResizeType_Hands 3
- #define ResizeTypes 4
- #define VERSION "1.0" // Versão do plugin
- // Variáveis globais
- // Todo array que esteja ligado aos slots de jogadores do servidor devem ter o tamanho igual a MAXPLAYERS + 1
- // Handle é um tipo especial do sourcepawn, são como se fossem ponteiros/objetos e são contados por referência pela máquina virtual que processa as instruções de um plugin sourcemod. Em especial, timers são handles mas outros exemplos também poderiam ser citados como por exemplo as convars.
- Handle g_iPlayerTimers[MAXPLAYERS + 1]; // Array que armazenara os timers para cada slot
- char g_sHumanModelName[8][PLATFORM_MAX_PATH]; // Array que armazenará os nomes dos models usados pelos humanos
- char g_sZombieModelName[2][PLATFORM_MAX_PATH]; // Array que armazenará os nomes dos models usados pelos zumbis
- float g_fZombieSize[MAXPLAYERS + 1] = {1.0, ...}; // Array que armazenará o tamanho de cada zumbi
- int g_iHumanCounter[MAXPLAYERS + 1] = {0, ...}; // Array de contadores para os humanos
- int g_iZombieCounter[MAXPLAYERS + 1] = {0, ...}; // Array de contadores para os zumbis
- // Informação do plugin. É o que será mostrado quando for dado o comando sm plugins info <nome_do_plugin>
- public Plugin myinfo = {
- name = "funnyskins",
- author = "SHARIVAN from ΖмBя.™ Clan",
- description = "Funny Skins!",
- version = VERSION,
- url = "http://www.zmbrasil.com.br/"
- };
- // Callbacks ou forwards do sourcemod
- // Executa sempre quando o plugin é carregado e iniciado
- public void OnPluginStart() {
- // Inicializa os nomes dos models que serão usados pelos humanos e faz precache de cada um. É necessário sempre dar precache em um tipo de ativo a ser usado durante o jogo, o que inclui materiais, modelos, partículas, sons, etc.
- g_sHumanModelName[0] = "models/player/mapeadores/morell/masterchief/mc_blue.mdl";
- PrecacheModel(g_sHumanModelName[0]);
- g_sHumanModelName[1] = "models/player/mapeadores/morell/masterchief/mc_gold.mdl";
- PrecacheModel(g_sHumanModelName[1]);
- g_sHumanModelName[2] = "models/player/mapeadores/morell/masterchief/mc_green.mdl";
- PrecacheModel(g_sHumanModelName[2]);
- g_sHumanModelName[3] = "models/player/mapeadores/morell/masterchief/mc_pink.mdl";
- PrecacheModel(g_sHumanModelName[3]);
- g_sHumanModelName[4] = "models/player/mapeadores/morell/masterchief/mc_red.mdl";
- PrecacheModel(g_sHumanModelName[4]);
- g_sHumanModelName[5] = "models/player/mapeadores/morell/masterchief/mc_white.mdl";
- PrecacheModel(g_sHumanModelName[5]);
- g_sHumanModelName[6] = "models/player/mapeadores/morell/masterchief/mc_purple.mdl";
- PrecacheModel(g_sHumanModelName[6]);
- g_sHumanModelName[7] = "models/player/mapeadores/morell/masterchief/mc_black.mdl";
- PrecacheModel(g_sHumanModelName[7]);
- // Faz a mesma coisa para os models que serão usados pelos zumbis
- g_sZombieModelName[0] = "models/player/_P/re5dog/re5dog.mdl";
- PrecacheModel(g_sZombieModelName[0]);
- g_sZombieModelName[1] = "models/player/_P/alien/alien.mdl";
- PrecacheModel(g_sZombieModelName[1]);
- }
- // Executa sempre quando o plugin é carregado ou quando o mapa é iniciado. É pareado com OnMapEnd.
- public void OnMapStart() {
- // Varredura de todos os jogadores. Sempre deve começar com 1 e varir até MaxClients.
- for (int client = 1; client <= MaxClients; client++)
- g_iPlayerTimers[client] = CreateTimer(0.1, OnPlayerTimer, client, TIMER_REPEAT); // Cria um timer para cada slot dentro do servidor. Cada timer executará repetidas vezes até que o plugin seja descarregado. Cada timer executará a cada 100 milisegundos.
- }
- // Um client index é valido somente se ele for maior que zero e menor ou igual a MaxClients. O índice zero é usado pelo console do servidor (ou pela entidade World) e os índices maiores que MaxClients são usadas pelas demais entidades do jogo.
- bool IsValidClient(int client) {
- return client > 0 && client <= MaxClients;
- }
- // O tipo any é qualquer coisa do tipo cell (int, float, bool, char, Handle, Addres, etc). Qualquer coisa que tenha 4 bytes, também denominados de tipos escalares.
- public Action OnPlayerTimer(Handle timer, any client) {
- if (IsValidClient(client) // Verifica se é válido
- && IsClientInGame(client) // Verifica se está em jogo
- && IsPlayerAlive(client)) // Verifica se ele está vivo
- if (ZR_IsClientHuman(client)) { // Se ele for humano...
- if (g_iHumanCounter[client] >= 8)
- g_iHumanCounter[client] = 0;
- SetEntityModel(client, g_sHumanModelName[g_iHumanCounter[client]++]); // Aqui é feita uma chamada a uma das APIs do sourcemod. A função SetEntityModel altera o model de uma entidade. Lembrando que somente pode-se definir models que já tenham antes passados pelo precache.
- } else if (ZR_IsClientZombie(client)) { // Senão, caso ele seja um zumbi...
- if (g_iZombieCounter[client] >= 2)
- g_iZombieCounter[client] = 0;
- SetEntityModel(client, g_sZombieModelName[g_iZombieCounter[client]++]);
- if (g_fZombieSize[client] >= 10.0)
- g_fZombieSize[client] = 1.0;
- g_fZombieSize[client] = g_fZombieSize[client] + 1.0;
- ResizePlayer(client, g_fZombieSize[client]);
- }
- return Plugin_Continue; // Continua...
- }
- // Executa sempre quando o plugin é descarregado ou quando o mapa é finalizado. É pareado com OnMapStart.
- public void OnMapEnd() {
- // Finaliza todos os timers que ainda estiverem em execução
- for (int client = 1; client <= MaxClients; client++)
- if (g_iPlayerTimers[client] != null) {
- KillTimer(g_iPlayerTimers[client]); // Sempre invoque KillTimer quando precisar finalizar um timer fora do callback associado a ele, caso contrário basta retornar Plugin_Stop dentro do callback associado ao timer.
- g_iPlayerTimers[client] = null; // Para setar um handle como nulo, basta atribuir null.
- }
- }
- // Redimensiona um jogador
- void ResizePlayer(const int client, const float fScale) {
- SetEntPropFloat(client, Prop_Send, "m_flModelScale", fScale); // SetEntPropFloat altera uma netprop ou datamap de uma entidade. Para entender melhor o funcionamento disso é necessário que você tenha conhecimento avançado de como funciona o Source Engine e da SDK do mod específico no qual você está trabalhando. Neste caso específico, ele altera uma propriedade (ou campo) m_flModelScale do tipo float da classe CBaseAnimating.
- SetEntPropFloat(client, Prop_Send, "m_flStepSize", 18.0 * fScale);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement