#include <amxmodx>
#include <amxmisc>
#include <engine>
#include <fakemeta>
#define PLUGIN "Escape Progress"
#define VERSION "1.0.2"
#define AUTHOR "Kia + Raheem"
#define EDITOR_FLAG ADMIN_BAN
#define CLASSNAME_CHECKPOINT "ZEV2_Checkpoint"
#define CHECKPOINT_MAX 20
#define CHECKPOINT_SIZE 150.0
#define CHECKPOINT_SPRITE "sprites/ZombieEscapeV2/checkpoint.spr"
new g_iPointsLoaded
new g_iPointsSet
new g_iPosition[33]
new g_iLines
new bool:g_bShowHUD
new g_aCheckpoints[CHECKPOINT_MAX][3]
new g_aCheckpointPositions[CHECKPOINT_MAX][2]
new g_szFileName[128]
new g_SyncObj
public plugin_precache()
{
precache_model(CHECKPOINT_SPRITE)
}
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
register_clcmd("say /editor", "ClCMD_Editor")
register_touch(CLASSNAME_CHECKPOINT, "player", "Touch_PlayerCheckpoint")
g_SyncObj = CreateHudSyncObj()
set_task(1.0, "RefreshCheckpointHUD", 0, "", 0, "b")
ReadMapName()
ReadCheckpoints()
SetCheckpoints()
}
public ze_user_infected()
{
for(new i = 0; i < g_iLines; i++)
{
g_aCheckpointPositions[i][0] = 0
g_aCheckpointPositions[i][1] = 0
}
arrayset(g_iPosition, charsmax(g_iPosition), CHECKPOINT_MAX + 2)
g_bShowHUD = true
}
public ze_roundend()
{
g_bShowHUD = false
for(new i = 0; i < g_iPointsSet; i++)
{
g_aCheckpointPositions[i][0] = 0
}
}
public ClCMD_Editor(id)
{
if(!(get_user_flags(id) & EDITOR_FLAG))
return PLUGIN_HANDLED
new menu = menu_create("Zombie Escape V2^nCheckpoint Editor Menu", "ClCMD_Editor_Handler")
new szMenuString[64]
formatex(szMenuString, charsmax(szMenuString), "Checkpoints set : \y%i", g_iPointsSet)
menu_additem(menu, szMenuString, "1", 0)
menu_addblank(menu, 0)
menu_additem(menu, "Add Checkpoint here", "2", 0)
menu_additem(menu, "Remove nearest Checkpoint", "3", 0)
menu_additem(menu, "Reload Checkpoint File", "4", 0)
menu_setprop(menu, MPROP_EXIT, MEXIT_ALL)
menu_display(id, menu, 0)
return PLUGIN_HANDLED
}
public ClCMD_Editor_Handler(id, menu, item)
{
new data[6], szName[64];
new access, callback;
menu_item_getinfo(menu, item, access, data,charsmax(data), szName,charsmax(szName), callback);
new key = str_to_num(data);
switch(key)
{
case 2: // Writing Checkpoint
{
new iFile = fopen(g_szFileName, "at")
if(iFile)
{
new iOrigin[3]
get_user_origin(id, iOrigin, 0)
new szOrigin[256]
formatex(szOrigin, charsmax(szOrigin), "%d %d %d^n", iOrigin[0],iOrigin[1],iOrigin[2])
fputs(iFile, szOrigin)
}
fclose(iFile)
}
case 3: // Removing nearest Checkpoint
{
new iEnt = GetNearestCheckpoint(id)
if(!iEnt)
{
log_amx("No Entity found!")
return PLUGIN_HANDLED
}
new Float:flOrigin[3]
pev(iEnt, pev_origin, flOrigin)
remove_entity(iEnt)
new iOrigin[3]
iOrigin[0] = floatround(flOrigin[0])
iOrigin[1] = floatround(flOrigin[1])
iOrigin[2] = floatround(flOrigin[2])
new iTempOrigin[3]
new iTempFile = fopen("ZEV2_Temp.cfg", "at")
new iFile = fopen(g_szFileName, "at")
if(iFile)
{
new szLineBuffer[64]
while(fgets(iFile, szLineBuffer, charsmax(szLineBuffer)))
{
parse(szLineBuffer, iTempOrigin[0], 7, iTempOrigin[1], 7, iTempOrigin[2], 7)
if(iTempOrigin[0] != iOrigin[0]
&& iTempOrigin[1] != iOrigin[1]
&& iTempOrigin[2] != iOrigin[2])
{
log_amx("Valid Entity found. To be deleted : %d %d %d - Found : %d %d %d.", iOrigin[0], iOrigin[1], iOrigin[2], iTempOrigin[0], iTempOrigin[1], iTempOrigin[2])
fputs(iTempFile, szLineBuffer)
}
else
{
log_amx("Invalid Entity found. Deleting : %d %d %d.", iOrigin[0], iOrigin[1], iOrigin[2])
}
}
fclose(iTempFile)
fclose(iFile)
delete_file(g_szFileName)
rename_file("ZEV2_Temp.cfg", g_szFileName, 1)
ReadCheckpoints()
RemoveAllCheckPoints()
SetCheckpoints()
}
}
case 4: // Reload Checkpoints
{
ReadCheckpoints()
RemoveAllCheckPoints()
SetCheckpoints()
}
}
return PLUGIN_HANDLED
}
public Touch_PlayerCheckpoint(iEnt, id)
{
new iCheckpointPos = entity_get_int(iEnt, EV_INT_iuser1)
if(g_iPosition[id] != iCheckpointPos)
{
g_iPosition[id] = iCheckpointPos
g_aCheckpointPositions[iCheckpointPos][is_user_T(id) ? 1 : 0]++
if(iCheckpointPos != 0)
g_aCheckpointPositions[iCheckpointPos - 1][is_user_T(id) ? 1 : 0]--
}
}
public RefreshCheckpointHUD()
{
if(!g_bShowHUD)
return PLUGIN_HANDLED
new szTopLane[128], szMidLane[128], szBotLane[128], szToAdd[128]
formatex(szTopLane, charsmax(szTopLane), "-----------^t^t^t ")
formatex(szMidLane, charsmax(szMidLane), "RUN >>>^t^t^t^t^t^t")
formatex(szBotLane, charsmax(szBotLane), "-----------^t^t^t ")
for(new i = 0; i < g_iPointsSet; i++)
{
formatex(szToAdd, charsmax(szToAdd), "[%i] ", g_aCheckpointPositions[i][0])
add(szTopLane, charsmax(szTopLane), szToAdd, charsmax(szToAdd))
formatex(szToAdd, charsmax(szToAdd), ">-->")
add(szMidLane, charsmax(szMidLane), szToAdd, charsmax(szToAdd))
formatex(szToAdd, charsmax(szToAdd), "[%i] ", g_aCheckpointPositions[i][1])
add(szBotLane, charsmax(szBotLane), szToAdd, charsmax(szToAdd))
}
formatex(szToAdd, charsmax(szToAdd), " ^t^t^t-----------")
add(szTopLane, charsmax(szTopLane), szToAdd, charsmax(szToAdd))
formatex(szToAdd, charsmax(szToAdd), "^t^t^t^t^t^t>>> END")
add(szMidLane, charsmax(szMidLane), szToAdd, charsmax(szToAdd))
formatex(szToAdd, charsmax(szToAdd), " ^t^t^t-----------")
add(szBotLane, charsmax(szBotLane), szToAdd, charsmax(szToAdd))
set_hudmessage(0, 255, 0, -1.0, 0.10, 0, 6.0, 1.0)
ShowSyncHudMsg(0, g_SyncObj, "Humans^n%s^n%s^n%s^nZombies", szTopLane, szMidLane, szBotLane)
return PLUGIN_HANDLED
}
public ReadMapName()
{
get_configsdir(g_szFileName, charsmax(g_szFileName))
static szMap[32]
get_mapname(szMap, charsmax(szMap))
formatex(g_szFileName, charsmax(g_szFileName), "%s\ZombieEscapeV2\map_checkpoints\%s.cfg", g_szFileName, szMap)
}
public ReadCheckpoints()
{
g_iPointsLoaded = 0
new iOrigin[3][8]
new iFile = fopen(g_szFileName, "r")
if(iFile)
{
new szLineBuffer[64]
while(fgets(iFile, szLineBuffer, charsmax(szLineBuffer)))
{
parse(szLineBuffer, iOrigin[0], 7, iOrigin[1], 7, iOrigin[2], 7)
g_aCheckpoints[g_iPointsLoaded][0] = str_to_num(iOrigin[0])
g_aCheckpoints[g_iPointsLoaded][1] = str_to_num(iOrigin[1])
g_aCheckpoints[g_iPointsLoaded][2] = str_to_num(iOrigin[2])
log_amx("[ZEV2: Checkpoints] Added Checkpoint at : %d %d %d", g_aCheckpoints[g_iPointsLoaded][0], g_aCheckpoints[g_iPointsLoaded][1], g_aCheckpoints[g_iPointsLoaded][2])
g_iPointsLoaded++
}
fclose(iFile)
}
}
public SetCheckpoints()
{
new iEnt
new Float:flOrigin[3]
for(new i = 0; i < g_iPointsLoaded; i++)
{
iEnt = create_entity("env_sprite")
entity_set_string(iEnt, EV_SZ_classname, CLASSNAME_CHECKPOINT)
entity_set_model(iEnt, CHECKPOINT_SPRITE)
entity_set_int(iEnt, EV_INT_spawnflags, SF_SPRITE_STARTON)
entity_set_float(iEnt, EV_FL_framerate, 30.0)
DispatchSpawn(iEnt)
flOrigin[0] = float(g_aCheckpoints[i][0])
flOrigin[1] = float(g_aCheckpoints[i][1])
flOrigin[2] = float(g_aCheckpoints[i][2])
entity_set_origin(iEnt, flOrigin)
entity_set_size(iEnt, Float:{-CHECKPOINT_SIZE, -CHECKPOINT_SIZE, -CHECKPOINT_SIZE}, Float:{CHECKPOINT_SIZE, CHECKPOINT_SIZE, CHECKPOINT_SIZE})
entity_set_int(iEnt, EV_INT_solid, SOLID_TRIGGER)
entity_set_int(iEnt, EV_INT_movetype, MOVETYPE_FLY)
entity_set_int(iEnt, EV_INT_rendermode, kRenderTransAdd)
entity_set_int(iEnt, EV_INT_iuser1, i)
log_amx("i is %i", i)
entity_set_float(iEnt, EV_FL_renderamt, 255.0)
entity_set_float(iEnt, EV_FL_scale, 1.0)
entity_set_float(iEnt, EV_FL_gravity,0.0)
g_iPointsSet++
}
}
public RemoveAllCheckPoints()
{
new ent = -1
while((ent = find_ent_by_class(ent,CLASSNAME_CHECKPOINT)))
{
remove_entity(ent)
}
}
public GetNearestCheckpoint(id)
{
new Float:flDist
new Float:flClosestDist = 9999.0
new iClosestEnt = 0
new ent = -1
while((ent = find_ent_by_class(ent,CLASSNAME_CHECKPOINT)))
{
flDist = entity_range(id, ent)
if(flDist < flClosestDist)
{
iClosestEnt = ent
flClosestDist = flDist
}
}
if(iClosestEnt)
{
log_amx("%i is the #1 closest at %i units", iClosestEnt, floatround(flClosestDist))
return iClosestEnt
}
return 0
}
stock is_user_T(id)
{
if(get_user_team(id) == 1)
return true;
return false;
}