Jump to content

Дада (: фулдилка


Recommended Posts

  • Replies 2.4k
  • Created
  • Last Reply

Top Posters In This Topic

Вопрос к знатокам:

Что будет менее ресурсоёмким. createColSphere или таймер в 1 секунду и вычисление расстояния между нужный нам точкой и игроком. Это всё при условии что конечно нам не нужно моментальное срабатывание как в onClientColShapeHit.

То есть мои предположения что ColSphere работает по принципу вычисления расстояния между всеми элементами и Collision с интервалом рендера. т.е. тоже самое что бы мы это делали в ручную в onClientRender. Или же всё таки МТА в createColSphere както по хитрому использует движок GTA SA и воспроизводит также как и все Collision в игре?

Link to comment

Кол шейпы быстрее будут, для них в мта используется бинарное древо, а это очень быстро.

Нету в МТА SCM'a вообще, наглухо отключен.

Под "фичами из SCMа", я думаю, имелся в виду прямой вызов опкодов игры.

Я же говорю, отключен наглухо - нету опкодов, не вызвать их.

Link to comment
Кол шейпы быстрее будут, для них в мта используется бинарное древо, а это очень быстро.

Но быстрее ли расчёта вручную в рендере только 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? :roll:

Если речь шла о полной реализации функционала CollShape в ручную, и то что в ручную будет медленнее... Интересует намного ли это медленней?

UPD:

Хо, хо... закидаю вопросами :oops: Интересует безопасность использования ElementData и возможность отсеивания изменений с клиента через onClientElementDataChange (действует ли там cancelEvent()?) или об это не нужно беспокоится с 100% гарантией? (Я так не думаю). Я сейчас имею ввиду отправку фейк значений в setElementData посредством хака.

Link to comment

Если 1 элемент, то хоть шейпы, хоть ручной рассчет, разница будет ничтожной.

Нащщет крепления на спину оружия, то угол между головой и жопой должен помочь (: Ну и собсна знать Z угол поворота игрока. Я так понял, это все будет в клиенте в событии прорисовки кадра?

ElementData - не боись (: безопасен, а если нет, то все равно в плюсе - сообщишь в баг трекер про дырку в безопасности

Link to comment
Кол шейпы быстрее будут, для них в мта используется бинарное древо, а это очень быстро.
Нету в МТА SCM'a вообще, наглухо отключен.

Под "фичами из SCMа", я думаю, имелся в виду прямой вызов опкодов игры.

Я же говорю, отключен наглухо - нету опкодов, не вызвать их.

Ух, вот даже как, не знал. До таких дебрей кода, благо, не приходилось лазить :)

Link to comment
Нету у костей rotation'а, это всего лишь точки, надо взять 2 кости и посчитать.

Знать бы как. С математикой совсем не дружу.. Не подскажешь?)

Link to comment
Если 1 элемент, то хоть шейпы, хоть ручной рассчет, разница будет ничтожной.

Ну шейп на 1 элемент не выйдет. Он сам по себе расчитывает все элементы (покрайне мере машины, игроки и объекты точно).

ElementData - не боись (: безопасен, а если нет, то все равно в плюсе - сообщишь в баг трекер про дырку в безопасности

Не боятся, когда точно не известно безопасен он или нет, это не дело. Ну даже если баг исправят, на сервере изза него может быть куча проблем. Поэтому вопрос всё ещё актуален. По крайне мере хотя бы насчёт onClientElementDataChange. Есть ли там cancelEvent() :mrgreen:

Link to comment

Ты лучше скажи что хочешь сделать, а мы скажем чем и почему именно так.

Про кол шейп для 1 элемента, допустим в клиенте:

addEventHandler( 'onClientColShapeHit ', элемент, обработчик ) 

если указать вместо "элемент" - root или resourceRoot, то конечно будет срабатывать на всех элементах. При root - абсолютно на всех, при resourceRoot - на всех элементах текущего ресурса.

Link to comment

Про дерево элементов я уже вкурсе, спасибо. Я имел ввиду что 1 колшейп будет реагировать на все элементы а не только на локального плеера. То что он не будет объявлен в addEventHandler это разве означает что сам элемент будет думать меньше?

Ведь пример (Вообще разве правильный?)

addEventHandler("onClientColShapeHit",getLocalPlayer(),...) 

Даже если бы это работало и вызывалось только когда локальный игрок затронит колшейп, это ведь не говорит что колшейп не производит расчёты на других игроков и т.д. ?

Link to comment

Ну вы попробуйте создать машинку, создайте шейпик чуть дальше и добавьте обработчик, указав вторым параметром элемент (машинку). Позаезжайте в шейпик на ней, потом на других тачках, потом сами просто в шейпик зайдите. Всего 2 минуты уйдет, зато сколько будет положительной инфы, если вы получите результат.

И это будет самый правильный и быстрый вариант.

Link to comment

Конечно нет. Теперь осталось еще замерить доли милисекунды, за которые срабатывает обработчик с проверкой, и простой подсчет расстояния ((:

намек: не думайте об экономии там, где она вовсе не нужна. Тем более, все уже продумано давно за всех нас

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
Конечно нет.

То есть так и сказать изначально ты не мог? =\

Теперь осталось еще замерить доли милисекунды, за которые срабатывает обработчик с проверкой, и простой подсчет расстояния ((:

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

намек: не думайте об экономии там, где она вовсе не нужна. Тем более, все уже продумано давно за всех нас

Дело не в экономии а в том, что колшейп лишний функционал. Например, если тебе необходима только 1 переменная, зачем создавать 2, ссылаясь на то, что нечего страшного не произойдёт.

Link to comment
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
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

Народ подскажите почему не выходит надпись в чат у этого скрипта?

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

Появился такой вопрос: в луа используюся null-terminated строки или как определяется конец строки?

Второй вопрос: через fileWrite можно записывать только текстовые строки? (согласуется с первым вопросом)

Link to comment
Как именно не получается написать? Совсем ничего не пишет или мб в дебаге есть ошибка?

Надпись вообще не выходит, есть ошибка в консоле.

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
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

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.

×
×
  • Create New...