Русское сообщество по скриптингу

Краш сервера при смерти об землю. Плагин JBR_Quests  [Решено]

Все вопросы по скриптингу для AMXX, помощь в редактировании плагинов.

Модераторы: Subb98, liFe iS GoOD

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только скриптинга для AMX Mod X.

Правила при создании новой темы:
1. При вставке кода плагина необходимо использовать тег [code=php].
2. Любые изображения должны быть загружены, как вложения к вашему сообщению.
3. При описании проблемы или запросе на помощь в редактировании плагина обязательно выкладывайте исходник sma плагина.

Краш сервера при смерти об землю. Плагин JBR_Quests

Сообщение Marsh » 05 июл 2019, 15:38

Установил плагин на квесты (JBR_Quests) для сервера, мод: jail.
При отключении этого плагина все исправно работает, но когда он включен при смерти об землю крашит сервер. Помогите пофиксить пожалуйста.
Вы должны зарегистрироваться, чтобы видеть ссылки.
Код: Выделить всё
#include <amxmodx>
#include <fakemeta>    
#include <engine>
#include <cstrike>
#include <fun>
#include <hamsandwich>

#define VERSION     "1.0"

#if AMXX_VERSION_NUM < 183
    const MAX_PLAYERS                     = 32;
    
    
#include < dhudmessage >
    #define client_disconnected client_disconnect
#endif



native jbe_set_user_money( id, iNum, iFlash );
native jbe_get_user_money( id );
native jbe_get_user_team( id );
native jbe_is_user_chief( id );



const TASK_SHOWHUD = 40000;
const QUEST_NONE = 666;     // # Индекс квеста при котором не будет проверок.
const MAX_QUEST = 16;        // # Максимальное кол-во квестов.
const CASE_PER_PAGE = 8;

enum _:DATA_QUEST 
{
    QUEST_NAME[ 32 ],
    QUEST_DESCRIPT[ 128 ],
    QUEST_NUM[ 8 ],
    QUEST_TYPE[ 2 ],
    QUEST_PRIZE
};

enum _:DATA_USER 
{
    u_Select, 
    u_Progress
,
    bool:u_Solved[ MAX_QUEST ]
};

enum 
{
    Quest_Kill, 
    Quest_KillCT
, 
    Quest_KillAdmin
, 
    Quest_KillSimon
, 
    Quest_Spawn
, 
    Quest_NoDead
};

new Array:g_aQuests, g_iQuestSize, aDataQuest[ DATA_QUEST ], g_iMaxPlayers, g_iSyncHudQuest, g_iMenuPosition[ MAX_PLAYERS + 1 ];
new g_aUser[ MAX_PLAYERS + 1 ][ DATA_USER ];

new const g_szFile[] = "jbr_mode/Files_Ini/quest.ini";



public plugin_init()
{
    register_plugin( "JailBreak RED | Quest" , VERSION, "Oldwarx(Ragamafona)" );
    
    register_clcmd
( "say /quest", "Cmd_QuestMenu" );
    
    
#if defined RAGA_TEST_MODE
    register_clcmd( "say /qt", "test" );
    #endif
    
    RegisterHam
( Ham_Spawn, "player", "Ham_PlayerSpawn_Post", true );
    RegisterHam( Ham_Killed, "player", "Ham_PlayerKilled_Post", true );
    
    register_logevent
( "Event_RoundStart", 2, "1=Round_Start" );
    
    g_iSyncHudQuest 
= CreateHudSyncObj();
    g_iMaxPlayers = get_maxplayers();
    
    register_menucmd
( register_menuid( "Open_QuestMenu" ), 1023, "Close_QuestMenu" );
    LOADING_INI();
}

#if defined RAGA_TEST_MODE
public test( id )
{
    ArrayGetArray( g_aQuests, g_aUser[ id ][ u_Select ], aDataQuest );
    UTIL_SayText( id, "Номер задания: %d", g_aUser[ id ][ u_Select ] );
    UTIL_SayText( id, "Прогресс: %d", g_aUser[ id ][ u_Progress ] );
    UTIL_SayText( id, "Приз: %d", aDataQuest[ QUEST_NUM ] );
    UTIL_SayText( id, "Тип: %d", aDataQuest[ QUEST_TYPE ] );
}
#endif

public plugin_natives() register_native( "Open_QuestMenu", "Cmd_QuestMenu", true );

LOADING_INI() {
    new szCfgDir[64], szCfgFile[128];
    get_localinfo( "amxx_configsdir", szCfgDir, charsmax( szCfgDir ) );

    formatex( szCfgFile, charsmax( szCfgFile ), "%s/%s", szCfgDir, g_szFile );
    if( !file_exists( szCfgFile ) )
    {
        write_file( szCfgFile, "; Файл добавления квестов" );
        write_file( szCfgFile, "; ^"Название^" ^"Описание^" ^"Кол-во для награды^" ^"Тип^" ^"Награда $^"" );
        write_file( szCfgFile, "; Типы:" );
        write_file( szCfgFile, "; 1 - Убийство игрока" );
        write_file( szCfgFile, "; 2 - Убийство охраны" );
        write_file( szCfgFile, "; 3 - Убийство админа" );
        write_file( szCfgFile, "; 4 - Убийство начальника" );
        write_file( szCfgFile, "; 5 - Определённое кол-во раз возродиться" );
        write_file( szCfgFile, "; 6 - Прожить кол-во раундов не умерая" );
        write_file( szCfgFile, "" );
        write_file( szCfgFile, "^"Убийца^" ^"Повысь свой авторитет на зоне убив 5 игроков.^" ^"5^" ^"1^" ^"1000^"" );
        write_file( szCfgFile, "^"Февраль^" ^"Пора унизить лохов, убей 10 охранников.^" ^"10^" ^"2^" ^"5000^"" );
        write_file( szCfgFile, "^"Нет Админов!^" ^"Ненавижу этих донатеров, убей 2-вух админов.^" ^"2^" ^"3^" ^"10000^"" );
        write_file( szCfgFile, "^"Я Царь^" ^"Начальник проявил хамство к вам, убей 3 начальника.^" ^"3^" ^"4^" ^"9000^"" );
        write_file( szCfgFile, "^"Основа^" ^"Вы новенький на зоне, выйди в поле 15 раз.^" ^"15^" ^"5^" ^"30000^"" );
        write_file( szCfgFile, "^"Дом^" ^"Зона теперь ваше всё, прожить 10 дней не умерая.^" ^"10^" ^"6^" ^"10000^"" );
    }
    new aDataQuestRead[ DATA_QUEST ], szBuffer[ 256 ], iLine, iLen;
    static szPrize[ 8 ], szType[ 2 ], szNeed[ 8 ];
    g_aQuests = ArrayCreate( DATA_QUEST );
    while(read_file( szCfgFile, iLine++, szBuffer, charsmax( szBuffer ), iLen) )
    {
        if( !iLen || szBuffer[ 0 ] == ';' ) 
            continue
;
        
        parse
        
(
            szBuffer, 
            aDataQuestRead
[ QUEST_NAME ],         charsmax( aDataQuestRead[ QUEST_NAME ] ), 
            aDataQuestRead
[ QUEST_DESCRIPT ],     charsmax( aDataQuestRead[ QUEST_DESCRIPT ] ),
            szNeed,                                charsmax( szNeed ),
            szType,                                charsmax( szType ),
            szPrize,                            charsmax( szPrize )
        );
        aDataQuestRead[ QUEST_NUM ]    = str_to_num( szNeed );
        aDataQuestRead[ QUEST_TYPE ]    = str_to_num( szType );
        aDataQuestRead[ QUEST_PRIZE ] = str_to_num( szPrize );
        ArrayPushArray( g_aQuests, aDataQuestRead );
    }
    g_iQuestSize = ArraySize( g_aQuests );
}

public Cmd_QuestMenu( id ) return Open_QuestMenu( id, g_iMenuPosition[ id ] = 0 );
Open_QuestMenu( id, iPos )
{
    if( iPos < 0 ) return PLUGIN_HANDLED;
    
    new iStart 
= iPos * CASE_PER_PAGE;
    if( iStart > g_iQuestSize ) iStart = g_iQuestSize;
    iStart = iStart - ( iStart % CASE_PER_PAGE );
    g_iMenuPosition[ id ] = iStart / CASE_PER_PAGE;
    new iEnd = iStart + CASE_PER_PAGE;
    if(iEnd > g_iQuestSize) iEnd = g_iQuestSize;
    static szMenu[ 512 ]; new iLen, iPagesNum = ( g_iQuestSize / CASE_PER_PAGE + ( ( g_iQuestSize % CASE_PER_PAGE ) ? 1 : 0) );
    new iBitKeys = (1<<9), b;
    iLen = formatex( szMenu, charsmax( szMenu ), "\rМеню Задания \w[%d|%d]^n^n", iPos + 1, iPagesNum );
    
    for
( new a = iStart ; a < iEnd ; a++ )
    {
        ArrayGetArray( g_aQuests, a, aDataQuest );

        if( g_aUser[ id ][ u_Solved ][ a ] == false )
        {
            iBitKeys |= (1<<b);
            iLen += formatex( szMenu[ iLen ], charsmax( szMenu ) - iLen, "\y[%d] \w%s^n", ++b, aDataQuest[ QUEST_NAME ] );
        }
        else iLen += formatex( szMenu[ iLen ], charsmax( szMenu ) - iLen, "\y[=] \d%s \r[OK]^n", aDataQuest[ QUEST_NAME ] ), ++b;
    }
    for( new i = b ; i < CASE_PER_PAGE ; i++ ) iLen += formatex( szMenu[ iLen ], charsmax( szMenu ) - iLen, "^n" );

    if( iEnd < g_iQuestSize ) 
    
{
        iBitKeys |= (1<<8);
        formatex( szMenu[ iLen ], charsmax( szMenu ) - iLen, "^n\y[9] \wДальше^n\r[0] \w%s", iPos ? "Назад" : "Выход" );
    }
    else formatex( szMenu[ iLen ], charsmax( szMenu ) - iLen, "^n^n\y[0] \w%s", iPos ? "Назад" : "Выход" );
    
    return show_menu
( id, iBitKeys, szMenu, -1, "Open_QuestMenu" );
}

public Close_QuestMenu( id, iKey )
{
    switch( iKey )
    {
        case 8: return Open_QuestMenu( id, ++g_iMenuPosition[ id ] );
        case 9: return Open_QuestMenu( id, --g_iMenuPosition[ id ] );
        default:
        {
            new iSelect = g_iMenuPosition[ id ] * CASE_PER_PAGE + iKey;
            ArrayGetArray( g_aQuests, iSelect, aDataQuest );
            
            
// Оформление квеста
            g_aUser[ id ][ u_Select ] = iSelect;
            g_aUser[ id ][ u_Progress ] = 0;
            set_task( 3.0, "Show_QuestHud", id+TASK_SHOWHUD, _, _, "b" );
        }
    }
    return PLUGIN_HANDLED;
}
 

public Show_QuestHud
( pPlayer )
{
    pPlayer -= TASK_SHOWHUD;
    ArrayGetArray( g_aQuests, g_aUser[ pPlayer ][ u_Select ], aDataQuest );
    
    set_hudmessage
( 0, 50, 200, 0.01, 0.20, 0, 0.0, 2.9, 0.0, 0.0, -);
    ShowSyncHudMsg( pPlayer, g_iSyncHudQuest, "Задание: %s^n%s^n^nВыполнено: %d из %d^nНаграда: %d$", aDataQuest[ QUEST_NAME ], aDataQuest[ QUEST_DESCRIPT ], g_aUser[ pPlayer ][ u_Progress ], aDataQuest[ QUEST_NUM ], aDataQuest[ QUEST_PRIZE ] );
}

public Ham_PlayerKilled_Post( iVictim, iKiller ) 
{
    if( g_aUser[ iKiller ][ u_Select ] == QUEST_NONE ) 
        return HAM_IGNORED
;
    
    if
( !is_user_connected( iVictim ) || iVictim == iKiller )
        return HAM_IGNORED;
    
    switch
( g_aUser[ iKiller ][ u_Select ] ) 
    
{
        case Quest_Kill: g_aUser[ iKiller ][ u_Progress ]++;
        case Quest_KillCT: if( jbe_get_user_team( iVictim ) == 2) g_aUser[ iKiller ][ u_Progress ]++;
        case Quest_KillAdmin: if( get_user_flags( iVictim ) & ADMIN_BAN) g_aUser[ iKiller ][ u_Progress ]++;
        case Quest_KillSimon: if( jbe_is_user_chief( iVictim ) ) g_aUser[ iKiller ][ u_Progress ]++;
    }
    
    if
( g_aUser[ iVictim ][ u_Select ] == Quest_NoDead ) g_aUser[ iVictim ][ u_Progress ] = 0;
        
    jbr_check_quest
( iKiller );
    return HAM_IGNORED;
}

public Ham_PlayerSpawn_Post(id) 
{
    if( !is_user_alive( id ) ) 
        return HAM_IGNORED
;
        
    if
( g_aUser[ id ][ u_Select ] == QUEST_NONE ) 
        return HAM_IGNORED
;
        
    if
( g_aUser[ id ][ u_Select ] == Quest_Spawn ) 
    
{
        g_aUser[ id ][ u_Progress ]++;
        jbr_check_quest( id );
    }
    return HAM_IGNORED;
}

public Event_RoundStart() 
{
    for( new id = 1 ; id < g_iMaxPlayers ; id++ ) 
    
{
        if( !is_user_connected( id ) || !is_user_alive( id ) ) 
            continue
;
        
        if
( g_aUser[ id ][ u_Select ] == Quest_NoDead ) 
        
{
            ++g_aUser[ id ][ u_Progress ];
            jbr_check_quest(id);
        }
    }
}

public jbr_check_quest(id) 
{
    ArrayGetArray( g_aQuests, g_aUser[ id ][ u_Select ], aDataQuest );
    
    if
(g_aUser[ id ][ u_Progress ] >= aDataQuest[ QUEST_NUM ]) 
    
{
        g_aUser[ id ][ u_Solved ][ g_aUser[ id ][ u_Select ] ] = true;
        g_aUser[ id ][ u_Select ] = 0;
        g_aUser[ id ][ u_Progress ] = 0;
        remove_task( id+TASK_SHOWHUD );
        
        UTIL_SayText
( id, "^x03· ^x04Задания ^x03| ^x04Вы выполнили задание: ^x03[%s]^x04. ^x04Награда: ^x03[%d$]^x04.", aDataQuest[ QUEST_NAME ], aDataQuest[ QUEST_PRIZE ] );
        jbe_set_user_money( id, jbe_get_user_money( id ) + aDataQuest[ QUEST_PRIZE ], 1 );
    }
}

public client_putinserver( id ) 
{
    for( new iCase ; iCase < MAX_QUEST ; iCase++ )
        g_aUser[ id ][ u_Solved ][ iCase ] = false;
    
    g_aUser
[ id ][ u_Select ] = QUEST_NONE;
    g_aUser[ id ][ u_Progress ] = 0;
}
public client_disconnected( id ) remove_task( id+TASK_SHOWHUD );

stock UTIL_SayText( id, const input[], any:... ) 
{
    new count = 1, players[ 32 ];
    static msg[ 188 ];
    vformat( msg, 187, input, 3 );
    
    replace_all
( msg, 187, "!g", "^4" );
    replace_all( msg, 187, "!y", "^1" );
    replace_all( msg, 187, "!t", "^3" );
    
    if
( id ) players[ 0 ] = id; else get_players( players, count, "ch" );
    {
        for( new i ; i < count ; i++ )
        {
            if( is_user_connected( players[ i ] ) )
            {
                message_begin( MSG_ONE_UNRELIABLE, get_user_msgid( "SayText" ), _, players[ i ] );
                write_byte( players[ i ] );
                write_string( msg );
                message_end();
            }
        }
    }
    
    return true
;
}
 
Аватара пользователя
Marsh
 
Сообщения: 20
Зарегистрирован: 24 мар 2018, 13:18
Благодарил (а): 5 раз.
Поблагодарили: 0 раз.
Опыт программирования: Около года
Языки программирования: C++
PascalABC

Re: Краш сервера при смерти об землю. Плагин JBR_Quests  [Решено]

Сообщение xbass13 » 05 июл 2019, 20:53

Код: Выделить всё

public Ham_PlayerKilled_Post
( iVictim, iKiller ) 
{
    if( g_aUser[ iKiller ][ u_Select ] == QUEST_NONE ) 
        return HAM_IGNORED
;
    
    if
( !is_user_connected( iVictim ) || iVictim == iKiller )
        return HAM_IGNORED;
 

=>
Код: Выделить всё
public Ham_PlayerKilled_Post( iVictim, iKiller ) 
{
    if(!is_user_connected( iVictim ) || !is_user_connected( iKiller )
    || iVictim == iKiller || g_aUser[ iKiller ][ u_Select ] == QUEST_NONE)
        return HAM_IGNORED
Аватара пользователя
xbass13
 
Сообщения: 96
Зарегистрирован: 13 июн 2012, 21:20
Благодарил (а): 36 раз.
Поблагодарили: 35 раз.
Опыт программирования: Больше трех лет
Языки программирования: pawn, c++, js, php

Re: Краш сервера при смерти об землю. Плагин JBR_Quests

Сообщение Marsh » 06 июл 2019, 14:43

Большое спасибо!
Аватара пользователя
Marsh
 
Сообщения: 20
Зарегистрирован: 24 мар 2018, 13:18
Благодарил (а): 5 раз.
Поблагодарили: 0 раз.
Опыт программирования: Около года
Языки программирования: C++
PascalABC


Вернуться в Скриптинг

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13