Ok. i´m finish with the first step. but ma menu dont shows up :
PHP Code:
#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <xs>
#define PLUGIN "Checkpoint maker"
#define VERSION "1.0"
#define AUTHOR "One"
#define POST_FORWARD 1
#define PRE_FORWARD 0
#define FM_TEAM_OFFSET 114
#define fm_get_user_team(%1) get_pdata_int(%1, FM_TEAM_OFFSET)
#define MENU_ACCESS ADMIN_BAN
#define TASK_SHOWpoint_ID 144690
#define TASK_SHOWAV_ID 290661
#define MAX_CP_POINTS 25
enum {
IZ_FIRST_POINT = 0,
IZ_SECOND_POINT
};
new g_iMainMenu;
new g_iMaxPlayers;
new g_iBeamSprite;
new g_ipoints;
new g_iCurrentEnt[33];
new g_szTouchedpoint[33][32];
new g_iBuildStage[33];
new Float:g_fLastTouch[33];
new Float:g_fOriginBox[33][2][3];
new bool:g_bInBuild[33];
new g_iColor[3] = { 0, 255, 255 };
new const g_szIzClassName[] = "Checkpoint_mk";
public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR);
register_clcmd("say /cp", "clcmdMainMenu", MENU_ACCESS, "");
register_clcmd("say /cpmenu", "clcmdMainMenu", MENU_ACCESS, "");
register_clcmd("set_cp_mk", "clcmdcp_mk", MENU_ACCESS, "");
register_clcmd("say_team", "clcmdSayTeam", -1, "");
register_forward(FM_Touch, "Fwd_Touch", PRE_FORWARD);
register_forward(FM_PlayerPreThink, "Fwd_PlayerPreThink", POST_FORWARD);
g_iMainMenu = menu_create("\yCheckpoint Maker \rBy One", "menuMainHandle", 0);
menu_additem(g_iMainMenu, "New CP_Point", "1", 0, -1);
menu_additem(g_iMainMenu, "Delete CP_Point", "2", 0, -1);
menu_additem(g_iMainMenu, "Select CP_Point", "3", 0, -1);
menu_additem(g_iMainMenu, "Rename CP_Point", "4", 0, -1);
menu_addblank(g_iMainMenu, 0);
menu_additem(g_iMainMenu, "Show/Hide CP_Point", "5", 0, -1);
menu_addblank(g_iMainMenu, 0);
menu_additem(g_iMainMenu, "Delete all CP_Points", "6", 0, -1);
menu_additem(g_iMainMenu, "Save CP_Points", "7", 0, -1);
menu_addblank(g_iMainMenu, 0);
g_iMaxPlayers = global_get(glb_maxClients);
}
public plugin_precache()
g_iBeamSprite = precache_model("sprites/dot.spr");
public plugin_cfg()
{
new szFile[64], szMapName[32];
get_datadir(szFile, sizeof szFile - 1);
get_mapname(szMapName, sizeof szMapName - 1);
add(szFile, sizeof szFile - 1, "/CP_Point");
if(!dir_exists(szFile))
mkdir(szFile);
format(szFile, sizeof szFile - 1, "%s/Checkpoints_%s.ini", szFile, szMapName);
new iFile = fopen(szFile, "at+");
new szBuffer[256];
new szTargetName[32], szOrigin[64], szMins[64], szMaxs[64];
new szTemp1[3][32], szTemp2[3][32], szTemp3[3][32];
while(!feof(iFile))
{
fgets(iFile, szBuffer, sizeof szBuffer - 1);
if(!szBuffer[0])
continue;
parse(szBuffer, szTargetName, sizeof szTargetName - 1, szOrigin, sizeof szOrigin - 1, szMins, sizeof szMins - 1, szMaxs, sizeof szMaxs - 1);
str_piece(szOrigin, szTemp1, sizeof szTemp1, sizeof szTemp1[] - 1, ';');
str_piece(szMins, szTemp2, sizeof szTemp2, sizeof szTemp2[] - 1, ';');
str_piece(szMaxs, szTemp3, sizeof szTemp3, sizeof szTemp3[] - 1, ';');
static Float:fOrigin[3], Float:fMins[3], Float:fMaxs[3];
fOrigin[0] = str_to_float(szTemp1[0]);
fOrigin[1] = str_to_float(szTemp1[1]);
fOrigin[2] = str_to_float(szTemp1[2]);
fMins[0] = str_to_float(szTemp2[0]);
fMins[1] = str_to_float(szTemp2[1]);
fMins[2] = str_to_float(szTemp2[2]);
fMaxs[0] = str_to_float(szTemp3[0]);
fMaxs[1] = str_to_float(szTemp3[1]);
fMaxs[2] = str_to_float(szTemp3[2]);
fm_create_cp_point(fOrigin, fMins, fMaxs, szTargetName);
g_ipoints++;
if(g_ipoints >= MAX_CP_POINTS)
{
fclose(iFile);
return;
}
}
fclose(iFile);
}
public clcmdcp_mk(id)
{
if(!(get_user_flags(id) & MENU_ACCESS))
return 1;
new szArgs[32];
read_argv(1, szArgs, sizeof szArgs - 1);
if(szArgs[0] && pev_valid(g_iCurrentEnt[id]))
{
set_pev(g_iCurrentEnt[id], pev_targetname, szArgs);
client_printg(id, "> Successfully seted the CP-Point description ^"%s^".", szArgs);
}
return 1;
}
public clcmdMainMenu(id)
{
if(!(get_user_flags(id) & MENU_ACCESS))
return 1;
menu_display(id, g_iMainMenu, 0);
set_hudmessage(42, 85, 255, -1.0, 0.7, 0, 6.0, 5.0, 0.5, 0.5, -1);
show_hudmessage(id, "Current CP-Points num: '%d'^nMax CP-Points num: '%d'", g_ipoints, MAX_CP_POINTS);
return 0;
}
public menuMainHandle(id, menu, item)
{
if(item == MENU_EXIT)
{
if(task_exists(id + TASK_SHOWAV_ID))
remove_task(id + TASK_SHOWAV_ID);
g_bInBuild[id] = false;
return 1;
}
new szData[6], iAccess, iCallBack;
menu_item_getinfo(menu, item, iAccess, szData, sizeof szData - 1, _, _, iCallBack);
new iKey = str_to_num(szData);
switch(iKey)
{
case 1 :
{
if(g_bInBuild[id])
{
menu_display(id, menu, 0);
return 1;
}
if(g_ipoints >= MAX_CP_POINTS)
{
client_printg(id, "> Sorry, limit of CP-Points reached (%d).", MAX_CP_POINTS);
menu_display(id, menu, 0);
return 1;
}
g_bInBuild[id] = true;
if(!task_exists(id + TASK_SHOWAV_ID))
set_task(0.5, "taskShowAimVector", id + TASK_SHOWAV_ID, "", 0, "b", 0);
client_printg(id, "> Set the origin for the top right corner of the box.");
menu_display(id, menu, 0);
}
case 2 :
{
if(pev_valid(g_iCurrentEnt[id]))
{
new szTargetName[32];
pev(g_iCurrentEnt[id], pev_targetname, szTargetName, sizeof szTargetName - 1);
engfunc(EngFunc_RemoveEntity, g_iCurrentEnt[id]);
client_printg(id, "> Successfully removed CP-Points ^"%s^".", szTargetName);
g_ipoints--;
menu_display(id, menu, 0);
}
else
{
client_printg(id, "> Invalid CP-Points ent index.");
menu_display(id, menu, 0);
}
}
case 3 :
{
new iMenu = menu_create("\yCP Point : Select", "menuSelectHandle", 0);
new iEnt = -1;
while((iEnt = engfunc(EngFunc_FindEntityByString, iEnt, "classname", g_szIzClassName)) != 0)
{
static szTargetName[32];
pev(iEnt, pev_targetname, szTargetName, sizeof szTargetName - 1);
menu_additem(iMenu, szTargetName, "", 0, -1);
}
if(menu_items(iMenu) > 0)
menu_addblank(iMenu, 0);
menu_display(id, iMenu, 0);
}
case 4 :
{
if(pev_valid(g_iCurrentEnt[id]))
{
client_cmd(id, "messagemode set_cp_mk");
menu_display(id, menu, 0);
}
else
{
client_printg(id, "> Invalid CP-Point ent index.");
menu_display(id, menu, 0);
}
}
case 5 :
{
if(!task_exists(TASK_SHOWpoint_ID + id) && g_ipoints)
set_task(1.0, "taskSHOWpoints", TASK_SHOWpoint_ID + id, "", 0, "b", 0);
else
remove_task(TASK_SHOWpoint_ID + id);
menu_display(id, menu, 0);
}
case 6 :
{
new iEnt = -1;
while((iEnt = engfunc(EngFunc_FindEntityByString, iEnt, "classname", g_szIzClassName)) != 0)
engfunc(EngFunc_RemoveEntity, iEnt);
client_printg(id, "> Successfully deleted all CP-Points.");
g_ipoints = 0;
menu_display(id, menu, 0);
}
case 7 :
{
new szFile[64], szMapName[32];
get_datadir(szFile, sizeof szFile - 1);
get_mapname(szMapName, sizeof szMapName - 1);
format(szFile, sizeof szFile - 1, "%s/Checkpoints/Checkpoints_%s.ini", szFile, szMapName);
new iFile = fopen(szFile, "wt+");
new iEnt = -1;
while((iEnt = engfunc(EngFunc_FindEntityByString, iEnt, "classname", g_szIzClassName)) != 0)
{
static szTargetName[32], Float:fOrigin[3], Float:fMins[3], Float:fMaxs[3];
pev(iEnt, pev_targetname, szTargetName, sizeof szTargetName - 1);
pev(iEnt, pev_mins, fMins);
pev(iEnt, pev_maxs, fMaxs);
pev(iEnt, pev_origin, fOrigin);
fprintf(iFile, "^"%s^" ^"%.1f;%.1f;%.1f^" ^"%.1f;%.1f;%.1f^" ^"%.1f;%.1f;%.1f^"^n", szTargetName, fOrigin[0], fOrigin[1], fOrigin[2], fMins[0], fMins[1], fMins[2], fMaxs[0], fMaxs[1], fMaxs[2]);
}
fclose(iFile);
client_printg(0, "> Successfully saved all CP_Points (%d).", g_ipoints);
}
}
return 1;
}
public taskShowPoint(id)
{
id -= TASK_SHOWpoint_ID;
if(!is_user_connected(id))
{
remove_task(TASK_SHOWpoint_ID + id);
return;
}
new iEnt = fm_get_nearest_iz(id);
new Float:fOrigin[3], Float:fMins[3], Float:fMaxs[3];
pev(iEnt, pev_mins, fMins);
pev(iEnt, pev_maxs, fMaxs);
pev(iEnt, pev_origin, fOrigin);
fMins[0] += fOrigin[0];
fMins[1] += fOrigin[1];
fMins[2] += fOrigin[2];
fMaxs[0] += fOrigin[0];
fMaxs[1] += fOrigin[1];
fMaxs[2] += fOrigin[2];
fm_draw_line(id, fMaxs[0], fMaxs[1], fMaxs[2], fMins[0], fMaxs[1], fMaxs[2], g_iColor);
fm_draw_line(id, fMaxs[0], fMaxs[1], fMaxs[2], fMaxs[0], fMins[1], fMaxs[2], g_iColor);
fm_draw_line(id, fMaxs[0], fMaxs[1], fMaxs[2], fMaxs[0], fMaxs[1], fMins[2], g_iColor);
fm_draw_line(id, fMins[0], fMins[1], fMins[2], fMaxs[0], fMins[1], fMins[2], g_iColor);
fm_draw_line(id, fMins[0], fMins[1], fMins[2], fMins[0], fMaxs[1], fMins[2], g_iColor);
fm_draw_line(id, fMins[0], fMins[1], fMins[2], fMins[0], fMins[1], fMaxs[2], g_iColor);
fm_draw_line(id, fMins[0], fMaxs[1], fMaxs[2], fMins[0], fMaxs[1], fMins[2], g_iColor);
fm_draw_line(id, fMins[0], fMaxs[1], fMins[2], fMaxs[0], fMaxs[1], fMins[2], g_iColor);
fm_draw_line(id, fMaxs[0], fMaxs[1], fMins[2], fMaxs[0], fMins[1], fMins[2], g_iColor);
fm_draw_line(id, fMaxs[0], fMins[1], fMins[2], fMaxs[0], fMins[1], fMaxs[2], g_iColor);
fm_draw_line(id, fMaxs[0], fMins[1], fMaxs[2], fMins[0], fMins[1], fMaxs[2], g_iColor);
fm_draw_line(id, fMins[0], fMins[1], fMaxs[2], fMins[0], fMaxs[1], fMaxs[2], g_iColor);
}
public taskShowAimVector(id)
{
id -= TASK_SHOWAV_ID;
if(!is_user_connected(id))
{
remove_task(TASK_SHOWAV_ID + id);
return;
}
static Float:vAim[3];
velocity_by_aim(id, 64, vAim);
static Float:vOrigin[3];
pev(id, pev_origin, vOrigin);
vOrigin[0] += vAim[0];
vOrigin[1] += vAim[1];
if(!(pev(id, pev_flags) & FL_DUCKING))
vOrigin[2] += (vAim[2] + 16.0);
else
vOrigin[2] += (vAim[2] + 12.0);
static Float:vOrigin2[3];
vOrigin2[0] = vOrigin[0];
vOrigin2[1] = vOrigin[1];
vOrigin2[2] = vOrigin[2];
vOrigin[0] += 16.0;
fm_draw_line(id, vOrigin[0], vOrigin[1], vOrigin[2], vOrigin2[0], vOrigin2[1], vOrigin2[2], {255, 0, 0});
vOrigin[0] -= 16.0;
vOrigin[1] += 16.0;
fm_draw_line(id, vOrigin[0], vOrigin[1], vOrigin[2], vOrigin2[0], vOrigin2[1], vOrigin2[2], {0, 0, 255});
vOrigin[1] -= 16.0;
vOrigin[2] += 16.0;
fm_draw_line(id, vOrigin[0], vOrigin[1], vOrigin[2], vOrigin2[0], vOrigin2[1], vOrigin2[2], {0, 255, 0});
}
public menuSelectHandle(id, menu, item)
{
if(item == MENU_EXIT)
{
menu_display(id, g_iMainMenu, 0);
return 1;
}
new iAccess, szName[32], iCallback;
menu_item_getinfo(menu, item, iAccess, "", 0, szName, sizeof szName - 1, iCallback);
new iEnt = -1;
while((iEnt = engfunc(EngFunc_FindEntityByString, iEnt, "targetname", szName)) != 0)
{
if(pev_valid(iEnt))
g_iCurrentEnt[id] = iEnt;
}
client_printg(id, "> Successfully selected CP_Point ^"%s^".", szName);
menu_display(id, g_iMainMenu, 0);
return 1;
}
public Fwd_Touch(Ent, id)
{
if(!is_user_alive(id))
return FMRES_IGNORED;
static szClassName[32];
pev(Ent, pev_classname, szClassName, sizeof szClassName - 1);
static Float:fGameTime;
fGameTime = get_gametime();
if(equal(szClassName, g_szIzClassName) && (fGameTime - g_fLastTouch[id]) > 0.1)
{
static szTargetName[32];
pev(Ent, pev_targetname, szTargetName, sizeof szTargetName - 1);
if(!equal(g_szTouchedpoint[id], szTargetName))
formatex(g_szTouchedpoint[id], sizeof g_szTouchedpoint[] - 1, szTargetName);
g_fLastTouch[id] = fGameTime;
}
return FMRES_IGNORED;
}
public Fwd_PlayerPreThink(id)
{
if(!is_user_alive(id))
return FMRES_IGNORED;
static Float:fGameTime;
fGameTime = get_gametime();
if((fGameTime - g_fLastTouch[id]) > 0.5 && strlen(g_szTouchedpoint[id]))
g_szTouchedpoint[id][0] = '^0';
if(((pev(id, pev_button) & IN_ATTACK) && !(pev(id, pev_oldbuttons) & IN_ATTACK) || (pev(id, pev_button) & IN_USE && !(pev(id, pev_oldbuttons) & IN_USE))) && g_bInBuild[id])
{
new Float:fOrigin[3];
if(pev(id, pev_button) & IN_ATTACK)
fm_get_aim_origin(id, fOrigin);
else
{
new Float:fAim[3];
velocity_by_aim(id, 64, fAim);
pev(id, pev_origin, fOrigin);
fOrigin[0] += fAim[0];
fOrigin[1] += fAim[1];
if(!(pev(id, pev_flags) & FL_DUCKING))
fOrigin[2] += (fAim[2] + 16.0);
else
fOrigin[2] += (fAim[2] + 12.0);
}
if(g_iBuildStage[id] == IZ_FIRST_POINT)
{
g_iBuildStage[id] = IZ_SECOND_POINT;
g_fOriginBox[id][IZ_FIRST_POINT] = fOrigin;
client_printg(id, "> Now set the origin for the bottom left corner of the box.");
}
else
{
g_iBuildStage[id] = IZ_FIRST_POINT;
g_bInBuild[id] = false;
g_fOriginBox[id][IZ_SECOND_POINT] = fOrigin;
if(task_exists(id + TASK_SHOWAV_ID))
remove_task(id + TASK_SHOWAV_ID);
new Float:fCenter[3], Float:fSize[3];
new Float:fMins[3], Float:fMaxs[3];
for ( new i = 0; i < 3; i++ )
{
fCenter[i] = (g_fOriginBox[id][IZ_FIRST_POINT][i] + g_fOriginBox[id][IZ_SECOND_POINT][i]) / 2.0;
fSize[i] = get_float_difference(g_fOriginBox[id][IZ_FIRST_POINT][i], g_fOriginBox[id][IZ_SECOND_POINT][i]);
fMins[i] = fSize[i] / -2.0;
fMaxs[i] = fSize[i] / 2.0;
}
new iEnt = fm_create_cp_point(fCenter, fMins, fMaxs, "");
g_ipoints++;
g_iCurrentEnt[id] = iEnt;
client_cmd(id, "messagemode set_cp_mk");
client_printg(id, "> Enter the CP_Point description.");
}
}
return FMRES_IGNORED;
}
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 fm_create_cp_point(Float:fOrigin[3], Float:fMins[3], Float:fMaxs[3], const szTargetName[])
{
new iEnt = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"));
if(!iEnt)
return 0;
engfunc(EngFunc_SetOrigin, iEnt, fOrigin);
set_pev(iEnt, pev_classname, g_szIzClassName);
set_pev(iEnt, pev_targetname, szTargetName);
dllfunc(DLLFunc_Spawn, iEnt);
set_pev(iEnt, pev_movetype, MOVETYPE_FLY);
set_pev(iEnt, pev_solid, SOLID_TRIGGER);
engfunc(EngFunc_SetSize, iEnt, fMins, fMaxs);
return iEnt;
}
stock fm_draw_line(id, Float:x1, Float:y1, Float:z1, Float:x2, Float:y2, Float:z2, g_iColor[3])
{
message_begin(id ? MSG_ONE_UNRELIABLE : MSG_BROADCAST, SVC_TEMPENTITY, _, id ? id : 0);
write_byte(TE_BEAMPOINTS);
write_coord(floatround(x1));
write_coord(floatround(y1));
write_coord(floatround(z1));
write_coord(floatround(x2));
write_coord(floatround(y2));
write_coord(floatround(z2));
write_short(g_iBeamSprite);
write_byte(1);
write_byte(1);
write_byte(10);
write_byte(5);
write_byte(0);
write_byte(g_iColor[0]);
write_byte(g_iColor[1]);
write_byte(g_iColor[2]);
write_byte(200);
write_byte(0);
message_end();
}
stock client_printg(id, const message[], {Float, Sql, Resul,_}:...) {
static msg[192];
msg[0] = 0x04;
vformat(msg[1], 190, message, 3);
if( id > 0 && id <= g_iMaxPlayers)
{
message_begin(MSG_ONE, get_user_msgid("SayText"),_, id);
write_byte(id);
write_string(msg);
message_end();
}
else if(id == 0)
{
for( new i = 1; i <= g_iMaxPlayers; i++ )
{
if(!is_user_connected(i))
continue;
message_begin(MSG_ONE, get_user_msgid("SayText"),_, i);
write_byte(i);
write_string(msg);
message_end();
}
}
}
stock print_SayText(sender, receiver, const szMessage[])
{
static MSG_type, id;
if(receiver > 0)
{
MSG_type = MSG_ONE_UNRELIABLE;
id = receiver;
}
else
{
MSG_type = MSG_BROADCAST;
id = sender;
}
message_begin(MSG_type, get_user_msgid("SayText"), _, id);
write_byte(sender);
write_string(szMessage);
message_end();
return 1;
}
stock get_radio_num(const szRadioCode[])
{
for(new i = 0; i < sizeof g_szRadioCode; i++)
{
if(equali(g_szRadioCode[i], szRadioCode))
return i;
}
return -1;
}
stock str_piece(const input[], output[][], outputsize, piecelen, token = '|')
{
new i = -1, pieces, len = -1 ;
while ( input[++i] != 0 )
{
if ( input[i] != token )
{
if ( ++len < piecelen )
output[pieces][len] = input[i] ;
}
else
{
output[pieces++][++len] = 0 ;
len = -1 ;
if ( pieces == outputsize )
return pieces ;
}
}
return pieces + 1;
}
stock Float:get_float_difference(Float:num1, Float:num2)
{
if( num1 > num2 )
return (num1-num2);
else if( num2 > num1 )
return (num2-num1);
return 0.0;
}
stock fm_get_nearest_iz(id)
{
new Float:fPlrOrigin[3], Float:fNearestDist = 9999.0, iNearestEnt;
new Float:fOrigin[3], Float:fCurDist;
pev(id, pev_origin, fPlrOrigin);
new iEnt = -1;
while((iEnt = engfunc(EngFunc_FindEntityByString, iEnt, "classname", g_szIzClassName)) != 0)
{
pev(iEnt, pev_origin, fOrigin);
fCurDist = vector_distance(fPlrOrigin, fOrigin);
if(fCurDist < fNearestDist)
{
fNearestDist = fCurDist;
iNearestEnt = iEnt;
}
}
return iNearestEnt;
}