When i am not complete wrong, its just the x,y,z of the crane +offsetX, +offsetY, +offsetZ of the magnet
|
Assuming the crane rotates, you need trigonometry. Look up how to find a point on a circle.
|
new Float:x;
new Float:y;
new Float:z;
new Float:PlayerFacingAngle;
new const Float:DISTANCE = 3.0;
GetPlayerFacingAngle(playerid, PlayerFacingAngle);
PlayerFacingAngle = PlayerFacingAngle-180.0;
new Float:F_FLOATSIN = floatsin(-PlayerFacingAngle, degrees);
new Float:F_FLOATCOS = floatcos(-PlayerFacingAngle, degrees);
F_FLOATSIN = -F_FLOATSIN;
F_FLOATCOS = -F_FLOATCOS;
GetPlayerPos(playerid, x, y ,z);
CreateExplosion(x + DISTANCE * F_FLOATSIN, y + DISTANCE * F_FLOATCOS, z, 6, 0);
Maybe you need this exact same thing: https://sampforum.blast.hk/showthread.php?tid=586841.
|
Thank you verry much!
Now, I need to know real rotations of attached object. |
AttachPoint(Float:offx, Float:offy, Float:offz, Float:offrx, Float:offry, Float:offrz, Float:px, Float:py, Float:pz, Float:prx, Float:pry, Float:prz, &Float:RetX, &Float:RetY, &Float:RetZ, &Float:RetRX, &Float:RetRY, &Float:RetRZ, sync_rotation = 1)
I did something like: https://i.imgur.com/KQYZLSn.png, for test.. but, don`t work. Returns is only attached offsets of magnet. What`s wrong in my code?
Thank you for your response! @Pottus |
Because you are using two sets of offsets that is not that this function does! You need to calculate from a static XYZ/RXRYRZ point for this to work.
|
values 1: 0.000000 0.000000 -0.009998 -0.469998 0.000000 90.000000 // offsets of crane cabine values ret: -383.852844 1154.011108 -0.009998 -0.469991 0.000000 136.199996 // returned by function
-1541.100219,130.634063,26.704730,0.000000,0.000000,46.199996 // position of crane base (CreateDynamicObject)
You messed up you are passing rotation values for position and rotation.
@Edit Show me your attached offset positions. |
AttachDynamicObjectToObject_lnx(cabina, baza, 0.000000,0.000000,-0.009999,-0.469999,0.000000,90.000000); // cabine to base AttachDynamicObjectToObject_lnx(brat, cabina, 0.000000,-2.069998,8.448098,0.000000,0.000000,0.000000); // crane-arm (i think) to cabine AttachDynamicObjectToObject_lnx(cablu0, brat, 0.000000,36.869819,-0.569999,0.000000,0.000000,0.000000); // cable to arm AttachDynamicObjectToObject_lnx(magnet, cablu0, 0.000000, 0.000000,-7.440086,0.000000,0.000000,0.000000); // magnet to cable AttachDynamicObjectToObject_lnx(cablu1, magnet, 0.000000, 0.000000,7.440086,0.000000,0.000000,0.000000); // suplimentary cable for "effect go-down"
// List of attached objects to the base we need to calculate sequentially in // order to figure out the position of the last attached object static Float:CraneOffsets[6][6] = { { 0.000000,0.000000,-0.009999,-0.469999,0.000000,90.000000 },// cabine to base { 0.000000,-2.069998,8.448098,0.000000,0.000000,0.000000 },// crane-arm (i think) to cabine { 0.000000,36.869819,-0.569999,0.000000,0.000000,0.000000 },// cable to arm { 0.000000, 0.000000,-7.440086,0.000000,0.000000,0.000000 },// magnet to cable { 0.000000, 0.000000,7.440086,0.000000,0.000000,0.000000 }// suplimentary cable for "effect go-down" }; FindCraneOffset() { // Get the position of the cranebase (unless it doesn't change you can set this) new Float:ret[6]; GetDynamicObjectPos(ret[0], ret[1], ret[2]); GetDynamicObjectRot(ret[3], ret[4], ret[5]); // The first return reference is of course the base! for(new i = 0; i < 6; i++) { // Loop through each offset and rotation calculate real world position AttachPoint(CraneOffsets[i][0], CraneOffsets[i][1], CraneOffsets[i][2], CraneOffsets[i][3], CraneOffsets[i][4], CraneOffsets[i][5], ret[0], ret[1], ret[2], ret[3], ret[4], ret[5], ret[0], ret[1], ret[2], ret[3], ret[4], ret[5]); } return 1; }
Show me the values basepos[]
@Edit I also noticed you are attaching objects to object to object etc.. that means you need to rotate the point several times! Using the result as the next point of reference and translating the offsets to the next position rotation. It sounds complicated but it's very easy. Код:
// List of attached objects to the base we need to calculate sequentially in // order to figure out the position of the last attached object static Float:CraneOffsets[6][6] = { { 0.000000,0.000000,-0.009999,-0.469999,0.000000,90.000000 },// cabine to base { 0.000000,-2.069998,8.448098,0.000000,0.000000,0.000000 },// crane-arm (i think) to cabine { 0.000000,36.869819,-0.569999,0.000000,0.000000,0.000000 },// cable to arm { 0.000000, 0.000000,-7.440086,0.000000,0.000000,0.000000 },// magnet to cable { 0.000000, 0.000000,7.440086,0.000000,0.000000,0.000000 }// suplimentary cable for "effect go-down" }; FindCraneOffset() { // Get the position of the cranebase (unless it doesn't change you can set this) new Float:ret[6]; GetDynamicObjectPos(ret[0], ret[1], ret[2]); GetDynamicObjectRot(ret[3], ret[4], ret[5]); // The first return reference is of course the base! for(new i = 0; i < 6; i++) { // Loop through each offset and rotation calculate real world position AttachPoint(CraneOffsets[i][0], CraneOffsets[i][1], CraneOffsets[i][2], CraneOffsets[i][3], CraneOffsets[i][4], CraneOffsets[i][5], ret[0], ret[1], ret[2], ret[3], ret[4], ret[5], ret[0], ret[1], ret[2], ret[3], ret[4], ret[5]); } return 1; } Now you need to calculate the real world position of the first object based on it's offsets and rotation. Then the next based off the last... etc... Get it? Maybe? Sort of? You also might not have to do all the objects only up to where you need to but that is how it is done. |
I told you what you need to do but I know there is something you are over looking. How am I supposed to know without seeing all the code ?
|