Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
Bienvenue Guest!

Rejoignez la communauté pour avoir accès à l'entièreté du site! Une fois que vous serez enregistré, vous pourrez créer, aider, partager et discuter avec les membres de la communauté et également participer à l'amélioration du site. Alors, qu'attendez vous ? Enregistrez-vous !

  • 0
Tony Stark

non résolu Récupérer l'info si un joueur est actif dans le métier

Question

Tony Stark

Quelle OS utilisez vous sur votre machine ? : Linux sur VPS, Windows en local

Sur quel framework travaillez vous? (ESX/VRP/ES/Autre) : ESX

Êtes vous sûr d'avoir la dernière version de votre framework ? : Oui

Explication de votre problème :

 

Oui encore moi 🤗, faut bien comprendre, pour apprendre :)

 

En fait, j'essaye de récupérer l'info si un joueur est en service dans un métier, pour pouvoir lancer un event si aucun joueur n'est en service à ce moment là, et inversement.

Je suis parti là dessus

 

ESX.TriggerServerCallback('esx_service:isInService', function(isInService)

	if isInService then
		TriggerClientEvent (...)
	else
		TriggerClientEvent (...)
	end
end, 'LeMetierConcerné')

 

 

J'ai une erreur 

 

Citation

Error running call reference function for resource esx_service: citizen:/scripting/lua/scheduler.lua:403: @esx_service/server/main.lua:52: attempt to index a nil value (field '?')

 

La ligne 52 est celle-ci : if InService[name][source] then

ESX.RegisterServerCallback('esx_service:isInService', function(source, cb, name)
	local isInService = false

	if InService[name][source] then
		isInService = true
	end

	cb(isInService)
end)

Je pense que le problème vient du fait que mon callback est lancé depuis le server, et pas depuis le client, vous confirmez ?

 

Merci d'avance à celui qui pourra m'expliquer, j'espère avoir été clair, mais je ne suis pas sûr :)

Share this post


Link to post
Share on other sites

17 answers to this question

Recommended Posts

  • 0
JagerBom

ce que tu veux faire est deja ici:

https://github.com/ESX-Org/esx_service/blob/5d8b12a415a7da4b82c2003ae37f8ea59fa1626e/server/main.lua#L59

 

tu dois plus que faire un triggerservercallback pour avoir le nombre de joueurs du job que tu vx (si j'ai bien lu le code)

 

apres tu peux le faire coté client dans le script meme) mais alors ca vaut que pour le script meme, tu met une variable globale

local isinservice = false

 

puis une fois qui prend ces vetements de metier tu met 

isinservice = true

si le mec prend sa tenue normale 

isinservice = false

 

puis tu peux faire dans le script

if IsControllJustPressed(0,38) and isinservice then

print('le mec est en service et il a appuyer sur e')

end

Share this post


Link to post
Share on other sites
  • 0
Tony Stark

Salut Jager, en fait la question est générale, mais dans mon cas présent c'est pour un item dans optionalneeds.

 

Les prises/arrêts de service sont fonctionnel, c'est pas un souci.

 

Dans mondes cas présent, c'est :

 

Exemple :

Si un journaliste est en service, je ne peux pas utiliser l'item, si aucun journaliste n'est en service, alors l'item est utilisable.

 

Share this post


Link to post
Share on other sites
  • 0
Anthony

Dans ce cas là tu fais une fonction qui va récupérer si oui ou non il y a un médecin en service. Si c’est le cas la function te retourne true une simple condition avant l’utilisation de l’item avec cette function et c’est good 

Share this post


Link to post
Share on other sites
  • 0
Tony Stark
Posted (edited)

Merci Anthony, pas con pour la fonction, je passais le callback dans le RegisterUsableItem directement. Je vais tester ça :)

Edited by Tony Stark

Share this post


Link to post
Share on other sites
  • 0
JagerBom

 

rajoute ceci coté server dans esx_service

RegisterServerEvent('esx_service:getInService')
AddEventHandler('esx_service:getInService', function(cb)
    cb(InService)
end)

 

 

 

et ceci du coté server dans le script que tu vx:

TriggerEvent('esx_service:getInService', function(servicelist)
    print(dump(servicelist))
end)



function dump(o, nb)
  if nb == nil then
    nb = 0
  end
   if type(o) == 'table' then
      local s = ''
      for i = 1, nb + 1, 1 do
        s = s .. "    "
      end
      s = '{\n'
      for k,v in pairs(o) do
         if type(k) ~= 'number' then k = '"'..k..'"' end
          for i = 1, nb, 1 do
            s = s .. "    "
          end
         s = s .. '['..k..'] = ' .. dump(v, nb + 1) .. ',\n'
      end
      for i = 1, nb, 1 do
        s = s .. "    "
      end
      return s .. '}'
   else
      return tostring(o)
   end
end

et regarde ce que le print te donne 

Share this post


Link to post
Share on other sites
  • 0
Tony Stark
Posted (edited)

J'ai une erreur 

Citation

 @esx_service/server/main.lua:75: unexpected symbol near '<\239>'

 

Merci Jager, mais je ne sais pas d'où elle vient, d'habitude ça va, mais là, la fonction dump je comprends rien pour le moment 🤔

Edited by Tony Stark

Share this post


Link to post
Share on other sites
  • 0
JagerBom
il y a 26 minutes, Tony Stark a dit :

J'ai une erreur 

 

Merci Jager, mais je ne sais pas d'où elle vient, d'habitude ça va, mais là, la fonction dump je comprends rien pour le moment 🤔

 

et c'est quoi ton erreur ?

 

un dump te print ta table

Share this post


Link to post
Share on other sites
  • 0
Tony Stark

Oui, non, c'est moi qui m'était trompé de fichier, je m'endormais devant le pc...

 

ça me print :

 

}
{

En êtant ou non en service 🤔

Share this post


Link to post
Share on other sites
  • 0
Kanda Sorata

Alors, tout est déjà fait si on peut dire ça comme ça, il faut regarder du côté de policejob par exemple notamment par ici :

https://github.com/ESX-Org/esx_policejob/blob/master/client/main.lua#L145 où tu as un exemple de comment le script gère esx_service

 

Il faut ensuite lorsque tu prends ton service, activer la personne en service avec ceci :

TriggerServerEvent('esx_service:activateService', 'job','99')

-- Job = le nom du métier
-- 99 = le nombre max de personnes en service (ici 99 car on veut pas de limites)

 

et tu peux récupérer la liste des personnes en services grâce à ce callback :

ESX.TriggerServerCallback('esx_service:getInServiceList', function(serviceList)

  print(ESX.DumpTable(serviceList))


end, 'job')

--Le callback renvoi une table avec le nombre de gens en service par rapport à ton job (normalement d'ou le print de la table pour savoir ce qu'il te renvoi à l'intérieur)
-- 'job' = ton job concerné

essai donc avec ça pour voir

Share this post


Link to post
Share on other sites
  • 0
Tony Stark

Toujours pas, ça me rend fou 🤔 J'ai regardé aussi via le esx_scoreboard, vu qu'il récupère aussi si il tel ou tel job en ligne, mais pas moyen non plus. Je pensais pas en chier autant 🤨

Share this post


Link to post
Share on other sites
  • 0
Kanda Sorata

Le print te renvoi quoi exactement ? Tu as essayer de te mettre dans le job et de regarder ensuite le nouveau print ?

Share this post


Link to post
Share on other sites
  • 0
Tony Stark

Coucou, oui je regarde toujours en étant dans le job, et en étant pas dans le job.

Je n'ai pas de résultat pour le print, quand je teste l'item, j'ai

 

Citation

Error running call reference function for resource esx_service: citizen:/scripting/lua/scheduler.lua:403: @esx_service/server/main.lua:64: attempt to call a nil value (local 'cb')

 

Côté client du job :

		elseif data.current.value == 'job_wear' then

            local serviceOk = 'waiting'
            ESX.TriggerServerCallback('esx_service:isInService', function(isInService)
                if not isInService then

                    ESX.TriggerServerCallback('esx_service:enableService', function(canTakeService, maxInService, inServiceCount)
                        if not canTakeService then
                            ESX.ShowNotification(_U('service_max', inServiceCount, maxInService))
                        else

                            serviceOk = true
                            playerInService = true

                			ESX.TriggerServerCallback('esx_skin:getPlayerSkin', function(skin, jobSkin)
                				if skin.sex == 0 then
                					TriggerEvent('skinchanger:loadClothes', skin, jobSkin.skin_male)
                				else
                					TriggerEvent('skinchanger:loadClothes', skin, jobSkin.skin_female)
                				end
                			end)

                            ESX.ShowNotification('En service')
                        end
                    end, 'job')

                else
                    serviceOk = true
                end
            end, 'job')

            while type(serviceOk) == 'string' do
                Citizen.Wait(5)
            end

            -- if we couldn't enter service don't let the player get changed
            if not serviceOk then
                return
            end

		end

Dans mon optionalneeds côté serveur :

ESX.RegisterUsableItem('item', function(source)
    
    ESX.TriggerServerCallback('esx_service:getInServiceList', function(serviceList)

        print(ESX.DumpTable(serviceList))


    end, 'job')

end)

Pour tester la prise de service, j'ai mis des print dans esx_service côté serveur :

 

ESX.RegisterServerCallback('esx_service:isInService', function(source, cb, name)
	local isInService = false
    
	print('esx_service:isInService')
	print(cb)
	print(name)
	print(source)
	print('esx_service:isInService')
    
	if InService[name][source] then
		isInService = true
	end

	cb(isInService)
end)

Un test en étant policier me print les valeurs suivantes :

 

Citation

esx_service:isInService
table: 000002EE376E0670
police
1
esx_service:isInService

 

---------------------------------------------

 

L'erreur 

 

Error running call reference function for resource esx_service: citizen:/scripting/lua/scheduler.lua:403: @esx_service/server/main.lua:64: attempt to call a nil value (local 'cb')

 

Vient de la ligne cb(InService[name]) du 

 

ESX.RegisterServerCallback('esx_service:getInServiceList', function(source, cb, name)
	cb(InService[name])
end)

1 ère remarque, dans le callback de l'item :

 

    ESX.TriggerServerCallback('esx_service:getInServiceList', function(serviceList)

        print(ESX.DumpTable(serviceList))


    end, 'job')

Ne manque t-il pas un argument dans la fonction ? On transmet le cb mais pas le name, où je me trompe ?

 

2 ème remarques, même en ajoutant l'argument du job, ça ne fonctionne pas, 

 

Si je fais un print du cb et du name dans le RegisterServerCallback, ça me print nil pour les 2...

 

 

Voilà où j'en suis pour le moment. Pas mal de code et de citation, j'espère avoir été assez clair quand même :/

 

Share this post


Link to post
Share on other sites
  • 0
Kanda Sorata

Alors, l'argument que tu cherches "name" est justement l'argument "job" à remplacer par ton job, ServiceList est l'argument "cb" que tu vas récupérer, donc ton tableau.

C'est pour cela que tu obtient tes erreurs ;)

(Désolé pour le temps de réponse, je n'ai pas beaucoup de temps le weekend entre le taff et ma maladie ~~)

Share this post


Link to post
Share on other sites
  • 0
Tony Stark

Dommage d'être traité de boulet quand on pose des questions pour apprendre... mais merci pour l'explication :)

 

Il y a 18 heures, Kanda Sorata a dit :

(Désolé pour le temps de réponse, je n'ai pas beaucoup de temps le weekend entre le taff et ma maladie ~~)

 

Pas de souci, on a tous une vie

Share this post


Link to post
Share on other sites
  • 0
Julien
Posted (edited)

 

 

Hello.
Si je me trompe pas, 

 

ESX.TriggerServerCallback ne marche que Coté Client -> Coté Serveur

 

Mais dans ton cas tu l'utilises Coté Serveur -> Coté Serveur
De mon coté, j'ai utilisé ça pour régler le soucis

 

Coté Serveur ESX Service : Ajoutes ces lignes
 

ESX.RegisterServerCallback('esx_service:getInServiceCount', function(source, cb, name)
    local inServiceCount = GetInServiceCount(name)
    cb(inServiceCount)
end)


RegisterServerEvent('esx_service:getInServiceCount')
AddEventHandler('esx_service:getInServiceCount', function(callback, job)
    local inServiceCount = GetInServiceCount(job)
    callback(inServiceCount)
end)

Ce RegisterServerEvent (pour le Coté Serveur -> Coté Serveur ) et le ESX.RegisterServerCallback (Coté Client -> Coté Serveur)
Ça te permets de retourner que le Nombre de personne en service dans un job.

Je te donne deux exemples d'utilisation :

Utilisation d'un item (donc Coté Serveur): 

 

ESX.RegisterUsableItem('item_test', function(source)
    local _source = source
    local job = 'police'
    TriggerEvent('esx_service:getInServiceCount', function(count)
    	if count > 0 then
        	TriggerClientEvent('esx_essai:RobCar', _source)
        else 
            TriggerClientEvent('esx:showNotification', _source, 'Il n\'y a pas assez de policiers en service pour voler un véhicule.')
        end
    end, job)
 end)

 

 

 

Vérification de la présence d'un membre dans un job (Coté Client) :

 

if CurrentAction == 'annonce_journal' then
  if IsControlJustReleased(0, 38) then
    ESX.TriggerServerCallback('esx_service:getInServiceCount', function(count)
      if count < 1 then
     	 PasserAnnonces()
      else
      	ESX.ShowNotification('Il y a des journalistes en ville, contactez les !')
      end
    end, 'reporter')
  end
end

 

En espérant que ça t'aides !

 

Bonne soirée
 

Edited by Julien

Share this post


Link to post
Share on other sites
  • 0
Kanda Sorata

Bonjour, des nouvelles ? @Tony Stark

Share this post


Link to post
Share on other sites
  • 0
Kanda Sorata

Sujet clos pour inactivité.

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.

×
×
  • Create New...

Important Information

En utilisant ce site, vous acceptez les présents règlements Terms of Use, Privacy Policy,Guidelines.