public void CreateTrigger(int zone)
{
	if ((g_fStartOrigins[zone][0] == 0.0) && (g_fStartOrigins[zone][1] == 0.0) && (g_fStartOrigins[zone][2] == 0.0) && (g_fEndOrigins[zone][0] == 0.0) && (g_fEndOrigins[zone][1] == 0.0) && (g_fEndOrigins[zone][2] == 0.0))
		return;
		
	if (g_iTriggerEnt[zone] > -1)
	{
		if (IsValidEntity(g_iTriggerEnt[zone]))
		{
			AcceptEntityInput(g_iTriggerEnt[zone], "Kill");
		}
		g_iTriggerEnt[zone] = -1;
	}
	
	float max[3];
	float min[3];

	min = g_fStartOrigins[zone];
	max = g_fEndOrigins[zone];

	char name[12];
	if (zone == 0)
		Format(name, sizeof name, "start");
	if (zone == 1)
		Format(name, sizeof name, "end");
		
	float mid[3] = 0.0;
	max[2]+=100;

	GetMiddleOfABox(max, min, mid);
	min[0] = min[0] - mid[0];
	if(min[0] > 0.0)
	min[0] *= -1.0;
	min[1] = min[1] - mid[1];
	if(min[1] > 0.0)
	min[1] *= -1.0;
	min[2] = min[2] - mid[2];
	if(min[2] > 0.0)
	min[2] *= -1.0;

	max[0] = max[0] - mid[0];
	if(max[0] < 0.0)
	max[0] *= -1.0;
	max[1] = max[1] - mid[1];
	if(max[1] < 0.0)
	max[1] *= -1.0;
	max[2] = max[2] - mid[2];
	if(max[2] < 0.0)
	max[2] *= -1.0;

	g_iTriggerEnt[zone] = CreateEntityByName("trigger_multiple");

	DispatchKeyValue(g_iTriggerEnt[zone], "spawnflags", "1");
	DispatchKeyValue(g_iTriggerEnt[zone], "targetname", name);
	
	DispatchKeyValue(g_iTriggerEnt[zone], "wait", "0");

	DispatchSpawn(g_iTriggerEnt[zone]);
	ActivateEntity(g_iTriggerEnt[zone]);
	
	//PrintToServer("Dispatched and activated %s", name);
	
	TeleportEntity(g_iTriggerEnt[zone], mid, NULL_VECTOR, NULL_VECTOR);
	SetEntityModel(g_iTriggerEnt[zone], "models/error.mdl");
	
	//PrintToServer("Teleported and set model %s", name);
	
	SetEntPropVector(g_iTriggerEnt[zone], Prop_Send, "m_vecMins", min);
	SetEntPropVector(g_iTriggerEnt[zone], Prop_Send, "m_vecMaxs", max);
	SetEntProp(g_iTriggerEnt[zone], Prop_Send, "m_nSolidType", 2);
	
	//PrintToServer("Set vecs and solidtype %s", name);
	
	int iEffects = GetEntProp(g_iTriggerEnt[zone], Prop_Send, "m_fEffects");
	iEffects |= 0x020;
	SetEntProp(g_iTriggerEnt[zone], Prop_Send, "m_fEffects", iEffects);
	
	//PrintToServer("Set effects %s", name);

	SDKHook(g_iTriggerEnt[zone], SDKHook_StartTouch, zoneStartTouch);
	SDKHook(g_iTriggerEnt[zone], SDKHook_EndTouch, zoneEndTouch);
	
	//PrintToServer("Hooks Hooked %s", name);
}

public Action zoneEndTouch (int caller, int client)
{
	if (!isValidClient(client) || client == g_iEditor || !g_bActive)
		return;


	char trigName[16];
	GetEntPropString(caller, Prop_Data, "m_iName", trigName, sizeof trigName);
	
	//Player is Exiting Start Zone
	if (StrEqual(trigName, "start"))
	{
		//Player is on starzone state, start run
		if (g_iActivity[client] == 1)
		{
			CheckSpeed(client);
			g_iActivity[client] = 0;
			g_fStartTime[client] = GetEngineTime();
			g_arrayRun[client].Clear();
		}
	}
	
	//Player is Exiting End Zone
	if (StrEqual(trigName, "end"))
	{
		//Set Player Inactive
		g_iActivity[client] = -1;
		//EndZoneRoutine(client);
	}
}

public Action zoneStartTouch (int caller, int client)
{
	if (!isValidClient(client) || client == g_iEditor || !g_bActive)
		return;
	
	char trigName[16];
	GetEntPropString(caller, Prop_Data, "m_iName", trigName, sizeof trigName);
	
	//Player is Entering Start Zone
	if (StrEqual(trigName, "start"))
	{
		//Player teleported from endzone, exec endzoneroutine before reset
		if (g_iActivity[client] == 2)
		{
			//EndZoneRoutine(client);
		}
		//TODO: Reset record array;
		g_iActivity[client] = 1;
	}
	
	if (StrEqual(trigName, "end"))
	{
		if (g_iActivity[client] == 0)
		{
			ProcessFinish(client);
			g_iActivity[client] = 2;
		}
	}
}

/*public void EndZoneRoutine(int client)
{
	//TODO: Save Bot if needed
	
}*/