#include < amxmodx >
#include < amxmisc >
#include < hamsandwich >
#include < fakemeta >
#include < engine >
#include < fun >
#include < sqlx >
#define OFFSET_MONEY 115
#define IS_PLAYER(%1) (0 < %1 <= g_iMaxPlayers)
#define ModelsNum 7
new const g_sPrefix[ ] = "Devastators";
new const g_sClassName[ ] = "pokeball";
new const g_sClassName2[ ] = "pokemon";
new const g_sTable[ ] = "poke_event";
new const g_sSQL_INFOS[ ][ ] =
{
"", // HOST
"", // USERNAME
"", // PASSWORD
"" // DATABASE
};
new const g_sClass[ ModelsNum ][ ] = { "Pikachu", "Arcanine", "Charizard", "Psyduck", "Piplup", "Squirtle", "Snorlax" };
new const g_iModels[ 11 ] = { 200, 300, 500, 700, 1000, 1200, 1500, 1800, 2200, 2500, 10000000 };
new const g_sModels[ ][ ] =
{
"models/PokeEvent_by_Demon/Poke_Pikachu.mdl",
"models/PokeEvent_by_Demon/Poke_Arcanine.mdl",
"models/PokeEvent_by_Demon/Poke_Charizard.mdl",
"models/PokeEvent_by_Demon/Poke_Psyduck.mdl",
"models/PokeEvent_by_Demon/Poke_Piplup.mdl",
"models/PokeEvent_by_Demon/Poke_Squirtle.mdl",
"models/PokeEvent_by_Demon/Poke_Snorlax.mdl",
"models/PokeEvent_by_Demon/v_pokeball.mdl",
"models/PokeEvent_by_Demon/p_pokeball.mdl",
"models/PokeEvent_by_Demon/w_pokeball.mdl"
}
new Handle: g_iSqlTuple;
new g_iMaxPlayers, g_iMsgMoney, g_iTrail, g_iRing, g_iVAllocModel, g_iPAllocModel;
new g_iPokemons[ 33 ][ ModelsNum ], g_iLevels[ 33 ][ ModelsNum ], g_sAuthid[ 33 ][ 32 ];
public plugin_precache( )
{
for ( new i; i < sizeof g_sModels; ++i ) precache_model( g_sModels[ i ] );
g_iTrail = precache_model( "sprites/smoke.spr" );
g_iRing = precache_model( "sprites/shockwave.spr" );
precache_sound( "PokeEvent_by_Demon/pokedraw.wav" );
precache_sound( "PokeEvent_by_Demon/pokebounce.wav" );
precache_sound( "PokeEvent_by_Demon/pokepin.wav" );
}
public plugin_init( )
{
g_iMaxPlayers = get_maxplayers( );
g_iMsgMoney = get_user_msgid( "Money" );
RegisterHam( Ham_Killed, "player", "fwHamKilled" );
RegisterHam( Ham_Spawn, "player", "fwSpawn", 1 );
register_forward( FM_EmitSound, "fwEmitSound" );
register_event( "HLTV", "eRoundStart", "a", "1=0", "2=0" );
register_event( "TextMsg", "eRoundStart", "a", "2&#Game_C", "2&#Game_w" );
register_event( "CurWeapon", "eCurWeapon","be", "1=1" );
register_think( g_sClassName, "FwThinkFakeSmoke" );
g_iVAllocModel = engfunc( EngFunc_AllocString, g_sModels[ 7 ] );
g_iPAllocModel = engfunc( EngFunc_AllocString, g_sModels[ 8 ] );
g_iSqlTuple = SQL_MakeDbTuple( g_sSQL_INFOS[ 0 ], g_sSQL_INFOS[ 1 ], g_sSQL_INFOS[ 2 ], g_sSQL_INFOS[ 3 ] );
new sThread[ 512 ];
formatex( sThread, charsmax( sThread ), "CREATE TABLE IF NOT EXISTS `%s` (`authid` varchar(32) NOT NULL, `username` varchar(32) NOT NULL, `%s` INT(11) NOT NULL, `%s` INT(11) NOT NULL, `%s` INT(11) NOT NULL, `%s` INT(11) NOT NULL, `%s` INT(11) NOT NULL, `%s` INT(11) NOT NULL, `%s` INT(11) NOT NULL, `id` INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY);", g_sTable, g_sClass[ 0 ], g_sClass[ 1 ], g_sClass[ 2 ], g_sClass[ 3 ], g_sClass[ 4 ], g_sClass[ 5 ], g_sClass[ 6 ] );
SQL_ThreadQuery( g_iSqlTuple, "ThreadHandler", sThread, { 0 }, 1 );
register_concmd( "say /pokemon", "cmdShowMyPokemons" );
register_clcmd( "say /poke","cmdBuyPokeBall" );
register_clcmd( "create_poke", "cmdCreate", ADMIN_RCON, "<model (0-6)> - create pokemon." );
}
public SaveDatas( iId, iMode )
{
static sText[ 512 ], sName[ 32 ];
get_user_name2( iId, sName, charsmax( sName ) );
if ( iMode == 1 ) formatex( sText, charsmax( sText ), "INSERT INTO `%s` (`authid`,`username`) VALUES (^"%s^", ^"%s^");", g_sTable, g_sAuthid[ iId ], sName );
else formatex( sText, charsmax( sText ), "UPDATE `%s` SET authid = ^"%s^", username = ^"%s^", %s = ^"%d^", %s = ^"%d^", %s = ^"%d^", %s = ^"%d^", %s = ^"%d^", %s = ^"%d^", %s = ^"%d^" WHERE authid = ^"%s^";",
g_sTable, g_sAuthid[ iId ], sName, g_sClass[ 0 ], g_iPokemons[ iId ][ 0 ], g_sClass[ 1 ], g_iPokemons[ iId ][ 1 ], g_sClass[ 2 ],
g_iPokemons[ iId ][ 2 ], g_sClass[ 3 ], g_iPokemons[ iId ][ 3 ], g_sClass[ 4 ], g_iPokemons[ iId ][ 4 ], g_sClass[ 5 ], g_iPokemons[ iId ][ 5 ],
g_sClass[ 6 ], g_iPokemons[ iId ][ 6 ], g_sAuthid[ iId ] );
SQL_ThreadQuery( g_iSqlTuple, "ThreadHandler", sText, { 0 }, 1 );
}
public LoadDatas( iId )
{
static sText[ 128 ], iArray[ 1 ];
formatex( sText, charsmax( sText ), "SELECT * FROM `%s` WHERE authid = ^"%s^";", g_sTable, g_sAuthid[ iId ] );
iArray[ 0 ] = iId;
SQL_ThreadQuery( g_iSqlTuple, "ThreadHandler", sText, iArray, sizeof( iArray ) );
}
public ThreadHandler( iFailState, Handle:iQuery, const sErrorMsg[ ], iErrorCode, const iARRAY[ ], iArraySize, Float:fQueueTime )
{
if ( iFailState == TQUERY_CONNECT_FAILED )
{
set_fail_state( "Nem tudtam csatlakozni az adatbazishoz." );
return;
}
else if ( iFailState == TQUERY_QUERY_FAILED )
{
set_fail_state( "Query Error" );
return;
}
if ( iErrorCode )
{
log_amx( "%i - %s", iErrorCode, sErrorMsg );
return;
}
new iId = iARRAY[ 0 ];
if ( iId )
{
if ( SQL_NumResults( iQuery ) > 0 )
{
for ( new i; i < ModelsNum; ++i )
{
g_iPokemons[ iId ][ i ] = SQL_ReadResult( iQuery, i + 2 );
for ( new j; j < 10; ++j )
{
if ( g_iPokemons[ iId ][ i ] < g_iModels[ j ] ) break;
++g_iLevels[ iId ][ i ];
}
}
}
else SaveDatas( iId, 1 );
}
return;
}
public cmdShowMyPokemons( iId )
{
static iLen = 0, sMotd[ 1024 ], iMotdLen = charsmax( sMotd );
iLen = formatex( sMotd, iMotdLen, "<meta charset=utf-8><body bgcolor=#000000><font color=#FFB000><pre>%-22.22s %-22.22s %6s^n^n", "Pokémon", "Mennyiség", "Szint" );
for ( new i; i < ModelsNum; ++i )
iLen += formatex( sMotd[ iLen ], iMotdLen - iLen, "%-22.22s %-22.22d %6d\n", g_sClass[ i ], g_iPokemons[ iId ][ i ], g_iLevels[ iId ][ i ] );
iLen += formatex( sMotd[ iLen ], iMotdLen - iLen, "^nParancsok:^n/poke -- Pokélabda vásárlás (2000$).^n/pokemon -- Pokémonjaid megtekintése." );
show_motd( iId, sMotd, "Pokémonjaid" );
}
public cmdBuyPokeBall( iId )
{
if ( !is_user_alive( iId ) ) return;
if ( user_has_weapon( iId, CSW_SMOKEGRENADE ) )
{
ChatColor( iId, "Már van pokélabdád!" );
return;
}
static iMoney;
iMoney = fm_get_user_money( iId );
if ( iMoney < 2000 )
{
ChatColor( iId, "Nincs elég pénzed (2000$)!" );
return;
}
ChatColor( iId, "Sikeresen vásároltál egy pokélabdát!" );
give_item( iId, "weapon_smokegrenade" );
iMoney -= 2000;
fm_set_user_money( iId, iMoney );
return;
}
public eCurWeapon( iId )
{
if ( !is_user_alive( iId ) ) return PLUGIN_CONTINUE;
if ( read_data( 2 ) != CSW_SMOKEGRENADE ) return PLUGIN_CONTINUE;
set_pev( iId, pev_viewmodel, g_iVAllocModel );
set_pev( iId, pev_weaponmodel, g_iPAllocModel );
return PLUGIN_CONTINUE;
}
public FwThinkFakeSmoke( iEntity ) {
if( !pev_valid( iEntity ) )
return PLUGIN_CONTINUE;
engfunc( EngFunc_RemoveEntity, iEntity );
return PLUGIN_CONTINUE;
}
public grenade_throw( iId, iEntity, iWeapId )
{
if ( !is_user_connected( iId ) || iWeapId != CSW_SMOKEGRENADE ) return PLUGIN_CONTINUE;
engfunc( EngFunc_SetModel, iEntity, g_sModels[ 9 ] );
message_begin( MSG_BROADCAST, SVC_TEMPENTITY );
write_byte( TE_BEAMFOLLOW );
write_short( iEntity );
write_short( g_iTrail );
write_byte( 10 );
write_byte( 5 );
write_byte( 255 );
write_byte( 0 );
write_byte( 0 );
write_byte( 192 );
message_end( );
return PLUGIN_CONTINUE;
}
public fwEmitSound( iEntity, iChannel, const sSample[ ] )
{
if ( GetGrenadeType( iEntity ) )
{
if ( containi( sSample, "grenade_hit" ) != -1 )
emit_sound( iEntity, CHAN_AUTO, "PokeEvent_by_Demon/pokebounce.wav", VOL_NORM, ATTN_NORM, 0, PITCH_NORM );
else if ( equal( sSample[ 8 ], "sg_explode", 10 ) )
FindPokemons( iEntity );
}
}
public FindPokemons( iOrigEnt )
{
// cache origin, angles and model
new Float: fOrigin[ 3 ], Float: fAngles[ 3 ], sModel[ 64 ], iOwner;
iOwner = entity_get_edict( iOrigEnt, EV_ENT_owner );
entity_get_vector( iOrigEnt, EV_VEC_origin, fOrigin );
entity_get_vector( iOrigEnt, EV_VEC_angles, fAngles );
entity_get_string( iOrigEnt, EV_SZ_model, sModel, charsmax( sModel ) );
// remove entity from world
entity_set_vector( iOrigEnt, EV_VEC_origin, Float: { 9999.9, 9999.9, 9999.9 } );
entity_set_int( iOrigEnt, EV_INT_flags, FL_KILLME );
// create new entity
new iEntity = create_entity( "info_target" );
if ( iEntity > 0 )
{
entity_set_string( iEntity, EV_SZ_classname, g_sClassName );
entity_set_origin( iEntity, fOrigin );
entity_set_vector( iEntity, EV_VEC_angles, fAngles );
entity_set_int( iEntity, EV_INT_movetype, MOVETYPE_TOSS );
entity_set_int( iEntity, EV_INT_solid, SOLID_BBOX );
entity_set_float( iEntity, EV_FL_nextthink, get_gametime( ) + 1.3 );
entity_set_model( iEntity, sModel );
emit_sound( iEntity, CHAN_AUTO, "PokeEvent_by_Demon/pokedraw.wav", VOL_NORM, ATTN_NORM, 0, PITCH_NORM );
set_task( 0.3, "RingEffect", iEntity, _, _, "b" );
if ( !is_user_alive( iOwner ) )
return;
static sName[ 32 ];
get_user_name( iOwner, sName, charsmax( sName ) );
new iTarget = -1, iFound = 0, sClassName[ 33 ];
while ( ( iTarget = find_ent_in_sphere( iTarget, fOrigin, 60.0 ) ) )
{
pev( iTarget, pev_classname, sClassName, 32 );
for ( new i = 0; i < ModelsNum; ++i )
{
if ( equal( sClassName, g_sClass[ i ] ) )
{
++g_iPokemons[ iOwner ][ i ];
if ( g_iPokemons[ iOwner ][ i ] >= g_iModels[ g_iLevels[ iOwner ][ i ] ] )
++g_iLevels[ iOwner ][ i ];
ChatColor( 0, "^3%s^1 befogott egy ^3%s ^1pokémont.", sName, g_sClass[ i ] );
iFound = 1;
break;
}
}
if ( iFound ) break;
}
if ( iFound )
{
entity_set_string( iTarget, EV_SZ_classname, g_sClassName2 );
set_task( 1.0, "RemoveEntity", iTarget );
fm_set_user_money( iOwner, fm_get_user_money( iOwner ) + 1000 );
}
else ChatColor( iOwner, "Nem sikerült befogni egy pokémont sem." );
SaveDatas( iOwner, 2 );
}
return;
}
public RemoveEntity( iEntity ) { if ( pev_valid( iEntity ) ) engfunc( EngFunc_RemoveEntity, iEntity ); }
public RingEffect( iEntity )
{
if ( !pev_valid( iEntity ) )
{
remove_task( iEntity );
return;
}
new Float: fOrigin[ 3 ]
entity_get_vector( iEntity, EV_VEC_origin, fOrigin );
// A ring effect
engfunc( EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, fOrigin, 0 );
write_byte( TE_BEAMCYLINDER ); // TE id
engfunc( EngFunc_WriteCoord, fOrigin[0] ); // x
engfunc( EngFunc_WriteCoord, fOrigin[1] ); // y
engfunc( EngFunc_WriteCoord, fOrigin[2] ); // z
engfunc( EngFunc_WriteCoord, fOrigin[0] ); // x axis
engfunc( EngFunc_WriteCoord, fOrigin[1] ); // y axis
engfunc( EngFunc_WriteCoord, fOrigin[2] + 50.0 ); // z axis
write_short( g_iRing ); // sprite
write_byte( 0 ); // startframe
write_byte( 0 ); // framerate
write_byte( 8 ); // life
write_byte( 25 ); // width
write_byte( 0 ); // noise
write_byte( 255 ); // red
write_byte( 0 ); // green
write_byte( 0 ); // blue
write_byte( 255 ); // brightness
write_byte( 0 ); // speed
message_end( );
}
public cmdCreate( iId, iLevel, iCid )
{
if ( !cmd_access( iId, iLevel, iCid, 2 ) ) return;
static sPoke[ 8 ], iPoke, Float: fOrigin[3], Float: fAngles[ 3 ], iEntity, sName[ 32 ];
read_argv( 1, sPoke, charsmax( sPoke ) );
iPoke = str_to_num( sPoke );
if ( iPoke < 0 || iPoke > 6 ) iPoke = 6;
pev( iId, pev_origin, fOrigin );
pev( iId, pev_angles, fAngles );
fOrigin[ 2 ] += -34.0;
fOrigin[ 1 ] += 34.0;
iEntity = engfunc( EngFunc_CreateNamedEntity, engfunc( EngFunc_AllocString, "info_target" ) );
if ( !pev_valid( iEntity ) ) return;
set_pev( iEntity, pev_classname, g_sClass[ iPoke ] );
set_pev( iEntity, pev_angles, fAngles );
engfunc( EngFunc_SetOrigin, iEntity, fOrigin );
engfunc( EngFunc_SetModel, iEntity, g_sModels[ iPoke ] );
get_user_name( iId, sName, charsmax( sName ) );
ChatColor( 0, "^3%s^1 kidobott egy ^3%s ^1pokémont.", sName, g_sClass[ iPoke ] );
ExecuteHam( Ham_Spawn, iEntity );
set_pev( iEntity, pev_solid, SOLID_BBOX );
set_pev( iEntity, pev_movetype, MOVETYPE_NONE );
engfunc( EngFunc_SetSize, iEntity, Float:{ -8.320000, -8.070000, -0.000000 }, Float:{ 8.350000, 16.900000, 36.220001 } );
engfunc( EngFunc_DropToFloor, iEntity );
return;
}
public fwHamKilled( iVictim, iKiller, iShoudGib )
{
if ( !IS_PLAYER( iKiller ) ) return;
if ( iKiller == iVictim ) return;
new Float: fOrigin[3];
pev( iVictim, pev_origin, fOrigin );
fOrigin[ 2 ] += -34.0;
new Float: fAngles[ 3 ];
pev( iVictim, pev_angles, fAngles );
new iEntity = engfunc( EngFunc_CreateNamedEntity, engfunc( EngFunc_AllocString, "info_target" ) );
if( !pev_valid( iEntity ) ) return;
new iRand = random_num( 1, 1000 );
if ( iRand < 100 ) iRand = 0;
else if ( iRand < 200 ) iRand = 1;
else if ( iRand < 300 ) iRand = 2;
else if ( iRand < 400 ) iRand = 3;
else if ( iRand < 500 ) iRand = 4;
else if ( iRand < 600 ) iRand = 5;
else iRand = 6;
set_pev( iEntity, pev_classname, g_sClass[ iRand ] );
set_pev( iEntity, pev_angles, fAngles );
engfunc( EngFunc_SetOrigin, iEntity, fOrigin );
engfunc( EngFunc_SetModel, iEntity, g_sModels[ iRand ] );
/*static sName[ 32 ];
get_user_name( iVictim, sName, charsmax( sName ) );
ChatColor( 0, "^3%s^1 elvesztette ^3%s ^1pokémonját, lehetõséged van befogni.", sName, g_sClass[ iRand ] );*/
ExecuteHam( Ham_Spawn, iEntity );
set_pev( iEntity, pev_solid, SOLID_BBOX );
set_pev( iEntity, pev_movetype, MOVETYPE_NONE );
engfunc( EngFunc_SetSize, iEntity, Float:{ -8.320000, -8.070000, -0.000000 }, Float:{ 8.350000, 16.900000, 36.220001 } );
engfunc( EngFunc_DropToFloor, iEntity );
return;
}
public fwSpawn( iId )
{
if ( is_user_connected( iId ) && is_user_alive( iId ) )
give_item( iId, "weapon_smokegrenade" );
}
public client_putinserver( iId )
{
arrayset( g_iPokemons[ iId ], 0, ModelsNum );
if ( is_user_bot( iId ) || is_user_hltv( iId ) ) return;
get_user_authid( iId, g_sAuthid[ iId ], charsmax( g_sAuthid[ ] ) );
arrayset( g_iLevels[ iId ], 0, ModelsNum );
LoadDatas( iId );
}
public client_disconnect( iId )
{
if ( is_user_bot( iId ) || is_user_hltv( iId ) ) return;
SaveDatas( iId, 2 );
}
public eRoundStart( )
{
for ( new i; i < ModelsNum; ++i ) RemoveEntities( g_sClass[ i ] );
RemoveEntities( g_sClassName2 );
}
public RemoveEntities( const sClassName[ ] )
{
new iEntity = FM_NULLENT;
while ( ( iEntity = engfunc( EngFunc_FindEntityByString, FM_NULLENT, "classname", sClassName ) ) )
engfunc( EngFunc_RemoveEntity, iEntity );
}
public plugin_end( ) { SQL_FreeHandle( g_iSqlTuple ); }
stock fm_get_user_money( iId ) { return get_pdata_int( iId, OFFSET_MONEY ); }
stock fm_set_user_money( iId, iMoney )
{
set_pdata_int( iId, OFFSET_MONEY, iMoney );
message_begin( MSG_ONE, g_iMsgMoney, { 0, 0, 0 }, iId );
write_long( iMoney );
write_byte( 1 );
message_end( );
}
stock get_user_name2( iId, sName[ ], iLen )
{
get_user_name( iId, sName, iLen );
replace_all( sName, iLen, "'", "*" );
replace_all( sName, iLen, "^"", "*" );
replace_all( sName, iLen, "`", "*" );
}
stock GetGrenadeType( iEntity )
{
if ( !pev_valid( iEntity ) )
return 0;
new sModel[ 64 ];
pev( iEntity, pev_model, sModel, charsmax( sModel ) );
if ( contain( sModel, "pokeball.mdl" ) != -1 ) return 1;
return 0;
}
stock ChatColor( iId, const sMessage[ ], any:... )
{
static iPlrNum, iPlayers[ 32 ], sMsg[ 256 ], iIdMsg, iMsgLen = charsmax( sMsg );
vformat( sMsg, iMsgLen, sMessage, 3 );
format( sMsg, iMsgLen, "^4[%s]^1 %s", g_sPrefix, sMsg );
if ( !iIdMsg ) iIdMsg = get_user_msgid( "SayText" );
if ( iId )
{
iPlayers[ 0 ] = iId;
iPlrNum = 1;
}
else get_players( iPlayers, iPlrNum, "ch" );
for ( new i, iPId; i < iPlrNum; ++i )
{
iPId = iPlayers[ i ];
if ( !is_user_connected( iPId ) ) continue;
message_begin( MSG_ONE, iIdMsg, _, iPId );
write_byte( iPId );
write_string( sMsg );
message_end( );
}
}