Jump to content

Kenix

Retired Staff
  • Posts

    4,121
  • Joined

  • Last visited

  • Days Won

    2

Everything posted by Kenix

  1. Kenix, очень приятно видеть того, кто все еще не потерял уверенности в МТА. Всегда уважал тебя. Так вот. Недавно начал создавать проект с своей командой. Он был на русском языке. Примерно когда работа была почти вся выполнена, то мы решили перевести сервер полностью на английский язык. Аргументировали тем, что русская аудитория не так велика и не так благодарная как иностранная, а онлайн тоже хочется как никак. От этого напрямую зависит разработка будущих обновлений сервера. Мне кажется многие, кто подходит к созданию сервера серьезно сталкивались с этой дилеммой. Поэтому русский проект делать получается грубо говоря "не рентабельно". Но как быть? Вот отсюда и доминирующее кол-во интернациональных серверов. С этим увы ничего не поделать. А про МТА в целом я вообще молчу. Да и правильно делаю, ведь скриптер из меня никакой. Но со стороны обычного человека так же не представляю как еще ее можно развивать. Надеюсь прочитаешь, спасибо. Я всегда делал упор на интернациональность, хочется чтобы не только русские могли играть, но и иностранцы. Но если тебе не сложно то хорошо бы сделать и перевод сервера на популярные языки (Русский, Арабский, Испанский)
  2. Если игрок вышел из сервера находишь в гридлисте и удаляешь, если игрок заходит то добавляешь строку. События: https://wiki.multitheftauto.com/wiki/OnClientPlayerJoin https://wiki.multitheftauto.com/wiki/OnClientPlayerQuit Также тебе стоит каждой строке и ячейке установить item data (через guiGridListSetItemData), чтобы искать по userdata, а не по нику игрока. Вот функции для работы guiGridListAddRow guiGridListRemoveRow guiGridListSetItemData guiGridListGetItemData
  3. Скинь полный код, возможно у тебя что-то ещё влияет.
  4. Правильно мыслишь, все по английски и так написано) Только у тебя закрыт ещё и UDP порт 22126. Игроки не смогут видеть твой сервер в браузере серверов. Возможно твой firewall (брандмауэр если у тебя Windows, либо иной) или антивирус блокирует эти порты, добавь их в исключения. P.S Есть очень удобный сервис от МТАшников чтобы проверять порты, можешь пользоваться ещё и им. https://nightly.multitheftauto.com/ports/ Пример работы: https://nightly.multitheftauto.com/ports/?d=31.41 ... 1&mslist=1
  5. Есть библиотека анимаций от arc_, можете использовать её. --[[ Client animation library by arc_ Version 1.0.0 Licence ---------------- You are free to modify this file and redistribute it with your changes. However, always mention that you changed it (and eventually what changes you made) and keep the original author, version number and licence intact. Selling this script or a derivative of it is not allowed. Documentation ---------------- Terminology - Animation: a sequence of phases that act on one or more elements and follow each other sequentially in time. Multiple animations can be running at the same time. All defined animations run in parallel. An animation is in fact one phase with several subphases (see below), with animation specific functions available. - Phase: a part of an animation sequence. A phase consists of a paramater that linearly goes from a given starting value to a given ending value, over the specified amount of time, and is applied to one certain element. While a phase is running, its callback function will be called onClientRender with the following arguments: phase.fn(element elem, float param, table phase) Specifying time and callback function is optional. If no time is specified but a function is, phase.fn(elem) will be called once. If no function is specified but a time is, the phase consists of simply waiting during that time, doing nothing. A phase can be run once, repeated multiple times or loop infinitely. Phases can also contain phases. In that case the parent phase consists of completing all child phases, in order. This allows you to f.e. make an element move left and right continuously: define a phase for moving it to the left, followed by a phase for moving it back to the right, and encapsulate these two phases in a parent phase that loops forever. Phases can be nested to arbitrary depth. The element a subphase works on is inherited from its parent phase (or, if the parent phase doesn't specify an element, from the grandparent, etc). Definition of a phase A phase is simply a table containing properties and (optionally) subphases. Available phase properties are: (the values for the properties are examples, not default values) phase = { from = 0, -- the starting value of the parameter to = 1, -- the ending value of the parameter [time = 1000,] -- the time (in ms) in which to go from start to end [fn = callback,] -- the function to call on each frame update [repeats = 5,] -- how many times to run this phase before going on to -- the next. defaults to 1 [subphase1,] -- optional subphases. if one or more of these are included, [subphase2,] -- only the "repeats" property is valid for this parent phase ... } Available functions anim = Animation.create(elem, phase1, phase2, ...) Creates and returns a new animation. This means nothing more than creating a new phase, putting the specified phases in it as subphases, and making the functions of the Animation class available to it. Once an animation is created, it is not yet running. anim = Animation.createAndPlay(elem, phase1, phase2, ...) Creates a new animation and immediately starts playing it. anim = Animation.createNamed(name, elem, ...) If an animation with the specified name exists, returns that animation. Otherwise creates a new named animation. You can look the animation up again later with Animation.getNamed(name). anim = Animation.createNamedAndPlay(name, elem, ...) Self explanatory. anim = Animation.getNamed(name) Returns the animation with the specified name if it exists, false otherwise. anim:play() Start playing a newly created animation or resume a paused animation. anim:pause() Pauses the animation. Resume it later with anim:play() or delete it with anim:remove(). anim:remove() Deletes the animation completely. It can not be resumed anymore. anim:isPlaying() Returns true if the animation is currently playing, false if not. Animation.playingAnimationsExist() Returns true if there is any animation that is currently playing. anim:addPhase(phase3), phase2:addPhase(phase3) Appends a new subphase to the animation or phase. Can be done while the animation is playing. Note that to be able to use phase2:addPhase(), phase2 first has to be processed (default values filled in, made part of the Phase class) by being passed as an argument to Animation.create[AndPlay] or addPhase. Examples Fade in a picture: local pict = guiCreateStaticImage(...) Animation.createAndPlay(pict, { from = 0, to = 1, time = 2000, fn = guiSetAlpha }) Fade in a picture using a preset (for more presets, see the end of this file): local pict = guiCreateStaticImage(...) Animation.createAndPlay(pict, Animation.presets.guiFadeIn(2000)) Move a label to the right while fading it in: local label = guiCreateLabel(10, 100, 150, 20, 'Test', false) Animation.createAndPlay(label, Animation.presets.guiMove(200, 100, 2000)) Animation.createAndPlay(label, Animation.presets.guiFadeIn(2000)) Move a label left and right forever, without presets: function guiSetX(elem, x) local curX, curY = guiGetPosition(elem, false) guiSetPosition(elem, x, curY, false) end local label = guiCreateLabel(10, 100, 150, 20, 'Test', false) Animation.createAndPlay( label, { repeats = 0, { from = 10, to = 200, time = 2000, fn = guiSetX }, { from = 200, to = 10, time = 2000, fn = guiSetX } } ) ]]-- Phase = {} Phase.__index = Phase Animation = setmetatable({}, { __index = Phase }) Animation.__index = Animation Animation.collection = {} function Animation.create(elem, ...) local anim = setmetatable({ elem = elem, ... }, Animation) anim:_setup() return anim end function Animation.createAndPlay(elem, ...) local anim = Animation.create(elem, ...) anim:play() return anim end function Animation.createNamed(name, elem, ...) local anim = Animation.getNamed(name) or Animation.create(elem, ...) anim.name = name return anim end function Animation.createNamedAndPlay(name, elem, ...) local anim = Animation.createNamed(name, elem, ...) anim:play() return anim end function Animation.getNamed(name) local i, anim = table.find(Animation.collection, 'name', name) return i and anim end function Animation:isPlaying() return self.playing or false end function Animation.playingAnimationsExist() return table.find(Animation.collection, 'playing', true) and true end function Animation:play() if self.playing then return end if not table.find(Animation.collection, self) then table.insert(Animation.collection, self) end if not Animation.playingAnimationsExist() then addEventHandler('onClientRender', getRootElement(), updateAnim) end self.playing = true end function Animation:pause() self.playing = false if not Animation.playingAnimationsExist() then removeEventHandler('onClientRender', getRootElement(), updateAnim) end end function Animation:remove() table.removevalue(Animation.collection, self) if not Animation.playingAnimationsExist() then removeEventHandler('onClientRender', getRootElement(), updateAnim) end self.playing = false end function Phase:_setup(parent) self.parent = parent if self[1] then for i,phase in ipairs(self) do if type(phase) == 'function' then phase = { fn = phase } self[i] = phase end setmetatable(phase, Phase) phase:_setup(self) end self.curphase = 1 elseif self.time then self.from = self.from or 0 self.to = self.to or 1 self.speed = (self.to - self.from) / self.time end self.repeats = self.repeats
  6. local aSpawnPoints = getElementsByType( "spawnpoint" ); for i, pSpawnPoint in ipairs( aSpawnPoints ) do local fX, fY, fZ = tonumber( getElementData( pSpawnPoint, "posX" ) ), tonumber( getElementData( pSpawnPoint, "posY" ) ), tonumber( getElementData( pSpawnPoint, "posZ" ) ); -- TODO end
  7. Ресурс performancebrowser. https://wiki.multitheftauto.com/index.ph ... ncebrowser
  8. Please show me full script.
  9. Try function fileSave( sFile, sData ) if fileExists( sFile ) then fileDelete( sFile ); end local pFile = fileCreate( sFile ); fileWrite( pFile, sData ); fileClose( pFile ); end function fileLoad( sFile ) local pFile = fileOpen( sFile, true ); local sData = fileRead( pFile, fileGetSize( pFile ) ); fileClose( pFile ); return sData; end
  10. Ты можешь использовать ресурс hedit. Там есть функция подгрузки хангдлинга из строки, если покопаться, то можешь найти и сам код.
  11. Некоторые новые фишки добавляют, только отдельными функциями. (например битовые операции) А так версию Lua обновлять не будут. _VERSION вернет тебе Lua 5.1 (то что Disinterpreter написал выше)
  12. Можешь узнать через предопределенную переменную _VERSION
  13. Офигенная новость. Надеюсь лекс обновит на сайте формулу, а то у него вроде неверная была.
  14. Тут есть 2 варианта, 1ый вариант который ты хотел (написал функции ниже), а есть ещё другой вариант - использование через функцию downloadFile + событие onClientFileDownloadComplete - самый быстрый вариант и самый лучший, но там нету возможности узнавать кол-во скаченых байтов (а у латентных можно регулировать, сколько будет кидаться данных через каждую секунду) у конкретного файла в реальном времени. Также оба способа позволяют скачивать файлы в другом потоке. triggerLatentClientEvent getLatentEventHandles getLatentEventStatus
  15. Все слова в массиве с маленькой буквы сделай, мой недочет.
  16. Совсем недавно были добавлены функции для работы с юникодом viewtopic.php?f=141&t=38632&p=787060#p787060 Ты можешь составить массив слов и использовать функцию utf8.lower(). local aWords = { "привет", "пока" }; local sInputWord = "ПРивет"; sInputWord = utf8.lower( sInputWord ); for i, sWord in ipairs( aWords ) do if sInputWord == sWord then outputDebugString( "Found" ); break; end end outputDebugString( "Not Found" );
  17. Немного иначе просто (наоборот), надо было пометить это, вдруг кому эти нюансы будут интересны. print( math.ceil( -10.1 ) ); -- -10 print( math.floor( -10.1 ) ); -- -11
  18. Недавно мне понадобилась функция для разделения массива на несколько кусков (рандомно). Может кому понадобится. local function size( a ) local i = 0; for _ in pairs( a ) do i = i + 1; end return i; end function table.slice( t ) if size( t ) > 0 then local New = {}; local iRand = math.random( 1, size( t ) ); local iCount = 0; for i, v in pairs( t ) do if iCount < iRand then table.insert( New, v ); t[ i ] = nil; else break; end iCount = iCount + 1; end return New; end return false; end Пример использования: local a = {}; for i = 1, 20 do table.insert( a, i ); end while true do local take = table.slice( a ); if not take then break; end print( unpack( take ) ); end --[[ Результат 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ]]
  19. Бред написал dbConnect и dbQuery вообще не для локальных(которые от сервера МТА) БД. Есть executeSQLQuery для локальных, но не для internal.db Читаем Wiki: host: The target to connect to. The format of this depends on the database type. >>For SQLite it is a filepath to a SQLite database file. If the filepath starts with ":/" then the server's global databases directory is used. The file will be created if it does not exist. Я где-то указал executeSQLQuery? Я написал db функции. Можно пользоваться как и db функциями, так и функциями аккаунта. P.S через db функции в данном случае можно открывать только внутри databases директории, моя вина. Придираться ко мне не надо.
  20. Редактировать базу данных можешь через db функции. (dbConnect, dbQuery, ... ) https://wiki.multitheftauto.com/wiki/Se ... _functions
  21. Вопрос не совсем правильно задан. Ты бы лучше написал что ты пытаешься сделать, а мы бы тебе посоветовали как лучше поступить. Может ты делаешь миллион итераций в этой функции, мы же не знаем.
  22. https://forum.multitheftauto.com/viewto ... cf26c82f88 (тема на форме) https://mega.nz/#!2xtynbqY!HcuW4XmZDVer ... oTWsxzP2IA (прямая ссылка на скачивание последней копии)
  23. Все уже сделано для вас http://mta.dzek.eu/mmove/ Просто выберите карту, измените оффсет Z и нажмите Generate. Сайт всю работу сделает за вас.
×
×
  • Create New...