public OnPlayerText(playerid, text[])
{
if(PlayerLogin[playerid] == false) return true;
{
new string[128];
if(GetPlayerState(playerid) == PLAYER_STATE_ONFOOT && !PlayerCuffed{playerid})
{
if(IsAGang(playerid))
{
switch(random(7))
{
case 0: ApplyAnimation(playerid,"GHANDS","gsign2",4.0,0,1,1,1,1,1);
case 1: ApplyAnimation(playerid,"GHANDS","gsign4LH",4.0,0,1,1,1,1,1);
case 2: ApplyAnimation(playerid,"GHANDS","gsign3LH",4.0,0,1,1,1,1,1);
case 3: ApplyAnimation(playerid,"GHANDS","gsign4",4.0,0,1,1,1,1,1);
case 4: ApplyAnimation(playerid,"GHANDS","gsign2LH",4.0,0,1,1,1,1,1);
case 5: ApplyAnimation(playerid,"GHANDS","gsign5",4.0,0,1,1,1,1,1);
case 6: ApplyAnimation(playerid,"GHANDS","gsign5LH",4.0,0,1,1,1,1,1);
}
}
else ApplyAnimation(playerid,"PED","IDLE_CHAT",4.0,0,1,1,1,1,1);
SetTimerEx("ClearAnim",2000,false,"i",playerid);
}
foreach(new i: Player)
{
new Float:rdist,c;
rdist = GetPlayerDistanceToPlayer(playerid,i);
if (rdist > 14.0 || GetPlayerVirtualWorld(playerid) != GetPlayerVirtualWorld(i)) continue;
switch(floatround(rdist))
{
case 0..4: c = 0xFFFFFFFF;
case 5..8: c = 0xCCCCCCFF;
case 9..14: c = 0xAAAAAAFF;
default: c = 0x888888FF;
}
if(FormaFrac[playerid] == 0)
{
format(string,sizeof(string),"- %s (%s)[%d]",text,PlayerInfo[playerid][pNamePlayer],playerid);
}
else
{
format(string,sizeof(string),"- %s {%s}(%s)[%d]",text,GetFractionColor[PlayerInfo[playerid][pMember]],PlayerInfo[playerid][pNamePlayer],playerid);
}
SendClientMessage(i,c,string);
}
SetPlayerChatBubble(playerid, text, COLOR_WHITE, 20.0, 10000);
return false;
}
return true;
}
плюс в конце return true; выдает варнинг |
if(PlayerLogin[playerid] == false) return true; { // Код... }
if(PlayerLogin[playerid] == false) return true; // Код...
if(PlayerLogin[playerid] == true) { // Код }
public OnPlayerText(playerid, text[])
{
if(PlayerLogin[playerid] == true)
{
if(GetPlayerState(playerid) == PLAYER_STATE_ONFOOT && !PlayerCuffed{playerid})
{
if(IsAGang(playerid))
{
switch(random(7))
{
case 0: ApplyAnimation(playerid,"GHANDS","gsign2",4.0,0,1,1,1,1,1);
case 1: ApplyAnimation(playerid,"GHANDS","gsign4LH",4.0,0,1,1,1,1,1);
case 2: ApplyAnimation(playerid,"GHANDS","gsign3LH",4.0,0,1,1,1,1,1);
case 3: ApplyAnimation(playerid,"GHANDS","gsign4",4.0,0,1,1,1,1,1);
case 4: ApplyAnimation(playerid,"GHANDS","gsign2LH",4.0,0,1,1,1,1,1);
case 5: ApplyAnimation(playerid,"GHANDS","gsign5",4.0,0,1,1,1,1,1);
case 6: ApplyAnimation(playerid,"GHANDS","gsign5LH",4.0,0,1,1,1,1,1);
}
}
else ApplyAnimation(playerid,"PED","IDLE_CHAT",4.0,0,1,1,1,1,1);
SetTimerEx("ClearAnim",2000,false,"i",playerid);
}
new string[144], rdist, c, myWorld = GetPlayerVirtualWorld(playerid);// 144 - смотри предел клиента на вывод в чат строки.
if(FormaFrac[playerid] == 0) {
format(string,sizeof(string),"- %s (%s)[%d]",text,PlayerInfo[playerid][pNamePlayer],playerid);
} else {
format(string,sizeof(string),"- %s {%s}(%s)[%d]",text,GetFractionColor[PlayerInfo[playerid][pMember]],PlayerInfo[playerid][pNamePlayer],playerid);
}
foreach(new i: Player) {
if (myWorld != GetPlayerVirtualWorld(i)) continue;// не нужно считать расстояние, если в другом мире
rdist = floatround(GetPlayerDistanceToPlayer(playerid,i));
if (rdist > 14.0) continue;//
if(rdist > 8) c = 0xAAAAAAFF;
else if(rdist > 4) c = 0xCCCCCCFF;
else c = 0xFFFFFFFF;
SendClientMessage(i,c,string);
}
SetPlayerChatBubble(playerid, text, COLOR_WHITE, 20.0, 10000);
return false;
}
return true;
}
А сам то как считаешь? У тебя:
1) объявления в циклах. 2) ты обращаешься к функции взятия виртуального мира одного и того же игрока столько же раз, сколько и игроков на сервере. 3) расстояние между игроками у тебя то через float... функции сравнивается, то преобразовывается до целочисленного (не думал сразу возвращать целочисленный рез-тат, чтобы исключить floatcmp? 4) Не думал, что в форматах у тебя выполняется лишняя работа по генерации одного и того же текста ровно ( количество игроков онлайн -1) раз? 5) зачем тебе "default: c = 0x888888FF;" - у тебя по rdist уже стоит ограничение исключающее этот случай. |
public OnPlayerText(playerid, text[])
{
if(!PlayerLogin[playerid]) return 0;
if(GetPlayerState(playerid) == PLAYER_STATE_ONFOOT && !PlayerCuffed{playerid})
{
if(!IsAGang(playerid)) ApplyAnimation(playerid, "PED", "IDLE_CHAT", 4.0, 0, 1, 1, 1, 1, 1);
else
{
new gsign[7][9] = {"gsign2", "gsign4LH", "gsign3LH", "gsign4", "gsign2LH", "gsign5", "gsign5LH"};
ApplyAnimation(playerid, "GHANDS", gsign[random(7)], 4.0, 0, 1, 1, 1, 1, 1);
}
SetTimerEx("ClearAnim", 2000, 0, "i", playerid);
}
new string[144], rdist, c = 0xFFFFFFFF, myWorld = GetPlayerVirtualWorld(playerid);
if(!FormaFrac[playerid]) format(string, sizeof(string), "- %s (%s)[%d]", text, PlayerInfo[playerid][pNamePlayer], playerid);
else format(string, sizeof(string), "- %s {%s}(%s)[%d]", text, GetFractionColor[PlayerInfo[playerid][pMember]], PlayerInfo[playerid][pNamePlayer], playerid);
foreach(new i: Player)
{
if(myWorld != GetPlayerVirtualWorld(i)) continue;
rdist = floatround(GetPlayerDistanceToPlayer(playerid, i));
if(rdist > 14.0) continue;
if(rdist > 8.0) c = 0xAAAAAAFF;
else if(rdist > 4.0) c = 0xCCCCCCFF;
SendClientMessage(i, c, string);
}
SetPlayerChatBubble(playerid, text, COLOR_WHITE, 20.0, 10000);
return 0;
}
stock ProxDetector(playerid, Float:max_range, color, string[], Float:max_ratio = 1.6)
{
new
Float:pos_x,
Float:pos_y,
Float:pos_z,
Float:range,
Float:range_ratio,
Float:range_with_ratio,
clr_r, clr_g, clr_b,
Float:color_r, Float:color_g, Float:color_b;
if (!GetPlayerPos(playerid, pos_x, pos_y, pos_z)) {
return 0;
}
color_r = float(color >> 24 & 0xFF);
color_g = float(color >> 16 & 0xFF);
color_b = float(color >> 8 & 0xFF);
range_with_ratio = max_range * max_ratio;
#if defined foreach
foreach (new i : Player) {
#else
for (new i = GetPlayerPoolSize(); i != -1; i--) {
#endif
if (!IsPlayerStreamedIn(i, playerid)) {
continue;
}
range = GetPlayerDistanceFromPoint(i, pos_x, pos_y, pos_z);
if (range > max_range) {
continue;
}
range_ratio = (range_with_ratio - range) / range_with_ratio;
clr_r = floatround(range_ratio * color_r);
clr_g = floatround(range_ratio * color_g);
clr_b = floatround(range_ratio * color_b);
SendClientMessage(i, (color & 0xFF) | (clr_b << 8) | (clr_g << 16) | (clr_r << 24), string);
}
SendClientMessage(playerid, color, string);
return 1;
}
SendClientMessage(playerid, floatround(4294967295 - 89829376*(dist/(range/6))), text);
stock ProxDetector_OK(Float:radius = 30.0, playerid, text[], col1 = 0xFFFFFFFF, col2 = 0xCCCCCCFF, col3 = 0x999999FF, col4 = 0x666666FF, col5 = 0x333333FF)
{
// SetPlayerChatBubble(playerid, text, col1, radius, 5 * 1000);
new Float:x, Float:y, Float:z;
GetPlayerPos(playerid, x, y, z);
for(new i = GetPlayerPoolSize(), Float:dist, virtualworld = GetPlayerVirtualWorld(playerid), interior = GetPlayerInterior(playerid); i != -1; i--)
{
if(!IsPlayerConnected(i) || IsPlayerNPC(i) || virtualworld != GetPlayerVirtualWorld(i) || interior != GetPlayerInterior(i)) continue;
dist = GetPlayerDistanceFromPoint(i, x, y, z);
if(dist < radius / 16) SendClientMessage(i, col1, text);
else if(dist < radius / 8) SendClientMessage(i, col2, text);
else if(dist < radius / 4) SendClientMessage(i, col3, text);
else if(dist < radius / 2) SendClientMessage(i, col4, text);
else if(dist < radius) SendClientMessage(i, col5, text);
}
return 1;
}
[pawn]
Кстати, сделай замер скорости с: pawn Код:
|
Радиус заранее известен, а дистанцию всё равно получать для каждого игрока.
|
А если твоя реализация функции будет использоваться на больших расстояниях?
|
Плюс её (IsPlayerStreamedIn) аргументы следует поменять местами: справедливо ли утверждение о том, что если у первого игрока застримен второй, у второго первый игрок будет всегда взаимно застримен?
|
Об этом кстати говорится на вики: https://sampwiki.blast.hk/wiki/IsPlayerStreamedIn что может произойти, что игроку i игрок playerid не будет подгружен, хотя обратное - верно.
|