Написание плагинов

Wanderer

Шизофреник
Сообщения
171
Реакции
27
Здравствуйте, не могли бы вы помочь в написании плагина для CS:S v91, суть вот в чем. По завершению раунда в HUD сообщении посередине экрана (как в CS:GO) писало (Самый результативный игрок раунда {Ник игрока}). Если бы вы помогли, был бы премного благодарен
 

StormX

Участник
Сообщения
891
Реакции
302
Здравствуйте, не могли бы вы помочь в написании плагина для CS:S v91, суть вот в чем. По завершению раунда в HUD сообщении посередине экрана (как в CS:GO) писало (Самый результативный игрок раунда {Ник игрока}). Если бы вы помогли, был бы премного благодарен

А чем этот не подходит?
https://hlmod.ru/threads/most-destructive.244/
 

Wanderer

Шизофреник
Сообщения
171
Реакции
27
1590336001584.png

Только без самой менюшки, а просто текстом и в HUDe
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,520
Реакции
4,979
Wanderer, в ксс же аналогичная панель имеется.
Правда не помню каждый ли раз MVP указывается.

У себя на тестовом я её кваром sv_nowinpanel отрубил.
 

Вложения

  • 20191219140116_1.jpg
    20191219140116_1.jpg
    459.2 КБ · Просмотры: 55

Grey83

не пишу плагины с весны 2022
Сообщения
8,520
Реакции
4,979
Wanderer, можно сделать отображение MVP, но вот непонятно как написать за что получено: при включенной панельке можно инфу перехватывать (по идее) и получать с неё текст, а при отключенной хз где эту инфу брать.
 

Wanderer

Шизофреник
Сообщения
171
Реакции
27
Wanderer, можно сделать отображение MVP, но вот непонятно как написать за что получено: при включенной панельке можно инфу перехватывать (по идее) и получать с неё текст, а при отключенной хз где эту инфу брать.
А к rankme подключить не ? Оттуда же тоже MVP берется, или я ошибаюсь.
 

xstage

🏹
Сообщения
726
Реакции
754
Wanderer, можно сделать отображение MVP, но вот непонятно как написать за что получено: при включенной панельке можно инфу перехватывать (по идее) и получать с неё текст, а при отключенной хз где эту инфу брать.
Отловить её получить инфу и Plugin_Handle должно работать
Сообщения автоматически склеены:

Здравствуйте, не могли бы вы помочь в написании плагина для CS:S v91, суть вот в чем. По завершению раунда в HUD сообщении посередине экрана (как в CS:GO) писало (Самый результативный игрок раунда {Ник игрока}). Если бы вы помогли, был бы премного благодарен
Вот попробуй хз как на сурсе будет
 

Вложения

  • winpanel.smx
    3 КБ · Просмотры: 7
  • winpanel.sp
    557 байт · Просмотры: 18
Последнее редактирование:

Wanderer

Шизофреник
Сообщения
171
Реакции
27
Отловить её получить инфу и Plugin_Handle должно работать
Сообщения автоматически склеены:


Вот попробуй хз как на сурсе будет
1590391999314.png

Все работает хорошо, но когда убиваешь всех через админку, вылезает ценный игрок {hostname}, но это ничего страшного.А так,спасибо за то,что помог
Как показали тесты, с обычными игроками тоже,бывает, проскакивает название сервера, в чем может быть проблема ? Подскажите..
 
Последнее редактирование:

LEII4A

Участник
Сообщения
741
Реакции
135
Кто может поправить это гадство в логах?
PHP:
[SM] Blaming: warmup.smx
L 05/17/2020 - 20:02:19: [SM] Call stack trace:
L 05/17/2020 - 20:02:19: [SM]   [0] GetEntDataEnt2
L 05/17/2020 - 20:02:19: [SM]   [1] Line 245, C:\путь\sourcemod\scripting\warmup.sp::WeaponHandler
L 05/17/2020 - 20:02:19: [SM]   [2] Line 293, C:\путь\sourcemod\scripting\warmup.sp::DelayWeapon
C++:
#pragma semicolon 1
#include <sourcemod>
#include <sdktools>
#include <cstrike>
#define VERSION "1.1.8"

public Plugin:myinfo =
{
    name = "Warmup Round",
    author = "XARiUS",
    description = "Simple warmup round plugin.",
    version = "1.1.8",
    url = "http://www.the-otc.com/"
};

new String:language[4];
new String:languagecode[4];
new String:g_weapon[32];
new String:g_preexec[32];
new String:g_postexec[32];
new bool:IsWarmup;
new bool:g_enabled;
new bool:g_respawn;
new bool:g_friendlyfire;
new g_time;
new timesrepeated;

new Handle:g_Cvarenabled = INVALID_HANDLE;
new Handle:g_Cvartime = INVALID_HANDLE;
new Handle:g_Cvarweapon = INVALID_HANDLE;
new Handle:g_Cvarrespawn = INVALID_HANDLE;
new Handle:g_Cvarfriendlyfire = INVALID_HANDLE;
new Handle:g_Cvarpreexec = INVALID_HANDLE;
new Handle:g_Cvarpostexec = INVALID_HANDLE;
new Handle:g_Cvaractive = INVALID_HANDLE;
new Handle:g_warmuptimer = INVALID_HANDLE;

new g_iMyWeapons;

public OnPluginStart()
{
  LoadTranslations("warmup.phrases");
  CreateConVar("sm_warmupround_version", VERSION, "Warmup Round Version", 0|FCVAR_SPONLY|FCVAR_REPLICATED|FCVAR_NOTIFY|FCVAR_DONTRECORD);
  g_Cvaractive = CreateConVar("sm_warmupround_active", "0", "DO NOT MODIFY THIS VALUE DIRECTLY - USED FOR STATS TRACKING", FCVAR_DONTRECORD);
  g_Cvarenabled = CreateConVar("sm_warmupround_enabled", "1", "Enable this plugin. 0 = Disabled");
  g_Cvartime = CreateConVar("sm_warmupround_time", "30", "Time in seconds for the warmup to last.  Minimum 15.", _, true, 15.0, true, 120.0);
  g_Cvarweapon = CreateConVar("sm_warmupround_weapon", "hegrenade", "Weapon to give players during warmup.  HEGrenades are unlimted.  Examples: knife,deagle,fiveseven,elite,p228..");
  g_Cvarrespawn = CreateConVar("sm_warmupround_respawn", "1", "Respawn players during warmup. 0 = Disabled");
  g_Cvarfriendlyfire = CreateConVar("sm_warmupround_friendlyfire", "0", "Disable friendly fire during warmup. (Use this if you keep friendly fire ON normally) 0 = Disabled");
  g_Cvarpreexec = CreateConVar("sm_warmupround_preexec", "", "Config file to execute prior to warmup round starting.  File goes in /cfg/ directory.  (Example: 'prewarmup.cfg' | Leave blank for none)");
  g_Cvarpostexec = CreateConVar("sm_warmupround_postexec", "", "Config file to execute after warmup round has ended.  File goes in /cfg/ directory.  (Example: 'postwarmup.cfg' | Leave blank for none)");
  GetLanguageInfo(GetServerLanguage(), languagecode, sizeof(languagecode), language, sizeof(language));

  HookEvent("player_death", EventPlayerDeath, EventHookMode_Post);
  HookEvent("item_pickup", EventItemPickup, EventHookMode_Post);
  HookEvent("weapon_fire", EventWeaponFire, EventHookMode_Post);
 
  HookConVarChange(g_Cvarenabled, OnSettingChanged);
  HookConVarChange(g_Cvartime, OnSettingChanged);
  HookConVarChange(g_Cvarweapon, OnSettingChanged);
  HookConVarChange(g_Cvarrespawn, OnSettingChanged);
  HookConVarChange(g_Cvarfriendlyfire, OnSettingChanged);
  HookConVarChange(g_Cvarpreexec, OnSettingChanged);
  HookConVarChange(g_Cvarpostexec, OnSettingChanged);

  g_enabled = GetConVarBool(g_Cvarenabled);
  g_respawn = GetConVarBool(g_Cvarrespawn);
  g_friendlyfire = GetConVarBool(g_Cvarfriendlyfire);
  g_time = GetConVarInt(g_Cvartime);
  GetConVarString(g_Cvarpreexec, g_preexec, sizeof(g_preexec));
  GetConVarString(g_Cvarpostexec, g_postexec, sizeof(g_postexec));
  GetConVarString(g_Cvarweapon, g_weapon, sizeof(g_weapon));
  timesrepeated = g_time;
  IsWarmup = false;
  SetupOffsets();
 
  AutoExecConfig(true, "warmup");
}

SetupOffsets()
{
  g_iMyWeapons = FindSendPropInfo("CBaseCombatCharacter", "m_hMyWeapons");
  if (g_iMyWeapons == -1)
  {
    SetFailState("[Warmup] Error - Unable to get offset for CBaseCombatCharacter::m_hMyWeapons");
  }
}

public OnSettingChanged(Handle:convar, const String:oldValue[], const String:newValue[])
{
  if (convar == g_Cvarenabled)
  {
    if (newValue[0] == '1')
    {
            g_enabled = true;
    }
    else
    {
      g_enabled = false;
    }
  }
  if (convar == g_Cvarrespawn)
  {
    if (newValue[0] == '1')
    {
            g_respawn = true;
    }
    else
    {
      g_respawn = false;
    }
  }
  if (convar == g_Cvarfriendlyfire)
  {
    if (newValue[0] == '1')
    {
            g_friendlyfire = true;
    }
    else
    {
      g_friendlyfire = false;
    }
  }
  if (convar == g_Cvartime)
  {
    g_time = StringToInt(newValue);
  }
  if (convar == g_Cvarweapon)
  {
    CheckWeaponString(newValue);
  }
  if (convar == g_Cvarpreexec)
  {
    strcopy(g_preexec, sizeof(g_preexec), newValue);
  }
  if (convar == g_Cvarpostexec)
  {
    strcopy(g_postexec, sizeof(g_postexec), newValue);
  }
}

public OnAutoConfigsBuffered()
{
  if (g_warmuptimer != INVALID_HANDLE)
  {
    KillTimer(g_warmuptimer);
  }
  if (g_enabled)
    {
    SetConVarBool(g_Cvaractive, true, false, false);
    timesrepeated = g_time;
    IsWarmup = true;
    new String:buffer[32] = "cfg/";
    StrCat(buffer, sizeof(buffer), g_preexec);
    if (FileExists(buffer))
    {
      ServerCommand("exec %s", g_preexec);
    }
    if (g_friendlyfire)
    {
      ServerCommand("mp_friendlyfire 0");
    }
    g_warmuptimer = CreateTimer(1.0, Countdown, _, TIMER_REPEAT);
    }
}

public CheckWeaponString(const String:weapon[])
{
  new String:weapons[26][32];
  new bool:valid = false;
 
  weapons[0] = "glock";
  weapons[1] = "usp";
  weapons[2] = "p228";
  weapons[3] = "deagle";
  weapons[4] = "elite";
  weapons[5] = "fiveseven";
  weapons[6] = "m3";
  weapons[7] = "xm1014";
  weapons[8] = "mac10";
  weapons[9] = "tmp";
  weapons[10] = "mp5navy";
  weapons[11] = "ump45";
  weapons[12] = "p90";
  weapons[13] = "galil";
  weapons[14] = "famas";
  weapons[15] = "ak47";
  weapons[16] = "m4a1";
  weapons[17] = "sg552";
  weapons[18] = "aug";
  weapons[19] = "m249";
  weapons[20] = "scout";
  weapons[21] = "awp";
  weapons[22] = "g3sg1";
  weapons[23] = "sg550";
  weapons[24] = "hegrenade";
  weapons[25] = "knife";
 
  for (new i = 0; i <= 25; i++)
  {
    if (StrEqual(weapon, weapons[i], false))
    {
      valid = true;
    }
  }
  if (!valid)
  {
    PrintToServer("[Warmup Round] Weapon selection: %s, is not valid.  Please try setting sm_warmupround_weapon again.", weapon);
    g_weapon = "hegrenade";
  }
  else
  {
    PrintToServer("[Warmup Round] Weapon selection changed to: %s", weapon);
    strcopy(g_weapon, sizeof(g_weapon), weapon);
  }
}

public Action:CancelWarmup()
{
  SetConVarBool(g_Cvaractive, false, false, false);
  g_warmuptimer = INVALID_HANDLE;
  IsWarmup = false;
  ServerCommand("mp_restartgame 1");
  new String:buffer[32] = "cfg/";
  StrCat(buffer, sizeof(buffer), g_postexec);
  if (FileExists(buffer))
  {
    ServerCommand("exec %s", g_postexec);
  }
  if (g_friendlyfire)
  {
    ServerCommand("mp_friendlyfire 1");
  }
} 

WeaponHandler(client)
{
    if (IsWarmup && client != 0)
    {
        new String:buffer[32];
        static Slot = 0, EntityIndex = 0;
        decl String:WeaponClass[64] = "";
        for (Slot = 0; Slot <= (32 * 4); Slot += 4)
        {
            if (IsValidEdict(GetEntDataEnt2(client, (g_iMyWeapons + Slot))))
            {
                EntityIndex = GetEntDataEnt2(client, (g_iMyWeapons + Slot));
                GetEdictClassname(EntityIndex, WeaponClass, sizeof(WeaponClass));
                if (StrEqual(WeaponClass, "worldspawn", false))
                {
                    return;
                }
                RemovePlayerItem(client, EntityIndex);
                RemoveEdict(EntityIndex);
            }
        }
        if (strlen(g_weapon) > 2)
        {
            Format(buffer, sizeof(buffer), "weapon_%s", g_weapon);
            GivePlayerItem(client, buffer);
        }
        Slot = 0;
        EntityIndex = 0;
    }
} 

public Action:Countdown(Handle:timer)
{
  if (IsWarmup)
  {
    if (timesrepeated >= 1)
    {
      PrintCenterTextAll("Разминка: осталось %i сек.", timesrepeated);
      timesrepeated--;
    }
    else if (timesrepeated == 0)
    {
      timesrepeated = g_time;
      CancelWarmup();
      return Plugin_Stop;
    }
  }
  else
  {
    timesrepeated = g_time;
    return Plugin_Stop;
  }
  return Plugin_Continue;
}

public Action:DelayWeapon(Handle:timer, any:client)
{
  WeaponHandler(client);
}

public Action:SpawnPlayer(Handle:timer, any:client)
{
  if (IsClientInGame(client))
  {
    CS_RespawnPlayer(client);
  }
}

public EventItemPickup(Handle:event, const String:name[],bool:dontBroadcast)
{
    if (g_enabled && IsWarmup)
  {
    new clientid = GetClientOfUserId(GetEventInt(event, "userid"));
    new String:item[32];
    GetEventString(event, "item", item, sizeof(item));
    if (!StrEqual(item, g_weapon, false))
    {
      CreateTimer(0.1, DelayWeapon, clientid);
    }
  }
}

public EventWeaponFire(Handle:event,const String:name[],bool:dontBroadcast)
{
  if (g_enabled && IsWarmup)
  {
    if (StrEqual(g_weapon, "hegrenade", false))
    {
      new clientid = GetClientOfUserId(GetEventInt(event, "userid"));
      new String:weapon[32];
      GetEventString(event, "weapon", weapon, sizeof(weapon));
      if (StrEqual(weapon, "hegrenade", false))
      {
        CreateTimer(1.1, DelayWeapon, clientid);
      }
    }
  }
}
public EventPlayerDeath(Handle:event,const String:name[],bool:dontBroadcast)
{
  if (g_enabled && IsWarmup && g_respawn)
  {
    new clientid = GetClientOfUserId(GetEventInt(event, "userid"));
    CreateTimer(0.5, SpawnPlayer, clientid);
  }
}
 

NaN

FPE_INTDIV_TRAP
Сообщения
1,513
Реакции
1,487
Кто может поправить это гадство в логах?
PHP:
[SM] Blaming: warmup.smx
L 05/17/2020 - 20:02:19: [SM] Call stack trace:
L 05/17/2020 - 20:02:19: [SM]   [0] GetEntDataEnt2
L 05/17/2020 - 20:02:19: [SM]   [1] Line 245, C:\путь\sourcemod\scripting\warmup.sp::WeaponHandler
L 05/17/2020 - 20:02:19: [SM]   [2] Line 293, C:\путь\sourcemod\scripting\warmup.sp::DelayWeapon
C++:
#pragma semicolon 1
#include <sourcemod>
#include <sdktools>
#include <cstrike>
#define VERSION "1.1.8"

public Plugin:myinfo =
{
    name = "Warmup Round",
    author = "XARiUS",
    description = "Simple warmup round plugin.",
    version = "1.1.8",
    url = "http://www.the-otc.com/"
};

new String:language[4];
new String:languagecode[4];
new String:g_weapon[32];
new String:g_preexec[32];
new String:g_postexec[32];
new bool:IsWarmup;
new bool:g_enabled;
new bool:g_respawn;
new bool:g_friendlyfire;
new g_time;
new timesrepeated;

new Handle:g_Cvarenabled = INVALID_HANDLE;
new Handle:g_Cvartime = INVALID_HANDLE;
new Handle:g_Cvarweapon = INVALID_HANDLE;
new Handle:g_Cvarrespawn = INVALID_HANDLE;
new Handle:g_Cvarfriendlyfire = INVALID_HANDLE;
new Handle:g_Cvarpreexec = INVALID_HANDLE;
new Handle:g_Cvarpostexec = INVALID_HANDLE;
new Handle:g_Cvaractive = INVALID_HANDLE;
new Handle:g_warmuptimer = INVALID_HANDLE;

new g_iMyWeapons;

public OnPluginStart()
{
  LoadTranslations("warmup.phrases");
  CreateConVar("sm_warmupround_version", VERSION, "Warmup Round Version", 0|FCVAR_SPONLY|FCVAR_REPLICATED|FCVAR_NOTIFY|FCVAR_DONTRECORD);
  g_Cvaractive = CreateConVar("sm_warmupround_active", "0", "DO NOT MODIFY THIS VALUE DIRECTLY - USED FOR STATS TRACKING", FCVAR_DONTRECORD);
  g_Cvarenabled = CreateConVar("sm_warmupround_enabled", "1", "Enable this plugin. 0 = Disabled");
  g_Cvartime = CreateConVar("sm_warmupround_time", "30", "Time in seconds for the warmup to last.  Minimum 15.", _, true, 15.0, true, 120.0);
  g_Cvarweapon = CreateConVar("sm_warmupround_weapon", "hegrenade", "Weapon to give players during warmup.  HEGrenades are unlimted.  Examples: knife,deagle,fiveseven,elite,p228..");
  g_Cvarrespawn = CreateConVar("sm_warmupround_respawn", "1", "Respawn players during warmup. 0 = Disabled");
  g_Cvarfriendlyfire = CreateConVar("sm_warmupround_friendlyfire", "0", "Disable friendly fire during warmup. (Use this if you keep friendly fire ON normally) 0 = Disabled");
  g_Cvarpreexec = CreateConVar("sm_warmupround_preexec", "", "Config file to execute prior to warmup round starting.  File goes in /cfg/ directory.  (Example: 'prewarmup.cfg' | Leave blank for none)");
  g_Cvarpostexec = CreateConVar("sm_warmupround_postexec", "", "Config file to execute after warmup round has ended.  File goes in /cfg/ directory.  (Example: 'postwarmup.cfg' | Leave blank for none)");
  GetLanguageInfo(GetServerLanguage(), languagecode, sizeof(languagecode), language, sizeof(language));

  HookEvent("player_death", EventPlayerDeath, EventHookMode_Post);
  HookEvent("item_pickup", EventItemPickup, EventHookMode_Post);
  HookEvent("weapon_fire", EventWeaponFire, EventHookMode_Post);

  HookConVarChange(g_Cvarenabled, OnSettingChanged);
  HookConVarChange(g_Cvartime, OnSettingChanged);
  HookConVarChange(g_Cvarweapon, OnSettingChanged);
  HookConVarChange(g_Cvarrespawn, OnSettingChanged);
  HookConVarChange(g_Cvarfriendlyfire, OnSettingChanged);
  HookConVarChange(g_Cvarpreexec, OnSettingChanged);
  HookConVarChange(g_Cvarpostexec, OnSettingChanged);

  g_enabled = GetConVarBool(g_Cvarenabled);
  g_respawn = GetConVarBool(g_Cvarrespawn);
  g_friendlyfire = GetConVarBool(g_Cvarfriendlyfire);
  g_time = GetConVarInt(g_Cvartime);
  GetConVarString(g_Cvarpreexec, g_preexec, sizeof(g_preexec));
  GetConVarString(g_Cvarpostexec, g_postexec, sizeof(g_postexec));
  GetConVarString(g_Cvarweapon, g_weapon, sizeof(g_weapon));
  timesrepeated = g_time;
  IsWarmup = false;
  SetupOffsets();

  AutoExecConfig(true, "warmup");
}

SetupOffsets()
{
  g_iMyWeapons = FindSendPropInfo("CBaseCombatCharacter", "m_hMyWeapons");
  if (g_iMyWeapons == -1)
  {
    SetFailState("[Warmup] Error - Unable to get offset for CBaseCombatCharacter::m_hMyWeapons");
  }
}

public OnSettingChanged(Handle:convar, const String:oldValue[], const String:newValue[])
{
  if (convar == g_Cvarenabled)
  {
    if (newValue[0] == '1')
    {
            g_enabled = true;
    }
    else
    {
      g_enabled = false;
    }
  }
  if (convar == g_Cvarrespawn)
  {
    if (newValue[0] == '1')
    {
            g_respawn = true;
    }
    else
    {
      g_respawn = false;
    }
  }
  if (convar == g_Cvarfriendlyfire)
  {
    if (newValue[0] == '1')
    {
            g_friendlyfire = true;
    }
    else
    {
      g_friendlyfire = false;
    }
  }
  if (convar == g_Cvartime)
  {
    g_time = StringToInt(newValue);
  }
  if (convar == g_Cvarweapon)
  {
    CheckWeaponString(newValue);
  }
  if (convar == g_Cvarpreexec)
  {
    strcopy(g_preexec, sizeof(g_preexec), newValue);
  }
  if (convar == g_Cvarpostexec)
  {
    strcopy(g_postexec, sizeof(g_postexec), newValue);
  }
}

public OnAutoConfigsBuffered()
{
  if (g_warmuptimer != INVALID_HANDLE)
  {
    KillTimer(g_warmuptimer);
  }
  if (g_enabled)
    {
    SetConVarBool(g_Cvaractive, true, false, false);
    timesrepeated = g_time;
    IsWarmup = true;
    new String:buffer[32] = "cfg/";
    StrCat(buffer, sizeof(buffer), g_preexec);
    if (FileExists(buffer))
    {
      ServerCommand("exec %s", g_preexec);
    }
    if (g_friendlyfire)
    {
      ServerCommand("mp_friendlyfire 0");
    }
    g_warmuptimer = CreateTimer(1.0, Countdown, _, TIMER_REPEAT);
    }
}

public CheckWeaponString(const String:weapon[])
{
  new String:weapons[26][32];
  new bool:valid = false;

  weapons[0] = "glock";
  weapons[1] = "usp";
  weapons[2] = "p228";
  weapons[3] = "deagle";
  weapons[4] = "elite";
  weapons[5] = "fiveseven";
  weapons[6] = "m3";
  weapons[7] = "xm1014";
  weapons[8] = "mac10";
  weapons[9] = "tmp";
  weapons[10] = "mp5navy";
  weapons[11] = "ump45";
  weapons[12] = "p90";
  weapons[13] = "galil";
  weapons[14] = "famas";
  weapons[15] = "ak47";
  weapons[16] = "m4a1";
  weapons[17] = "sg552";
  weapons[18] = "aug";
  weapons[19] = "m249";
  weapons[20] = "scout";
  weapons[21] = "awp";
  weapons[22] = "g3sg1";
  weapons[23] = "sg550";
  weapons[24] = "hegrenade";
  weapons[25] = "knife";

  for (new i = 0; i <= 25; i++)
  {
    if (StrEqual(weapon, weapons[i], false))
    {
      valid = true;
    }
  }
  if (!valid)
  {
    PrintToServer("[Warmup Round] Weapon selection: %s, is not valid.  Please try setting sm_warmupround_weapon again.", weapon);
    g_weapon = "hegrenade";
  }
  else
  {
    PrintToServer("[Warmup Round] Weapon selection changed to: %s", weapon);
    strcopy(g_weapon, sizeof(g_weapon), weapon);
  }
}

public Action:CancelWarmup()
{
  SetConVarBool(g_Cvaractive, false, false, false);
  g_warmuptimer = INVALID_HANDLE;
  IsWarmup = false;
  ServerCommand("mp_restartgame 1");
  new String:buffer[32] = "cfg/";
  StrCat(buffer, sizeof(buffer), g_postexec);
  if (FileExists(buffer))
  {
    ServerCommand("exec %s", g_postexec);
  }
  if (g_friendlyfire)
  {
    ServerCommand("mp_friendlyfire 1");
  }
}

WeaponHandler(client)
{
    if (IsWarmup && client != 0)
    {
        new String:buffer[32];
        static Slot = 0, EntityIndex = 0;
        decl String:WeaponClass[64] = "";
        for (Slot = 0; Slot <= (32 * 4); Slot += 4)
        {
            if (IsValidEdict(GetEntDataEnt2(client, (g_iMyWeapons + Slot))))
            {
                EntityIndex = GetEntDataEnt2(client, (g_iMyWeapons + Slot));
                GetEdictClassname(EntityIndex, WeaponClass, sizeof(WeaponClass));
                if (StrEqual(WeaponClass, "worldspawn", false))
                {
                    return;
                }
                RemovePlayerItem(client, EntityIndex);
                RemoveEdict(EntityIndex);
            }
        }
        if (strlen(g_weapon) > 2)
        {
            Format(buffer, sizeof(buffer), "weapon_%s", g_weapon);
            GivePlayerItem(client, buffer);
        }
        Slot = 0;
        EntityIndex = 0;
    }
}

public Action:Countdown(Handle:timer)
{
  if (IsWarmup)
  {
    if (timesrepeated >= 1)
    {
      PrintCenterTextAll("Разминка: осталось %i сек.", timesrepeated);
      timesrepeated--;
    }
    else if (timesrepeated == 0)
    {
      timesrepeated = g_time;
      CancelWarmup();
      return Plugin_Stop;
    }
  }
  else
  {
    timesrepeated = g_time;
    return Plugin_Stop;
  }
  return Plugin_Continue;
}

public Action:DelayWeapon(Handle:timer, any:client)
{
  WeaponHandler(client);
}

public Action:SpawnPlayer(Handle:timer, any:client)
{
  if (IsClientInGame(client))
  {
    CS_RespawnPlayer(client);
  }
}

public EventItemPickup(Handle:event, const String:name[],bool:dontBroadcast)
{
    if (g_enabled && IsWarmup)
  {
    new clientid = GetClientOfUserId(GetEventInt(event, "userid"));
    new String:item[32];
    GetEventString(event, "item", item, sizeof(item));
    if (!StrEqual(item, g_weapon, false))
    {
      CreateTimer(0.1, DelayWeapon, clientid);
    }
  }
}

public EventWeaponFire(Handle:event,const String:name[],bool:dontBroadcast)
{
  if (g_enabled && IsWarmup)
  {
    if (StrEqual(g_weapon, "hegrenade", false))
    {
      new clientid = GetClientOfUserId(GetEventInt(event, "userid"));
      new String:weapon[32];
      GetEventString(event, "weapon", weapon, sizeof(weapon));
      if (StrEqual(weapon, "hegrenade", false))
      {
        CreateTimer(1.1, DelayWeapon, clientid);
      }
    }
  }
}
public EventPlayerDeath(Handle:event,const String:name[],bool:dontBroadcast)
{
  if (g_enabled && IsWarmup && g_respawn)
  {
    new clientid = GetClientOfUserId(GetEventInt(event, "userid"));
    CreateTimer(0.5, SpawnPlayer, clientid);
  }
}
не полностью ошибка скопирована
 

LEII4A

Участник
Сообщения
741
Реакции
135
не полностью ошибка скопирована
Да ну?
PHP:
L 05/17/2020 - 20:02:19: [SM] Blaming: warmup.smx
L 05/17/2020 - 20:02:19: [SM] Call stack trace:
L 05/17/2020 - 20:02:19: [SM]   [0] GetEntDataEnt2
L 05/17/2020 - 20:02:19: [SM]   [1] Line 245, C:\awpdm\addons\sourcemod\scripting\warmup.sp::WeaponHandler
L 05/17/2020 - 20:02:19: [SM]   [2] Line 293, C:\awpdm\addons\sourcemod\scripting\warmup.sp::DelayWeapon
L 05/17/2020 - 20:34:01: Error log file session closed.
L 05/17/2020 - 20:34:13: SourceMod error session started
L 05/17/2020 - 20:34:13: Info (map "$2000$_muha") (file "/home/servers/css/2000/cstrike/addons/sourcemod/logs/errors_20200517.log")
L 05/17/2020 - 20:34:13: [SM] Exception reported: Entity 2 (2) is invalid
L 05/17/2020 - 20:34:13: [SM] Blaming: warmup.smx
L 05/17/2020 - 20:34:13: [SM] Call stack trace:
L 05/17/2020 - 20:34:13: [SM]   [0] GetEntDataEnt2
L 05/17/2020 - 20:34:13: [SM]   [1] Line 245, C:\awpdm\addons\sourcemod\scripting\warmup.sp::WeaponHandler
L 05/17/2020 - 20:34:13: [SM]   [2] Line 293, C:\awpdm\addons\sourcemod\scripting\warmup.sp::DelayWeapon
L 05/17/2020 - 21:54:30: Error log file session closed.
L 05/17/2020 - 22:08:56: SourceMod error session started
L 05/17/2020 - 22:08:56: Info (map "$2000$_muha") (file "/home/servers/css/2000/cstrike/addons/sourcemod/logs/errors_20200517.log")
L 05/17/2020 - 22:08:56: [SM] Exception reported: Entity 3 (3) is invalid
L 05/17/2020 - 22:08:56: [SM] Blaming: warmup.smx
L 05/17/2020 - 22:08:56: [SM] Call stack trace:
L 05/17/2020 - 22:08:56: [SM]   [0] GetEntDataEnt2
L 05/17/2020 - 22:08:56: [SM]   [1] Line 245, C:\awpdm\addons\sourcemod\scripting\warmup.sp::WeaponHandler
L 05/17/2020 - 22:08:56: [SM]   [2] Line 293, C:\awpdm\addons\sourcemod\scripting\warmup.sp::DelayWeapon
L 05/17/2020 - 22:08:57: [SM] Exception reported: Entity 7 (7) is invalid
L 05/17/2020 - 22:08:57: [SM] Blaming: warmup.smx
L 05/17/2020 - 22:08:57: [SM] Call stack trace:
L 05/17/2020 - 22:08:57: [SM]   [0] GetEntDataEnt2
L 05/17/2020 - 22:08:57: [SM]   [1] Line 245, C:\awpdm\addons\sourcemod\scripting\warmup.sp::WeaponHandler
L 05/17/2020 - 22:08:57: [SM]   [2] Line 293, C:\awpdm\addons\sourcemod\scripting\warmup.sp::DelayWeapon
L 05/17/2020 - 23:36:22: Error log file session closed.
 
  • Фэйспалм
Реакции: NaN

NaN

FPE_INTDIV_TRAP
Сообщения
1,513
Реакции
1,487
Да ну?
PHP:
L 05/17/2020 - 20:02:19: [SM] Blaming: warmup.smx
L 05/17/2020 - 20:02:19: [SM] Call stack trace:
L 05/17/2020 - 20:02:19: [SM]   [0] GetEntDataEnt2
L 05/17/2020 - 20:02:19: [SM]   [1] Line 245, C:\awpdm\addons\sourcemod\scripting\warmup.sp::WeaponHandler
L 05/17/2020 - 20:02:19: [SM]   [2] Line 293, C:\awpdm\addons\sourcemod\scripting\warmup.sp::DelayWeapon
L 05/17/2020 - 20:34:01: Error log file session closed.
L 05/17/2020 - 20:34:13: SourceMod error session started
L 05/17/2020 - 20:34:13: Info (map "$2000$_muha") (file "/home/servers/css/2000/cstrike/addons/sourcemod/logs/errors_20200517.log")
L 05/17/2020 - 20:34:13: [SM] Exception reported: Entity 2 (2) is invalid
L 05/17/2020 - 20:34:13: [SM] Blaming: warmup.smx
L 05/17/2020 - 20:34:13: [SM] Call stack trace:
L 05/17/2020 - 20:34:13: [SM]   [0] GetEntDataEnt2
L 05/17/2020 - 20:34:13: [SM]   [1] Line 245, C:\awpdm\addons\sourcemod\scripting\warmup.sp::WeaponHandler
L 05/17/2020 - 20:34:13: [SM]   [2] Line 293, C:\awpdm\addons\sourcemod\scripting\warmup.sp::DelayWeapon
L 05/17/2020 - 21:54:30: Error log file session closed.
L 05/17/2020 - 22:08:56: SourceMod error session started
L 05/17/2020 - 22:08:56: Info (map "$2000$_muha") (file "/home/servers/css/2000/cstrike/addons/sourcemod/logs/errors_20200517.log")
L 05/17/2020 - 22:08:56: [SM] Exception reported: Entity 3 (3) is invalid
L 05/17/2020 - 22:08:56: [SM] Blaming: warmup.smx
L 05/17/2020 - 22:08:56: [SM] Call stack trace:
L 05/17/2020 - 22:08:56: [SM]   [0] GetEntDataEnt2
L 05/17/2020 - 22:08:56: [SM]   [1] Line 245, C:\awpdm\addons\sourcemod\scripting\warmup.sp::WeaponHandler
L 05/17/2020 - 22:08:56: [SM]   [2] Line 293, C:\awpdm\addons\sourcemod\scripting\warmup.sp::DelayWeapon
L 05/17/2020 - 22:08:57: [SM] Exception reported: Entity 7 (7) is invalid
L 05/17/2020 - 22:08:57: [SM] Blaming: warmup.smx
L 05/17/2020 - 22:08:57: [SM] Call stack trace:
L 05/17/2020 - 22:08:57: [SM]   [0] GetEntDataEnt2
L 05/17/2020 - 22:08:57: [SM]   [1] Line 245, C:\awpdm\addons\sourcemod\scripting\warmup.sp::WeaponHandler
L 05/17/2020 - 22:08:57: [SM]   [2] Line 293, C:\awpdm\addons\sourcemod\scripting\warmup.sp::DelayWeapon
L 05/17/2020 - 23:36:22: Error log file session closed.
да ну
вы потеряли первую строчку в первой пасте

C-подобный:
public Action:DelayWeapon(Handle:timer, any:client)
{
    if ((0<client<=MaxClients) && IsClientInGame(client))
        WeaponHandler(client);
}
 

LEII4A

Участник
Сообщения
741
Реакции
135
да ну
вы потеряли первую строчку в первой пасте

C-подобный:
public Action:DelayWeapon(Handle:timer, any:client)
{
    if ((0<client<=MaxClients) && IsClientInGame(client))
        WeaponHandler(client);
}
Спасибо, буду тестить и смотреть логи
C++:
#pragma semicolon 1
#include <sourcemod>
#include <sdktools>
#include <cstrike>
#define VERSION "1.1.8"

public Plugin:myinfo =
{
    name = "Warmup Round",
    author = "XARiUS",
    description = "Simple warmup round plugin.",
    version = "1.1.8",
    url = "http://www.the-otc.com/"
};

new String:language[4];
new String:languagecode[4];
new String:g_weapon[32];
new String:g_preexec[32];
new String:g_postexec[32];
new bool:IsWarmup;
new bool:g_enabled;
new bool:g_respawn;
new bool:g_friendlyfire;
new g_time;
new timesrepeated;

new Handle:g_Cvarenabled = INVALID_HANDLE;
new Handle:g_Cvartime = INVALID_HANDLE;
new Handle:g_Cvarweapon = INVALID_HANDLE;
new Handle:g_Cvarrespawn = INVALID_HANDLE;
new Handle:g_Cvarfriendlyfire = INVALID_HANDLE;
new Handle:g_Cvarpreexec = INVALID_HANDLE;
new Handle:g_Cvarpostexec = INVALID_HANDLE;
new Handle:g_Cvaractive = INVALID_HANDLE;
new Handle:g_warmuptimer = INVALID_HANDLE;

new g_iMyWeapons;

public OnPluginStart()
{
  LoadTranslations("warmup.phrases");
  CreateConVar("sm_warmupround_version", VERSION, "Warmup Round Version", 0|FCVAR_SPONLY|FCVAR_REPLICATED|FCVAR_NOTIFY|FCVAR_DONTRECORD);
  g_Cvaractive = CreateConVar("sm_warmupround_active", "0", "DO NOT MODIFY THIS VALUE DIRECTLY - USED FOR STATS TRACKING", FCVAR_DONTRECORD);
  g_Cvarenabled = CreateConVar("sm_warmupround_enabled", "1", "Enable this plugin. 0 = Disabled");
  g_Cvartime = CreateConVar("sm_warmupround_time", "30", "Time in seconds for the warmup to last.  Minimum 15.", _, true, 15.0, true, 120.0);
  g_Cvarweapon = CreateConVar("sm_warmupround_weapon", "hegrenade", "Weapon to give players during warmup.  HEGrenades are unlimted.  Examples: knife,deagle,fiveseven,elite,p228..");
  g_Cvarrespawn = CreateConVar("sm_warmupround_respawn", "1", "Respawn players during warmup. 0 = Disabled");
  g_Cvarfriendlyfire = CreateConVar("sm_warmupround_friendlyfire", "0", "Disable friendly fire during warmup. (Use this if you keep friendly fire ON normally) 0 = Disabled");
  g_Cvarpreexec = CreateConVar("sm_warmupround_preexec", "", "Config file to execute prior to warmup round starting.  File goes in /cfg/ directory.  (Example: 'prewarmup.cfg' | Leave blank for none)");
  g_Cvarpostexec = CreateConVar("sm_warmupround_postexec", "", "Config file to execute after warmup round has ended.  File goes in /cfg/ directory.  (Example: 'postwarmup.cfg' | Leave blank for none)");
  GetLanguageInfo(GetServerLanguage(), languagecode, sizeof(languagecode), language, sizeof(language));

  HookEvent("player_death", EventPlayerDeath, EventHookMode_Post);
  HookEvent("item_pickup", EventItemPickup, EventHookMode_Post);
  HookEvent("weapon_fire", EventWeaponFire, EventHookMode_Post);
 
  HookConVarChange(g_Cvarenabled, OnSettingChanged);
  HookConVarChange(g_Cvartime, OnSettingChanged);
  HookConVarChange(g_Cvarweapon, OnSettingChanged);
  HookConVarChange(g_Cvarrespawn, OnSettingChanged);
  HookConVarChange(g_Cvarfriendlyfire, OnSettingChanged);
  HookConVarChange(g_Cvarpreexec, OnSettingChanged);
  HookConVarChange(g_Cvarpostexec, OnSettingChanged);

  g_enabled = GetConVarBool(g_Cvarenabled);
  g_respawn = GetConVarBool(g_Cvarrespawn);
  g_friendlyfire = GetConVarBool(g_Cvarfriendlyfire);
  g_time = GetConVarInt(g_Cvartime);
  GetConVarString(g_Cvarpreexec, g_preexec, sizeof(g_preexec));
  GetConVarString(g_Cvarpostexec, g_postexec, sizeof(g_postexec));
  GetConVarString(g_Cvarweapon, g_weapon, sizeof(g_weapon));
  timesrepeated = g_time;
  IsWarmup = false;
  SetupOffsets();
 
  AutoExecConfig(true, "warmup");
}

SetupOffsets()
{
  g_iMyWeapons = FindSendPropInfo("CBaseCombatCharacter", "m_hMyWeapons");
  if (g_iMyWeapons == -1)
  {
    SetFailState("[Warmup] Error - Unable to get offset for CBaseCombatCharacter::m_hMyWeapons");
  }
}

public OnSettingChanged(Handle:convar, const String:oldValue[], const String:newValue[])
{
  if (convar == g_Cvarenabled)
  {
    if (newValue[0] == '1')
    {
            g_enabled = true;
    }
    else
    {
      g_enabled = false;
    }
  }
  if (convar == g_Cvarrespawn)
  {
    if (newValue[0] == '1')
    {
            g_respawn = true;
    }
    else
    {
      g_respawn = false;
    }
  }
  if (convar == g_Cvarfriendlyfire)
  {
    if (newValue[0] == '1')
    {
            g_friendlyfire = true;
    }
    else
    {
      g_friendlyfire = false;
    }
  }
  if (convar == g_Cvartime)
  {
    g_time = StringToInt(newValue);
  }
  if (convar == g_Cvarweapon)
  {
    CheckWeaponString(newValue);
  }
  if (convar == g_Cvarpreexec)
  {
    strcopy(g_preexec, sizeof(g_preexec), newValue);
  }
  if (convar == g_Cvarpostexec)
  {
    strcopy(g_postexec, sizeof(g_postexec), newValue);
  }
}

public OnAutoConfigsBuffered()
{
  if (g_warmuptimer != INVALID_HANDLE)
  {
    KillTimer(g_warmuptimer);
  }
  if (g_enabled)
    {
    SetConVarBool(g_Cvaractive, true, false, false);
    timesrepeated = g_time;
    IsWarmup = true;
    new String:buffer[32] = "cfg/";
    StrCat(buffer, sizeof(buffer), g_preexec);
    if (FileExists(buffer))
    {
      ServerCommand("exec %s", g_preexec);
    }
    if (g_friendlyfire)
    {
      ServerCommand("mp_friendlyfire 0");
    }
    g_warmuptimer = CreateTimer(1.0, Countdown, _, TIMER_REPEAT);
    }
}

public CheckWeaponString(const String:weapon[])
{
  new String:weapons[26][32];
  new bool:valid = false;
 
  weapons[0] = "glock";
  weapons[1] = "usp";
  weapons[2] = "p228";
  weapons[3] = "deagle";
  weapons[4] = "elite";
  weapons[5] = "fiveseven";
  weapons[6] = "m3";
  weapons[7] = "xm1014";
  weapons[8] = "mac10";
  weapons[9] = "tmp";
  weapons[10] = "mp5navy";
  weapons[11] = "ump45";
  weapons[12] = "p90";
  weapons[13] = "galil";
  weapons[14] = "famas";
  weapons[15] = "ak47";
  weapons[16] = "m4a1";
  weapons[17] = "sg552";
  weapons[18] = "aug";
  weapons[19] = "m249";
  weapons[20] = "scout";
  weapons[21] = "awp";
  weapons[22] = "g3sg1";
  weapons[23] = "sg550";
  weapons[24] = "hegrenade";
  weapons[25] = "knife";
 
  for (new i = 0; i <= 25; i++)
  {
    if (StrEqual(weapon, weapons[i], false))
    {
      valid = true;
    }
  }
  if (!valid)
  {
    PrintToServer("[Warmup Round] Weapon selection: %s, is not valid.  Please try setting sm_warmupround_weapon again.", weapon);
    g_weapon = "hegrenade";
  }
  else
  {
    PrintToServer("[Warmup Round] Weapon selection changed to: %s", weapon);
    strcopy(g_weapon, sizeof(g_weapon), weapon);
  }
}

public Action:CancelWarmup()
{
  SetConVarBool(g_Cvaractive, false, false, false);
  g_warmuptimer = INVALID_HANDLE;
  IsWarmup = false;
  ServerCommand("mp_restartgame 1");
  new String:buffer[32] = "cfg/";
  StrCat(buffer, sizeof(buffer), g_postexec);
  if (FileExists(buffer))
  {
    ServerCommand("exec %s", g_postexec);
  }
  if (g_friendlyfire)
  {
    ServerCommand("mp_friendlyfire 1");
  }
} 

WeaponHandler(client)
{
    if (IsWarmup && client != 0)
    {
        new String:buffer[32];
        static Slot = 0, EntityIndex = 0;
        decl String:WeaponClass[64] = "";
        for (Slot = 0; Slot <= (32 * 4); Slot += 4)
        {
            if (IsValidEdict(GetEntDataEnt2(client, (g_iMyWeapons + Slot))))
            {
                EntityIndex = GetEntDataEnt2(client, (g_iMyWeapons + Slot));
                GetEdictClassname(EntityIndex, WeaponClass, sizeof(WeaponClass));
                if (StrEqual(WeaponClass, "worldspawn", false))
                {
                    return;
                }
                RemovePlayerItem(client, EntityIndex);
                RemoveEdict(EntityIndex);
            }
        }
        if (strlen(g_weapon) > 2)
        {
            Format(buffer, sizeof(buffer), "weapon_%s", g_weapon);
            GivePlayerItem(client, buffer);
        }
        Slot = 0;
        EntityIndex = 0;
    }
} 

public Action:Countdown(Handle:timer)
{
  if (IsWarmup)
  {
    if (timesrepeated >= 1)
    {
      PrintCenterTextAll("Разминка: осталось %i сек.", timesrepeated);
      timesrepeated--;
    }
    else if (timesrepeated == 0)
    {
      timesrepeated = g_time;
      CancelWarmup();
      return Plugin_Stop;
    }
  }
  else
  {
    timesrepeated = g_time;
    return Plugin_Stop;
  }
  return Plugin_Continue;
}

public Action:DelayWeapon(Handle:timer, any:client)
{
    if ((0<client<=MaxClients) && IsClientInGame(client))
        WeaponHandler(client);
}

public Action:SpawnPlayer(Handle:timer, any:client)
{
  if (IsClientInGame(client))
  {
    CS_RespawnPlayer(client);
  }
}

public EventItemPickup(Handle:event, const String:name[],bool:dontBroadcast)
{
    if (g_enabled && IsWarmup)
  {
    new clientid = GetClientOfUserId(GetEventInt(event, "userid"));
    new String:item[32];
    GetEventString(event, "item", item, sizeof(item));
    if (!StrEqual(item, g_weapon, false))
    {
      CreateTimer(0.1, DelayWeapon, clientid);
    }
  }
}

public EventWeaponFire(Handle:event,const String:name[],bool:dontBroadcast)
{
  if (g_enabled && IsWarmup)
  {
    if (StrEqual(g_weapon, "hegrenade", false))
    {
      new clientid = GetClientOfUserId(GetEventInt(event, "userid"));
      new String:weapon[32];
      GetEventString(event, "weapon", weapon, sizeof(weapon));
      if (StrEqual(weapon, "hegrenade", false))
      {
        CreateTimer(1.1, DelayWeapon, clientid);
      }
    }
  }
}
public EventPlayerDeath(Handle:event,const String:name[],bool:dontBroadcast)
{
  if (g_enabled && IsWarmup && g_respawn)
  {
    new clientid = GetClientOfUserId(GetEventInt(event, "userid"));
    CreateTimer(0.5, SpawnPlayer, clientid);
  }
}
Может кому понадобится разминка на гранатах) и без мусора в логах
 

Nikly

Участник
Сообщения
290
Реакции
76
Хотелось бы чтобы немного исправили в плагине RoundEndSound https://hlmod.ru/resources/roundendsound.1246/ команду вызова главного меню, а то !res в чате не работает и только если sm_res в консоль или !sm_res в чат. но это игрокам не удобно и непривычно.
 

psychedelic

Участник
Сообщения
131
Реакции
35
Помогите реализовать квары , хочу чтоб в запретной зоны каждый мог выбрать себе команду..
у меня сейчас стоит квар , но все ровно команды не делает:(
"sv_dz_autojointeam" = "1" game - Whether players are automatically assigned a DZ team


dz_shuffle_teams рандомно мешает команду ..
sv_jointeam_allowed 1 // Разрешит играть командами
sv_dz_autojointeam 0 // Разрешит выбирать игрокам команды, если вы хотите попадать в случайные команды, измените значение на "1"
sv_dz_team_count 2 // Максимальное кол-во игроков в команде
 
Последнее редактирование:

Ампутаге

Участник
Сообщения
84
Реакции
8
Кто поможет в плагине баланса для jail сервера сделать так, чтобы система не кидала игроков за CT. Просто многие не хотят играть за СТ, а их закидывает.
 

Вложения

  • JailbreakTeamBalance.sp
    38.3 КБ · Просмотры: 6

Innomeni

Участник
Сообщения
320
Реакции
42
Прошу помочь, нужен микро-плагин, который запрещает абсолютно любое выбрасывание (в т.ч. после смерти) тактического щита weapon_shield в cs go.
 
Сверху Снизу