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

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

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

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

Мануал Система Дуэлей

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

AndreY.eXe

Специалист
Привет!

Да, видел я одну систему, но она для ДМ сервера (С выбором карты и тд), а эту я делаю для РП серверов.
Суть: Вы предлагаете игроку дуель на указанную Вами ставку и если игрок соглашается, то идет отсчет (10 секунд), после чего дуэль начинается. При этому, у Вас и у Вашего соперника в руках должно быть какое-то оружие.
Приступим:

Ко всем переменным:
PHP:
new DuelOffer[MAX_PLAYERS]; // Кто кому предложил дуэль и наоборот
new timeduel[MAX_PLAYERS]; // Специально, чтобы отсчитывать секунды
new DuelTimer[MAX_PLAYERS]; // Таймер
new DuelCash[MAX_PLAYERS]; // Ставка
В OnPlayerConnect:
PHP:
	DuelOffer[playerid] = -1;
	timeduel[playerid] = 11;
Ко всем командам:
PHP:
CMD:duel(playerid, params[])
{
    new id, cash, string[400];
    if(GetPVarInt(playerid, "antifloodduel") > gettime())return SendClientMessage(playerid, -1, "Предлагать дуэли можно раз в минуту!");
	if(sscanf(params, "ii", id, cash))return SendClientMessage(playerid, -1, "Используй: /duel [id игрока] [ставка]");
	if(!ProxDetectorS(10, playerid, id))return SendClientMessage(playerid, -1, "Вы далеко друг от друга!");
	if(DuelOffer[id] != -1)return SendClientMessage(playerid, -1, "Данному игроку уже предложили дуэль!");
	if(DuelOffer[id] == playerid)return SendClientMessage(playerid, -1, "Вы уже предложили дуэль данному игроку!");
	if(cash < 1000 || cash > 10000)return SendClientMessage(playerid, -1, "Нельзя предложить меньше 1.000$ или больше 10.000$!");
	if(playerid == id)return SendClientMessage(playerid, -1, "Нельзя самому себе предложить дуэль!");
	new bool: gun = false;
	new ammo, gunid;
	new ammo2, gunid2;
	for(new i; i < 13; i ++)
	{
		GetPlayerWeaponData(id, i, gunid, ammo);
		GetPlayerWeaponData(playerid, i, gunid2, ammo2);
		if(!gunid || !ammo) continue;
		if(!gunid2 || !ammo2) continue;
		gun = true;
		break;
	}
	if(!gun)return SendClientMessage(playerid, -1, "У Вас или же у Вашего соперника нет оружия!");
	SendClientMessage(playerid, -1, "Вы успешно предложили игроку дуэль!");
	new Name[MAX_PLAYER_NAME];
	GetPlayerName(playerid, Name, MAX_PLAYER_NAME);
	f("Игрок {99CC00}%s[%d] {ffffff}предлагает Вам дуэль на {99CC00}%d${ffffff}!", Name, playerid, cash);
	ShowPlayerDialog(id, 3000, 0, "Дуэль", string, "Принять", "Отклонить");
	DuelOffer[id] = playerid;
	DuelCash[id] = cash;
	DuelCash[playerid] = cash;
	DuelOffer[playerid] = id;
	return true;
}
В OnPlayerDialogResponse
PHP:
		case 3000:
		{
		    new id = DuelOffer[playerid];
		    if(!response)
			{
				SendClientMessage(id, -1, "Игрок отказался от дуэля!");
				SendClientMessage(playerid, -1, "Вы успешно отказались от дуэля!");
				DuelOffer[playerid] = -1;
				DuelOffer[id] = -1;
				DuelCash[id] = 0;
				DuelCash[playerid] = 0;
				return true;
			}
		    if(!ProxDetectorS(10, playerid, id))
			{
                DuelOffer[playerid] = -1;
				DuelOffer[id] = -1;
				DuelCash[id] = 0;
				DuelCash[playerid] = 0;
				SendClientMessage(playerid, -1, "Вы далеко друг от друга!");
				return true;
			}
		    if(GetMoney(playerid) < DuelCash[playerid] || GetMoney(id) < DuelCash[playerid])
			{
				SendClientMessage(playerid, -1, "У Вас или у Вашего соперника не достаточно денег!");
                                SendClientMessage(id, -1, "У Вас или у Вашего соперника не достаточно денег!");
				DuelOffer[playerid] = -1;
				DuelOffer[id] = -1;
				DuelCash[id] = 0;
				DuelCash[playerid] = 0;
				return true;
			}
		    SendClientMessage(playerid, -1, "Вы приняли дуэль! Дуэль начнется через 10 секунд.");
		    SendClientMessage(id, -1, "Игрок принял дуэль! Дуэль начнется через 10 секунд.");
		    DuelTimer[playerid] = SetTimerEx("DuelOn", 1000, true, "ii", playerid, id);
		    SetPVarInt(playerid, "antifloodduel", gettime()+60);
		    TogglePlayerControllable(playerid, 0);
		    TogglePlayerControllable(id, 0);
		}
В любое место:
PHP:
forward DuelOn(playerid, id);
public DuelOn(playerid, id)
{
	new string[50];
    timeduel[playerid]--;
    f("~g~Duel: %d", timeduel[playerid]);
	GameTextForPlayer(playerid, string, 1000, 3);
	GameTextForPlayer(id, string, 1000, 3);
    if(timeduel[playerid] <= 0)
    {
        if(!IsPlayerConnected[id] || !IsPlayerConnected[playerid])
		{
			SendClientMessage(id, -1, "Один из игроков вышел!");
			SendClientMessage(playerid, -1, "Один из игроков вышел!");
			KillTimer(DuelTimer[playerid]);
        	timeduel[playerid] = 11;
        	DuelOffer[playerid] = -1;
			DuelOffer[id] = -1;
			DuelCash[id] = 0;
			DuelCash[playerid] = 0;
        	return false;
		}
        KillTimer(DuelTimer[playerid]);
        timeduel[playerid] = 11;
        SendClientMessage(playerid, -1, "Дуэль начался!");
        SendClientMessage(id, -1, "Дуэль начался!");
        TogglePlayerControllable(id, 1);
        TogglePlayerControllable(playerid, 1);
    }
	return true;
}
В OnPlayerDeath
PHP:
	if(DuelOffer[playerid] == killerid && DuelOffer[killerid] == playerid)
	{
	    SendClientMessage(playerid, -1, "Вы проиграли в дуэле!");
		f("Поздравляем! Вы выйграли в дуэле и получили %d$.", DuelCash[playerid]);
	    SendClientMessage(killerid, -1, string);
		GivePlayerMoney(killerid, DuelCash[playerid]);
		GivePlayerMoney(playerid, -DuelCash[playerid]);
		DuelOffer[playerid] = -1;
		DuelOffer[killerid] = -1;
		DuelCash[killerid] = 0;
		DuelCash[playerid] = 0;
	}
И в OnPlayerDisconnect:
PHP:
    if(DuelOffer[playerid] != -1)
	{
	    new id = DuelOffer[playerid];
		SendClientMessage(id, -1, "Игрок вышел!");
		KillTimer(DuelTimer[playerid]);
    	timeduel[playerid] = 11;
    	DuelOffer[playerid] = -1;
		DuelOffer[id] = -1;
		DuelCash[id] = 0;
		DuelCash[playerid] = 0;
	}
PHP:
#define f(  			format(string, sizeof(string),

stock ProxDetectorS(Float:radi, playerid, targetid, spec = 0)
{
	new Float:p[3];
	if(!IsPlayerConnected(playerid)) return false;
	if(!IsPlayerConnected(targetid)) return false;
	if(!spec)
	{
		if(GetPlayerState(playerid) == 9) return false;
		if(GetPlayerState(targetid) == 9) return false;
	}
	if(!GetPlayerPos(targetid, p[0], p[1], p[2])) return false;
	if(!IsPlayerInRangeOfPoint(playerid, radi, p[0], p[1], p[2])) return false;
	return true;
}
Вот и все! Систему тестил лично и никаких багов не обнаружил. Если будут - напишите, исправлю.
Если Вам понравился мануал, то поблагодарите автора нажав кнопку "Спасибо" :)
​
 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу