PDA

Просмотр полной версии : [CMD] /try



L0ndl3m
12.01.2015, 21:45
CMD:try(playerid, params[]) {
if(isnull(params)) {
return SendClientMessage(playerid, -1, !"Используйте: /try [действие]");
}

const
SUCCESS_STR_LENGTH = 20;

static const
success_strings[2][(SUCCESS_STR_LENGTH + 1) char] = {
!" {1CEF00}| Удачно",
!" {FF0000}| Не удачно"
};

goto skip_string_init;
new
string[MAX_CHATBUBBLE_LENGTH + 1];
skip_string_init:

new
len = GetPlayerName(playerid, string, sizeof(string));

string[len] = ' ', string[len + 1] = EOS;
strcat(string, params);
string[sizeof(string) - len - SUCCESS_STR_LENGTH] = EOS;
strcat(string, success_strings[random(2)]);

new
player_world = GetPlayerVirtualWorld(playerid),
player_int = GetPlayerInterior(playerid),
Float: player_pos_x,
Float: player_pos_y,
Float: player_pos_z;

GetPlayerPos(playerid, player_pos_x, player_pos_y, player_pos_z);
for (new i = GetPlayerPoolSize()+1; i-- != 0;) {
if(IsPlayerConnected(i)
&& player_world == GetPlayerVirtualWorld(i)
&& player_int == GetPlayerInterior(i)
&& IsPlayerInRangeOfPoint(i, 10.0, player_pos_x, player_pos_y, player_pos_z)) {
SendClientMessage(i, 0xDD90FFFF, string);
}
}
return 1;
}


В игре это выглядит так:
http://ihost.pro-pawn.ru/image.php?di=19TK


Автор: L0ndl3m (http://pro-pawn.ru/member.php?2057-L0ndl3m)
Специально для: Pro-Pawn.Ru (http://pro-pawn.ru)

Копирование данной статьи без разрешения автора запрещено!

heralt
13.01.2015, 01:46
ща проверим)

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


Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase

работает все прекрасно, спасибо.

Salvacore
13.01.2015, 04:37
ща проверим)

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



работает все прекрасно, спасибо.


гералт проверил, я могу быть спокоен.

Mazzilla
13.01.2015, 15:14
гералт проверил, я могу быть спокоен.
Я бы не был спокоен без скриншота.

Adrenalin :3
22.07.2015, 15:21
Зачем так усложнять команду, можно же проще..

L0ndl3m
22.07.2015, 15:23
Зачем так усложнять команду, можно же проще..

Предложите-ка свой вариант. Хотя, я уже догадываюсь какой я код увижу...

Daniel_Cortez
22.07.2015, 16:44
Строки можно вынести в массив и упаковать для экономии памяти. По идее функция strcat должна будет автоматически распаковать их при конкатенации.
Второе добавление пробела (после strcat) можно убрать, вынеся пробел в упомянутые выше строки. В секции данных будет на 2 ячейки больше (на 1, если строки упакованы), но зато будет меньше кода - инструкции по добавлению пробела в строку занимают уж точно больше двух ячеек.
Сканирование игроков можно опционально сделать с использованием foreach.


#if defined foreach
foreach(new i:Player)
#else
for (new i = GetPlayerPoolSize()+1; i-- >= 0; )
#endif
if (...)
SendClientMessage(...);

Adrenalin :3
22.07.2015, 16:57
Предложите-ка свой вариант. Хотя, я уже догадываюсь какой я код увижу...

Ну код я думаю кидать нету смысла, он примитивный, но я ваш код не понимаю, сударь..

Роуди.
10.08.2015, 14:48
Ну код я думаю кидать нету смысла, он примитивный, но я ваш код не понимаю, сударь..

Если не понимаете код, то зачем вообще оставлять комментарий о том, что команда усложнена?

По сабжу: Реализация прекрасна.

wAx
11.08.2015, 20:32
format vs strcat
Лондляшь, ты любишь жесткий коддинг?)

Роуди.
14.08.2015, 20:56
format vs strcat
Лондляшь, ты любишь жесткий коддинг?)

по-моему, формат затратный чем "сцепление" строк?

wAx
15.08.2015, 00:15
по-моему, формат затратный чем "сцепление" строк?

не думаю что разница на столько велика, что вызов strcat 5 раз, будет быстрее format... хотя, я могу ошибаться

BadPawn
05.02.2016, 18:24
понять бы код этот о-о

underground
28.10.2016, 20:05
А что если так?

cmd:try(playerid, params[])
{
if (isnull(params))
return SendSyntaxMessage(playerid, "/try [описание]");

static
string[3+1+MAX_PLAYER_NAME+64];

format(string, sizeof(string), "%s (%s)", params, (!random(2)) ? ("неудачно") : ("удачно"));
SetPlayerChatBubble(playerid, string, COLOR_GREEN_17, 30.0, 10000);

SendNearbyMessage(playerid, 30.0, COLOR_GREEN_17, "%s %s. (%s)", ReturnName(playerid), params, (!random(2)) ? ("неудачно") : ("удачно"));
return 1;
}

m1n1vv
28.10.2016, 23:55
А что если так?

cmd:try(playerid, params[])
{
if (isnull(params))
return SendSyntaxMessage(playerid, "/try [описание]");

static
string[3+1+MAX_PLAYER_NAME+64];

format(string, sizeof(string), "%s (%s)", params, (!random(2)) ? ("неудачно") : ("удачно"));
SetPlayerChatBubble(playerid, string, COLOR_GREEN_17, 30.0, 10000);

SendNearbyMessage(playerid, 30.0, COLOR_GREEN_17, "%s %s. (%s)", ReturnName(playerid), params, (!random(2)) ? ("неудачно") : ("удачно"));
return 1;
}

Используешь никому неизвестную функцию SendNearbyMessage.