• 06 Mai 2024, 05:19:44


Auteur Sujet: Arme sur les véhicules  (Lu 4764 fois)

0 Membres et 1 Invité sur ce sujet

Hors ligne MK

  • *
  • Gangster
  • Messages: 1844
    • Voir le profil
Arme sur les véhicules
« le: 19 Décembre 2010, 19:28:19 »
Salut,
Ce script est prévu pour le gameMode "race", il est destiné a fixer une arme utilisable sur le véhicule d'un joueur. (le joueur doit acheter cette fonctionnalité dans un shop)
Le script serait de type serveur.

J'ai déjà essayé plusieurs tentative mais en voila les conséquence:
-L'objet (l'arme) apparait au dessus du véhicule mais ne se fixe pas et est inutilisable.
-L'arme est fixé (sur le joueur et non sur le véhicules) mais on ne peut utiliser l'arme.

Je me suis aidé sur le wiki MTA mais je ne trouve aucune solution. J'ai vraiment essayé, mais je n'y arrive pas.
Aidez moi ;) merci.

Hors ligne Citizen

  • Scripteur LUA confirmé
  • *
  • Messages: 235
    • Voir le profil
    • Byston Evolution
Re : Arme sur les véhicules
« Réponse #1 le: 19 Décembre 2010, 20:49:57 »
Salut MK,
Les armes que tu veux fixer sur le véhicule, ce sont les même armes que celui du "solo" ( exemple AK-47, MP5 ... )
ou alors un objet de type lance missile qu'on peut trouver dans la base secrète dans le desert de LV ?

Dans le premier cas, je te conseil d'attacher ( attachElements ) un ped invisible et de lui donner une arme le problème c'est que l'arme sera invisible aussi puisqu'il prend les propriétés du parent ( le ped ),tu as le choix entre 2 possibilités:
FACILE: Laisser l'arme transparente et faire tirer le ped lorsque le joueur appuie sur un touche ( bindKey ) [ Je verrais bien les tires partir de la calandre afin qu'il soit à la hauteur des autres voitures ]
DIFFICILE: Créer la même arme en tant qu'objet ( createObject ) et la superposer à l'arme du ped avec un attachElement sur le ped ( de très nombreux tests en perspective pour une superposition correcte sans compter qu'il faut le faire pour chaque armes disponnible )
Choix vivement conseillé: La facile  :D

Dans le 2ème cas, il faut créer le lance missile ( je dit lance missile car je ne vois que cet objet  :) ) et l'attacher sur le toit de la voiture ( si il est trop gros pour certaines voitures, tu peux toujours réduire avec setObjectScale) par contre c'est du only-client alors appelle le depuis le server avec un trigger vers tous les clients ex:
Code: (lua) [Sélectionner]
for k , i in ipairs( getElementsByType( "player" ) )do
triggerClientEvent( i, "setObjectScale", objet, 0.12 )
end
et il faut que tu code les missiles qui vont "sortir" du lance missile et même pour moi sa prendrai beaucoup de temps  :P

/!\Ne pas oublier d'enlever la collision du ped avec setElementCollisionsEnabled ( a tous les clients ) car il va provoquer des accoups sur la voiture et va mourrir :lmao /!\

Conclusion: Il faut utiliser la méthode facile du 1er cas:
-Créer un ped invisible et le faire viser droit devant lui avec une arme ( une animation non looper )
-Attacher le ped à la voiture de façon à se que l'arme ( invisible je le rappel ) dépassent de la calendre
-Faire un bindKey pour que le joueur puissent faire tirer le ped

Voilà en espérant t'avoir aidé dans la réalisation de ton système.

N'hésite pas à me poser des questions ou même de l'aide pour la réalisation
The rEvolution is coming ...

Hors ligne MK

  • *
  • Gangster
  • Messages: 1844
    • Voir le profil
Re : Arme sur les véhicules
« Réponse #2 le: 20 Décembre 2010, 12:29:15 »
Je regarde ca.
Franchement merci pour cet réponse très bien expliqué :)

Code: (lua) [Sélectionner]
addEvent("buyWeaponl", true)
addEventHandler("buyWeaponl", getRootElement(),
function()
  local pname = getPlayerName( source )
      if ( getPlayerMoney (source) >= 150 ) then
        takePlayerMoney(source, 150 )
local x, y, z = getElementPosition ( source ) --Get the players position
local object = createPed ( 120, x, y, z+2)
attachElements ( object, source, 0, 0, 2 )
giveWeapon ( object, 28, 1 )
setElementAlpha(object, 0)

bindKey (source, "ctrl", "down", pedFire)

outputChatBox("Weapon Obtained", source, 255, 255, 0, true)
outputChatBox( "** ALERT WEAPON DETECTED **", 255, 12, 15, true )
      else
        outputChatBox("Not enough money.", source, 255, 0, 0, true)
    end
  end
)
function pedFire()
setPedOnFire ( object, true )
end



franchement, je galére.
Le bindkey ne marche pas, le ped est bien fixer sur le véhicule mais je n'arrive pas a en faire plus.
Merci de m'aider :S
« Modifié: 20 Décembre 2010, 13:27:28 par MK »

Hors ligne Citizen

  • Scripteur LUA confirmé
  • *
  • Messages: 235
    • Voir le profil
    • Byston Evolution
Re : Arme sur les véhicules
« Réponse #3 le: 20 Décembre 2010, 21:50:26 »
Salut MK,

Bon ba c'est déjà un bon début mais pour tes tests, je te conseil de commenter le setElementAlpha pour voir où il est et ce qu'il fait de plus il faudrai que tu l'attaches non pas au joueur mais au véhicule c'est une question de logique car si ton script permet au joueur de sortir de son véhicule, le ped va le suivre  :lmao.
Pour récupéré le véhicule utilisé par le joueur c'est: getPedOccupiedVehicule( thePlayer )


Ensuite, la fonction setPedOnFire ne permet pas au ped de tirer comme tu le pensais, mais de le faire prendre feu  :lmao  :lmfao. Mais heureusement, ta fonction ne peut pas marcher, parce que tu lui donnes la variable object mais en réalité c'est une variable de type local ( c'est une variable qui se détruit à la fin de la fonction ) donc object n'existe plus à ce niveau là. Tu peux la passer en globale en enlevant le 'local' devant. Mais sa serai trop beau pour que se soit la solution du problème. En effet, cette façon de faire ne marche que pour un joueur ( le dernier qui a acheté une arme ) car lorsqu'un joueur va acheter une arme, la variable object sera "remplacée" par le nouveau ped créé ( j'espère que tu as compris ce passage difficile à expliqué  :) )
Donc la solution serai de faire un setElementData comme ceci: setElementData( leVehicule, "ped", object )
Tu pourras ensuite le récupéré en faisant: getElementData( leVehicle, "ped" )
Comme ça, chaque véhicule à son ped ( à condition d'acheter une arme biensur  ::) )


Je te conseil de mettre 2 fonctions:
- Une pour faire tirer le ped ( par ex: startPedFire() )
- Une autre pour le faire arrêter de tirer ( par ex: stopPedFire() )
Car ici même lorsque le joueur aura relâcher la touche, il continuera à tirer jusqu'à ce qu'il n'est plus de munitions et même là, il continuera à appuyer sur la gâchette  :lmao. Il te faut donc un 2ème bindKey comme le 1er mais cette fois lorsqu'il relâche la touche ( bindKey (source, "ctrl", "up", stopPedFire) )


Il y a aussi un problème avec ton bindKey car la touche ctrl n'existe pas dans MTA ( J'ai laissé la faute au-dessus exprès ). En effet, tu as le choix entre rctrl ou lctrl ( autrement dit la touche ctrl de droite ou de gauche).
Liste des touches:   ici


Une petite information complémentaire sur les bindKey, cette fonction retourne dans l'ordre:
- Le joueur qui à exécuté le bindKey
- La touche
- Le statut ( "up" ou "down" = relâché ou enfoncé )
- Des arguments que tu auras signalés dans le bindKey
Donc je doit mettre ceci:
Code: (lua) [Sélectionner]
function startPedFire( thePlayer, key, keyState )
Mais comme je n'ai besoin que du joueur, je peux enlever le reste:
Code: (lua) [Sélectionner]
function startPedFire( thePlayer )
Voilà ce que je t'es préparé:
Code: (lua) [Sélectionner]
addEvent("buyWeaponl", true)
addEventHandler("buyWeaponl", getRootElement(),
function()
local pname = getPlayerName( source ) -- Où tu utilises le nom du joueur ?
    if ( getPlayerMoney (source) >= 150 ) then
        takePlayerMoney(source, 150 )
local x, y, z = getElementPosition ( source ) --Get the players position
local object = createPed ( 120, x, y, z+2)
--------- On enlève la collision du nouveau ped pour tous les joueurs -------------------
for k , i in ipairs( getElementsByType( "player" ) )do
triggerClientEvent( i, "setElementCollisionsEnabled", object, false )
end
----------------------------------------------------------------------------------------
local veh = getPedOccupiedVehicle( source ) -- On récupère le veh utiliser par le joueur
attachElements ( object, veh, 0, 0, 2 )
giveWeapon( object, 28, 1 )
-- setElementAlpha(object, 0)
setElementData( veh, "ped", object ) -- On stock le ped "avec le véhicule"
-------------- le ctrl droit -------------------
bindKey (source, "rctrl", "down", startPedFire)
bindKey (source, "rctrl", "up", stopPedFire)
-------------- le ctrl gauche ------------------
bindKey (source, "lctrl", "down", startPedFire)
bindKey (source, "lctrl", "up", stopPedFire)

outputChatBox("Weapon Obtained", source, 255, 255, 0, true)
outputChatBox( "** ALERT WEAPON DETECTED **", 255, 12, 15, true )
      else
        outputChatBox("Not enough money.", source, 255, 0, 0, true)
    end
  end
)

function startPedFire( thePlayer )
local veh = getPedOccupiedVehicle( thePlayer ) -- On récupère le veh utiliser par le joueur
local thePed = getElementData( veh, "ped" ) -- On récupère le ped
setControlState( thePed, "fire", true ) -- On le fait tirer
end

function stopPedFire( thePlayer )
local veh = getPedOccupiedVehicle( thePlayer ) -- On récupère le veh utiliser par le joueur
local thePed = getElementData( veh, "ped" ) -- On récupère le ped
setControlState( thePed, "fire", false ) -- On arrête de le faire tirer
end

Voilà, je te laisses continuer  :P

EDIT: Je t'es rajouté dans le code la suppression des collision du ped pour tous les clients
EDIT2: Je précise que ce code doit être du coter server pour que cela soit synchrone avec tous les autres joueurs ( mais peut-être que tu appelles la fonction depuis le client car je vois un addEventHandler, si ce n'est pas le cas demande moi on modifiera quelque chose  ;) )

                     Citizen
« Modifié: 20 Décembre 2010, 22:16:20 par Citizen »
The rEvolution is coming ...

Hors ligne MK

  • *
  • Gangster
  • Messages: 1844
    • Voir le profil
Re : Arme sur les véhicules
« Réponse #4 le: 20 Décembre 2010, 22:14:36 »
merci, t'assures :p
j'édite en cas de problèmes

Hors ligne Citizen

  • Scripteur LUA confirmé
  • *
  • Messages: 235
    • Voir le profil
    • Byston Evolution
Re : Arme sur les véhicules
« Réponse #5 le: 20 Décembre 2010, 22:19:09 »
Tu as déjà répondu !  :ohmy
J'ai fait 2 EDIT si tu ne les as pas vu

               Citizen

The rEvolution is coming ...

Hors ligne MK

  • *
  • Gangster
  • Messages: 1844
    • Voir le profil
Re : Arme sur les véhicules
« Réponse #6 le: 20 Décembre 2010, 22:44:35 »
Citer
[2010-12-20 22:37:40] WARNING: userpanel\server.lua:124: Bad 'player' pointer @ 'setControlState'(1)
[2010-12-20 22:37:40] WARNING: userpanel\server.lua:129: Bad 'player' pointer @ 'setControlState'(1)
Il me semble être bon mais pourtant il me renvoie une erreur. j'ai vérifier sur le wiki pourtant...
et setElementAlpha(object, 0) ne rend pas le ped invisible O.o (je crois que je n'utilise pas la bonne fonction)
et j'ai aussi l'impression que giveWeapon( object, 28, 1 ) ne fonctionne pas

:/

Citer
EDIT2: Je précise que ce code doit être du coter server pour que cela soit synchrone avec tous les autres joueurs ( mais peut-être que tu appelles la fonction depuis le client car je vois un addEventHandler, si ce n'est pas le cas demande moi on modifiera quelque chose  Clin d'oeil )
J'utilise un script qui vient de mta community or, oui les fonctions sont appelé depuis le client.lua ce script était complétement bugger j'ai dut le modifier à ma sauce pour qu'il marche et maintenant j'essaye de le customiser.
« Modifié: 20 Décembre 2010, 22:47:23 par MK »

Hors ligne Citizen

  • Scripteur LUA confirmé
  • *
  • Messages: 235
    • Voir le profil
    • Byston Evolution
Re : Arme sur les véhicules
« Réponse #7 le: 20 Décembre 2010, 23:07:07 »
Mouai c'est plutôt bizarre  :wall

Essaye de mettre le giveWeapon, le setElementData et le setElementAlpha juste en-dessous de la création du ped ( je ne pense pas que sa changera mais peut-être que l'attachElement y est pour quelque chose )

Pour le ped invisible c'est bien setElementAlpha ( je l'ai déjà utilisé sur des peds ) mais vérifie qu'il n'est pas commenté comme lorsque je te l'ai filé.

Tu devrais aussi lui donner plus de munitions à ton ped:  giveWeapon( object, 28, 1000 )

Si tu as encore ces 2 erreurs, essaye de faire passer le ped par le bindKey comme ceci:
Code: (lua) [Sélectionner]
bindKey (source, "rctrl", "down", startPedFire, object)
Code: (lua) [Sélectionner]
function startPedFire( thePlayer, key, keyState, thePed )
setControlState( thePed, "fire", true ) -- On le fait tirer
end

Je te laisse faire les modifs nécessaires  sur les 3 autres bindKey et sur la 2eme fonction.

Voila sur ce je doit te laisser à demain ( vers 10h30  :P)

                  Citizen






The rEvolution is coming ...

Hors ligne Ssk

  • *
  • Lulu's Stunt - Le serveur stunt de Lulu !
  • Messages: 8154
    • Voir le profil
Re : Arme sur les véhicules
« Réponse #8 le: 20 Décembre 2010, 23:39:11 »
Tu peut nous donner la fonction dans laquelle est appelé setControlState ?



Derrière tout programme se cache un programmeur, je considère le monde comme un programme.
Mon blog

Hors ligne MK

  • *
  • Gangster
  • Messages: 1844
    • Voir le profil
Re : Arme sur les véhicules
« Réponse #9 le: 20 Décembre 2010, 23:47:46 »
Citer
function pedFire(source, key, keyState, thePed)
   setControlState( thePed, "fire", true ) -- On le fait tirer
end
function stopPedFire(source, key, keyState, thePed)
   setControlState( thePed, "fire", false )
end

Hors ligne Ssk

  • *
  • Lulu's Stunt - Le serveur stunt de Lulu !
  • Messages: 8154
    • Voir le profil
Re : Arme sur les véhicules
« Réponse #10 le: 20 Décembre 2010, 23:50:53 »
Tu peut nous donner le code au moment où tu fais bindKey ?



Derrière tout programme se cache un programmeur, je considère le monde comme un programme.
Mon blog

Hors ligne Citizen

  • Scripteur LUA confirmé
  • *
  • Messages: 235
    • Voir le profil
    • Byston Evolution
Re : Arme sur les véhicules
« Réponse #11 le: 21 Décembre 2010, 11:29:23 »
C'est la réponse #3 Sasuke,
il a copier-coller tels que je lui est donné ( du moins, c'est ce que je pense )
J'ai une question aussi, normalement on peut faire un setElementData et mettre le ped en data comme dans la réponse #2
Parce que apparemment je ne peut pas récupéré le ped ( bad pointer avec le setControlState )
A moins que...
MK ? Tu étais bien dans la voiture qui a le ped pour le faire tirer ?? Car sinon tu ne peux pas récupéré ton ped dans le code de la réponse #2
« Modifié: 21 Décembre 2010, 11:41:16 par Citizen »
The rEvolution is coming ...

Hors ligne MK

  • *
  • Gangster
  • Messages: 1844
    • Voir le profil
Re : Arme sur les véhicules
« Réponse #12 le: 21 Décembre 2010, 13:46:53 »
Citer
il a copier-coller tels que je lui est donné ( du moins, c'est ce que je pense )
oui et non, j'ai recopier se que j'avais besoin et j'ai essayé de comprendre.

Citer
function stopPedFire(source, key, keyState, thePed)
   setControlState( thePed, "fire", false )
end
c'est bien les paramètres qu'il fallait mettre non?

Citer
MK ? Tu étais bien dans la voiture qui a le ped pour le faire tirer ?? Car sinon tu ne peux pas récupéré ton ped dans le code de la réponse #2
De toute façon dans le mode race, on ne peut changer de voiture.

édit:
pour info j'ai réussi à le rendre invisible.
Mais je n'arrive toujours pas à le faire tirer, les informations du ped ne se transmettent pas de fonction en fonction. es ce normal?
« Modifié: 21 Décembre 2010, 13:48:55 par MK »

Hors ligne Citizen

  • Scripteur LUA confirmé
  • *
  • Messages: 235
    • Voir le profil
    • Byston Evolution
Re : Arme sur les véhicules
« Réponse #13 le: 21 Décembre 2010, 13:54:43 »
Donc setControlState ne s'utilise que sur les joueurs ( je pensais que sa faisait aussi sur les peds ), il faut utiliser setPedControlState qui est du only client donc il faut faire des triggerClientsEvent

J'ai remarqué aussi que ces 2 codes sont équivalents:

Code: (lua) [Sélectionner]
for k, i in ipairs ( getElementsByType( "player" ) ) do
triggerClientEvent( i, "lafunction", getRootElement() )
end

Code: (lua) [Sélectionner]
triggerClientEvent( getRootElement() , "lafunction", getRootElement() )
Je suis en train de faire des tests de mon coter :)

                    Citizen

The rEvolution is coming ...

Hors ligne MK

  • *
  • Gangster
  • Messages: 1844
    • Voir le profil
Re : Arme sur les véhicules
« Réponse #14 le: 21 Décembre 2010, 14:25:04 »
dans le client:
Code: (lua) [Sélectionner]
function clientPedFire(source, key, keyState, thePed)
setPedControlState(thePed, "fire", true)
end

function clientStopPedFire(source, key, keyState, thePed)
setPedControlState(thePed, "fire", false)
end

dans le server:
function pedFire(source, key, keyState, thePed)
triggerClientEvent( getRootElement() , "clientPedFire", getRootElement() )
end
function stopPedFire(source, key, keyState, thePed)
triggerClientEvent( getRootElement() , "clientStopPedFire", getRootElement() )
end

aucune erreur s'affiche mais sa ne marche pas ^^
(comme je suis nul)