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

inklesspen

Не пишу модули под LSD :с
Сообщения
1,775
Реакции
967
Я никогда небыл силен в таймерах sourcemod, поэтому прошу вас помочь.

код
C-подобный:
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
}

Ошибки:
C-подобный:
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()
 

gibs

Фитиль народного волненья
Сообщения
722
Реакции
407
Мошенник
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_RoundStart, EventHookMode_PostNoCopy);
}

public void OnClientPostAdminCheck(int client)
{
    SDKHook(client, SDKHook_WeaponEquipPost, Hook_WeaponEquipPost);
    SDKHook(client, SDKHook_WeaponDropPost, Hook_WeaponDropPost);
}

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

public Action Hook_WeaponEquipPost(int client, int weapon)
{
    int ref = EntIndexToEntRef(weapon);
    Handle hTimer = CreateTimer(REMOVE_TIME, Timer_Remove, ref);
  
    int idx = g_TimersArray.Push(hTimer);
    g_TimersArray.Set(idx, ref, block_entref);
}

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

public Action Timer_Remove(Handle timer, any 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;
}
А вот это уже приятная редкость для этого форума. Человек действительно пытается что-то сделать самостоятельно.
 
Последнее редактирование:

inklesspen

Не пишу модули под LSD :с
Сообщения
1,775
Реакции
967
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_RoundStart, EventHookMode_PostNoCopy);
}

public void OnClientPostAdminCheck(int client)
{
    SDKHook(client, SDKHook_WeaponEquipPost, Hook_WeaponEquipPost);
    SDKHook(client, SDKHook_WeaponDropPost, Hook_WeaponDropPost);
}

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

public Action Hook_WeaponEquipPost(int client, int weapon)
{
    int ref = EntIndexToEntRef(weapon);
    Handle hTimer = CreateTimer(REMOVE_TIME, Timer_Remove, ref);
  
    int idx = g_TimersArray.Push(hTimer);
    g_TimersArray.Set(idx, ref, block_entref);
}

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

public Action Timer_Remove(Handle timer, any 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;
}
А вот это уже приятная редкость для этого форума. Человек действительно пытается что-то сделать самостоятельно.

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

gibs

Фитиль народного волненья
Сообщения
722
Реакции
407
Мошенник
@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_RoundStart, EventHookMode_PostNoCopy);
}

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

public void OnClientPostAdminCheck(int client)
{
    SDKHook(client, SDKHook_WeaponEquipPost, Hook_WeaponEquipPost);
    SDKHook(client, SDKHook_WeaponDropPost, Hook_WeaponDropPost);
}

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

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

public Action Hook_WeaponDropPost(int client, int weapon)
{
    int ref = EntIndexToEntRef(weapon);
    Handle hTimer = CreateTimer(REMOVE_TIME, Timer_Remove, ref, TIMER_FLAG_NO_MAPCHANGE);

    int idx = g_TimersArray.Push(hTimer);
    g_TimersArray.Set(idx, ref, block_entref);
}

public Action Timer_Remove(Handle timer, any 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к, слишком жирно такое объявлять. Делай минимум, следи за таймерами.
 
Последнее редактирование:
Сверху Снизу