Code:
#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <xs>
new const KZ_LIBRARY[] = "kzarg"
new const KZ_DIR[] = "kz"
enum C4_TIMERS
{
KZ_C4_START = 1,
KZ_C4_END = 2
};
new const KZ_ALTER_START[] = "alter_starts"
new const kz_alter_start_mdl[] = "models/w_c4.mdl"
new alter_button
new const Float:KZ_C4_ALTER_MIN[3] = {-14.0, -14.0, -4.0}
new const Float:KZ_C4_ALTER_MAX[3] = {14.0, 14.0, 4.0}
new g_hud_overtime
public plugin_init()
{
register_plugin("ButtonCreator - kzarg", "0.0.1", "ReymonARG")
register_clcmd("say /sbm", "cmdstarteverything", ADMIN_IMMUNITY, "- open Surf Button Maker menu")
g_hud_overtime = CreateHudSyncObj()
}
public plugin_cfg()
{
readalterstarts()
}
public plugin_natives()
{
register_library(KZ_LIBRARY)
register_native("kz_get_configsdir", "native_kz_get_configsdir", 1)
}
/*================================================================================================*/
/*************************************** [C4 Starts] **********************************************/
/*=============================================================================R=E=Y=M=O=N==A=R=G=*/
public cmdstarteverything(id)
{
kz_makec4menu(id)
return PLUGIN_CONTINUE;
}
stock kz_makec4menu(id, page=0)
{
new menu = menu_create("\y[\rAG\y] Button Creator \w", "menuc4funccions");
menu_additem(menu, "Create Start", "1", 0);
menu_additem(menu, "Create End", "2", 0);
menu_additem(menu, "Move Menu", "3", 0);
menu_additem(menu, "Remove Aiming C4", "4", 0);
menu_additem(menu, "Remove All", "5", 0);
menu_additem(menu, "Save positions", "6", 0);
menu_display(id, menu, page);
}
/*================================================================================================*/
public menuc4funccions(id, menu, item)
{
if(item == MENU_EXIT)
{
return PLUGIN_HANDLED;
}
new data[6], iName[64];
new iaccess, callback;
menu_item_getinfo(menu, item, iaccess, data,5, iName, 63, callback);
new key = str_to_num(data);
new page = floatround(str_to_float(data)/7.0001, floatround_floor)
switch( key )
{
case 1:
{
makeBox(id, "bstart", KZ_C4_START);
}
case 2:
{
makeBox(id, "bfinal", KZ_C4_END);
}
case 3:
{
kz_movec4menu(id)
return PLUGIN_HANDLED
}
case 4:
{
new ent, body;
get_user_aiming(id, ent, body, 9999);
if( !pev_valid(ent) )
{
kz_hud_overtime(id, "[AG] You have to point to an object to remove it.")
}
else
{
new szClassname[33];
pev(ent, pev_classname, szClassname, 32);
if( !equal(szClassname, "bstart", 0) && !equal(szClassname, "bfinal", 0) )
{
kz_hud_overtime(id, "[AG] You have to point to an object to remove it.")
}
else
{
set_pev(ent, pev_flags, pev(ent, pev_flags) | FL_KILLME)
kz_hud_overtime(id, "[AG] Object destroyed correctly.")
}
}
}
case 5:
{
new ent
while( (ent = engfunc(EngFunc_FindEntityByString, ent, "classname", "bstart")) )
{
set_pev(ent, pev_flags, pev(ent, pev_flags) | FL_KILLME)
}
ent = 0 // Reset
while( (ent = engfunc(EngFunc_FindEntityByString, ent, "classname", "bfinal")) )
{
set_pev(ent, pev_flags, pev(ent, pev_flags) | FL_KILLME)
}
kz_hud_overtime(id, "[AG] Object destroyed correctly.")
}
case 6:
{
new mapname[64], c4file[128]
get_mapname(mapname, 63)
kz_get_configsdir(c4file, 127)
formatex(c4file, 127, "%s/%s/%s.cfg", c4file, KZ_ALTER_START, mapname)
if( file_exists(c4file) )
{
delete_file(c4file)
}
new ent, Float:vOrigin[3], szData[42];
new f = fopen(c4file, "at")
while( (ent = engfunc(EngFunc_FindEntityByString, ent, "classname", "bstart")) )
{
pev(ent, pev_origin, vOrigin)
formatex(szData, 41, "S %f %f %f^n", vOrigin[0], vOrigin[1], vOrigin[2])
fputs(f, szData)
}
ent = 0
while( (ent = engfunc(EngFunc_FindEntityByString, ent, "classname", "bfinal")) )
{
pev(ent, pev_origin, vOrigin)
formatex(szData, 41, "E %f %f %f^n", vOrigin[0], vOrigin[1], vOrigin[2])
fputs(f, szData)
}
fclose(f);
kz_hud_overtime(id, "[AG] Objects stored properly.")
}
}
kz_makec4menu(id, page)
return PLUGIN_HANDLED;
}
stock kz_movec4menu(id, page=0)
{
new menu = menu_create("\y[\rAG\y] C4 Move Start \w", "moverc4funccion")
menu_additem(menu, "X++", "1", 0)
menu_additem(menu, "X--", "2", 0)
menu_additem(menu, "Y++", "3", 0)
menu_additem(menu, "Y--", "4", 0)
menu_additem(menu, "Z++", "5", 0)
menu_additem(menu, "Z--", "6", 0)
menu_setprop(menu, MPROP_EXITNAME, "\wC4 Menu");
menu_display(id, menu, page)
}
public moverc4funccion(id, menu, item)
{
if(item == MENU_EXIT)
{
kz_makec4menu(id)
return PLUGIN_HANDLED;
}
new data[6], iName[64];
new iaccess, callback;
menu_item_getinfo(menu, item, iaccess, data,5, iName, 63, callback);
new page = floatround(str_to_float(data)/7.0001, floatround_floor)
moveBox(id, str_to_num(data))
kz_movec4menu(id, page)
return PLUGIN_HANDLED
}
/*================================================================================================*/
readalterstarts()
{
new mapname[64], c4file[128]
get_mapname(mapname, 63)
kz_get_configsdir(c4file, 127)
formatex(c4file, 127, "%s/%s/%s.cfg", c4file, KZ_ALTER_START, mapname)
if( !file_exists(c4file) )
{
return;
}
new szData[41]
new szType[2], szX[13], szY[13], szZ[13]
new Float:vOrigin[3]
new f = fopen(c4file, "rt")
while( !feof(f) )
{
fgets(f, szData, 40)
parse(szData, szType, 1, szX, 12, szY, 12, szZ, 12)
vOrigin[0] = str_to_float(szX)
vOrigin[1] = str_to_float(szY)
vOrigin[2] = str_to_float(szZ)
if( szType[0] == 'S' )
{
makeBox(0, "bstart", 1, vOrigin)
}
else if( szType[0] == 'E' )
{
makeBox(0, "bfinal", 2, vOrigin)
}
else
{
log_amx("Invalid: %c en: %s", szType[0], c4file)
}
}
fclose(f);
}
/*================================================================================================*/
stock makeBox(id, const szClassname[], {C4_TIMERS,_}:type, Float:pOrigin[3]={0.0, 0.0, 0.0})
{
new ent= engfunc(EngFunc_CreateNamedEntity, alter_button);
if( !pev_valid(ent) )
{
return PLUGIN_HANDLED;
}
set_pev(ent, pev_classname, szClassname)
set_pev(ent, pev_solid, SOLID_BBOX)
set_pev(ent, pev_movetype, MOVETYPE_NONE)
set_pev(ent, pev_target, type == KZ_C4_START ? "counter_start" : "counter_off")
engfunc(EngFunc_SetModel, ent, kz_alter_start_mdl)
engfunc(EngFunc_SetSize, ent, KZ_C4_ALTER_MIN, KZ_C4_ALTER_MAX)
// Check if it making from file or user
if( id )
{
new Float:vOrigin[3]
fm_get_aim_origin(id, vOrigin)
vOrigin[2] += 22.0 // Prevent put on the floor
engfunc(EngFunc_SetOrigin, ent, vOrigin);
}
else
{
engfunc(EngFunc_SetOrigin, ent, pOrigin)
}
switch( type )
{
case KZ_C4_START: fm_set_rendering(ent, kRenderFxGlowShell, 0, 255, 0, kRenderNormal, 100)
case KZ_C4_END: fm_set_rendering(ent, kRenderFxGlowShell, 255, 0, 0, kRenderNormal, 100)
}
return PLUGIN_HANDLED
}
/*================================================================================================*/
stock moveBox(id, mode)
{
new ent, body, szClassname[33];
get_user_aiming(id, ent, body, 9999);
if( !pev_valid(ent) )
{
return PLUGIN_HANDLED;
}
pev(ent, pev_classname, szClassname, 32);
if( !equal(szClassname, "bstart", 0) && !equal(szClassname, "bfinal", 0) )
{
kz_hud_overtime(id, "[AG] You must focus an object.")
}
else
{
new Float:vOrigin[3];
pev(ent, pev_origin, vOrigin);
switch( mode )
{
case 1: vOrigin[0] += 5.0
case 2: vOrigin[0] -= 5.0
case 3: vOrigin[1] += 5.0
case 4: vOrigin[1] -= 5.0
case 5: vOrigin[2] += 5.0
case 6: vOrigin[2] -= 5.0
}
engfunc(EngFunc_SetOrigin, ent, vOrigin)
}
return PLUGIN_HANDLED;
}
stock fm_set_rendering(entity, fx = kRenderFxNone, r = 255, g = 255, b = 255, render = kRenderNormal, amount = 16)
{
new Float:RenderColor[3];
RenderColor[0] = float(r);
RenderColor[1] = float(g);
RenderColor[2] = float(b);
set_pev(entity, pev_renderfx, fx);
set_pev(entity, pev_rendercolor, RenderColor);
set_pev(entity, pev_rendermode, render);
set_pev(entity, pev_renderamt, float(amount));
return 1;
}
stock fm_get_aim_origin(index, Float:origin[3])
{
new Float:start[3], Float:view_ofs[3];
pev(index, pev_origin, start);
pev(index, pev_view_ofs, view_ofs);
xs_vec_add(start, view_ofs, start);
new Float:dest[3];
pev(index, pev_v_angle, dest);
engfunc(EngFunc_MakeVectors, dest);
global_get(glb_v_forward, dest);
xs_vec_mul_scalar(dest, 9999.0, dest);
xs_vec_add(start, dest, dest);
engfunc(EngFunc_TraceLine, start, dest, 0, index, 0);
get_tr2(0, TR_vecEndPos, origin);
return 1;
}
stock kz_hud_overtime(id, const message[], {Float,Sql,Result,_}:...)
{
static msg[192]
vformat(msg, 191, message, 3);
set_hudmessage(0, 0, 255, -1.0, 0.90, 0, 0.0, 2.0, 0.0, 1.0, -1);
ShowSyncHudMsg(id, g_hud_overtime, msg);
}
stock kz_get_configsdir(name[], len)
{
new lalin[64]
get_localinfo("amxx_configsdir", lalin,63)
return formatex(name, len, "%s/%s", lalin, KZ_DIR)
}
public native_kz_get_configsdir(name[], len)
{
param_convert(1)
new lalin[64]
get_localinfo("amxx_configsdir", lalin,63)
return formatex(name, len, "%s/%s", lalin, KZ_DIR)
}
Create the button makes the server crash. Any fix?