Страница 1 из 1

!me, !hp

Добавлено: 19 окт 2018, 10:48
Longipongeoos
Плагин позволяет использовать чат-команды !me, !hp
Исходный код

Код: Выбрать все

"!me"(или "/me", информация о нанесенном уроне) 
"!hp"(или /hp"", информация об убийце) после смерти.

Код: Выбрать все

/* Plugin Template generated by Pawn Studio */

#include <sourcemod>

#define CLEARITEM       {0,0,0,0,0,0,0}
#define CLEARHITSITEM    {0,0,0,0,0,0,0,0,0}

#define DAMAGE          0
#define ATTACKER       1
#define ATTACKERHP       2
#define ATTACKERAP       3
#define ATTACKERISDEAD   4
#define LASTDAMAGE       5
#define HITS          6


#define ME 0
#define HP 1

new g_MaxPlayers = 0;
new g_Clients[MAXPLAYERS+1][7];
new g_Hits[MAXPLAYERS+1][9];

new bool:g_IsRoundEnd = false;

new String:g_HitBox[9][16] =
{
   "HB_Generic",
   "HB_Head",
   "HB_Chest",
   "HB_Stomach",
   "HB_LeftArm",
   "HB_RightArm",
   "HB_LeftLeg",
   "HB_RightLeg",
   "HB_Gear"
};

new String:g_Attackers[MAXPLAYERS+1][64];
new String:g_Weapons[MAXPLAYERS+1][64];

public Plugin:myinfo =
{
   name = "Stats after death",
   author = "BURN",
   description = "/me /hp commands, special for 21games.ru",
   version = "1.0",
   url = ""
}

public OnPluginStart()
{
   LoadTranslations("sad.phrases");
   
   AddCommandListener(OnClientMessage, "say");
   AddCommandListener(OnClientMessage, "say_team");
   
   HookEvent("player_death", OnPlayerDeath);
   HookEvent("round_freeze_end", OnRoundStart);
   HookEvent("player_hurt", OnPlayerTakeDamage);
   HookEvent("cs_win_panel_round", OnRoundEnd);
}

public OnMapStart()
{
   g_MaxPlayers = GetMaxClients();
}

public OnClientPutInServer(client)
{
   g_Clients[client] = CLEARITEM;
   g_Hits[client] = CLEARHITSITEM;
}

public OnRoundStart(Handle:event, const String:name[], bool:dontBroadcast)
{   
   g_IsRoundEnd = false;
   
   for(new i = 1; i <= g_MaxPlayers; i++)
   {
      g_Clients[i] = CLEARITEM;
   }
   
   for(new i = 1; i <= g_MaxPlayers; i++)
   {
      g_Hits[i] = CLEARHITSITEM;
   }
}

public OnRoundEnd(Handle:event, const String:name[], bool:dontBroadcast)
{
   g_IsRoundEnd = true;
}

public Action:OnClientMessage(client, const String:msg[], args)
{
   if (client)
   {
      new String:text[6];
      
      GetCmdArgString(text, sizeof(text));
      
      if (StrEqual(text, "\"!me\"", false) || StrEqual(text, "\"/me\"", false))
      {
         PrintStatsMessage(client, ME);
      }
      else if (StrEqual(text, "\"!hp\"", false) || StrEqual(text, "\"/hp\"", false))
      {
         PrintStatsMessage(client, HP);
      }
   }
   
   return Plugin_Continue;
}

public OnPlayerTakeDamage(Handle:event, const String:name[], bool:dontBroadcast)
{
   new damage = GetEventInt(event, "dmg_health");
   new attacker = GetClientOfUserId(GetEventInt(event, "attacker"));
   new victim = GetClientOfUserId(GetEventInt(event, "userid"));
   
   if (attacker)
   {
      if (IsClientConnected(attacker) && IsClientConnected(victim))
      {
         if (GetClientTeam(attacker) != GetClientTeam(victim))
         {
            g_Clients[attacker][DAMAGE] += damage;
            g_Clients[attacker][HITS]++;
            g_Clients[victim][LASTDAMAGE] = damage;
            g_Hits[attacker][GetEventInt(event, "hitgroup")]++;
         }
      }
   }
}

public OnPlayerDeath(Handle:event, const String:name[], bool:dontBroadcast)
{
   new attacker = GetClientOfUserId(GetEventInt(event, "attacker"));
   new client = GetClientOfUserId(GetEventInt(event, "userid"));
   
   if (attacker && IsClientConnected(attacker))
   {
      GetClientName(attacker, g_Attackers[client], 64);
      
      g_Clients[client][ATTACKER] = attacker;
      GetEventString(event, "weapon", g_Weapons[client], 64);
      
      if (IsPlayerAlive(attacker))
      {
         g_Clients[client][ATTACKERHP] = GetClientHealth(attacker);
         g_Clients[client][ATTACKERAP] = GetClientArmor(attacker);
      }
      else
      {
         g_Clients[client][ATTACKERISDEAD] = 1;
      }
   }
   
   if (GetRandomInt(1, 4) == 2 && IsClientConnected(client))
   {
      PrintToChat(client, "%T%T", "Plugin_Prefix", client, "ScrollMessage", client);
   }
}

public PrintStatsMessage(client, type)
{
   new String: message[192];
   
   if (IsPlayerAlive(client) && !g_IsRoundEnd)
   {
      Format(message, 192, "%T", "Error_PlayerIsAlive", client)
   }
   else
   {
      if (type)
      {
         if (g_Clients[client][ATTACKER])
         {
            if (client == g_Clients[client][ATTACKER])
            {
               Format(message, 192, "%T", "Error_PlayerIsSuicide", client);
            }
            else
            {
               if (!g_Clients[client][ATTACKERISDEAD])
               {
                  Format(message, 192, "%T", "HPMessage", client,  g_Attackers[client], g_Clients[client][ATTACKERHP], g_Clients[client][ATTACKERAP], g_Weapons[client], g_Clients[client][LASTDAMAGE]);
               }
               else
               {
                  Format(message, 192, "%T", "HPMessage2", client,  g_Attackers[client], g_Weapons[client], g_Clients[client][LASTDAMAGE]);
               }
            }
         }
         else
         {
            Format(message, 192, "%T", "Error_NoAttacker", client);
         }
      }
      else
      {
         if (g_Clients[client][DAMAGE])
         {
            new String:tStr[128];
            new String:hitbox[32];
            
            for (new i = 0; i < 9; i++)
            {
               if (g_Hits[client][i])
               {
                  Format(hitbox, 32, "%T", g_HitBox[i], client);
                  
                  if (strlen(tStr))
                  {
                     Format(tStr, 128, "%s %s %d,", tStr,  hitbox, g_Hits[client][i]);
                  }
                  else
                  {
                     Format(tStr, 128, "%s%s %d,", tStr,  hitbox, g_Hits[client][i]);
                  }
               }
            }
            
            tStr[strlen(tStr)-1] = 0;
            
            Format(message, 192, "%T", "MEMessage", client, g_Clients[client][HITS], tStr, g_Clients[client][DAMAGE]);
         }
         else
         {
            Format(message, 192, "%T", "Error_NoHits", client);
         }
      }
   }
   
   PrintToChat(client, "%T%s", "Plugin_Prefix", client, message);
}