При отключении этого плагина все исправно работает, но когда он включен при смерти об землю крашит сервер. Помогите пофиксить пожалуйста.
Вы должны зарегистрироваться, чтобы видеть ссылки.
- Код: Выделить всё
#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, -1 );
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;
}