PDA

View Full Version : Talking to people if they are near.


Mey6155
16/11/2013, 12:10 PM
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?

Konstantinos
16/11/2013, 12:14 PM
http://wiki.sa-mp.com/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.

whando
16/11/2013, 12:17 PM
ProxDetector(30.0, playerid, string, COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPL E,COLOR_PURPLE);

PrivatioBoni
16/11/2013, 12:20 PM
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. :)

Smally
16/11/2013, 12:25 PM
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.

whando
16/11/2013, 12:29 PM
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;
}

Mey6155
16/11/2013, 01:09 PM
So i have this error now:@Smally

error 035: argument type mismatch (argument 2)

The error is here:

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:

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

Konstantinos
16/11/2013, 01:32 PM
nearByMessage(playerid, COLOR_PINK, str);

Pottus
16/11/2013, 01:53 PM
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

if(IsPlayerConnected(playerid)&&IsPlayerConnected(targetid))

Skimmer
16/11/2013, 02:04 PM
I have a stock function for you, which sends message to range players of specific position.

SendMessageToRangePlayer(color, message[], x, y, z, range = 30.0)

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.

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;
}

Pottus
16/11/2013, 02:27 PM
I say BOO to IsPlayerInRangeOfPoint() :)

Mey6155
17/11/2013, 07:53 AM
I need just if someone presses T only 10 range can hear him the rest of the people arn't hearing him

Smally
17/11/2013, 02:25 PM
Simply use nearByMessage under OnPlayerText:

nearByMessage(playerid, colorName, stringName) that will then foreach for near by players.