-
Posts
1,739 -
Joined
-
Last visited
Everything posted by Kernell
-
Я так понял нужно смотреть lua memory? там только у ресурса admin 10 мегабайт и у handling_editor 17 мегабайт. Остальные ресурсы в пределах 250 килобайт. Значение lua total - 40 мегабайт, при этом загрузка оперативной памяти в данный момент больше 1500 мегабайт. В какую сторону копать? Игровой хостинг предоставляет доступ к терминалу сервера, например по протоколу SSH? Не понятно на основе каких данных хостинг выдаёт такие значения, вполне возможно, что эти данные указаны с учётом кэша.
-
Обсуждение перенесено из этой темы: viewtopic.php?p=780235#p780235 Раздражает... Можно же грузить модельки, составляющие в основном несколько гигабайт обычно, уже во время игры. Я могу привести ряд причин почему это не возможно. Например, ситуация когда игрок не должен видеть оригиналов моделей, дабы не знать что на что заменили. Или например ситуация когда идёт фоновая загрузка автомобиля, модель автомобиля скачалсь - вас из него выкинуло (водителя всегда выкидывает из авто). Хуже того, если заменены целые участки города? Особенно если они очень сильно меняют ландшафт. Даже самые мелкие детали могут испортить впечатление об игре, поэтому лучше один раз загрузить и подождать, дабы потом не расстраиваться А на счёт "раздражает" - не верю. Почему-то никого не раздражает скачивать Battlefield, Need For Speed: World, Warthunder, Counter-Strike, World of Tanks (да там вообще обновления мелкие по 200 мегабайт чуть ли не каждый день) - и это только первое что пришло в голову. MTA чем хуже? По моему это больше плюс, чем минус. Ведь разработчикам дана возможность создать более уникальную для вас игру, как-то её разнообразить. И я говорю не о БПАН серверах где просто понапихали моделек, а о уникальных проектах где новые объекты очень сильно меняют игру. Например, расширяет список оружия до 20, а то и более, или новый город (ну ладно, островок ). Действительно обидно, когда скачиваешь гигабайты, а видишь некачественные модели взятые непонятно откуда, да и внешне они ничем не лучше чем на тех же БПАН серверах. Вобщем злоупотре:Oть этим явно не стоит.
-
P.S. Почему-то всех так смущает загрузка всего лишь в 1GB (которая происходит 1 раз), а как качать игры по 30 GB так норм. Какой-то дурацкий стереотип сложился у людей
-
Upgrading Lua to 5.2 or 5.3 would cause quite some issues. Many servers are using old code which may be incompatible to newer Versions of Lua without several changes. Furthermore upgrading Lua would cause all compiled scripts to break, which would be a huge issue for servers using scripts which are not available as source code (as an example: many public race maps use compiled scripts for random things). If you're lacking some specific feature of 5.2 or 5.3 there's most likely a workaround or an alternative available. All scripts are written in Lua 5.1.4 works fine on Lua 5.3. Lua developers made sure that the old scripts have worked successfully in the new versions. What have MTA done with Lua, they can not update it?
-
Извиняюсь за долгий ответ, немного занят был. В общем поковырял код, и такое чувство что в пиксельный шейдер не приходит информация о Diffuse цвете. Поэтому как вариант создать эту информацию самому, благо мы имеем текстуру модели и её UV координаты. Под структурой PSInput объяви сэмплер с текустурой gTexture0 (в данном случае это будет omokung). sampler2D ColorSampler = sampler_state { Texture = <gTexture0>; }; далее замени это: float4 color = PS.Diffuse; на это: float4 color = tex2D( ColorSampler, PS.TexCoord ); Конечно же после таких действий моделька будет без теней и прочего. С помощью вершинного шейдера и функции MTACalcGTABuildingDiffuse (из mta-helper) по аналогии как тут можно высчитать нужные цвета теней для PS.Diffuse (что кстати было бы более правильным решением, чем то которое я привёл выше) По поводу прозрачности пока не разобрался почему так происходит, альфа наложение включено, но работает либо не правильно, либо мы чего-то не знаем.
-
Меняем цвет компонентам автомобиля с помощью шейдера
Kernell replied to Kernell's topic in Уроки / Примеры
1) Тут где-то на форуме рекомендовали не пользоваться GTA Crazy IMG Editor (нужно искать), а использовать IMG Tool 2.0 2) Этот квадрат называется LOD (Level of Detail, где-то видел даже такой вариант - Low Object Distance). 3) Зачем клонировать диск? Достаточно просто к нему применить новый материал. 4) Я не знаю как поступает KAM`s Script, но: 5) Судя по ошибке KAM's Script, ты криво его установил, так как он не может найти информацию о материалах. Эта тема не по моделированию, и даже не по 3D Max`у. Максимум на что я могу ответить в этой теме - по шейдерам, Lua, MTA и немного о ZModeler2. Стоп, запаковываем текстуру (TXD), а заменяем модель (DFF), я запутался. Сказано же - обычная процедура. TXD и DFF в любом случае нужно загружать и заменять, так как мы имеем модифицированную модель и текстуры для неё. P.S. Только у меня Submit в Quick Reply не работает в этой теме? -
Без кода сказать что либо не возможно. Есть предположение, что проблема в z-буффере
-
Опаздываете, новость уже устарела, а МТАшники уже думают куда перейти
-
Явной точки входа как таковой нет. Все скрипты выполняются по порядку, как в PHP. По поводу подключения других скриптов (инклудов), в стандартном Lua это делается с помощью dofile, либо подключением модулей с помощью require. В МТА это всё вырезано, вместе с остальными небезопасными функциями. Вместо этого придётся подключать необходимые библиотеки в meta.xml до вашего основного скрипта. Если же нужна какая-то "точка входа", с которой будет начинаться вся логика, то советую посмотреть в сторону события onResourceStart (onClientResourceStart - аналог для клиента)
-
Скриптинг есть не только в играх, он активно используется в других местах, например в браузерах JavaScript, разработка сайтов на PHP, Node.JS или ASP.Net - всё это сценарии, т.е. криптинг и C# не смотря на свою сложность тоже является таковым. Как и любому скриптовому языку ему нужно куда-то встраиваться и выполняться с помощью интерпретатора. В случае с C# код переводится в CIL и выполняется в .NET Framework (CLR).
-
Меняем цвет компонентам автомобиля с помощью шейдера
Kernell replied to Kernell's topic in Уроки / Примеры
Никаких флагов я не устанавливаю, они и не нужны. Я просто взял текстуру, скопировал и назвал по своему, далее загрузил в материал и применил материал к нужным полигонам. -
Вот это утро вы мне устроили.... C# стал скриптовым языком, а скриптовый и компилируемый язык - это у вас антонимы. А. Фи. Геть. Читаем дальше и повнимательней. Или вы можете доказать обратное? C# не стал скриптовым, он им всегда был.
-
Меняем цвет компонентам автомобиля с помощью шейдера
Kernell replied to Kernell's topic in Уроки / Примеры
3ds Max + KAM's Script Не совсем понимаю, что значит "используешь текстуру". Попытаюсь разобраться. Текстура WHEELS.tga - в моём случае это копия vehiclegeneric256 (как было сказано выше). Но вообще использовать можно любую текстуру, главное её потом наложить на нужные полигоны. Далее мы её запаковываем в TXD архив, и после чего следует обычная процедура замены моделей в MTA (engineReplaceDFF и т.д.). Для того и существует форум - чтобы другие могли найти решение своих вопросов. -
В модели находится только одно колесо, там уже дальше происходит магия и оно появляется в игре на всех 4х местах. Как следствие получить его ротацию я не могу. Если только получать ротацию дамми колес? Но эти функции вроде не работают с дамми. Работают. Именно с ними и нужно работать.
-
-
getPedTask ещё более расширенный вариант
-
setPedAimTarget не работает, да. Но вместо этого обновили setCameraTarget, теперь она принимает координаты X Y Z
-
Проще написать собственное вращение камерой и самому направлять игрока в цель
-
Паскаль
-
Меняем цвет компонентам автомобиля с помощью шейдера
Kernell replied to Kernell's topic in Уроки / Примеры
Сразу видно, кто не читал статью Эта "процедура" выполняется конкретно для материала. -
Как я и обещал – публикую статью о некоторых возможностях шейдера и MTA. Речь пойдёт об изменении цвета нужных нам компонентов автомобиля (а точнее текстуры, которые наложены на полигоны этих компонентов) с помощью пиксельного и вершинного шейдеров. В качестве примера, я буду использовать стандартный автомобиль Sultan, а перекрашивать я ему буду диски на колёсах. На самом деле данный метод будет работать на любых объектах игры, будь-то это объекты ландшафта или же персонажи. Но так как сегодня мы будем работать с ZModeler 2, то их рассматривать мы не будем (так как ZM2 не умеет работать с костями персонажей и плохо экспортирует обычные объекты). Сразу оговорюсь – имеется ввиду, что вы уже владеете основами работы с ZModeler 2, поэтому детально рассматривать эту программу мы не будем. К счастью русскоязычных уроков по ZM2 очень много. Подготовка И так, мы имеем проект с уже готовым автомобилем, который без проблем работает в нашей любимой игре. Теперь можно приступать к делу. Для того чтобы MTA смогла найти с каким материалом ей работать — мы должны передать ей имя с помощью engineApplyShaderToWorldTexture. При экспорте модели из ZModeler 2 все материалы принимают название первой текстуры в самом материале. Т.е. если ваша текстура называется WHEELS.tga – то материал будет называться WHEELS. Это очень важно, так как если вы просто покрасите колёса и не установите текстуру (хотя бы в 1px), то материал в игре будет называться unnamed, как и все у которых нет текстур. Реализация Так уж случилось, что диски моего автомобиля имеют текстуру vehiclegeneric256, которая не является уникальной (ею окрашены ещё другие части автомобиля) – это не редкое явление. Чтобы решить эту проблему, придётся создать копию этой текстуры и назвать так как нам нужно. Далее мы создаём новый материал, называем его как нам удобно (я предпочитаю чтобы имена материалов и имена текстур совпадали), добавляем новую текстуру, выделяем нужные нам полигоны и применяем к ним наш материал. Экспортируем нашу модель.. и а этом наша работа с ZModeler2 закончена. Пишем шейдер Сам по себе шейдер будет очень простой, мы создадим одну переменную которой мы сможем задавать значения цвета из скрипта, все остальные данные нам предоставит MTA. Для загрузки шейдера я использовал следующий скрипт (он очень простой, поэтому отдельно его рассматривать мы не будем): addEventHandler( "onClientResourceStart", resourceRoot, function() local shader = dxCreateShader( "color.fx" ); if shader then dxSetShaderValue( shader, "color", { 1.0, 0.5, 0.0 } ); engineApplyShaderToWorldTexture( shader, "wheels256" ); end end ); Теперь займёмся написанием самого шейдера. Объявляем переменные: float4 color = 1; sampler Sampler0 : register( s0 ); В качестве цвета мы используем переменную color - её значение мы будем устанавливать с помощью engineApplyShaderToWorldTexture Теперь нам необходимо взять текущий цвет пикселя и «смешать» его с нашим цветом (color): struct PSInput { float2 TexCoord : TEXCOORD0; }; float4 PixelShaderFunction( PSInput PS ) : COLOR0 { float4 texColor = tex2D( Sampler0, PS.TexCoord ); texColor *= color; return texColor; } Всё что и делает этот шейдер – просто перекрашивает пиксели текстуры. Как видно мы не учитываем освещение из-за чего наши колёса будут светиться в темноте как огни. И тут на помощь к нам приходит mta-helper.fx написанный нашими любимыми The MTA Team =) Так же они для нас написали замечательную функцию которая просчитывает дифьюзный цвет автомобиля с учётом глобального затенения мира – MTACalcGTAVehicleDiffuse. Функция первым аргументом требует нормали вершин. Так как пиксельный шейдер работает непосредственно с изображением, информацию о нормалях мы не имеем. Для этого нам придётся написать вершинный шейдер. Исправленный код шейдера: #include "mta-helper.fx" float4 color = 1; sampler Sampler0 : register( s0 ); struct VSInput { float4 Position : POSITION0; float3 Normal : NORMAL0; float4 Diffuse : COLOR0; float2 TexCoord : TEXCOORD0; }; struct PSInput { float4 Position : POSITION0; float2 TexCoord : TEXCOORD0; float4 Diffuse : COLOR0; }; PSInput VertexShaderFunction( VSInput VS ) { PSInput PS = (PSInput)0; float4 worldPosition = mul( VS.Position, gWorld ); float4 viewPosition = mul( worldPosition, gView ); float4 position = mul( viewPosition, gProjection ); PS.Position = position; PS.TexCoord = VS.TexCoord; PS.Diffuse = MTACalcGTAVehicleDiffuse( VS.Normal, VS.Diffuse ); return PS; } float4 PixelShaderFunction( PSInput PS ) : COLOR0 { float4 texColor = tex2D( Sampler0, PS.TexCoord ); texColor *= PS.Diffuse * color; return texColor; } technique { pass P0 { VertexShader = compile vs_2_0 VertexShaderFunction(); PixelShader = compile ps_2_0 PixelShaderFunction(); } } В вершинном шейдере мы создаем новый объект типа PSInput, который будет подаваться на вход в нашу функцию PixelShaderFunction. Так как объект изначально не имеет никаких данных, наша задача передать их, как мы и сделали это с TexCoord, Diffuse и Position. Так как основной задачей вершинного шейдера является установка вершин, то он должен определить семантику POSITION для выходного параметра. В нашем случае это Position. Чтобы получить правильную позицию вершины для пиксельного шейдера, мы умножаем её на мировую матрицу объекта (gWorld), затем на матрицу вида камеры (gView), а затем и на матрицу проекции камеры (gProjection). Далее всё просто, с помощью функции написанной разработчиками MTA мы просчитываем новый цвет и передаём в Diffuse. В пиксельном шейдере мы просто умножаем полученный Diffuse на наш color, вот собственно вот и всё. Пишем скрипт для шейдера Скрипт который я использовал выше не подходит для работы на реальном сервере, так как не поддерживает работу с несколькими объектами, ибо шейдер глобальный, а значит цвет колёс у всех машин будет один. Для этого нам нужно для каждого автомобиля создавать новый объект шейдера, который будет иметь своё значение цвета. Хранить информацию о цвете колёс мы будем в ElementData в виде таблицы – это позволит устанавливать цвет с серверной стороны (для этого мы будем отслеживать событие onClientElementDataChange). Так же мы будем отслеживать события onClientElementStreamIn, onClientElementStreamOut и onClientElementDestroy. Событие onClientElementStreamIn необходимо нам для того чтобы создать шейдер когда автомобиль попадёт в стример клиента, остальные два – для удаления шейдера. Скрипт шейдера: local vehicles = {}; function CreateVehicleShader( vehicle ) local color = getElementData( vehicle, "WheelsColor" ); if color then local shader = dxCreateShader( "color.fx" ); if shader then vehicles[ vehicle ] = shader; dxSetShaderValue( shader, "color", color ); engineApplyShaderToWorldTexture( shader, "wheels256", vehicle ); return true; end end return false; end function CheckVehicleShader( element ) local vehicle = element or source; if vehicle and getElementType( vehicle ) == "vehicle" then if vehicles[ vehicle ] then return true; end return CreateVehicleShader( vehicle ); end return false; end function DestroyVehicleShader( element ) local vehicle = element or source; if vehicles[ vehicle ] then destroyElement( vehicles[ vehicle ] ); vehicles[ vehicle ] = NULL; end end addEventHandler( "onClientElementStreamIn", root, CheckVehicleShader ); addEventHandler( "onClientElementStreamOut", root, DestroyVehicleShader ); addEventHandler( "onClientElementDestroy", root, DestroyVehicleShader ); addEventHandler( "onClientElementDataChange", root, function( key, oldValue ) if key == "WheelsColor" and getElementType( source ) == "vehicle" and CheckVehicleShader( source ) then dxSetShaderValue( vehicle[ source ], "color", getElementData( source, "WheelsColor" ) ); end end ); addEventHandler( "onClientResourceStart", resourceRoot, function() for i, vehicle in ipairs( getElementsByType( "vehicle", root, true ) ) do CheckVehicleShader( vehicle ); end end ); Как можно было заметить, функция CreateVehicleShader создаёт шейдер для нашего автомобиля. В случае успеха возвращает true. Вызов функции происходит только из CheckVehicleShader - она проверяет наличие шейдера для автомобиля, если его нет - создаёт его. В случае успеха так же возвращает true. Так как при старте ресурса в стримере уже могут быть автомобили и они могут иметь информацию о цвете (WheelsColor), мы используем событие onClientResourceStart для проверки всех автомобилей, что находятся в стримере. onClientElementDataChange мы отслеживаем на случай изменения информации о цвете со стороны сервера. Так как изначально её может не быть, то шейдер не будет создан при старте ресурса или когда автомобиль попадёт в стример игрока - для этого у нас есть функция CheckVehicleShader.
-
Да, вы правы. Hardcoded команды нельзя выполнять из соображений безопасности.
-
Искать не пробовали? executeCommandHandler
-
Я не понимаю, где тут тренинг? Написать обычный цикл статей описывающие те или иные аспекты безопасности - не тренинг.
-
В том и фишка, что я никого не тыкаю в вики. Те кто допускают ошибки или задают глупые вопросы - я просто не отвечаю на такие вопросы. Должно быть ты меня кое с кем перепутал... Не буду спорить на эту тему. Но я считаю, что не стоит лезть в МТА если программирование не твоя специальность. Посмотри на текущую картину SA-MP объективно. Думаешь почему там столько быдло-кодеров? - Потому что они начали изучать программирование с SA-MP, в итоге появилось в сети куча говно-скриптов и гейммодов, и серверов на них, которые жрут ужасное количество памяти, имеют проблемы с производительностью, но что ещё хуже - куча дыр в безопасности. Я искренне не хочу чтобы тоже самое повторилось и в МТА. Идея в принципе хорошая, но как ты себе это представляешь?