Le chat se fait spammer à cause du chat.AddText

  • Initiateur de la discussion Deadman69330
  • Date de début
  • Initiateur de la discussion
Deadman69330

Deadman69330

Psychopathe
Messages
2 289
Score réaction
309
Points
290
Bonjour,

Je suis en train de créer depuis plusieurs jours déjà un addon de scierie et je voudrais que quand le wagon ne contient pas de bois cela affiche un message dans le chat (ce que j'arrive à faire mais le message est spammer 15 fois à chaque fois que le wagon touche la machine:

Code client:
Code:
include("shared.lua")
function ENT:Draw() self:DrawModel()
end
function ENT:Think() if self:GetNWBool("not_enough_wood") == true then chat.PlaySound() chat.AddText( Color( 100, 100, 255 ),"Il n'y a pas assez de bois dans votre wagonnet ! " ) end
end


Code serveur:
Code:
function ENT:StartTouch(ent) if ent:GetClass() == "deadman_lumber_wagon" and self.isTransforming == false then if ent:GetNWInt("wood_stored") == 0 then print("Pas assez de bois !") self:SetNWBool("not_enough_wood",true) timer.Simple(0.01,function() self:SetNWBool("not_enough_wood", false) end) elseif ent:GetNWInt("wood_stored") > 0 then ent:Remove() self.isTransforming = true self.finishTransformingTime = CurTime() + self.timeTransforming end end
end

Merci de votre aide
 
  • J'aime
Réactions: ViPerZe_
ViPerZe_

ViPerZe_

Geek suprême
Messages
371
Score réaction
88
Points
150
Cc j'ai le même soucis avec un de mes scripts :d
 
ZarosOVH

ZarosOVH

Modérateur
Membre du Staff
Messages
6 527
Score réaction
5 488
Points
1 295
Tout simplement car ton chat.AddText est dans ta function ENT:Think ....

Pour régler le problème tu peux lancer un net qui sera récupérer coté client grâce à ceci et dans ce net coté client tu écris le code pour ton message...

Pour savoir ou inclure ton net.Start, il suffit de regarder ce que tu as fais juste avant dans la function ENT:Think,

Ton code:
Code:
function ENT:Think() if self:GetNWBool("not_enough_wood") == true then chat.PlaySound() chat.AddText( Color( 100, 100, 255 ),"Il n'y a pas assez de bois dans votre wagonnet ! " ) end
end
Donc quand self:GetNWBool("not_enough_wood") est vrai alors ton message ce lance.
Mais le but du Think est tout simplement d'exécuter du code en boucle, ce qui explique le spam du msg ;)

On vas donc trouver un autre endroit ou tu peux placer ton net.Start:

Déjà demande toi si il doit être coté client ou server ?
Ici ton net.Start sera coté server car dans ton net.Receive tu utilises du code client.

Maintenant que on sais que le coté sera coté server, il te reste plus qu'a trouver ou le mettre ;)
Dans ton code tu utilises la condition suivante:
Code:
if self:GetNWBool("not_enough_wood") == true then
Au lieu d'écrire '== true' à la fin de ta condition tu peux tout simplement écrire ceci:
Code:
if self:GetNWBool("not_enough_wood") then
end
pour la condition inverse (si tu veux vérif que ta variable sois égale à false) tu peux tout simplement rajouter un 'not' avant, ce qui donne:
if not self:GetNWBool("not_enough_wood") then
end

Donc le code doit être lancer quand not_enough_wood passe à true
Et magie tu fais justement cela coté server dans ta function ENT:StartTouch:
Code:
self:SetNWBool("not_enough_wood",true)
Actuellement ta function ressemble à ceci:
Code:
function ENT:StartTouch(ent) if ent:GetClass() == "deadman_lumber_wagon" and self.isTransforming == false then if ent:GetNWInt("wood_stored") == 0 then print("Pas assez de bois !") self:SetNWBool("not_enough_wood",true) timer.Simple(0.01,function() self:SetNWBool("not_enough_wood", false) end) elseif ent:GetNWInt("wood_stored") > 0 then ent:Remove() self.isTransforming = true self.finishTransformingTime = CurTime() + self.timeTransforming end end
end
Dans la premier condition on peut déjà retirer '== false' comme je te l'ai expliquer dans le spoiler au dessus ;)
donc la 1er condition sera ceci:
Code:
if ent:GetClass() == "deadman_lumber_wagon" and not self.isTransforming then
Ensuite nous avons une deuxième condition:
Code:
if ent:GetNWInt("wood_stored") == 0 then print("Pas assez de bois !") self:SetNWBool("not_enough_wood",true) timer.Simple(0.01,function() self:SetNWBool("not_enough_wood", false) end) elseif ent:GetNWInt("wood_stored") > 0 then ent:Remove() self.isTransforming = true self.finishTransformingTime = CurTime() + self.timeTransforming end
Le print ici ne sera utile que durant la période de dev, après tu peux le retirer car celui ci est inutile ;)

J'imagine que le timer étais dans le but d'essaye de fix ton problème de spam, nous allons donc le retirer.

Le code ressemble donc actuellement à ceci:
Code:
function ENT:StartTouch(ent) if ent:GetClass() == "deadman_lumber_wagon" and not self.isTransforming then if ent:GetNWInt("wood_stored") == 0 then self:SetNWBool("not_enough_wood",true) elseif ent:GetNWInt("wood_stored") > 0 then ent:Remove() self.isTransforming = true self.finishTransformingTime = CurTime() + self.timeTransforming end end
end
Comme c'est à ce niveau là que tu as set not_enough_wood sur true, c'est à ce niveau la que nous allons écrire notre net.Start.

Comme tu as pu le voir sur le wiki, pour envoyer un net on a besoin d'utilise net.Start("le_nom_du_net") et net.Send(le joueur)

pour le nom du net c'est très simple, il te suffit de trouver un nom unique qui ne risque pas d'être utiliser par un autre addon.
Une fois que tu as ce nom en tête il va falloir le déclarer au server en utilisant util.AddNetworkString

Maintenant, il faut trouver à qui envoyer le net, étant donner que je ne sais pas ce que tu avais prévu de base, je vais prendre comme exemple le owner de l'entité ;)

Je vais donc utiliser CPPI (tu peux trouver la doc ici) donc tu peux trouver l'owner grace à CPPIGetOwner()

on a donc le nom du net et l'entité à qui on va l'envoyer, on peux donc écrire le code suivant:
Code:
net.Start("le_nom_du_net")
net.Send(self:CPPIGetOwner())
En l'ajoutant au code cela donne:

Code:
util.AddNetworkString("le_nom_du_net")
function ENT:StartTouch(ent) if ent:GetClass() == "deadman_lumber_wagon" and not self.isTransforming then if ent:GetNWInt("wood_stored") == 0 then self:SetNWBool("not_enough_wood",true) net.Start("le_nom_du_net") net.Send(self:CPPIGetOwner()) elseif ent:GetNWInt("wood_stored") > 0 then ent:Remove() self.isTransforming = true self.finishTransformingTime = CurTime() + self.timeTransforming end end
end
Maintenant on vas passer coté client pour écrit notre net.Receive

Comme montre le wiki on va devoir écrire quelque chose comme ceci:
Code:
net.Receive("le_nom_du_net", function(len, pl)
end)
Il nous reste plus qu'à écrire le code pour mettre un message dans le chat du joueur:

Code:
net.Receive("le_nom_du_net", function(len, pl) chat.AddText( Color( 100, 100, 255 ),"Il n'y a pas assez de bois dans votre wagonnet ! " )
end)
Tu peux donc supprimer la function ENT:Think que tu as mit coté client ;)

J'espère n'avoir rien oublier, si besoin dit moi ;)
 
  • J'aime
Réactions: Deadman69330, ViPerZe_ et thepsyca
  • Initiateur de la discussion
Deadman69330

Deadman69330

Psychopathe
Messages
2 289
Score réaction
309
Points
290
Zaros_Live à dit:
Tout simplement car ton chat.AddText est dans ta function ENT:Think ....

Pour régler le problème tu peux lancer un net qui sera récupérer coté client grâce à ceci et dans ce net coté client tu écris le code pour ton message...

Pour savoir ou inclure ton net.Start, il suffit de regarder ce que tu as fais juste avant dans la function ENT:Think,

Ton code:
Code:
function ENT:Think() if self:GetNWBool("not_enough_wood") == true then chat.PlaySound() chat.AddText( Color( 100, 100, 255 ),"Il n'y a pas assez de bois dans votre wagonnet ! " ) end
end
Donc quand self:GetNWBool("not_enough_wood") est vrai alors ton message ce lance.
Mais le but du Think est tout simplement d'exécuter du code en boucle, ce qui explique le spam du msg ;)

On vas donc trouver un autre endroit ou tu peux placer ton net.Start:

Déjà demande toi si il doit être coté client ou server ?
Ici ton net.Start sera coté server car dans ton net.Receive tu utilises du code client.

Maintenant que on sais que le coté sera coté server, il te reste plus qu'a trouver ou le mettre ;)
Dans ton code tu utilises la condition suivante:
Code:
if self:GetNWBool("not_enough_wood") == true then
Au lieu d'écrire '== true' à la fin de ta condition tu peux tout simplement écrire ceci:
Code:
if self:GetNWBool("not_enough_wood") then
end
pour la condition inverse (si tu veux vérif que ta variable sois égale à false) tu peux tout simplement rajouter un 'not' avant, ce qui donne:
if not self:GetNWBool("not_enough_wood") then
end

Donc le code doit être lancer quand not_enough_wood passe à true
Et magie tu fais justement cela coté server dans ta function ENT:StartTouch:
Code:
self:SetNWBool("not_enough_wood",true)
Actuellement ta function ressemble à ceci:
Code:
function ENT:StartTouch(ent) if ent:GetClass() == "deadman_lumber_wagon" and self.isTransforming == false then if ent:GetNWInt("wood_stored") == 0 then print("Pas assez de bois !") self:SetNWBool("not_enough_wood",true) timer.Simple(0.01,function() self:SetNWBool("not_enough_wood", false) end) elseif ent:GetNWInt("wood_stored") > 0 then ent:Remove() self.isTransforming = true self.finishTransformingTime = CurTime() + self.timeTransforming end end
end
Dans la premier condition on peut déjà retirer '== false' comme je te l'ai expliquer dans le spoiler au dessus ;)
donc la 1er condition sera ceci:
Code:
if ent:GetClass() == "deadman_lumber_wagon" and not self.isTransforming then
Ensuite nous avons une deuxième condition:
Code:
if ent:GetNWInt("wood_stored") == 0 then print("Pas assez de bois !") self:SetNWBool("not_enough_wood",true) timer.Simple(0.01,function() self:SetNWBool("not_enough_wood", false) end) elseif ent:GetNWInt("wood_stored") > 0 then ent:Remove() self.isTransforming = true self.finishTransformingTime = CurTime() + self.timeTransforming end
Le print ici ne sera utile que durant la période de dev, après tu peux le retirer car celui ci est inutile ;)

J'imagine que le timer étais dans le but d'essaye de fix ton problème de spam, nous allons donc le retirer.

Le code ressemble donc actuellement à ceci:
Code:
function ENT:StartTouch(ent) if ent:GetClass() == "deadman_lumber_wagon" and not self.isTransforming then if ent:GetNWInt("wood_stored") == 0 then self:SetNWBool("not_enough_wood",true) elseif ent:GetNWInt("wood_stored") > 0 then ent:Remove() self.isTransforming = true self.finishTransformingTime = CurTime() + self.timeTransforming end end
end
Comme c'est à ce niveau là que tu as set not_enough_wood sur true, c'est à ce niveau la que nous allons écrire notre net.Start.

Comme tu as pu le voir sur le wiki, pour envoyer un net on a besoin d'utilise net.Start("le_nom_du_net") et net.Send(le joueur)

pour le nom du net c'est très simple, il te suffit de trouver un nom unique qui ne risque pas d'être utiliser par un autre addon.
Une fois que tu as ce nom en tête il va falloir le déclarer au server en utilisant util.AddNetworkString

Maintenant, il faut trouver à qui envoyer le net, étant donner que je ne sais pas ce que tu avais prévu de base, je vais prendre comme exemple le owner de l'entité ;)

Je vais donc utiliser CPPI (tu peux trouver la doc ici) donc tu peux trouver l'owner grace à CPPIGetOwner()

on a donc le nom du net et l'entité à qui on va l'envoyer, on peux donc écrire le code suivant:
Code:
net.Start("le_nom_du_net")
net.Send(self:CPPIGetOwner())
En l'ajoutant au code cela donne:

Code:
util.AddNetworkString("le_nom_du_net")
function ENT:StartTouch(ent) if ent:GetClass() == "deadman_lumber_wagon" and not self.isTransforming then if ent:GetNWInt("wood_stored") == 0 then self:SetNWBool("not_enough_wood",true) net.Start("le_nom_du_net") net.Send(self:CPPIGetOwner()) elseif ent:GetNWInt("wood_stored") > 0 then ent:Remove() self.isTransforming = true self.finishTransformingTime = CurTime() + self.timeTransforming end end
end
Maintenant on vas passer coté client pour écrit notre net.Receive

Comme montre le wiki on va devoir écrire quelque chose comme ceci:
Code:
net.Receive("le_nom_du_net", function(len, pl)
end)
Il nous reste plus qu'à écrire le code pour mettre un message dans le chat du joueur:

Code:
net.Receive("le_nom_du_net", function(len, pl) chat.AddText( Color( 100, 100, 255 ),"Il n'y a pas assez de bois dans votre wagonnet ! " )
end)
Tu peux donc supprimer la function ENT:Think que tu as mit coté client ;)

J'espère n'avoir rien oublier, si besoin dit moi ;)
Tout d'abbord, merci beaucoup pour cette réponse qui est sûrement une des mieux développée du forum,
Je n'aurais qu'une seule question c'est là:
Code:
net.Start("le_nom_du_net")
net.Send(self:CPPIGetOwner())
Comment je peux envoyer ça par exemple au joueur le plus proche de la machine (ou si possible celui qui essaye de l'utiliser) ?

Et merci encore :)


PS: Je viens de tester ça marche niquel merci beaucoup :)
 
ZarosOVH

ZarosOVH

Modérateur
Membre du Staff
Messages
6 527
Score réaction
5 488
Points
1 295
Deadman69330 à dit:
Tout d'abbord, merci beaucoup pour cette réponse qui est sûrement une des mieux développée du forum,
Je n'aurais qu'une seule question c'est là:
Code:
net.Start("le_nom_du_net")
net.Send(self:CPPIGetOwner())
Comment je peux envoyer ça par exemple au joueur le plus proche de la machine (ou si possible celui qui essaye de l'utiliser) ?

Et merci encore :)


PS: Je viens de tester ça marche niquel merci beaucoup :)
Tu as deux hook qui permet de gérer quand un joueur prend une entité au physgun ou quand il l'a relache (http://wiki.garrysmod.com/page/GM/PhysgunPickup, http://wiki.garrysmod.com/page/GM/PhysgunDrop)

Je te laisse chercher un peu en te basant sur le wiki ;)
 
  • J'aime
Réactions: Deadman69330
Discord d'entraide
Rejoignz-nous sur Discord