Welcome!

By registering with us, you'll be able to discuss, share and private message with other members of our community.

SignUp Now!

Мой язык Pawn c+ кому нужно

Июн
32
14
Пользователь
2.6. Весь код необходимо брать под тег "Код".
Первые мои скрипты моего языка который я щас создаю с помощью нейросети Pawno c+, там смешиваются pawn и c++ вот эти скрипты:
1 скрипт:

Pawn:
#include <crmp_core>

// Создаем класс фракции с использованием ООП из C++
public class Fraction {
    private:
        int fractionId;
        string fractionName;
        // Используем динамический вектор из C++ вместо фиксированных массивов Pawn!
        std::vector<int> memberList;
        std::vector<int> vehicleList;

    public:
        // Конструктор фракции
        Fraction(int id, string name) {
            this->fractionId = id;
            this->fractionName = name;
        }

        // Метод добавления служебного авто (например, Lada Priora УГИБДД)
        void AddFractionVehicle(int modelId, Vector3 spawnPos, float rotation, int color1, int color2) {
            // Создаем машину через стандартный натив CRMP, но сохраняем её ID в вектор C++
            int vehId = CreateVehicle(modelId, spawnPos.x, spawnPos.y, spawnPos.z, rotation, color1, color2, -1);
            this->vehicleList.push_back(vehId);
          
            // Устанавливаем 3D текст на машину (фишка Pawno: методы прямо у ID машины!)
            Attach3DTextLabelToVehicle(Create3DTextLabel("[Служебный транспорт]", 0xFF0000FF, 0.0, 0.0, 2.0), vehId, 0.0, 0.0, 0.0);
        }

        // Отправка сообщения всей фракции (в Pawn пришлось бы делать цикл по всем игрокам)
        void BroadcastMessage(int color, string text) {
            for(int playerId : this->memberList) {
                if(IsPlayerConnected(playerId)) {
                    SendClientMessage(playerId, color, text);
                }
            }
        }
}

// Глобальный объект фракции ДПС
global Fraction Police(1, "УГИБДД по Нижегородской области");

public void OnGameModeInit() {
    // Красивый спавн машин фракции при запуске сервера CRMP
    // Используем структуру Vector3 из C++
    Police.AddFractionVehicle(541, Vector3(-2450.0, 1500.0, 20.0), 90.0, 1, 1); // ДПС авто
    Police.AddFractionVehicle(541, Vector3(-2455.0, 1500.0, 20.0), 90.0, 1, 1);
  
    printf("Фракция %s успешно загружена!", Police.fractionName);
}

// Удобная обработка команд в стиле C++ атрибутов
[Command("dps_bonus")]
public void OnPlayerCommand(int playerId, string args) {
    if(Police.IsPlayerInFraction(playerId)) {
        GivePlayerMoney(playerId, 5000); // Выдаем 5000 рублей на сервере Criminal Russia
        SendClientMessage(playerId, 0x00FF00FF, "[УГИБДД] Вы получили премию за дежурство!");
    }
}

2 скрипт:

Pawn:
#include <pawno_crmp>
#include <database>

public class PlayerSession {
    private:
        int id;
        string name;
        bool isLogged = false;
        int level = 1;
        int cash = 5000;

    public:
        PlayerSession(int playerId, string playerName) {
            this->id = playerId;
            this->name = playerName;
        }

        void LoadData(QueryResult result) {
            this->level = result.GetInt("level");
            this->cash = result.GetInt("cash");
            this->isLogged = true;

            SetPlayerScore(this->id, this->level);
            GivePlayerMoney(this->id, this->cash);
            SendClientMessage(this->id, 0x00FF00FF, "Вы успешно авторизовались. Добро пожаловать в Нижегородскую область!");
        }

        void SaveData() {
            if (!this->isLogged) return;
          
            string query = format("UPDATE users SET level = %d, cash = %d WHERE name = '%s'",
                GetPlayerScore(this->id), GetPlayerMoney(this->id), this->name);
            Database.Execute(query);
        }

        ~PlayerSession() {
            this->SaveData();
        }
}

global std::map<int, PlayerSession*> ActivePlayers;

public void OnPlayerConnect(int playerId) {
    string name = GetPlayerName(playerId);
    ActivePlayers[playerId] = new PlayerSession(playerId, name);

    string query = format("SELECT * FROM users WHERE name = '%s' LIMIT 1", name);
    Database.Query(query, [=](QueryResult result) {
        if (result.RowsCount > 0) {
            ShowPlayerDialog(playerId, 1, DIALOG_STYLE_PASSWORD, "Авторизация", "Введите пароль:", "Войти", "Выход");
        } else {
            ShowPlayerDialog(playerId, 2, DIALOG_STYLE_PASSWORD, "Регистрация", "Создайте пароль:", "Создать", "Выход");
        }
    });
}

public void OnPlayerDisconnect(int playerId, int reason) {
    if (ActivePlayers.count(playerId)) {
        delete ActivePlayers[playerId];
        ActivePlayers.erase(playerId);
    }
}

3 скрипт:
Pawn:
#include <pawno_crmp>

enum AdminLevels {
    ADMIN_NONE = 0,
    ADMIN_HELPER = 1,
    ADMIN_MODER = 2,
    ADMIN_CHIEF = 3
};

// Внутренний макрос транслятора Pawno для валидации админки
#define CHECK_ADMIN(id, level) if(GetPlayerAdminLevel(id) < level) return SendClientMessage(id, 0xFF0000FF, "[Ошибка] Нет доступа!");

[Command("makeadmin", ADMIN_CHIEF)]
public void CmdMakeAdmin(int playerId, string args) {
    int targetId, level;
    if (sscanf(args, "dd", targetId, level)) {
        return SendClientMessage(playerId, 0xFFFFFFFF, "Используйте: /makeadmin [id] [уровень]");
    }
  
    SetPlayerAdminLevel(targetId, level);
  
    string msg = format("[Админ] Вы назначили игрока %d админом %d уровня.", targetId, level);
    SendClientMessage(playerId, 0x00FF00FF, msg);
}

[Command("veh", ADMIN_MODER)]
public void CmdSpawnVehicle(int playerId, string args) {
    int modelId;
    if (sscanf(args, "d", modelId)) {
        return SendClientMessage(playerId, 0xFFFFFFFF, "Используйте: /veh [modelId]");
    }

    Vector3 pos;
    GetPlayerPos(playerId, &pos.x, &pos.y, &pos.z);
  
    int vehId = CreateVehicle(modelId, pos.x + 2.0, pos.y, pos.z, 0.0, 1, 1, -1);
    PutPlayerInVehicle(playerId, vehId, 0);
}

4 скрипт:
Pawn:
#include <pawno_crmp>

public class Organization {
    private:
        int orgId;
        string orgName;
        int spawnColor;
        std::vector<int> vehicles;

    public:
        Organization(int id, string name, int color) {
            this->orgId = id;
            this->orgName = name;
            this->spawnColor = color;
        }

        void AddVehicle(int modelId, Vector3 pos, float rot, string plate) {
            int vehId = CreateVehicle(modelId, pos.x, pos.y, pos.z, rot, 1, 1, -1);
            SetVehicleNumberPlate(vehId, plate);
          
            string text = format("[%s]\n%s", this->orgName, plate);
            Attach3DTextLabelToVehicle(Create3DTextLabel(text, this->spawnColor, 0.0, 0.0, 1.5), vehId, 0.0, 0.0, 0.0);
          
            this->vehicles.push_back(vehId);
        }

        void RespawnFleet() {
            for (int vehId : this->vehicles) {
                SetVehicleToRespawn(vehId);
            }
        }
}

global std::map<int, Organization*> Factions;

public void OnGameModeInit() {
    // Инициализация УГИБДД
    Factions[1] = new Organization(1, "УГИБДД", 0x0000FFFF);
    Factions[1]->AddVehicle(541, Vector3(-2400.5, 1200.1, 15.0), 90.0, "А000РР52");
    Factions[1]->AddVehicle(541, Vector3(-2405.5, 1200.1, 15.0), 90.0, "А001РР52");

    // Инициализация ЦБ
    Factions[2] = new Organization(2, "Центральная Больница", 0xFF0000FF);
    Factions[2]->AddVehicle(416, Vector3(-2500.0, 1300.0, 16.0), 180.0, "М111ММ52");
}

5 скрипт:
Pawn:
#include <pawno_crmp>

public class AdminSession {
    private:
        int id;
        int level = 0;
        bool isAuthed = false;
        string name;

    public:
        AdminSession(int playerId, int adminLevel) {
            this->id = playerId;
            this->level = adminLevel;
            this->name = GetPlayerName(playerId);
        }

        bool CheckAccess(int requiredLevel) {
            if (!this->isAuthed) {
                SendClientMessage(this->id, 0xFF0000FF, "[Защита] Авторизуйся в админ-панели!");
                return false;
            }
            if (this->level < requiredLevel) {
                SendClientMessage(this->id, 0xFF0000FF, "[Ошибка] Недостаточно прав!");
                return false;
            }
            return true;
        }

        void Authenticate(string password) {
            if (password == "admin1234") {
                this->isAuthed = true;
                SendClientMessage(this->id, 0x00FF00FF, "[Админ] Успешный вход.");
            } else {
                Kick(this->id);
            }
        }

        int GetLevel() { return this->level; }
}

global std::map<int, AdminSession*> AdminList;

public void OnPlayerDisconnect(int playerId, int reason) {
    if (AdminList.count(playerId)) {
        delete AdminList[playerId];
        AdminList.erase(playerId);
    }
}

6 скрипт:
Pawn:
#include <pawno_crmp>

#define REQ_ADMIN(id, lvl) if(!AdminList.count(id) || !AdminList[id]->CheckAccess(lvl)) return;

[Command("kick", 1)]
public void CmdKick(int playerId, string args) {
    REQ_ADMIN(playerId, 1);
    int targetId; string reason;
    if (sscanf(args, "ds", targetId, reason)) return SendClientMessage(playerId, -1, "Юзай: /kick [ID] [Причина]");
  
    string msg = format("[Администрация] %s кикнул %s. Причина: %s", GetPlayerName(playerId), GetPlayerName(targetId), reason);
    SendClientMessageToAll(0xFF0000FF, msg);
    Kick(targetId);
}

[Command("ban", 2)]
public void CmdBan(int playerId, string args) {
    REQ_ADMIN(playerId, 2);
    int targetId, days; string reason;
    if (sscanf(args, "dds", targetId, days, reason)) return SendClientMessage(playerId, -1, "Юзай: /ban [ID] [Дни] [Причина]");
  
    string msg = format("[Администрация] %s забанил %s на %d дней. Причина: %s", GetPlayerName(playerId), GetPlayerName(targetId), days, reason);
    SendClientMessageToAll(0xFF0000FF, msg);
  
    string query = format("INSERT INTO bans (name, days, reason) VALUES ('%s', %d, '%s')", GetPlayerName(targetId), days, reason);
    Database.Execute(query);
    Kick(targetId);
}

[Command("mute", 1)]
public void CmdMute(int playerId, string args) {
    REQ_ADMIN(playerId, 1);
    int targetId, time; string reason;
    if (sscanf(args, "dds", targetId, time, reason)) return SendClientMessage(playerId, -1, "Юзай: /mute [ID] [Минуты] [Причина]");
  
    SetPlayerMuteTime(targetId, time * 60);
    string msg = format("[Администрация] %s выдал мут %s на %d мин. Причина: %s", GetPlayerName(playerId), GetPlayerName(targetId), time, reason);
    SendClientMessageToAll(0xFF0000FF, msg);
}

7 скрипт:
Pawn:
#include <pawno_crmp>

#define REQ_ADMIN(id, lvl) if(!AdminList.count(id) || !AdminList[id]->CheckAccess(lvl)) return;

[Command("sp", 1)]
public void CmdSpectate(int playerId, string args) {
    REQ_ADMIN(playerId, 1);
    int targetId;
    if (sscanf(args, "d", targetId)) return SendClientMessage(playerId, -1, "Юзай: /sp [ID] (0 - выключить)");
  
    if (targetId == 0) {
        TogglePlayerSpectating(playerId, false);
        return;
    }
  
    TogglePlayerSpectating(playerId, true);
    if (IsPlayerInAnyVehicle(targetId)) {
        PlayerSpectateVehicle(playerId, GetPlayerVehicleID(targetId));
    } else {
        PlayerSpectatePlayer(playerId, targetId);
    }
}

[Command("tp", 1)]
public void CmdTeleport(int playerId, string args) {
    REQ_ADMIN(playerId, 1);
    int targetId;
    if (sscanf(args, "d", targetId)) return SendClientMessage(playerId, -1, "Юзай: /tp [ID]");
  
    Vector3 pos;
    GetPlayerPos(targetId, &pos.x, &pos.y, &pos.z);
    SetPlayerPos(playerId, pos.x + 1.0, pos.y + 1.0, pos.z);
    SetPlayerInterior(playerId, GetPlayerInterior(targetId));
    SetPlayerVirtualWorld(playerId, GetPlayerVirtualWorld(targetId));
}

[Command("tphere", 2)]
public void CmdTeleportHere(int playerId, string args) {
    REQ_ADMIN(playerId, 2);
    int targetId;
    if (sscanf(args, "d", targetId)) return SendClientMessage(playerId, -1, "Юзай: /tphere [ID]");
  
    Vector3 pos;
    GetPlayerPos(playerId, &pos.x, &pos.y, &pos.z);
    SetPlayerPos(targetId, pos.x + 1.0, pos.y + 1.0, pos.z);
    SetPlayerInterior(targetId, GetPlayerInterior(playerId));
    SetPlayerVirtualWorld(targetId, GetPlayerVirtualWorld(playerId));
}

[Command("slap", 1)]
public void CmdSlap(int playerId, string args) {
    REQ_ADMIN(playerId, 1);
    int targetId;
    if (sscanf(args, "d", targetId)) return SendClientMessage(playerId, -1, "Юзай: /slap [ID]");
  
    Vector3 pos;
    GetPlayerPos(targetId, &pos.x, &pos.y, &pos.z);
    SetPlayerPos(targetId, pos.x, pos.y, pos.z + 5.0);
    PlayerPlaySound(targetId, 1190, 0.0, 0.0, 0.0);
}

8 скрипт:
Pawn:
#include <pawno_crmp>

#define REQ_ADMIN(id, lvl) if(!AdminList.count(id) || !AdminList[id]->CheckAccess(lvl)) return;

[Command("hp", 1)]
public void CmdSetHealth(int playerId, string args) {
    REQ_ADMIN(playerId, 1);
    int targetId, hp;
    if (sscanf(args, "dd", targetId, hp)) return SendClientMessage(playerId, -1, "Юзай: /hp [ID] [ХП]");
  
    SetPlayerHealth(targetId, float(hp));
}

[Command("setskin", 2)]
public void CmdSetSkin(int playerId, string args) {
    REQ_ADMIN(playerId, 2);
    int targetId, skinId;
    if (sscanf(args, "dd", targetId, skinId)) return SendClientMessage(playerId, -1, "Юзай: /setskin [ID] [Скин]");
  
    SetPlayerSkin(targetId, skinId);
}

[Command("spawn", 1)]
public void CmdSpawnPlayer(int playerId, string args) {
    REQ_ADMIN(playerId, 1);
    int targetId;
    if (sscanf(args, "d", targetId)) return SendClientMessage(playerId, -1, "Юзай: /spawn [ID]");
  
    SpawnPlayer(targetId);
}


9 скрипт:
Pawn:
#include <pawno_crmp>

#define REQ_ADMIN(id, lvl) if(!AdminList.count(id) || !AdminList[id]->CheckAccess(lvl)) return;

public struct ReportTicket {
    int senderId;
    string text;
}

global std::vector<ReportTicket> ReportQueue;

[Command("rep", 0)]
public void CmdReport(int playerId, string args) {
    if (args.empty()) return SendClientMessage(playerId, -1, "Юзай: /rep [Текст]");
  
    ReportTicket ticket = { playerId, args };
    ReportQueue.push_back(ticket);
  
    SendClientMessage(playerId, 0xFFFF00FF, "Жалоба отправлена.");
  
    for (auto const& [adminId, session] : AdminList) {
        string msg = format("[Репорт] От %s [%d]: %s", GetPlayerName(playerId), playerId, args);
        SendClientMessage(adminId, 0xFFFF00FF, msg);
    }
}

[Command("pm", 1)]
public void CmdAnsReport(int playerId, string args) {
    REQ_ADMIN(playerId, 1);
    int ta 1 скрипт:

#include <crmp_core>

// Создаем класс фракции с использованием ООП из C++
public class Fraction {
    private:
        int fractionId;
        string fractionName;
        // Используем динамический вектор из C++ вместо фиксированных массивов Pawn!
        std::vector<int> memberList;
        std::vector<int> vehicleList;

    public:
        // Конструктор фракции
        Fraction(int id, string name) {
            this->fractionId = id;
            this->fractionName = name;
        }

        // Метод добавления служебного авто (например, Lada Priora УГИБДД)
        void AddFractionVehicle(int modelId, Vector3 spawnPos, float rotation, int color1, int color2) {
            // Создаем машину через стандартный натив CRMP, но сохраняем её ID в вектор C++
            int vehId = CreateVehicle(modelId, spawnPos.x, spawnPos.y, spawnPos.z, rotation, color1, color2, -1);
            this->vehicleList.push_back(vehId);
          
            // Устанавливаем 3D текст на машину (фишка Pawno: методы прямо у ID машины!)
            Attach3DTextLabelToVehicle(Create3DTextLabel("[Служебный транспорт]", 0xFF0000FF, 0.0, 0.0, 2.0), vehId, 0.0, 0.0, 0.0);
        }

        // Отправка сообщения всей фракции (в Pawn пришлось бы делать цикл по всем игрокам)
        void BroadcastMessage(int color, string text) {
            for(int playerId : this->memberList) {
                if(IsPlayerConnected(playerId)) {
                    SendClientMessage(playerId, color, text);
                }
            }
        }
}

// Глобальный объект фракции ДПС
global Fraction Police(1, "УГИБДД по Нижегородской области");

public void OnGameModeInit() {
    // Красивый спавн машин фракции при запуске сервера CRMP
    // Используем структуру Vector3 из C++
    Police.AddFractionVehicle(541, Vector3(-2450.0, 1500.0, 20.0), 90.0, 1, 1); // ДПС авто
    Police.AddFractionVehicle(541, Vector3(-2455.0, 1500.0, 20.0), 90.0, 1, 1);
  
    printf("Фракция %s успешно загружена!", Police.fractionName);
}

// Удобная обработка команд в стиле C++ атрибутов
[Command("dps_bonus")]
public void OnPlayerCommand(int playerId, string args) {
    if(Police.IsPlayerInFraction(playerId)) {
        GivePlayerMoney(playerId, 5000); // Выдаем 5000 рублей на сервере Criminal Russia
        SendClientMessage(playerId, 0x00FF00FF, "[УГИБДД] Вы получили премию за дежурство!");
    }
}


Просите команды, системы выставлю
 
Последнее редактирование:
Лучше плохо начать, чем хорошо бездействовать
Ноя
2,906
3,639
Редактор
Весь код надо брать под тег "Код"
 
Янв
432
78
Пользователь
уверен, что это даже не работает. В сампе/крмп и так можно реализовать игровой режим на С++ через плагины подключаемые к основному серверу и amx-машине (но это не особо имеет смысл из за неё же так как она выступает прослойкой и замедляет все) и многих других языках, а в Openmp так вообще нативно
 
Последнее редактирование:
𝚖𝚎𝚖𝚎𝚗𝚝𝚘 𝚖𝚘𝚛𝚒.
Мар
1,232
13,921
Команда форума
Администратор
OFFTOP

Спроси еще у нейронки - "Как пользоваться bb-кодом [/code]?" В следующий раз снесу тему сразу же.

 
Янв
432
78
Пользователь


Пример мода на С++:


Остальные ЯП есть в документации и ветке мультиплеера на гитхабе:


ну и на десерт для зумеров которые явно не застали далекие и славные времена. И не знают, что Dimonml. Который адаптировал SA-MP под CR-MP, написал что у него был свой сервер Paradise который был OpenSource и был написан в виде плагина на С++:
(До .git был .svn. Про что вы тоже вряд ли знаете. Это разные технологии хранения данных которые никак не связаны с гитхабом или гуглкодом)

ну и на добивку. Базовый пример рп мода на С++ реализованным уже чуть по другому:

Более того. Есть примеры того, как были реализованы игровые режимы, аж на ассемблере:
 
Последнее редактирование:
Сверху