Доступ к готовым решениям

Переход в группу "Пользователь"

300.00
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

/cuff | /uncuff

Статус
В этой теме нельзя размещать новые ответы.

whale

/proger/
Регистрация
20 Сен 2013
Сообщения
1,076
Лучшие ответы
4
Репутация
421
Здравствуйте, уважаемые пользователи портала Pawno-Info.

Хочу представить Вам 2 команды:
/cuff - надеть наручники на игрока.
/uncuff - снять наручники с игрока.

ATTENTION: Да, на форуме есть подобные команды, но, по моему мнению, там очень много ненужного кода, да и, не особо оптимизированного.
Я же, в свою очередь, хочу показать Вам мою реализацию данных команд.

P.S Если у Вас есть предложения/замечания по коду и адекватная, объективная критика - буду рад видеть Вас в комментариях.


/cuff:
PHP:
CMD:cuff(playerid, params[])
{
    // Сюда ваши проверки на фракции/организации и т.д
    // Пример: if(pInfo[playerid][pFraction] != 1) return SendClientMessage(playerid, -1, !"Ошибка: Вам недоступна данная команда!");
    
	extract params -> new player:target; else
        return SendClientMessage(playerid, -1, !"Используйте: /cuff [ID игрока/часть NickName]");
        
    if(!IsPlayerConnected(target))
		return SendClientMessage(playerid, -1, !"Ошибка: указанного игрока нет на сервере!");
		
    if(target == playerid)
		return SendClientMessage(playerid, -1, !"Ошибка: Вы не можете надеть наручники на самого себя!");
		
    if(IsPlayerInAnyVehicle(playerid) || IsPlayerInAnyVehicle(target))
        return SendClientMessage(playerid, -1, !"Ошибка: Вы или указанный вами игрок не должны находиться в ТС!");
        
    if(GetPVarInt(target, "status_cuffed"))
		return SendClientMessage(playerid, -1, !"Ошибка: указанный игрок уже в наручниках!");
		
    if(0 == PlayerBesideTheOther(8.0, playerid, target))
		return SendClientMessage(playerid, -1, !"Ошибка: указанный игрок далеко от Вас!");

    new
        string[36 + MAX_PLAYER_NAME*2],
        playerid_name[MAX_PLAYER_NAME],
        target_name[MAX_PLAYER_NAME];

    GetPlayerName(playerid, playerid_name, MAX_PLAYER_NAME);
    GetPlayerName(target, target_name, MAX_PLAYER_NAME);

    format(string, sizeof(string), "Вы надели наручники на %s[%d].", target_name, target);
    SendClientMessage(playerid, -1, string);

    format(string, sizeof(string), "%s[%d] надел на Вас наручники.", playerid_name, playerid);
    SendClientMessage(playerid, -1, string);

    format(string, sizeof(string), " * %s[%d] надел наручники на %s[%d].", playerid_name, playerid, target_name, target);
    ProxDetector(playerid, 20.0, 0xC2A2DAAA, string);

    TogglePlayerControllable(target, 0);
    SetPlayerAttachedObject(target, 0, 19418, 6, -0.011000, 0.028000, -0.022000, -15.600012, -33.699977, -81.700035, 0.891999, 1.000000, 1.168000);
    SetPlayerSpecialAction(target, SPECIAL_ACTION_CUFFED);
    SetPVarInt(target, "status_cuffed", true);

    return 1;
}
/uncuff:
PHP:
CMD:uncuff(playerid, params[])
{
    // Сюда ваши проверки на фракции/организации и т.д
    // Пример: if(pInfo[playerid][pFraction] != 1) return SendClientMessage(playerid, -1, !"Ошибка: Вам недоступна данная команда!");
    
    extract params -> new player:target; else
        return SendClientMessage(playerid, -1, !"Используйте: /uncuff [ID игрока/часть NickName]");
        
    if(!IsPlayerConnected(target))
		return SendClientMessage(playerid, -1, !"Ошибка: указанного игрока нет на сервере!");

	if(target == playerid)
		return SendClientMessage(playerid, -1, !"Ошибка: Вы не можете снять наручники с самого себя!");

	if(IsPlayerInAnyVehicle(playerid) || IsPlayerInAnyVehicle(target))
        return SendClientMessage(playerid, -1, !"Ошибка: Вы или указанный вами игрок не должны находиться в ТС!");

	if(!GetPVarInt(target, "status_cuffed"))
		return SendClientMessage(playerid, -1, !"Ошибка: указанный игрок не в наручниках!");

	if(0 == PlayerBesideTheOther(8.0, playerid, target))
		return SendClientMessage(playerid, -1, !"Ошибка: указанный игрок далеко от Вас!");

    new
        string[34 + MAX_PLAYER_NAME*2],
        playerid_name[MAX_PLAYER_NAME],
        target_name[MAX_PLAYER_NAME];

    GetPlayerName(playerid, playerid_name, MAX_PLAYER_NAME);
    GetPlayerName(target, target_name, MAX_PLAYER_NAME);

    format(string, sizeof(string), "Вы сняли наручники с %s[%d].", target_name, target);
    SendClientMessage(playerid, -1, string);

    format(string, sizeof(string), "%s[%d] снял с Вас наручники.", playerid_name, playerid);
    SendClientMessage(playerid, -1, string);

    format(string, sizeof(string), " * %s[%d] снял наручники с %s[%d].", playerid_name, playerid, target_name, target);
    ProxDetector(playerid, 20.0, 0xC2A2DAAA, string);

    TogglePlayerControllable(target, 1);
    RemovePlayerAttachedObject(target, 0);
    SetPlayerSpecialAction(target, SPECIAL_ACTION_NONE);
    SetPVarInt(target, "status_cuffed", false);

    return 1;
}
Prox.Detector

PHP:
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(playerid, i)) {
            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;
}
 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу