PHP код:
#include <a_samp>
#include <izcmd>
#define SCM(%0,%1) SendClientMessage(%0,-1,%1)
#define PIZZA_MAX_ORDER 5
enum EnumPizza
{
op_clientID,
op_status
};
new
timer,
pname[MAX_PLAYERS][24],
pizza_orders,
pizza_job[MAX_PLAYERS],
pizza_data[MAX_PLAYERS][3], // status, workerID, slot
pizza_timer[MAX_PLAYERS],
opinfo[PIZZA_MAX_ORDER][EnumPizza]
;
public OnFilterScriptInit()
{
for(new i = 0; i < PIZZA_MAX_ORDER; i++)
{
opinfo[i][op_clientID] = INVALID_PLAYER_ID;
opinfo[i][op_status] = 0;
}
pizza_orders = 0;
timer = SetTimer("_timer", 1000, 1);
return 1;
}
public OnFilterScriptExit()
{
KillTimer(timer);
return 1;
}
public OnPlayerConnect(playerid)
{
GetPlayerName(playerid, pname[playerid], 24);
pizza_job[playerid] = 0;
pizza_data[playerid][0] = 0;
pizza_data[playerid][1] = INVALID_PLAYER_ID;
pizza_data[playerid][2] = 0;
pizza_timer[playerid] = 0;
return 1;
}
public OnPlayerDisconnect(playerid, reason)
{
if(pizza_data[playerid][0] > 0)
{
new str[100];
format(str, sizeof str, "Ваш клиент %s покинул игру. Заказ №%d отменен.", pname[playerid], pizza_data[playerid][2]);
SCM(pizza_data[playerid][1], str);
Pizza_ResetData(playerid);
}
return 1;
}
public OnPlayerDeath(playerid, killerid, reason)
{
return 1;
}
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
if(GetPVarInt(playerid, "pizza_client_YN") == 1)
{
DeletePVar(playerid, "pizza_client_YN");
if(newkeys & 65536)
{
if(pizza_timer[pizza_data[playerid][1]] == 777)
{
new str[130];
SCM(playerid, "Вы согласились. С вас не взяли деньги, потому что наш курьер опоздал. Приятного аппетита!");
SCM(playerid, str);
format(str, sizeof str, "Клиент %s согласился. Вы не успели доставить пиццу во время, вы оштрафованы на $10.", pname[playerid]);
SCM(pizza_data[playerid][1], str);
GivePlayerMoney(pizza_data[playerid][1], -10);
}
else
{
new str[130];
SCM(playerid, "Вы согласились. С вас взяли: $10. Приятного аппетита!");
GivePlayerMoney(playerid, -10);
format(str, sizeof str, "Клиент %s согласился. Вы получили $10.", pname[playerid]);
SCM(pizza_data[playerid][1], str);
GivePlayerMoney(pizza_data[playerid][1], 10);
}
pizza_orders -= 1;
}
else if(newkeys & 131072)
{
if(pizza_timer[pizza_data[playerid][1]] == 777)
{
new str[130];
format(str, sizeof str, "Клиент %s отказался и заплатил $10 за неустойку.", pname[playerid]);
SCM(pizza_data[playerid][1], str);
SCM(pizza_data[playerid][1], "Вы не успели доставить пиццу во время, вы оштрафованы на $10.");
}
else
{
new str[130];
SCM(playerid, "Вы отказались. С вас взяли $0 за неустойку. Приятного аппетита!");
GivePlayerMoney(playerid, -10);
format(str, sizeof str, "Клиент %s отказался. Вы получили за неустойку $10.", pname[playerid]);
SCM(pizza_data[playerid][1], str);
GivePlayerMoney(pizza_data[playerid][1], 10);
}
pizza_orders -= 1;
}
return Pizza_ResetData(playerid);
}
return 1;
}
public OnPlayerClickTextDraw(playerid, Text:clickedid)
{
return 1;
}
forward _timer();
public _timer()
{
for(new i = GetPlayerPoolSize(); i >= 0; i--)
{
if(pizza_timer[i] > 1 && pizza_timer[i] < 32)
{
pizza_timer[i]--;
new str[20];
format(str, sizeof str, "TIME LEFT: %d", pizza_timer[i]-1);
GameTextForPlayer(i, str, 1000, 1);
}
else if(pizza_timer[i] == 1)
{
pizza_timer[i] = 777;
SCM(i, "Время вышло! Прийдется заплатить неустойку $10.");
}
}
return 1;
}
stock Pizza_FindFreeOrder()
{
new slot = -1;
for(new i = 0; i < PIZZA_MAX_ORDER; i++)
{
if(opinfo[i][op_status] == 0)
{
slot = i;
break;
}
}
return slot;
}
Pizza_ResetData(playerid)
{
if(pizza_data[playerid][2] > 0)
{
opinfo[pizza_data[playerid][2]-1][op_clientID] = INVALID_PLAYER_ID;
opinfo[pizza_data[playerid][2]-1][op_status] = 0;
}
if(pizza_data[playerid][1] != INVALID_PLAYER_ID)
{
pizza_data[pizza_data[playerid][1]][0] = 0;
pizza_data[pizza_data[playerid][1]][1] = INVALID_PLAYER_ID;
pizza_data[pizza_data[playerid][1]][2] = 0;
pizza_timer[pizza_data[playerid][1]] = 0;
}
pizza_data[playerid][0] = 0;
pizza_data[playerid][1] = INVALID_PLAYER_ID;
pizza_data[playerid][2] = 0;
pizza_timer[playerid] = 0;
return 1;
}
COMMAND:pizzacall(playerid, params[])
{
if(pizza_job[playerid] == 1) return SCM(playerid, "Работникам пиццерии нельзя заказывать пиццу.");
if(pizza_data[playerid][0] == 1) return SCM(playerid, "Вы уже заказали пиццу, ожидайте.");
if(pizza_data[playerid][0] == 2) return SCM(playerid, "Вы уже заказали пиццу, работник уже в пути.");
new slot = Pizza_FindFreeOrder();
if(slot == -1) return SCM(playerid, "Извините, нет свободных работников.");
pizza_data[playerid][0] = 1;
pizza_data[playerid][1] = INVALID_PLAYER_ID;
pizza_data[playerid][2] = slot+1;
opinfo[slot][op_clientID] = playerid;
opinfo[slot][op_status] = 1;
pizza_orders += 1;
new str[70];
format(str, sizeof str, "Ваш заказ принят. Номер заказа: №%d.", slot+1);
SCM(playerid, str);
return 1;
}
COMMAND:pizzaorders(playerid, params[])
{
if(pizza_job[playerid] != 1) return SCM(playerid, "Вы не работник пиццерии.");
if(pizza_data[playerid][0] == 1) return SCM(playerid, "Вы уже взяли пиццу, отвезите её клиенту.");
if(pizza_orders == 0) return SCM(playerid, "На данный момент нет заказов.");
new dialogInfo[33*PIZZA_MAX_ORDER];
for(new i = 0; i < pizza_orders; i++)
{
if(opinfo[i][op_status] == 1)
{
format(dialogInfo, sizeof dialogInfo, "%s%i. %s\n", dialogInfo, i+1, pname[opinfo[i][op_clientID]]);
}
}
ShowPlayerDialog(playerid, 5678, DIALOG_STYLE_LIST, "Заказы пиццерии", dialogInfo, "Взять", "Закрыть");
print("DEBUG: 00");
return 1;
}
COMMAND:pizzasell(playerid, params[])
{
if(pizza_job[playerid] != 1) return SCM(playerid, "Вы не работник пиццерии.");
if(pizza_data[playerid][0] != 1) return SCM(playerid, "Вы не брали заказ.");
new client = pizza_data[playerid][1];
if(!IsPlayerConnected(client)) return SCM(playerid, "Клиент не в сети.");
new Float: x, Float: y, Float: z;
GetPlayerPos(client, x, y, z);
if(!IsPlayerInRangeOfPoint(playerid, 2.0, x, y, z)) return SCM(playerid, "Вы находитель далеко от клиента.");
new str[120], str2[120];
if(pizza_timer[playerid] == 777)
{
format(str, sizeof str, "Курьер %s предлагает взять вам у него пиццу. (Y - согласится, N - отказаться)", pname[playerid]);
format(str2, sizeof str2, "Вы предложили %s взять у вас пиццу. (ожидайте ответа)", pname[client]);
}
if(pizza_timer[playerid] != 777)
{
format(str, sizeof str, "Курьер %s предлагает купить вам у него пиццу за $10. (Y - согласится, N - отказаться)", pname[playerid]);
format(str2, sizeof str2, "Вы предложили %s купить у вас пиццу за $10. (ожидайте ответа)", pname[client]);
}
SCM(client, str);
SCM(playerid, str2);
SetPVarInt(client, "pizza_client_YN", 1);
return 1;
}
COMMAND:injob(playerid, params[])
{
if(pizza_job[playerid] == 0)
{
pizza_job[playerid] = 1;
SCM(playerid, "Вы устроились работником пиццерии.");
}
else if(pizza_job[playerid] == 1)
{
pizza_job[playerid] = 0;
SCM(playerid, "Вы уволились с пиццерии.");
}
return 1;
}
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
if(dialogid == 5678)
{
if(!response) return 1;
new slot = strval(inputtext)-1;
if(opinfo[slot][op_status] == 2) return SCM(playerid, "Этот заказ уже взял другой работник.");
new client = opinfo[slot][op_clientID];
if(!IsPlayerConnected(client)) return SCM(playerid, "Клиент не в сети.");
pizza_data[playerid][0] = 1;
pizza_data[playerid][1] = client;
pizza_data[opinfo[slot][op_clientID]][0] = 2;
pizza_data[opinfo[slot][op_clientID]][1] = playerid;
pizza_data[playerid][2] = slot;
opinfo[slot][op_status] = 2;
pizza_timer[playerid] = 31;
SCM(playerid, "Вы взяли заказ. Отвезите пиццу клиенту. Время на доставку: 30 секунд.");
}
return 1;
}