Активный
- Тема Автор
- #1
Бизнесы позволяют игрокам зарабатывать деньги и управлять собственностью. Разберем создание системы.
Структура данных бизнеса
Создание бизнеса
Покупка бизнеса
Взаимодействие с бизнесом
Система дохода
Команды
Важные моменты:
- Сохраняйте данные бизнесов в базе данных
- Реализуйте систему дохода
- Предоставляйте меню для управления
- Учитывайте баланс экономики
Бизнесы создают экономическую систему на сервере!
Структура данных бизнеса
Код:
enum BusinessInfo
{
Float:bX,
Float:bY,
Float:bZ,
bType,
bPrice,
bOwner[MAX_PLAYER_NAME],
bName[64],
bLocked,
bEarnings,
Text3D:bLabel
}
new BusinessData[100][BusinessInfo];
new TotalBusinesses = 0;
Создание бизнеса
Код:
CreateBusiness(Float:x, Float:y, Float:z, type, price, name[])
{
if(TotalBusinesses >= sizeof(BusinessData))
{
return -1;
}
new string[128];
if(strlen(BusinessData[TotalBusinesses][bOwner]) == 0)
{
format(string, sizeof(string), "%s\nНа продажу\nЦена: $%d\nНажмите F", name, price);
}
else
{
format(string, sizeof(string), "%s\nВладелец: %s\nДоход: $%d\nНажмите F",
name, BusinessData[TotalBusinesses][bOwner], BusinessData[TotalBusinesses][bEarnings]);
}
BusinessData[TotalBusinesses][bX] = x;
BusinessData[TotalBusinesses][bY] = y;
BusinessData[TotalBusinesses][bZ] = z;
BusinessData[TotalBusinesses][bType] = type;
BusinessData[TotalBusinesses][bPrice] = price;
BusinessData[TotalBusinesses][bLabel] = Create3DTextLabel(string, 0xFFFFFFFF, x, y, z + 1.0, 20.0, 0, 0);
strcpy(BusinessData[TotalBusinesses][bName], name, 64);
BusinessData[TotalBusinesses][bLocked] = 0;
BusinessData[TotalBusinesses][bEarnings] = 0;
TotalBusinesses++;
return TotalBusinesses - 1;
}
Покупка бизнеса
Код:
BuyBusiness(playerid, businessid)
{
if(businessid >= TotalBusinesses)
{
SendClientMessage(playerid, -1, "Неверный ID бизнеса");
return 0;
}
if(strlen(BusinessData[businessid][bOwner]) > 0)
{
SendClientMessage(playerid, -1, "Бизнес уже имеет владельца");
return 0;
}
if(GetPlayerMoney(playerid) < BusinessData[businessid][bPrice])
{
SendClientMessage(playerid, -1, "Недостаточно денег");
return 0;
}
GetPlayerName(playerid, BusinessData[businessid][bOwner], MAX_PLAYER_NAME);
GivePlayerMoney(playerid, -BusinessData[businessid][bPrice]);
BusinessData[businessid][bLocked] = 0;
UpdateBusinessLabel(businessid);
new string[128];
format(string, sizeof(string), "Вы купили бизнес: %s", BusinessData[businessid][bName]);
SendClientMessage(playerid, -1, string);
return 1;
}
UpdateBusinessLabel(businessid)
{
new string[128];
if(strlen(BusinessData[businessid][bOwner]) == 0)
{
format(string, sizeof(string), "%s\nНа продажу\nЦена: $%d\nНажмите F",
BusinessData[businessid][bName], BusinessData[businessid][bPrice]);
Update3DTextLabelText(BusinessData[businessid][bLabel], 0xFFFFFFFF, string);
}
else
{
format(string, sizeof(string), "%s\nВладелец: %s\nДоход: $%d\nНажмите F",
BusinessData[businessid][bName],
BusinessData[businessid][bOwner],
BusinessData[businessid][bEarnings]);
Update3DTextLabelText(BusinessData[businessid][bLabel], 0x00FF00FF, string);
}
}
Взаимодействие с бизнесом
Код:
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
if(newkeys & KEY_SECONDARY_ATTACK)
{
for(new i = 0; i < TotalBusinesses; i++)
{
if(IsPlayerInRangeOfPoint(playerid, 3.0, BusinessData[i][bX], BusinessData[i][bY], BusinessData[i][bZ]))
{
ShowBusinessMenu(playerid, i);
break;
}
}
}
return 1;
}
ShowBusinessMenu(playerid, businessid)
{
new string[256];
if(strlen(BusinessData[businessid][bOwner]) == 0)
{
format(string, sizeof(string),
"Бизнес: %s\nТип: %d\nЦена: $%d\n\nКупить этот бизнес?",
BusinessData[businessid][bName],
BusinessData[businessid][bType],
BusinessData[businessid][bPrice]);
ShowPlayerDialog(playerid, DIALOG_BUY_BUSINESS, DIALOG_STYLE_MSGBOX, "Покупка бизнеса", string, "Купить", "Отмена");
}
else
{
if(!strcmp(GetPlayerName(playerid), BusinessData[businessid][bOwner], true))
{
// Владелец
format(string, sizeof(string),
"Бизнес: %s\nДоход: $%d\n\nВыберите действие:",
BusinessData[businessid][bName],
BusinessData[businessid][bEarnings]);
ShowPlayerDialog(playerid, DIALOG_BUSINESS_MENU, DIALOG_STYLE_LIST, "Мой бизнес",
"Забрать доход\nЗаблокировать\nПродать", "Выбрать", "Отмена");
}
else
{
// Посетитель
EnterBusiness(playerid, businessid);
}
}
}
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
switch(dialogid)
{
case DIALOG_BUY_BUSINESS:
{
if(response)
{
// Определяем ID бизнеса (нужно сохранить в переменной)
BuyBusiness(playerid, PlayerBusinessID[playerid]);
}
}
case DIALOG_BUSINESS_MENU:
{
if(response)
{
switch(listitem)
{
case 0: // Забрать доход
{
if(BusinessData[PlayerBusinessID[playerid]][bEarnings] > 0)
{
GivePlayerMoney(playerid, BusinessData[PlayerBusinessID[playerid]][bEarnings]);
new string[128];
format(string, sizeof(string), "Вы забрали $%d дохода",
BusinessData[PlayerBusinessID[playerid]][bEarnings]);
SendClientMessage(playerid, -1, string);
BusinessData[PlayerBusinessID[playerid]][bEarnings] = 0;
UpdateBusinessLabel(PlayerBusinessID[playerid]);
}
}
case 1: // Заблокировать
{
BusinessData[PlayerBusinessID[playerid]][bLocked] =
!BusinessData[PlayerBusinessID[playerid]][bLocked];
SendClientMessage(playerid, -1,
BusinessData[PlayerBusinessID[playerid]][bLocked] ? "Бизнес заблокирован" : "Бизнес разблокирован");
}
case 2: // Продать
{
SellBusiness(playerid, PlayerBusinessID[playerid]);
}
}
}
}
}
return 1;
}
Система дохода
Код:
public OnGameModeInit()
{
// Начисление дохода каждые 10 минут
SetTimer("BusinessEarnings", 600000, true);
return 1;
}
forward BusinessEarnings();
public BusinessEarnings()
{
for(new i = 0; i < TotalBusinesses; i++)
{
if(strlen(BusinessData[i][bOwner]) > 0)
{
// Доход зависит от типа бизнеса
new earnings = 0;
switch(BusinessData[i][bType])
{
case 1: earnings = 500; // Магазин
case 2: earnings = 1000; // Ресторан
case 3: earnings = 2000; // Клуб
}
BusinessData[i][bEarnings] += earnings;
UpdateBusinessLabel(i);
}
}
}
EnterBusiness(playerid, businessid)
{
if(BusinessData[businessid][bLocked])
{
SendClientMessage(playerid, -1, "Бизнес заблокирован");
return 0;
}
// Телепортация внутрь бизнеса
switch(BusinessData[businessid][bType])
{
case 1: SetPlayerPos(playerid, 0.0, 0.0, 3.0); // Магазин
case 2: SetPlayerPos(playerid, 0.0, 0.0, 3.0); // Ресторан
case 3: SetPlayerPos(playerid, 0.0, 0.0, 3.0); // Клуб
}
SendClientMessage(playerid, -1, "Добро пожаловать!");
return 1;
}
SellBusiness(playerid, businessid)
{
if(strcmp(GetPlayerName(playerid), BusinessData[businessid][bOwner], true))
{
SendClientMessage(playerid, -1, "Вы не владелец этого бизнеса");
return 0;
}
GivePlayerMoney(playerid, BusinessData[businessid][bPrice] / 2); // 50% от стоимости
GivePlayerMoney(playerid, BusinessData[businessid][bEarnings]); // Доход
BusinessData[businessid][bOwner][0] = '\0';
BusinessData[businessid][bEarnings] = 0;
BusinessData[businessid][bLocked] = 0;
UpdateBusinessLabel(businessid);
SendClientMessage(playerid, -1, "Бизнес продан");
return 1;
}
Команды
Код:
CMD:mybusiness(playerid, params[])
{
new count = 0;
new string[128];
for(new i = 0; i < TotalBusinesses; i++)
{
if(!strcmp(GetPlayerName(playerid), BusinessData[i][bOwner], true))
{
count++;
format(string, sizeof(string), "Бизнес %d: %s (Доход: $%d)", i, BusinessData[i][bName], BusinessData[i][bEarnings]);
SendClientMessage(playerid, -1, string);
}
}
if(count == 0)
{
SendClientMessage(playerid, -1, "У вас нет бизнесов");
}
return 1;
}
Важные моменты:
- Сохраняйте данные бизнесов в базе данных
- Реализуйте систему дохода
- Предоставляйте меню для управления
- Учитывайте баланс экономики
Бизнесы создают экономическую систему на сервере!