attempt to call global 'M_CheckMyLicence' (a nil value)

MSystem

  • Passe par un net mais adieu l'opti

    Votes: 0 0.0%
  • Y'a une meilleure solution

    Votes: 2 40.0%
  • Bonne idée la function globale

    Votes: 1 20.0%
  • Aucune idée

    Votes: 2 40.0%

  • Total des votants
    5
  • Initiateur de la discussion
thepsyca

thepsyca

Psychopathe
Messages
2 164
Score réaction
648
Points
365
Bonjour,

Je me lance aujourd'hui dans un projet mais ça tourne mal :confused:

Ma function ( si dessous ) me sert à check si le joueur a ou non une licence.

Mais Pourquoi une function globale ?
je passe par une function globale car je compte la réutiliser pas mal de fois et je pense que c'est plus opti qu'un net non ?

côté serveur
Code:
function M_CheckMyLicence( ply ) local LocalSteamID64 = ply:SteamID64() if not file.Exists("nlf/msystem/player/" .. LocalSteamID64 .. ".txt", "DATA") then DarkRP.notify(ply, 3, 4, "Tu n'a pas de licence de mineur !") return false else return true end
end
l'utilisation de celle-ci côté client:
Code:
DermaR1Button.DoClick = function(panel, id) surface.PlaySound( nlf.msystem.config.panel.soundonclick ) nameframepopup = DermaR1Button:GetText() if v.action == "txt" then TEXTFRAME = v.text -- DrawPopUpFrame() elseif v.action == "buylicence" then net.Start( "M::BuyLicence" ) net.SendToServer(ply) elseif v.action == "shop" then local openshop = M_CheckMyLicence( pl ) if openshop then end elseif v.action == "exit" then HtmlPanel:Close() if audio then audio:Stop() end end end

Du coup l'erreur en question : " attempt to call global 'M_CheckMyLicence' (a nil value)"
Ai-je mal déclarer à ma function sa variable ?

Merci de votre lecture et peut être futur aide
 
Dernière édition:
  • Initiateur de la discussion
thepsyca

thepsyca

Psychopathe
Messages
2 164
Score réaction
648
Points
365
up :rolleyes:
 
Z3k4

Z3k4

Helpeur Divin
Messages
4 495
Score réaction
1 513
Points
580
Si tu veux utiliser une fonction global, fait plutôt dans le genre :

PLAYER = FindMetaTable("Player")

function PLAYER:CheckHisLicence()
(Le steamid sera égale à self:SteamID())
Et aussi, ne passe pas par la lecture d'un fichier, utilise les sql.Query
end
 
  • J'aime
Réactions: thepsyca
  • Banni
SIGEMT

SIGEMT

Geek suprême
Messages
591
Score réaction
523
Points
180
fonction locale stp @Z3k4


En suite il peut faire de l'orienté argument plutôt que de l'orienté objet (oui c'est nouveau, ça vient de sortir), ca marche aussi.


Y'a une erreur car le code est du coté du serveur et non du coté du client utilise la lib net pour check si la fonction return true sur le serv
 
  • J'aime
Réactions: thepsyca
Z3k4

Z3k4

Helpeur Divin
Messages
4 495
Score réaction
1 513
Points
580
SIGEMT à dit:
fonction locale stp @Z3k4


En suite il peut faire de l'orienté argument plutôt que de l'orienté objet (oui c'est nouveau, ça vient de sortir), ca marche aussi.


Y'a une erreur car le code est du coté du serveur et non du coté du client utilise la lib net pour check si la fonction return true sur le serv
Orienté argument ?
 
  • Initiateur de la discussion
thepsyca

thepsyca

Psychopathe
Messages
2 164
Score réaction
648
Points
365
Z3k4 à dit:
Si tu veux utiliser une fonction global, fait plutôt dans le genre :

local PLAYER = FindMetaTable("Player")

function PLAYER:CheckHisLicence()
(Le steamid sera égale à self:SteamID())
Et aussi, ne passe pas par la lecture d'un fichier, utilise les sql.Query
end
Merci bien de ton aide, pour le sql je m'en occuperais mais pas tout de suite.
J'ai toujours une erreur : "attempt to index upvalue 'pl' (a nil value)"

Code:
PLAYER = FindMetaTable("Player")
function PLAYER:CheckHisLicence() local LocalSteamID64 = self:SteamID64() if not file.Exists("nlf/msystem/player/" .. LocalSteamID64 .. ".txt", "DATA") then DarkRP.notify(self, 3, 4, "Tu n'a pas de licence de mineur !") return false else return true end
end
Code:
 DermaR1Button.DoClick = function(panel, id) surface.PlaySound( nlf.msystem.config.panel.soundonclick ) nameframepopup = DermaR1Button:GetText() if v.action == "txt" then TEXTFRAME = v.text -- DrawPopUpFrame() elseif v.action == "buylicence" then net.Start( "M::BuyLicence" ) net.SendToServer(pl) elseif v.action == "shop" then pl:CheckHisLicence() elseif v.action == "exit" then HtmlPanel:Close() if audio then audio:Stop() end end end

SIGEMT à dit:
fonction locale stp @Z3k4


En suite il peut faire de l'orienté argument plutôt que de l'orienté objet (oui c'est nouveau, ça vient de sortir), ca marche aussi.
Merci de ton aide, mais sans te mentir j'ai rien compris ^^
 
Z3k4

Z3k4

Helpeur Divin
Messages
4 495
Score réaction
1 513
Points
580
thepsyca à dit:
Merci bien de ton aide, pour le sql je m'en occuperais mais pas tout de suite.
J'ai toujours une erreur : "attempt to index upvalue 'pl' (a nil value)"

Code:
PLAYER = FindMetaTable("Player")
function PLAYER:CheckHisLicence() local LocalSteamID64 = self:SteamID64() if not file.Exists("nlf/msystem/player/" .. LocalSteamID64 .. ".txt", "DATA") then DarkRP.notify(self, 3, 4, "Tu n'a pas de licence de mineur !") return false else return true end
end
Code:
 DermaR1Button.DoClick = function(panel, id) surface.PlaySound( nlf.msystem.config.panel.soundonclick ) nameframepopup = DermaR1Button:GetText() if v.action == "txt" then TEXTFRAME = v.text -- DrawPopUpFrame() elseif v.action == "buylicence" then net.Start( "M::BuyLicence" ) net.SendToServer(pl) elseif v.action == "shop" then pl:CheckHisLicence() elseif v.action == "exit" then HtmlPanel:Close() if audio then audio:Stop() end end end



Merci de ton aide, mais sans te mentir j'ai rien compris ^^
En gros :
Ta fonction est déclaré côté serveur, par conséquent elle est inexistante côté client, si tu veux pouvoir l'utiliser tu dois mettre des net pour communiquer entre le joueur et le serveur
Ensuite, quand tu utilises le net.SendToServer() ça prend pas d'arguments
Puis, je vois pas le reste de ton code, mais ton pl n'est pas déclaré, ne sachant pas à quoi il correspond je peux pas t'aider pour le moment
 
  • J'aime
Réactions: thepsyca
  • Initiateur de la discussion
thepsyca

thepsyca

Psychopathe
Messages
2 164
Score réaction
648
Points
365
Z3k4 à dit:
En gros :
Ta fonction est déclaré côté serveur, par conséquent elle est inexistante côté client, si tu veux pouvoir l'utiliser tu dois mettre des net pour communiquer entre le joueur et le serveur
Ensuite, quand tu utilises le net.SendToServer() ça prend pas d'arguments
Puis, je vois pas le reste de ton code, mais ton pl n'est pas déclaré, ne sachant pas à quoi il correspond je peux pas t'aider pour le moment
Ou alors je passe ma fonction en "partagé" ?

Yes merci effectivement

Il est déclaré par un net.Receive( len, pl) venant d'un use sur entitié
 
Feytone

Feytone

Chuck Norris
Messages
4 741
Score réaction
1 301
Points
600
Tu peux pas exprimer la fonction en serverside pour utiliser en clientside. Car elle s'exécute côté client sinon (je viens de l'apprendre y'a quelques jours, donc je te retransmets ça !).

Donc tu peux rendre ta fonction locale, puis tu utiliseras un net dans ta fonction pour demander directement ta fonction. Et tu devras retransmettre (j'ai pas trouvé mieux pour l'instant perso) un net en réponse pour envoyer le boolean.

EDIT après lecture : pas de shared car tu read un fichier et read ça se fait que côté serveur.
 
  • J'aime
Réactions: thepsyca
  • Banni
SIGEMT

SIGEMT

Geek suprême
Messages
591
Score réaction
523
Points
180
Z3k4 à dit:
Orienté argument ?

Oui, c'est nouveau , ca vient de sortir

thepsyca à dit:
Ou alors je passe ma fonction en "partagé" ?

Yes merci effectivement

Il est déclaré par un net.Receive( len, pl) venant d'un use sur entitié
Bein non, c'est pas comme ca que ca marche, l'intérieur de la fonction peut pas etre run sur le client si y'a une requête SQL dedans
 
  • J'aime
Réactions: thepsyca
  • Initiateur de la discussion
thepsyca

thepsyca

Psychopathe
Messages
2 164
Score réaction
648
Points
365
Ma solution utilisé pour de futur utilisateur en détresse :
Code:
 DermaR1Button.DoClick = function(panel, id) surface.PlaySound( nlf.msystem.config.panel.soundonclick ) nameframepopup = DermaR1Button:GetText() if v.action == "txt" then TEXTFRAME = v.text -- DrawPopUpFrame() elseif v.action == "buylicence" then net.Start( "M::BuyLicence" ) net.SendToServer() elseif v.action == "shop" then net.Start( "M::CheckLicence" ) net.WriteString( "shop" ) net.SendToServer() net.Receive("M::HaveLicence", function(len, pl) if "shop" == net.ReadString() then M_Dermashop() print( "Yes" ) end end) elseif v.action == "exit" then HtmlPanel:Close() if audio then audio:Stop() end end end
Code:
net.Receive("M::CheckLicence", function(len, pl) local LocalSteamID64 = pl:SteamID64() local Where = net.ReadString() if not file.Exists("nlf/msystem/player/" .. LocalSteamID64 .. ".txt", "DATA") then DarkRP.notify(pl, 1, 4, "Tu n'a pas de licence de mineur !") else net.Start( "M::HaveLicence" ) net.WriteString( Where ) net.Send(pl) end
end)
 
  • Banni
SIGEMT

SIGEMT

Geek suprême
Messages
591
Score réaction
523
Points
180
Tu peux meme faire les deux avec un seul net message, car le net.Receive
M::CheckLicence n'est pas utilisé coté client.

Par contre c'est un peu dégeu de créer ton Receive à chaque clic
 
  • Initiateur de la discussion
thepsyca

thepsyca

Psychopathe
Messages
2 164
Score réaction
648
Points
365
SIGEMT à dit:
Tu peux meme faire les deux avec un seul net message, car le net.Receive
M::CheckLicence n'est pas utilisé coté client.
Comment ça ?
SIGEMT à dit:
Par contre c'est un peu dégeu de créer ton Receive à chaque clic
Oh je pensais que sa avait aucune influence tant que le net.start n’était pas présent, je le changerai de place
 
Feytone

Feytone

Chuck Norris
Messages
4 741
Score réaction
1 301
Points
600
Par contre, vraiment, faut passer sur du sql pour les valeurs de ce genre. On est vraiment sur des valeurs faîtes pour rentrer dans un tableur !
 
Discord d'entraide
Rejoignz-nous sur Discord