Aller au contenu
Rechercher dans
  • Plus d’options…
Rechercher les résultats qui contiennent…
Rechercher les résultats dans…
Bienvenue Invité!

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
LeonHartStrife

en cours Empêcher les véhicules d'occasion de despawn

Question

LeonHartStrife
  • Titre du topic
    Empêcher les véhicules d'occasion de despawn
  • Quel OS utilisez vous sur votre machine ?
    Windows
  • Chez quel hébergeur êtes vous ?
    Autre
  • Sur quel framework travaillez vous ?
    ESX
  • Quel script utilisez-vous ?
    esx-qalle-sellvehicles
  • Quelles actions avez-vous essayez ?
    Remplacer les fonctions deletevehicule par une fonction qui "unfreeze" les véhicules...
  • Quel problème rencontrez vous ?

    J'utilise esx-qalle-sellvehicles pour la gestion de mes véhicules d'occasion. 
    Le script permet de mettre ses véhicules en vente afin que d'autres joueurs puissent les racheter :
    - Vous allez sur un point avec le véhicule que vous souhaitez vendre, fixez un prix, et le véhicule est envoyé sur une place de parking puis réglé comme mission entity de manière à ce qu'il ne despawn plus. 
    Jusque là tout va bien...

    Maintenant, si vous allez vers un véhicule en vente, placé sur le parking du shop donc, et que vous le retirez de la vente ou l'achetez, il despawn et va directement dans votre garage. 
    Ce que je souhaite, c'est que le véhicule ne despawn pas à ce moment là. Comme IRL en fait ; lorsque vous allez acheter un véhicule chez votre concess, vous repartez avec, il n'est pas TP à votre garage. 

    J'ai donc supprimé toutes les fonctions deletevehicle du script, et les ai remplacé  par une fonction "releasevehicle" (que je vous pose plus bas) et le véhicule ne despawn plus 😅, mais j'ai toujours ce menu (véhicule d'occasion) attaché au véhicule, même si je le retire de la vente ou l'achète. 
    Une petite vidéo pour illustrer   

    Vidéo

    Le script dit : pour tout véhicule garé sur une des 11 places de parking disponibles (véhicule mis en vente donc) alors créer et attacher un menu (occasion) sur ces dits véhicules. 
    Comment faire pour retirer ce menu sans faire despawn le véhicule ?



     

    main.lua main.lua

  • La partie du code qui pose problème
    function ReleaseVehicles()
    	local VehPos = Config.VehiclePositions
    
    	for i = 1, #VehPos, 1 do
    		local veh, distance = ESX.Game.GetClosestVehicle(VehPos[i])
    
    		if DoesEntityExist(veh) and distance <= 1.0 then
    			FreezeEntityPosition(veh, false)
    			
    			--SetVehicleHasBeenOwnedByPlayer(veh, true)
    		end
    	end		
    end
  • Lien vers vos logs serveur
  • Lien vers vos logs client
  • Je possède la dernière version de mon framework
    Oui

Partager ce message


Lien à poster
Partager sur d’autres sites

Messages recommandés

  • 0
LeonHartStrife

Yes c'est ce que j'ai fait et les véhicules ne despawn plus. Mais j'ai toujours le menu attaché au véhicule une fois celui-ci retiré de la vente, comme visible ici à partir de la vingtième seconde :

Vidéo


Là dessus je sèche : impossible de retirer le menu sans faire despawn le véhicule. 

Modifié par LeonHartStrife

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0
JagerBom

si tu essayais ceci: (quasi pareil pour le buy)

		elseif action == "remove" then
			ESX.TriggerServerCallback("esx-qalle-sellvehicles:buyVehicle", function(isPurchasable, totalMoney)
				if isPurchasable then
					--DeleteVehicle(veh)
					for i = 1, #Config.VehiclePositions, 1 do
						if Config.VehiclePositions[i]["entityId"] ~= nil then
							local pedCoords = GetEntityCoords(ped)
							local vehCoords = GetEntityCoords(Config.VehiclePositions[i]["entityId"])
							local dstCheck = GetDistanceBetweenCoords(pedCoords, vehCoords, true)
							if dstCheck <= 2.0 then
								Config.VehiclePositions[i]["entityId"] = nil
							end
						end
					end
					ESX.ShowNotification("You ~g~removed~s~ the vehicle")
					menu.close()
				end
			end, ESX.Game.GetVehicleProperties(veh), 0)

 

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0
LeonHartStrife

Merci de prendre du temps pour me répondre Jager. 
Je viens de tester ton snippet et cette fois la voiture despawn. J'pige pas pourquoi...

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0
JagerBom
il y a une heure, LeonHartStrife a dit :

Merci de prendre du temps pour me répondre Jager. 
Je viens de tester ton snippet et cette fois la voiture despawn. J'pige pas pourquoi...

oui mais est ce que tu as encore le menu, fonctionnons pas étape ...

 

puis tu as fais la meme chose ppour le buy ?  a faire attention que le buy a un 1 et remove 0 dasn le callback client

 

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0
LeonHartStrife

J'suis reparti sur une version clean du script et ai intégré ton code comme ceci : 
 

		elseif action == "buy" then
			ESX.TriggerServerCallback("esx-qalle-sellvehicles:buyVehicle", function(isPurchasable, totalMoney)
				if isPurchasable then
					--ReleaseVehicles()
					for i = 1, #Config.VehiclePositions, 1 do
						if Config.VehiclePositions[i]["entityId"] ~= nil then
							local pedCoords = GetEntityCoords(ped)
							local vehCoords = GetEntityCoords(Config.VehiclePositions[i]["entityId"])
							local dstCheck = GetDistanceBetweenCoords(pedCoords, vehCoords, true)
							if dstCheck <= 2.0 then
								Config.VehiclePositions[i]["entityId"] = nil
							end
						end
					end
					ESX.ShowNotification("Vous avez ~g~acheté~s~ le véhicule")
					menu.close()
				end
			end, ESX.Game.GetVehicleProperties(veh), price)
		elseif action == "remove" then
			ESX.TriggerServerCallback("esx-qalle-sellvehicles:buyVehicle", function(isPurchasable, totalMoney)
				if isPurchasable then
					--ReleaseVehicles()
					for i = 1, #Config.VehiclePositions, 1 do
						if Config.VehiclePositions[i]["entityId"] ~= nil then
							local pedCoords = GetEntityCoords(ped)
							local vehCoords = GetEntityCoords(Config.VehiclePositions[i]["entityId"])
							local dstCheck = GetDistanceBetweenCoords(pedCoords, vehCoords, true)
							if dstCheck <= 2.0 then
								Config.VehiclePositions[i]["entityId"] = nil
							end
						end
					end
					ESX.ShowNotification("Vous avez ~g~retiré~s~ le véhicule de la vente")
					menu.close()
				end
			end, ESX.Game.GetVehicleProperties(veh), 0)
		end
		
	end, function(data, menu)
		menu.close()
	end)
end

De cette façon, le véhicule despawn. 
Je suis donc allé chercher le callback "buyVehicle" dans la partie serveur. Il contient le Trigger "refreshVehicles" qui se trouve dans le client c'est ici que le véhicules est despawn. J'ai donc commenté la ligne 38 "RemoveVehicles" et le véhicule ne despawn plus. Mais j'ai toujours ce menu attaché à la voiture même après le rachat ou le retrait de la vente. 

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0
JagerBom

et si tu fais ceci cela donne quoi ?  Dans la version originale du script il y a pas ReleaseVehicles() donc je sais aps ou t'as ete le chercher :)

 

 

		elseif action == "buy" then
			ESX.TriggerServerCallback("esx-qalle-sellvehicles:buyVehicle", function(isPurchasable, totalMoney)
				if isPurchasable then
					--ReleaseVehicles()
      				print(ESX.DumpTable(Config.VehiclePositions))
					for i = 1, #Config.VehiclePositions, 1 do
						if Config.VehiclePositions[i]["entityId"] ~= nil then
							local pedCoords = GetEntityCoords(ped)
          					print(pedCoords)
							local vehCoords = GetEntityCoords(Config.VehiclePositions[i]["entityId"])
							local dstCheck = GetDistanceBetweenCoords(pedCoords, vehCoords, true)
							if dstCheck <= 2.0 then
								Config.VehiclePositions[i]["entityId"] = nil
							end
						end
					end
					ESX.ShowNotification("Vous avez ~g~acheté~s~ le véhicule")
					menu.close()
				end
			end, ESX.Game.GetVehicleProperties(veh), price)
		elseif action == "remove" then
			ESX.TriggerServerCallback("esx-qalle-sellvehicles:buyVehicle", function(isPurchasable, totalMoney)
				if isPurchasable then
					--ReleaseVehicles()
      				print(ESX.DumpTable(Config.VehiclePositions))
					for i = 1, #Config.VehiclePositions, 1 do
						if Config.VehiclePositions[i]["entityId"] ~= nil then
							local pedCoords = GetEntityCoords(ped)
          					print(pedCoords)
							local vehCoords = GetEntityCoords(Config.VehiclePositions[i]["entityId"])
							local dstCheck = GetDistanceBetweenCoords(pedCoords, vehCoords, true)
							if dstCheck <= 2.0 then
								Config.VehiclePositions[i]["entityId"] = nil
							end
						end
					end
					ESX.ShowNotification("Vous avez ~g~retiré~s~ le véhicule de la vente")
					menu.close()
				end
			end, ESX.Game.GetVehicleProperties(veh), 0)

 

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0
LeonHartStrife

J'ai les coordonnées des 11 places du shop qui s'affichent dans ma console client. 
Toujours le menu attaché cependant. 

EDIT 1 : Sur la place 1 affichée dans la console, il détecte effectivement mon véhicule, même après le rachat

 

Screenshot_2.png

Modifié par LeonHartStrife

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0
JagerBom

met tout ton log plus facile a comprendre

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0
LeonHartStrife

La partie du log concernée
 

[    150156] [    GTAProcess]             MainThrd/ [1] = {
[    150156] [    GTAProcess]             MainThrd/     ["y"] = -1675.8868408203,
[    150156] [    GTAProcess]             MainThrd/     ["z"] = 29.208623886108,
[    150156] [    GTAProcess]             MainThrd/     ["owner"] = true,
[    150156] [    GTAProcess]             MainThrd/     ["h"] = 262.00964355469,
[    150156] [    GTAProcess]             MainThrd/     ["entityId"] = 808194,
[    150156] [    GTAProcess]             MainThrd/     ["price"] = 10000,
[    150156] [    GTAProcess]             MainThrd/     ["x"] = -50.171089172363,
[    150156] [    GTAProcess]             MainThrd/     },
[    150156] [    GTAProcess]             MainThrd/ [2] = {
[    150156] [    GTAProcess]             MainThrd/     ["y"] = -1678.6947021484,
[    150156] [    GTAProcess]             MainThrd/     ["z"] = 29.035066604614,
[    150156] [    GTAProcess]             MainThrd/     ["x"] = -53.738887786865,
[    150156] [    GTAProcess]             MainThrd/     ["h"] = 262.17529296875,
[    150156] [    GTAProcess]             MainThrd/     },
[    150156] [    GTAProcess]             MainThrd/ [3] = {
[    150156] [    GTAProcess]             MainThrd/     ["y"] = -1681.3382568359,
[    150156] [    GTAProcess]             MainThrd/     ["z"] = 28.775428771973,
[    150156] [    GTAProcess]             MainThrd/     ["x"] = -56.15104675293,
[    150156] [    GTAProcess]             MainThrd/     ["h"] = 261.70642089844,
[    150156] [    GTAProcess]             MainThrd/     },
[    150156] [    GTAProcess]             MainThrd/ [4] = {
[    150156] [    GTAProcess]             MainThrd/     ["y"] = -1683.7432861328,
[    150156] [    GTAProcess]             MainThrd/     ["z"] = 29.069145202637,
[    150156] [    GTAProcess]             MainThrd/     ["x"] = -58.20711517334,
[    150156] [    GTAProcess]             MainThrd/     ["h"] = 256.02319335938,
[    150156] [    GTAProcess]             MainThrd/     },
[    150156] [    GTAProcess]             MainThrd/ [5] = {
[    150156] [    GTAProcess]             MainThrd/     ["y"] = -1687.0262451172,
[    150156] [    GTAProcess]             MainThrd/     ["z"] = 28.782316207886,
[    150156] [    GTAProcess]             MainThrd/     ["x"] = -60.539875030518,
[    150156] [    GTAProcess]             MainThrd/     ["h"] = 278.62295532227,
[    150156] [    GTAProcess]             MainThrd/     },
[    150156] [    GTAProcess]             MainThrd/ [6] = {
[    150156] [    GTAProcess]             MainThrd/     ["y"] = -1689.8743896484,
[    150156] [    GTAProcess]             MainThrd/     ["z"] = 28.78221321106,
[    150156] [    GTAProcess]             MainThrd/     ["x"] = -57.772407531738,
[    150156] [    GTAProcess]             MainThrd/     ["h"] = 313.96432495117,
[    150156] [    GTAProcess]             MainThrd/     },
[    150156] [    GTAProcess]             MainThrd/ [7] = {
[    150156] [    GTAProcess]             MainThrd/     ["y"] = -1692.8951416016,
[    150156] [    GTAProcess]             MainThrd/     ["z"] = 29.055320739746,
[    150156] [    GTAProcess]             MainThrd/     ["x"] = -55.157493591309,
[    150156] [    GTAProcess]             MainThrd/     ["h"] = 356.50018310547,
[    150156] [    GTAProcess]             MainThrd/     },
[    150156] [    GTAProcess]             MainThrd/ [8] = {
[    150156] [    GTAProcess]             MainThrd/     ["y"] = -1694.16015625,
[    150156] [    GTAProcess]             MainThrd/     ["z"] = 29.068706512451,
[    150156] [    GTAProcess]             MainThrd/     ["x"] = -51.692226409912,
[    150156] [    GTAProcess]             MainThrd/     ["h"] = 358.81967163086,
[    150156] [    GTAProcess]             MainThrd/     },
[    150156] [    GTAProcess]             MainThrd/ [9] = {
[    150156] [    GTAProcess]             MainThrd/     ["y"] = -1692.2283935547,
[    150156] [    GTAProcess]             MainThrd/     ["z"] = 29.018730163574,
[    150156] [    GTAProcess]             MainThrd/     ["x"] = -48.437274932861,
[    150156] [    GTAProcess]             MainThrd/     ["h"] = 359.84155273438,
[    150156] [    GTAProcess]             MainThrd/     },
[    150156] [    GTAProcess]             MainThrd/ [10] = {
[    150156] [    GTAProcess]             MainThrd/     ["y"] = -1691.1813964844,
[    150156] [    GTAProcess]             MainThrd/     ["z"] = 29.044681549072,
[    150156] [    GTAProcess]             MainThrd/     ["x"] = -45.033851623535,
[    150156] [    GTAProcess]             MainThrd/     ["h"] = 355.75744628906,
[    150156] [    GTAProcess]             MainThrd/     },
[    150156] [    GTAProcess]             MainThrd/ [11] = {
[    150156] [    GTAProcess]             MainThrd/     ["y"] = -1689.6267089844,
[    150156] [    GTAProcess]             MainThrd/     ["z"] = 28.552017211914,
[    150156] [    GTAProcess]             MainThrd/     ["x"] = -41.201889038086,
[    150156] [    GTAProcess]             MainThrd/     ["h"] = 355.77816772461,
[    150156] [    GTAProcess]             MainThrd/     },
[    150156] [    GTAProcess]             MainThrd/ }
[    150156] [    GTAProcess]             MainThrd/ vector3(0, 0, 0)

Et l'ensemble du log en PJ. 

CitizenFX_log_2019-12-20T102746.log

 

 

EDIT Pour répondre à ta remarque plus haut sur la fonction "ReleaseVehicle" qui n'existe pas dans le script original, c'est une fonction que j'avais créé en remplacement de la fonction RemoveVehicle, comme indiqué dans le premier post (j'ai également posté le bout de code correspondant) afin de libérer le véhicule sans le faire despawn et possiblement essayer de retirer le menu.  Ceci étant,  je n'appelle plus cette fonction depuis que le simple fait de commenter les lignes RemoveVehicle ou DeleteVehicle suffit à empêcher le despawn. Voilà pour la petite explication. 🙂

Modifié par LeonHartStrife

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0
JagerBom

ton erreur est la, quand tu vois j'ai fais un print de pedcoords et ca te donne (0, 0, 0) ce qui est pas normal. Donc soit ta native est pas bonne ou le ped en question existe pas. remplace ceci par un bon code qui te donne quelque chose:

							local pedCoords = GetEntityCoords(GetPlayerPed(-1))
          					print(pedCoords)

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0
LeonHartStrife

Aaaah par contre ça se complique en multi

https://streamable.com/32o9a

Le joueur récupère sa voiture et le menu a bien disparu.
Par contre, comme tu peux le voir dans la vidéo, de mon côté, le véhicule reste sur place tandis que le joueur, lui, part bien avec sa voiture. 
 

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0
LeonHartStrife

Un petit point sur mes (très modestes) avancées :

Prenons deux joueurs : A et B
On peut voir sur la vidéo du post précédent que lorsque A achète un véhicule et part avec, B considère toujours le véhicule sur la place et le voit fixe alors que A s'en va avec.
Si j'ai bien tout compris (...et c'est laborieux 😅), ce serait dû au fait que ma fonction "ReleaseVehicles" se passe côté client et non côté serveur.  Logique !

Pour rappel, j'ai ajouté cette fonction ReleaseVehicles pour remplacer celle d'origine nommée "RemoveVehicles" qui supprimait le véhicule au moment de l'achat (Cf post 1)
Souvenez-vous, je souhaite que le véhicule ne despawn pas et que l'on puisse repartir avec. Et tout cela fonctionne côté client... mais seulement pour celui qui achète.

J'essaye donc d'adapter ma fonction ReleaseVehicles pour qu'elle se passe côté serveur.    
Elle se présente comme ça côté client :

 

Révélation
function ReleaseVehicles()
	local VehPos = Config.VehiclePositions

	for i = 1, #VehPos, 1 do
		local veh, distance = ESX.Game.GetClosestVehicle(VehPos[i])
		
		if DoesEntityExist(veh) and distance <= 2.0 then
			Citizen.Wait(100)
			
			SetEntityAsMissionEntity(veh, true, true)
			FreezeEntityPosition(veh, false)
			SetVehicleHasBeenOwnedByPlayer(veh, true)
			SetNetworkIdCanMigrate(networkid, true)
			SetNetworkIdExistsOnAllMachines(networkid, true)
		end
	end		
end

 

 

Pour la passer côté serveur, voici ce que j'essaye (ne riez pas) : 

 

Révélation
RegisterServerEvent("esx-qalle-sellvehicles:ReleaseVehicles")
AddEventHandler("esx-qalle-sellvehicles:ReleaseVehicles", function(veh)
	local veh = veh

	if DoesEntityExist(veh) and distance <= 2.0 then

		Citizen.Wait(100)
			
		SetEntityAsMissionEntity(veh, true, true)
		FreezeEntityPosition(veh, false)
		SetVehicleHasBeenOwnedByPlayer(veh, true)
		SetNetworkIdCanMigrate(networkid, true)
		SetNetworkIdExistsOnAllMachines(networkid, true)
	end
end)

 


Et j'appelle l'Event côté client de cette façon : 
 

Révélation
RegisterNetEvent("esx-qalle-sellvehicles:refreshVehicles")
AddEventHandler("esx-qalle-sellvehicles:refreshVehicles", function()
	local VehPos = Config.VehiclePositions
	
	for i = 1, #VehPos, 1 do
		local veh, distance = ESX.Game.GetClosestVehicle(VehPos[i])
	
		TriggerServerEvent("esx-qalle-sellvehicles:ReleaseVehicles", veh)
	--ReleaseVehicles()

	--Citizen.Wait(500)

	--SpawnVehicles()
	end
end)

 


Evidemment ça ne fonctionne pas. Je dois mal faire passer les paramètres au moment où j'appelle ma fonction côté serveur... je pense. 
Je continue, je creuse. 

Cela étant dit, de joyeuses fêtes à tous ! 🍻

 

Modifié par LeonHartStrife

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0
LeonHartStrife

Bon, c'est pas encore au point mais cette fois je n'ai plus d'erreur nulle part... On va y arriver ! 🤣
Je vous montre ce que j'ai fait (plus simple que dans le message précédent) : 

Alors côté client on a ça : 

Révélation
RegisterNetEvent("esx-qalle-sellvehicles:ReleaseVehicles")
AddEventHandler("esx-qalle-sellvehicles:ReleaseVehicles", function()
	local VehPos = Config.VehiclePositions

	for i = 1, #VehPos, 1 do
		local veh, distance = ESX.Game.GetClosestVehicle(VehPos[i])
		
		if DoesEntityExist(veh) and distance <= 2.0 then
			Citizen.Wait(100)
			
			SetEntityAsMissionEntity(veh, true, true)
			FreezeEntityPosition(veh, false)
			SetVehicleHasBeenOwnedByPlayer(veh, true)
		end
	end		
end)

 

 

Et côté serveur on va chercher la ligne 92, dans le Callback "BuyVehicle" et on remplace par :

Révélation
TriggerClientEvent("esx-qalle-sellvehicles:ReleaseVehicles", -1)

 

 

De cette façon, on demande au serveur d'effectuer l'action sur tous les clients. Du moins c'est ce que je pensais... Parce que même si je n'ai plus d'erreur, ça ne fonctionne que pour celui qui achète le véhicule encore une fois. On dirait que ce n'est pas syncro sur tous les joueurs... 
Je me demande si j'vais pas être obligé de despawn puis respawn le véhicule aussitôt lors de l'achat, ce qui ne ferait pas mes affaires... 

Si vous avez des idées, je suis preneur.  🍻

Modifié par LeonHartStrife

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0
JagerBom

regarde la fifference dans esx de localspawnvehicle et de spawnvehicle

 

les deux c'est pour spawn des vehicules, mais l'un que tou qui voit, l'autre c'est tout le monde qui voit

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0
LeonHartStrife

Ca m'ennuie vraiment de devoir despawn/respawn le véhicule mais j'en arrive à la conclusion que je n'ai pas le choix. 

Ceci-dit, j'espère vraiment réussir à faire ce que je souhaite. J'en ai vraiment besoin pour faire mon script de parking.
Les garages publics sont très très pratiques mais j'ai toujours voulu voir un système de parking sur les serveurs que j'ai fréquenté, sans jamais en trouver. 
Ce serait intéressant de se demander pourquoi d'ailleurs : difficile à mettre en place ? problème de performance si trop de voitures garées au même endroit ? 
Dans tous les cas, dès que j'ai un truc probant, je vous partage le résultat.

Joyeux Noël à tous ! 🥳

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0
LeonHartStrife

Nouvelle tentative, je sens que ça brûle cette fois... 😏

Donc, comme je n'ai pas d'autre choix que de depawn puis spawn le véhicule au moment du rachat, j'ai recréé une nouvelle fonction qui devrait se charger de l'ensemble du process

 

function RemoveVehicles2()
    local VehPos = Config.VehiclePositions

    for i = 1, #VehPos, 1 do
        local veh, distance = ESX.Game.GetClosestVehicle(VehPos[i])
        local vehprops = ESX.Game.GetVehicleProperties(veh)
        

        if DoesEntityExist(veh) and distance <= 1.0 then
            
            DeleteEntity(veh)

            ESX.Game.SpawnVehicle(veh, VehPos[i], 270, function(veh)
            ESX.Game.SetVehicleProperties(veh, vehprops)
            TaskWarpPedIntoVehicle(PlayerPedId(), veh, -1)
            SetEntityAsMissionEntity(veh, true, true)
            end)
        end
    end
end

Avec cette fonction, le véhicule despawn, mais ne respawn pas... 

Par contre si je modifie la native SpawnVehicle(veh - par SpawnVehicle("blista", par exemple,
alors là une Blista apparaît avec tous les attributs de la voiture en vente. 

En d'autres termes, je n'arrive pas à faire respawn le bon véhicule et sur la bonne place de parking. J'arrive à récupérer les attributs et à les mettre sur le nouveau véhicule spawn mais n'arrive pas à faire en sorte que le vehicule spawn soit celui qui est en vente. Comme si "veh" ne lui disait plus rien après le despawn.

1er exemple avec "veh" - rien ne spawn. 

ESX.Game.SpawnVehicle(veh, VehPos[i], 270, function(veh)

Vidéo

 

=================


2ème exemple avec "blista" - une blista avec la même plaque et les mêmes attributs apparaît :

ESX.Game.SpawnVehicle("blista", VehPos[i], 270, function(veh)

Vidéo 2

Notez que la Blista ne respawn pas correctement sur la place. Et l'angle indiqué dans la native (270) ne semble pas avoir d'impact sur l'orientation du spawn.

Modifié par LeonHartStrife

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0
LeonHartStrife

Petite Update : cette fois j'arrive à faire respawn le bon véhicule et avec les bons attributs ! ENFIN ! 
La solution est celle-ci : 

 

function RemoveVehicles2()
	local VehPos = Config.VehiclePositions

	for i = 1, #VehPos, 1 do

		local veh = GetVehiclePedIsIn((GetPlayerPed(-1)),  false)
		local vehprops = ESX.Game.GetVehicleProperties(veh)

		if DoesEntityExist(veh) then 			
			ESX.Game.DeleteVehicle(veh)
			ESX.Game.SpawnVehicle(vehprops.model, {
												x = VehPos[i].x,
												y = VehPos[i].y,
												z = VehPos[i].z
											}, VehPos[i].h, function(veh)
			ESX.Game.SetVehicleProperties(veh, vehprops)
			SetEntityAsMissionEntity(veh, true, true)
			end)
		end
	end
end

J'ai donc remplacé le "veh" dans la native ESX.Game.SpawnVehicle par vehprops.model. De cette façon, on va bien récupérer le model du véhicule en question. 

Manque plus qu'un détail à régler et on est paré : faire spawn le véhicule sur la bonne place et dans la bonne direction. 
Je vous tiens au courant. 

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0
JagerBom

pour la bonne direction, uilise SetEntityHeading(vehicle, heading) (je penses que c'est cella la native)

 

pour la position tu pourrais ajouter une colonne coords dans la bdd et puis faire une boucle la dessus et le ehading tu sauvegarde aussi. Apres j'ai pas le script donc je donne que des idees comment proceder

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0
LeonHartStrife

C'est cool de me donner des idées JB. Joyeux Noël d'ailleurs ! 

Nouvelle update : 

Avec la fonction que je vous ai mis juste au dessus du poste de Jager, il y a un hic. La partie 

local veh = GetVehiclePedIsIn((GetPlayerPed(-1)),  false)

n'est pas bonne. Je m'explique

Imaginons que je souhaite racheter une Blista dispo sur l'une des places. Si je rentre dans la Blista place 1 et que je choisis l'option "acheter", alors tous les joueurs qui ont une Blista sont touchés par le code. Du coup, leur voiture est despawn (peu importe l'endroit où ils se trouvent sur la map) et respawn sur la place 1 du shop. J'ai donc modifié la fonction comme ceci : 

 

RegisterNetEvent("esx-qalle-sellvehicles:RemoveVehicles2")
AddEventHandler("esx-qalle-sellvehicles:RemoveVehicles2", function()

	local VehPos = Config.VehiclePositions

	for i = 1, #VehPos, 1 do
		
		local veh, distance = ESX.Game.GetClosestVehicle(VehPos[i])
		local vehprops = ESX.Game.GetVehicleProperties(veh)


		if DoesEntityExist(veh) and distance <= 1.0 then
			
			ESX.Game.DeleteVehicle(veh)
			
			ESX.Game.SpawnVehicle(vehprops.model, {
												x = VehPos[i].x,
												y = VehPos[i].y,
												z = VehPos[i].z
											}, VehPos[i].h, function(veh)
			ESX.Game.SetVehicleProperties(veh, vehprops)
			TaskWarpPedIntoVehicle(PlayerPedId(), veh, -1)
			SetVehicleOnGroundProperly(veh)
			SetEntityAsMissionEntity(veh, true, true)
			end)
		end
	end
end)

Et là on est bon. 

Il reste deux problèmes à gérer : 
- Le premier est que si j'achète la voiture en place 2, elle va despawn, puis respawn... en place 1 ; et donc au dessus de la voiture qui se trouve en place 1. 
- Le deuxième problème est que la voiture ne despawn que pour celui qui achète le véhicule, pas pour les autres clients... 

Une nouvelle petite vidéo pour vous montrer : 
https://streamable.com/kj9w2

Je vous laisse une copie du script à jour au moment où j'écris ce message et donc avec mes dernières modifs. Merci à vous qui m'aidez là dessus, je pense qu'on y est presque... 

Et une petite vidéo pour vous montrer que ça fonctionne très bien en solo : 
https://streamable.com/r9k89

esx-qalle-sellvehicles.7z

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0
LeonHartStrife

Je viens de régler le problème 1, à savoir que le véhicule acheté ne respawn plus sur la place 1 mais bien à l'endroit où il se trouve avant l'achat. Donc, si le véhicule se trouve sur la place 2 et que vous le récupérez, il respawnera bien place 2. NICKEL !

Me reste plus qu'à comprendre pourquoi le véhicule ne despawn que pour le client qui achète et non pour tout le monde, et ainsi éviter les doublons.

La fonction modifiée 

RegisterNetEvent("esx-qalle-sellvehicles:RemoveVehicles2")
AddEventHandler("esx-qalle-sellvehicles:RemoveVehicles2", function()

	local VehPos = Config.VehiclePositions

	for i = 1, #VehPos, 1 do
		
		local pedCoords = GetEntityCoords(GetPlayerPed(-1))
		local veh, distance = ESX.Game.GetClosestVehicle(pedCoords)
		local vehprops = ESX.Game.GetVehicleProperties(veh)
		local vehCoords = GetEntityCoords(veh)
		local vehHead = GetEntityHeading(veh)

		if DoesEntityExist(veh) and distance <= 1.0 then
			
			ESX.Game.DeleteVehicle(veh)
			
			ESX.Game.SpawnVehicle(vehprops.model, vehCoords, vehHead, function(veh)
			ESX.Game.SetVehicleProperties(veh, vehprops)
			TaskWarpPedIntoVehicle(PlayerPedId(), veh, -1)
			SetVehicleOnGroundProperly(veh)
			SetEntityAsMissionEntity(veh, true, true)
			end)
		end
	end
end)

 

Modifié par LeonHartStrife

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0
JagerBom

faut faire attention a la fonction 

GetClosestVehicle(pedCoords)

car ceci ne detecte que les vehicules normaux, pas les voitures de police, heli et autres.

 

essaye delete entity et non delete vehicle

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0
LeonHartStrife

Après ces quelques jours d'absence je viens aux nouvelles : 
J'ai donc remplacé 

ESX.Game.DeleteVehicle(veh)

par 

DeleteEntity(veh)

sans succès malheureusement. Le véhicule ne despawn que pour le client de cette façon. Pour contrer ça, la seule solution trouvée pour le moment est d'utiliser la fonction refreshvehicles présente de base dans le script de Qalle. 
Seulement voilà, lorsqu'on utilise cette fonction, tous les véhicules présents sur les places de parking se déplace d'un rang de façon à ce que la place 1 soit toujours occupée. 
Ce n'est pas tout à fait adapté à ce que je voulais faire à la base mais ça fera l'affaire jusqu'à ce que je trouve une autre solution...

En attendant, j'ai une dernière petite question : 

J'ai remarqué que dans ton nodespawnvehicle, Jager, tu utilisais ce bout de code pour compter le nombre de joueurs et lancer un trigger à la première connexion d'un client : 

RegisterNetEvent('esx:playerLoaded')
AddEventHandler('esx:playerLoaded', function(xPlayer)
  	if GetNumberOfPlayers() == 1 then
		TriggerEvent('blabla')
	end
end)

Je réutilise donc ce trigger dans mon script de parking mais il s'avère que le trigger se lance lorsqu'un second client se connecte, idem si un troisième, un quatrième etc.. 
Y aurait-il une incompatibilité avec OneSync ou une autre raison qui justifierait que la native  GetNumberOfPlayer(ne fonctionne pas comme voulu ?
J'ai également essayé avec NetworkGetNumConnectedPlayers() mais le résultat est le même. Un print(native ici) côté client me retourne 1 dans la console de chaque client à la connexion, alors qu'il devrait me retourner 2 pour le client 2, 3 pour le troisième... etc... Right?  

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0
LeonHartStrife

Pour répondre à ma dernière question : 
J'ai simplement créé ce trigger côté serveur en ajoutant une variable "true" lorsque le client 1 est connecté : 

local connected = false

RegisterServerEvent('leonpark:checkfirstspawn')
AddEventHandler('leonpark:checkfirstspawn', function()
	if not connected then
		TriggerClientEvent('test', source)
		connected = true
	end
end)

Et on est bon ! :)

Partager ce message


Lien à poster
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant

×
×
  • Créer...

Information importante

En utilisant ce site, vous acceptez les présents règlements Conditions d’utilisation, Politique de confidentialité,Règles.