IsPlayerInRangePoint Help.... +Rep
#8

Again, it is still way more efficient to use y_iterate. I'll give an example (some snips of my old proximity mine script) in a sec (done).

Код:
#include <a_samp>
#include <sscanf>
#include <YSI\y_commands> // Or ZCMD. This system is compatible with both (as is all other scripts using ZCMD).
#include <YSI\y_iterate>

#define MAX_PROX 5 //Change to your liking.

new Iterator:Proximeter[MAX_PLAYERS]<MAX_OBJECTS>, bool:Active[MAX_OBJECTS];
CMD:prox(playerid, params[])
{
	if(Iter_Count(Proximeter[playerid]) == MAX_PROX)
		return SendClientMessage(playerid, -1, "You can't have more than 5 Proximity Mines planted.");
	
	new time;
	if(sscanf(params, "i", time))
		return SendClientMessage(playerid, COLOR_ERROR, "[Command] Error: /Prox <time before activation>");
	else if(5 > time > 30)
		return SendClientMessage(playerid, COLOR_ERROR, "[Command] Error: The timer can only be set between 5 and 30 seconds.");
	
	else
	{
		GetPlayerPos(playerid, nx, ny, z);
		new id = CreateObject(19602, nx, ny, nz, rx, ry, rz);
		Iter_Add(Proximeter[playerid], id);
		Active[id] = false;
		SetTimerEx("AddProx", time*1000, false, "i", id);
		return SendClientMessage(playerid, -1, sprintf("You now have %i Proximity Mine(s) planted.", Iter_Count(Proximeter[playerid])));
	}
}

forward AddProx(proxid); public AddProx(proxid)
{
	SetObjectMaterial(proxid, 0, -1, "none", "none", 0xFFFF0000); //Turns it red when active, nice touch!
	Active[proxid] = true; //Activates the proximeter.
	return 1;
}

public OnGameModeInit()
{
	Iter_Init(Proximeter);
	return 1;
}

public OnPlayerUpdate(playerid)
{
	foreach(new p : Player) //if(GetPlayerTeam(p) != GetPlayerTeam(playerid))// Remove this comment if you want to check the teams.
	foreach(new m : Proximeter[p]) if(Active[m])
	{
		new Float:P[3];
		GetObjectPos(m, P[0], P[1], P[2]);
		if(IsPlayerInRangeOfPoint(playerid, 10.0, P[0], P[1], P[2]))
		{
			Iter_Remove(Proximeter[p], m);
			DestroyObject(m);
			CreateExplosion(P[0], P[1], P[2], 6, 10.0);
		}
	}
	return 1;
}
Features:
- Sly use of y_iterate for object handling.
- Efficient foreach (aka y_iterate) loops, the loop will not even go on if the mines do not exist.
- Command with time to run away, used to activate the mines.
- Mines are green when inactive, but turn red when they are active.
- Explosions (because you said you like explosions ofc).

@Gammix, I'm not against your method at all, just pointing out the better efficiency of this method.
Reply


Messages In This Thread
IsPlayerInRangePoint Help.... +Rep - by kesarthakur - 12.04.2015, 05:06
Re: IsPlayerInRangePoint Help.... +Rep - by Gammix - 12.04.2015, 05:30
Re: IsPlayerInRangePoint Help.... +Rep - by kesarthakur - 12.04.2015, 05:34
Re: IsPlayerInRangePoint Help.... +Rep - by Crayder - 12.04.2015, 05:44
Re: IsPlayerInRangePoint Help.... +Rep - by kesarthakur - 12.04.2015, 05:46
Re: IsPlayerInRangePoint Help.... +Rep - by Crayder - 12.04.2015, 05:51
Re: IsPlayerInRangePoint Help.... +Rep - by Gammix - 12.04.2015, 05:51
Re: IsPlayerInRangePoint Help.... +Rep - by Crayder - 12.04.2015, 05:56
Re: IsPlayerInRangePoint Help.... +Rep - by kesarthakur - 12.04.2015, 08:01

Forum Jump:


Users browsing this thread: 1 Guest(s)