AndreY.eXe
Специалист
Привет!
Да, видел я одну систему, но она для ДМ сервера (С выбором карты и тд), а эту я делаю для РП серверов.
Суть: Вы предлагаете игроку дуель на указанную Вами ставку и если игрок соглашается, то идет отсчет (10 секунд), после чего дуэль начинается. При этому, у Вас и у Вашего соперника в руках должно быть какое-то оружие.
Приступим:
Ко всем переменным:
В OnPlayerConnect:
Ко всем командам:
В OnPlayerDialogResponse
В любое место:
В OnPlayerDeath
И в OnPlayerDisconnect:
Вот и все! Систему тестил лично и никаких багов не обнаружил. Если будут - напишите, исправлю.
Если Вам понравился мануал, то поблагодарите автора нажав кнопку "Спасибо"
Да, видел я одну систему, но она для ДМ сервера (С выбором карты и тд), а эту я делаю для РП серверов.
Суть: Вы предлагаете игроку дуель на указанную Вами ставку и если игрок соглашается, то идет отсчет (10 секунд), после чего дуэль начинается. При этому, у Вас и у Вашего соперника в руках должно быть какое-то оружие.
Приступим:
Ко всем переменным:
PHP:
new DuelOffer[MAX_PLAYERS]; // Кто кому предложил дуэль и наоборот
new timeduel[MAX_PLAYERS]; // Специально, чтобы отсчитывать секунды
new DuelTimer[MAX_PLAYERS]; // Таймер
new DuelCash[MAX_PLAYERS]; // Ставка
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;
}
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;
}
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;
}
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;
}
Если Вам понравился мануал, то поблагодарите автора нажав кнопку "Спасибо"
Последнее редактирование:
