sharivan

funnyskins.sp

Sep 23rd, 2015
166
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.  *   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.
  6.  *   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.
  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.  
  32. #pragma semicolon 1 // Força o uso de ponto e vírgula ao final de casa instrução (exceto aquelas terminadas com })
  33.  
  34. // Includes
  35.  
  36. #include <sourcemod> // API do sourcemod
  37. #include <sdktools> // API da sdk tools
  38. #include <zombiereloaded> // API do zombie reloaded
  39.  
  40. // Constantes
  41. #define ResizeType_Generic      0
  42. #define ResizeType_Head         1
  43. #define ResizeType_Torso        2
  44. #define ResizeType_Hands        3
  45. #define ResizeTypes             4
  46.  
  47. #define VERSION         "1.0" // Versão do plugin
  48.  
  49. // Variáveis globais
  50.  
  51. // Todo array que esteja ligado aos slots de jogadores do servidor devem ter o tamanho igual a MAXPLAYERS + 1
  52. // 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.
  53. Handle g_iPlayerTimers[MAXPLAYERS + 1]; // Array que armazenara os timers para cada slot
  54. char g_sHumanModelName[8][PLATFORM_MAX_PATH]; // Array que armazenará os nomes dos models usados pelos humanos
  55. char g_sZombieModelName[2][PLATFORM_MAX_PATH]; // Array que armazenará os nomes dos models usados pelos zumbis
  56. float g_fZombieSize[MAXPLAYERS + 1] = {1.0, ...}; // Array que armazenará o tamanho de cada zumbi
  57. int g_iHumanCounter[MAXPLAYERS + 1] = {0, ...}; // Array de contadores para os humanos
  58. int g_iZombieCounter[MAXPLAYERS + 1] = {0, ...}; // Array de contadores para os zumbis
  59.  
  60. // Informação do plugin. É o que será mostrado quando for dado o comando sm plugins info <nome_do_plugin>
  61. public Plugin myinfo = {
  62.     name = "funnyskins",
  63.     author = "SHARIVAN from ΖмBя.™ Clan",
  64.     description = "Funny Skins!",
  65.     version = VERSION,
  66.     url = "http://www.zmbrasil.com.br/"
  67. };
  68.  
  69. // Callbacks ou forwards do sourcemod
  70.  
  71. // Executa sempre quando o plugin é carregado e iniciado
  72. public void OnPluginStart() {
  73.     // 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.
  74.     g_sHumanModelName[0] = "models/player/mapeadores/morell/masterchief/mc_blue.mdl";
  75.     PrecacheModel(g_sHumanModelName[0]);
  76.     g_sHumanModelName[1] = "models/player/mapeadores/morell/masterchief/mc_gold.mdl";
  77.     PrecacheModel(g_sHumanModelName[1]);
  78.     g_sHumanModelName[2] = "models/player/mapeadores/morell/masterchief/mc_green.mdl";
  79.     PrecacheModel(g_sHumanModelName[2]);
  80.     g_sHumanModelName[3] = "models/player/mapeadores/morell/masterchief/mc_pink.mdl";
  81.     PrecacheModel(g_sHumanModelName[3]);
  82.     g_sHumanModelName[4] = "models/player/mapeadores/morell/masterchief/mc_red.mdl";
  83.     PrecacheModel(g_sHumanModelName[4]);
  84.     g_sHumanModelName[5] = "models/player/mapeadores/morell/masterchief/mc_white.mdl";
  85.     PrecacheModel(g_sHumanModelName[5]);
  86.     g_sHumanModelName[6] = "models/player/mapeadores/morell/masterchief/mc_purple.mdl";
  87.     PrecacheModel(g_sHumanModelName[6]);
  88.     g_sHumanModelName[7] = "models/player/mapeadores/morell/masterchief/mc_black.mdl";
  89.     PrecacheModel(g_sHumanModelName[7]);
  90.    
  91.     // Faz a mesma coisa para os models que serão usados pelos zumbis
  92.     g_sZombieModelName[0] = "models/player/_P/re5dog/re5dog.mdl";
  93.     PrecacheModel(g_sZombieModelName[0]);
  94.     g_sZombieModelName[1] = "models/player/_P/alien/alien.mdl";
  95.     PrecacheModel(g_sZombieModelName[1]);
  96. }
  97.  
  98. // Executa sempre quando o plugin é carregado ou quando o mapa é iniciado. É pareado com OnMapEnd.
  99. public void OnMapStart() {
  100.     // Varredura de todos os jogadores. Sempre deve começar com 1 e varir até MaxClients.
  101.     for (int client = 1; client <= MaxClients; client++)
  102.         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.
  103. }
  104.  
  105. // 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.
  106. bool IsValidClient(int client) {
  107.     return client > 0 && client <= MaxClients;
  108. }
  109.  
  110. // 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.
  111. public Action OnPlayerTimer(Handle timer, any client) {
  112.     if (IsValidClient(client) // Verifica se é válido
  113.         && IsClientInGame(client) // Verifica se está em jogo
  114.         && IsPlayerAlive(client)) // Verifica se ele está vivo
  115.         if (ZR_IsClientHuman(client)) { // Se ele for humano...
  116.             if (g_iHumanCounter[client] >= 8)
  117.                 g_iHumanCounter[client] = 0;
  118.             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.
  119.         } else if (ZR_IsClientZombie(client)) { // Senão, caso ele seja um zumbi...
  120.             if (g_iZombieCounter[client] >= 2)
  121.                 g_iZombieCounter[client] = 0;
  122.             SetEntityModel(client, g_sZombieModelName[g_iZombieCounter[client]++]);
  123.            
  124.             if (g_fZombieSize[client] >= 10.0)
  125.                 g_fZombieSize[client] = 1.0;
  126.             g_fZombieSize[client] = g_fZombieSize[client] + 1.0;
  127.             ResizePlayer(client, g_fZombieSize[client]);
  128.         }
  129.    
  130.     return Plugin_Continue; // Continua...
  131. }
  132.  
  133. // Executa sempre quando o plugin é descarregado ou quando o mapa é finalizado. É pareado com OnMapStart.
  134. public void OnMapEnd() {
  135.     // Finaliza todos os timers que ainda estiverem em execução
  136.     for (int client = 1; client <= MaxClients; client++)
  137.         if (g_iPlayerTimers[client] != null) {
  138.             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.
  139.             g_iPlayerTimers[client] = null; // Para setar um handle como nulo, basta atribuir null.
  140.         }
  141. }
  142.  
  143. // Redimensiona um jogador
  144. void ResizePlayer(const int client, const float fScale) {
  145.     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.
  146.     SetEntPropFloat(client, Prop_Send, "m_flStepSize", 18.0 * fScale);
  147. }
RAW Paste Data