Помогите с плагином Warmup Round

Юра Шмигель

Участник
Сообщения
32
Реакции
8
Суть плагина выдавать на разминке только то оружие которое вы указали или рандом.
При sm_warmupround_weapon "random" оружие выбирается из массива new String:g_sWeaponsNamesGame[WEAPON_NB][].
Вобщем проблема такая... обрезал и отредактировал плагин так как мне необходимо, но вот обнаружилась проблема - рандомный выбор делается только при старте сервера и далее при смене карты не выбирает новое рандомное оружие из списка а выдает оружие которое было выбрано плагином при старте сервера. Так вот помогите сделать так что бы оружие выбиралось рандомно при смене карты и не только при перезапуске сервера а то я уже башку сломал :-D

HTML:
#pragma semicolon 1
#include <sourcemod>
#include <sdktools>
#include <cstrike>
#define VERSION "1.0"

public Plugin:myinfo =
{
	name = "Warmup Round",
	author = "XARiUS, Avo",
	description = "Simple warmup round plugin.",
	version = VERSION,
	url = ""
};

new String:g_weapon[32];
new bool:IsWarmup;
new bool:g_enabled;
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_Cvaractive = INVALID_HANDLE;
new Handle:g_warmuptimer = INVALID_HANDLE;

new g_iMyWeapons;

#define WEAPON_NB 4
new String:g_sWeaponsNamesGame[WEAPON_NB][] = {"knife","hegrenade","molotov","incgrenade"};

public OnPluginStart()
{
  CreateConVar("sm_warmupround_version", VERSION, "Warmup Round Version", FCVAR_PLUGIN|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 = FindConVar("mp_warmuptime");
  g_Cvarweapon = CreateConVar("sm_warmupround_weapon", "hegrenade", "Weapon to give players during warmup.  HEGrenades are unlimted.  Examples: knife,deagle,fiveseven,elite,hkp2000,random..");

  HookEvent("item_pickup", EventItemPickup, EventHookMode_Post);
  HookEvent("weapon_fire", EventWeaponFire, EventHookMode_Post);
  
  HookConVarChange(g_Cvarenabled, OnSettingChanged);
  HookConVarChange(g_Cvartime, OnSettingChanged);
  HookConVarChange(g_Cvarweapon, OnSettingChanged);
  
  g_enabled = GetConVarBool(g_Cvarenabled);
  g_time = GetConVarInt(g_Cvartime);
  GetConVarString(g_Cvarweapon, g_weapon, sizeof(g_weapon));
  CheckWeaponString(g_weapon);
  timesrepeated = g_time;
  IsWarmup = false;
  SetupOffsets();
  
  AutoExecConfig(true, "warmup");
}

SetupOffsets()
{
  g_iMyWeapons = FindSendPropOffs("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_Cvartime)
  {
    g_time = StringToInt(newValue);
  }
  if (convar == g_Cvarweapon)
  {
    CheckWeaponString(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;
    g_warmuptimer = CreateTimer(1.0, Countdown, _, TIMER_REPEAT);
	}
}

public CheckWeaponString(const String:weapon[])
{
  new bool:valid = false;
  
  if(StrEqual(weapon, "random", false))
  {
    strcopy(g_weapon, sizeof(g_weapon), g_sWeaponsNamesGame[GetURandomInt() % WEAPON_NB]);
    PrintToServer("[Warmup Round] Weapon selection random: %s", weapon);
  }
  else
  {
    for (new i = 0; i < WEAPON_NB; i++)
    {
      if (StrEqual(weapon, g_sWeaponsNamesGame[i], false))
      {
        valid = true;
        break;
      }
    }
    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;
}  

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)
    {
      EntityIndex = GetEntDataEnt2(client, (g_iMyWeapons + Slot));
      if (EntityIndex != 0 && IsValidEdict(EntityIndex))
      {
        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)
    {
      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 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(0.5, DelayWeapon, clientid);
      }
    }
	else if (StrEqual(g_weapon, "molotov", false))
    {
      new clientid = GetClientOfUserId(GetEventInt(event, "userid"));
      new String:weapon[32];
      GetEventString(event, "weapon", weapon, sizeof(weapon));
      if (StrEqual(weapon, "molotov", false))
      {
        CreateTimer(0.5, DelayWeapon, clientid);
      }
    }
	else if (StrEqual(g_weapon, "incgrenade", false))
    {
      new clientid = GetClientOfUserId(GetEventInt(event, "userid"));
      new String:weapon[32];
      GetEventString(event, "weapon", weapon, sizeof(weapon));
      if (StrEqual(weapon, "incgrenade", false))
      {
        CreateTimer(0.5, DelayWeapon, clientid);
      }
    }
  }
}

Оригинал тут
 

Вложения

  • warmup.sp
    6.6 КБ · Просмотры: 6

Danyas

Участник
Сообщения
2,173
Реакции
1,072
PHP:
public OnMapLoad(){CheckWeaponString(g_weapon);}

Это всё после блока OnPluginStart
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #3
PHP:
GetConVarString(g_Cvarweapon, g_weapon, sizeof(g_weapon));
CheckWeaponString(g_weapon);
Удаляем это из строк 50-51 и вставляем тут:
PHP:
public OnAutoConfigsBuffered()
{
	if (g_warmuptimer != INVALID_HANDLE)
	{
		KillTimer(g_warmuptimer);
	}
	if (g_enabled)
	{
		GetConVarString(g_Cvarweapon, g_weapon, sizeof(g_weapon));
		CheckWeaponString(g_weapon); // Вот оно
		SetConVarBool(g_Cvaractive, true, false, false);
		timesrepeated = g_time;
		IsWarmup = true;
		g_warmuptimer = CreateTimer(1.0, Countdown, _, TIMER_REPEAT);
	}
}
 

Юра Шмигель

Участник
Сообщения
32
Реакции
8
PHP:
public OnMapLoad(){CheckWeaponString(g_weapon);}

Это всё после блока OnPluginStart

Увы не помогло... еще идеи?

Добавлено через 7 минут
PHP:
GetConVarString(g_Cvarweapon, g_weapon, sizeof(g_weapon));
CheckWeaponString(g_weapon);
Удаляем это из строк 50-51 и вставляем тут:
PHP:
public OnAutoConfigsBuffered()
{
	if (g_warmuptimer != INVALID_HANDLE)
	{
		KillTimer(g_warmuptimer);
	}
	if (g_enabled)
	{
		GetConVarString(g_Cvarweapon, g_weapon, sizeof(g_weapon));
		CheckWeaponString(g_weapon); // Вот оно
		SetConVarBool(g_Cvaractive, true, false, false);
		timesrepeated = g_time;
		IsWarmup = true;
		g_warmuptimer = CreateTimer(1.0, Countdown, _, TIMER_REPEAT);
	}
}

99 строка loose indetefication
SetConVarBool(g_Cvaractive, true, false, false);

Добавлено через 11 минут
Хотя все работает даже с этим варнингом :-D
 
Последнее редактирование:

Юра Шмигель

Участник
Сообщения
32
Реакции
8
:beer: спасибо за помощь! Вот может кому пригодится делюсь окончательным вариантом
Настройки в warmup.cfg (создается при первом запуске)
 

Вложения

  • warmup.sp
    6.7 КБ · Просмотры: 45
  • warmup.smx
    7.3 КБ · Просмотры: 24
Сверху Снизу