Проблема с командой
#1

Всем доброго времени суток! Сразу перейду к теме, принимаю игрока в организацию как лидер - отправляю приглошение он жмёт "Да" и 0 реакции.


PHP код:
CMD:invite(playerid, params[])
{
    if(
IsAbleToInvite(playerid) || (PI[playerid][pMember] > 0 && strcmp(GetName(playerid),FracInfo[PI[playerid][pMember]][fAssistant],true) == 0))
    {
        new 
targetid;
        if(
sscanf(params, "u", targetid)) return SendClientMessage(playerid, COLOR_WHITE, "Введите: /invite [id игрока]");
        else if(!
IsPlayerConnected(targetid)) return SendClientMessage(playerid, COLOR_GREY, PlayerIsNotOnline);
        else if(
PlayerLogged[targetid] == false) return SendClientMessage(playerid, COLOR_GREY, PlayerIsNotAuthorized);
        else if(
PI[targetid][pLeader] > 0) return SendClientMessage(playerid, COLOR_GREY, "Игрок лидер другой организации!");
        else if(
PI[targetid][pMember] > 0) return SendClientMessage(playerid, COLOR_GREY, "Игрок находиться в другой организации!");
        else if(
PI[targetid][pWarn] > 0) return SendClientMessage(playerid, COLOR_GREY, "У игрока предупреждение!");
        else if(
IsPlayerInAnyVehicle(targetid)) return SendClientMessage(playerid, COLOR_GREY, "Игрок не должен находиться в транспорте!");
        else if(!
IsPlayerInRangeOfPlayer(8.0, playerid, targetid)) return SendClientMessage(playerid, COLOR_GREY, "Игрок слишком далеко!");
        
SendMes(playerid,COLOR_BLUE,"Вы предложили %s присоединиться в вашу организацию",GetName(targetid));
        new 
string[128];
        
format(string,sizeof(string),"%s %s предлагает вам присоединиться к \"%s\"\n\nВы согласны?",FracRank[PI[playerid][pMember]][PI[playerid][pRank]], GetName(playerid), FracInfo[PI[playerid][pMember]][fName]);
        
ShowPlayerDialog(targetid, D_INVITEFRAC, 0, "{FFCC00}Вступление во фракцию",string,"Да","Нет");
        
SetPVarInt(playerid, "actplayerid", targetid);
    }
    else 
SendClientMessage(playerid, COLOR_GREY, YouCanNot);
    return 
1;
} 
Сам кейс
PHP код:
    case D_INVITEFRAC:
        {
            if(!
response) return 1;
            new 
actplayerid = GetPVarInt(playerid, "actplayerid");
            new 
memberid = PI[playerid][pMember];
            new 
mes[128];
            for(new 
i; i < 8; i++)
            {
                new 
skinid = gFractionSkin[memberid-1][i];
                if(!
skinid) break;
                if(!
i) format(mes, sizeof(mes), "Скин %d [%d]", i+1, skinid);
                else 
format(mes, sizeof(mes), "%s\nСкин %d [%d]", mes, i+1, skinid);
            }
            
SendClientMessage(actplayerid, COLOR_BLUE, "Ждите, пока лидер выберет одежду для Вас");
            
ShowPlayerDialog(playerid, D_INVITESKIN, 2, "{FFCC00}Выбор скина", mes, "Принять", "");
        } 
Crashdetect:
PHP код:
[06:25:29] [debug] Run time error 4: "Array index out of bounds"
[06:25:29] [debug]  Accessing element at negative index -1
[06:25:29] [debug] AMX backtrace:
[
06:25:29] [debug] #0 00070508 in public OnDialogResponse (1, 18, 1, -1, 4569720) from new.amx 
Reply
#2

По хорошему стоит писать исходные данные: какие ид у игроков были и какие значения переменных были до этого события, последнее узнаётся через принты.

А вообще вот это смущает (индекс =-1, если memberid минимальный - 0)
Код:
new skinid = gFractionSkin[memberid-1][i];
Reply
#3

Quote:
Originally Posted by Mutha_X
Посмотреть сообщение
По хорошему стоит писать исходные данные: какие ид у игроков были и какие значения переменных были до этого события, последнее узнаётся через принты.

А вообще вот это смущает (индекс =-1, если memberid минимальный - 0)
Код:
new skinid = gFractionSkin[memberid-1][i];
На любой ID игрока, не работает.
Reply
#4

Quote:
Originally Posted by Surprice
Посмотреть сообщение
На любой ID игрока, не работает.
Выход за пределы массива. Тут:
PHP код:
new gFractionSkin 
Reply
#5

Quote:
Originally Posted by Mcc
Посмотреть сообщение
Выход за пределы массива. Тут:
PHP код:
new gFractionSkin 
а поконкретней как фиксануть?
PHP код:
new gFractionSkin[MAX_FRACTION-1][8] = {
    {
17,59,187,164,165,141,240,150}, // Мэрия LS
    
{280,284,282,283,266,285,265,211}, // LSPD
    
{280,284,282,283,266,285,265,211}, // SFPD
    
{163,164,165,166,211,295,285,286}, // FBI
    
{274,275,276,70,148,150,71,295}, // Больница LS
    
{11,189,171,172,0,0,0,0}, // Автошкола
    
{105,106,107,195,269,270,271,0}, // Grove Street
    
{102,103,104,195,0,0,0,0}, // The Ballas
    
{173,174,175,226,273,0,0,0}, // The Rifa
    
{193,114,115,116,292,0,0,0}, // Varios Los Aztecas
    
{108,109,110,56,0,0,0,0}, // Los Santos Vagos
    
{287,191,61,255,295,0,0,0}, // Национальная гвардия
    
{189,0,0,0,0,0,0,0}, // Казино Caligula
    
{189,0,0,0,0,0,0,0}, // Казино Red Dragon
    
{223,124,127,290,113,117,98,93}, // LCN
    
{117,118,120,122,123,294,169,263}, // Yakuza
    
{46,111,112,126,125,272,233,43}, // RM
    
{187,186,170,188,20,141,150,219}, // СМИ
    
{280,284,282,283,266,285,265,211} // LVPD
}; 
Reply
#6

Quote:
Originally Posted by Surprice
Посмотреть сообщение
а поконкретней как фиксануть?
PHP код:
new gFractionSkin[MAX_FRACTION-1][8] = {
    {
17,59,187,164,165,141,240,150}, // Мэрия LS
    
{280,284,282,283,266,285,265,211}, // LSPD
    
{280,284,282,283,266,285,265,211}, // SFPD
    
{163,164,165,166,211,295,285,286}, // FBI
    
{274,275,276,70,148,150,71,295}, // Больница LS
    
{11,189,171,172,0,0,0,0}, // Автошкола
    
{105,106,107,195,269,270,271,0}, // Grove Street
    
{102,103,104,195,0,0,0,0}, // The Ballas
    
{173,174,175,226,273,0,0,0}, // The Rifa
    
{193,114,115,116,292,0,0,0}, // Varios Los Aztecas
    
{108,109,110,56,0,0,0,0}, // Los Santos Vagos
    
{287,191,61,255,295,0,0,0}, // Национальная гвардия
    
{189,0,0,0,0,0,0,0}, // Казино Caligula
    
{189,0,0,0,0,0,0,0}, // Казино Red Dragon
    
{223,124,127,290,113,117,98,93}, // LCN
    
{117,118,120,122,123,294,169,263}, // Yakuza
    
{46,111,112,126,125,272,233,43}, // RM
    
{187,186,170,188,20,141,150,219}, // СМИ
    
{280,284,282,283,266,285,265,211} // LVPD
}; 
new gFractionSkin[MAX_FRACTION-1][8] = {
new skinid = gFractionSkin[memberid-1][i];

Сначала сдвиг при объявлении, затем в цикле. В итоге -2 = array index of bounds. Выбрать что то одно.
Reply
#7

Quote:
Originally Posted by Mutha_X
Посмотреть сообщение
По хорошему стоит писать исходные данные: ... и какие значения (ВСЕХ ИСПОЛЬЗУЕМЫХ) переменных были до этого события, последнее узнаётся через принты.
Quote:
Originally Posted by Surprice
Посмотреть сообщение
На любой ID игрока, не работает.
Тугодум, давай цифры.
Reply
#8

Строка:
PHP код:
new skinid = gFractionSkin[memberid-1][i]; 
Полный кейс:
PHP код:
    case D_INVITEFRAC:
        {
            if(!
response) return 1;
            new 
actplayerid = GetPVarInt(playerid, "actplayerid");
            new 
memberid = PI[playerid][pMember];
            new 
mes[128];
            for(new 
i; i < 8; i++)
            {
                new 
skinid = gFractionSkin[memberid-1][i];
                if(!
skinid) break;
                if(!
i) format(mes, sizeof(mes), "Скин %d [%d]", i+1, skinid);
                else 
format(mes, sizeof(mes), "%s\nСкин %d [%d]", mes, i+1, skinid);
            }
            
SendClientMessage(actplayerid, COLOR_BLUE, "Ждите, пока лидер выберет одежду для Вас");
            
ShowPlayerDialog(playerid, D_INVITESKIN, 2, "{FFCC00}Выбор скина", mes, "Принять", "");
        } 
Crashdetect:
PHP код:
[13:11:12] [debug] Run time error 4: "Array index out of bounds"
[13:11:12] [debug]  Accessing element at negative index -1
[13:11:12] [debug] AMX backtrace:
[
13:11:12] [debug] #0 0008cd9c in public OnDialogResponse (playerid=1, dialogid=18, response=1, listitem=-1, inputtext[]=@0058b22c "") at E:\Сервер\gamemodes\new.pwn:9936 
Reply
#9

Quote:
Originally Posted by Surprice
Посмотреть сообщение
PHP код:
#define MAX_FRACTION (20), должно быть 19. 
Пожалуйста.
Quote:
Originally Posted by Mcc
Посмотреть сообщение
Отсюда убрать единичку с минусом.
Reply


Forum Jump:


Users browsing this thread: 2 Guest(s)