[REL] Math Plugin -
JernejL - 20.07.2011
This is in a beta / work in progress state (thinking what to add, making test cases, etc..), so current natives contained are - this is the include itself:
MathPlugin.inc 1.1
pawn Код:
// game helpers native Float:MPDistanceCameraToLocation
(Float:CamX,
Float:CamY,
Float:CamZ,
Float:ObjX,
Float:ObjY,
Float:ObjZ,
Float:FrX,
Float:FrY,
Float:FrZ
);
// calculates how distant target aim is from camera data pointed towards a certain point native Float:MPGetVehicleUpsideDown
(vehicleid
);
// returns values such as 1.0 as pointing up, -1.0 is totally upside down. returns -5.0 if car id is not 1..2000. native MPGetAimTarget
(PlayerID,
Float:SeekRadius
= 50.0);
// returns player that this player is aiming at or invalid player id if no player in target area. native MPGetTrailerTowingVehicle
(vehicleid
);
// finds the vehicle that this trailer is attached to, returns invalid_vehicle_id if invalid or not attached to any towing vehicle. native MPGetVehicleDriver
(vehicleid
);
// gets vehicle driver id or invalid player id - does a quick reverse vehicle to player id lookup. native MPGetVehicleDriverCount
(vehicleid
);
// returns number of drivers a car has (important to solve 2 drivers 1 car issue - if you wrote any decent anticheat you know what i mean) native MPGetVehicleOccupantCnt
(vehicleid
);
// returns number of player a vehicle is carrying native MPGetVehicleSurfersCnt
(vehicleid
);
// returns number of players surfing a vehicle native MPProjectPointOnVehicle
(vehicleid,
Float:v1x,
Float:v1y,
Float:v1z,
&Float:resx,
&Float:resy,
&Float:resz, worldspace
= 0);
// projects a point on vehicle's rotation on all 3 axes. native MPProjectPointOnPlayer
(playerid,
Float:v1x,
Float:v1y,
Float:v1z,
&Float:resx,
&Float:resy,
&Float:resz
);
// projects a point on player's facing angle (x - sideways, y front/back, z = up/down). // pure math native Float:FMPVecLength
(Float:v1x,
Float:v1y,
Float:v1z
);
// calculates length of a simple XYZ 3d vector (FAST,less precision) native Float:MPClamp360
(Float:value
);
native Float:MPDistance
(Float:v1x,
Float:v1y,
Float:v1z,
Float:v2x,
Float:v2y,
Float:v2z
);
// distance between 2 points native Float:MPDistancePointLine
(Float:PointX,
Float:PointY,
Float:PointZ,
Float:LineSx,
Float:LineSy,
Float:LineSz,
Float:LineEx,
Float:LineEy,
Float:LineEz
);
// http://paulbourke.net/geometry/pointline/ returns super huge number 10000000 if outside of range of specified the lie segment. native Float:MPDotProduct
(Float:v1x,
Float:v1y,
Float:v1z,
Float:v2x,
Float:v2y,
Float:v2z
);
native Float:MPFDistance
(Float:v1x,
Float:v1y,
Float:v1z,
Float:v2x,
Float:v2y,
Float:v2z
);
// distance between 2 points (faster but less precise) native Float:MPFSQRT
(Float:value
);
// Faster sqrt (****** the 0x5f3759df method) native Float:MPVecLength
(Float:v1x,
Float:v1y,
Float:v1z
);
// calculates length of a simple XYZ 3d vector native MPCrossProduct
(Float:v1x,
Float:v1y,
Float:v1z,
Float:v2x,
Float:v2y,
Float:v2z,
&Float:resx,
&Float:resy,
&Float:resz
);
native MPFNormalize
(&Float:vx,
&Float:vy,
&Float:vz
);
// fast float normalization of a vector to unit-length (makes whatever vector 1.0 long, purely to preserve direction and be able to scale it controllably) native MPInterpolatePoint
(Float:v1x,
Float:v1y,
Float:v1z,
Float:v2x,
Float:v2y,
Float:v2z,
&Float:resx,
&Float:resy,
&Float:resz,
Float:distance
);
native MPFloatIsFinite
(Float:in
);
// returns 1 if floating point is finite (when it is NOT NaN or INF) native Float:MPFiniteFloat
(Float:in,
Float:alternative
= 0.0);
// returns the same floating point as received, but if the number is not finite (INF / NaN) it will return the second parameter. native Float:MPReturnInf
(positive
);
// returns a invalid float - infinite (+inf / -inf) native Float:MPReturnNan
(positive
);
// returns a invalid float - NaN (+NaN / -NaN)
There's some advanced stuff.
I'm sure everyone will appreciate the benefits of running this in native C code for greater speed and convinience of the new functions.
I am building this extra auxilary math plugin for sa-mp servers, I'm also accepting (serious, realistic) ideas on what you guys use a lot and is really tedious ( in similar philosophy like MPGetVehicleDriver reverse lookup function )
A test build of the plugin is availible here:
http://www.mathpudding.com/topsecretsamp/MathPlugin.dll (FIXED: no more dependancies on stdlib)
http://www.mathpudding.com/topsecretsamp/MathPlugin.so (32 bit linux plugin)
Big thanks to Zeex for helping out with the plugin, his new GDK was instrumental in speeding up this plugin.
Grab copy of code from https://github.com/JernejL/samp-mp and compile - code::blocks works ok for windows, you will also need a copy of Zeex's samp GDK: https://github.com/Zeex/sampgdk . Linux makefile is included too.
If you experience script crashes / glitches after compiling this on your own (happens rarely, only with specific scripts), make these changes to sampgdk, the binaries provided above already come with these modifications:
Код:
In wrapper.cpp comment this out:
//sampgdk::InitializeCallbacks();
amxapihooks.cpp - comment this out:
//amxFindPublicHook.Install(amxExportsTable[PLUGIN_AMX_EXPORT_FindPublic], (void*)FindPublic);
//amxExecHook.Install(amxExportsTable[PLUGIN_AMX_EXPORT_Exec], (void*)Exec);
- Update on 13 august:
fixed MPGetVehicleOccupantCnt (it only counted drivers)
added MPGetVehicleSurfersCnt
added MPProjectPointOnPlayer
- Update on 25 march 2015:
native MPFloatIsFinite(Float:in); // returns 1 if floating point is finite (when it is NOT NaN or INF)
native Float:MPFiniteFloat(Float:in, Float:alternative = 0.0); // returns the same floating point as received, but if the number is not finite (INF / NaN) it will return the second parameter.
native Float:MPReturnInf(positive); // returns a invalid float - infinite (+inf / -inf)
native Float:MPReturnNan(positive); // returns a invalid float - NaN (+NaN / -NaN)
Re: WIP Math Plugin -
Calgon - 20.07.2011
Could you create some functions for the vehicle quarternion maths, simplifying it for those who really don't have a clue with maths?
Also, nice work - it sounds like it could be very useful considering that there will be a million suggestions incoming from other people who could do with some extra helpful math functions.
Re: WIP Math Plugin -
JernejL - 20.07.2011
Quote:
Originally Posted by Calg00ne
Could you create some functions for the vehicle quarternion maths, simplifying it for those who really don't have a clue with maths?
|
I already did that - look at MPProjectPointOnVehicle and MPGetVehicleUpsideDown because you didn't look or you are blind..
MPProjectPointOnVehicle can be used to project point on a car at any angle - imagine dropping barrels from trunk or making directional boost.. MPGetVehicleUpsideDown can be used for detecting how upside-down the car is (from 1 totally upwards to 0.0 when on side and -1 as totally flipped over.)
Re: WIP Math Plugin -
Donya - 20.07.2011
Suggestion
pawn Код:
CalculatePointsBetweenPAAndPB(points, Float:PointA[3], Float:PointB[3], Float:Point_return_array);
Quote:
Originally Posted by JernejL
MPProjectPointOnVehicle can be used to project point on a car at any angle - imagine dropping barrels from trunk
|
I hope later on when it's finished you can make an example of dropping barrels, because that's exactly what I've been looking for for like 2-3 months now
Re: WIP Math Plugin -
Calgon - 20.07.2011
Quote:
simplifying it for those who really don't have a clue with maths
|
As I implied, I don't really have a clue with maths, so it's a bit hard to tell when you don't comment the functions or make it obvious from within the function names.
Respuesta: WIP Math Plugin -
clavador - 20.07.2011
The aiming is obstructed by buildings? :O
Re: Respuesta: WIP Math Plugin -
JernejL - 20.07.2011
Quote:
Originally Posted by clavador
The aiming is obstructed by buildings? :O
|
It's not - unfortunately.
Re: WIP Math Plugin -
Kyosaur - 20.07.2011
Nice plugin man, i'll have to take a look at the code later

. I definitely see this helping a lot of people.
Edit oh no download link... guess i'll have to get on IRC :P.
Re: WIP Math Plugin -
Omega-300 - 20.07.2011
It should be like general rule to place code in some Revision Control System either your own or public one like ******code or github or similar because otherwise it is hard to make contributions to it.
Re: WIP Math Plugin -
Gamer_Z - 20.07.2011
what is the irc address port?
Re: WIP Math Plugin -
Jay_ - 20.07.2011
An efficient version of GetDistanceToPoint would be nice, since floatsqroot in PAWN is _slow_
Re: WIP Math Plugin -
gamer931215 - 20.07.2011
Looks nice, most of the functions existed already though on the sa-mp forums. Is this really a lot faster as in pawn ?
Anyway i dont need it at the moment, but if start working on some gamemode in the future i will probally use this

!
Re: WIP Math Plugin -
JernejL - 20.07.2011
Quote:
Originally Posted by Jay_
An efficient version of GetDistanceToPoint would be nice, since floatsqroot in PAWN is _slow_
|
Ok, i added a few more based on your ideas:
MPInterpolatePoint - as suggested by Donya
MPDistance - a bit faster distance check
MPClamp360 - in-wraps angle number to a value to 0..360 range, (preserving direction, uses the wanted range)
MPFSQRT - wrapper for 0x5f3759df fsqrt
MPFDistance - even faster distance check (uses fastsqrt - ****** for 0x5f3759df )
MPFNormalize - 0x5f3759df fsqrt powered version of vector normalization
Any other good ideas?
Re: WIP Math Plugin -
Mauzen - 20.07.2011
Nice idea, this will become handy when optimizing scripts (unfortuantely not many people do that

)
Edit: ignore my suggestion, just realized it is already implemented.
Re: WIP Math Plugin -
JernejL - 20.07.2011
Quote:
Originally Posted by ******
There's MPCrossProduct, why not MPDotProduct? Also intersection functions would be useful, for example checking if a line and a circle/sphere/cylinder interact.
|
Cause noone asked for it yet, added it now.
There is already line/circle function, it's called MPDistancePointLine - circle / radius is just part of distance equation there.
As for extra formulas - cylinder etc.. checks, the plugin will be GPL'd on release, so you will be able to contribute to it.
Re: WIP Math Plugin -
linuxthefish - 20.07.2011
What dose this actually do, and why would it be useful?
Quote:
Originally Posted by Calg00ne
As I implied, I don't really have a clue with maths, so it's a bit hard to tell when you don't comment the functions or make it obvious from within the function names.
|
Lies.
Re: WIP Math Plugin -
Famalamalam - 20.07.2011
JernejL, I think you are a hero if you can accomplish this.
Re: WIP Math Plugin -
JernejL - 20.07.2011
Quote:
Originally Posted by linuxthefish
What dose this actually do, and why would it be useful?
|
WOULD YOU PLEASE READ THE FIRST POST NEXT TIME BEFORE POSTING? IT WILL MAKE YOU LOOK LESS IGNORANT. THANK YOU.
Famalamalam: plugin is already working, if you want to test it before release just let me know.
Re: WIP Math Plugin -
Whitetiger - 21.07.2011
Quote:
native MPGetAimTarget(PlayerID); // returns player that this player is aiming at or invalid player id if no player in target area.
|
Is this more accurate than the other ways of detecting who is being aimed at? Can this be used as a viable option to detect damage each player has dealt to other players?
Re: WIP Math Plugin -
linuxthefish - 21.07.2011
Quote:
Originally Posted by JernejL
WOULD YOU PLEASE READ THE FIRST POST NEXT TIME BEFORE POSTING? IT WILL MAKE YOU LOOK LESS IGNORANT. THANK YOU.
|
I have no capslock, or i would be shouting. I understand the game helpers, but how is the maths bit useful? Any examples?