MX_Master

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

Recommended Posts

А по точней есть ли такая функция или нет?

getElementPosition?

Share this post


Link to post

Скрипт не мой но я пытаюсь поменять шрифт, не выходит, совсем. Помогите пожалуйста, варианты кончились...

--these are the banned vehicle ids where you cannot get drift points. 
local BannedIDs = { 432, 532 } 
  
local rootElem = getRootElement() 
local thisRoot = getResourceRootElement(getThisResource()) 
local player = getLocalPlayer() 
local vehicle 
local size = 1.2 
local modo = 0.01 
local score = 0 
local screenScore = 0 
local tick 
local idleTime 
local multTime 
local driftTime 
local Yellow = tocolor(255,232,25) 
local Red = tocolor(234,0,3) 
local TempCol = Yellow 
local mult = 1 
local tablamult = {350,1400,4200,11200} 
local anterior = 0 
local mejor = 0 
local total = 0 
font = "X7GR0XDL.ttf" 
  
local global_mejor = 0 
local global_nombre = "N/A" 
  
local screenWidth, screenHeight = guiGetScreenSize() 
local x1,y1,x2,y2 = screenWidth*0.2,screenHeight*0.1,screenWidth*0.8,screenHeight*0.8 
  
addEventHandler("onClientResourceStart", thisRoot, 
    function() 
        addEventHandler("onClientRender", rootElem, showText) 
        outputChatBox("Waiting for server drift data...") 
        triggerServerEvent("driftClienteListo", rootElem, player) 
    end 
) 
  
addEventHandler("onClientResourceStop", thisRoot, 
    function() 
        removeEventHandler("onClientRender", rootElem, showText) 
    end 
) 
  
function isValidVehicle() 
    local temp = getPedOccupiedVehicle(player) 
     
    if not temp or getVehicleOccupant(temp,0) ~= player or getVehicleType(temp) ~= "Automobile" then 
        return false 
    end 
     
    local vehID = getElementModel(temp) 
    for k,v in ipairs(BannedIDs) do if vehID == v then return false end end 
     
    return temp 
end 
  
function showText() 
    dxDrawText(string.format("Лучший заезд: %s - %d",global_nombre,global_mejor),44,screenHeight-43,screenWidth,screenHeight,Yellow,1,"bankgothic") 
     
    vehicle = isValidVehicle() 
    if not vehicle then return end 
     
    if size > 1.3 then  
        modo = -0.01  
    elseif size < 1.2 then  
        modo = 0.01  
    end 
    size = size + modo 
     
    tick = getTickCount() 
    local angulo,velocidad = angle() 
     
    local tempBool = tick - (idleTime or 0) < 750 
    if not tempBool and score ~= 0 then 
        anterior = score 
        setElementData(player, "Последний др.", anterior) 
        total = total+anterior 
        setElementData(player, "Всего др.", total) 
        if score > mejor then 
            mejor = score 
            setElementData(player, "Лучший др.", mejor) 
        end 
        triggerEvent("onVehicleDriftEnd", rootElem, tick-driftTime-750) 
        score = 0 
    end 
     
    if angulo ~= 0 then 
        if score == 0 then  
            triggerEvent("onVehicleDriftStart", rootElem) 
            driftTime = tick 
        end 
        if tempBool then 
            score = score + math.floor(angulo*velocidad)*mult 
        else 
            score = math.floor(angulo*velocidad)*mult 
        end 
        if TempCol == Red then 
            TempCol = Yellow 
        end 
        screenScore = score 
        idleTime = tick 
    end 
     
     
    if velocidad <= 0.3 and mult ~= 1 then 
        dxDrawText("\n\nToo Slow!", 20,155,screenWidth,screenHeight, Yellow, 1.2, font,"left","top", false,true,false) 
    end 
     
    if tick - (idleTime or 0) < 3000 then 
        local temp = "DRIFT" 
        if score >= 100000 then 
            temp = "DRIFT\n\nDrift King!" 
        elseif score >= 50000 then 
            temp = "DRIFT\n\nInsane Drift!" 
        elseif score >= 20000 then 
            temp = "DRIFT\n\nOutrageous!" 
        elseif score >= 15000 then 
            temp = "DRIFT\n\nColossal!" 
        elseif score >= 7000 then 
            temp = "DRIFT\n\nSuberb!" 
        elseif score >= 3000 then 
            temp = "DRIFT\n\nGreat Drift!" 
        elseif score >= 1000 then 
            temp = "DRIFT\n\nGood Drift!" 
        end 
       dxDrawText(temp, x1,y1,x2,y2, TempCol, 2.2, font,"center","top", false,true,false) 
        dxDrawText(string.format("\n%d",screenScore),  x1,y1-10,x2,y2, TempCol, size, font,"center","top", false,true,false) 
    end 
end 
  
function angle() 
    local vx,vy,vz = getElementVelocity(vehicle) 
    local modV = math.sqrt(vx*vx + vy*vy) 
     
    if not isVehicleOnGround(vehicle) then return 0,modV end 
     
    local rx,ry,rz = getElementRotation(vehicle) 
    local sn,cs = -math.sin(math.rad(rz)), math.cos(math.rad(rz)) 
     
    local deltaT = tick - (multTime or 0) 
    if mult~= 1 and modV <= 0.3 and deltaT > 750 then 
        mult = mult-1 
        multTime = tick 
    elseif deltaT > 1500 then 
        local temp = 1 
        if score >= 11200 then 
            temp = 5 
        elseif score >= 4200 then 
            temp = 4 
        elseif score >= 1400 then 
            temp = 3 
        elseif score >= 350 then 
            temp = 2 
        end 
        if temp>mult then 
            mult = temp 
            multTime = tick 
        end 
    end 
     
    if modV <= 0.2 then return 0,modV end --speed over 40 km/h 
     
    local cosX = (sn*vx + cs*vy)/modV 
    if cosX > 0.966 or cosX < 0 then return 0,modV end --angle between 15 and 90 degrees 
    return math.deg(math.acos(cosX))*0.5, modV 
end 
  
addEvent("driftCarCrashed", true) 
addEventHandler("driftCarCrashed", rootElem,  
    function() 
        if score ~= 0 then 
            score = 0 
            mult = 1 
            TempCol = Red 
            triggerEvent("onVehicleDriftEnd", rootElem, 0) 
        end 
    end 
) 
  
addEvent("driftActualizarRecord", true) 
addEventHandler("driftActualizarRecord", rootElem, 
    function(score, name) 
        global_mejor = score 
        global_nombre = name 
    end 
) 
function resetScore() 
    anterior,mejor,total = 0,0,0 
    setElementData(player, "Последний др.", anterior) 
    setElementData(player, "Всего др.", total) 
    setElementData(player, "Лучший др.", mejor) 
end 
addEvent("driftResetAllScores", true) 
addEventHandler("driftResetAllScores", rootElem, resetScore) 
addCommandHandler("resetdrift", resetScore) 
  
function checkPuntaje() 
    if total > global_mejor then 
        triggerServerEvent("driftNuevoRecord", rootElem, total, getPlayerName(player)) 
    end 
end 
addEventHandler("onClientPlayerFinish", rootElem, checkPuntaje) 
addEventHandler("onClientPlayerOutOfTime", rootElem, checkPuntaje) 

Share this post


Link to post
...

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

Лови

Client:

function onEnterVehicle () 
     bindKey ( "k", "down", startLights ) 
     setElementData ( localPlayer, "on", 0 ) 
end 
addEventHandler ( "onClientPlayerVehicleEnter", getRootElement(), onEnterVehicle ) 
  
function startLights ( ) 
     local state = getElementData ( localPlayer, "on" ) 
     if ( state == 0 ) then 
          setElementData ( localPlayer, "on", 1 ) 
          triggerServerEvent ( "addVehicleToTable", localPlayer ) 
      else 
          setElementData ( localPlayer, "on", 0 ) 
          triggerServerEvent ( "removeVehicleFromTable", localPlayer, getPedOccupiedVehicle ( localPlayer ) ) 
     end 
end 
  
function Exit ( vehicle ) 
     unbindKey ( "k", "down", create ) 
     setElementData ( localPlayer, "on", 0 ) 
     triggerServerEvent ( "removeVehicleFromTable", localPlayer, vehicle ) 
end 
addEventHandler ( "onClientPlayerVehicleExit", getRootElement(), Exit ) 
  
function Explode ( ) 
     unbindKey ( "k", "down", create ) 
     setElementData ( localPlayer, "on", 0 ) 
     triggerServerEvent ( "removeVehicleFromTable", localPlayer, source ) 
end 
addEventHandler ( "onClientVehicleExplode", getRootElement(), Explode ) 
  
function Destroy () 
   if ( getElementType(source) == "vehicle" ) then 
        unbindKey ( "k", "down", create ) 
        setElementData ( localPlayer, "on", 0 ) 
        triggerServerEvent ( "removeVehicleFromTable", localPlayer, source ) 
   end 
end 
addEventHandler ("onClientElementDestroy", getRootElement(), Destroy ) 

Server:

local vehicles = { }; 
  
addEvent ( "addVehicleToTable", true ) 
addEventHandler ( "addVehicleToTable", getRootElement(), function ( ) 
     local vehicle = getPedOccupiedVehicle ( source ) 
     table.insert ( vehicles, vehicle ) 
end ) 
  
addEvent ( "removeVehicleFromTable", true ) 
addEventHandler ( "removeVehicleFromTable", getRootElement(), function ( veh ) 
     table.removevalue(vehicles, veh) 
end ) 
  
function startLights ( ) 
     for i, v in ipairs ( vehicles ) do 
          setVehicleLightState ( v, 0,  0 ) 
     end 
     setTimer( function ( )  
          for i, v in ipairs ( vehicles ) do 
               setVehicleLightState ( v, 0,  1 ) 
          end  
     end, 50, 1 )  
end 
setTimer ( startLights, 500, 0 ) 
  
addEventHandler("onPlayerQuit", root, 
    function() 
            local veh = getPedOccupiedVehicle ( source ) 
            table.removevalue(vehicles, veh) 
end) 
  
function table.removevalue(t, val) 
    for i,v in ipairs(t) do 
        if v == val then 
            table.remove(t, i) 
            return i 
        end 
    end 
    return false 
end 

Share this post


Link to post
А по точней есть ли такая функция или нет?

getElementPosition?

Вроде понятно написал. Эта функция возвращает координаты машины, а мне нужна, которая возвращала бы координаты "переда" машины, т.е. там где находятся фары ( примерно ).

Share this post


Link to post
function setCar() 
car = createVehicle ( 402, -2405, -598, 132.6484375 ) 
setVehicleColor( car, 255, 255, 0 ) 
setVehicleDamageProof(car, true) 
setVehicleLocked ( car, true ) 
end 
addEventHandler ( "onResourceStart", getRootElement(), setCar ) 
  
function privatCar(thePlayer, seat, jacked) 
local name = getAccountName ( thePlayer ) 
  if name == "[CCCR]Fox" then 
  setVehicleLocked ( car, false ) 
    if isVehicleLocked ( car ) then 
     outputChatBox ( "Автомобиль закрыт", thePlayer) 
     end 
   end 
end 
addEventHandler ( "onVehicleStartEnter", getRootElement(), privatCar )   
  

Машина постоянно закрыта, в чём ошибка?

Share this post


Link to post
function setCar() 
car = createVehicle ( 402, -2405, -598, 132.6484375 ) 
setVehicleColor( car, 255, 255, 0 ) 
setVehicleDamageProof(car, true) 
setVehicleLocked ( car, true ) 
end 
addEventHandler ( "onResourceStart", getRootElement(), setCar ) 
  
function privatCar(thePlayer, seat, jacked) 
local name = getAccountName ( thePlayer ) 
  if name == "[CCCR]Fox" then 
  setVehicleLocked ( car, false ) 
    if isVehicleLocked ( car ) then 
     outputChatBox ( "Автомобиль закрыт", thePlayer) 
     end 
   end 
end 
addEventHandler ( "onVehicleStartEnter", getRootElement(), privatCar )   
  

Машина постоянно закрыта, в чём ошибка?

Дебаг пробовал смотреть? getAccountName принимает первым аккаунт а не игрока

Share this post


Link to post
function setCar() 
car = createVehicle ( 402, -2405, -598, 132.6484375 ) 
setVehicleColor( car, 255, 255, 0 ) 
setVehicleDamageProof(car, true) 
setVehicleLocked ( car, true ) 
end 
addEventHandler ( "onResourceStart", getRootElement(), setCar ) 
  
function privatCar(thePlayer, seat, jacked) 
local name = getAccountName ( thePlayer ) 
  if name == "[CCCR]Fox" then 
  setVehicleLocked ( car, false ) 
    if isVehicleLocked ( car ) then 
     outputChatBox ( "Автомобиль закрыт", thePlayer) 
     end 
   end 
end 
addEventHandler ( "onVehicleStartEnter", getRootElement(), privatCar )   
  

Машина постоянно закрыта, в чём ошибка?

Дебаг пробовал смотреть? getAccountName принимает первым аккаунт а не игрока

Уже разобрался и убрал ошибку и вообще там можно было более проще написать...

Share this post


Link to post

Как сделать, чтобы после окончании первой анимации плавно шла вторая?

Share this post


Link to post
Как сделать, чтобы после окончании первой анимации плавно шла вторая?

Никак. Раньше была функция blendPedAnimation, но её убрали

Share this post


Link to post

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

Share this post


Link to post
как можно сделать огнемет на машину

https://wiki.multitheftauto.com/wiki/CreateWeapon

и приаттачить к машине.

Нельзя, его там нет.

Как вариант применять createEffect и сделать кулшейп вокруг машины, если игрок вошел в него, то применяем setPedOnFire.

https://wiki.multitheftauto.com/wiki/CreateEffect

https://wiki.multitheftauto.com/wiki/CreateColSphere

https://wiki.multitheftauto.com/wiki/SetPedOnFire

Share this post


Link to post

Как зациклить в бесконечность этот эффект?

fxAddBulletImpact(1022.5099487305, -1120.9005126953, 27.184593200684, 0, 0, 0, math.random(1, 2), math.random(2, 5), 1.0) 

Share this post


Link to post
...

Лови

Спсибо большое за помощь! Но к сожалению оно так нормально и не работает.

Первую минуту вроде все хорошо, потом оно перестает выключаться с кнопки. У других игроков включается через раз и тоже не выключается с кнопки... В плюс к этому получаю целую кучу ошибок в логах "Bad vehicle pointer"..

Share this post


Link to post
...

Лови

Спсибо большое за помощь! Но к сожалению оно так нормально и не работает.

Первую минуту вроде все хорошо, потом оно перестает выключаться с кнопки. У других игроков включается через раз и тоже не выключается с кнопки... В плюс к этому получаю целую кучу ошибок в логах "Bad vehicle pointer"..

Ошибки, скорее всего, вообще не из-за этого(либо вы там что-то совсем уж намудрили). Скиньте код, поможем.

Share this post


Link to post
Ошибки, скорее всего, вообще не из-за этого(либо вы там что-то совсем уж намудрили). Скиньте код, поможем.

Так это и есть весь код

Лови

Client:

function onEnterVehicle () 
     bindKey ( "k", "down", startLights ) 
     setElementData ( localPlayer, "on", 0 ) 
end 
addEventHandler ( "onClientPlayerVehicleEnter", getRootElement(), onEnterVehicle ) 
  
function startLights ( ) 
     local state = getElementData ( localPlayer, "on" ) 
     if ( state == 0 ) then 
          setElementData ( localPlayer, "on", 1 ) 
          triggerServerEvent ( "addVehicleToTable", localPlayer ) 
      else 
          setElementData ( localPlayer, "on", 0 ) 
          triggerServerEvent ( "removeVehicleFromTable", localPlayer, getPedOccupiedVehicle ( localPlayer ) ) 
     end 
end 
  
function Exit ( vehicle ) 
     unbindKey ( "k", "down", create ) 
     setElementData ( localPlayer, "on", 0 ) 
     triggerServerEvent ( "removeVehicleFromTable", localPlayer, vehicle ) 
end 
addEventHandler ( "onClientPlayerVehicleExit", getRootElement(), Exit ) 
  
function Explode ( ) 
     unbindKey ( "k", "down", create ) 
     setElementData ( localPlayer, "on", 0 ) 
     triggerServerEvent ( "removeVehicleFromTable", localPlayer, source ) 
end 
addEventHandler ( "onClientVehicleExplode", getRootElement(), Explode ) 
  
function Destroy () 
   if ( getElementType(source) == "vehicle" ) then 
        unbindKey ( "k", "down", create ) 
        setElementData ( localPlayer, "on", 0 ) 
        triggerServerEvent ( "removeVehicleFromTable", localPlayer, source ) 
   end 
end 
addEventHandler ("onClientElementDestroy", getRootElement(), Destroy ) 

Server:

local vehicles = { }; 
  
addEvent ( "addVehicleToTable", true ) 
addEventHandler ( "addVehicleToTable", getRootElement(), function ( ) 
     local vehicle = getPedOccupiedVehicle ( source ) 
     table.insert ( vehicles, vehicle ) 
end ) 
  
addEvent ( "removeVehicleFromTable", true ) 
addEventHandler ( "removeVehicleFromTable", getRootElement(), function ( veh ) 
     table.removevalue(vehicles, veh) 
end ) 
  
function startLights ( ) 
     for i, v in ipairs ( vehicles ) do 
          setVehicleLightState ( v, 0,  0 ) 
     end 
     setTimer( function ( )  
          for i, v in ipairs ( vehicles ) do 
               setVehicleLightState ( v, 0,  1 ) 
          end  
     end, 50, 1 )  
end 
setTimer ( startLights, 500, 0 ) 
  
addEventHandler("onPlayerQuit", root, 
    function() 
            local veh = getPedOccupiedVehicle ( source ) 
            table.removevalue(vehicles, veh) 
end) 
  
function table.removevalue(t, val) 
    for i,v in ipairs(t) do 
        if v == val then 
            table.remove(t, i) 
            return i 
        end 
    end 
    return false 
end 

я меняю только время в таймерах, или добавляю еще таймеры. Но даже код в чистом виде как написал господин Memory имеет эти проблемы.

Share this post


Link to post

Не знаю, у меня всё прекрасно и без всяких проблем работало.

Share this post


Link to post
Не знаю, у меня всё прекрасно и без всяких проблем работало.

Хронология событий такая:

Включаю скрипт, нажимаю бинд - включается. Нажимаю еще раз - выключается. Все хорошо.

Включаю у себя.

Прошу другого игрока включить - не включается. Через несколько секунд включается само. И перестает выключаться с кнопки. И у меня и у игрока.

Мистика какая-то.

Share this post


Link to post

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.