Jump to content

TEDERIs

Members
  • Posts

    153
  • Joined

  • Last visited

  • Days Won

    2

Everything posted by TEDERIs

  1. Вот примерно так можно на скорую руку сделать. Должно работать. local lastForceTime = getTickCount ( ) addEventHandler ( "onClientPreRender", root, function ( ) local vx, vy, vz = getElementVelocity ( localPlayer ) local force = (vx^2 + vy^2) ^ 0.1 if vz == 0 and force > 0 then local now = getTickCount ( ) if now - lastForceTime > 1300*(1-force) then lastForceTime = now local sound = playSound ( "/sound/.*", false ) setSoundVolume ( sound, math.random ( 10, 50 ) / 100 ) end end end , false ) P.S. Значение 1300 отстраивается от длительности звука, где то на 150-200 мс добавляется.
  2. При работе с шестнадцатеричными значениями, столкнулся с довольно странным на мой взгляд вопросом. Длинные hex-значения на клиенте выглядят совершенно иначе, чем на сервере, который расположен на той же самой машине. Например: При попытке вывести на сервере 0x10000000000000000 мы получаем число 4294967295. При попытке вывести на клиенте 0x10000000000000000 мы получаем уже 4294967296. Тоже самое происходит и при операциях с этими значениями. Например: При попытке вывести на сервере (0x1803FFFF % 4294967295) мы получаем число 402915327 При попытке вывести на клиенте (0x1803FFFF % 4294967295) мы получаем уже 402915328 При этом представление 0x1803FFFF никак не изменяется от сервера к клиенту. Лично для меня совершенно непонятно такое поведение клиента. Либо это закономерность, с которой нужно просто смириться, либо это серьезная проблема, которую нужно разместить на багтрекере. Еще раз отмечу, сервер и клиент находятся на одной машине под одной операционной системой.
  3. Появилось первое внутриигровое видео. Можно увидеть инвентарь, систему диалогов, окружение и худ. Приближается тест, который покажет в каком направлении двигаться дальше.
  4. The first in-game video. You can see the inventory, dialog system and the environment.
  5. Идея нисколько не глобальна, все что мы используем в проекте уже давно до нас сделано товарищами из GSC. Сейчас проект приближается к стадии тестирования, что из этого получится будет видно. Немного нового материала: Скриншот более поздней версии
  6. Some little new information from development. And the late screenshot
  7. Файл карты: "580" posX="2341.479980" posY="132.843994" posZ="26.336000" rotX="0" rotY="0" rotZ="0"> "580" posX="1341.479980" posY="132.843994" posZ="26.336000" rotX="0" rotY="0" rotZ="0"> "580" posX="2341.479980" posY="32.843994" posZ="16.336000" rotX="0" rotY="0" rotZ="0"> Серверная сторона: addEventHandler ( "onResourceStart", resourceRoot, function ( ) for _, vehicle in ipairs ( getElementsByType ( "vehicle", resourceRoot ) ) do toggleVehicleRespawn ( vehicle, true ) local x, y, z = getElementPosition ( vehicle ) setVehicleRespawnPosition ( vehicle, x, y, z ) end end , false ) Будет респавнить авто в точке его создания.
  8. Написать шейдер, который будет принимать средний Diffuse для заданного промежутка времени. И применить его к текстурам моделей, которые тебе нужны.
  9. Для понимания основных процессов в редакторе схем, стоит описать принцип работы. Что из себя представляет FlowEditor FlowEditor является редактором потоковых графов(схем). Главная его часть выделена области редактирования, в которой непосредственно выполняется сборка графов и их настройка. На данный момент существует два типа контролов, которые могут быть размещены в этой области: узлы(node) и связи(edge). Вместе они образуют цепочку определенных пользователем действий, которые строятся по принципу событие-действие. FlowEditor состоит из двух дочерних модулей: NodeEditor и GUIEditor. Первый является непосредственно редактором схем, второй же является редактором пользовательских графических интерфейсов. Переключение между ними осуществляется при помощи кнопки в верхней части экрана. Как это работает Сейчас активно развивается только потоковая версия компоновщика схем. Принцип его работы заключается в трассировке схемы от начального нода до конечного с последовательным выполнением действий во время обхода образованной компоновщиком ветви. Граф может иметь множество ветвей, которые формируются при помощи связей. Узел представлят из себя абстрактный бокс, который может иметь несколько входных портов(расположены слева) и несколько выходных(расположены справа). При выполнении, отдельные ноды могут неограниченно много раз изменять свой внутренний статус, который определяется предопределенными переменными в их теле. Переменные деляется на скрытые и открытые. Скрытые переменные содержат служебные значения, которые используются только внутри узла. Открытые же переменные представлены входными портами, которые можно выделить по заглавной букве в их названии и могут быть заданы с помощью Инспектора узлов(Node Inspector). Большая часть нодов имеет порт для крепления их к обработчикам объектов. Такой порт называется целевым(target) и выделен оранжевым цветом в верхней части узла. Прикрепленные таким образом ноды получают способность принимать некоторые события вызванные для объекта, а также управлять им. Кроме того, целевые порты имеют особенность принимать объект автоматически из окружения графа, если он соответствует типу указанному в его описании. Например в случае со схемой, прикрепленной к объекту с типом 'vehicle', нод с аналогичным по типу таргет-портом будет прикреплен к нему сразу же при компоновке. Процессор схем имеет множество инструментов для оптимизации и защиты от циклических вызовов. Что нужно знать при построении схем FlowEditor включает в себя режим отладки, который может использоваться для отыскания проблем и конфликтов в схеме. Этот режим активируется при повторном открытии уже запущенной схемы в редакторе. Для перемещения по миру во время редактирования существует клавиша [N]. P.S. Если требуется больше информации, дайте знать.
  10. Прошло довольно много времени с момента анонса разработки редактора мира, который несколько лет был открыт только для фанатов глобальной модификации Криминальная Россия. За это время была проделана огромная работа, которая продолжается до сих пор. Были добавлены такие инструменты как редактор схем, пути объектов, система игровых комнат и загрузка пользовательских модов для них, менеджер материалов и многие другие. Сейчас проект подошел к этапу открытого тестирования, участие в котором может принять каждый. Создан сервер, на котором установлена наиболее стабильная версия редактора. Данные для подключения: IP - 46.38.62.78 Порт - 22003 Название - TEDERIs Sandbox (46.38.62.78:22003) Участие в тесте требует наличия базовых знаний в области программирования или некоторого игрового опыта. Версия обновляется раз в месяц по результатам тестирования. Компоненты и модули для тестирования: Редактор схем FlowEditor и дочерние NodeEditor | GUIEditor Ноды, их описание и юзабилити Редактор мира, который включает в себя инструменты, область объектов и настройки Система пользовательских модов, и ее веб интерфейс в частности Менеджер материалов и звуков Вопросы и предложения отправлять на почтовый ящик [email protected].
  11. TEDERIs

    TCT: FlowEditor

    I want to show the creation of a simple game mode. It includes capture the area and select of the gang. Graph is a medium difficulty and contains about 40 nodes and 60 edges. One of the most complete version of the editor you can see on the test server. Connection info: IP - 46.38.62.78 Port - 22003 Name - TEDERIs Sandbox More information coming soon.
  12. Порой, примеры визуально скомпонованных программ могут быть сложнее скриптов в понимании логики. Содержит порядка 50 нодов и 75 связей. Часть простого игрового режима, захват зон и война банд.
  13. guiGridListGetSelectedItem выдает два числа, а не таблицу как в твоем коде. Поэтому нужно убрать обращение по ключу к таблице, которой попросту не существует: outputChatBox("Вы кликнули по "..guiGridListGetSelectedItem(ch_grdlist).." строчке") При попытке конкатенации значений получаемых из функции, выбирается только первое. Что касается выдачи значений, строка local row = guiGridListGetSelectedItem(ch_grdlist) будет справедлива и переменная row будет содержать индекс выбранной строки в таблице. Согласно порядка возвращения значений из функции.
  14. По-моему, лучше просто отслеживать изменения количества денег у игрока: local playerMoney = { } local function update ( ) for _, player in ipairs ( getElementsByType ( "player" ) ) do local money = getPlayerMoney ( player ) if money ~= playerMoney [ player ] then if money > playerMoney [ player ] then -- Вероятно, была вызвана givePlayerMoney else -- Вероятно, была вызвана takePlayerMoney end playerMoney [ player ] = money end end end addEventHandler ( "onResourceStart", resourceRoot, function ( ) for _, player in ipairs ( getElementsByType ( "player" ) ) do playerMoney [ player ] = getPlayerMoney ( player ) end setTimer ( update, 1000, 0 ) end , false ) addEventHandler ( "onPlayerJoin", root, function ( ) playerMoney [ source ] = getPlayerMoney ( source ) end ) (Серверная сторона)
  15. Для создания худа такого типа, как минимум потребуются функции: dxDrawImage dxDrawText dxCreateShader dxCreateRenderTarget dxSetShaderTransform И целый багаж опыта в проектах схожего вида.
  16. Найти ближайшего игрока можно например так: local skins = { [ 77 ] = true, [ 78 ] = true, [ 79 ] = true } local pedx, pedy, pedz = 0, 0, 0 setTimer ( function ( ) local minDist = 300 local minPlayer for _, player in ipairs ( getElementsByType ( "player" ) ) do if skins [ getElementModel ( player ) ] ~= nil then local x, y, z = getElementPosition ( player ) local dist = getDistanceBetweenPoints3D ( pedx, pedy, pedz, x, y, z ) if dist < minDist then minDist, minPlayer = dist, player end end end if minDist < 10 then -- Стрелять по игроку minPlayer end end , 1000, 0 ) (Серверная сторона)
  17. Во время присваивания значения с типом таблицы, в переменную заносится только адрес этой таблицы. Выйти из ситуации можно банально копированием таблицы. Например при помощи вот такой простой функции: function table.copy ( t ) local tbl2 = { } for k, v in pairs ( t ) do tbl2 [ k ] = v end return tbl2 end
  18. На клиенте отслеживать текущее измерение и при необходимости удалять или восстанавливать мировые объекты. Например, можно обернуть функцию: local MY_DIM = 1 -- Измерение, в котором необходимо удалить мировой объект local _setElementDimension = setElementDimension local lastDim setElementDimension = function ( element, dimension ) if element == localPlayer and dimension ~= lastDim then lastDim = dimension if dimension == MY_DIM then -- Удаляем мировые объекты else -- Восстанавливаем мировые объекты end end return _setElementDimension ( element, dimension ) end Или отслеживая таймером: local MY_DIM = 1 -- Измерение, в котором необходимо удалить мировой объект local lastDim setTimer ( function ( ) local dimension = getElementDimension ( localPlayer ) if dimension ~= lastDim then lastDim = dimension if dimension == MY_DIM then -- Удаляем мировые объекты else -- Восстанавливаем мировые объекты end end end , 1000, 0 )
  19. source - является глобальной переменной, создаваемой при вызове события. В твоем коде source передается как аргумент, что просто переписывает ее. Убери source из аргументов функции StartLamp. Кроме того, переключение состояния предназначено для нескольких игроков, поэтому хранить статус следует в соответствующей таблице, в которой роль ключа будет играть плеер. В качестве такой таблице можно использовать уже созданную lamp, а локальную переменную lampo ликвидировать. Реализовать мигание изображения можно при помощь таймера, или же при помощи getTickCount(). Что то вроде того: local startTime = getTickCount ( ) local duration = 3000 local popDown function onRender ( ) local now = getTickCount ( ) local elapsedTime = now - startTime local progress = elapsedTime / duration if progress > 1 then startTime = now if popDown then popDown = false progress = 0 else popDown = true progress = 1 end else if popDown then progress = 1 - progress end end dxDrawImage ( x, y, width, height, "img", 0, 0, 0, tocolor ( 255, 255, 255, 255 * progress ) ) end addEventHandler ( "onClientRender", root, onRender, false ) Здесь показан алгоритм плавного появления и исчезания изображения img. Не проверял, но должен работать.
  20. TEDERIs

    TCT: FlowEditor

    I have developed two variants of graph building: with code generation and using the abstract nodes. The first method is faster but uses more memory on the server. I want to create a tool that allows a few clicks to create a game mode, which is not inferior to the standard. Such as Race and Deathmatch. After some time, I'll release a resource, so that anyone can use it in their projects.
  21. TEDERIs

    TCT: FlowEditor

    Since my last post, graph editor greatly improved. The editor has a lot of tools simplify the construction of game modes. Below is a video showing the working of some nodes. In addition, in the near future there will be an official test server. I am ready to listen to any question.
  22. При сворачивании игры все RenderTarget'ы очищаются. Поэтому после восстановления окна ты должен обновить их. Можешь использовать событие onClientRestore. Кроме того, насколько я помню RenderTarget'ы можно обновлять только в теле события отрисовки, чего в твоем коде нет.
  23. Добавь 0 в конфиг сервера. Это отключит все проверки клиентских файлов.
  24. Регистрация события производится единожды при запуске ресурса(или по мере необходимости). Крепление события же в ресурсе происходит как правило в нескольких местах. Это значит функция объединяющая их лишена практического смысла.
  25. Условием использования кастомных событий является их регистрация с помощью функции AddEvent. События регистрируются перед их вызовом. Твой код должен выглядеть вот так: addEvent("test", true) addEventHandler("test", getRootElement(), function() outputChatBox("Ололо я вызывался") end )
×
×
  • Create New...