Jump to content

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


Recommended Posts

Всем хай! ;)

Вопрос скорее туповатый но все же никак не додумаюсь...

Как можно заставить мигать dxDrawRectangle?

Ну есть самый примитивный код

  
local alpha = 0 
local atype = 'up' 
  
addEventHandler('onClientRender', root, function () 
    if (alpha >= 0 and atype == 'up') then 
        alpha = alpha + 5 
    elseif (alpha <= 200 and atype == 'down') then 
        alpha = alpha - 5 
    end 
    if (alpha == 0) then 
        atype = 'up' 
    elseif (alpha == 200) then 
        atype = 'down' 
    end 
    dxDrawRectangle(x, y, w, h, tocolor(150, 0, 0, alpha)) 
end) 
  

Работает, но я бы предпочел без atype переменной, нельзя использовать саму alpha переменную?

UPD:

  
if (alpha >= 0 and alpha ~= 200) then 
    alpha = alpha + 5 
elseif (alpha <= 200 and alpha ~= 1) then 
    alpha = alpha - 5 
end 
  

Эт тоже не помогло

Такие вещи лучше делать с привязкой ко времени. Иначе при разном FPS мигание будет с разной скоростью.

Простой пример как это делается:

local alpha         = 0; 
local alphaTarget   = 255; 
local time          = 5000; 
local timeEnd       = getTickCount() + time; 
  
addEventHandler( "onClientRender", root, 
    function() 
        local progress = 1.0 - ( timeEnd - getTickCount() ) / time; 
         
        alpha = math.lerp( alpha, alphaTarget, progress ); 
    end 
); 
  
function math.lerp( from, to, f ) 
    return from + ( to - from ) * math.max( math.min( f, 1.0 ), 0.0 ); 
end 

Что по твоему вопросу - без проверки и доп.переменной не вижу решения. В данном примере можно добавить проверку на alpha когда она достигает нужного значения, менять targetAlpha на другое и обновлять timeEnd.

P.S. Можно кстати добавить Easing функции в пример, для изменения плавности анимации

Link to comment

Такие вещи лучше делать с привязкой ко времени. Иначе при разном FPS мигание будет с разной скоростью.

Простой пример как это делается:

local alpha         = 0; 
local alphaTarget   = 255; 
local time          = 5000; 
local timeEnd       = getTickCount() + time; 
  
addEventHandler( "onClientRender", root, 
    function() 
        local progress = 1.0 - ( timeEnd - getTickCount() ) / time; 
         
        alpha = math.lerp( alpha, alphaTarget, progress ); 
    end 
); 
  
function math.lerp( from, to, f ) 
    return from + ( to - from ) * math.max( math.min( f, 1.0 ), 0.0 ); 
end 

Что по твоему вопросу - без проверки и доп.переменной не вижу решения. В данном примере можно добавить проверку на alpha когда она достигает нужного значения, менять targetAlpha на другое и обновлять timeEnd.

P.S. Можно кстати добавить Easing функции в пример, для изменения плавности анимации

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

Link to comment

Такие вещи лучше делать с привязкой ко времени. Иначе при разном FPS мигание будет с разной скоростью.

Простой пример как это делается:

local alpha         = 0; 
local alphaTarget   = 255; 
local time          = 5000; 
local timeEnd       = getTickCount() + time; 
  
addEventHandler( "onClientRender", root, 
    function() 
        local progress = 1.0 - ( timeEnd - getTickCount() ) / time; 
         
        alpha = math.lerp( alpha, alphaTarget, progress ); 
    end 
); 
  
function math.lerp( from, to, f ) 
    return from + ( to - from ) * math.max( math.min( f, 1.0 ), 0.0 ); 
end 

Что по твоему вопросу - без проверки и доп.переменной не вижу решения. В данном примере можно добавить проверку на alpha когда она достигает нужного значения, менять targetAlpha на другое и обновлять timeEnd.

P.S. Можно кстати добавить Easing функции в пример, для изменения плавности анимации

Пример не до конца?) Спасибо большое)

Link to comment
А что на счет изменения угла поворота игрока аналогичным способом, я видел раньше ты обсуждал уже эту тему, но там конкрентого решения я не нашел?

Конкретнее? Я не помню уже..

Пример не до конца?) Спасибо большое)

Да, это пример, а не готовое решение заточенное под тебя. Пожалуйста.

Link to comment
Конкретнее? Я не помню уже..

Суть задачи, чтобы угол поворота педа = уголу поворота камеры, но вот если вставить в рендер и на каждый кадр задавать вращение педа исходя от угла камеры тогда FPS будет влиять на скорость, да? А я хочу сделать плавный поворот.

local camera = getCamera() 
function updateCamera() 
    local _, _, rx = getElementRotation(camera)  
    setPedRotation(localPlayer, rx) 
end 
addEventHandler ( "onClientPreRender", root, updateCamera ) 

Ты тогда что-то такое придумал:

-- Пример для onClientPreRender 
-- current - текущий угол поворота игрока 
-- target - угол поворота к которому нужно повернуться 
-- timeSlice - аргумент возвращаемый onClientPreRender 
  
setPedRotation( localPlayer, current + math.sin( math.rad( target - current ) ) * ( timeSlice * .5 ) ); 

Link to comment

Написал себе первый скрипт сам :lol: только вот проблема. при старте/рестарте любого ресурса из админ панели этот мой скрипт тоже сам перезапускается. из-за чего это происходит?

сервер

warPosCar = { 
    { 623.29998779297, -2498.6000976563, 5.4 }, 
    { -1469.2001953125, 1489.599609375, 10 }, 
    { 3194.6000976563, 2240.1000976563, 4.7 }, 
} 
  
function werCarPos () 
    if isElement ( warCar ) then 
        destroyElement ( warCar ) 
    end 
    if isElement ( blipWarCar ) then 
        destroyElement ( blipWarCar ) 
    end 
    randomWarCar = math.random ( #warPosCar ) 
    if randomWarCar then 
        ropX, dropY, dropZ = warPosCar[randomWarCar][1], warPosCar[randomWarCar][2], warPosCar[randomWarCar][3] 
        carId = math.random ( 1, 2 ) 
        if carId == 1 then 
            carIdRes = "520" 
            carName = "Hydra" 
        else 
            carIdRes = "425" 
            carName = "Hunter" 
        end 
        warCar = createVehicle ( carIdRes, ropX, dropY, dropZ ) 
        blipWarCar = createBlipAttachedTo ( warCar, 56, 1, 255, 255, 255, 255, 100 ) 
        outputChatBox ( "-- Обнаружен #FF0000"..carName.."#FFFFFF. Он отмечен на карте желтым кружком.", getRootElement(), 255, 255, 255, true ) 
    end 
    setTimer ( function() 
        if isElement ( warCar ) then 
            if getElementHealth ( warCar ) < 10 then 
                destroyElement ( warCar ) 
                destroyElement ( blipWarCar ) 
                setTimer ( werCarPosTwo, 1000, 1) 
            end 
        end 
    end, 28800000, 1 ) 
    --outputDebugString("Заспавнен "..carName..".", 3 ) 
end 
addEventHandler ( "onResourceStart", getRootElement(), werCarPos ) 
  
function werCarPosTwo () 
    if isElement ( warCar ) then 
        destroyElement ( warCar ) 
    end 
    if isElement ( blipWarCar ) then 
        destroyElement ( blipWarCar ) 
    end 
    randomWarCar = math.random ( #warPosCar ) 
    if randomWarCar then 
        ropX, dropY, dropZ = warPosCar[randomWarCar][1], warPosCar[randomWarCar][2], warPosCar[randomWarCar][3] 
        carId = math.random ( 1, 2 ) 
        if carId == 1 then 
            carIdRes = 520 
            carName = "Hydra" 
        else 
            carIdRes = 425 
            carName = "Hunter" 
        end 
        warCar = createVehicle ( carIdRes, ropX, dropY, dropZ ) 
        blipWarCar = createBlipAttachedTo ( warCar, 56, 1, 255, 255, 255, 255, 100 ) 
        outputChatBox ( "-- Обнаружен #FF0000"..carName.."#FFFFFF. Он отмечен на карте желтым кружком.", getRootElement(), 255, 255, 255, true ) 
    end 
    setTimer ( function() 
        if isElement ( warCar ) then 
            if getElementHealth ( warCar ) < 10 then 
                destroyElement ( warCar ) 
                destroyElement ( blipWarCar ) 
                setTimer ( werCarPos, 1000, 1) 
            end 
        end 
    end, 28800000, 1 ) 
    --outputDebugString("Заспавнен "..carName..".", 3 ) 
end 

мета

<meta> 
    <script src="server.lua" type="server" /> 
</meta> 

Link to comment

Спасибо, очень помогло)

Еще вопрос появился. Есть xml файл. и в него идет запись данных

<private> 
<vehicle owner="Nik" model="494" pos="[ [ 229.7080078125, 1659.4375, 15.23603630065918 ] ]" rot="[ [ 2.427978515625, 4.471435546875, 315.98876953125 ] ]" color="[ [ 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] ]" paintjob="3" upgrades="[ [ ] ]" interior="0" dimension="0" />  
<vehicle owner="Nik" model="493" pos="[ [ 229.7080078125, 1659.4375, 15.23603630065918 ] ]" rot="[ [ 2.427978515625, 4.471435546875, 315.98876953125 ] ]" color="[ [ 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] ]" paintjob="3" upgrades="[ [ ] ]" interior="0" dimension="0" />  
</private>  

как удалить одну из эти строк? есть такая функция или что то то подобное?

Link to comment
  • Other Languages Moderators
Спасибо, очень помогло)

Еще вопрос появился. Есть xml файл. и в него идет запись данных

<private> 
<vehicle owner="Nik" model="494" pos="[ [ 229.7080078125, 1659.4375, 15.23603630065918 ] ]" rot="[ [ 2.427978515625, 4.471435546875, 315.98876953125 ] ]" color="[ [ 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] ]" paintjob="3" upgrades="[ [ ] ]" interior="0" dimension="0" />  
<vehicle owner="Nik" model="493" pos="[ [ 229.7080078125, 1659.4375, 15.23603630065918 ] ]" rot="[ [ 2.427978515625, 4.471435546875, 315.98876953125 ] ]" color="[ [ 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] ]" paintjob="3" upgrades="[ [ ] ]" interior="0" dimension="0" />  
</private>  

как удалить одну из эти строк? есть такая функция или что то то подобное?

https://wiki.multitheftauto.com/wiki/XmlDestroyNode оно? Но сразу скажу. Что сохранять машины в .xml не разумно, когда есть СУБД.

Link to comment

такая проблема. сделал на сервере зеленую зону и запретил всем в ней драться с помощью toggleControl ( hitElement, "fire", false ), но некоторые все равно иногда могут махать кулаками. как так? что то еще нужно запретить что ли?

Link to comment
такая проблема. сделал на сервере зеленую зону и запретил всем в ней драться с помощью toggleControl ( hitElement, "fire", false ), но некоторые все равно иногда могут махать кулаками. как так? что то еще нужно запретить что ли?

Мне кажется что проблема в том что можно биться с помощью ЛКМ и ПКМ+F (по стандарту).

Link to comment

Не получается вывести ID игрока в нике :(

Через команду выводится в чат, при вызове - ошибка.

client(1)

    dxDrawText ( getPlayerNameR(player) .. '[' .. tostring(call(getResourceFromName("gn"), 'getitIDbyName', tostring(getPlayerName(player)))) .. ']', sx+1, sy - offset+1, sx+1, sy - offset+1, tocolor(0,0,0,255), textscale*NAMETAG_TEXTSIZE, srfont, "center", "bottom", false, false, false ) 

client(2)

    function gn ( player_name ) 
            outputChatBox(tostring(player_name)) 
  
            if ( player_name ) then 
                    local sucess, value = getNameMatches ( player_name ) 
                    local player_id = getElementData ( value, "ID" ) 
                    return player_id 
            end 
    end    

meta

  function="gn" type="client"/> 

4323ee88ea43.png

Link to comment

подскажите почему не работает последняя функция playerDamage?

safecol = createColCuboid(2719.5852050781, -2585.7465820313, -5, 150, 272, 200) 
safeZoneRadar = createRadarArea(2719.5852050781, -2585.7465820313, 150, 272, 0, 255, 0, 100) 
setElementData (safeZoneRadar, "zombieProof", true) 
  
function enterZone(hitElement, thePlayer) 
    setVehicleDamageProof ( hitElement, true ) 
    if getElementType ( hitElement ) == "player" then  
        outputChatBox("Вы вошли в зеленую зону", hitElement, 0, 255, 0) 
        setElementData ( hitElement, 'damage', 'no' ) 
        setElementData ( hitElement, 'weaponZZ', true ) 
        toggleControl ( hitElement, "fire", false ) 
    end 
end 
addEventHandler( "onColShapeHit", safecol, enterZone ) 
  
function leaveZone(hitElement, thePlayer) 
    setVehicleDamageProof ( hitElement, false ) 
    if getElementType ( hitElement ) == "player" then  
        outputChatBox("Вы покинули зеленую зону", hitElement, 255, 0, 0) 
        setElementData( hitElement, 'damage', 'yes' ) 
        setElementData ( hitElement, 'weaponZZ', false ) 
        toggleControl ( hitElement, "fire", true ) 
    end 
end 
addEventHandler( "onColShapeLeave", safecol, leaveZone ) 
  
setTimer ( function () 
    for id, player in ipairs( getElementsByType ( "player" ) ) do 
        if getElementData ( player, 'weaponZZ' ) then 
            local weaponID = getPedWeapon ( player ) 
            if weaponID ~= 0 then 
                giveWeapon ( player, 0, 1, true ) 
            end 
        end 
    end 
end, 100, 0 ) 
  
function playerDamage ( attacker, weapon, bodypart, loss ) 
    local killer = attacker 
    if getElementData ( source, 'weaponZZ' ) then 
        local playerHealth = getElementHealth ( killer ) 
        setElementHealth ( killer, playerHealth - loss ) 
    end 
end 
addEventHandler ( "onPlayerDamage", getRootElement (), playerDamage ) 

Link to comment
подскажите почему не работает последняя функция playerDamage?

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

Link to comment
подскажите почему не работает последняя функция playerDamage?

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

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

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