public OnPlayerText(playerid, text[])
{
if(!pInfo[playerid][pLogged]) return 0;
new playerName[64];
new chatColors = COLOR_CHAT_IC;
if(PlayerMasked[playerid])
{
format(playerName, sizeof(playerName), "Неизвестный [%d]", playerid);
chatColors = 0xA0A0A0FF;
}
else
{
format(playerName, sizeof(playerName), "%s [%d]", pInfo[playerid][pName], playerid);
}
new vehicleid = GetPlayerVehicleID(playerid);
new inVehicle = (vehicleid != 0);
new speakerWindowsClosed = 0;
if(inVehicle)
{
speakerWindowsClosed = vehicleWindowState[vehicleid];
}
foreach(new i : Player)
{
if(i == playerid) continue;
if(!pInfo[i][pLogged]) continue;
new listenerVehicleid = GetPlayerVehicleID(i);
new listenerInVehicle = (listenerVehicleid != 0);
new listenerWindowsClosed = 0;
if(listenerInVehicle)
{
listenerWindowsClosed = vehicleWindowState[listenerVehicleid];
}
new Float:distance = GetDistanceBetweenPlayers(playerid, i);
// Случай 1: ОБА игрока в транспорте
if(inVehicle && listenerInVehicle)
{
// Если они в одном транспорте
if(vehicleid == listenerVehicleid)
{
if(speakerWindowsClosed == 1)
{
// Окна закрыты - сообщение только внутри
new message[256];
format(message, sizeof(message), "(Внутри) %s говорит: %s", playerName, text);
SendClientMessage(i, chatColors, message);
}
else
{
// Окна открыты - обычное сообщение
new message[256];
format(message, sizeof(message), "[Транспорт] %s говорит: %s", playerName, text);
SendClientMessage(i, chatColors, message);
}
}
// Если в разных транспортах
else
{
// Говорящий с открытыми окнами И слушатель с открытыми окнами
if(speakerWindowsClosed == 0 && listenerWindowsClosed == 0)
{
if(distance <= 15.0)
{
new message[256];
format(message, sizeof(message), "[Транспорт] %s говорит: %s", playerName, text);
SendClientMessage(i, chatColors, message);
}
}
// Если у кого-то окна закрыты - не слышно
}
}
// Случай 2: Говорящий в транспорте, слушатель НЕ в транспорте
else if(inVehicle && !listenerInVehicle)
{
if(speakerWindowsClosed == 1)
{
// Если окна закрыты - снаружи не слышно
if(distance <= 15.0)
{
SetPlayerChatBubble(playerid, "Что-то говорит...", COLOR_CHAT_IC, 15.0, 3000);
ApplyAnimation(i, "PED", "IDLE_CHAT", 4.1, 0, 0, 0, 0, 0, 0);
}
}
else
{
// Если окна открыты - слышно с искажениями
if(distance <= 15.0)
{
new message[256];
format(message, sizeof(message), "[Транспорт] %s говорит: %s", playerName, text);
SendClientMessage(i, chatColors, message);
SetPlayerChatBubble(playerid, text, COLOR_CHAT_IC, 15.0, 3000);
ApplyAnimation(i, "PED", "IDLE_CHAT", 4.1, 0, 0, 0, 0, 0, 0);
}
}
}
// Случай 3: Говорящий НЕ в транспорте, слушатель в транспорте
else if(!inVehicle && listenerInVehicle)
{
// Если у слушателя закрыты окна - он не слышит речь снаружи
if(listenerWindowsClosed == 0)
{
// Окна открыты - слышно
if(distance <= 15.0)
{
new message[256];
format(message, sizeof(message), "%s говорит: %s", playerName, text);
SendClientMessage(i, chatColors, message);
SetPlayerChatBubble(playerid, text, COLOR_CHAT_IC, 15.0, 3000);
ApplyAnimation(i, "PED", "IDLE_CHAT", 4.1, 0, 0, 0, 0, 0, 0);
}
}
// Если окна закрыты - не отправляем сообщение
}
// Случай 4: ОБА игрока НЕ в транспорте
else if(!inVehicle && !listenerInVehicle)
{
if(distance <= 15.0)
{
new message[256];
format(message, sizeof(message), "%s говорит: %s", playerName, text);
SendClientMessage(i, chatColors, message);
SetPlayerChatBubble(playerid, text, COLOR_CHAT_IC, 15.0, 3000);
ApplyAnimation(i, "PED", "IDLE_CHAT", 4.1, 0, 0, 0, 0, 0, 0);
}
}
}
new selfMessage[256];
if(inVehicle)
{
if(speakerWindowsClosed == 1)
{
format(selfMessage, sizeof(selfMessage), "(Внутри) %s говорит: %s", playerName, text);
SetPlayerChatBubble(playerid, "Что-то говорит...", COLOR_CHAT_IC, 20.0, 3000);
}
else
{
format(selfMessage, sizeof(selfMessage), "[Транспорт] %s говорит: %s", playerName, text);
SetPlayerChatBubble(playerid, text, COLOR_CHAT_IC, 20.0, 3000);
}
}
else
{
format(selfMessage, sizeof(selfMessage), "%s говорит: %s", playerName, text);
SetPlayerChatBubble(playerid, text, COLOR_CHAT_IC, 15.0, 3000);
}
SendClientMessage(playerid, chatColors, selfMessage);
ApplyAnimation(playerid, "PED", "IDLE_CHAT", 4.1, 0, 0, 0, 0, 0, 0);
SetTimerEx("ResetAnimation", 3000, false, "i", playerid);
printf("[CHAT] %s: %s", playerName, text);
return 0;
}
Сообщение отредактировал Crestan Games: 09 января 2026 - 02:13
Вход
Регистрация
Помощь









