I made this plugin to check if player is in the zone. But some times the plugin fail, i dont have any ideia whats is the problem.
PHP Code:
/* Plugin generated by AMXX-Studio */
#include <amxmodx>
#include <amxmisc>
#include <hamsandwich>
#define PLUGIN "New Plug-In"
#define VERSION "1.0"
#define AUTHOR "author"
#define ZonesMax 15
#define TASK_ID 1234
new ZonaFreeDayOne[ZonesMax][3];
new ZonaFreeDayTwo[ZonesMax][3];
new ZonaFreeDayAtual;
new sprite_zbeam;
public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)
register_clcmd( "say /fdz", "clearyzona" );
RegisterHam( Ham_TakeDamage , "player" , "fwd_HamTake", 0);
set_task(1.0, "PutVisual", TASK_ID, _, _, "b")
}
public plugin_precache()
{
sprite_zbeam = precache_model("sprites/zbeam4.spr");
}
public fwd_HamTake( iClient, iInflictor, iAttacker, Float:fDamage, m_Damagebits )
{
if( is_user_connected( iClient ) )
{
if( !get_user_in_zone( iAttacker ) )
return HAM_SUPERCEDE;
}
return HAM_IGNORED;
}
stock get_user_in_zone( id )
{
new PlayerOrigem[3];
get_user_origin(id, PlayerOrigem, 0);
for( new i = 0; i < ZonesMax; i++ )
{
if( ZonaFreeDayOne[i][0] && ZonaFreeDayTwo[i][0] )
{
if( PlayerOrigem[0] <= ZonaFreeDayOne[i][0] && PlayerOrigem[0] >= ZonaFreeDayTwo[i][0] )
{
if( PlayerOrigem[1] <= ZonaFreeDayOne[i][1] && PlayerOrigem[1] >= ZonaFreeDayTwo[i][1] )
return 1;
if( PlayerOrigem[1] >= ZonaFreeDayOne[i][1] && PlayerOrigem[1] <= ZonaFreeDayTwo[i][1] )
return 1;
}
}
}
return 0;
}
public clearyzona(id)
{
new menu = menu_create("[ Clear Zone ]", "menu_fdzn");
menu_additem(menu, "\w Add Save Zone" , "1", 0);
menu_additem(menu, "\w Remove Save Zones" , "2", 0);
menu_additem(menu, "\w Exit" , "3", 0);
menu_setprop(menu, MPROP_EXIT, MEXIT_NEVER);
menu_display(id, menu, 0);
return PLUGIN_HANDLED;
}
public menu_fdzn(id, menu, item)
{
if (item == MENU_EXIT)
{
menu_destroy(menu);
return PLUGIN_HANDLED;
}
new data[6], iName[64], iOrigin[3];
new access, callback;
menu_item_getinfo(menu, item, access, data,5, iName, 63, callback);
new key = str_to_num(data);
switch(key)
{
case 1:
{
if( !ZonaFreeDayAtual )
ZonaFreeDayAtual = GetEmptyBaseIndex();
if( !ZonaFreeDayOne[ZonaFreeDayAtual][0] || !ZonaFreeDayOne[ZonaFreeDayAtual][1] || !ZonaFreeDayOne[ZonaFreeDayAtual][2] )
{
get_user_origin(id, iOrigin, 0);
ZonaFreeDayOne[ZonaFreeDayAtual][0] = iOrigin[0];
ZonaFreeDayOne[ZonaFreeDayAtual][1] = iOrigin[1];
ZonaFreeDayOne[ZonaFreeDayAtual][2] = iOrigin[2];
}
else if( !ZonaFreeDayTwo[ZonaFreeDayAtual][0] || !ZonaFreeDayTwo[ZonaFreeDayAtual][1] || !ZonaFreeDayTwo[ZonaFreeDayAtual][2] )
{
get_user_origin(id, iOrigin, 0);
ZonaFreeDayTwo[ZonaFreeDayAtual][0] = iOrigin[0];
ZonaFreeDayTwo[ZonaFreeDayAtual][1] = iOrigin[1];
ZonaFreeDayTwo[ZonaFreeDayAtual][2] = iOrigin[2];
ZonaFreeDayAtual = 0;
}
}
case 2:
SaveZonas();
case 3:
return PLUGIN_HANDLED;
}
menu_destroy(menu);
return PLUGIN_HANDLED;
}
public SaveZonas( )
{
new file = fopen(gszNewFile, "wt");
new szData[128];
for( new i = 0; i < ZonesMax; i++ )
{
if( ZonaFreeDayOne[i][0] && ZonaFreeDayTwo[i][0] )
{
formatex(szData, 128, "%d %d %d %d %d %d^n", ZonaFreeDayOne[i][0], ZonaFreeDayOne[i][1], ZonaFreeDayOne[i][2], ZonaFreeDayTwo[i][0], ZonaFreeDayTwo[i][1], ZonaFreeDayTwo[i][2]);
fputs(file, szData);
}
}
fclose(file);
}
public LoadZonas( )
{
new Entidade;
new O1[16], O2[16], O3[16], O4[16], O5[16], O6[16];
for ( new a = 0; a < file_size ( gszNewFile, 1 ); a ++ )
{
new szText [ 64 ]
new iLen
read_file ( gszNewFile, a, szText, sizeof ( szText ) - 1, iLen )
if ( ( szText [ 0 ] != ';' ) && (szText [ 0 ] != '/' ) )
{
Entidade = GetEmptyBaseIndex();
parse(szText, O1, 16, O2, 16, O3, 16, O4, 16, O5, 16, O6, 16);
ZonaFreeDayOne[Entidade][0] = str_to_num(O1);
ZonaFreeDayOne[Entidade][1] = str_to_num(O2);
ZonaFreeDayOne[Entidade][2] = str_to_num(O3);
ZonaFreeDayTwo[Entidade][0] = str_to_num(O4);
ZonaFreeDayTwo[Entidade][1] = str_to_num(O5);
ZonaFreeDayTwo[Entidade][2] = str_to_num(O6);
}
}
}
GetEmptyBaseIndex()
{
for( new i = 1; i < ZonesMax; i++ )
{
if( !ZonaFreeDayOne[i][0] && !ZonaFreeDayTwo[i][0] )
{
return i;
}
}
return 0;
}
public PutVisual()
{
for( new i = 1; i < ZonesMax; i++ )
{
for(new j = 1; j <= 4; j++)
{
if( ZonaFreeDayOne[i][0] && ZonaFreeDayTwo[i][0] )
{
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(0)
switch( j )
{
case 1:
{
write_coord(ZonaFreeDayOne[i][0])
write_coord(ZonaFreeDayOne[i][1])
write_coord(ZonaFreeDayOne[i][2])
write_coord(ZonaFreeDayOne[i][0])
write_coord(ZonaFreeDayTwo[i][1])
write_coord(ZonaFreeDayTwo[i][2])
}
case 2:
{
write_coord(ZonaFreeDayTwo[i][0])
write_coord(ZonaFreeDayOne[i][1])
write_coord(ZonaFreeDayOne[i][2])
write_coord(ZonaFreeDayTwo[i][0])
write_coord(ZonaFreeDayTwo[i][1])
write_coord(ZonaFreeDayTwo[i][2])
}
case 3:
{
write_coord(ZonaFreeDayOne[i][0])
write_coord(ZonaFreeDayOne[i][1])
write_coord(ZonaFreeDayOne[i][2])
write_coord(ZonaFreeDayTwo[i][0])
write_coord(ZonaFreeDayOne[i][1])
write_coord(ZonaFreeDayTwo[i][2])
}
case 4:
{
write_coord(ZonaFreeDayOne[i][0])
write_coord(ZonaFreeDayTwo[i][1])
write_coord(ZonaFreeDayOne[i][2])
write_coord(ZonaFreeDayTwo[i][0])
write_coord(ZonaFreeDayTwo[i][1])
write_coord(ZonaFreeDayTwo[i][2])
}
}
write_short(sprite_zbeam)
write_byte(0)
write_byte(0)
write_byte(30)
write_byte(15)
write_byte(0)
write_byte(255)
write_byte(0)
write_byte(0)
write_byte(100)
write_byte(0)
message_end()
}
}
}
}