Modification de GArmory

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

MrPikou

Geek suprême
Messages
165
Score réaction
30
Points
130
Salut tout le Monde !
Je suis en train de m'amuser à modifier l'addon GArmory de @NOX3R et je suis resté bloqué sur un problème :

En fait j'aimerais que l'armurerie ne soit pas ce qu'elle est actuellement, j'aimerais que seul le vendeur d'armes y ait accès et qu'il puisse commander des armes avec ( au lieu du F4 Menu ), jusque là tout se passe bien jusqu'à ce que j'essaye de faire en sorte que les armes ne spawnent pas dans les mains du vendeur ( que ça lui donne l'arme directement ) mais qu'elles tombent par terre ( dans un shipement si possible ) devant la boîte.

Alors voilà où je suis bloqué...

Partie du code que j'ai essayée de modifier ( ligne 24 à 28 ) :
Code:
util.AddNetworkString("GArmory::Buy")
net.Receive("GArmory::Buy", function(len, ply) local selection = net.ReadString() WeaponID = tonumber(selection) for _, ent in pairs(ents.FindByClass("npc_armory")) do if ply:GetPos():Distance(ent:GetPos()) <= 500 then if(GArmory.Weapons[WeaponID].VIP == true) then if table.HasValue(GArmory.VIP, ply:GetUserGroup()) then if GArmory.Weapons[WeaponID].Price <= ply:getDarkRPVar("money") then ply:Give(GArmory.Weapons[WeaponID].Weapon) ply:addMoney(-GArmory.Weapons[WeaponID].Price) DarkRP.notify(ply, 0, 7, GLang[GArmory.Language].Buyed..GArmory.Weapons[WeaponID].Name) else DarkRP.notify(ply, 0, 7, GLang[GArmory.Language].NotEnoughMoney) end else DarkRP.notify(ply, 0, 7, GLang[GArmory.Language].NotVIP) end else if GArmory.Weapons[WeaponID].Price <= ply:getDarkRPVar("money") then local item = ents.Create(GArmory.Weapons[WeaponID].Weapon) item:SetPos( ply:GetPos()+ Vector(8,50,8)) item:SetModel(GArmory.Weapons[WeaponID].Weapon) item:Spawn() ply:addMoney(-GArmory.Weapons[WeaponID].Price) DarkRP.notify(ply, 0, 7, GLang[GArmory.Language].Buyed..GArmory.Weapons[WeaponID].Name) else DarkRP.notify(ply, 0, 7, GLang[GArmory.Language].NotEnoughMoney) end end end end
end)
Merci à tous d'avoir lu et peut-être de m'avoir aidé ;) !
 
thepsyca

thepsyca

Psychopathe
Messages
2 164
Score réaction
648
Points
365
https://github.com/FPtje/DarkRP/blob/master/gamemode/modules/base/sv_purchasing.lua#L170

https://wiki.garrysmod.com/page/Tables:_Bad_Habits
 
  • J'aime
Réactions: NoaGamingFR
  • Initiateur de la discussion
MrPikou

MrPikou

Geek suprême
Messages
165
Score réaction
30
Points
130
Whow ! Déjà merci de ta réponse ;) ! Mais euuh comme je suis un très très gros débutant je ne comprends rien du tout à ce que tu m'as envoyé ( enfin je vois l'utilité, il doit y avoir une erreur dans mon code etc... ), tu pourrais détailler un piti peu plus ( si ça te dérange pas bien sur :) ) ?
 
  • J'aime
Réactions: NoaGamingFR
thepsyca

thepsyca

Psychopathe
Messages
2 164
Score réaction
648
Points
365
MrPikou à dit:
Whow ! Déjà merci de ta réponse ;) ! Mais euuh comme je suis un très très gros débutant je ne comprends rien du tout à ce que tu m'as envoyé ( enfin je vois l'utilité, il doit y avoir une erreur dans mon code etc... ), tu pourrais détailler un piti peu plus ( si ça te dérange pas bien sur :) ) ?

Alors : table.HasValue va loop toute la table jusqu'au moment où elle va trouver une concordance avec la valeur recherchée, alors que l'autre méthode permet de directement voir s'il existe dans la table la valeur recherchée c'est niveau opti.

Ensuite : for _, ent in pairs(ents.FindByClass("npc_armory")) do va aussi loop toutes les entitées npc_armory donc niveau opti c'est pas fameux, à ta place j'utiliserais 1 et 2 .

Tu utilises aussi : local selection = net.ReadString() pour envoyer / lire un nombre positif tu ferais mieux d'utiliser 1 et 2 .

Tu devrais aussi rendre ton code plus lisible.

Tu peux réduire : if(GArmory.Weapons[WeaponID].VIP == true) then à if GArmory.Weapons[WeaponID].VIP then
Car ce sont des valeurs boolean, au passage les parenthèses sont inutiles dans ce cas.
 
Dernière édition:
  • J'aime
Réactions: NoaGamingFR, Lap3che et Akulla
  • Initiateur de la discussion
MrPikou

MrPikou

Geek suprême
Messages
165
Score réaction
30
Points
130
Hey @thepsyca ! Merci encore d'avoir précisé ma question ( je précise juste au cas où que le code que tu me demandes de modifier n'es pas de moi mais je vais quand même mettre en pratique tes conseils dessus ;) ) ! Mais ducoup je suis toujours bloqué avec mon problème d'arme qui est directement donné à l'acheteur plutot que de spawn juste devant... Une idée ?
 
M

Membre supprimé 70413

Anonyme
thepsyca à dit:
Ensuite : for _, ent in pairs(ents.FindByClass("npc_armory")) do va aussi loop toutes les entitées npc_armory donc niveau opti c'est pas fameux, à ta place j'utiliserais 1 et 2 .
https://wiki.garrysmod.com/page/ents/FindByClass



Ce ne sont pas seulement les entités avec cette classe qui vont être cherchées par le code malgré que ce soit celles retournées par cette boucle.
 
  • J'aime
Réactions: thepsyca
thepsyca

thepsyca

Psychopathe
Messages
2 164
Score réaction
648
Points
365
MrPikou à dit:
Hey @thepsyca ! Merci encore d'avoir précisé ma question ( je précise juste au cas où que le code que tu me demandes de modifier n'es pas de moi mais je vais quand même mettre en pratique tes conseils dessus ;) ) ! Mais ducoup je suis toujours bloqué avec mon problème d'arme qui est directement donné à l'acheteur plutot que de spawn juste devant... Une idée ?
La seule variable qui permet de give l'arme au lieu de la faire spawn est : GArmory.Weapons[WeaponID].VIP , regarde comment tu as configuré ton addon.

Slawer à dit:
https://wiki.garrysmod.com/page/ents/FindByClass



Ce ne sont pas seulement les entités avec cette classe qui vont être cherchées par le code malgré que ce soit celles retournées par cette boucle.
Je savais pas donc c'est encore moins opti que ce que je pensais, merci de l 'info
 
  • Initiateur de la discussion
MrPikou

MrPikou

Geek suprême
Messages
165
Score réaction
30
Points
130
Okey donc j'ai mis le code de la variable non VIP à celui de la VIP mais ça me donne toujours l'arme en main propres...
 
thepsyca

thepsyca

Psychopathe
Messages
2 164
Score réaction
648
Points
365
MrPikou à dit:
Okey donc j'ai mis le code de la variable non VIP à celui de la VIP mais ça me donne toujours l'arme en main propres...
Déjà tu devrais nettoyer ton code car j'imagine que tu veux que le spawn devant le joueur soit permanent et non pas si X variable est sur vrai ou faux
 
  • J'aime
Réactions: MrPikou
  • Initiateur de la discussion
MrPikou

MrPikou

Geek suprême
Messages
165
Score réaction
30
Points
130
EDIT : Je fais ça
 
  • Initiateur de la discussion
MrPikou

MrPikou

Geek suprême
Messages
165
Score réaction
30
Points
130
Heyy ! Donc j'ai réussi globalement ce que je voulais faire ( pas totalement, vous comprendrez après ) :

J'ai fais en sorte que les armes spawnent à un endroit précis ( comme me l'avait dis @thepsyca, merci d'ailleurs ;) ) grâce à une position fixe et non relative en fonction de la position du joueur (
Code:
item:SetPos( Vector(-626, 1081, 500))
Mais j'ai un autre problème, dès que je touche l'arme ( sans faire e ) elle vient automatiquement dans mes SWEPs, serait il possible, soit de faire spawn une arme que l'on peut seulement attraper avec "e" soit de faire spawn un shipement ( boite avec l'arme dedans ) ?
 
thepsyca

thepsyca

Psychopathe
Messages
2 164
Score réaction
648
Points
365
MrPikou à dit:
Heyy ! Donc j'ai réussi globalement ce que je voulais faire ( pas totalement, vous comprendrez après ) :

J'ai fais en sorte que les armes spawnent à un endroit précis ( comme me l'avait dis @thepsyca, merci d'ailleurs ;) ) grâce à une position fixe et non relative en fonction de la position du joueur (
Code:
item:SetPos( Vector(-626, 1081, 500))
Mais j'ai un autre problème, dès que je touche l'arme ( sans faire e ) elle vient automatiquement dans mes SWEPs, serait il possible, soit de faire spawn une arme que l'on peut seulement attraper avec "e" soit de faire spawn un shipement ( boite avec l'arme dedans ) ?
T'as le choix entre voir si tu peux faire pareil que DarkRP : https://github.com/FPtje/DarkRP/blob/master/gamemode/modules/base/sv_purchasing.lua#L170

Ou alors tu t'inspires de la même méthode mais tu crées ta propre entitée "caisse"
 
  • Initiateur de la discussion
MrPikou

MrPikou

Geek suprême
Messages
165
Score réaction
30
Points
130
Je vois... Mais je n'ai aucune idée de la façon dont je dois procéder pour créer une entitée ( la caisse ) qui puisse changer de contenu selon l'arme commandée, sinon tu saurais comment faire pour faire comme avec le DarkRP ? Je cherche depuis tout à l'heure et je suis tombé sur un code comme ça :
Code:
function ulx.spawnshipment(calling_ply, item_name, item_amount) ULib.tsay(calling_ply,"Looking for a Shipment named: "..item_name) local found, foundKey = DarkRP.getShipmentByName(item_name) if ( isnumber( foundKey ) ) then ULib.tsay(calling_ply, "Found a Shipment named: " ..item_name.. "! Creating Shipment...") local trace = {} trace.start = calling_ply:EyePos() trace.endpos = trace.start + calling_ply:GetAimVector() * 85 trace.filter = calling_ply local crate = ents.Create(found.shipmentClass or "spawned_shipment") crate.SID = calling_ply.SID crate:Setowning_ent(calling_ply) crate:SetContents(foundKey,item_amount) crate:SetPos(util.TraceLine(trace).HitPos) crate.nodupe = true crate.ammoadd = found.spareammo crate.clip1 = found.clip1 crate.clip2 = found.clip2 crate:Spawn() crate:SetPlayer(calling_ply) local phys = crate:GetPhysicsObject() phys:Wake() if found.weight then phys:SetMass(found.weight) end ULib.tsay(calling_ply,"Shipment Created!") ulx.fancyLogAdmin( calling_ply, "#A spawned shipment #s with an amount of #s.", item_name, item_amount ) else ULib.tsay(calling_ply, "Unable to find Shipment named: " ..item_name.. "!") end
end
Mais je n'arrive pas à l'utiliser dans mon code à moi...
 
thepsyca

thepsyca

Psychopathe
Messages
2 164
Score réaction
648
Points
365
MrPikou à dit:
Je vois... Mais je n'ai aucune idée de la façon dont je dois procéder pour créer une entitée ( la caisse ) qui puisse changer de contenu selon l'arme commandée, sinon tu saurais comment faire pour faire comme avec le DarkRP ? Je cherche depuis tout à l'heure et je suis tombé sur un code comme ça :
Code:
function ulx.spawnshipment(calling_ply, item_name, item_amount) ULib.tsay(calling_ply,"Looking for a Shipment named: "..item_name) local found, foundKey = DarkRP.getShipmentByName(item_name) if ( isnumber( foundKey ) ) then ULib.tsay(calling_ply, "Found a Shipment named: " ..item_name.. "! Creating Shipment...") local trace = {} trace.start = calling_ply:EyePos() trace.endpos = trace.start + calling_ply:GetAimVector() * 85 trace.filter = calling_ply local crate = ents.Create(found.shipmentClass or "spawned_shipment") crate.SID = calling_ply.SID crate:Setowning_ent(calling_ply) crate:SetContents(foundKey,item_amount) crate:SetPos(util.TraceLine(trace).HitPos) crate.nodupe = true crate.ammoadd = found.spareammo crate.clip1 = found.clip1 crate.clip2 = found.clip2 crate:Spawn() crate:SetPlayer(calling_ply) local phys = crate:GetPhysicsObject() phys:Wake() if found.weight then phys:SetMass(found.weight) end ULib.tsay(calling_ply,"Shipment Created!") ulx.fancyLogAdmin( calling_ply, "#A spawned shipment #s with an amount of #s.", item_name, item_amount ) else ULib.tsay(calling_ply, "Unable to find Shipment named: " ..item_name.. "!") end
end
Mais je n'arrive pas à l'utiliser dans mon code à moi...
Tu l'utilise comme ça : ulx.spawnshipment(calling_ply, item_name, item_amount), le seul soucis avec la méthode DarkRP c'est qu'il faut que ton arme soit déclarée comme shipment.
C'est pour cela que à ta place je ferais ma propre entitée sous forme de caisse
 
  • Initiateur de la discussion
MrPikou

MrPikou

Geek suprême
Messages
165
Score réaction
30
Points
130
Et tu saurais comment faire cette entitée ( si j'en demande trop tu me dis tout de suite ;) ) ?
 
thepsyca

thepsyca

Psychopathe
Messages
2 164
Score réaction
648
Points
365
 
  • Initiateur de la discussion
MrPikou

MrPikou

Geek suprême
Messages
165
Score réaction
30
Points
130
Okep merci ;)
 
Discord d'entraide
Rejoignz-nous sur Discord