Система бизнесов в Pawn: создание и управление

Активный
Статус
Сообщения
516
Лайки
32

8

месяц на сайте

Бизнесы позволяют игрокам зарабатывать деньги и управлять собственностью. Разберем создание системы.

Структура данных бизнеса
Код:
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;
}

Важные моменты:
- Сохраняйте данные бизнесов в базе данных
- Реализуйте систему дохода
- Предоставляйте меню для управления
- Учитывайте баланс экономики

Бизнесы создают экономическую систему на сервере!
 

1 человек читают эту тему (Всего: 1, Пользователей: 0, Гостей: 1)

Сверху