Таймер на удаление оружия

Тема в разделе "Запросы", создана пользователем inklesspen, 1 май 2016.

  1. inklesspen

    inklesspen После "Р" в слове "Лопата"

    Сообщения:
    834
    Симпатии:
    197
    Я никогда небыл силен в таймерах sourcemod, поэтому прошу вас помочь.

    код
    Код:
    new Handle:timerlol[2049] = {INVALID_HANDLE,...}
    
    public OnClientPutInServer(client)
    {
        SDKHook(client, SDKHook_WeaponDropPost, DropPost)
        SDKHook(client, SDKHook_WeaponEquipPost, EquipPost)
    }
    
    public OnEntityDestroyed(entity)
    {
        if(entity<2049&&entity>0)
        {
            if(timerlol[entity] != INVALID_HANDLE) KillTimer(timerlol[entity])
                timerlol[entity] = INVALID_HANDLE
        }
    }
    
    public EquipPost(client, weapon)
    {
        if(!(weapon<2049&&weapon>0))
            return;
        if(timerlol[weapon] != INVALID_HANDLE) KillTimer(timerlol[weapon])
        timerlol[weapon] = INVALID_HANDLE
    }
    
    public DropPost(client, weapon)
    {
        if(!(weapon<2049&&weapon>0))
            return;
        timerlol[weapon] = CreateTimer(10.0, DeleteWeapon, weapon, TIMER_FLAG_NO_MAPCHANGE)
    }
    
    public Action DeleteWeapon(Handle timer, any weapon)
    {
        if(!YesEntityMe(weapon))
            return
        decl String:arg[256]
        GetEntityClassname(weapon, arg, sizeof(arg))
        if(StrContains(arg, "weapon_") == -1)
            return;
        AcceptEntityInput(weapon, "kill")
        if(timerlol[weapon] != INVALID_HANDLE) CloseHandle(timerlol[weapon])
        timerlol[weapon] = INVALID_HANDLE
    }
    

    Ошибки:
    Код:
    L 05/01/2016 - 07:40:20: [SM] Native "KillTimer" reported: Invalid timer handle a733023e (error 1)
    L 05/01/2016 - 07:40:20: [SM] Displaying call stack trace for plugin "noweapon.smx":
    L 05/01/2016 - 07:40:20: [SM]   [0]  Line 24, C:\Users\inklesspen\Desktop 2\Новая папка (22)\s17\noweapon.sp::EquipPost()
    L 05/01/2016 - 07:40:20: [SM] Native "KillTimer" reported: Invalid timer handle a733023e (error 1)
    L 05/01/2016 - 07:40:20: [SM] Displaying call stack trace for plugin "noweapon.smx":
    L 05/01/2016 - 07:40:20: [SM]   [0]  Line 14, C:\Users\inklesspen\Desktop 2\Новая папка (22)\s17\noweapon.sp::OnEntityDestroyed()
    
     
  2. Hejter

    Hejter Mapper Source Engine

    Сообщения:
    1.771
    Симпатии:
    259
    @inklesspen, что за код? зачем столько не нужных условий.
     
  3. gibs

    gibs Фитиль народного волненья

    Сообщения:
    538
    Симпатии:
    137
    PHP:
    #pragma semicolon 1

    #include <sourcemod>
    #include <sdktools>
    #include <sdkhooks>

    #pragma newdecls required

    #define REMOVE_TIME 10.0

    enum
    {
        
    block_timer,
        
    block_entref
    };

    ArrayList g_TimersArray null;

    public 
    void OnPluginStart()
    {
        
    g_TimersArray = new ArrayList(2);
      
        
    HookEvent("round_start"Event_RoundStartEventHookMode_PostNoCopy);
    }

    public 
    void OnClientPostAdminCheck(int client)
    {
        
    SDKHook(clientSDKHook_WeaponEquipPostHook_WeaponEquipPost);
        
    SDKHook(clientSDKHook_WeaponDropPostHook_WeaponDropPost);
    }

    public 
    void Event_RoundStart(Event event, const char[] namebool dontBroadcast)
    {
        
    int iSize g_TimersArray.Length;
        if(
    iSize 0)
        {
            for (
    int i 0iSizei++)
                
    KillTimer(g_TimersArray.Get(i));
          
            
    g_TimersArray.Clear();
        }
    }

    public 
    Action Hook_WeaponEquipPost(int clientint weapon)
    {
        
    int ref EntIndexToEntRef(weapon);
        
    Handle hTimer CreateTimer(REMOVE_TIMETimer_Removeref);
      
        
    int idx g_TimersArray.Push(hTimer);
        
    g_TimersArray.Set(idxrefblock_entref);
    }

    public 
    Action Hook_WeaponDropPost(int clientint weapon)
    {
        
    int ref EntIndexToEntRef(weapon);
        
    int idx g_TimersArray.FindValue(refblock_entref);
        if(
    idx != -1)
        {
            
    KillTimer(g_TimersArray.Get(idx));
            
    g_TimersArray.Erase(idx);
        }
    }

    public 
    Action Timer_Remove(Handle timerany ref)
    {
        
    int ent EntRefToEntIndex(ref);
        if(
    ent != INVALID_ENT_REFERENCE && IsValidEntity(ent))
            
    AcceptEntityInput(ent"Kill");
      
        
    int idx g_TimersArray.FindValue(timer);
        if(
    idx != -1)
            
    g_TimersArray.Erase(idx);
      
        return 
    Plugin_Stop;
    }
    А вот это уже приятная редкость для этого форума. Человек действительно пытается что-то сделать самостоятельно.
     
    Последнее редактирование: 2 май 2016
  4. inklesspen

    inklesspen После "Р" в слове "Лопата"

    Сообщения:
    834
    Симпатии:
    197
    Мне не помешало бы объяснение для дел в будущем, но думаю, со временем, я разберусь. Спасибо.
     
  5. gibs

    gibs Фитиль народного волненья

    Сообщения:
    538
    Симпатии:
    137
    @inklesspen, было бы что тут объяснять, если честно. Хотя можно даже кое-что добавить.
    PHP:
    #pragma semicolon 1

    #include <sourcemod>
    #include <sdktools>
    #include <sdkhooks>

    #pragma newdecls required

    #define REMOVE_TIME 10.0

    enum
    {
        
    block_timer,
        
    block_entref
    };

    ArrayList g_TimersArray null;

    public 
    void OnPluginStart()
    {
        
    g_TimersArray = new ArrayList(2);
     
        
    HookEvent("round_start"Event_RoundStartEventHookMode_PostNoCopy);
    }

    public 
    void OnMapEnd()
    {
        if(
    g_TimersArray.Length)
            
    g_TimersArray.Clear();
    }

    public 
    void OnClientPostAdminCheck(int client)
    {
        
    SDKHook(clientSDKHook_WeaponEquipPostHook_WeaponEquipPost);
        
    SDKHook(clientSDKHook_WeaponDropPostHook_WeaponDropPost);
    }

    public 
    void Event_RoundStart(Event event, const char[] namebool dontBroadcast)
    {
        
    int iSize g_TimersArray.Length;
        if(
    iSize 0)
        {
            for (
    int i 0iSizei++)
                
    KillTimer(g_TimersArray.Get(i));
         
            
    g_TimersArray.Clear();
        }
    }

    public 
    Action Hook_WeaponEquipPost(int clientint weapon)
    {
        
    int ref EntIndexToEntRef(weapon);
        
    int idx g_TimersArray.FindValue(refblock_entref);
        if(
    idx != -1)
        {
            
    KillTimer(g_TimersArray.Get(idx));
            
    g_TimersArray.Erase(idx);
        }
    }

    public 
    Action Hook_WeaponDropPost(int clientint weapon)
    {
        
    int ref EntIndexToEntRef(weapon);
        
    Handle hTimer CreateTimer(REMOVE_TIMETimer_RemoverefTIMER_FLAG_NO_MAPCHANGE);

        
    int idx g_TimersArray.Push(hTimer);
        
    g_TimersArray.Set(idxrefblock_entref);
    }

    public 
    Action Timer_Remove(Handle timerany ref)
    {
        
    int ent EntRefToEntIndex(ref);
        if(
    ent != INVALID_ENT_REFERENCE && IsValidEntity(ent))
            
    AcceptEntityInput(ent"Kill");
     
        
    int idx g_TimersArray.FindValue(timer);
        if(
    idx != -1)
            
    g_TimersArray.Erase(idx);
     
        return 
    Plugin_Stop;
    }
    Смысл в том, что тебе не требуется массив на 2к, слишком жирно такое объявлять. Делай минимум, следи за таймерами.
     
    Последнее редактирование: 2 май 2016