Jump to content

Очень хитрый баг


Recommended Posts

Всем привет, я добрался до форума. Сразу к сабжу)

имеется такой несложный клиентсайд код

function onStreamIn() 
    if getElementType(source) == "vehicle" then  -- проверили, чо загрузилось - машина? 
        if countVehiclePassengers(source) > 0 then  -- машинка с пассажирами 
            --addEventHandler("onClientVehicleExit", source, onVehicleExit) 
        else  -- машинка без пассажиров 
            local blip = createBlipAttachedTo(source, 0, 2, 160, 160, 160, 255, -1)  -- создали иконку 
             
            function onStreamOut () 
                if blip then 
                    destroyElement(blip) 
                end 
                removeEventHandler("onClientElementStreamOut", source, onStreamOut)  -- функция отцепляет себя 
            end 
            addEventHandler("onClientElementStreamOut", source, onStreamOut)  -- прицепили функцию на событие исчезновения машины 
        end 
    end 
end 
  
addEventHandler("onClientElementStreamIn", theRes, onStreamIn) 

суть такая (если лень разбирать эту путаницу). при появлении машин, к ним прикрепляется иконка радара; назначается эвент, что при исчезании с нее исчезнет иконка а сам этот эвент открепляется.

в принципе, код работает нормально, иконки появляются и исчезают, но destroyElement сыплет варнинги 'bad element pointer @ destroyElement()'. мелочь, а противно, и не могу понять где. даже с проверкой 'if blip'. конкретно происходит так:

- спавнюсь в какой-нибудь точке с машинами - иконки создались

- телепортируюсь куда-нибудь - иконки исчезли

- телепортируюсь обратно к первой точке - иконки снова создались

- снова куда-нибудь, иконки исчезли и в дебаг-чат высыпались баги.

пс. сильно палками не бейте - только начинаю разбираться в мта :)

Link to comment

у тебя blip — локальная переменная, и указатель на сам блип нигде не сохраняется после завершения работы функции. ну мне так каатса.

Link to comment

МХ_Мастер, я бы поюзал твой скрипт, но мне в данный момент интересно написать свой, в целях самообразования. Попрактиковаться в создании несложных штук. Свой велосипед, велосипед, но свой. Чтобы понять как работает каждая из строчек кода. К тому же, не люблю брать чужой код и расковыривать его на куски.

Айбофорзен, вряд ли. Блип хоть и локальная, но в функцию она передается, иначе бы иконки просто не удалялись. Тут баг в чем, иконки удаляются нормально как и задумано, но варнинги непонятно откуда-то лезут.

Да кстати, забыл сказать, глобальную таблицу с иконками не хочу делать :) потому извращаюсь

Link to comment

в моем скрипте хранятся ваще все иконки от найденного за время путешествия, транспорта. Кто-то может подумать, что это неправильно и надо, как только они выходят из радиуса видимости - их удалить. Это ты и хочешь сделать.

Кстати, я не сказал юзать мой скрипт, посмори какие события используются и как.

И как ты хочешь потом удалить иконку, если не знаешь ее ИДа ? Глобальную таблицу все таки придется сделать.

Хотя я тут вспомнил, что есть функция getAttachedElements. Думаю, с помощью нее, мона узнать о иконке, прилепленной к транспорту и ее удалить.

Link to comment

Ну хорошо, посмотрю завтра. Просто сейчас читаю раздел уже с телефона.

Если хранить и отображать все иконки, то игра на моем модике с 1800 машинами (украденных из сампа, да), при нажатии на Ф11, начинает "немного" тормозить, превращается в слайдшоу)

Link to comment

Ладно, черт с ним, хватит со скриптингом на сегодня. Мозг спать хочет. Завтра авось просветление придет с утра.

Напоследок еще вопрос, вот такой способ, как я внутри одной функции объявляю другую - не опасно ли чрезмерным потреблением памяти, или рекурсией? Просто всех тонкостей луа не знаю

Link to comment

ну и откуда ты знаешь, что именно нужный блип в этой переменной? с 1 блипом это работает без глюков. больше 1-го — начинается путаница и bad argument.

может я тупой, но мне не нравится эта система, когда функция вложена в другую функцию, зависит от ее переменных, а вызывается внешним эвентом.

если вынести onStreamOut() отдельно, а блипы сохранять, допустим, в element data машины — все нормально удаляется и никаких ошибок. :/

Link to comment

пока с кентом резались в бильярд через инет, написал я вот этот срам

addEventHandler( "onClientElementStreamIn", getRootElement(), 
    function() 
        if getElementType(source) ~= "vehicle" then return end 
  
        local attEls = getAttachedElements(source) 
        if type(attEls) ~= "table" then return end 
  
        for i,e in ipairs(attEls) do 
            if getElementData(e, "vehicleIcon") then return end 
        end 
         
        local blip = createBlipAttachedTo( source, 0, 1, 255, 255, 255, 50, 0, 200 ) 
        setElementData( blip, "vehicleIcon", true, false ) 
    end 
) 
  
  
  
  
function vIcons_destroyAttachedIcon ( ) 
    if getElementType(source) ~= "vehicle" then return end 
  
    local attEls = getAttachedElements(source) 
    if type(attEls) ~= "table" then return end 
  
    for i,e in ipairs(attEls) do 
        if getElementData(e, "vehicleIcon") then destroyElement(e) end 
    end 
end 
  
addEventHandler( "onClientElementStreamOut", getRootElement(), vIcons_destroyAttachedIcon ) 
addEventHandler( "onClientElementDestroy",   getRootElement(), vIcons_destroyAttachedIcon ) 
  
  
  
  
addEventHandler( "onClientResourceStart", getResourceRootElement(), 
    function() 
        local vList = getElementsByType( "vehicle", getRootElement(), true ) 
        local blip 
  
        for i,v in ipairs(vList) do 
            blip = createBlipAttachedTo( v, 0, 1, 255, 255, 255, 50, 0, 200 ) 
            setElementData( blip, "vehicleIcon", true, false ) 
        end 
    end 
) 

по прежнему считаю, что локальный для скрипта массив будет куда лучше

Link to comment

Да, так и решил вынести в массив. Вот еще вопрос, если у меня будет такой код

-- player - кто-то из игроков 
someArray[player] = 'test' 
  
-- player выходит из игры 
-- что станет с someArray[player]? 
  

она улетит в сборщик мусора, или станет утечкой памяти?

Link to comment

риальнЭ, каждый создает тему лично для себя, чтобы там спрашивать только о чем-то своем. Название темы придумывается какое-ньть загадочное и фперет. Так не пойдет.

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