PDA

Просмотр полной версии : [Вопрос] Чат



Rick
05.08.2014, 22:57
Здравствуйте.
1. Возможно ли сделать так чтобы чат был на расстоянии, к примеру вы пишите в чат что то, а видят то что вы написал только те кто находятся более менее ближе к вам, или же расстояние по своему сделать)
2. Возможно ли сделать к примеру если вы пишите просто зажимая F6: Ты выходит текст на расстоянии ( из 1 - ого случая ), а если к примеру ввести (!) - то уже текст перейдет в общий чат и всё кто на сервере смогут увидеть что вы написали ( а не на расстоянии )

1. [R] Rick: Всем привет
2. (!) Rick: Всем привет

#ball
05.08.2014, 23:12
1.На работоспособность не проверял.


public OnPlayerText(playerid, text[])
{
SendMessages(playerid, text);
return 0;
}



stock SendMessages(i, text[])
{
new Float: t_pos_x, Float: t_pos_y, Float: t_pos_z,str[128];
GetPlayerPos(i, t_pos_x, t_pos_y, t_pos_z);
format(str, 128, "%s[%d]: %s", acInfo[i][acName], i, text);
foreach(new j:Player) if(IsPlayerInRangeOfPoint(j, 20.0, t_pos_x, t_pos_y, t_pos_z)) SendClientMessage(i,-1, str);
return 1;
}

Дёня
05.08.2014, 23:17
Здравствуйте.
1. Возможно ли сделать так чтобы чат был на расстоянии, к примеру вы пишите в чат что то, а видят то что вы написал только те кто находятся более менее ближе к вам, или же расстояние по своему сделать)
2. Возможно ли сделать к примеру если вы пишите просто зажимая F6: Ты выходит текст на расстоянии ( из 1 - ого случая ), а если к примеру ввести (!) - то уже текст перейдет в общий чат и всё кто на сервере смогут увидеть что вы написали ( а не на расстоянии )

1. [R] Rick: Всем привет
2. (!) Rick: Всем привет

1.
public OnPlayerText(playerid, text[])



new string[256];
new sendername[MAX_PLAYER_NAME];
GetPlayerName(playerid, sendername, sizeof(sendername));
format(string,sizeof string,"{FF8700}%s(%d): %s",sendername, playerid,text);
new Float:xpos,Float:ypos,Float:zpos;
GetPlayerPos(playerid,xpos,ypos,zpos);
for(new i=0;i<MAX_PLAYERS;i++){
if(IsPlayerInRangeOfPoint(i,50,xpos,ypos,zpos)) SendClientMessage(i,mescolor,string);
return false;
}

2.
Ко всем #define


#define fixchars(%1) for(new charfixloop=0;charfixloop<strlen(%1);charfixloop++)if(%1[charfixloop]<0)%1[charfixloop]+=256

В OnPlayerComm


fixchars(text);
if(text[0] == '!') {
new string[128];
GetPlayerName(playerid,string,sizeof(string));
format(string,sizeof(string),"Общий чат: %s(%d): %s",string,playerid,text[1]);
SendClientMessageToAll(COLOR_WHITE,string);
return 0;
}


- - - Добавлено - - -

Прошу прощения, ошибку допустил. Отредактирвоать, почему-то не могу

Вот это тоже в public OnPlayerText(playerid, text[])

fixchars(text);
if(text[0] == '!') {
new string[128];
GetPlayerName(playerid,string,sizeof(string));
format(string,sizeof(string),"Общий чат: %s(%d): %s",string,playerid,text[1]);
SendClientMessageToAll(COLOR_WHITE,string);
return 0;
}

Rick
06.08.2014, 00:25
Дёня,


D:\Ìîäû òðåáóåìûå, ñòàðûå\ñåðâåðà äëÿ [Gn_R]\gamemodes\modhost03.pwn(2606) : error 021: symbol already defined: "string"
D:\Ìîäû òðåáóåìûå, ñòàðûå\ñåðâåðà äëÿ [Gn_R]\gamemodes\modhost03.pwn(2613) : error 017: undefined symbol "mescolor"
D:\Ìîäû òðåáóåìûå, ñòàðûå\ñåðâåðà äëÿ [Gn_R]\gamemodes\modhost03.pwn(2617) : error 021: symbol already defined: "string"
D:\Ìîäû òðåáóåìûå, ñòàðûå\ñåðâåðà äëÿ [Gn_R]\gamemodes\modhost03.pwn(2618) : error 021: symbol already defined: "sendername"
Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase


4 Errors.

#ball
06.08.2014, 00:46
Пробуй мой:


public OnPlayerText(playerid, text[])
{
if(text[0] == "!")
{
new Float: t_pos_x, Float: t_pos_y, Float: t_pos_z,str[128],name[MAX_PLAYER_NAME];
GetPlayerName(playerid, name, MAX_PLAYER_NAME);
GetPlayerPos(playerid, t_pos_x, t_pos_y, t_pos_z);
format(str, 128, "[!]%s[%d]: %s", name, playerid, text[1]);
for(new i=0; i<MAX_PLAYERS; i++) if(IsPlayerInRangeOfPoint(i, 20.0, t_pos_x, t_pos_y, t_pos_z)) SendClientMessageToAll(-1, str);
}
else
{
new Float: t_pos_x, Float: t_pos_y, Float: t_pos_z,str[128],name[MAX_PLAYER_NAME];
GetPlayerName(playerid, name, MAX_PLAYER_NAME);
GetPlayerPos(playerid, t_pos_x, t_pos_y, t_pos_z);
format(str, 128, "[R]%s[%d]: %s", name, playerid, text);
for(new i=0; i<MAX_PLAYERS; i++) if(IsPlayerInRangeOfPoint(i, 20.0, t_pos_x, t_pos_y, t_pos_z)) SendClientMessage(i,-1, str);
}
return 0;
}


- - - Добавлено - - -

Ошибочка,вот исправил:


public OnPlayerText(playerid, text[])
{
new Float: t_pos_x, Float: t_pos_y, Float: t_pos_z,str[128],name[MAX_PLAYER_NAME];
GetPlayerName(playerid, name, MAX_PLAYER_NAME);
GetPlayerPos(playerid, t_pos_x, t_pos_y, t_pos_z);
if(text[0] == "!")
{
format(str, 128, "[!]%s[%d]: %s", name, playerid, text[1]);
SendClientMessageToAll(-1, str);
}
else
{
format(str, 128, "[R]%s[%d]: %s", name, playerid, text);
for(new i=0; i<MAX_PLAYERS; i++) if(IsPlayerInRangeOfPoint(i, 20.0, t_pos_x, t_pos_y, t_pos_z)) SendClientMessage(i,-1, str);
}
return 0;

Rick
06.08.2014, 00:50
#ball


D:\Ìîäû òðåáóåìûå, ñòàðûå\ñåðâåðà äëÿ [Gn_R]\gamemodes\modhost03.pwn(2600) : error 033: array must be indexed (variable "-unknown-")
Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase


1 Error.

L0ndl3m
06.08.2014, 00:53
В конец мода:


stock SCMToAllInRangeOfPoint(const playerid, const Float: range, const text[])
{
new
str[144],
Float: p_pos_x,
Float: p_pos_y,
Float: p_pos_z,
i = GetMaxPlayers();

GetPlayerName(playerid, str, sizeof(str));

format(str, 144, "%s[%i]: %s", str, playerid, text);

do
{
--i;
if(IsPlayerConnected(i) && IsPlayerInRangeOfPoint(i, range, p_pos_x, p_pos_y, p_pos_z))
SendClientMessage(i, -1, str);
}
while(i != 0);
}


Использование такое:

SCMToAllInRangeOfPoint(playerid, 10.0, text);

Rick
06.08.2014, 01:05
Londlem

Можно чутка по конкретнее?, вы создали сток, дали мне функцию для включения так сказать, но куда же её помещать? в OnplayerText ?, поместил, но почему то не работает.

A N D R E Y
06.08.2014, 06:05
Londlem

Можно чутка по конкретнее?, вы создали сток, дали мне функцию для включения так сказать, но куда же её помещать? в OnplayerText ?, поместил, но почему то не работает.
Зачем кидать в паблик, когда надо кидать в конец мода?

Rick
06.08.2014, 13:02
Зачем кидать в паблик, когда надо кидать в конец мода?

Вы меня не так поняли, я закинул сток в конец мода, но а функцию SCMToAllInRangeOfPoint(playerid, 10.0, text); незнал куда кидать . Не нужно позорить меня, тем что я как будто вообще нечего в скриптинге не понимаю. Это вы не поняли о чём идет речь.

#ball
06.08.2014, 13:48
Вы меня не так поняли, я закинул сток в конец мода, но а функцию SCMToAllInRangeOfPoint(playerid, 10.0, text); незнал куда кидать . Не нужно позорить меня, тем что я как будто вообще нечего в скриптинге не понимаю. Это вы не поняли о чём идет речь.


SCMToAllInRangeOfPoint(playerid, 10.0, text);
SCMToAllInRangeOfPoint - название функции
playerid - параметр,ид игрока для кого будет использоваться данная функция.
10.0 - расстояние,на котором будет виден текст
text - параметр с текстом,который будет выводиться игрокам.


Кидаете в OnplayerText


SCMToAllInRangeOfPoint(playerid, 10.0, text);

Можете данную функцию использовать где захотите,главное передать ид игрока,расстояние и текст.

Rick
06.08.2014, 15:03
Вы тоже слегка не допоняли, я же сказал что я "незнал куда кидать". Значит потом узнал), ну всё же спасибо за объяснение.

Rick
06.08.2014, 17:18
Пробуй мой:


public OnPlayerText(playerid, text[])
{
if(text[0] == "!")
{
new Float: t_pos_x, Float: t_pos_y, Float: t_pos_z,str[128],name[MAX_PLAYER_NAME];
GetPlayerName(playerid, name, MAX_PLAYER_NAME);
GetPlayerPos(playerid, t_pos_x, t_pos_y, t_pos_z);
format(str, 128, "[!]%s[%d]: %s", name, playerid, text[1]);
for(new i=0; i<MAX_PLAYERS; i++) if(IsPlayerInRangeOfPoint(i, 20.0, t_pos_x, t_pos_y, t_pos_z)) SendClientMessageToAll(-1, str);
}
else
{
new Float: t_pos_x, Float: t_pos_y, Float: t_pos_z,str[128],name[MAX_PLAYER_NAME];
GetPlayerName(playerid, name, MAX_PLAYER_NAME);
GetPlayerPos(playerid, t_pos_x, t_pos_y, t_pos_z);
format(str, 128, "[R]%s[%d]: %s", name, playerid, text);
for(new i=0; i<MAX_PLAYERS; i++) if(IsPlayerInRangeOfPoint(i, 20.0, t_pos_x, t_pos_y, t_pos_z)) SendClientMessage(i,-1, str);
}
return 0;
}


- - - Добавлено - - -

Ошибочка,вот исправил:


public OnPlayerText(playerid, text[])
{
new Float: t_pos_x, Float: t_pos_y, Float: t_pos_z,str[128],name[MAX_PLAYER_NAME];
GetPlayerName(playerid, name, MAX_PLAYER_NAME);
GetPlayerPos(playerid, t_pos_x, t_pos_y, t_pos_z);
if(text[0] == "!")
{
format(str, 128, "[!]%s[%d]: %s", name, playerid, text[1]);
SendClientMessageToAll(-1, str);
}
else
{
format(str, 128, "[R]%s[%d]: %s", name, playerid, text);
for(new i=0; i<MAX_PLAYERS; i++) if(IsPlayerInRangeOfPoint(i, 20.0, t_pos_x, t_pos_y, t_pos_z)) SendClientMessage(i,-1, str);
}
return 0;




D:\Ìîäû òðåáóåìûå, ñòàðûå\ñåðâåðà äëÿ [Gn_R]\gamemodes\modhost03.pwn(2601) : error 033: array must be indexed (variable "-unknown-")
Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase


1 Error.

L0ndl3m
06.08.2014, 18:00
Старую функцию на эту замените:


stock SCMToAllInRangeOfPoint(const playerid, const bool: v, const text[])
{
new
str[144],
p_name[MAX_PLAYER_NAME + 1],
i = GetMaxPlayers();

GetPlayerName(playerid, p_name, sizeof(p_name));

do
{
if(IsPlayerConnected(--i))
{
format(str, 144, "[%c] %s[%i]: %s", v ? ('!') : ('R'), p_name, playerid, text);
SendClientMessage(i, -1, str);
}
}
while(i != 0);
}