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

Тема в разделе "Программирование / Скриптинг", создана пользователем Юра Шмигель, 8 июн 2015.

  1. Юра Шмигель

    Юра Шмигель

    Сообщения:
    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 КБ
      Просмотров:
      0
  2. Danyas

    Danyas Спасибо, браток © yand3xmail Модератор

    Сообщения:
    1.715
    Симпатии:
    452
    PHP:
    public OnMapLoad(){CheckWeaponString(g_weapon);}
    Это всё после блока OnPluginStart
     
  3. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.972
    Симпатии:
    2.978
    PHP:
    GetConVarString(g_Cvarweapong_weaponsizeof(g_weapon));
    CheckWeaponString(g_weapon);
    Удаляем это из строк 50-51 и вставляем тут:
    PHP:
    public OnAutoConfigsBuffered()
    {
        if (
    g_warmuptimer != INVALID_HANDLE)
        {
            
    KillTimer(g_warmuptimer);
        }
        if (
    g_enabled)
        {
            
    GetConVarString(g_Cvarweapong_weaponsizeof(g_weapon));
            
    CheckWeaponString(g_weapon); // Вот оно
            
    SetConVarBool(g_Cvaractivetruefalsefalse);
            
    timesrepeated g_time;
            
    IsWarmup true;
            
    g_warmuptimer CreateTimer(1.0Countdown_TIMER_REPEAT);
        }
    }
     
    Юра Шмигель нравится это.
  4. Юра Шмигель

    Юра Шмигель

    Сообщения:
    32
    Симпатии:
    8
    Увы не помогло... еще идеи?

    Добавлено через 7 минут
    99 строка loose indetefication
    SetConVarBool(g_Cvaractive, true, false, false);

    Добавлено через 11 минут
    Хотя все работает даже с этим варнингом :-D
     
    Последнее редактирование: 8 июн 2015
  5. Юра Шмигель

    Юра Шмигель

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

    Вложения:

    • warmup.sp
      Размер файла:
      6,7 КБ
      Просмотров:
      4
    • warmup.smx
      Размер файла:
      7,3 КБ
      Просмотров:
      1