[ create a new paste ] login | about

Link: http://codepad.org/TaZqjozB    [ raw code | fork ]

C, pasted on Jul 13:
#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;
}


Create a new paste based on this one


Comments: