Помощь ошибка.sma

nevzorov77

Участник
Сообщения
61
Симпатии
4
Баллы
11
#1
Здравствуйте , помогите решить проблему. Ошибка в консоле.

[AMXX] Displaying debug trace (plugin "INFO.amxx", version "1.0") [AMXX] Run time error 4: index out of bounds [AMXX] [0] 01aa17fc4fb876198884836a710513e4.sma::BlockVoice (line 87) [AMXX] Displaying debug trace (plugin "INFO.amxx", version "1.0") [AMXX] Run time error 4: index out of bounds



Исходник плагина.


Код:
#include <amxmodx>
#include <fakemeta>
#include <dhudmessage>
#include <reapi>

#define VIP_ACCESS ADMIN_BAN

#define TIME_FOR_INFO 10.0 // Время после смерти, через которое живые не услышат игрока

#if !defined MAX_PLAYERS
    #define MAX_PLAYERS 32
#endif

#define is_user_vip(%0) (get_user_flags(%0) & VIP_ACCESS)

new bool:g_bBlockVoice[MAX_PLAYERS + 1];
new g_iUserAlive[MAX_PLAYERS + 1];

public plugin_init()
{
    register_plugin("Time for info", "1.0", "neugomon /// eL");
    
    RegisterHookChain(RG_CBasePlayer_Spawn, "fwdPlayerSpawnPost", true);
    RegisterHookChain(RG_CBasePlayer_Killed, "fwdPlayerKilledPost", true);
    
    register_forward(FM_Voice_SetClientListening, "FwdSetClientListening", false);
}

public client_putinserver(id)
{
    if(is_user_vip(id))
    {
        g_iUserAlive[id] = false;
        g_bBlockVoice[id] = false;
    }
    else
    {
        g_iUserAlive[id] = false;
        g_bBlockVoice[id] = true;       
    }
}   

public fwdPlayerSpawnPost(id)
{
    if(is_user_vip(id)) return;
    
    g_iUserAlive[id] = is_user_alive(id);
    if(g_iUserAlive[id])
        g_bBlockVoice[id] = false;
}

public fwdPlayerKilledPost(const id)
{
        if(is_user_vip(id)) return;
        
        g_iUserAlive[id] = false;
        g_bBlockVoice[id] = false;
        
        g_iUserAlive[id] = 0;
        set_hudmessage(70, 150, 0, -1.0, 0.3, 1, 3.0, 3.0, TIME_FOR_INFO);
        show_hudmessage(id, "У вас 10 секунд чтобы дать информацию игрокам.");
        set_task(TIME_FOR_INFO, "BlockVoice", id+32137);
}

public FwdSetClientListening(iReciever, iSender)
{
    if(iSender != iReciever && g_bBlockVoice[iSender] && g_iUserAlive[iReciever])
    {   
        engfunc(EngFunc_SetClientListening, iReciever, iSender, false);
        forward_return(FMV_CELL, false);
        return FMRES_SUPERCEDE;
    }
    return FMRES_IGNORED;
}

public BlockVoice(id)
{
id-=32173;
    if(!g_iUserAlive[id])
    {
        g_bBlockVoice[id] = true;
        set_hudmessage(255, 100, 0, -1.0, 0.25, 1, 8.0, 8.0, 0.1, 0.5, 4);
        show_hudmessage(id, "Живые товарищи по команде^n больше не слышат вас.");
    }   
}
 

g3cKpunTop

Скриптер
Сообщения
91
Симпатии
20
Баллы
69
#4
C++:
set_task(TIME_FOR_INFO, "BlockVoice", id+32137);

//заменить на

if(task_exists(id+32137))
    remove_task(id+32137);
set_task(TIME_FOR_INFO, "BlockVoice", id+32137);
И отредактировать функцию на:


C++:
public BlockVoice(id)
{
    id-=32173;
    if( id && id < 33 && !g_iUserAlive[id])
    {
        g_bBlockVoice[id] = true;
        set_hudmessage(255, 100, 0, -1.0, 0.25, 1, 8.0, 8.0, 0.1, 0.5, 4);
        show_hudmessage(id, "Живые товарищи по команде^n больше не слышат вас.");
    }   
}
 

nevzorov77

Участник
Сообщения
61
Симпатии
4
Баллы
11
#5
C++:
set_task(TIME_FOR_INFO, "BlockVoice", id+32137);

//заменить на

if(task_exists(id+32137))
    remove_task(id+32137);
set_task(TIME_FOR_INFO, "BlockVoice", id+32137);
И отредактировать функцию на:


C++:
public BlockVoice(id)
{
    id-=32173;
    if( id && id < 33 && !g_iUserAlive[id])
    {
        g_bBlockVoice[id] = true;
        set_hudmessage(255, 100, 0, -1.0, 0.25, 1, 8.0, 8.0, 0.1, 0.5, 4);
        show_hudmessage(id, "Живые товарищи по команде^n больше не слышат вас.");
    }  
}
Сделал и появилась новая ошибка.


Код:
#include <amxmodx>
#include <fakemeta>
#include <dhudmessage>
#include <reapi>

#define VIP_ACCESS ADMIN_BAN

#define TIME_FOR_INFO 10.0 // Время после смерти, через которое живые не услышат игрока

#if !defined MAX_PLAYERS
    #define MAX_PLAYERS 32
#endif

#define is_user_vip(%0) (get_user_flags(%0) & VIP_ACCESS)

new bool:g_bBlockVoice[MAX_PLAYERS + 1];
new g_iUserAlive[MAX_PLAYERS + 1];

public plugin_init()
{
    register_plugin("Time for info", "1.0", "neugomon /// eL");
    
    RegisterHookChain(RG_CBasePlayer_Spawn, "fwdPlayerSpawnPost", true);
    RegisterHookChain(RG_CBasePlayer_Killed, "fwdPlayerKilledPost", true);
    
    register_forward(FM_Voice_SetClientListening, "FwdSetClientListening", false);
}

public client_putinserver(id)
{
    if(is_user_vip(id))
    {
        g_iUserAlive[id] = false;
        g_bBlockVoice[id] = false;
    }
    else
    {
        g_iUserAlive[id] = false;
        g_bBlockVoice[id] = true;       
    }
}   

public fwdPlayerSpawnPost(id)
{
    if(is_user_vip(id)) return;
    
    g_iUserAlive[id] = is_user_alive(id);
    if(g_iUserAlive[id])
        g_bBlockVoice[id] = false;
}

public fwdPlayerKilledPost(const id)
{
        if(is_user_vip(id)) return;
        
        g_iUserAlive[id] = false;
        g_bBlockVoice[id] = false;
        
        g_iUserAlive[id] = 0;
        set_hudmessage(70, 150, 0, -1.0, 0.25, 1, 3.0, 3.0, TIME_FOR_INFO);
        show_hudmessage(id, "У вас 10 секунд чтобы дать информацию игрокам.");
        if(task_exists(id+32137))
    remove_task(id+32137);
set_task(TIME_FOR_INFO, "BlockVoice", id+32137);
}

public FwdSetClientListening(iReciever, iSender)
{
    if(iSender != iReciever && g_bBlockVoice[iSender] && g_iUserAlive[iReciever])
    {   
        engfunc(EngFunc_SetClientListening, iReciever, iSender, false);
        forward_return(FMV_CELL, false);
        return FMRES_SUPERCEDE;
    }
    return FMRES_IGNORED;
}

public BlockVoice(id)
{
    id-=32173;
    if( id && id < 33 && !g_iUserAlive[id])
    {
        g_bBlockVoice[id] = true;
        set_hudmessage(255, 100, 0, -1.0, 0.25, 1, 8.0, 8.0, 0.1, 0.5, 4);
        show_hudmessage(id, "Живые товарищи по команде^n больше не слышат вас.");
    }   
}
ОШИБКА
[AMXX] Displaying debug trace (plugin "INFO.amxx", version "1.0")
[AMXX] Run time error 4: index out of bounds
[AMXX] [0] 01aa17fc4fb876198884836a710513e4.sma::BlockVoice (line 89)
[AMXX] Displaying debug trace (plugin "INFO.amxx", version "1.0")
[AMXX] Run time error 4: index out of bounds
[AMXX] [0] 01aa17fc4fb876198884836a710513e4.sma::BlockVoice (line 89)
*DEAD* A.B.O.E. : kbpf nfr xnj
[AMXX] Displaying debug trace (plugin "INFO.amxx", version "1.0")
[AMXX] Run time error 4: index out of bounds
[AMXX] [0] 01aa17fc4fb876198884836a710513e4.sma::BlockVoice (line 89)
 

lddnsk

Администратор
Сообщения
189
Симпатии
53
Баллы
104
#6
Сделал и появилась новая ошибка.
Все та же.

И отредактировать функцию на:
Ну а если убрать эту математическую формулу по прибавлению-отниманию? Че она дает вообще кроме раздувания размера битов в оперативке?
 

g3cKpunTop

Скриптер
Сообщения
91
Симпатии
20
Баллы
69
#7
Все та же.


Ну а если убрать эту математическую формулу по прибавлению-отниманию? Че она дает вообще кроме раздувания размера битов в оперативке?
Кстати да, правильно мыслишь. Там можно просто id написать, без + и -=. Это нужно чтобы задачи не смешивались и имели уникальный индекс (используется такая система, если больше двух задач в плагине)

Ну, по факту проблему плагина она решить не должна.
 

g3cKpunTop

Скриптер
Сообщения
91
Симпатии
20
Баллы
69
#8
Попробуй этот вариант:
Код:
#include <amxmodx>
#include <fakemeta>
#include <dhudmessage>
#include <reapi>

#define VIP_ACCESS ADMIN_BAN

#define TIME_FOR_INFO 10.0 // Время после смерти, через которое живые не услышат игрока

#if !defined MAX_PLAYERS
    #define MAX_PLAYERS 32
#endif

#define is_user_vip(%0) (get_user_flags(%0) & VIP_ACCESS)

new g_iBitUserVoice;

public plugin_init()
{
    register_plugin("Time for info", "1.0", "neugomon /// eL");
    
    RegisterHookChain(RG_CBasePlayer_Spawn, "fwdPlayerSpawnPost", true);
    RegisterHookChain(RG_CBasePlayer_Killed, "fwdPlayerKilledPost", true);
    
    register_forward(FM_Voice_SetClientListening, "FwdSetClientListening", false);
}

public client_putinserver(id)
{
    if(is_user_vip(id))
        g_iBitUserVoice &= ~(1<<id);
    else
        g_iBitUserVoice |= (1<<id);     
}   

public fwdPlayerSpawnPost(id)
{
    if(is_user_vip(id)) return;

    if(is_user_alive(id))
        g_iBitUserVoice &= ~(1<<id);
}

public fwdPlayerKilledPost(id)
{
    if(is_user_vip(id)) return;
    g_iBitUserVoice &= ~(1<<id);
    set_hudmessage(70, 150, 0, -1.0, 0.25, 1, 3.0, 3.0, TIME_FOR_INFO);
    show_hudmessage(id, "У вас 10 секунд чтобы дать информацию игрокам.");
    if(task_exists(id)) remove_task(id);
    set_task(TIME_FOR_INFO, "BlockVoice", id);
}

public FwdSetClientListening(iReciever, iSender)
{
    if(iSender != iReciever && (g_iBitUserVoice & (1<<iSender)) && is_user_alive(iReciever))
    {   
        engfunc(EngFunc_SetClientListening, iReciever, iSender, false);
        forward_return(FMV_CELL, false);
        return FMRES_SUPERCEDE;
    }
    return FMRES_IGNORED;
}

public BlockVoice(id)
{
    if( id && id < 33 && !is_user_alive(id)) {
        g_iBitUserVoice |= (1<<id);
        set_hudmessage(255, 100, 0, -1.0, 0.25, 1, 8.0, 8.0, 0.1, 0.5, 4);
        show_hudmessage(id, "Живые товарищи по команде^n больше не слышат вас.");
    }   
}
 

nevzorov77

Участник
Сообщения
61
Симпатии
4
Баллы
11
#9
Попробуй этот вариант:
Код:
#include <amxmodx>
#include <fakemeta>
#include <dhudmessage>
#include <reapi>

#define VIP_ACCESS ADMIN_BAN

#define TIME_FOR_INFO 10.0 // Время после смерти, через которое живые не услышат игрока

#if !defined MAX_PLAYERS
    #define MAX_PLAYERS 32
#endif

#define is_user_vip(%0) (get_user_flags(%0) & VIP_ACCESS)

new g_iBitUserVoice;

public plugin_init()
{
    register_plugin("Time for info", "1.0", "neugomon /// eL");
   
    RegisterHookChain(RG_CBasePlayer_Spawn, "fwdPlayerSpawnPost", true);
    RegisterHookChain(RG_CBasePlayer_Killed, "fwdPlayerKilledPost", true);
   
    register_forward(FM_Voice_SetClientListening, "FwdSetClientListening", false);
}

public client_putinserver(id)
{
    if(is_user_vip(id))
        g_iBitUserVoice &= ~(1<<id);
    else
        g_iBitUserVoice |= (1<<id);    
}  

public fwdPlayerSpawnPost(id)
{
    if(is_user_vip(id)) return;

    if(is_user_alive(id))
        g_iBitUserVoice &= ~(1<<id);
}

public fwdPlayerKilledPost(id)
{
    if(is_user_vip(id)) return;
    g_iBitUserVoice &= ~(1<<id);
    set_hudmessage(70, 150, 0, -1.0, 0.25, 1, 3.0, 3.0, TIME_FOR_INFO);
    show_hudmessage(id, "У вас 10 секунд чтобы дать информацию игрокам.");
    if(task_exists(id)) remove_task(id);
    set_task(TIME_FOR_INFO, "BlockVoice", id);
}

public FwdSetClientListening(iReciever, iSender)
{
    if(iSender != iReciever && (g_iBitUserVoice & (1<<iSender)) && is_user_alive(iReciever))
    {  
        engfunc(EngFunc_SetClientListening, iReciever, iSender, false);
        forward_return(FMV_CELL, false);
        return FMRES_SUPERCEDE;
    }
    return FMRES_IGNORED;
}

public BlockVoice(id)
{
    if( id && id < 33 && !is_user_alive(id)) {
        g_iBitUserVoice |= (1<<id);
        set_hudmessage(255, 100, 0, -1.0, 0.25, 1, 8.0, 8.0, 0.1, 0.5, 4);
        show_hudmessage(id, "Живые товарищи по команде^n больше не слышат вас.");
    }  
}
Спасибо за помощь , но я уже решил проблему.
 

lddnsk

Администратор
Сообщения
189
Симпатии
53
Баллы
104
#10
Кстати да, правильно мыслишь. Там можно просто id написать, без + и -=. Это нужно чтобы задачи не смешивались и имели уникальный индекс (используется такая система, если больше двух задач в плагине)

Ну, по факту проблему плагина она решить не должна.
Кто знает, кто знает...
 
Сверху