| padilha007 |
03-17-2009 12:43 |
Re: Set checkpoints
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_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); }
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; new 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); menu_setprop(g_iMainMenu, MPROP_EXIT, MEXIT_ALL) 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 <= get_maxplayers()) { 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 <= get_maxplayers(); 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; }
|