Jump to content

[Script] AFK


Recommended Posts

salve, sono nuovo nel forum.

Ho una base pittosto scarsa in programmazione e avrei una serie di problemi nella realizzazione di una funzione.

Sto realizzando un controllo per l'afk per un server race.

Il problema è che non riesco a rilevare se la gara è in svolgimento o se è finita (lato client).

Allego il codice che ho scritto/modificato da una resource già esistente. La funzione isRaceStarted() è quella che devo creare.

CLIENT

  
local MaxAFKtime = 30 
local warnTime = 20 
local v = 0 
local AFKtime = 0 
local sx,sy = guiGetScreenSize()  
local wEvent = false 
  
function rWarn() 
    dxDrawImage( sx/2 - 300, sy/2 - 100, 600, 200, 'warn.png' ) 
end 
  
function stopWarn() 
    if(wEvent) then 
        removeEventHandler("onClientRender", getRootElement(), rWarn)  
        wEvent = false 
    end 
end 
  
function checkMain() 
   if isPedInVehicle ( getLocalPlayer() ) and isRaceStarted() then 
    local v = getElementVelocity ( getPedOccupiedVehicle ( getLocalPlayer() ) ) 
    outputChatBox ( "cacca") 
    if(v == 0 or wEvent) then 
        aTimeAdd() 
    else 
        aTimeClear() 
    end 
   end 
end 
  
function aTimeAdd() 
    AFKtime = AFKtime + 0.1 
    if(AFKtime >= warnTime and AFKtime < MaxAFKtime) then  
        triggerServerEvent("afkSlap",getLocalPlayer(), 2) 
        addEventHandler("onClientRender", getRootElement(), rWarn)       
        if(not wEvent) then  
            wEvent = true                    
        end              
    elseif(AFKtime >=MaxAFKtime) then 
        --triggerServerEvent ( "afkSlap", getLocalPlayer(), 2) 
        --triggerServerEvent ( "afkWarn", getLocalPlayer(), 1) 
    end 
end 
  
function aTimeClear() 
        AFKtime = 0 
end 
  
function afkClear(key, keyState) 
        if(wEvent)then           
            stopWarn()           
            aTimeClear() 
        end 
end 
  
setTimer ( checkMain, 100, -1) 
  
function onClientLoaded(res) 
    bindKey ("space", "down", afkClear) 
    triggerServerEvent("onClientLoaded",getLocalPlayer()) 
end 
addEventHandler("onClientResourceStart",getResourceRootElement(getThisResource()),onClientLoaded) 
  
function loadSettings(maxtime, wtime ) 
    MaxAFKtime = tonumber(maxtime) 
    warnTime = tonumber(wtime)   
end 
addEvent( "onSettingsReady", true ) 
addEventHandler( "onSettingsReady", getRootElement(), loadSettings ) 
  

SERVER

  
local raceState = "" 
local enableMessages = true 
local messageColor = "#FF5555" 
  
function afkKill() 
    if(getResourceState ( getResourceFromName("race") ) == "running") then 
        local isFinished = call(getResourceFromName("race"), "isPlayerFinished", source) 
        if(not isFinished and raceState == "Running") then 
            setElementHealth(source, 0) 
        end 
    end 
end 
  
addEvent( "afkSlap", true ) 
addEventHandler( "afkSlap", getRootElement(), afkKill) 
  
function changeRaceState(newStateName) 
    raceState = newStateName 
end 
  
addEvent("onRaceStateChanging", true) 
addEventHandler( "onRaceStateChanging", getRootElement(), changeRaceState) 
  
function clientLoaded() 
    local msgenable  = get( "msgenable" ) 
    local msgcol     = get( "msgcolor" ) 
    if(msgenable) then 
        if(msgenable == "true") then 
            enableMessages = true 
        else 
            enableMessages = false 
        end 
        if(msgcol) then 
            messageColor = msgcol 
        end 
    end 
    local maxtime    = get( "maxafktime" ) 
    local wtime      = get( "warnTime" ) 
    triggerClientEvent ( "onSettingsReady", getRootElement(), maxtime, wtime) 
end 
  
addEvent("onClientLoaded", true) 
addEventHandler( "onClientLoaded", getRootElement(), clientLoaded) 
  

Se ci dovessero essere ottimizazzioni, saranno ben accettate.

La resource sarà poi disponibile nella community

Link to comment

Non mi è chiaro cosa intendi o vuoi fare.

Cmq puoi usare questo evento per lanciare funzioni quando una mappa parte.

  
addEvent("onMapStarting",true) 
addEventHandler("onMapStarting",getRootElement(), 
function () 
-- qui la funzione che dici 
   triggerClientEvent  -- usa il trigger per il client  
end -- in caso di if o else è ovvio che devi aggiungere altri end,dipende dalal funzione 
) 
  

Se non ti è di aiuto spiega cosa intendi fare.

Link to comment

è già qualche cosa, ma non so se la mappa è finita o sbaglio?

Altrimenti chiamo la funzione dal server e faccio prima!

Una seconda domanda, vorrei aggiungere un evento alla resource race.

Nello specifico riguardo alla gostmode, sai in che file devo buttare l'occhio?

Link to comment

Il ghost mode usa sempre lo stesso evento che ti ho detto.

Puoi editare questo se vuoi.

Server Side :

  
local isMapDM 
local isMapRace 
function gmActive( gmactv ) 
    if gmactv==1 then 
        for k,v in ipairs(getElementsByType("player")) do 
            setElementData( v, "overrideCollide.uniqueblah", 0, false ) 
            outputChatBox("Ghostmode Enabled",v,255,255,0,true) 
            set("*ghostmode",true) 
        end 
    else 
        for k,v in ipairs(getElementsByType("player")) do 
            setElementData( v, "overrideCollide.uniqueblah", nil, false ) 
            set("*ghostmode",false) 
            outputChatBox("Ghostmode Disabled",v,255,0,0,true) 
        end 
    end 
end 
  
function onMapStarting(mapInfo, mapOptions, gameOptions) 
    local isRace = 0 
    local isDM = 0 
    if #getElementsByType("checkpoint")>=1 then 
        isRace=1 
        isMapDM=0 
        isMapRace=1 
    end 
     
    if isRace==1 then 
        gmActive(1) 
    else 
        for a,c in ipairs(getElementsByType("racepickup")) do 
            if getElementData(c,"type")=="vehiclechange" then 
                if tonumber(getElementData(c,"vehicle")) == 425 then 
                    isDM=1 
                    isMapDM=1 
                    isMapRace=0 
                end 
            end 
        end 
         
        if isDM==1 then 
            gmActive(1) 
        else 
            gmActive(0) 
        end 
    end 
end 
addEvent("onMapStarting",true) 
addEventHandler("onMapStarting",getRootElement(),onMapStarting) 
  
  

Link to comment
in realtà vorrei rilevare se la gost mod è attiva o no :P

Per questo ti ho detto che puoi editarlo :D

Basta mettere due trigger client sotto gli output chat e fare un client side con i relativi eventi.

Sia testo che immagine ti consiglio le funzioni Dx. Gui elements è lo stesso ma causa piu lag.

Non dimenticare il render per le dx,se vuoi un esempio te lo faccio ma credo sia abbastanza easy.

Link to comment
  • 2 weeks later...

Piccolo up?

Le funzioni che chiedo sono queste:

Chiamare un evento lato client se una persona entra in afk.

Killare la persona se è in afk o se entra in afk (solo se la gara è iniziata e se è all' interno di un veicolo)

Il tempo si conda durate i periodi della gara e non nel tempo di attesa della nuova mappa/morto/gara finita

Se premo un tasto il tempo di afk si azzera (il mio problema è questo) e viene chiamato un secondo evento lato client.

Tutto questo deve essere fatto lato server...

Purtroppo sembra che non posso usare la funzione già implementata da mta quindi devo crearne una io (perchè non si può azzerare)

Chi miaiuta quindi a crearne una?

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