Jump to content

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


Recommended Posts

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

При выходе игрока МТА не применяет функции уничтожения элементов. Используй destroyElement, чтобы вручную удалить дочерние элементы.

function onPlayerQuit() 
    destroyElement( source ); 
end 
  
addEventHandler( "onPlayerQuit", root, onPlayerQuit ); 

Link to comment
При выходе игрока МТА не применяет функции уничтожения элементов. Используй destroyElement, чтобы вручную удалить дочерние элементы.
function onPlayerQuit() 
    destroyElement( source ); 
end 
  
addEventHandler( "onPlayerQuit", root, onPlayerQuit ); 

Я этого как раз и не знал... В общем, тогда так и сделаю как ты говоришь. Еще раз спасибо за помощь.

Link to comment
два изображения, какой функцией одно изображение замещается другим, тобишь делает его поверх второго?

аргумент postGUI - поверх всего, либо по порядку как слои.

dxDrawImage -- 1 слой 
dxDrawImage -- 2 слой 

Link to comment

Продублирую тут, так как в "Примеры" никто, видимо, не заходит.

Нужно заменить текстуру объекта:

addEventHandler ( 'onClientResourceStart', resourceRoot, 
    function() 
        txd_deletedAmmo =  engineLoadTXD  (  "txd/2notherbuildsfe.txd"  )  
        engineImportTXD  ( txd_deletedAmmo, 18034 )  
        if engineImportTXD  ( txd_deletedAmmo, 18041 ) == true then 
            outputChatBox "Текстура загрузилась" 
        else 
            outputChatBox "ТЕКСТУРА НЕ ЗАГРУЗИЛАСЬ" 
        end 
    end 
) 

<meta> 
    <info author="noob" name="ammoResource" version="1.0" type="script" /> 
    <oop>true</oop> 
    <script src="buyammo.lua" type="client" /> 
    <file src="txd/2notherbuildsfe.txd" type="client" /> 
</meta> 

Рядом с "meta.xml" папка "txd", в которой файл "2notherbuildsfe.txd".

В чат выводит, что "Текстура загрузилась", но на самом деле изменений нет. id проверял.

Что я делаю не так?

UPD: что за.., ничего не работает:

addEventHandler("onResourceStart", resourceRoot,  
    function() 
        for _, ammoSeller in ipairs ( getElementsByType ( "ped" ) ) do 
            outputChatBox (getElementData(ammoSeller, "id")) --выводит id ammoSeller'a 
            setPedAnimation ( ammoSeller, "SHOP", "SHP_Serve_Idle" ) 
        end 
    end 
) 

Файл серверный, id педа выводит, а анимация не применяется, ровно как и оружие не дается..

Edited by Guest
Link to comment
Всем привет, у меня вопрос как узнать количество разных элементов в таблице, то есть вот в данному случае их 3.
asd = 123 
qwe = 546 
rty = 163 
saved = {[asd] = 1, [qwe] = 2, [rty] = 3} 

альтернативный пример:

save = {1,3,5} 
print(#save) --> 3 

function table.count( var ) 
    local count = 0; 
     
    for _ in pairs( var ) do 
        count = count + 1; 
    end 
     
    return count; 
end 

Link to comment
addEventHandler("onResourceStart", resourceRoot,  
    function() 
        for _, ammoSeller in ipairs ( getElementsByType ( "ped" ) ) do 
            outputChatBox (getElementData(ammoSeller, "id")) --выводит id ammoSeller'a 
            setPedAnimation ( ammoSeller, "SHOP", "SHP_Serve_Idle" ) 
        end 
    end 
) 

Файл серверный, id педа выводит, а анимация не применяется, ровно как и оружие не дается..

Помогите же :(

Если до вызова функции я не видел в лицо педа, независимо от задержки её выполнения/рестарта ресурса, то к нему анимация не применяется. Почему так? Что делать? Не выполнять же эту функцию, когда кто-нибудь увидит этого педа, а потом отменять евент, ерунда же..

Link to comment

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

Link to comment
addEventHandler("onResourceStart", resourceRoot,  
    function() 
        for _, ammoSeller in ipairs ( getElementsByType ( "ped" ) ) do 
            outputChatBox (getElementData(ammoSeller, "id")) --выводит id ammoSeller'a 
            setPedAnimation ( ammoSeller, "SHOP", "SHP_Serve_Idle" ) 
        end 
    end 
) 

Файл серверный, id педа выводит, а анимация не применяется, ровно как и оружие не дается..

Помогите же :(

Если до вызова функции я не видел в лицо педа, независимо от задержки её выполнения/рестарта ресурса, то к нему анимация не применяется. Почему так? Что делать? Не выполнять же эту функцию, когда кто-нибудь увидит этого педа, а потом отменять евент, ерунда же..

https://wiki.multitheftauto.com/wiki/On ... ntStreamIn

Link to comment

Спасибо. Но если отменить эвент, то анимация один раз применится и больше эта функция никогда не вызовется; это же лучше, чем если она будет вызываться каждый раз, когда пед в стриме, ведь анимация все равно остается. Разве не так?

function startPeds( ) 
    if getElementType( source ) == "ped" then 
        setPedAnimation( source, "SHOP", "SHP_Serve_Idle" ) 
        removeEventHandler("onClientElementStreamIn", source, startPeds) 
    end 
end 
addEventHandler("onClientElementStreamIn", resourceRoot, startPeds) 

И еще: есть ли вместо "resourceRoot" какой-нибудь "элемент-родитель", который указывал бы на всех педов ресурса?

Чтобы заставить педа атаковать игрока, нужно ручками направлять прицел не игрока, пускать огонь и т.д.?

Или есть какая-нибудь функция?

Понял, ручками. :(

Link to comment
Спасибо. Но если отменить эвент, то анимация один раз применится и больше эта функция никогда не вызовется; это же лучше, чем если она будет вызываться каждый раз, когда пед в стриме, ведь анимация все равно остается. Разве не так?
function startPeds( ) 
    if getElementType( source ) == "ped" then 
        setPedAnimation( source, "SHOP", "SHP_Serve_Idle" ) 
        removeEventHandler("onClientElementStreamIn", source, startPeds) 
    end 
end 
addEventHandler("onClientElementStreamIn", resourceRoot, startPeds) 

И еще: есть ли вместо "resourceRoot" какой-нибудь "элемент-родитель", который указывал бы на всех педов ресурса?

Чтобы заставить педа атаковать игрока, нужно ручками направлять прицел не игрока, пускать огонь и т.д.?

Или есть какая-нибудь функция?

Понял, ручками. :(

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

Что насчет второго, то resourceRoot и есть тот "элемент-родитель". Но если тебе нужны, например, все педы, то используй getRootElement() или root.

Link to comment

Что в таком случае делать? isLineOfSightClear говорит, что все чисто, на внешний вид препятствий нет, но пули летят в стол.

UPD: дело даже не в столе, он и впритык стреляет, но не попадает. Буду искать причину..

function sellerAim(player, ped) 
    if getElementType(player) == "player" and getElementType(ped) == "ped" then 
        local pedhp = getElementHealth ( ped ) 
        if pedhp > 0 and (isPlayerDead(player) == false) then 
            local x,y,z = getElementPosition( player ) 
            local ex,ey,ez = getElementPosition( ped ) 
            local isclear = isLineOfSightClear (ex, ey, ez+.5, x, y, z+.5, true, false, false, true, false, false, false)  
            if (isclear == true) then 
                if isPedDucked(player) then 
                    setPedAimTarget ( ped, x, y, z-.2 ) 
                    dxDrawLine3D (ex, ey, ez+.5, x, y, z-.2) 
                else 
                    setPedAimTarget ( ped, x, y, z ) 
                    dxDrawLine3D (ex, ey, ez+.5, x, y, z+.5) 
                end 
            end 
            setTimer ( sellerAim, 80, 1, player, ped ) 
        else 
            setPedControlState(getElementByID("Ammo1Seller"), "fire", false) 
        end 
    end 
end 

setPedAimTarget лучше вызывать с помощью setTimer (каждые n миллисекунд) или с помощью onClientPreRender?

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

Что насчет второго, то resourceRoot и есть тот "элемент-родитель". Но если тебе нужны, например, все педы, то используй getRootElement() или root.

Просто событие, по-идее, будет срабатывать для каждого элемента, а не только для педов (а уж потом в функции проверять, пед ли это), коих довольно-таки много.

Link to comment

Господа, нужен пример кода:

Игрок нажимает какую либо клавишу =>

на экране начинает рендериться текст или png-картинка =>

по истечению определенного времени плавно исчезает.

UPD: РЕШЕНО

Link to comment

Всем привет, есть ли в lua функция которая округляет число к большему? Или надо делать что-то подобное:

if math.ceil(newX) - newX > 0.5 then 
    newX = math.floor(newX) 
else 
    newX = math.ceil(newX) 
end  

Может кто-то знает более крутой способ?

Link to comment

Ну крч, вот таблица:

Table = { 
    need = { 
        {'Test1', 100}, 
        {'Test2', 100} 
    }, 
    stat = { 
        {'Test3', false}, 
        {'Test4', false} 
    }, 
    item = { 
        {'Test5', 0}, 
        {'Test6', 0} 
    } 
} 

Использую его так:

  
for i, data in ipairs(Table.need) do 
        source:setData(data[1], data[2]) 
    end 
    for i, data in ipairs(Table.stat) do 
        source:setData(data[1], data[2]) 
    end 
    for i, data in ipairs(Table.item) do 
        source:setData(data[1], data[2]) 
    end 
  

Вопрос - можно как то использовать все в одном цикле? Если да то можно пример? Заранее благодарен!

Link to comment
Ну крч, вот таблица:
Table = { 
    need = { 
        {'Test1', 100}, 
        {'Test2', 100} 
    }, 
    stat = { 
        {'Test3', false}, 
        {'Test4', false} 
    }, 
    item = { 
        {'Test5', 0}, 
        {'Test6', 0} 
    } 
} 

Использую его так:

  
for i, data in ipairs(Table.need) do 
        source:setData(data[1], data[2]) 
    end 
    for i, data in ipairs(Table.stat) do 
        source:setData(data[1], data[2]) 
    end 
    for i, data in ipairs(Table.item) do 
        source:setData(data[1], data[2]) 
    end 
  

Вопрос - можно как то использовать все в одном цикле? Если да то можно пример? Заранее благодарен!

for _, v in pairs( Table ) do 
 for _, v2 in pairs( v ) do 
    source:setData( v2[ 1 ], v2[ 2 ] ); 
 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...