Talking to people if they are near.
#1

I would like to ask on mostly ever RolePlay server you have to talk near the player or /do /me /low so only he can hear you...

PS:I ALREADY HAVE THOSE COMMANDS BUT HOW TO MAKE IT ONLY IF THE PLAYER IS RANGE OF 15points or something? And where to put it?
Reply
#2

https://sampwiki.blast.hk/wiki/IsPlayerInRangeOfPoint

Get the player's position that types the command and loop through the connected players (foreach is recommended). Check if each player (from the loop) is in range of point (by using the function above) and edit the range to 15 and the position of the player who typed the command. The 1st parameter would be the ID of the player (the number you loop). So if they're in range, show the message.
Reply
#3

ProxDetector(30.0, playerid, string, COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPL E,COLOR_PURPLE);
Reply
#4

Quote:
Originally Posted by whando
Посмотреть сообщение
ProxDetector(30.0, playerid, string, COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPL E,COLOR_PURPLE);
That bit of code is useless on its own.
Reply
#5

pawn Код:
stock nearByMessage(playerid, color, string[], Float: Distance = 12.0) {
    new
        Float: nbCoords[3];

    GetPlayerPos(playerid, nbCoords[0], nbCoords[1], nbCoords[2]);

    foreach(Player, i) {
        if(IsPlayerInRangeOfPoint(i, Distance, nbCoords[0], nbCoords[1], nbCoords[2]) && (GetPlayerVirtualWorld(i) == GetPlayerVirtualWorld(playerid))) {
            SendClientMessage(i, color, string);
        }
    }

    return 1;
}
Then use nearByMessage instead of SendClientMessage when you want to send it to near by players.
Reply
#6

Sorry noticed it didn't paste the other stuff

Код:
forward ProxDetector(Float:radi, playerid, string[],col1,col2,col3,col4,col5);
Код:
forward ProxDetectorS(Float:radi, playerid, targetid);
Код:
stock ProxDetector(Float:radi, playerid, string[],col1,col2,col3,col4,col5)
{
	if(IsPlayerConnected(playerid))
	{
		new Float:posx, Float:posy, Float:posz;
		new Float:oldposx, Float:oldposy, Float:oldposz;
		new Float:tempposx, Float:tempposy, Float:tempposz;
		new invehicle[MAX_PLAYERS];
		new virtualworld = GetPlayerVirtualWorld(playerid);
		new interior = GetPlayerInterior(playerid);
		new vehicleid = GetPlayerVehicleID(playerid);
		new ivehicleid;
		if(vehicleid)
		{
			GetVehiclePos(vehicleid,oldposx,oldposy,oldposz);
		}
		else
		{
			GetPlayerPos(playerid, oldposx, oldposy, oldposz);
			vehicleid = GetPlayerVehicleID(playerid);
		}
		for(new i; i<MAX_PLAYERS; i++)
		{
			if(IsPlayerConnected(i))
			{
			    if(!BigEar[i])
			    {
					if(GetPlayerVirtualWorld(i) == virtualworld)
					{
						if((GetPlayerInterior(i) == interior))
						{
						    if(vehicleid)
						    {
							    if(IsPlayerInVehicle(i,vehicleid))
							    {
	          						invehicle[i] = 1;
								}
							}
							if(!invehicle[i])
							{
							    if(IsPlayerInAnyVehicle(i))
								{
								    ivehicleid = GetPlayerVehicleID(i);
								    GetVehiclePos(ivehicleid,posx,posy,posz);
								} else {
					    			GetPlayerPos(i,posx,posy,posz);
								}
								tempposx = (oldposx -posx);
								tempposy = (oldposy -posy);
								tempposz = (oldposz -posz);
								if (((tempposx < radi/16) && (tempposx > -radi/16)) && ((tempposy < radi/16) && (tempposy > -radi/16)) && ((tempposz < radi/16) && (tempposz > -radi/16)))
								{
									SendSplitMessage(i, col1, string);
								}
								else if (((tempposx < radi/8) && (tempposx > -radi/8)) && ((tempposy < radi/8) && (tempposy > -radi/8)) && ((tempposz < radi/8) && (tempposz > -radi/8)))
								{
									SendSplitMessage(i, col2, string);
								}
								else if (((tempposx < radi/4) && (tempposx > -radi/4)) && ((tempposy < radi/4) && (tempposy > -radi/4)) && ((tempposz < radi/4) && (tempposz > -radi/4)))
								{
									SendSplitMessage(i, col3, string);
								}
								else if (((tempposx < radi/2) && (tempposx > -radi/2)) && ((tempposy < radi/2) && (tempposy > -radi/2)) && ((tempposz < radi/2) && (tempposz > -radi/2)))
								{
									SendSplitMessage(i, col4, string);
								}
								else if (((tempposx < radi) && (tempposx > -radi)) && ((tempposy < radi) && (tempposy > -radi)) && ((tempposz < radi) && (tempposz > -radi)))
								{
									SendSplitMessage(i, col5, string);
								}
							}
							else
							{
								SendSplitMessage(i, col1, string);
							}
						}
					}
				} else {
					SendSplitMessage(i, col1, string);
				}
			}
		}
	}
	return 1;
}

public ProxDetectorS(Float:radi, playerid, targetid)
{
    if(IsPlayerConnected(playerid)&&IsPlayerConnected(targetid))
	{
		new Float:posx, Float:posy, Float:posz;
		new Float:oldposx, Float:oldposy, Float:oldposz;
		new Float:tempposx, Float:tempposy, Float:tempposz;
		GetPlayerPos(playerid, oldposx, oldposy, oldposz);
		GetPlayerPos(targetid, posx, posy, posz);
		tempposx = (oldposx -posx);
		tempposy = (oldposy -posy);
		tempposz = (oldposz -posz);
		if(((tempposx < radi) && (tempposx > -radi)) && ((tempposy < radi) && (tempposy > -radi)) && ((tempposz < radi) && (tempposz > -radi)))
		{
			return 1;
		}
	}
	return 0;
}
Reply
#7

So i have this error now:@Smally
pawn Код:
error 035: argument type mismatch (argument 2)
The error is here:
pawn Код:
CMD:vengine(playerid, params[])
{
    new engine, lights, alarm, doors, bonnet, boot, objective, vehicleid;
    if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER) return SendClientMessage(playerid, COLOR_RED,"Your not driving any vehicle!");
    vehicleid = GetPlayerVehicleID(playerid);
    GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
    if(!engine)
    {
        new str[128];
        SetVehicleParamsEx(vehicleid, false, lights, alarm, doors, bonnet, boot, objective);
        format(str, sizeof(str), "* %s twistes the key and starts the engine", GetName(playerid));
        nearByMessage(COLOR_PINK, str); //LINE OF ERROR

    }
    else
    {
        SetVehicleParamsEx(vehicleid, true, lights, alarm, doors, bonnet, boot, objective);
    }
    return 1;
}
My GetName stock:
pawn Код:
stock GetName(playerid)
{
    new name[MAX_PLAYER_NAME];
    GetPlayerName(playerid, name, sizeof(name));
    return name;
}
nearByMessage(COLOR_PINK, str); //LINE OF ERROR

PLEASE HELP ME +REP
Reply
#8

pawn Код:
nearByMessage(playerid, COLOR_PINK, str);
Reply
#9

I have a better suggestion instead of the shitty proxdectector

1.) Create a dynamic area when a player logs on and attach it to the player.
native AttachDynamicAreaToPlayer(areaid, playerid);
2.) Create a iterator and add when a player enters the other players dynamic area / remove when a player leaves the other players dynamic area
3.) Simply iterate and message any players in the iterator (make sure you check if the player is in the dynamic area)

Last note....

Most useless line of code ever

pawn Код:
if(IsPlayerConnected(playerid)&&IsPlayerConnected(targetid))
Reply
#10

I have a stock function for you, which sends message to range players of specific position.

pawn Код:
SendMessageToRangePlayer(color, message[], x, y, z, range = 30.0)
pawn Код:
stock SendMessageToRangePlayer(color, message[], x, y, z, range = 30.0)
{
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
        if(IsPlayerConnected(i) && IsPlayerInRangeOfPoint(i, range, x, y, z))
        {
            SendClientMessage(i, color, message);
        }
    }
    return 1;
}
You can use as example below OnPlayerText.

pawn Код:
public OnPlayerText(playerid, text[])
{
    new Float:x, Float:y, Float:z;
    GetPlayerPos(playerid, x, y, z);
    new string[128], pName[MAX_PLAYER_NAME];
    GetPlayerName(playerid, pName, sizeof(pName));
    format(string, sizeof(string), "%s:  %s", pName[playerid], text);

    SendMessageToRangePlayer(-1, string, x, y, z);
    return 1;
}
Reply


Forum Jump:


Users browsing this thread: 3 Guest(s)