Jump to content

Общий мини "HELP ME" топик по скриптингу


Recommended Posts

function destroyGUI() 
    if (GUI.window[1]) then 
        destroyElement(GUI.window[1]); 
        showCursor(false); 
    end 
end 

Имеется данная функция. Она выполняется в 2 случаях: если игрок жмет guiButton "нет" или покидает маркер. Все работает, но проблема в следующем: когда окно закрыто с помощью кнопки "нет" и игрок покидает маркер, то в дебаг выводиться сообщением, что поинтер функции destroyElement равен нулю. Подскажите пожалуйста, мб проверку неправильную сделал. Работать то все работает, но хотелось бы избежать мусора в дебаге.

Link to comment

После destroyElement переменную надо удалить, иначе толку от твоей проверки на второй строке, если в переменной всё равно остаётся указатель на невалидный userdata

Link to comment
local marker = createMarker(542.09765625, -1292.869140625, 17.2421875); 
  
function markerParams(source) 
    setElementVisibleTo(marker, source, false) 
    outputChatBox("ydalen"); 
end 
addCommandHandler("qqqqq", markerParams); 

Не пропадает, хоть убей.

Link to comment

Еще вопрос: имеется бинд функции под кнопку Enter. Хочу предотвратить попытку сесть в ближайшее авто, после использование кнопки. Скрипт на клиенте выполняется. Делаю, не помогает. :-(

addEventHandler("onClientVehicleStartEnter", root, cancelEvent); 

Link to comment
А чего ты ещё ожидал получить от set функции?
This function sets the camera rotation of a ped.

Returns true if the camera rotation was changed, false otherwise.

Или тебя смущает, что она возвращает true на локального игрока? (тогда какой смысл понимать панику по этому поводу?)

Т.е. на игроке эта функция не работает? Т.е. в МТА камеру никак не повернуть? (setCameraMatrix только фиксирует)

Link to comment
Т.е. на игроке эта функция не работает? Т.е. в МТА камеру никак не повернуть? (setCameraMatrix только фиксирует)

Я очень давно писал патч (#0006946), который поворачивает камеру не фиксируя её.

Но проблема в том, что команда МТА очень капризная и в то же время ленивая, когда им что-то не нравится, они сами исправлять что либо не хотят (даже самые тривиальные вещи). По этой причине в МТА до сих пор существуют старые баги, типа разсинхрона дверей и прочих мелких, но не приятных вещей.

Link to comment

Синхронизируется ли функция setVehicleAdjustableProperty с сервером?(нет возможности проверить) И вообще, на будущее: если функция клиент онли, то обязательно ли она не синхронизируется?

Link to comment

Подскажите пожалуйста, имеется массив, необходимо создать функцию удаления всех элементов и обнулить их. Все элементы удаляются, но не обнуляются.

local GUI =  
    { 
    button = {}, 
    checkbox = {}, 
    window = {}, 
    label = {}, 
    edit = {}, 
    label = {} 
    }; 
  
function destroyGUI() 
    for i, v in pairs(GUI) do 
        for i, v in pairs(v) do 
            if(v)then 
                destroyElement(v); 
                v = nil; 
            end 
        end 
    end 
    showCursor(false); 
end 

С чего я взял, что они не обнуюятся? Т.к есть эвент:

addEvent("destroyQuestionGUI", true); 
addEventHandler("destroyQuestionGUI", getRootElement(), destroyGUI); 

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

Bad 'element' pointer @ 'destroyElement'(1) --В нашем случае номер строки с ошибкой: 15. 

Link to comment

Что за дела?? Это чертовщина какая-то...

Прописал в карте одного из ресурсов пикапы:

<pickup type="custom" model="1239" posX="0" posY="0" posZ="5" /> 

Всё, нормально, при заходе на пикап, пикап не берётся, срабатывает евент onClientPickupHit. Всё ОК.

Создал пикапы в карте другого ресурса. Код тот же. Так эти пикапы чудным образом подбираются, а onClientPickupHit не срабатывает!

Разница лишь в том что в в первом случае я присваиваю уже в скрипте пикапам интерьеры и 2000-е дименшоны. И всё! Почему так вдруг, в одном ресурсе работает нормально, в другом - совсем по другому? Как исправить?

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

P.S.: в карте организованы небольшие ветки, также небольшие EDF.

Link to comment
type="custom"

Вот и не берется.

Ты кажется не читал мой пост. Мне и надо, чтоб не брался, так и должно быть. А почему в другом то ресурсе берется? Евент не срабатывает при взятии, издаётся звук взятия пикапа как в сингле. Пикап отображается нормально - информационной иконкой.

Самое интересное, не помогает даже код:

setPickupType(pickup, 3, 1239) 
setElementDimension(pickup, 0) 
setElementInterior(pickup, 0) 

который выполняется при запуске ресурса на стороне сервера.

Link to comment

Каким способом можно создать одноразовый код для команды? Допустим, /mKey Sqfferq, т.е. можно создавать несколько таких кодов, но, после использования, они теряли актуальность.

Link to comment
Что за дела?? Это чертовщина какая-то...

Прописал в карте одного из ресурсов пикапы:

<pickup type="custom" model="1239" posX="0" posY="0" posZ="5" /> 

Всё, нормально, при заходе на пикап, пикап не берётся, срабатывает евент onClientPickupHit. Всё ОК.

Создал пикапы в карте другого ресурса. Код тот же. Так эти пикапы чудным образом подбираются, а onClientPickupHit не срабатывает!

Разница лишь в том что в в первом случае я присваиваю уже в скрипте пикапам интерьеры и 2000-е дименшоны. И всё! Почему так вдруг, в одном ресурсе работает нормально, в другом - совсем по другому? Как исправить?

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

P.S.: в карте организованы небольшие ветки, также небольшие EDF.

Что я понял:

1) Во втором ресурсе пикап НЕ берется, только если я его создам на клиентской стороне. Выходит что карта на этом ресурсе работает как серверная сторона, в то время как в первом ресурсе карта чудным образом работает как клиентская сторона(пикап НЕ берется)

2) Решить проблему, не удаляя пикапы из карты второго ресурса можно только отменив событие onPickupHit на серверной стороне.

Пикап - кустомный(!).

Сколько неясностей то в MTA. До злости.

Link to comment

Некорректный код снизу, который я резал и исправлял по шаблонам. В целом, не получается изменить blip игрока. Дошел только до того, что он изменялся у всех подряд через определенное время. Радар-диско...

        local theplayerblip = getBlipAttachedTo(source) 
      local blips = getElementsByType ( "blip" ) 
        for blipK, blipV in ipairs ( blips ) do 
        if getElementAttachedTo( blipV ) == thePlayer then 
            if isObjectInACLGroup ( "user." .. getAccountName ( getPlayerAccount ( source )), aclGetGroup ( "Admin" ) ) then 
            setPlayerNametagColor (source, 137, 0, 255) 
            setBlipColor (theplayerblip, 137, 0, 255, 255) 
                elseif isObjectInACLGroup ( "user." .. getAccountName ( getPlayerAccount ( source )), aclGetGroup ( "SuperModerator" ) ) then 
                    setPlayerNametagColor (source, 255, 96, 0) 
                    setBlipColor (theplayerblip, 255, 96, 0, 255) 
                    elseif isObjectInACLGroup ( "user." .. getAccountName ( getPlayerAccount ( source )), aclGetGroup ( "Helper" ) ) then 
                        setPlayerNametagColor (source, 0, 128, 255) 
                        setBlipColor (theplayerblip, 0, 128, 255, 255) 
                            elseif isObjectInACLGroup ( "user." .. getAccountName ( getPlayerAccount ( source )), aclGetGroup ( "Garant" ) ) then 
                                setPlayerNametagColor (source, 255, 128, 0) 
                                setBlipColor (theplayerblip, 255, 128, 0, 255) 
                                elseif isObjectInACLGroup ( "user." .. getAccountName ( getPlayerAccount ( source )), aclGetGroup ( "Security" ) ) then 
                                    setPlayerNametagColor (source, 0, 51, 255) 
                                    setBlipColor (theplayerblip, 0, 51, 255, 255) 
                                    elseif isObjectInACLGroup ( "user." .. getAccountName ( getPlayerAccount ( source )), aclGetGroup ( "DT" ) ) then 
                                        setPlayerNametagColor (source, 255, 0, 0) 
                                        setBlipColor (theplayerblip, 255, 0, 0, 255) 
                                            elseif isObjectInACLGroup ( "user." .. getAccountName ( getPlayerAccount ( source )), aclGetGroup ( "Donate" ) ) then 
                                                setPlayerNametagColor (source, 255, 213, 0) 
                                                setBlipColor (theplayerblip, 255, 213, 0, 255) 
                                                    elseif isObjectInACLGroup ( "user." .. getAccountName ( getPlayerAccount ( source )), aclGetGroup ( "Everyone" ) ) then 
                                                        setPlayerNametagColor (source, 255, 222, 0) 
                                                        setBlipColor (theplayerblip, 255, 222, 0, 255) 
        end 
        end 
        end 

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