Форум Pawn.Wiki - Воплоти мечту в реальность!: Команды /lego как на Advance RP - Форум Pawn.Wiki - Воплоти мечту в реальность!

Перейти к содержимому

Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

Команды /lego как на Advance RP Команды для создания и редактирования объектов как на Advance RP Оценка: ***** 3 Голосов

#1
Пользователь офлайн   Danny_Marcelo 

  • Знаток
  • Вставить ник
  • Раскрыть информацию
Приветствую всех. Сегодня я хочу поделиться системой создания объектов как на Advance RP. Пока нигде не встречал. Да, есть аналоги, порой весьма неплохие. Особенно скрипт SOE. Но тут именно конкретная копия проекта Advance RP. Администрация Advance RP старается максимально скрывать админ информацию главной админки, но благодаря ютуберам какая то информация всё таки просочилась в общий доступ. Благодаря этому мне и удалось воссоздать почти на 100% копию данной системы. Для начала распишу суть. К никам Andrey Ringo, Smart_Jakson и прочим спец.админам привязана команда /lego. Она даёт доступ к другим командам, которые используются для создания и редактирования объектов. Как я понял объекты находятся непосредственно в базе данных MariaDB, а не на сервере, создатель боится что если всем подряд давать команду, те могут положить сервер (случайно), как например ютубер MalFoy чуть этого не сделал:

Изображение

Ну в основном она привязана на каждом сервере индивидуально. К примеру на грине по мимо Ринго и Смарта еще и к главному администратору. На Блу аналогично.
Ну что же, меньше слов, больше дела. Приступим:

Перейдём к нашим define:

//========================= [ Привязка к нику ] ================================
#define FullAccessOne        			strcmp(PlayerInfo[playerid][pName], "Andrey_Ringo", false)
#define FullAccessTwo       			        strcmp(PlayerInfo[playerid][pName], "SMart_Jakson", false)
#define FullAccessThree      			strcmp(PlayerInfo[playerid][pName], "Danny_Marcelo", false)
#define MAX_LEGO_OBJECTS 		        100 // Максимальное количество объектов


К нашим переменным:

//========================  [ LEGO ] ===========================================
new LegoObjects[MAX_PLAYERS][MAX_LEGO_OBJECTS]; // Массив для хранения объектов
new LegoObjectCount[MAX_PLAYERS]; // Счетчик объектов для каждого игрока
new bool:LegoMode[MAX_PLAYERS]; // Режим LEGO
new Float:LegoObjectOriginalPos[MAX_PLAYERS][MAX_LEGO_OBJECTS][6]; // [playerid][object_index][x, y, z, rotX, rotY, rotZ]
new Float:ServerObjectOriginalPos[MAX_OBJECTS][6]; // [objectid][x, y, z, rotX, rotY, rotZ]
new bool:ServerObjectMoved[MAX_OBJECTS]; // Флаг, указывающий, был ли объект перемещён
enum {
    EDIT_TYPE_NONE,
    EDIT_TYPE_GLOBAL,
    EDIT_TYPE_PLAYER
};

new EditingObjectType[MAX_PLAYERS]; // Тип редактируемого объекта (серверный или игровой)
new EditingObjectID[MAX_PLAYERS] = { -1, ... }; // ID редактируемого объекта
// =============================================================================


В public OnPlayerConnect(playerid)

LegoMode[playerid] = false;
    LegoObjectCount[playerid] = 0;
    EditingObjectID[playerid] = -1;
    for(new i = 0; i < MAX_LEGO_OBJECTS; i++)
    {
        LegoObjects[playerid][i] = INVALID_OBJECT_ID;
    }


В public OnPlayerDisconnect(playerid, reason)

for(new i = 0; i < LegoObjectCount[playerid]; i++)
    {
        if(IsValidObject(LegoObjects[playerid][i]))
        {
            DestroyObject(LegoObjects[playerid][i]);
        }
    }
    LegoObjectCount[playerid] = 0;
    EditingObjectID[playerid] = -1;
    DestroyPlayerLogo(playerid);


В OnDialogResponse:

case 272: // Диалог подтверждения для серверных объектов, не забудьте заменить на свой
        {
            if(response) // Если игрок нажал "Да"
            {
                EditObject(playerid, EditingObjectID[playerid]);
                SendClientMessage(playerid, 0xFFFF00AA, "[LEGO] Выберите объект для редактирования");
            }
        }



После стандартных public

public OnPlayerSelectObject(playerid, type, objectid, modelid, Float:fX, Float:fY, Float:fZ)
{
    if(type == SELECT_OBJECT_GLOBAL_OBJECT) // Если выбран серверный объект
    {
        ShowPlayerDialog(playerid, 272, DIALOG_STYLE_MSGBOX, !"{ED7A19}Предупреждение",
        !"{FFFFFF}Это не LEGO объект. Его перемещение нежелательно.\n\
		Вы всё-таки хотите передвинуть его?", !"Да", !"Нет"); // Не забудьте ID диалога заменить аналогично OnDialogResponse
        EditingObjectID[playerid] = objectid;
        EditingObjectType[playerid] = EDIT_TYPE_GLOBAL;
    }
    else if(type == SELECT_OBJECT_PLAYER_OBJECT) // Если выбран LEGO-объект
    {
        for(new i = 0; i < LegoObjectCount[playerid]; i++)
        {
            if(LegoObjects[playerid][i] == objectid)
            {
                EditingObjectID[playerid] = i;
                EditingObjectType[playerid] = EDIT_TYPE_PLAYER;
                EditPlayerObject(playerid, LegoObjects[playerid][i]);
                new string[128];
                format(string, sizeof(string), "[LEGO] Редактирование объекта {3E8A33}%d", i + 1);
                SendClientMessage(playerid, 0xFFFF00AA, string);
                return 1;
            }
        }
    }
    return 1;
}


и еще один

public OnPlayerEditObject(playerid, playerobject, objectid, response, Float:fX, Float:fY, Float:fZ, Float:fRotX, Float:fRotY, Float:fRotZ)
{
    if(response == EDIT_RESPONSE_FINAL)
    {
        if(EditingObjectType[playerid] == EDIT_TYPE_GLOBAL) // Если это серверный объект
        {
            GetObjectPos(objectid, ServerObjectOriginalPos[objectid][0], ServerObjectOriginalPos[objectid][1], ServerObjectOriginalPos[objectid][2]);
            GetObjectRot(objectid, ServerObjectOriginalPos[objectid][3], ServerObjectOriginalPos[objectid][4], ServerObjectOriginalPos[objectid][5]);
            ServerObjectMoved[objectid] = true;
            SetObjectPos(objectid, fX, fY, fZ);
            SetObjectRot(objectid, fRotX, fRotY, fRotZ);
            new string[110];
	        format(string, sizeof(string), "Позиция объекта сохранена {E5A938}(%d/100){66AF0B}. Используйте /moveobj для перемещения на исходное место", LegoObjectCount[playerid]);
	        SendClientMessage(playerid, 0x66AF0BFF, string);
        }
        else if(EditingObjectType[playerid] == EDIT_TYPE_PLAYER) // Если это LEGO объект
        {
            SetPlayerObjectPos(playerid, objectid, fX, fY, fZ);
            SetPlayerObjectRot(playerid, objectid, fRotX, fRotY, fRotZ);
        }
    }
    return 1;
}


Ну и наконец перейдем в наши команды. Я для примера буду использовать pawncmd:

Команда для доступа к остальным командам редактирвоания:

CMD:lego(playerid, params[])
{
    if (FullAccessOne && FullAccessTwo && FullAccessThree) return 1;
    {
        LegoMode[playerid] = !LegoMode[playerid];
        if(LegoMode[playerid])
        {
            SendClientMessage(playerid, 0xFFFFFFFF, !"Режим {F7CB31}LEGO {FFFFFF}включён");
            SendClientMessage(playerid, 0xFFFFFFFF, !"Команды: /newobj /dellast /delall /objedit /repeat");
            SendClientMessage(playerid, 0xFF0000FF, !"Внимательно вводите id объекта! Неверный id может вызвать падение сервера!");
        }
        else
        {
            SendClientMessage(playerid, 0xFFFFFFFF, !"Режим {F7CB31}LEGO {FFFFFF}выключен");
        }
    }
    return 1;
}


Команда для создания объектов:

CMD:newobj(playerid, params[])
{
    if(PlayerInfo[playerid][pAdmin] < 5) return 1;
    {
        if(!LegoMode[playerid]) return SendClientMessage(playerid, 0xFFFFFFFF, !"Включи режим LEGO: {F7CB31}/lego");
        SendClientMessage(playerid, 0xE3871EFF, !"Внимательно вводите id объекта! Неверный id может вызвать падение сервера!");
        if(LegoObjectCount[playerid] >= MAX_LEGO_OBJECTS) return SendClientMessage(playerid, COLOR_RED, "Достигнут лимит объектов");
        new objectid;
        if(sscanf(params, "d", objectid)) return SendClientMessage(playerid, COLOR_GRAD, !"Используйте: /newobj [id объекта]");
        new Float:x, Float:y, Float:z;
        GetPlayerPos(playerid, x, y, z);
        new const player_objects_count = LegoObjectCount[playerid];
       	LegoObjects[playerid][player_objects_count] = CreatePlayerObject(playerid, objectid, x, y, z, 0.0, 0.0, 0.0, 300.0);
		LegoObjectOriginalPos[playerid][player_objects_count][0] = x;
		LegoObjectOriginalPos[playerid][player_objects_count][1] = y;
		LegoObjectOriginalPos[playerid][player_objects_count][2] = z;
		LegoObjectOriginalPos[playerid][player_objects_count][3] = 0.0;
		LegoObjectOriginalPos[playerid][player_objects_count][4] = 0.0;
		LegoObjectOriginalPos[playerid][player_objects_count][5] = 0.0;
        LegoObjectCount[playerid]++; // Увеличиваем счетчик объектов
        new string[59];
        format(string, sizeof(string), "[LEGO] Создан объект. Всего объектов: {35BD39}%d/%d", LegoObjectCount[playerid], MAX_LEGO_OBJECTS);
        SendClientMessage(playerid, COLOR_YELLOW, string);
    }
    return 1;
}


Команда для редактирования объектов, включая серверных.

CMD:objedit(playerid, params[])
{
    if(PlayerInfo[playerid][pAdmin] < 5) return 1;
    {
        if(!LegoMode[playerid]) return SendClientMessage(playerid, 0xFFFFFFFF, !"Включи режим LEGO: {F7CB31}/lego");
        SendClientMessage(playerid, 0xFFFF00AA, !"[LEGO] Выберите объект для редактирования");
        SelectObject(playerid);
    }
    return 1;
}


Данная команда, вернёт передвинутые объекты вашего сервера в исходное состояние

CMD:moveobj(playerid, params[])
{
    if(PlayerInfo[playerid][pAdmin] < 5) return 1;
    {
        if(!LegoMode[playerid]) return SendClientMessage(playerid, 0xFFFFFFFF, !"Включи режим LEGO: {F7CB31}/lego");
        new movedObjects = 0;
        for(new i = 0; i < MAX_OBJECTS; i++)
        {
            if(ServerObjectMoved[i])
            {
                SetObjectPos(i, ServerObjectOriginalPos[i][0], ServerObjectOriginalPos[i][1], ServerObjectOriginalPos[i][2]);
                SetObjectRot(i, ServerObjectOriginalPos[i][3], ServerObjectOriginalPos[i][4], ServerObjectOriginalPos[i][5]);
                ServerObjectMoved[i] = false;
                movedObjects++;
            }
        }
        new string[92];
        format(string, sizeof(string), "Стандартные объекты со смещённой позицией возвращены на свои места {E8AC32}(%d шт.)", movedObjects);
        SendClientMessage(playerid, 0x78A82CFF, string);
    }
    return 1;
}


Эта команда удаляет последний созданный объект через /newobj

CMD:dellast(playerid, params[])
{
    if(PlayerInfo[playerid][pAdmin] < 5) return 1;
    {
        if(!LegoMode[playerid]) return SendClientMessage(playerid, 0xFFFFFFFF, "Включи режим LEGO: {F7CB31}/lego");
        if(LegoObjectCount[playerid] == 0) return SendClientMessage(playerid, 0xCECECEFF, "Нет объектов для удаления.");
        DestroyPlayerObject(playerid, LegoObjects[playerid][LegoObjectCount[playerid] - 1]);
        LegoObjectCount[playerid]--;
        new string[37];
        format(string, sizeof(string), "[LEGO] Удалён объект {F74214}%d/100", LegoObjectCount[playerid]);
        SendClientMessage(playerid, 0xFFFF00AA, string);
    }
    return 1;
}


Эта команда удалит все созданные вами объекты.

CMD:delall(playerid, params[])
{
    if(PlayerInfo[playerid][pAdmin] < 5) return 1;
    {
        if(!LegoMode[playerid]) return SendClientMessage(playerid, 0xFFFFFFFF, "Включи режим LEGO: {F7CB31}/lego");
        if(LegoObjectCount[playerid] == 0) return SendClientMessage(playerid, 0xCECECEFF, "Нет объектов для удаления.");
        for(new i = 0; i < LegoObjectCount[playerid]; i++)
        {
            DestroyPlayerObject(playerid, LegoObjects[playerid][i]);
        }
        LegoObjectCount[playerid] = 0;
        SendClientMessage(playerid, 0xFFFF00AA, !"[LEGO] Все объекты удалены");
    }
    return 1;
}


Ну и эта команда повторит действие /newobj [id игрока]

CMD:repeat(playerid, params[])
{
    if(PlayerInfo[playerid][pAdmin] < 5) return 1;
    {
        if(!LegoMode[playerid]) return SendClientMessage(playerid, 0xFFFFFFFF, "Включи режим LEGO: {F7CB31}/lego");
        if(LegoObjectCount[playerid] == 0) return SendClientMessage(playerid, 0xCECECEFF, "Нет объектов для повторения.");
        new Float:x, Float:y, Float:z;
        GetPlayerPos(playerid, x, y, z);
        new lastObjectID = LegoObjects[playerid][LegoObjectCount[playerid] - 1];
        new modelid = GetPlayerObjectModel(playerid, lastObjectID);
        LegoObjects[playerid][LegoObjectCount[playerid]] = CreatePlayerObject(playerid, modelid, x, y, z, 0.0, 0.0, 0.0, 300.0);
        LegoObjectCount[playerid]++;
        new string[39];
        format(string, sizeof(string), "[LEGO] Создан объект {35BD39}%d/%d", LegoObjectCount[playerid], MAX_LEGO_OBJECTS);
        SendClientMessage(playerid, 0xFFFF00AA, string);
    }
    return 1;
}


Переменные
enum pInfo
{
	pName[MAX_PLAYER_NAME+1],
	pAdmin, 
new PlayerInfo[MAX_PLAYERS][pInfo];
заменяйте на свои из вашего мода. Цвета я использовал как коды, чтобы у вас не было ошибок error 017: можете заменить на свои дефайны цвета.

Система полностью тщательно протестирована, она полностью работает.

Скриншоты, как выглядит это всё:

Скриншоты [Показать]


P.S. Если редактируете серверные объекты, то сразу имейте ввиду, что createobject и стандартные объекты карты GTA San Andreas не редактируются. А вот уже те, которые через inckude <streamer>, то есть CreateDynamicObject, они редактируются. Будьте осторожны при изменениях и добавлениях объектов. Не вбивайте рандомные числа в /newobj. ID объектов SAMP полно в интернете. Пример темы: ТЫК

Спасибо за внимание!

Автор: Danny Marcelo

Сообщение отредактировал Danny_Marcelo: 23 марта 2025 - 15:40

1

#2
Пользователь офлайн   MuthaX 

  • Эксперт
  • Вставить ник
  • Раскрыть информацию
В чём смысл данной темы?
  • Просто воспроизвести расстановщик объектов?
  • Или сделать свой редактор?
  • Почему воспроизводится функционал именно указанного сервера?
  • Пробовал ли ты искать уже существующие решения?
  • Если пробовал, то чем это решение лучше прочих? Каких и почему?

По первому абзацу создаётся впечатление, что ты нагоняешь на прототип черты магнум опуса.
А по упомянотому тобою SOE создаётся впечатление, что MISTEV был прав на счёт того, что ты как-будто застрял в 2013 - приблизительно в те времена SOE и появился...

Просмотр сообщенияDanny_Marcelo (21 марта 2025 - 17:21) писал:

Как я понял объекты находятся непосредственно в базе данных MariaDB, а не на сервере, создатель боится что если всем подряд давать команду, те могут положить сервер (случайно), как например ютубер MalFoy чуть этого не сделал:

Изображение

  • Правильно ли я понимаю, что ты лично или кто-то ещё прямо спросил ЛИБО прочитал мысли создателя того проекта о том что он боится давать доступ к команде, т.к. это может положить сервер?
  • Или это твоя ничем не обоснованная догадка такая?
  • А ты не думал, что, если у них такая проблемная реализация редактора, то стоит спросить сначала разработчика, а не создателя за кривизну его рук?


Просмотр сообщенияDanny_Marcelo (21 марта 2025 - 17:21) писал:

//========================= [ Привязка к нику ] ================================
#define FullAccessOne        			!strcmp(PlayerInfo[playerid][pName], "Andrey_Ringo", false)
#define FullAccessTwo       			!strcmp(PlayerInfo[playerid][pName], "Smart_Jakson", false)
#define FullAccessThree      			!strcmp(PlayerInfo[playerid][pName], "Danny_Marcelo", false)
#define MAX_LEGO_OBJECTS 		        100 // Максимальное количество объектов


    Ты в поисках просто бездумно передираешь найденные результаты и не способен задуматься о возможных недостатках такой реализации?
    Вот банально, как минимум, нельзя взять да загнать никнеймы в массив?
    А если таких игроков нужно несколько десятков добавить? Дублирование кода тебя никак не смущает?


Просмотр сообщенияDanny_Marcelo (21 марта 2025 - 17:21) писал:

new LegoObjects[MAX_PLAYERS][MAX_LEGO_OBJECTS]; // Массив для хранения объектов

Мда. Обособлять редактируемое множество объектов за конкретным игроком... Про минусы реализации совместного редактирования будешь умалчивать?

Просмотр сообщенияDanny_Marcelo (21 марта 2025 - 17:21) писал:

В public OnPlayerConnect(playerid)

LegoMode[playerid] = false;
    LegoObjectCount[playerid] = 0;
    EditingObjectID[playerid] = -1;
    for(new i = 0; i < MAX_LEGO_OBJECTS; i++)
    {
        LegoObjects[playerid][i] = INVALID_OBJECT_ID;
    }


Разработка модулей для слабаков? Надо обязательно "как в 2013" пихать весь код системы напрямую, а не скрывать в отдельные функции?
Кто в здравом уме будет столько кода переносить?
Почему нельзя было всё относящееся к реализации редактора в отдельный файл загнать?
Почему обязательно надо из раза в раз херачить реализации прямо в интерфейсе (с программной точки зрения)?
Какие вообще принципы программирования ты знаешь?

Просмотр сообщенияDanny_Marcelo (21 марта 2025 - 17:21) писал:

case 272: // Диалог подтверждения для серверных объектов, не забудьте заменить на свой
        {
            if(response) // Если игрок нажал "Да"
            {
                EditObject(playerid, EditingObjectID[playerid]);
                SendClientMessage(playerid, 0xFFFF00AA, "[LEGO] Выберите объект для редактирования");
            }
        }

Я, конечно же не промолчу, что в коде перед этим у тебя неоптимально построен цикл. Но вот это... На магические числа нельзя закрывать глаза.



Просмотр сообщенияDanny_Marcelo (21 марта 2025 - 17:21) писал:

if (!FullAccessOne && !FullAccessTwo && !FullAccessThree) return 1;

С учётом написанного выше зачем тебе здесь двойное логическое отрицание?

Просмотр сообщенияDanny_Marcelo (21 марта 2025 - 17:21) писал:

        LegoObjects[playerid][LegoObjectCount[playerid]] = CreatePlayerObject(playerid, objectid, x, y, z, 0.0, 0.0, 0.0, 300.0);
        LegoObjectOriginalPos[playerid][LegoObjectCount[playerid]][0] = x;
        LegoObjectOriginalPos[playerid][LegoObjectCount[playerid]][1] = y;
        LegoObjectOriginalPos[playerid][LegoObjectCount[playerid]][2] = z;
        LegoObjectOriginalPos[playerid][LegoObjectCount[playerid]][3] = 0.0;
        LegoObjectOriginalPos[playerid][LegoObjectCount[playerid]][4] = 0.0;
        LegoObjectOriginalPos[playerid][LegoObjectCount[playerid]][5] = 0.0;

Это так написано специально для копрофилов?
Скрытый текст [Показать]


P.s: А ещё предложение в этой теме стоит распространить и на раздел готовых решений.
1

#3
Пользователь офлайн   M I S T E V 

  • Вставить ник
  • Раскрыть информацию
Зачем делать вырезку команд, когда ты можешь оставить ссылку на мод и указать строчку, где она расположена? Это ж сколько тем можно создать подобных :biggrin:

Ты если хочешь выделиться и привнести что-то, делай свои системы. Если нужна помощь - спрашивай, но делать подобное действительно бессмысленно

Зайди в раздел Инклуды и посмотри кто чем занимается. Эта тема в разы актуальнее, чем Команды.. Вот один из последних примеров, автор взял и сделал сам, были недочеты, но потом он их исправил и получилась полноценная система. Сделай что-то подобное :blush:

Ссылка: https://pawn.wiki/in...38-cursor-lock/

Сообщение отредактировал M I S T E V: 22 марта 2025 - 07:38

0

#4
Пользователь офлайн   Danny_Marcelo 

  • Знаток
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияM I S T E V (22 марта 2025 - 06:53) писал:

Нажмите сюда, чтобы прочитать это сообщение. [Показать]


В моде около 50к строк, и новичку сложно будет выдрать полностью рабочую систему. По своему опыту знаю, когда я даже вырезать не умел)
+100500 ошибок напугают новичка и он не будет знать что же ему делать. Тут уже готовый вариант, все ненужный дефайны, SCM и прочую лабуду выпилил. Чистый код, конкретно по данной системе. Оптимизация да, хромает, но это поправимо. Главное что весь код рабочий. А данную систему многие давно искали, именно похожую на Advance RP. У меня появилась возможность, я сделал и поделился. Эта тема по крайней мере уникальнее, чем +100500 тем про команду /kick))

За совет спасибо, почитаю. Никогда не делал инклуды и плагины, т.к. для меня это уже системные файлы и как то лишний раз влезать в них, сломать всю систему не хочется :biggrin: Но попробовать можно будет, еще раз благодарю.
0

#5
Пользователь офлайн   Danny_Marcelo 

  • Знаток
  • Вставить ник
  • Раскрыть информацию
MuthaX, Я вижу тебя задело, что какой то новичок Danny Marcelo указал на твою ошибку в теме 2023 года, раз ты решил к моему описанию темы пристать)) Ну да ладно, твое дело.

Цитата

В чём смысл данной темы?
Просто воспроизвести расстановщик объектов?
Или сделать свой редактор?
Почему воспроизводится функционал именно указанного сервера?
Пробовал ли ты искать уже существующие решения?
Если пробовал, то чем это решение лучше прочих? Каких и почему?

По первому абзацу создаётся впечатление, что ты нагоняешь на прототип черты магнум опуса.
А по упомянотому тобою SOE создаётся впечатление, что MISTEV был прав на счёт того, что ты как-будто застрял в 2013 - приблизительно в те времена SOE и появился...


Смысл данной темы в том, что именно создание объектов, копию Advance многие, в том числе и я искали очень давно. Я получил возможность её реализовать. Почему именно Advance RP, кто знает меня давно, да и даже знать не нужно, достаточно посмотреть другие мои созданные темы и сложить 2x2, чтобы понять, что мне нравится данный проект и я делюсь с другими единомышленниками, которые также любят Адванс. Я написал русским языком, что именно копию Advance RP сделал, а не просто расстановщик объектов. Поверь, найдутся люди которые спасибо скажут и уже нашлись, правда на другом портале. То что застрял в 2013, ну да, примерно в 2015 я перестал заниматься pawn, сейчас появилось время, изучаю что то новое в pawn, обновляю свои старые темы, улучшаю старый свой код, так сказать стараюсь совершенствоваться.


Цитата

Правильно ли я понимаю, что ты лично или кто-то ещё прямо спросил ЛИБО прочитал мысли создателя того проекта о том что он боится давать доступ к команде, т.к. это может положить сервер?
Или это твоя ничем не обоснованная догадка такая?
А ты не думал, что, если у них такая проблемная реализация редактора, то стоит спросить сначала разработчика, а не создателя за кривизну его рук?


Очисти свой разум. Ты видимо так хорошо выучил язык pawn, что забыл русский язык)

объекты находятся непосредственно в базе данных MariaDB, а не на сервере, создатель боится что если всем подряд давать команду, те могут положить сервер (случайно), как например ютубер MalFoy чуть этого не сделал:


Как я понял, это значит что я ПРЕДПОЛАГАЮ, а НЕ УТВЕРЖДАЮ.

Цитата

Ты в поисках просто бездумно передираешь найденные результаты и не способен задуматься о возможных недостатках такой реализации?
Вот банально, как минимум, нельзя взять да загнать никнеймы в массив?
А если таких игроков нужно несколько десятков добавить? Дублирование кода тебя никак не смущает?


Данная система привязки ника находится в моем моде еще с аля 2014 года, которую кстати мне тоже подсказали на каком то форуме. Пока других вариантов не знаю, по этому использую этот. Он работает, меня устраивает. Оптимизация, дело десятое, да и не думаю что есть необходимость конкретно данные проверки как то оптимизировать, если и понадобится привязка к более чем 3 никам, тогда есть смысл переписать по другому, пока не тревожит.

Цитата

new LegoObjects[MAX_PLAYERS][MAX_LEGO_OBJECTS]; // Массив для хранения объектов

Мда. Обособлять редактируемое множество объектов за конкретным игроком... Про минусы реализации совместного редактирования будешь умалчивать?


Одно из единственных, куда ты действительно внёс конкретики и как видишь я признаю свою ошибку. Согласен, нужно будет переделать, т.к. если все таки два человека и более будут пользоваться редактором одновременно, могут возникнуть какие то проблемы. Но мне пока не с кем было тестировать данный функционал. Делал всё один, от того и не подумал. За это спасибо!

Цитата

LegoMode[playerid] = false;
    LegoObjectCount[playerid] = 0;
    EditingObjectID[playerid] = -1;
    for(new i = 0; i < MAX_LEGO_OBJECTS; i++)
    {
        LegoObjects[playerid][i] = INVALID_OBJECT_ID;
    }



Разработка модулей для слабаков? Надо обязательно "как в 2013" пихать весь код системы напрямую, а не скрывать в отдельные функции?
Кто в здравом уме будет столько кода переносить?
Почему нельзя было всё относящееся к реализации редактора в отдельный файл загнать?
Почему обязательно надо из раза в раз херачить реализации прямо в интерфейсе (с программной точки зрения)?
Какие вообще принципы программирования ты знаешь?


Как умею, так и реализовал. Ты напиши как надо. В чем проблема? Или можешь только понтоваться, что ты такой ТРУ СКРИПТЁР, а другие шлак полный делают? Я вообще не помню, чтобы где то я писал, что я PRO PAWN СКРИПТЕР и знаю всё, с моим кодом не спорить тут... Знаешь вариант лучше? Ну предложи, попробуем. Я тебе Ванга что ли, что ты имеешь ввиду? Ты указал просто мой цикл и обосрал. Я могу лишь предположить, что ты предложил воспользоваться foreach, но сомневаюсь, что именно это ты имел ввиду. То что в stock можно было это закинуть, это да, но я оставил это так как есть. Кто захочет - переделает под себя.

Цитата

case 272: // Диалог подтверждения для серверных объектов, не забудьте заменить на свой
        {
            if(response) // Если игрок нажал "Да"
            {
                EditObject(playerid, EditingObjectID[playerid]);
                SendClientMessage(playerid, 0xFFFF00AA, "[LEGO] Выберите объект для редактирования");
            }
        }


Я, конечно же не промолчу, что в коде перед этим у тебя неоптимально построен цикл. Но вот это... На магические числа нельзя закрывать глаза.


Я вообще не понимаю, что ты в OnDialogResponse не так нашел? Опять же, никакой конкретики. Ради сюра? case 272 можно заменить на аля case DIALOGID_LEGO или что то подобное? Так я об этом знаю, но оставил специально цифру, т.к. пока еще многие используют числовой вариант. Мало кто этим пользуется. Больше я не знаю, что тебе тут не так. Если убрать данный case, то код перестанет работать, поверь я проверял, а по другому я не знаю как реализовать.

Цитата

if (!FullAccessOne && !FullAccessTwo && !FullAccessThree) return 1;


С учётом написанного выше зачем тебе здесь двойное логическое отрицание?


 LegoObjects[playerid][LegoObjectCount[playerid]] = CreatePlayerObject(playerid, objectid, x, y, z, 0.0, 0.0, 0.0, 300.0);
        LegoObjectOriginalPos[playerid][LegoObjectCount[playerid]][0] = x;
        LegoObjectOriginalPos[playerid][LegoObjectCount[playerid]][1] = y;
        LegoObjectOriginalPos[playerid][LegoObjectCount[playerid]][2] = z;
        LegoObjectOriginalPos[playerid][LegoObjectCount[playerid]][3] = 0.0;
        LegoObjectOriginalPos[playerid][LegoObjectCount[playerid]][4] = 0.0;
        LegoObjectOriginalPos[playerid][LegoObjectCount[playerid]][5] = 0.0;


Это так написано специально для копрофилов?


Тут да, можно было изменить на ||, если ты это имел ввиду. А код ниже сделать в цикле. На самом деле, ты не столь код мой разбирал, сколько конкретно ко мне будто у тебя претензия. Это и понятно, новичок ткнул в ошибку форумного полковника, как он посмел)) Это я про твой до*б в сторону моего описание.

А так в целом, скажу, мой код написан не самым лучшим, но и не самым худшим способом. Данная система работает как надо на основе полученных мною данных о оригинальной системе. Кому надо, тот переделает под себя, оптимизирует и т.д.. Ну и я по возможности изучения чего то нового в Pawn, буду со временем улучшать данный код. Повторюсь, на данную систему найдутся пользователи и уже нашлись на других порталах. Кому то нравится Arizona, кому то Advance, кому то другие, кто то делает своё уникальное. Каждый сам выбирает свой путь. Мне нравится делать копию систем Advance RP и делиться её с единомышленниками. Они всегда благодарны мне за это. Я это делаю совершенно бесплатно. Что дальше делать будут с предоставленными мною системами, это уже их дело. Надеюсь сейчас понятно все объяснил для гражданина MuthaX.

Сообщение отредактировал Danny_Marcelo: 22 марта 2025 - 19:27

0

#6
Пользователь офлайн   MuthaX 

  • Эксперт
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияDanny_Marcelo (22 марта 2025 - 16:15) писал:

Я вижу тебя задело, что какой то новичок Danny Marcelo указал на твою ошибку в теме 2023 года, раз ты решил к моему описанию темы пристать))

Какое-то нездоровое у тебя оформление: как-будто у тебя мания величия и ты заморочился, чтобы оформить на себя url ссылку в BB-кодах.
Поначалу я хотел было в ответ на эту фразу спросить "о чём вообще речь идёт?", но заморочившись с чтением последних твоих сообщений можно было бы предположить, что речь идёт о этой теме... и всё-равно как-то не понял за какую МОЮ ошибку ты зацепился.

[мем]Выдрал одну фразу из контекста - фатальная ошибка![/мем] - а потом понял, что ты сейчас зря бухтишь на бугра и не осознаёшь на сколько низко ты сам себя загоняешь и, наверно, и дальше в каждом сообщении упоминал бы о якобы моей ошибке в 2023 году.
Вот ты пишешь:

Просмотр сообщенияDanny_Marcelo (21 марта 2025 - 18:21) писал:

Я нашел ту тему, где у меня была проблема с машинами и именно ты же мне и советовал переписать машины с 0 до последнего ID :biggrin:
https://pawn.wiki/in...post__p__278349
https://pawn.wiki/in...post__p__278357

Т.е. ты буквально выдрал одно предложение из одного из 3 отправленных мною сообщений там:
Если интересует оптимизация перебора, то стоило бы в информацию о фракции занести 2 поля: мимимальный и максимальный ID фракционного транспорта и брать их в качестве пределов для цикла.

Но, если обратить на контекст моей подачи, то можно увидеть, что было ещё 1-ое сообщение:
Переделывай свою систему машин, это просто какой-то

Стоило бы присваивать каждой машине номер фракции, а не проверять номер машины на попадание в какие-то диапазоны чисел.

А также содержимое второго моего сообщения:
"Меньше памяти занимает данный код" - ни разу не правда. Ты сейчас у себя создаёшь повторения кода специализируя одну функцию под машины одной фракции (а фракций у тебя немало). Таким образом у тебя N_фракций почти одинаковых функций отличающихся только фракцией.
При чём ТЫ проверяешь vehicleid в подание между 2 числами (а это уже 3 элементарных операций не считая обращений к массиву), а мог бы просто проверить номер фракции машины на РАВЕНСТВО с номером фракции игрока. Т.е. именно кода жрёшь больше именно ты.


В довесок отмечу, что даже Perdolinka понял о чём я пишу:
Можно было создать отдельный блок памяти, сохраняя каждому транспорту номер каждой фракции(как тебе выше предложил MuthaX). Вариант, в целом, неплохой, доступ к массиву не занимает столь существенное время. Хотя, будем честны, в случае если там MAX_VEHICLES ячеек, то это уже солидный вес, а потому обращение будет, мягко говоря, не таким быстрым, а если ещё учесть присвоение в момент создания(хотя, если хукнуть CreateVehicle).


Таким образом из моих сообщений следует, что я предлагаю реализацию подобного плана:
// Объявление информации о транспорте.
enum e_vehicle_info {
E_FACTIONID, // Номер фракции
};
new VehicleInfo[MAX_VEHICLES][e_vehicle_info];
// Объявление информации о фракции
enum e_faction_info {
E_VEHICLE_ID_BEGIN,
E_VEHICLE_ID_LAST,
};
// Функция загрузки транспорта из какого-то источника
Vehicle_load(параметры_машины, номер_фракции) {
    new vehicleid = CreateVehicle(параметры_машины);
    if( vehicleid ) {
        VehicleInfo[vehicleid][E_FACTIONID] = номер_фракции;
        Некоторая_функция_которая_будет_уточнять_для_фракции_factionid_пределы_по_номерам_принадлежащих_ей_единиц_траспорта(factionid,
 vehicleid);
    }
    return vehicleid;
}
// Перебор же транспорта по какой-то фракции.
Faction_loopVehiclesExample(factionid) {
    new vehicleid, max_vehicleid = FactionInfo[factionid][E_VEHICLE_ID_LAST] + 1;
    for(vehicleid = FactionInfo[factionid][E_VEHICLE_ID_BEGIN]; vehicleid < max_vehicleid; ++vehicleid) {
        if( VehicleInfo[vehicleid][E_FACTIONID] == factionid ) {
            // Вот тебе тут и будут все vehicleid относящиеся к фракции
        }
    }
}

Именно такое я предлагаю, а не то, что ты предположил и теперь толдычишь как незыблемую истину.
У такой реализации нет никаких ограничений на количество транспорта фракции помимо общего количества MAX_VEHICLES транспорта. А в довесок в ходе работы сервера количество фракционных машин ещё и изменить можно. А что более важно - такая реализация не порождает 100500 функций на каждую фракцию по проверке принадлежности к ней транспорта.
За счёт увеличения используемой памяти можно пойти ещё дальше в плане оптимизации, например хранить массивы FactionVehicles[MAX_FACTIONS][MAX_VEHICLES] - для перечней и FactionNVehicles[MAX_FACTIONS] - для указания количества транспорта в перечне.

Возвращаясь к тому, в чём ты ошибся:
Ты пишешь как будто я тебе предложил перелать таким образом -
ты же мне и советовал переписать машины с 0 до последнего ID

В то время как я писал -
в информацию о фракции занести 2 поля: мимимальный и максимальный ID фракционного транспорта и брать их в качестве пределов для цикла.


То есть ты уже на моменте про первый транспорт во фракции допустил фатальную ошибку интерпретации: поставил знак тождества между "0 номер машины" и "минимальный номер транспорта" - это совершенно разные понятия обобщить которые в общем случае (а уточнений ты не давал) можно только, если ты стал дохуя выебываться без валидных пруфов и ебнулся с дуба.

Просмотр сообщенияDanny_Marcelo (22 марта 2025 - 16:15) писал:

Очисти свой разум. Ты видимо так хорошо выучил язык pawn, что забыл русский язык)

С учётом вышесказанного я настоятельно рекомендую тебе посчитать количество своих грамматических, синтаксических и семантических ошибок. Результат тебя расстроит. А, возможно, даже укажет на то, что ты дилетант во всём подряд.

Просмотр сообщенияDanny_Marcelo (22 марта 2025 - 16:15) писал:

Данная система привязки ника находится в моем моде еще с аля 2014 года, которую кстати мне тоже подсказали на каком то форуме. Пока других вариантов не знаю, по этому использую этот. Он работает, меня устраивает.

То есть всё что ты и делаешь - бездумно передираешь чьи-то идеи и реализации без задней мысли о возможных минусах такого подхода.
Вот например, какому-то админу приспичило, который должен иметь доступ к редактору, переименоваться... и не просто переименоваться, а это нужно сделать на нескольких серверах - ты будешь каждый такой раз только ради него пересобирать сервер и перезапускать его для вступления в силу списка?

Просмотр сообщенияDanny_Marcelo (22 марта 2025 - 16:15) писал:

Оптимизация, дело десятое, да и не думаю что есть необходимость конкретно данные проверки как то оптимизировать, если и понадобится привязка к более чем 3 никам, тогда есть смысл переписать по другому, пока не тревожит.

При чём тут оптимизация? Ты вообще никак не беспокоишься о простоте дальнейших доработок/правок своих поделок?

Просмотр сообщенияDanny_Marcelo (22 марта 2025 - 16:15) писал:

Как умею, так и реализовал. Ты напиши как надо. В чем проблема? Или можешь только понтоваться, что ты такой ТРУ СКРИПТЁР, а другие шлак полный делают? Я вообще не помню, чтобы где то я писал, что я PRO PAWN СКРИПТЕР и знаю всё, с моим кодом не спорить тут... Знаешь вариант лучше? Ну предложи, попробуем. Я тебе Ванга что ли, что ты имеешь ввиду? Ты указал просто мой цикл и обосрал. Я могу лишь предположить, что ты предложил воспользоваться foreach, но сомневаюсь, что именно это ты имел ввиду. То что в stock можно было это закинуть, это да, но я оставил это так как есть. Кто захочет - переделает под себя.

Ты не то, что даже не Ванга, а даже читаешь сообщения не ОТ и ДО. Только и делаешь, что цепляешься за отдельные фразы без контекста и не составляешь общей картины происходящего.
Я не понимаю как ты мог пропустить мимо это:
Надо обязательно "как в 2013" пихать весь код системы напрямую, а не скрывать в отдельные функции?

Ты либо слепой либо что?
Ты предлагаешь своим юзерам такое.
OnPlayerConnect(playerid) {
    // Вот здесь какой-то код одних систем, не относящихся к редактору объектов, но уже существующих в моде.
    LegoMode[playerid] = false;
    LegoObjectCount[playerid] = 0;
    EditingObjectID[playerid] = -1;
    for(new i = 0; i < MAX_LEGO_OBJECTS; i++)
    {
        LegoObjects[playerid][i] = INVALID_OBJECT_ID;
    }
    // Вот здесь какой-то код других систем, не относящихся к редактору объектов, но уже существующих в моде.
}

Как можно не понимать что такое "скрыть реализацию в отдельную функцию"?!
То есть банально:
// В файле относящемся к редактору
LegoEditor_onPlayerConnect(playerid) {
    LegoMode[playerid] = false;
    LegoObjectCount[playerid] = 0;
    EditingObjectID[playerid] = -1;
    for(new i = 0; i < MAX_LEGO_OBJECTS; i++)
    {
        LegoObjects[playerid][i] = INVALID_OBJECT_ID;
    }
}

// А на форуме/мануале просить юзера вставить только одну строчку в свой код:
OnPlayerConnect(playerid) {
    // Вот здесь какой-то код одних систем, не относящихся к редактору объектов, но уже существующих в моде.
    LegoEditor_onPlayerConnect(playerid);
    // Вот здесь какой-то код других систем, не относящихся к редактору объектов, но уже существующих в моде.
}

ДОФИГА СЛОЖНАЯ КОНЦЕПЦИЯ?

Просмотр сообщенияDanny_Marcelo (22 марта 2025 - 16:15) писал:

Я вообще не понимаю, что ты в OnDialogResponse не так нашел? Опять же, никакой конкретики. Ради сюра? case 272 можно заменить на аля case DIALOGID_LEGO или что то подобное? Так я об этом знаю, но оставил специально цифру, т.к. пока еще многие используют числовой вариант. Мало кто этим пользуется.

Понятно, оказывается, я ещё и имею дело со сторонником стадного мнения. То, что кто-то указывает номера напрямую и то, что таких много - ещё не значит, что это хорошая практика.
С такими книгами как "Чистый код" и подобным творчеством, который в том числе затрагивает темы рефакторинга, ты явно не знаком.

Просмотр сообщенияDanny_Marcelo (22 марта 2025 - 16:15) писал:

Тут да, можно было изменить на ||, если ты это имел ввиду. А код ниже сделать в цикле.
На самом деле, ты не столь код мой разбирал, сколько конкретно ко мне будто у тебя претензия. Это и понятно, новичок ткнул в ошибку форумного полковника, как он посмел)) Это я про твой до*б в сторону моего описание.

Ты вообще соображаешь к чему моя притензия была? Ты понимаешь что такое "двойное отрицание" или решил не читать это словосочетание? - К тому, что, если бы ты убрал знак "!" из:
#define FullAccessOne                           !strcmp(PlayerInfo[playerid][pName], "Andrey_Ringo", false)

(из всех подобных рядомстоящих define-ов)
и также из:
if (!FullAccessOne && !FullAccessTwo && !FullAccessThree) return 1;

... то твой код продолжил бы функционировать как и работал.
Вижу, что ты предпочитаешь затрагивать эмоциональные моменты, может быть ты ещё и в 2007-ой хочешь вернуться?


//Цитата: "А код ниже сделать в цикле."

LegoObjects[playerid][LegoObjectCount[playerid]] = CreatePlayerObject(playerid, objectid, x, y, z, 0.0, 0.0, 0.0, 300.0);
LegoObjectOriginalPos[playerid][LegoObjectCount[playerid]][0] = x;
LegoObjectOriginalPos[playerid][LegoObjectCount[playerid]][1] = y;
LegoObjectOriginalPos[playerid][LegoObjectCount[playerid]][2] = z;
LegoObjectOriginalPos[playerid][LegoObjectCount[playerid]][3] = 0.0;
LegoObjectOriginalPos[playerid][LegoObjectCount[playerid]][4] = 0.0;
LegoObjectOriginalPos[playerid][LegoObjectCount[playerid]][5] = 0.0;

Чел харош тупить: тебя никак не смущает повторяющийся код написанный тобою?
Достаточно сделать одно маленькое изменение и код будет не только красивым, но и быстрым (с учётом возможностей оптимизаций компилятором павна), легко редактируемым и менее подверженным ошибкам бездумной копипасты:
new const player_objects_count = LegoObjectCount[playerid];
LegoObjects[playerid][player_objects_count] = CreatePlayerObject(playerid, objectid, x, y, z, 0.0, 0.0, 0.0, 300.0);
LegoObjectOriginalPos[playerid][player_objects_count][0] = x;
LegoObjectOriginalPos[playerid][player_objects_count][1] = y;
LegoObjectOriginalPos[playerid][player_objects_count][2] = z;
LegoObjectOriginalPos[playerid][player_objects_count][3] = 0.0;
LegoObjectOriginalPos[playerid][player_objects_count][4] = 0.0;
LegoObjectOriginalPos[playerid][player_objects_count][5] = 0.0;

Ты блин, похоже, даже не видел нормальные темы ни разу в жизни: у тебя больше половины темы - реализация в коде внутрянки, а не описание что для чего нужно. Заведи, ну не знаю, походу у таких как ты стыдно регистрироваться, например, на гитхабе, выкладывай код на пастебин хотя бы.

Конечно же, если ты будешь говорить, что доёбываются до описания твоей темы, то не забывай, что и код, выложенный в ней непосредственно - часть описания темы.
Более того: у тебя нигде не уточняется, что это заготовка/база для доработок - ты преподносишь эту разработку как "почти 100% копия" - т.е. уже что-то практически готовое, но здесь даже нет банальной загрузки/сохранения объектов в файл/БД (о да, даже сюда я запихну упоминание о PawnTableHandler, с помощью которого можно реализовать поддержку работы и с тем, и с другим одновременно), а валидность моделей объектов ты предлагаешь проверять вручную (как будто нельзя сослаться на тему/страницу, где можно достать реализацию функции валидации номеров моделей объектов?).
0

#7
Пользователь офлайн   Danny_Marcelo 

  • Знаток
  • Вставить ник
  • Раскрыть информацию
MuthaX,

Цитата

Какое-то нездоровое у тебя оформление: как-будто у тебя мания величия и ты заморочился, чтобы оформить на себя url ссылку в BB-кодах.
Поначалу я хотел было в ответ на эту фразу спросить "о чём вообще речь идёт?", но заморочившись с чтением последних твоих сообщений можно было бы предположить, что речь идёт о этой теме... и всё-равно как-то не понял за какую МОЮ ошибку ты зацепился.


Лол, я указал просто чтобы понятно было о ком идёт речь. А если бы мой дорогой друг был внимательнее, то увидел был, что я заморочился и вставил твою ссылку аж 2 раза, ну да ладно, ты опять как всегда выдираешь из контекста...

Все что дальше пропущу до этого момента:

Цитата

Именно такое я предлагаю, а не то, что ты предположил и теперь толдычишь как незыблемую истину.
У такой реализации нет никаких ограничений на количество транспорта фракции помимо общего количества MAX_VEHICLES транспорта. А в довесок в ходе работы сервера количество фракционных машин ещё и изменить можно. А что более важно - такая реализация не порождает 100500 функций на каждую фракцию по проверке принадлежности к ней транспорта.
За счёт увеличения используемой памяти можно пойти ещё дальше в плане оптимизации, например хранить массивы FactionVehicles[MAX_FACTIONS][MAX_VEHICLES] - для перечней и FactionNVehicles[MAX_FACTIONS] - для указания количества транспорта в перечне.


Ну вот так и стоило тебе пояснить конкретно о чем идёт речь, ибо я подумал что ты имеешь ввиду переделать функционал спавна машин путём new carid[22] вместо new carid[2]. Я лучше буду дураком и 10 раз спрошу, но ты непонятно объясняешь. И ладно я вот такой тут нашёлся как говорится, что может с тобой тут подискутировать, другой же постесняется тебе отвеить что не понял и уйдет ни с чем. Может стоит подход твоих объяснений поменять? Я тебе приведу множество примеров. Daniel_Cortez, OkStyle, Edwin и многие другие, которых мог забыть в темах стараются разжевать новичкам, что да как путем примеров. Daniel_Cortez к примеру не поленился, разобрал мой мод по частям и объяснил что за что тут отвечает и какие проблемы меня ждут в будущем с данным модом. Итог, 9 из 10 его объяснений были поняты и исправлены. А pawn порой кажется что легкий язык программирования, но это совсем не так. Многие заблуждаются. И вот вас таких тут тысячи на форумах помощников. Просто тебе говорю к тому, что ты бы не просто бросался умными терминами, а показывал на примере, что это и с чем его едят. Тебе же фиолетово это, ты сумничал и все. Повторюсь, новичок в 95 из 100 уйдет ни с чем, т.к. постесняется написать тебе что не понял, т.к. посчитает себя глупым.


Все остальное я почитал, на дальнейший сюр про грамотность и т.п. не хочу даже разводить демагогию, ибо если я начну, это будет до бесконечности. По этому пропустим. По поводу кода, вот умеешь же, тут ты хотя бы сейчас пояснил в теме за мои конкретные ошибки в коде. Именно так и нужно объяснять по сути, а не тупо кидать код и говорить: тут не правильно *ЗАУМНЫЕ СЛОВА ИЗ УЧЕБНИКОВ*. Код ужас. static и const я практически не пользуюсь потому что оочень плохо с ними зазнакомился, из за чего собственно и не использую их. Я банально знаю что вместо new string можно использовать) Так что не по делу тут даже накинулся. Я как сумел, так и написал и повторюсь, система получилась полностью рабочая. Все тестировал сам. Как именно на YouTube продемонстрирована была работоспособность, так я её и повторил. Ни больше, ни меньше. Про то, что ты предлагаешь в файл или бд, тут уже индивидуальный подход нужен. У кого то моды на файлах. У кого то MySQL r39-6 как у меня, кто то до сих пор использует старую MySQL R5. А кто то на MySQL R41. И ещё много вариантов.Это нужно для каждой индивидуально делать, хотя да, ты скажешь, что там +/- одинаково, только названия функций в запросах разные, тем не менее. Я работал все время с R39 и другие нужно запоминать, что я пока не готов. Мне для начала как ты сам выше написал нужно понимание pawn изучить. Собственно как я уже и говорил, я и не спорю что я в pawn не профи, но и ты начал не с того, разбирая моё описание. Код это часть темы, да. Но ты начал с моих предположений, которые не требовались к разбору)) Это мое личное мнение. Если бы ты написал: Я думаю, что там сделана привязка к нику потому, что... Тогда я бы тебя понял, а не разбор каждого моего слова) Я приподношу как что то готовое? Так чел, я тебя разочарую, оно так и есть) Система готова, а как реализовывать дальше это уже дело человека, который возьмет данный код себе. Как уже описал выше, тут индивидуально, у каждого своя система. И да, система почти 100% копия. Почему почти? Потому, что я получил не 100% данных с оригинала, по этому реализовано, как реализовано, главное что повторяет все то, что в оригинальном проекте. А насколько мне известно, создатель Advance RP не использует /lego для создания объектов, для этого у него отдельный скрипт с логами координат. Но я делал не его, а админскую /lego, Ну и вот тут отвечу пожалуй:

Цитата

При чём тут оптимизация? Ты вообще никак не беспокоишься о простоте дальнейших доработок/правок своих поделок?


Как я уже написал тебе в предыдущем посте. Все что я сейчас о Pawn знаю, тем и делюсь. Когда узнаю что - то новое, лучшее, я беру на вооружение, тестирую и если все получается как нужно, тогда начинаю использовать и даже на форумах в своих старых темах применяю новый подход, чтобы люди получали лучше чем я предоставил до этого. Всему своё время как говорится. Я не AI, чтобы обучаться 1000 информации в минуту.
Все остальное я услышал. Давай закроем уже тему, ты высказался, я высказался. Каждый пусть останется при своём мнении.

Сообщение отредактировал Danny_Marcelo: 23 марта 2025 - 03:03

0

#8
Пользователь офлайн   MuthaX 

  • Эксперт
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияDanny_Marcelo (23 марта 2025 - 01:02) писал:

Нажмите сюда, чтобы прочитать это сообщение. [Показать]


Всё тобою написанное - разговор в пользу бедных и ленивых.
Про ИИ и "1000 информации в минуту" - смех и вздор: я бы поверил в это, если бы ты был пенсионером, который отработал всю жизнь на работе требующей выполнение тупой и машинальной работы и, который лишился жадности к знаниям.

Даже не удосужился пойти и узнать, что я тебе для сохранения/загрузки посоветовал и вычитать там информацию о том, что там тебе потребуется только знание о mysql_(/p/t)query функции, а все различия в версиях плагина для БД уже учтены внутри.
0

#9
Пользователь офлайн   Danny_Marcelo 

  • Знаток
  • Вставить ник
  • Раскрыть информацию
Подправил код, как предложил MuthaX, предварительно проверив работоспособность. Всё работает. Код в дальнейшем будет улучшаться во благо оптимизации или же по вашим предложениям. Сам функционал и дизайн не будет затрагиваться, т.к. заявленная тема гласит, что это копия Advance RP.
0

#10
Пользователь офлайн   krolik-gta 

  • Новичок
  • Вставить ник
  • Раскрыть информацию
пушка, обожаю цвета адванса, днем себе возьму
1

Поделиться темой:


Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей


Яндекс.Метрика