Advertisement
Guest User

Attach3DTextLabelToObject (c) by Kaliber

a guest
Feb 24th, 2015
951
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.87 KB | None | 0 0
  1. /* SA-MP Include Attach3DTextLabelToObject
  2.  *
  3.  * (c) by Kaliber, 2015
  4.  *
  5.  */
  6. #if !defined _samp_included
  7.     #include <a_samp>
  8. #endif
  9. #if defined _samp_attach
  10.     #endinput
  11. #endif
  12. #define _samp_attach
  13. #if !defined MAX_LABEL_TEXT
  14.     #define MAX_LABEL_TEXT 128
  15. #endif
  16. #define std(%0) %0[0]='\0'
  17. #define Push(%0,%1) std(%0),strcat(%0,%1,0x80)
  18. #define A:: A_Q_Z_
  19. /*
  20.     native Attach3DTextLabelToObject(Text3D:id, objectid, Float:OffsetX, Float:OffsetY, Float:OffsetZ);
  21.     native Detach3DTextLabel(Text3D:id);
  22.    
  23.     native AttachPlayer3DTextLabelToObject(playerid, PlayerText3D:id, objectid, Float:OffsetX, Float:OffsetY, Float:OffsetZ);
  24.     native DetachPlayer3DTextLabel(PlayerText3D:id);
  25. */
  26. #if defined FILTERSCRIPT
  27.     forward Attach_OnFilterScriptInit();
  28. #else
  29.     forward Attach_OnGameModeInit();
  30. #endif
  31. native Text3D:__Create3DTextLabel(text[], color, Float:X, Float:Y, Float:Z, Float:DrawDistance, virtualworld, testLOS) = Create3DTextLabel;
  32. native __Update3DTextLabelText(Text3D:id, color, text[]) = Update3DTextLabelText;
  33. native __Delete3DTextLabel(Text3D:id) = Delete3DTextLabel;
  34.  
  35. native PlayerText3D:__CreatePlayer3DTextLabel(playerid,text[],color,Float:X,Float:Y,Float:Z,Float:DrawDistance,attachedplayer,attachedvehicle,testLOS) = CreatePlayer3DTextLabel;
  36. native __UpdatePlayer3DTextLabelText(playerid, PlayerText3D:id, color, text[]) = UpdatePlayer3DTextLabelText;
  37. native __DeletePlayer3DTextLabel(playerid, PlayerText3D:id) = DeletePlayer3DTextLabel;
  38. enum A::P {
  39.     A::text[MAX_LABEL_TEXT],A::color,Float:A::X,Float:A::Y,Float:A::Z,Float:A::f[3],Float:A::Draw,A::World,A::Los,A::attached,A::player,A::flag
  40. };
  41. static A::Q[MAX_3DTEXT_GLOBAL][A::P],flag=-1;
  42.  
  43. stock Text3D:_Create3DTextLabel(text[], color, Float:X, Float:Y, Float:Z, Float:DrawDistance, virtualworld=0, testLOS=0) {
  44.     flag++,Push(A::Q[flag][A::text],text),A::Q[flag][A::color]=color,A::Q[flag][A::X]=X,A::Q[flag][A::Y]=Y,A::Q[flag][A::Z]=Z,A::Q[flag][A::Draw]=DrawDistance;
  45.     A::Q[flag][A::flag]=_:__Create3DTextLabel(text,color,X,Y,Z,DrawDistance,virtualworld,testLOS);
  46.     return A::Q[flag][A::World]=virtualworld,A::Q[flag][A::Los]=testLOS,A::Q[flag][A::player]=-1,Text3D:A::Q[flag][A::flag];
  47. }
  48. #if defined _ALS_Create3DTextLabel
  49.     #undef Create3DTextLabel
  50. #else
  51.     #define _ALS_Create3DTextLabel
  52. #endif
  53. #define Create3DTextLabel _Create3DTextLabel
  54. stock PlayerText3D:_CreatePlayer3DTextLabel(playerid,text[],color,Float:X,Float:Y,Float:Z,Float:DrawDistance,attachedplayer=INVALID_PLAYER_ID,attachedvehicle=INVALID_VEHICLE_ID,testLOS=0) {
  55.     if(!IsPlayerConnected(playerid)) return PlayerText3D:INVALID_PLAYER_ID;
  56.     flag++,Push(A::Q[flag][A::text],text),A::Q[flag][A::color] = color,A::Q[flag][A::X] = X,A::Q[flag][A::Y] = Y,A::Q[flag][A::Z] = Z,A::Q[flag][A::Draw] = DrawDistance;
  57.     A::Q[flag][A::flag] = _:__CreatePlayer3DTextLabel(playerid,text,color,X,Y,Z,DrawDistance,attachedplayer,attachedvehicle,testLOS);
  58.     return A::Q[flag][A::Los] = testLOS,PlayerText3D:A::Q[flag][A::flag];
  59. }
  60. #if defined _ALS_CreatePlayer3DTextLabel
  61.     #undef CreatePlayer3DTextLabel
  62. #else
  63.     #define _ALS_CreatePlayer3DTextLabel
  64. #endif
  65. #define CreatePlayer3DTextLabel _CreatePlayer3DTextLabel
  66. stock _Update3DTextLabelText(Text3D:id, color, text[]) {
  67.     new tmp = A::H(id);
  68.     if(tmp == INVALID_3DTEXT_ID) return 0;
  69.     return Push(A::Q[tmp][A::text],text),A::Q[tmp][A::color]=color,__Update3DTextLabelText(id,color,text);
  70. }
  71. #if defined _ALS_Update3DTextLabelText
  72.     #undef Update3DTextLabelText
  73. #else
  74.     #define _ALS_Update3DTextLabelText
  75. #endif
  76. #define Update3DTextLabelText _Update3DTextLabelText
  77. stock _UpdatePlayer3DTextLabelText(playerid, PlayerText3D:id, color, text[]) {
  78.     new tmp = A::G(id);
  79.     if(tmp == INVALID_3DTEXT_ID) return 0;
  80.     return Push(A::Q[tmp][A::text],text),A::Q[tmp][A::color]=color,__UpdatePlayer3DTextLabelText(playerid,id,color,text);
  81. }
  82. #define UpdatePlayer3DTextLabelText _UpdatePlayer3DTextLabelText
  83. stock _Delete3DTextLabel(Text3D:id) {
  84.     new tmp = A::H(id);
  85.     if(tmp == INVALID_3DTEXT_ID) return 0;
  86.     return std(A::Q[tmp][A::text]),A::Q[tmp][A::attached]=0,__Delete3DTextLabel(id);
  87. }
  88. #if defined _ALS_Delete3DTextLabel
  89.     #undef Delete3DTextLabel
  90. #else
  91.     #define _ALS_Delete3DTextLabel
  92. #endif
  93. #define Delete3DTextLabel _Delete3DTextLabel
  94. stock _DeletePlayer3DTextLabel(playerid, PlayerText3D:id) {
  95.     new tmp = A::G(id);
  96.     if(tmp == INVALID_3DTEXT_ID) return 0;
  97.     return std(A::Q[tmp][A::text]),A::Q[tmp][A::player]=-1,A::Q[tmp][A::attached]=0,__DeletePlayer3DTextLabel(playerid,id);
  98. }
  99. #if defined _ALS_DeletePlayer3DTextLabel
  100.     #undef DeletePlayer3DTextLabel
  101. #else
  102.     #define _ALS_DeletePlayer3DTextLabel
  103. #endif
  104. #define DeletePlayer3DTextLabel _DeletePlayer3DTextLabel
  105. stock Attach3DTextLabelToObject(Text3D:id, objectid, Float:OffsetX, Float:OffsetY, Float:OffsetZ) {
  106.     new tmp = A::H(id);
  107.     if(tmp == INVALID_3DTEXT_ID) return 0;
  108.     if(!GetObjectPos(objectid,A::Q[tmp][A::X],A::Q[tmp][A::Y],A::Q[tmp][A::Z])) return 0;
  109.     A::Q[tmp][A::f][0] = OffsetX,A::Q[tmp][A::f][1] = OffsetY,A::Q[tmp][A::f][2] = OffsetZ,
  110.     A::Q[tmp][A::attached] = objectid,__Delete3DTextLabel(id);
  111.     return __Create3DTextLabel(A::Q[tmp][A::text],A::Q[tmp][A::color],
  112.                                A::Q[tmp][A::X]+A::Q[tmp][A::f][0],
  113.                    A::Q[tmp][A::Y]+A::Q[tmp][A::f][1],
  114.                    A::Q[tmp][A::Z]+A::Q[tmp][A::f][2],
  115.                    A::Q[tmp][A::Draw],A::Q[tmp][A::World],A::Q[tmp][A::Los]),1;
  116. }
  117. stock AttachPlayer3DTextLabelToObject(playerid, PlayerText3D:id, objectid, Float:OffsetX, Float:OffsetY, Float:OffsetZ) {
  118.     if(!IsPlayerConnected(playerid)) return 0;
  119.     new tmp = A::G(id);
  120.     if(tmp == INVALID_3DTEXT_ID) return 0;
  121.     if(!GetObjectPos(objectid,A::Q[tmp][A::X],A::Q[tmp][A::Y],A::Q[tmp][A::Z])) return 0;
  122.     A::Q[tmp][A::f][0] = OffsetX,A::Q[tmp][A::f][1] = OffsetY,A::Q[tmp][A::f][2] = OffsetZ,
  123.     A::Q[tmp][A::attached] = objectid,__DeletePlayer3DTextLabel(playerid,id);
  124.     return __CreatePlayer3DTextLabel(playerid,A::Q[tmp][A::text],A::Q[tmp][A::color],
  125.                                      A::Q[tmp][A::X]+A::Q[tmp][A::f][0],
  126.                      A::Q[tmp][A::Y]+A::Q[tmp][A::f][1],
  127.                      A::Q[tmp][A::Z]+A::Q[tmp][A::f][2],
  128.                      A::Q[tmp][A::Draw],INVALID_PLAYER_ID,INVALID_VEHICLE_ID,A::Q[tmp][A::Los]),1;
  129. }
  130. stock Detach3DTextLabel(Text3D:id) {
  131.     new tmp = A::G(PlayerText3D:id);
  132.     if(tmp == INVALID_3DTEXT_ID) tmp = A::H(id);
  133.     if(tmp == INVALID_3DTEXT_ID) return 0;
  134.     return A::Q[tmp][A::attached]=0;
  135. }
  136. #define DetachPlayer3DTextLabel(%0) Detach3DTextLabel(Text3D:%0)
  137. stock A::G(PlayerText3D:id) {
  138.     for(new i; i<MAX_3DTEXT_GLOBAL; i++) if(PlayerText3D:A::Q[i][A::flag] == id) return i;
  139.     return INVALID_3DTEXT_ID;
  140. }
  141. stock A::H(Text3D:id) {
  142.     for(new i; i<MAX_3DTEXT_GLOBAL; i++) if(Text3D:A::Q[i][A::flag] == id && A::Q[i][A::player] == -1) return i;
  143.     return INVALID_3DTEXT_ID;
  144. }
  145. #if defined FILTERSCRIPT
  146.     public OnFilterScriptInit() return SetTimer("@a_OBJ",199,1),CallLocalFunction("Attach_OnFilterScriptInit","");
  147.     #if defined _ALS_OnFilterScriptInit
  148.         #undef OnFilterScriptInit
  149.     #else
  150.         #define _ALS_OnFilterScriptInit
  151.     #endif
  152.     #define OnFilterScriptInit Attach_OnFilterScriptInit
  153. #else
  154.     public OnGameModeInit() return SetTimer("@a_OBJ",199,1),CallLocalFunction("Attach_OnGameModeInit","");
  155.     #if defined _ALS_OnGameModeInit
  156.         #undef OnGameModeInit
  157.     #else
  158.         #define _ALS_OnGameModeInit
  159.     #endif
  160.     #define OnGameModeInit Attach_OnGameModeInit
  161. #endif
  162. @a_OBJ();@a_OBJ() {
  163.     new Float:tmp[3],i;
  164.     for(;; i++) {
  165.         if(i==MAX_3DTEXT_GLOBAL) break;
  166.     if(!A::Q[i][A::attached]) continue;
  167.     #if !defined STREAMER_OBJECT_TYPE_DYNAMIC
  168.     if(!GetObjectPos(A::Q[i][A::attached],tmp[0],tmp[1],tmp[2])) {Detach3DTextLabel(Text3D:i); continue;}
  169.     #else
  170.     if(!GetDynamicObjectPos(A::Q[i][A::attached],tmp[0],tmp[1],tmp[2])) {Detach3DTextLabel(Text3D:i); continue;}
  171.     #endif
  172.     if(A::Q[i][A::X] != tmp[0] || A::Q[i][A::Y] != tmp[1] || A::Q[i][A::Z] != tmp[2]) {
  173.             A::Q[i][A::X] = tmp[0],A::Q[i][A::Y] = tmp[1], A::Q[i][A::Z] = tmp[2];
  174.         switch(A::Q[i][A::player]) {
  175.             case -1: __Delete3DTextLabel(Text3D:A::Q[i][A::flag]),
  176.                          __Create3DTextLabel(A::Q[i][A::text],A::Q[i][A::color],
  177.                              A::Q[i][A::X]+A::Q[i][A::f][0],A::Q[i][A::Y]+A::Q[i][A::f][1],
  178.                              A::Q[i][A::Z]+A::Q[i][A::f][2], A::Q[i][A::Draw],A::Q[i][A::World],A::Q[i][A::Los]);
  179.            
  180.                 default: __DeletePlayer3DTextLabel(A::Q[i][A::player],PlayerText3D:A::Q[i][A::flag]),
  181.                  __CreatePlayer3DTextLabel(A::Q[i][A::player],A::Q[i][A::text],A::Q[i][A::color],
  182.                                A::Q[i][A::X]+A::Q[i][A::f][0],A::Q[i][A::Y]+A::Q[i][A::f][1],
  183.                                A::Q[i][A::Z]+A::Q[i][A::f][2], A::Q[i][A::Draw],
  184.                                INVALID_PLAYER_ID,INVALID_VEHICLE_ID,A::Q[i][A::Los]);
  185.             }
  186.         }
  187.     }
  188.     return 1;
  189. }
  190. #undef std
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement