GeorgeZhang Posted August 29, 2015 Share Posted August 29, 2015 GET_SAFE_COORD_FOR_PED(float x, float y, float z, BOOL onGround, Vector3 *outPosition, int flags) How to use this Native and what it does exactly? ScriptHookVDotNet doesn't allow me to fill in a Vector3 in the parameters, so is there a way to use this in C#? Link to comment Share on other sites More sharing options...
pillow Posted August 29, 2015 Share Posted August 29, 2015 C# is a sh*it, use c++ instead Link to comment Share on other sites More sharing options...
alloc8or Posted August 30, 2015 Share Posted August 30, 2015 But I don't use C# for GTA scripting. C++ is way easier and better. pillow 1 Link to comment Share on other sites More sharing options...
GeorgeZhang Posted August 30, 2015 Author Share Posted August 30, 2015 Thanks for replying but you wouldn't convert a whole project from C# to C++ just to make one native work, right? This still needs to be solved. Link to comment Share on other sites More sharing options...
Lestium Posted August 30, 2015 Share Posted August 30, 2015 try this Vector3 GET_SAFE_COORD_FOR_PED(Vector3 pos, bool onGround, int flags) { OutputArgument Out = new OutputArgument(); if (Function.Call<bool>(Hash.GET_SAFE_COORD_FOR_PED, pos.X, pos.Y, pos.Z, onGround, Out, flags)) { return Out.GetResult<Vector3>(); } else { return Vector3.Zero; } } Link to comment Share on other sites More sharing options...
GeorgeZhang Posted August 31, 2015 Author Share Posted August 31, 2015 thanks, I'll try this later. Link to comment Share on other sites More sharing options...
whorse Posted August 31, 2015 Share Posted August 31, 2015 the native looks for a safe/available position for a ped around the parameter coordinates X Y Z. It returns true if it was able to find a position, and it assigns the coordinates for said position to the "Vector3 *outPosition" pointer-parameter. So you declare a new Vector3 variable for the safe spot and call the function with a pointer to that variable as the "outPosition" parameter, and - if it returns true - the Vector3 you passed it will be filled with the safe-spot coordinates Link to comment Share on other sites More sharing options...
GeorgeZhang Posted August 31, 2015 Author Share Posted August 31, 2015 the native looks for a safe/available position for a ped around the parameter coordinates X Y Z. It returns true if it was able to find a position, and it assigns the coordinates for said position to the "Vector3 *outPosition" pointer-parameter. So you declare a new Vector3 variable for the safe spot and call the function with a pointer to that variable as the "outPosition" parameter, and - if it returns true - the Vector3 you passed it will be filled with the safe-spot coordinatesThanks for the descriptions.The problem is, you can't pass a Vector3 in the parameters. I haven't tested it but Lestium's method seems promising, so I will try. Link to comment Share on other sites More sharing options...
whorse Posted August 31, 2015 Share Posted August 31, 2015 (edited) the native looks for a safe/available position for a ped around the parameter coordinates X Y Z. It returns true if it was able to find a position, and it assigns the coordinates for said position to the "Vector3 *outPosition" pointer-parameter. So you declare a new Vector3 variable for the safe spot and call the function with a pointer to that variable as the "outPosition" parameter, and - if it returns true - the Vector3 you passed it will be filled with the safe-spot coordinates Thanks for the descriptions.The problem is, you can't pass a Vector3 in the parameters. I haven't tested it but Lestium's method seems promising, so I will try. You dont pass it a Vector3; you pass it a pointer to a Vector3 (so have an "&" symbol in front of the parameter). This is why it is able to change the value of "outPosition" when it only returns a boolean (rather than returning a Vector3, as one might expect). Here's a C++ example I've used where a ped (called "ped") parachutes to a safe spot near his target (called "target") Vector3 targetPosition = ENTITY::GET_ENTITY_COORDS(target);Vector3 safeSpot;if (PATHFIND::GET_SAFE_COORD_FOR_PED(targetPosition.x, targetPosition.y, targetPosition.z, true, &safeSpot, 0)) AI::TASK_PARACHUTE_TO_TARGET(ped, safeSpot.x, safeSpot.y, safeSpot.z); the way it works is kind of similar to how the PED::GET_PED_NEARBY_PEDS() native works -- which returns an integer that is the only the total number of nearby peds, but it actually records the IDs of the nearby peds within a pointer array that you have to pass it as one of its parameters Edited August 31, 2015 by whorse Link to comment Share on other sites More sharing options...
GeorgeZhang Posted August 31, 2015 Author Share Posted August 31, 2015 the native looks for a safe/available position for a ped around the parameter coordinates X Y Z. It returns true if it was able to find a position, and it assigns the coordinates for said position to the "Vector3 *outPosition" pointer-parameter. So you declare a new Vector3 variable for the safe spot and call the function with a pointer to that variable as the "outPosition" parameter, and - if it returns true - the Vector3 you passed it will be filled with the safe-spot coordinates Thanks for the descriptions.The problem is, you can't pass a Vector3 in the parameters. I haven't tested it but Lestium's method seems promising, so I will try. You dont pass it a Vector3; you pass it a pointer to a Vector3 (so have an "&" symbol in front of the parameter). This is why it is able to change the value of "outPosition" when it only returns a boolean (rather than returning a Vector3, as one might expect). Here's a C++ example I've used where a ped (called "ped") parachutes to a safe spot near his target (called "target") Vector3 targetPosition = ENTITY::GET_ENTITY_COORDS(target);Vector3 safeSpot;if (PATHFIND::GET_SAFE_COORD_FOR_PED(targetPosition.x, targetPosition.y, targetPosition.z, true, &safeSpot, 0)) AI::TASK_PARACHUTE_TO_TARGET(ped, safeSpot.x, safeSpot.y, safeSpot.z); the way it works is kind of similar to how the PED::GET_PED_NEARBY_PEDS() native works -- which returns an integer that is the only the total number of nearby peds, but it actually records the IDs of the nearby peds within a pointer array that you have to pass it as one of its parameters I know what you mean with pointers, but .net just won't accept it, it displays errors no matter I pass Vector3/&Vector3, saying it's invalid arguments. I know it works in C++, and I know it returns whether a coords is found or not. Link to comment Share on other sites More sharing options...
GeorgeZhang Posted August 31, 2015 Author Share Posted August 31, 2015 try this Vector3 GET_SAFE_COORD_FOR_PED(Vector3 pos, bool onGround, int flags) { OutputArgument Out = new OutputArgument(); if (Function.Call<bool>(Hash.GET_SAFE_COORD_FOR_PED, pos.X, pos.Y, pos.Z, onGround, Out, flags)) { return Out.GetResult<Vector3>(); } else { return Vector3.Zero; } } Thanks, I guess it worked! Lestium 1 Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now