Advertisement
robotmonkey

SA-MP - Attached Object Ex (attachedobjex.inc)

Apr 12th, 2014
916
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 27.17 KB | None | 0 0
  1. // ============================================================
  2. //              Attached Object Ex (AOX)
  3. //                      by Corekt a.k.a. robotmonkey
  4. //                              © 2014
  5. //
  6. //      ***IMPORTANT***
  7. //      You must include this before any other
  8. //      include that uses SetPlayerAttachedObject or
  9. //      RemovePlayerAttachedObject
  10. //
  11. //      For updates please visit
  12. //            http://forum.sa-mp.com/showthread.php?t=506429
  13. // ============================================================
  14.  
  15. #if !defined _samp_included
  16.     #error You must include a_samp before attachedobjex.
  17. #endif
  18.  
  19. forward _AOX_CheckWeaponZoom(playerid);
  20. forward RemovePlayerTempAttachedObject(playerid, index, aoid);
  21. forward MovePlayerAttachedObject_Timer(playerid, index, aoid, Float:OffsetX1, Float:OffsetY1, Float:OffsetZ1, Float:OffsetX2, Float:OffsetY2, Float:OffsetZ2, Float:Speed, Float:pfactor);
  22.  
  23. // Callbacks
  24. forward OnTempAttachedObjectDestroy(playerid, index);
  25. forward OnPlayerAttachedObjectMoved(playerid, index);
  26.  
  27. enum E_AOX_DATA
  28. {
  29.     eAO_modelid,
  30.     eAO_bone,
  31.     Float:eAO_fOffsetX,
  32.     Float:eAO_fOffsetY,
  33.     Float:eAO_fOffsetZ,
  34.     Float:eAO_fRotX,
  35.     Float:eAO_fRotY,
  36.     Float:eAO_fRotZ,
  37.     Float:eAO_fScaleX,
  38.     Float:eAO_fScaleY,
  39.     Float:eAO_fScaleZ,
  40.     eAO_materialcolor1,
  41.     eAO_materialcolor2,
  42.     eAO_id,
  43.     eAO_idTemp,
  44.     eAO_tempBirth,
  45.     eAO_tempTime,
  46.     bool:eAO_tempRemoved,
  47.     bool:eAO_isMoving
  48. }
  49.  
  50. static
  51.     gAOX_Tickrate = 15,
  52.     gPlayerAO[MAX_PLAYERS][MAX_PLAYER_ATTACHED_OBJECTS][E_AOX_DATA],
  53.     gTempAttachedObjectCount[MAX_PLAYERS],
  54.     gIsPlayerWeaponZoomedIn[MAX_PLAYERS],
  55.     gTimerWeaponZoom[MAX_PLAYERS],
  56.     bool:gAOWeaponZoomEnabled[MAX_PLAYERS],
  57.     bool:gRemoveNormAOWeaponZoom[MAX_PLAYERS];
  58.  
  59. // CALLBACK HOOK
  60. public OnPlayerConnect(playerid)
  61. {
  62.     for (new i = 0; i < MAX_PLAYER_ATTACHED_OBJECTS; i++) {
  63.         RemovePlayerAttachedObject(playerid, i);
  64.         gPlayerAO[playerid][i][eAO_modelid] = INVALID_OBJECT_ID;
  65.         gPlayerAO[playerid][i][eAO_bone] = 0;
  66.         gPlayerAO[playerid][i][eAO_fOffsetX] = 0;
  67.         gPlayerAO[playerid][i][eAO_fOffsetY] = 0;
  68.         gPlayerAO[playerid][i][eAO_fOffsetZ] = 0;
  69.         gPlayerAO[playerid][i][eAO_fRotX] = 0;
  70.         gPlayerAO[playerid][i][eAO_fRotY] = 0;
  71.         gPlayerAO[playerid][i][eAO_fRotZ] = 0;
  72.         gPlayerAO[playerid][i][eAO_fScaleX] = 0;
  73.         gPlayerAO[playerid][i][eAO_fScaleY] = 0;
  74.         gPlayerAO[playerid][i][eAO_fScaleZ] = 0;
  75.         gPlayerAO[playerid][i][eAO_materialcolor1] = 0;
  76.         gPlayerAO[playerid][i][eAO_materialcolor2] = 0;
  77.         gPlayerAO[playerid][i][eAO_id] = 0;
  78.         gPlayerAO[playerid][i][eAO_tempBirth] = 0;
  79.         gPlayerAO[playerid][i][eAO_tempRemoved] = false;
  80.         gPlayerAO[playerid][i][eAO_isMoving] = false;
  81.     }
  82.     gTempAttachedObjectCount[playerid] = 0;
  83.     gIsPlayerWeaponZoomedIn[playerid] = false;
  84.     gAOWeaponZoomEnabled[playerid] = true;
  85.     gRemoveNormAOWeaponZoom[playerid] = false;
  86.     if (funcidx("AOXhook_OnPlayerConnect") != -1) {
  87.         return CallLocalFunction("AOXhook_OnPlayerConnect", "d", playerid);
  88.     }
  89.     return 1;
  90. }
  91. #if defined _ALS_OnPlayerConnect
  92.     #undef OnPlayerConnect
  93. #else
  94.     #define _ALS_OnPlayerConnect
  95. #endif
  96. #define OnPlayerConnect AOXhook_OnPlayerConnect
  97. forward AOXhook_OnPlayerConnect(playerid);
  98.  
  99. public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
  100. {
  101.     if (gAOWeaponZoomEnabled[playerid]) {
  102.         if (((newkeys & (KEY_HANDBRAKE)) == (KEY_HANDBRAKE)) && ((oldkeys & (KEY_HANDBRAKE)) != (KEY_HANDBRAKE)) && !IsPlayerInAnyVehicle(playerid)) {
  103.             if (GetPlayerWeapon(playerid) == WEAPON_SNIPER || GetPlayerWeapon(playerid) == WEAPON_ROCKETLAUNCHER || GetPlayerWeapon(playerid) == WEAPON_HEATSEEKER || GetPlayerWeapon(playerid) == WEAPON_CAMERA) {
  104.                 if (!gIsPlayerWeaponZoomedIn[playerid]) {
  105.                     if (GetAttachedObjectCount(playerid) > 0) {
  106.                         gIsPlayerWeaponZoomedIn[playerid] = true;
  107.                         RemoveAllTempAttachedObjects(playerid);
  108.                         gTimerWeaponZoom[playerid] = SetTimerEx("_AOX_CheckWeaponZoom", 500, true, "d", playerid);
  109.                     } else {
  110.                         for (new i = 0; i < MAX_PLAYER_ATTACHED_OBJECTS; i++) {
  111.                             gPlayerAO[playerid][i][eAO_modelid] = INVALID_OBJECT_ID;
  112.                             gPlayerAO[playerid][i][eAO_bone] = 0;
  113.                             gPlayerAO[playerid][i][eAO_fOffsetX] = 0;
  114.                             gPlayerAO[playerid][i][eAO_fOffsetY] = 0;
  115.                             gPlayerAO[playerid][i][eAO_fOffsetZ] = 0;
  116.                             gPlayerAO[playerid][i][eAO_fRotX] = 0;
  117.                             gPlayerAO[playerid][i][eAO_fRotY] = 0;
  118.                             gPlayerAO[playerid][i][eAO_fRotZ] = 0;
  119.                             gPlayerAO[playerid][i][eAO_fScaleX] = 0;
  120.                             gPlayerAO[playerid][i][eAO_fScaleY] = 0;
  121.                             gPlayerAO[playerid][i][eAO_fScaleZ] = 0;
  122.                             gPlayerAO[playerid][i][eAO_materialcolor1] = 0;
  123.                             gPlayerAO[playerid][i][eAO_materialcolor2] = 0;
  124.                             gPlayerAO[playerid][i][eAO_id] = 0;
  125.                             gPlayerAO[playerid][i][eAO_tempBirth] = 0;
  126.                             gPlayerAO[playerid][i][eAO_tempTime] = 0;
  127.                             gPlayerAO[playerid][i][eAO_tempRemoved] = false;
  128.                             gPlayerAO[playerid][i][eAO_isMoving] = false;
  129.                         }
  130.                         gTempAttachedObjectCount[playerid] = 0;
  131.                     }
  132.                 }
  133.             }
  134.         }
  135.     }
  136.     if (funcidx("AOXhook_OnPlayerKeyStateChange") != -1) {
  137.         return CallLocalFunction("AOXhook_OnPlayerKeyStateChange", "ddd", playerid, newkeys, oldkeys);
  138.     }
  139.     return 1;
  140. }
  141. #if defined _ALS_OnPlayerKeyStateChange
  142.     #undef OnPlayerKeyStateChange
  143. #else
  144.     #define _ALS_OnPlayerKeyStateChange
  145. #endif
  146. #define OnPlayerKeyStateChange AOXhook_OnPlayerKeyStateChange
  147. forward AOXhook_OnPlayerKeyStateChange(playerid, newkeys, oldkeys);
  148.  
  149. // =========================================
  150.  
  151. // FUNC HOOK
  152. stock _AOX_SetPlayerAttachedObject(playerid, index, modelid, bone, Float:fOffsetX = 0.0, Float:fOffsetY = 0.0, Float:fOffsetZ = 0.0, Float:fRotX = 0.0, Float:fRotY = 0.0, Float:fRotZ = 0.0, Float:fScaleX = 1.0, Float:fScaleY = 1.0, Float:fScaleZ = 1.0, materialcolor1 = 0, materialcolor2 = 0)
  153. {
  154.     if (index < 0 || index >= MAX_PLAYER_ATTACHED_OBJECTS) return 0; // prevent array index out of bounds exception
  155.    
  156.     new
  157.         bool:replace = false;
  158.        
  159.     if (IsPlayerAttachedObjectSlotUsed(playerid, index)) replace = true;
  160.    
  161.     if (SetPlayerAttachedObject(playerid, index, modelid, bone, fOffsetX, fOffsetY, fOffsetZ, fRotX, fRotY, fRotZ, fScaleX, fScaleY, fScaleZ, materialcolor1, materialcolor2) != 0) {
  162.         if (!replace && !gPlayerAO[playerid][index][eAO_tempRemoved]) gPlayerAO[playerid][index][eAO_id]++;
  163.         gPlayerAO[playerid][index][eAO_modelid] = modelid;
  164.         gPlayerAO[playerid][index][eAO_bone] = bone;
  165.         gPlayerAO[playerid][index][eAO_fOffsetX] = fOffsetX;
  166.         gPlayerAO[playerid][index][eAO_fOffsetY] = fOffsetY;
  167.         gPlayerAO[playerid][index][eAO_fOffsetZ] = fOffsetZ;
  168.         gPlayerAO[playerid][index][eAO_fRotX] = fRotX;
  169.         gPlayerAO[playerid][index][eAO_fRotY] = fRotY;
  170.         gPlayerAO[playerid][index][eAO_fRotZ] = fRotZ;
  171.         gPlayerAO[playerid][index][eAO_fScaleX] = fScaleX;
  172.         gPlayerAO[playerid][index][eAO_fScaleY] = fScaleY;
  173.         gPlayerAO[playerid][index][eAO_fScaleZ] = fScaleZ;
  174.         gPlayerAO[playerid][index][eAO_materialcolor1] = materialcolor1;
  175.         gPlayerAO[playerid][index][eAO_materialcolor2] = materialcolor2;
  176.         return 1;
  177.     } else {
  178.         return 0;
  179.     }
  180. }
  181.  
  182. #if defined _ALS_SetPlayerAttachedObject
  183.         #undef SetPlayerAttachedObject
  184. #else
  185.         #define _ALS_SetPlayerAttachedObject
  186. #endif
  187. #define SetPlayerAttachedObject _AOX_SetPlayerAttachedObject
  188.  
  189. stock _AOX_RemovePlayerAttachedObject(playerid, index)
  190. {
  191.     if (index < 0 || index >= MAX_PLAYER_ATTACHED_OBJECTS) return 0; // prevent array index out of bounds exception
  192.  
  193.     if (!gPlayerAO[playerid][index][eAO_tempRemoved]) {
  194.         if (gPlayerAO[playerid][index][eAO_tempBirth] != 0) {
  195.             gTempAttachedObjectCount[playerid]--;
  196.         }
  197.        
  198.         gPlayerAO[playerid][index][eAO_modelid] = INVALID_OBJECT_ID;
  199.         gPlayerAO[playerid][index][eAO_bone] = 0;
  200.         gPlayerAO[playerid][index][eAO_fOffsetX] = 0;
  201.         gPlayerAO[playerid][index][eAO_fOffsetY] = 0;
  202.         gPlayerAO[playerid][index][eAO_fOffsetZ] = 0;
  203.         gPlayerAO[playerid][index][eAO_fRotX] = 0;
  204.         gPlayerAO[playerid][index][eAO_fRotY] = 0;
  205.         gPlayerAO[playerid][index][eAO_fRotZ] = 0;
  206.         gPlayerAO[playerid][index][eAO_fScaleX] = 0;
  207.         gPlayerAO[playerid][index][eAO_fScaleY] = 0;
  208.         gPlayerAO[playerid][index][eAO_fScaleZ] = 0;
  209.         gPlayerAO[playerid][index][eAO_materialcolor1] = 0;
  210.         gPlayerAO[playerid][index][eAO_materialcolor2] = 0;
  211.         gPlayerAO[playerid][index][eAO_tempBirth] = 0;
  212.         gPlayerAO[playerid][index][eAO_tempTime] = 0;
  213.         gPlayerAO[playerid][index][eAO_isMoving] = false;
  214.     }
  215.  
  216.     return RemovePlayerAttachedObject(playerid, index);
  217. }
  218.  
  219. #if defined _ALS_RemovePlayerAttachedObject
  220.     #undef RemovePlayerAttachedObject
  221. #else
  222.     #define _ALS_RemovePlayerAttachedObject
  223. #endif
  224. #define RemovePlayerAttachedObject _AOX_RemovePlayerAttachedObject
  225.  
  226. // ==========================================================
  227.  
  228. stock AOX_GetTickRate()
  229. {
  230.     return gAOX_Tickrate;
  231. }
  232.  
  233. stock AOX_SetTickRate(tickrate)
  234. {
  235.     gAOX_Tickrate = tickrate;
  236. }
  237.  
  238. stock IsPlayerAttachedObjectTemp(playerid, index)
  239. {
  240.     return (gPlayerAO[playerid][index][eAO_tempBirth] != 0) ? true : false;
  241. }
  242.  
  243. stock GetFreePlayerAttachedObjectSlot(playerid)
  244. {
  245.     for (new i = 0; i < MAX_PLAYER_ATTACHED_OBJECTS; i++) {
  246.         if (!IsPlayerAttachedObjectSlotUsed(playerid, i))
  247.             return i;
  248.     }
  249.     return -1;
  250. }
  251.  
  252. stock GetTempAttachedObjectCount(playerid)
  253. {
  254.     return (!GetAttachedObjectCount(playerid)) ? 0 : gTempAttachedObjectCount[playerid];
  255. }
  256.  
  257. stock GetAttachedObjectCount(playerid)
  258. {
  259.     new count;
  260.     for (new i = 0; i < MAX_PLAYER_ATTACHED_OBJECTS; i++) {
  261.         if (IsPlayerAttachedObjectSlotUsed(playerid, i))
  262.             count++;
  263.     }
  264.     return count;
  265. }
  266.  
  267. stock GetPlayerAttachedObjectID(playerid, index)
  268. {
  269.     if (!IsPlayerAttachedObjectSlotUsed(playerid, index) && !gPlayerAO[playerid][index][eAO_tempRemoved])
  270.         return -1;
  271.     return (gPlayerAO[playerid][index][eAO_tempBirth] != 0) ? gPlayerAO[playerid][index][eAO_id] : -1;
  272. }
  273.  
  274. stock GetPlayerAttachedObjectBone(playerid, index)
  275. {
  276.     if (!IsPlayerAttachedObjectSlotUsed(playerid, index) && !gPlayerAO[playerid][index][eAO_tempRemoved])
  277.         return 0;
  278.     return gPlayerAO[playerid][index][eAO_bone];
  279. }
  280.  
  281. stock SetPlayerAttachedObjectBone(playerid, index, bone)
  282. {
  283.     if (!IsPlayerAttachedObjectSlotUsed(playerid, index))
  284.         return 0;
  285.        
  286.     gPlayerAO[playerid][index][bone] = bone;
  287.        
  288.     SetPlayerAttachedObject(playerid, index,
  289.         gPlayerAO[playerid][index][eAO_modelid], gPlayerAO[playerid][index][bone],
  290.         gPlayerAO[playerid][index][eAO_fOffsetX], gPlayerAO[playerid][index][eAO_fOffsetY], gPlayerAO[playerid][index][eAO_fOffsetZ],
  291.         gPlayerAO[playerid][index][eAO_fRotX], gPlayerAO[playerid][index][eAO_fRotY], gPlayerAO[playerid][index][eAO_fRotZ],
  292.         gPlayerAO[playerid][index][eAO_fScaleX], gPlayerAO[playerid][index][eAO_fScaleY], gPlayerAO[playerid][index][eAO_fScaleZ],
  293.         gPlayerAO[playerid][index][eAO_materialcolor1], gPlayerAO[playerid][index][eAO_materialcolor2]);
  294.     return 1;
  295. }
  296.  
  297. stock GetPlayerAttachedObjectModel(playerid, index)
  298. {
  299.     if (!IsPlayerAttachedObjectSlotUsed(playerid, index) && !gPlayerAO[playerid][index][eAO_tempRemoved])
  300.         return INVALID_OBJECT_ID;
  301.     return gPlayerAO[playerid][index][eAO_modelid];
  302. }
  303.  
  304. stock SetPlayerAttachedObjectModel(playerid, index, modelid)
  305. {
  306.     if (!IsPlayerAttachedObjectSlotUsed(playerid, index))
  307.         return 0;
  308.        
  309.     gPlayerAO[playerid][index][eAO_modelid] = modelid;
  310.        
  311.     SetPlayerAttachedObject(playerid, index,
  312.         gPlayerAO[playerid][index][eAO_modelid], gPlayerAO[playerid][index][eAO_bone],
  313.         gPlayerAO[playerid][index][eAO_fOffsetX], gPlayerAO[playerid][index][eAO_fOffsetY], gPlayerAO[playerid][index][eAO_fOffsetZ],
  314.         gPlayerAO[playerid][index][eAO_fRotX], gPlayerAO[playerid][index][eAO_fRotY], gPlayerAO[playerid][index][eAO_fRotZ],
  315.         gPlayerAO[playerid][index][eAO_fScaleX], gPlayerAO[playerid][index][eAO_fScaleY], gPlayerAO[playerid][index][eAO_fScaleZ],
  316.         gPlayerAO[playerid][index][eAO_materialcolor1], gPlayerAO[playerid][index][eAO_materialcolor2]);
  317.     return 1;
  318. }
  319.  
  320. stock GetPlayerAttachedObjectOffset(playerid, index, &Float:fOffsetX, &Float:fOffsetY, &Float:fOffsetZ)
  321. {
  322.     if (!IsPlayerAttachedObjectSlotUsed(playerid, index) && !gPlayerAO[playerid][index][eAO_tempRemoved])
  323.         return 0;
  324.    
  325.     fOffsetX = gPlayerAO[playerid][index][eAO_fOffsetX];
  326.     fOffsetY = gPlayerAO[playerid][index][eAO_fOffsetY];
  327.     fOffsetZ = gPlayerAO[playerid][index][eAO_fOffsetZ];
  328.     return 1;
  329. }
  330.  
  331. stock SetPlayerAttachedObjectOffset(playerid, index, Float:fOffsetX, Float:fOffsetY, Float:fOffsetZ)
  332. {
  333.     if (!IsPlayerAttachedObjectSlotUsed(playerid, index) || gPlayerAO[playerid][index][eAO_isMoving])
  334.         return 0;
  335.        
  336.     gPlayerAO[playerid][index][eAO_fOffsetX] = fOffsetX;
  337.     gPlayerAO[playerid][index][eAO_fOffsetY] = fOffsetY;
  338.     gPlayerAO[playerid][index][eAO_fOffsetZ] = fOffsetZ;
  339.        
  340.     SetPlayerAttachedObject(playerid, index,
  341.         gPlayerAO[playerid][index][eAO_modelid], gPlayerAO[playerid][index][eAO_bone],
  342.         gPlayerAO[playerid][index][eAO_fOffsetX], gPlayerAO[playerid][index][eAO_fOffsetY], gPlayerAO[playerid][index][eAO_fOffsetZ],
  343.         gPlayerAO[playerid][index][eAO_fRotX], gPlayerAO[playerid][index][eAO_fRotY], gPlayerAO[playerid][index][eAO_fRotZ],
  344.         gPlayerAO[playerid][index][eAO_fScaleX], gPlayerAO[playerid][index][eAO_fScaleY], gPlayerAO[playerid][index][eAO_fScaleZ],
  345.         gPlayerAO[playerid][index][eAO_materialcolor1], gPlayerAO[playerid][index][eAO_materialcolor2]);
  346.     return 1;
  347. }
  348.  
  349. stock GetPlayerAttachedObjectRot(playerid, index, &Float:fRotX, &Float:fRotY, &Float:fRotZ)
  350. {
  351.     if (!IsPlayerAttachedObjectSlotUsed(playerid, index) && !gPlayerAO[playerid][index][eAO_tempRemoved])
  352.         return 0;
  353.  
  354.     fRotX = gPlayerAO[playerid][index][eAO_fRotX];
  355.     fRotY = gPlayerAO[playerid][index][eAO_fRotY];
  356.     fRotZ = gPlayerAO[playerid][index][eAO_fRotZ];
  357.     return 1;
  358. }
  359.  
  360. stock SetPlayerAttachedObjectRot(playerid, index, Float:fRotX, Float:fRotY, Float:fRotZ)
  361. {
  362.     if (!IsPlayerAttachedObjectSlotUsed(playerid, index) || gPlayerAO[playerid][index][eAO_isMoving])
  363.         return 0;
  364.        
  365.     gPlayerAO[playerid][index][eAO_fRotX] = fRotX;
  366.     gPlayerAO[playerid][index][eAO_fRotY] = fRotY;
  367.     gPlayerAO[playerid][index][eAO_fRotZ] = fRotZ;
  368.        
  369.     SetPlayerAttachedObject(playerid, index,
  370.         gPlayerAO[playerid][index][eAO_modelid], gPlayerAO[playerid][index][eAO_bone],
  371.         gPlayerAO[playerid][index][eAO_fOffsetX], gPlayerAO[playerid][index][eAO_fOffsetY], gPlayerAO[playerid][index][eAO_fOffsetZ],
  372.         gPlayerAO[playerid][index][eAO_fRotX], gPlayerAO[playerid][index][eAO_fRotY], gPlayerAO[playerid][index][eAO_fRotZ],
  373.         gPlayerAO[playerid][index][eAO_fScaleX], gPlayerAO[playerid][index][eAO_fScaleY], gPlayerAO[playerid][index][eAO_fScaleZ],
  374.         gPlayerAO[playerid][index][eAO_materialcolor1], gPlayerAO[playerid][index][eAO_materialcolor2]);
  375.     return 1;
  376. }
  377.  
  378. stock GetPlayerAttachedObjectScale(playerid, index, &Float:fScaleX, &Float:fScaleY, &Float:fScaleZ)
  379. {
  380.     if (!IsPlayerAttachedObjectSlotUsed(playerid, index) && !gPlayerAO[playerid][index][eAO_tempRemoved])
  381.         return 0;
  382.    
  383.     fScaleX = gPlayerAO[playerid][index][eAO_fScaleX];
  384.     fScaleY = gPlayerAO[playerid][index][eAO_fScaleY];
  385.     fScaleZ = gPlayerAO[playerid][index][eAO_fScaleZ];
  386.     return 1;
  387. }
  388.  
  389. stock SetPlayerAttachedObjectScale(playerid, index, Float:fScaleX, Float:fScaleY, Float:fScaleZ)
  390. {
  391.     if (!IsPlayerAttachedObjectSlotUsed(playerid, index))
  392.         return 0;
  393.        
  394.     gPlayerAO[playerid][index][eAO_fScaleX] = fScaleX;
  395.     gPlayerAO[playerid][index][eAO_fScaleY] = fScaleY;
  396.     gPlayerAO[playerid][index][eAO_fScaleZ] = fScaleZ;
  397.        
  398.     SetPlayerAttachedObject(playerid, index,
  399.         gPlayerAO[playerid][index][eAO_modelid], gPlayerAO[playerid][index][eAO_bone],
  400.         gPlayerAO[playerid][index][eAO_fOffsetX], gPlayerAO[playerid][index][eAO_fOffsetY], gPlayerAO[playerid][index][eAO_fOffsetZ],
  401.         gPlayerAO[playerid][index][eAO_fRotX], gPlayerAO[playerid][index][eAO_fRotY], gPlayerAO[playerid][index][eAO_fRotZ],
  402.         gPlayerAO[playerid][index][eAO_fScaleX], gPlayerAO[playerid][index][eAO_fScaleY], gPlayerAO[playerid][index][eAO_fScaleZ],
  403.         gPlayerAO[playerid][index][eAO_materialcolor1], gPlayerAO[playerid][index][eAO_materialcolor2]);
  404.     return 1;
  405. }
  406.  
  407. stock GetPlayerAttachedObjectColor(playerid, index, &materialcolor1, &materialcolor2)
  408. {
  409.     if (!IsPlayerAttachedObjectSlotUsed(playerid, index) && !gPlayerAO[playerid][index][eAO_tempRemoved]) return 0;
  410.    
  411.     materialcolor1 = gPlayerAO[playerid][index][eAO_materialcolor1];
  412.     materialcolor2 = gPlayerAO[playerid][index][eAO_materialcolor2];
  413.     return 1;
  414. }
  415.  
  416. stock SetPlayerAttachedObjectColor(playerid, index, materialcolor1, materialcolor2)
  417. {
  418.     if (!IsPlayerAttachedObjectSlotUsed(playerid, index))
  419.         return 0;
  420.        
  421.     gPlayerAO[playerid][index][eAO_materialcolor1] = materialcolor1;
  422.     gPlayerAO[playerid][index][eAO_materialcolor2] = materialcolor2;
  423.        
  424.     SetPlayerAttachedObject(playerid, index,
  425.         gPlayerAO[playerid][index][eAO_modelid], gPlayerAO[playerid][index][eAO_bone],
  426.         gPlayerAO[playerid][index][eAO_fOffsetX], gPlayerAO[playerid][index][eAO_fOffsetY], gPlayerAO[playerid][index][eAO_fOffsetZ],
  427.         gPlayerAO[playerid][index][eAO_fRotX], gPlayerAO[playerid][index][eAO_fRotY], gPlayerAO[playerid][index][eAO_fRotZ],
  428.         gPlayerAO[playerid][index][eAO_fScaleX], gPlayerAO[playerid][index][eAO_fScaleY], gPlayerAO[playerid][index][eAO_fScaleZ],
  429.         gPlayerAO[playerid][index][eAO_materialcolor1], gPlayerAO[playerid][index][eAO_materialcolor2]);
  430.     return 1;
  431. }
  432.  
  433. stock GetOldestTempAttachedObject(playerid)
  434. {
  435.     new
  436.         oldestAO = -1,
  437.         oldestTime = -1;
  438.  
  439.     for (new i = 0; i < MAX_PLAYER_ATTACHED_OBJECTS; i++) {
  440.         if (!gPlayerAO[playerid][i][eAO_tempBirth]) continue;
  441.         if (gPlayerAO[playerid][i][eAO_tempBirth] < oldestTime || oldestTime == -1) {
  442.             oldestAO = i;
  443.             oldestTime = gPlayerAO[playerid][i][eAO_tempBirth];
  444.         }
  445.     }
  446.  
  447.     return oldestAO;
  448. }
  449.  
  450. stock GetNewestTempAttachedObject(playerid)
  451. {
  452.     new
  453.         newestAO = -1,
  454.         newestTime = -1;
  455.  
  456.     for (new i = 0; i < MAX_PLAYER_ATTACHED_OBJECTS; i++) {
  457.         if (!gPlayerAO[playerid][i][eAO_tempBirth]) continue;
  458.         if (gPlayerAO[playerid][i][eAO_tempBirth] > newestAO || newestTime == -1) {
  459.             newestAO = i;
  460.             newestTime = gPlayerAO[playerid][i][eAO_tempBirth];
  461.         }
  462.     }
  463.  
  464.     return newestAO;
  465. }
  466.  
  467. stock GetTempAttachedObjectTime(playerid, index)
  468. {
  469.     return gPlayerAO[playerid][index][eAO_tempTime];
  470. }
  471.  
  472. stock ToggleRemoveAOWeaponZoom(playerid, toggle)
  473. {
  474.     gAOWeaponZoomEnabled[playerid] = (toggle) ? true : false;
  475. }
  476.  
  477. stock ToggleRemoveNormAOWeaponZoom(playerid, toggle)
  478. {
  479.     gRemoveNormAOWeaponZoom[playerid] = (toggle) ? true : false;
  480. }
  481.  
  482. stock IsPlayerAttachedObjectMoving(playerid, index)
  483. {
  484.     return (IsPlayerAttachedObjectSlotUsed(playerid, index)) ? gPlayerAO[playerid][index][eAO_isMoving] : false;
  485. }
  486.  
  487. stock SetPlayerTempAttachedObject
  488. (playerid, time, modelid, bone, Float:fOffsetX = 0.0, Float:fOffsetY = 0.0, Float:fOffsetZ = 0.0, Float:fRotX = 0.0, Float:fRotY = 0.0, Float:fRotZ = 0.0, Float:fScaleX = 1.0, Float:fScaleY = 1.0, Float:fScaleZ = 1.0, materialcolor1 = 0, materialcolor2 = 0)
  489. {
  490.     new
  491.         index = GetFreePlayerAttachedObjectSlot(playerid);
  492.    
  493.     if (index == -1) {
  494.         // All slots used
  495.         new
  496.             oldestTemp = GetOldestTempAttachedObject(playerid);
  497.                    
  498.         if (oldestTemp == -1) return -1;
  499.         index = oldestTemp;
  500.         RemovePlayerAttachedObject(playerid, index); // no need for count decrement; hook handles it
  501.     } else {
  502.         gTempAttachedObjectCount[playerid]++;
  503.     }
  504.    
  505.     gPlayerAO[playerid][index][eAO_tempBirth] = gettime();
  506.    
  507.     SetPlayerAttachedObject(playerid, index, modelid, bone, fOffsetX, fOffsetY, fOffsetZ, fRotX, fRotY, fRotZ, fScaleX, fScaleY, fScaleZ, materialcolor1, materialcolor2);
  508.    
  509.     if (time != -1) {
  510.         gPlayerAO[playerid][index][eAO_tempTime] = time;
  511.         SetTimerEx("RemovePlayerTempAttachedObject", time, false, "ddd", playerid, index, gPlayerAO[playerid][index][eAO_id]);
  512.     }
  513.     return index;
  514. }
  515.  
  516. stock RemoveAllTempAttachedObjects(playerid)
  517. {
  518.     if (!gIsPlayerWeaponZoomedIn[playerid]) return 0;
  519.     for (new i = 0; i < MAX_PLAYER_ATTACHED_OBJECTS; i++) {
  520.         if (!IsPlayerAttachedObjectSlotUsed(playerid, i)) continue;
  521.         if (gPlayerAO[playerid][i][eAO_tempBirth] != 0 || gRemoveNormAOWeaponZoom[playerid]) {
  522.             gPlayerAO[playerid][i][eAO_tempRemoved] = true;
  523.             RemovePlayerAttachedObject(playerid, i);
  524.         }
  525.     }
  526.     return 1;
  527. }
  528.  
  529. stock RestoreAllTempAttachedObjects(playerid)
  530. {
  531.     if (!gIsPlayerWeaponZoomedIn[playerid]) return 0;
  532.     for (new i = 0; i < MAX_PLAYER_ATTACHED_OBJECTS; i++) {
  533.         if ((gPlayerAO[playerid][i][eAO_tempBirth] != 0 || gRemoveNormAOWeaponZoom[playerid]) && gPlayerAO[playerid][i][eAO_tempRemoved]) {
  534.             SetPlayerAttachedObject(playerid, i, gPlayerAO[playerid][i][eAO_modelid], gPlayerAO[playerid][i][eAO_bone],
  535.                 gPlayerAO[playerid][i][eAO_fOffsetX], gPlayerAO[playerid][i][eAO_fOffsetY], gPlayerAO[playerid][i][eAO_fOffsetZ],
  536.                 gPlayerAO[playerid][i][eAO_fRotX], gPlayerAO[playerid][i][eAO_fRotY], gPlayerAO[playerid][i][eAO_fRotZ],
  537.                 gPlayerAO[playerid][i][eAO_fScaleX], gPlayerAO[playerid][i][eAO_fScaleY], gPlayerAO[playerid][i][eAO_fScaleZ],
  538.                 gPlayerAO[playerid][i][eAO_materialcolor1], gPlayerAO[playerid][i][eAO_materialcolor2]);
  539.             gPlayerAO[playerid][i][eAO_tempRemoved] = false;
  540.         }
  541.     }
  542.     return 1;
  543. }
  544.  
  545. public _AOX_CheckWeaponZoom(playerid)
  546. {
  547.     if (!gIsPlayerWeaponZoomedIn[playerid]) return 0;
  548.     new camMode = GetPlayerCameraMode(playerid);
  549.  
  550.     if (camMode != 7 && camMode != 8 && camMode != 16 && camMode != 46 && camMode != 51) {
  551.         RestoreAllTempAttachedObjects(playerid);
  552.         gIsPlayerWeaponZoomedIn[playerid] = false;
  553.         KillTimer(gTimerWeaponZoom[playerid]);
  554.     }
  555.     return 1;
  556. }
  557.  
  558. public RemovePlayerTempAttachedObject(playerid, index, aoid)
  559. {
  560.     if (aoid == -1) aoid = GetPlayerAttachedObjectID(playerid, index);
  561.  
  562.     // Avoid conflicts
  563.     if (aoid != gPlayerAO[playerid][index][eAO_id] || !IsPlayerConnected(playerid)) return 0;
  564.    
  565.     new
  566.         bool:setRemove = true;
  567.  
  568.     if (funcidx("OnTempAttachedObjectDestroy") != -1) {
  569.         if (CallLocalFunction("OnTempAttachedObjectDestroy", "dd", playerid, index) == 0 && gPlayerAO[playerid][index][eAO_tempTime] != 0) {
  570.             // Don't remove if callback returns 0 and temp AO has expiry time
  571.             setRemove = false;
  572.         }
  573.     }
  574.     gPlayerAO[playerid][index][eAO_tempRemoved] = false;
  575.    
  576.     if (setRemove) {
  577.         RemovePlayerAttachedObject(playerid, index);
  578.     } else {
  579.         SetTimerEx("RemovePlayerTempAttachedObject", gPlayerAO[playerid][index][eAO_tempTime], false, "ddd", playerid, index, gPlayerAO[playerid][index][eAO_id]);
  580.     }
  581.     return 1;
  582. }
  583.  
  584. // ============= MOVE ATTACHED OBJECT ==============
  585.  
  586. stock MovePlayerAttachedObject(playerid, index, Float:OffsetX, Float:OffsetY, Float:OffsetZ, Float:Speed)
  587. {
  588.     if (!IsPlayerAttachedObjectSlotUsed(playerid, index) || gPlayerAO[playerid][index][eAO_isMoving] || floatcmp(Speed, 0.0) == 0) return 0;
  589.  
  590.     gPlayerAO[playerid][index][eAO_isMoving] = true;
  591.    
  592.     // Begin movement
  593.     SetTimerEx("MovePlayerAttachedObject_Timer", gAOX_Tickrate, false, "dddffffffff", playerid, index, gPlayerAO[playerid][index][eAO_id],
  594.         gPlayerAO[playerid][index][eAO_fOffsetX], gPlayerAO[playerid][index][eAO_fOffsetY], gPlayerAO[playerid][index][eAO_fOffsetZ],
  595.         OffsetX, OffsetY, OffsetZ,
  596.         floatabs(Speed), 0.0);
  597.     return 1;
  598. }
  599.  
  600. public MovePlayerAttachedObject_Timer(playerid, index, aoid, Float:OffsetX1, Float:OffsetY1, Float:OffsetZ1, Float:OffsetX2, Float:OffsetY2, Float:OffsetZ2, Float:Speed, Float:pfactor)
  601. {
  602.     // Avoid conflicts
  603.     if (!IsPlayerConnected(playerid) || !IsPlayerAttachedObjectSlotUsed(playerid, index) || aoid != gPlayerAO[playerid][index][eAO_id] || !gPlayerAO[playerid][index][eAO_isMoving])
  604.         return 0;
  605.    
  606.     new
  607.         Float:newPFact = floatadd(pfactor, floatdiv(Speed, floatdiv(1000, gAOX_Tickrate)));
  608.        
  609.     if (floatcmp(newPFact, 1.0) == 1 || floatcmp(newPFact, 1.0) == 0) {
  610.         // AO has reached its offset destination
  611.         gPlayerAO[playerid][index][eAO_isMoving] = false;
  612.         SetPlayerAttachedObject(playerid, index,
  613.             gPlayerAO[playerid][index][eAO_modelid], gPlayerAO[playerid][index][eAO_bone],
  614.             OffsetX2, OffsetY2, OffsetZ2,
  615.             gPlayerAO[playerid][index][eAO_fRotX], gPlayerAO[playerid][index][eAO_fRotY], gPlayerAO[playerid][index][eAO_fRotZ],
  616.             gPlayerAO[playerid][index][eAO_fScaleX], gPlayerAO[playerid][index][eAO_fScaleY], gPlayerAO[playerid][index][eAO_fScaleZ],
  617.             gPlayerAO[playerid][index][eAO_materialcolor1], gPlayerAO[playerid][index][eAO_materialcolor2]);
  618.         CallLocalFunction("OnPlayerAttachedObjectMoved", "dd", playerid, index);
  619.         return 0;
  620.     }
  621.    
  622.     new
  623.         Float:newOffsetX = floatadd(OffsetX1, newPFact * floatsub(OffsetX2, OffsetX1)),
  624.         Float:newOffsetY = floatadd(OffsetY1, newPFact * floatsub(OffsetY2, OffsetY1)),
  625.         Float:newOffsetZ = floatadd(OffsetZ1, newPFact * floatsub(OffsetZ2, OffsetZ1));
  626.    
  627.     SetPlayerAttachedObject(playerid, index,
  628.         gPlayerAO[playerid][index][eAO_modelid], gPlayerAO[playerid][index][eAO_bone],
  629.         newOffsetX, newOffsetY, newOffsetZ,
  630.         gPlayerAO[playerid][index][eAO_fRotX], gPlayerAO[playerid][index][eAO_fRotY], gPlayerAO[playerid][index][eAO_fRotZ],
  631.         gPlayerAO[playerid][index][eAO_fScaleX], gPlayerAO[playerid][index][eAO_fScaleY], gPlayerAO[playerid][index][eAO_fScaleZ],
  632.         gPlayerAO[playerid][index][eAO_materialcolor1], gPlayerAO[playerid][index][eAO_materialcolor2]);
  633.        
  634.     SetTimerEx("MovePlayerAttachedObject_Timer", gAOX_Tickrate, false, "dddffffffff", playerid, index, aoid,
  635.         OffsetX1, OffsetY1, OffsetZ1, OffsetX2, OffsetY2, OffsetZ2,
  636.         Speed, newPFact);
  637.        
  638.     return 1;
  639. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement