Jump to content

Flaker

Members
  • Posts

    619
  • Joined

  • Last visited

Posts posted by Flaker

  1. Более легкий и менее костыльный вариант - заносить функции в таблицу.
      
    t = {} 
      
    function t.foo() 
      -- что-то делается 
    end 
      
    -- вызываем по переменной 
    local s = 'foo' 
    t[s]() -- сам вызов 
      
    

    Не надо никуда ничего заносить... Они и так в таблице...

    В Lua подобие scope реализовано с помощью таблиц. Все данные можно найти в суперглобальной таблице G.

  2. Ну со взятием цвета пикселей понятно...

    Что у тебя входит в предобработку?

    Как реализовано сейчас?

    У меня есть несколько теоретических идей по этому поводу, могу подeлиться:

    *Предобработка*

    Обрабатываем необходимые картинки 1 раз, при запуске некого ресурса, в директории которого файлы с картинками.

    В предобработку входит составление карты цветов пикселей в шестнадцатеричном виде с последующим сохранение в файлы ( синхронизированные с картинками ) или бд, в виде сериализованного массива.

    При последующих запусках проверяем наличие карт пикселей для определенных картинок, если нет, то возвращаемся на шаг назад, если есть, то грузим в память эти карты ( loadstring ).

    Далее, мы должны составить однонаправленный граф зависимостей для картинок. С помощью него будем определять, что и из чего вырезать.

    Далее проходимся по картам пикселей, которые теперь представлены в виде обычных многомерных массивов, вырезаем необходимые цвета, пишем новую карту ( в заранее созданный массив ).

    Новая карта готова, на основе ее рисуем новую картинку ( dxSetPixelColor ), которую сохраняем в память и на диск.

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

    *Использование*

    Далее, после всех обработок, картинки должны быть сохранены в памяти клиента ( в течении сессии ) и на диске ( всегда ).

    Для отрисовки просто забираем текстуру из памяти и работаем уже с готовой текстурой.

    *Профиты*

    Обработка только при 1 заходе на сервер ( при последующих, уже все сохранено ).

    Подвисание на момент обработки можно замылить использую псевдо-потоки ( читай lua coroutine ).

    Как уже говорил, это теория...

  3. игра просто виснет на циклах

    А как ты реализовывал?

    Данные о картинках ты откуда достаешь, при отрисовке и редактировании?

    Предобработку, кэширование использовал?

    В принципе, если ты не делаешь редактор внутри MTA, то даже при использовании алгоритмов грубой силы, можно добиться некоторой оптимизации.

    А вообще, возможно стоит почитать об алгоритмах, используемых при работе с графикой.

  4. На счет этого сайта - пусть люди делают что хотят и как хотят, почему все надо обосрать? Если вы думаете что вы лучше, это не значит что надо пытаться опустить остальных. Пройдите мимо и сэкономьте нервных клеток.

    Всем спасибо, все свободны. Тему можно закрывать ( а лучше удалять ), дабы не продолжать этот бесполезный срач, который ничем, никому не поможет. Я думаю, Lil сказал все верно, если хотим что нибудь доказать - делаем лучше, показываем свое, получаем лавину дерьма и постов "Аффтор лах", продолжаем дальше злорадствовать над другими, но теперь уже тихо и без лишнего шума.

  5. table = 3 -> integer от 0 до 32656

    Человек до сих пор на 16 разрядной машинке сидит!( И то не правильной какой-то, если int у него 32656 ) А вы тут наезжаете... Пожалели бы!

    Lua > table = 3 -> не рискну писать, а то вдруг компилятор подумает что это таблица и будет ждать что-то типа table.getn или table.remove.

    Эта проблема решается добавлением комментария для компилятора... Например можно написать так:

      
    table = 3; // Компилятор, ты должен помнить, что, хотя тут написано слово table, эта переменная будет числом! 
      
    print( type( table  ) ); 
      
    

    На данном примере, ты можешь наблюдать реальную пользу в использовании комментариев...

    С++ > string > строчная перемена

    Нововведение чтоль? Пол века не обновляли, а тут бабах и тип данных string появился...

    Даа, жаль, что я не пишу на C++

  6. 1) Вариант с колшейпами, при правильной реализации, работает и быстрее и по памяти экономичнее.

    2) Вычислять расстояние между точками лучше функцией getDistanceBetweenPoints3D. Она выполняется на более низком уровне и производит расчеты быстрее.

  7. Локализатор? Ахах! Ты про BlackFan?

    Лучше наверно назвать русский представитель...

    А ему зачем Lua знать? O_o

    Те кто работают с комьюнити, чаще всего, не разбираются во внутренностях продукта...

  8. Пока онлайн есть, надо все таки спросить:)

    Как сделать так чтобы маркер создавался в любой ротации сзади автомобиля( в моем случае Buritto).?

    Вот есть набросок но не получаетсья что - то:(

    posX = posX - math.sin(math.rad(rotation)) * 1.5 
    posY = posY + math.cos(math.rad(rotation)) * 1.5 
    

    rotation + 90 надо... Ротация в GTA не совсем с 0 начинается

    Но удобнее оффсетом по матрице вычислять...

  9. "list($name,$Points,$ping) = split("||||",$player);" 
    

    Функция split делит строку на подстроки по указанному разделителю ( в данном случае разделитель это "||||" ). Возвращает массив из этих подстрок.

    Функция list последовательно присваивает своим аргументам значения массива, который идет после знака "=".

    Идиотский туториал...

    Что ты вообще пытаешься сделать?

  10. Вот эта говнокод... Криворукий какой-то писал... Таких вообще нельзя к коду даже близко подпускать... Поколение деградирует... Рашка разваливается... Нашим флагом уже подтираются панк, мать его, группы...

    Вот тебе серверная часть, и можешь не спрашивать откуда я это взял:

    local CarsSettings = {} 
      
    function setElementSpeed(element, unit, speed) 
        if (unit == nil) then unit = 0 end 
        if (speed == nil) then speed = 0 end 
        speed = tonumber(speed) 
        local acSpeed = getElementSpeed(element, unit) 
        if (acSpeed~=false) then 
            local diff = speed/acSpeed 
            local x,y,z = getElementVelocity(element) 
            setElementVelocity(element,x*diff,y*diff,z*diff) 
            return true 
        end 
      
        return false 
    end 
      
    function getElementSpeed(element,unit) 
        if (unit == nil) then unit = 0 end 
        if (isElement(element)) then 
            local x,y,z = getElementVelocity(element) 
            if (unit=="mph" or unit==1 or unit =='1') then 
                return (x^2 + y^2 + z^2) ^ 0.5 * 100 
            else 
                return (x^2 + y^2 + z^2) ^ 0.5 * 1.61 * 100 
            end 
        else 
            outputDebugString("Not an element. Can't get speed") 
            return false 
        end 
    end 
      
    addEventHandler ( "onResourceStart", resourceRoot, 
        function ( ) 
            local StationsFile = xmlLoadFile ( "backfire_settings.xml" ) 
            if ( StationsFile ) then 
                outputDebugString ( "backfire_settings.xml successfully open") 
                for _, data in ipairs ( xmlNodeGetChildren ( StationsFile ) ) do 
                    local attrs = xmlNodeGetAttributes ( data ) 
                    CarsSettings[tostring(attrs.name)] = { x = tonumber(attrs.x), y = tonumber(attrs.y), z = tonumber(attrs.z) } 
                end 
            else 
                outputDebugString ( "Failed to open to backfire_settings.xml", 1 ) 
            end 
        end 
    ) 
      
      
      
    addEvent ( "create3DBackfireSound", true ) 
    addEventHandler ( "create3DBackfireSound", root, 
        function ( theVehicle) 
            if ( theVehicle ) then 
                local vehicleName = getVehicleName( theVehicle ) 
                if ( type(CarsSettings[vehicleName]) == "table" ) then 
                    local x, y, z = tonumber(CarsSettings[vehicleName].x), tonumber(CarsSettings[vehicleName].y), tonumber(CarsSettings[vehicleName].z); 
                    triggerClientEvent(root, "create3DBackfireSoundClient", root, theVehicle, x, y, z) 
                end 
            end 
        end 
    ) 
      
      
    function startMonitoring ( thePlayer, seat, jacked ) 
        if (seat == 0) then 
            triggerClientEvent(thePlayer, "chandeMonitoringState", thePlayer, true, source) 
        end 
    end 
    addEventHandler ( "onVehicleEnter", getRootElement(), startMonitoring ) 
      
    function stopMonitoring ( thePlayer, seat, jacked ) 
        if (seat == 0) then 
            triggerClientEvent(thePlayer, "chandeMonitoringState", thePlayer, false) 
        end 
    end 
    addEventHandler ( "onVehicleExit", getRootElement(), stopMonitoring ) 
    

  11. Ухх, Tederis, вы из тех, кто шашлык в белых кедах делает? Зачем же так в лоб то...

    Привязываем колшейп(окружность) к педу, при его создании... Это будет наша зона видимости врагов( А если точнее дальность чувствительности педом врагов, ведь зона видимости надо рассчитывать относительно поворота башни и предметов на пути, ну да ладно, пока так ).

    Устанавливаем синкера( Тот игрок, через которого будем синхронизировать )

    Теперь на клиентской части синкера:

    Получаем игроков внутри нашего колшейпа ( Это оптимальнее по производительности, так как: "ColShape'ы значительно быстрее, потому что реализованы через R-древо" )... Ну и собственно получаем ближайшего из них...

    Запоминаем таргет...

    Дальше с синкера отправляем команду "this бот стрелять" на сервер. С сервера ее пересылаем root'у... И собственно стреляем...

    Стрелять надо так: немного стреляем, немного стреляем, потом немного не стреляем и так в цикле...

    Ну, собссно, все.

  12. Устал я смотреть на ваши извращения...

    Вот я писал библиотечки для работы с dx: http://rghost.ru/47795269 ( Прошу kernell'ом не закидывать, но конструктивная критика приветствуется )

    С их помощью ты можешь легко реализовать, то, что задумал.

    Пользоваться ими примерно так:

      
      
    ------ Создание изображения ------- 
    local myimage = image:create 
    { 
        fX = 0, 
        fY = 0, 
        fW = 1280, 
        fH = 1024, 
        mImage = 'cam.png' 
    }; 
      
    ------ Создание рендеринга ------ 
        -- Рендеринг происходит в порядке инициализации. -- 
    render:create 
    { 
        myimage 
    }:start(); 
      
      
    -- Скрываем изображение через 5 секунд -- 
      
    setTimer(  
        function() 
            myimage:visible( false ); 
        end, 5000, 1 ); 
      
    

×
×
  • Create New...