Arisu Posted July 11, 2011 Share Posted July 11, 2011 Нету в МТА SCM'a вообще, наглухо отключен. Под "фичами из SCMа", я думаю, имелся в виду прямой вызов опкодов игры. Link to comment
AirKite Posted July 11, 2011 Share Posted July 11, 2011 Вопрос к знатокам: Что будет менее ресурсоёмким. createColSphere или таймер в 1 секунду и вычисление расстояния между нужный нам точкой и игроком. Это всё при условии что конечно нам не нужно моментальное срабатывание как в onClientColShapeHit. То есть мои предположения что ColSphere работает по принципу вычисления расстояния между всеми элементами и Collision с интервалом рендера. т.е. тоже самое что бы мы это делали в ручную в onClientRender. Или же всё таки МТА в createColSphere както по хитрому использует движок GTA SA и воспроизводит также как и все Collision в игре? Link to comment
lil Toady Posted July 11, 2011 Author Share Posted July 11, 2011 Кол шейпы быстрее будут, для них в мта используется бинарное древо, а это очень быстро. Нету в МТА SCM'a вообще, наглухо отключен. Под "фичами из SCMа", я думаю, имелся в виду прямой вызов опкодов игры. Я же говорю, отключен наглухо - нету опкодов, не вызвать их. Link to comment
AirKite Posted July 11, 2011 Share Posted July 11, 2011 Кол шейпы быстрее будут, для них в мта используется бинарное древо, а это очень быстро. Но быстрее ли расчёта вручную в рендере только 1 елемента до нужный позиции? Например в https://wiki.multitheftauto.com/wiki/GetPedBonePosition есть пример: addEventHandler("onClientRender",getRootElement(), function() local px, py, pz, tx, ty, tz, dist px, py, pz = getCameraMatrix() for k, v in ipairs(getElementsByType("player")) do tx, ty, tz = getElementPosition(v) dist = math.sqrt((px - tx) ^ 2 + (py - ty) ^ 2 + (pz - tz) ^ 2) if dist < 30.0 then if isLineOfSightClear(px, py, pz, tx, ty, tz, true, false, false, true, false, false, getLocalPlayer()) then local sx, sy, sz = getPedBonePosition(v, 5) local x,y = getScreenFromWorldPosition(sx, sy, sz + 0.3) if x then -- getScreenFromWorldPosition returns false if the point isn't on screen dxDrawText(getPlayerName(v), x, y, x, y, tocolor(150, 50, 0), 0.85 + (15 - dist) * 0.02, "bankgothic") end end end end end ) Где вычесляется позиция до игрока. Если CollShape такой быстрей, быстрее ли будет приатачить к игроку createColSphere? Если речь шла о полной реализации функционала CollShape в ручную, и то что в ручную будет медленнее... Интересует намного ли это медленней? UPD: Хо, хо... закидаю вопросами Интересует безопасность использования ElementData и возможность отсеивания изменений с клиента через onClientElementDataChange (действует ли там cancelEvent()?) или об это не нужно беспокоится с 100% гарантией? (Я так не думаю). Я сейчас имею ввиду отправку фейк значений в setElementData посредством хака. Link to comment
MX_Master Posted July 11, 2011 Share Posted July 11, 2011 Если 1 элемент, то хоть шейпы, хоть ручной рассчет, разница будет ничтожной. Нащщет крепления на спину оружия, то угол между головой и жопой должен помочь (: Ну и собсна знать Z угол поворота игрока. Я так понял, это все будет в клиенте в событии прорисовки кадра? ElementData - не боись (: безопасен, а если нет, то все равно в плюсе - сообщишь в баг трекер про дырку в безопасности Link to comment
Arisu Posted July 11, 2011 Share Posted July 11, 2011 Кол шейпы быстрее будут, для них в мта используется бинарное древо, а это очень быстро. Нету в МТА SCM'a вообще, наглухо отключен. Под "фичами из SCMа", я думаю, имелся в виду прямой вызов опкодов игры. Я же говорю, отключен наглухо - нету опкодов, не вызвать их. Ух, вот даже как, не знал. До таких дебрей кода, благо, не приходилось лазить Link to comment
Kernell Posted July 11, 2011 Share Posted July 11, 2011 Нету у костей rotation'а, это всего лишь точки, надо взять 2 кости и посчитать. Знать бы как. С математикой совсем не дружу.. Не подскажешь?) Link to comment
AirKite Posted July 11, 2011 Share Posted July 11, 2011 Если 1 элемент, то хоть шейпы, хоть ручной рассчет, разница будет ничтожной. Ну шейп на 1 элемент не выйдет. Он сам по себе расчитывает все элементы (покрайне мере машины, игроки и объекты точно). ElementData - не боись (: безопасен, а если нет, то все равно в плюсе - сообщишь в баг трекер про дырку в безопасности Не боятся, когда точно не известно безопасен он или нет, это не дело. Ну даже если баг исправят, на сервере изза него может быть куча проблем. Поэтому вопрос всё ещё актуален. По крайне мере хотя бы насчёт onClientElementDataChange. Есть ли там cancelEvent() Link to comment
MX_Master Posted July 11, 2011 Share Posted July 11, 2011 Ты лучше скажи что хочешь сделать, а мы скажем чем и почему именно так. Про кол шейп для 1 элемента, допустим в клиенте: addEventHandler( 'onClientColShapeHit ', элемент, обработчик ) если указать вместо "элемент" - root или resourceRoot, то конечно будет срабатывать на всех элементах. При root - абсолютно на всех, при resourceRoot - на всех элементах текущего ресурса. Link to comment
Kernell Posted July 11, 2011 Share Posted July 11, 2011 MX_Master, Имелось ввиду что шейп на один автомобиль (к примеру) не выйдет. Link to comment
AirKite Posted July 11, 2011 Share Posted July 11, 2011 Про дерево элементов я уже вкурсе, спасибо. Я имел ввиду что 1 колшейп будет реагировать на все элементы а не только на локального плеера. То что он не будет объявлен в addEventHandler это разве означает что сам элемент будет думать меньше? Ведь пример (Вообще разве правильный?) addEventHandler("onClientColShapeHit",getLocalPlayer(),...) Даже если бы это работало и вызывалось только когда локальный игрок затронит колшейп, это ведь не говорит что колшейп не производит расчёты на других игроков и т.д. ? Link to comment
MX_Master Posted July 11, 2011 Share Posted July 11, 2011 Ну вы попробуйте создать машинку, создайте шейпик чуть дальше и добавьте обработчик, указав вторым параметром элемент (машинку). Позаезжайте в шейпик на ней, потом на других тачках, потом сами просто в шейпик зайдите. Всего 2 минуты уйдет, зато сколько будет положительной инфы, если вы получите результат. И это будет самый правильный и быстрый вариант. Link to comment
MX_Master Posted July 11, 2011 Share Posted July 11, 2011 Конечно нет. Теперь осталось еще замерить доли милисекунды, за которые срабатывает обработчик с проверкой, и простой подсчет расстояния ((: намек: не думайте об экономии там, где она вовсе не нужна. Тем более, все уже продумано давно за всех нас local uColShape = createColSphere( ... ) local uVehicle = createVehicle( ... ) addEventHandler( 'onClientColShapeHit', uColShape, function ( uElement ) if uElement ~= uVehicle then return end outputChatBox('Vehicle hit colshape.') end ) Link to comment
Other Languages Moderators Disinterpreter Posted July 12, 2011 Other Languages Moderators Share Posted July 12, 2011 %) я не в деле.... Link to comment
AirKite Posted July 12, 2011 Share Posted July 12, 2011 Конечно нет. То есть так и сказать изначально ты не мог? =\ Теперь осталось еще замерить доли милисекунды, за которые срабатывает обработчик с проверкой, и простой подсчет расстояния ((: Какая разница за сколько он срабатывает. Важнее то, что ты не подсчитаешь за сколько обрабатывает фрейм у колшейпа. намек: не думайте об экономии там, где она вовсе не нужна. Тем более, все уже продумано давно за всех нас Дело не в экономии а в том, что колшейп лишний функционал. Например, если тебе необходима только 1 переменная, зачем создавать 2, ссылаясь на то, что нечего страшного не произойдёт. Link to comment
Kernell Posted July 12, 2011 Share Posted July 12, 2011 Что за blendPedAnimation которо нет не на клиенте, не на сервере? Параметры startTime, speed и blendSpeed очень бы не помешали для анимаций.. Link to comment
MX_Master Posted July 13, 2011 Share Posted July 13, 2011 callbackFunction: A function that is called when the animation is finished arguments: Any arguments you want to pass to the callbackFunction, eg: animation name вот это действительно не помешало бы, чтобы создавать переходы Link to comment
Kernell Posted July 13, 2011 Share Posted July 13, 2011 callbackFunction: A function that is called when the animation is finished arguments: Any arguments you want to pass to the callbackFunction, eg: animation name вот это действительно не помешало бы, чтобы создавать переходы Тоже верно.. Так можно катсцену создать и делать отличные мувики Link to comment
killer100 Posted July 13, 2011 Share Posted July 13, 2011 Народ подскажите почему не выходит надпись в чат у этого скрипта? function banSerial( source, command, noob, reason ) if ( noob ) then local theNoob = getPlayerFromName( noob ) if ( theNoob ) then local theNoobSerial = getPlayerSerial( theNoob ) addBan( nil, nil, theNoobSerial, source, reason ) outputChatBox(getPlayerName(theNoob) .." has been serial banned by " .. getPlayerName(source)..".",getRootElement(),255,255,0,true) else outputChatBox("#ff0000ERROR:#fff000 Invalid player name.", source ,255 ,255 ,0, true) end end end addCommandHandler( "sban", banSerial ) Link to comment
Kernell Posted July 13, 2011 Share Posted July 13, 2011 Как именно не получается написать? Совсем ничего не пишет или мб в дебаге есть ошибка? Link to comment
Arisu Posted July 13, 2011 Share Posted July 13, 2011 Появился такой вопрос: в луа используюся null-terminated строки или как определяется конец строки? Второй вопрос: через fileWrite можно записывать только текстовые строки? (согласуется с первым вопросом) Link to comment
killer100 Posted July 13, 2011 Share Posted July 13, 2011 Как именно не получается написать? Совсем ничего не пишет или мб в дебаге есть ошибка? Надпись вообще не выходит, есть ошибка в консоле. WARNING: sban/sban.lua 368: Bad 'client' pointer @ 'getPlayerName' (1) WARNING: sban/sban.lua 368: Bad 'client' pointer @ 'getPlayerName' (1) ERROR: sban/sban.lua 368: attempt to concatenate a boolean value Link to comment
Arisu Posted July 13, 2011 Share Posted July 13, 2011 Попробуй подставить выше, чем banSerial. Link to comment
Kenix Posted July 13, 2011 Share Posted July 13, 2011 function banSerial( source, command, noob, reason ) if ( noob ) then local theNoob = getPlayerFromName( noob ) if ( theNoob ) then local theNoobSerial = getPlayerSerial( theNoob ) addBan( nil, nil, theNoobSerial, source, reason ) outputChatBox(getPlayerName(theNoob) .." has been serial banned by " .. getPlayerName(source)..".",getRootElement(),255,255,0,false) else outputChatBox("#ff0000ERROR:#fff000 Invalid player name.", source ,255 ,255 ,0, true) end end end addCommandHandler( "sban", banSerial ) Link to comment
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now