Mauzen

MapDialog Include V0.1b

Nov 3rd, 2011
786
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 19.29 KB | None | 0 0
  1. /*
  2.     Ingame Map Include V0.1
  3.         for general purposes
  4.  
  5.     Provides an automated "map dialog"
  6.    
  7.     You are allowed to use this include for your server.
  8.     You may modify it as much as you like for private use.
  9.     You are not allowed to re-release or sell the original or an edited version without my permission.
  10.     If you use this include, or parts of it for your own script, please dont forget to give me some credits in any way.
  11.  
  12. And of course do not remove this header.
  13.  
  14.     Created by Mauzen (msoll(at)web.de), 3.11.2011
  15. */
  16.  
  17. // Technical defines
  18. #define MAX_MAPDIALOGS                      (32)
  19. #define INVALID_MAPDIALOG                   (MapDialog:-1)
  20. #define NAVIGATION_UPDATETIME               (50)               // movement updatetime in ms
  21.  
  22. #define MAPDIALOG_USE_MOUSE                 (true)  // use mouse movement or not
  23.  
  24. #define MAPDIALOG_RESPONSE_EXIT             (0)
  25. #define MAPDIALOG_RESPONSE_CLICK            (1)
  26.  
  27. // Control defines
  28. #define MAPDIALOG_ZOOMSPEED                 (1.08)
  29. #define MAPDIALOG_SCROLLSPEED               (100.0 / 128.0)
  30. #define MAPDIALOG_MOUSESPEEDMOD             (50.0)  // "Mouse-sensitivity"
  31.  
  32. // Key defines
  33. #define MAPDIALOG_ZOOM_IN                   (KEY_YES)
  34. #define MAPDIALOG_ZOOM_OUT                  (KEY_CTRL_BACK)
  35. #define MAPDIALOG_JUMP_TO_PLAYER            (KEY_SPRINT)
  36. #define MAPDIALOG_EXIT                      (KEY_SECONDARY_ATTACK)
  37.  
  38.  
  39. // Control fake-functions
  40. #define IsValidMapDialog(%1)                (MD_dialogs[_:%1][DIALOG_VALID] & 0b0001)
  41. #define IsMapDialogVisible(%1)              (MD_dialogs[_:%1][DIALOG_VALID] & 0b0010)
  42. #define IsMapDialogCallbackActive(%1)       (MD_dialogs[_:%1][DIALOG_VALID] & 0b0100)
  43. #define IsRelockBitSet(%1)                  (MD_dialogs[_:%1][DIALOG_VALID] & 0b1000)
  44. // General fake-functions
  45. #define GetMapDialogOwner(%1)               (MD_dialogs[_:%1][DIALOG_PLAYER])
  46. #define MapDialogSetPlayerPos(%1,%2,%3,%4) \
  47.     SetPlayerPosFindZ(MD_dialogs[_:%1][DIALOG_PLAYER],%2,%3,%4); \
  48.     MD_dialogs[_:%1][DIALOG_VALID] = MD_dialogs[_:%1][DIALOG_VALID] | 0b1000
  49.  
  50. enum MAPDIALOG_ENUM
  51. {
  52.             DIALOG_VALID,       // (bit 1: valid, bit 2: visible)
  53.                                 // (bit 3: use move callback, bit 4: relock player pos)
  54.                                 // (bit 5: show position TD)
  55.                                 // (bits 16-19: maptd textdraws created)
  56.     Text:   DIALOG_BGTD,
  57.     Text:   DIALOG_MAPTD[4],
  58.     //Text: DIALOG_FRAMETD[4],  // unused
  59.     Text:   DIALOG_PLAYERTD,
  60.     Text:   DIALOG_POSTD,
  61.     Text:   DIALOG_HELPTD,
  62.     //Text:   DIALOG_HORLINETD, // unused
  63.     //Text:   DIALOG_VERLINETD, //unused
  64.     Text:   DIALOG_MARKERTD,
  65.             DIALOG_PLAYER,
  66.     Float:  DIALOG_X,
  67.     Float:  DIALOG_Y,
  68.     Float:  DIALOG_ZOOM,
  69.     Float:  DIALOG_ENTERX,      // For locking the player position
  70.     Float:  DIALOG_ENTERY,
  71.     Float:  DIALOG_ENTERZ,
  72.             DIALOG_TIMER,
  73.             DIALOG_LASTKEYS,
  74.             DIALOG_MSG
  75. }
  76.  
  77.  
  78. new MD_dialogs[MAX_MAPDIALOGS][MAPDIALOG_ENUM];
  79.  
  80. new MapDialog:playerdialog[MAX_PLAYERS];        // waste of RAM, but faster
  81.  
  82.  
  83.  
  84. // --------- FORWARDS AND FAKE NATIVES -----------------------------------------
  85.  
  86. forward MapDialog:CreateMapDialog(playerid, usecallback, showposition, showhelp, msg=0);
  87. forward MapDialog:GetFreeMapDialogSlot();
  88. forward MapDialogUpdate(dialog);
  89.  
  90. // Callbacks
  91. /*
  92.     Called, when the player performs an non-navigation action.
  93.     params:
  94.         MapDialog:dialog:       Source MapDialog
  95.         msg:                    Custom ID for identifying the MapDialog
  96.         Float:x/y:              Currently focused position of the MapDialog
  97.         response:               Type of action (EXIT, CLICK)
  98.  
  99.     return:
  100.         for MAPDIALOG_RESPONSE_EXIT:
  101.             1: Set the MapDialog to not visible (exit)
  102.             0: Do nothing (ignore exit attempt)
  103.         for MAPDIALOG_RESPONSE_CLICK:
  104.             ignored
  105. */
  106. forward OnMapDialogResponse(MapDialog:dialog, msg, Float:x, Float:y, response);
  107.  
  108. /*
  109.     Called, when the player navigates in the MapDialog (scrolling, zooming)
  110.     params:
  111.         MapDialog:dialog:       Source MapDialog
  112.         msg:                    Custom ID for identifying the MapDialog
  113.         Float:oldx/oldy:        The currently focused position
  114.         Float:oldzoom:          The current zoomfactor
  115.         Float:newx/newy:        The position, the owner wants to scroll to
  116.         Float:newzoom:          The zoomfactor, the owner wants to set.
  117.        
  118.     return:
  119.         1: Apply navigation-attempt. Focus will move the new position, and zoomfactor will be applied.
  120.         0: Reject navigation-attempt. Focus will stay at the old position and zoomfactor wont change.
  121. */
  122. forward OnMapDialogNavigation(MapDialog:dialog, msg, Float:oldx, Float:oldy, Float:oldzoom,
  123.                                 Float:newx, Float:newy, Float:newzoom);
  124.                                
  125. /*
  126.     native MapDialog:CreateMapDialog(playerid, usecallback, showposition, showhelp, msg=0);
  127.     native DestroyMapDialog(MapDialog:dialog);
  128.     native MapDialogScrollTo2D(MapDialog:dialog, Float:x, Float:y, Float:zoom, bool:init=false);
  129.     native SetMapDialogVisible(MapDialog:dialog, visible);
  130.    
  131.     // Returns the owner of the MapDialog
  132.     native GetMapDialogOwner(MapDialog:dialog);
  133.    
  134.     // Use this to change the player's position in the callbacks!
  135.     native MapDialogSetPlayerPos(MapDialog:dialog, Float:x, Float:y, Float:z);
  136. */
  137.  
  138.  
  139.  
  140. // ----------- GENERAL FUNCTIONS -----------------------------------------------
  141.  
  142.  
  143. /*
  144.     Creates a new MapDialog
  145.     params:
  146.         playerid:       owner
  147.         usecallback:    Use the OnMapDialogNavigation callback?
  148.         showposition:   Show the position textdraw?
  149.         showhelp:       Show the controlhelp textdraw?
  150.         msg:            Optional ID for identification in callbacks
  151.        
  152.     return: ID of the MapDialog, INVALID_MAPDIALOG on failure
  153. */
  154. stock MapDialog:CreateMapDialog(playerid, usecallback, showposition, showhelp, msg=0)
  155. {
  156.     new MapDialog:slot = GetFreeMapDialogSlot();
  157.        
  158.    
  159.     if (slot == INVALID_MAPDIALOG) return INVALID_MAPDIALOG;
  160.    
  161.    
  162.     // Create black background
  163.     MD_dialogs[_:slot][DIALOG_BGTD] = TextDrawCreate(0, 0, "~n~~n~~n~~n~~n~~n~\
  164.         ~n~~n~~n~~n~~n~~n~~n~~n~~n~~n~~n~~n~~n~~n~~n~~n~~n~~n~~n~~n~~n~~n~~n~\
  165.         ~n~~n~~n~~n~~n~~n~~n~~n~~n~~n~~n~~n~~n~~n~~n~~n~~n~~n~~n~~n~~n~~n~~n~");
  166.     TextDrawUseBox(MD_dialogs[_:slot][DIALOG_BGTD], true);
  167.     TextDrawBoxColor(MD_dialogs[_:slot][DIALOG_BGTD], 0x000000FF);
  168.     TextDrawTextSize(MD_dialogs[_:slot][DIALOG_BGTD], 640.0, 480.0);
  169.  
  170.     new Float:x, Float:y, Float:z;
  171.     GetPlayerPos(playerid, x, y, z);
  172.     MapDialogScrollTo2D(slot, x, y, 1.0, true);
  173.  
  174.     if (showposition)
  175.     {
  176.         format(txt, 32, "~n~~n~Position: %.2f, %2f", x, y);
  177.         MD_dialogs[_:slot][DIALOG_POSTD] = TextDrawCreate(485, 400, txt);
  178.         TextDrawLetterSize(MD_dialogs[_:slot][DIALOG_POSTD], 0.3, 0.7);
  179.         TextDrawUseBox(MD_dialogs[_:slot][DIALOG_POSTD], true);
  180.         TextDrawBoxColor(MD_dialogs[_:slot][DIALOG_POSTD], 0x44444488);
  181.         TextDrawSetShadow(MD_dialogs[_:slot][DIALOG_POSTD], 0);
  182.         TextDrawSetOutline(MD_dialogs[_:slot][DIALOG_POSTD], 1);
  183.     }
  184.    
  185.     if (showhelp)
  186.     {
  187.         MD_dialogs[_:slot][DIALOG_HELPTD] = TextDrawCreate(460, -10,
  188.             "~n~~n~RMB+mouse / move keys: move~n~LMB: Select position~n~KEY_YES(Z): Zoom in~n~KEY_CTRL_BACK(H): Zoom out~n~KEY_SPRINT: Jump to player pos~n~KEY_SEC_ATTACK(F): Exit");
  189.         TextDrawLetterSize(MD_dialogs[_:slot][DIALOG_HELPTD], 0.3, 0.7);
  190.         TextDrawUseBox(MD_dialogs[_:slot][DIALOG_HELPTD], true);
  191.         TextDrawBoxColor(MD_dialogs[_:slot][DIALOG_HELPTD], 0x44444488);
  192.         TextDrawSetShadow(MD_dialogs[_:slot][DIALOG_HELPTD], 0);
  193.         TextDrawSetOutline(MD_dialogs[_:slot][DIALOG_HELPTD], 1);
  194.     }
  195.    
  196.     MD_dialogs[_:slot][DIALOG_PLAYER] = playerid;
  197.     MD_dialogs[_:slot][DIALOG_MSG] = msg;
  198.     playerdialog[playerid] = slot;
  199.     MD_dialogs[_:slot][DIALOG_VALID] = MD_dialogs[_:slot][DIALOG_VALID] | 0b0001;
  200.     MD_dialogs[_:slot][DIALOG_VALID] = MD_dialogs[_:slot][DIALOG_VALID] | (usecallback << 2);
  201.     MD_dialogs[_:slot][DIALOG_VALID] = MD_dialogs[_:slot][DIALOG_VALID] | (showposition << 4);
  202.     MD_dialogs[_:slot][DIALOG_VALID] = MD_dialogs[_:slot][DIALOG_VALID] | (showhelp << 5);
  203.    
  204.     return slot;
  205. }
  206.  
  207.  
  208. /*
  209.     Destroys the specified MapDialog
  210.     params:
  211.         MapDialog:dialog:       The MapDialog to destroy
  212.        
  213.     return: null
  214. */
  215. stock DestroyMapDialog(MapDialog:dialog)
  216. {
  217.     SetMapDialogVisible(dialog, false);
  218.     MD_dialogs[_:dialog][DIALOG_VALID] = MD_dialogs[_:dialog][DIALOG_VALID] = 0;
  219. }
  220.  
  221. /*
  222.     Sets the currently focused position of the MapDialog
  223.     params:
  224.         MapDialog:dialog:       MapDialog to affect
  225.         Float:x/y:              Position to focus.
  226.         Float:zoom:             Zoomfactor to set.
  227.         bool:init:              Internally used only
  228.        
  229.     return: null
  230. */
  231. stock MapDialogScrollTo2D(MapDialog:dialog, Float:x, Float:y, Float:zoom, bool:init=false)
  232. {
  233.     new Float:tx, Float:ty, Float:zoff;
  234.    
  235.     MD_dialogs[_:dialog][DIALOG_ZOOM] = zoom;
  236.     MD_dialogs[_:dialog][DIALOG_X] = x;
  237.     MD_dialogs[_:dialog][DIALOG_Y] = y;
  238.    
  239.     tx = 320 - 640 * (MD_dialogs[_:dialog][DIALOG_ZOOM]) / 6000 * (x + 3000);
  240.     ty = 240 + 640 * (MD_dialogs[_:dialog][DIALOG_ZOOM]) / 6000 * (y - 3000);
  241.     zoff = 320.0 * MD_dialogs[_:dialog][DIALOG_ZOOM];       // zoom offset
  242.    
  243.  
  244.     for (new i = 0; i < 4; i ++)
  245.     {
  246.         if (MD_dialogs[_:dialog][DIALOG_VALID] & 1 << (16 + i))
  247.             TextDrawDestroy(MD_dialogs[_:dialog][DIALOG_MAPTD][i]);
  248.     }
  249.  
  250.     if (tx + zoff > 0 && ty + zoff > 0) // "TD streamer"
  251.     {                                   // Only create TDs that actually are within the screen boundaries
  252.         MD_dialogs[_:dialog][DIALOG_MAPTD][0] = TextDrawCreate(tx, ty, "samaps:gtasamapbit1");
  253.         TextDrawFont(MD_dialogs[_:dialog][DIALOG_MAPTD][0], 4);
  254.         TextDrawColor(MD_dialogs[_:dialog][DIALOG_MAPTD][0],0xFFFFFFFF);
  255.         TextDrawTextSize(MD_dialogs[_:dialog][DIALOG_MAPTD][0],
  256.             320.0 * MD_dialogs[_:dialog][DIALOG_ZOOM], 320.0 * MD_dialogs[_:dialog][DIALOG_ZOOM]);
  257.         MD_dialogs[_:dialog][DIALOG_VALID] = MD_dialogs[_:dialog][DIALOG_VALID] | 1 << (16 + 0);
  258.     } else {
  259.         MD_dialogs[_:dialog][DIALOG_VALID] = MD_dialogs[_:dialog][DIALOG_VALID] & ~(1 << (16 + 0));
  260.     }
  261.  
  262.     if (tx + zoff < 640 && ty + zoff > 0)
  263.     {
  264.         MD_dialogs[_:dialog][DIALOG_MAPTD][1] = TextDrawCreate(tx + zoff, ty, "samaps:gtasamapbit2");
  265.         TextDrawFont(MD_dialogs[_:dialog][DIALOG_MAPTD][1], 4);
  266.         TextDrawColor(MD_dialogs[_:dialog][DIALOG_MAPTD][1],0xFFFFFFFF);
  267.         TextDrawTextSize(MD_dialogs[_:dialog][DIALOG_MAPTD][1],
  268.             320.0 * MD_dialogs[_:dialog][DIALOG_ZOOM], 320.0 * MD_dialogs[_:dialog][DIALOG_ZOOM]);
  269.         MD_dialogs[_:dialog][DIALOG_VALID] = MD_dialogs[_:dialog][DIALOG_VALID] | 1 << (16 + 1);
  270.     } else {
  271.         MD_dialogs[_:dialog][DIALOG_VALID] = MD_dialogs[_:dialog][DIALOG_VALID] & ~(1 << (16 + 1));
  272.     }
  273.  
  274.     if (tx + zoff > 0 && ty + zoff < 480)
  275.     {
  276.         MD_dialogs[_:dialog][DIALOG_MAPTD][2] = TextDrawCreate(tx, ty + zoff, "samaps:gtasamapbit3");
  277.         TextDrawFont(MD_dialogs[_:dialog][DIALOG_MAPTD][2], 4);
  278.         TextDrawColor(MD_dialogs[_:dialog][DIALOG_MAPTD][2],0xFFFFFFFF);
  279.         TextDrawTextSize(MD_dialogs[_:dialog][DIALOG_MAPTD][2],
  280.             320.0 * MD_dialogs[_:dialog][DIALOG_ZOOM], 320.0 * MD_dialogs[_:dialog][DIALOG_ZOOM]);
  281.         MD_dialogs[_:dialog][DIALOG_VALID] = MD_dialogs[_:dialog][DIALOG_VALID] | 1 << (16 + 2);
  282.     } else {
  283.         MD_dialogs[_:dialog][DIALOG_VALID] = MD_dialogs[_:dialog][DIALOG_VALID] & ~(1 << (16 + 2));
  284.     }
  285.  
  286.     if (tx + zoff < 640 && ty + zoff < 480)
  287.     {
  288.         MD_dialogs[_:dialog][DIALOG_MAPTD][3] = TextDrawCreate(tx + zoff, ty + zoff, "samaps:gtasamapbit4");
  289.         TextDrawFont(MD_dialogs[_:dialog][DIALOG_MAPTD][3], 4);
  290.         TextDrawColor(MD_dialogs[_:dialog][DIALOG_MAPTD][3],0xFFFFFFFF);
  291.         TextDrawTextSize(MD_dialogs[_:dialog][DIALOG_MAPTD][3],
  292.             320.0 * MD_dialogs[_:dialog][DIALOG_ZOOM], 320.0 * MD_dialogs[_:dialog][DIALOG_ZOOM]);
  293.         MD_dialogs[_:dialog][DIALOG_VALID] = MD_dialogs[_:dialog][DIALOG_VALID] | 1 << (16 + 3);
  294.     } else {
  295.         MD_dialogs[_:dialog][DIALOG_VALID] = MD_dialogs[_:dialog][DIALOG_VALID] & ~(1 << (16 + 3));
  296.     }
  297.    
  298.     if (MD_dialogs[_:dialog][DIALOG_VALID] & 1 << (4))
  299.     {
  300.         format(txt, 64, "~n~~n~Position: %.2f, %.2f", x, y);
  301.         TextDrawSetString(MD_dialogs[_:dialog][DIALOG_POSTD], txt);
  302.     }
  303.  
  304.  
  305.     if (!init) TextDrawDestroy(MD_dialogs[_:dialog][DIALOG_MARKERTD]);
  306.     MD_dialogs[_:dialog][DIALOG_MARKERTD] = TextDrawCreate(316.0, 235.0, "O");
  307.     TextDrawLetterSize(MD_dialogs[_:dialog][DIALOG_MARKERTD], 0.3, 1.0);
  308.     TextDrawSetShadow(MD_dialogs[_:dialog][DIALOG_MARKERTD], 0);
  309.     TextDrawColor(MD_dialogs[_:dialog][DIALOG_MARKERTD], 0xFF000099);
  310.                                                        
  311.     SetMapDialogVisible(dialog, IsMapDialogVisible(dialog));
  312. }
  313.  
  314. /*
  315.     Toggles the visibility/activity of a MapDialog. A MapDialog can only be
  316.     shown to its owner.
  317.     params:
  318.         MapDialog:dialog:       MapDialog to affect
  319.         visible:                Should be visible?
  320.        
  321.     return: null
  322. */
  323. stock SetMapDialogVisible(MapDialog:dialog, visible)
  324. {
  325.     if (!IsValidMapDialog(dialog)) return;
  326.     if (visible)
  327.     {
  328.         GetPlayerPos(MD_dialogs[_:dialog][DIALOG_PLAYER], MD_dialogs[_:dialog][DIALOG_ENTERX],
  329.                     MD_dialogs[_:dialog][DIALOG_ENTERY], MD_dialogs[_:dialog][DIALOG_ENTERZ]);
  330.         TextDrawShowForPlayer(MD_dialogs[_:dialog][DIALOG_PLAYER], MD_dialogs[_:dialog][DIALOG_BGTD]);
  331.         for (new i = 0; i < 4; i++)
  332.             if (MD_dialogs[_:dialog][DIALOG_VALID] & 1 << (16 + i))
  333.                 TextDrawShowForPlayer(MD_dialogs[_:dialog][DIALOG_PLAYER], MD_dialogs[_:dialog][DIALOG_MAPTD][i]);
  334.         if (MD_dialogs[_:dialog][DIALOG_VALID] & 1 << (4))
  335.             TextDrawShowForPlayer(MD_dialogs[_:dialog][DIALOG_PLAYER], MD_dialogs[_:dialog][DIALOG_POSTD]);
  336.         if (MD_dialogs[_:dialog][DIALOG_VALID] & 1 << (5))
  337.             TextDrawShowForPlayer(MD_dialogs[_:dialog][DIALOG_PLAYER], MD_dialogs[_:dialog][DIALOG_HELPTD]);
  338.         //TextDrawShowForPlayer(MD_dialogs[_:dialog][DIALOG_PLAYER], MD_dialogs[_:dialog][DIALOG_FRAMETD][0]);
  339.         //TextDrawShowForPlayer(MD_dialogs[_:dialog][DIALOG_PLAYER], MD_dialogs[_:dialog][DIALOG_FRAMETD][1]);
  340.         //TextDrawShowForPlayer(MD_dialogs[_:dialog][DIALOG_PLAYER], MD_dialogs[_:dialog][DIALOG_FRAMETD][2]);
  341.         //TextDrawShowForPlayer(MD_dialogs[_:dialog][DIALOG_PLAYER], MD_dialogs[_:dialog][DIALOG_FRAMETD][3]);
  342.         //TextDrawShowForPlayer(MD_dialogs[_:dialog][DIALOG_PLAYER], MD_dialogs[_:dialog][DIALOG_PLAYERTD]);
  343.         //TextDrawShowForPlayer(MD_dialogs[_:dialog][DIALOG_PLAYER], MD_dialogs[_:dialog][DIALOG_HORLINETD]);
  344.         //TextDrawShowForPlayer(MD_dialogs[_:dialog][DIALOG_PLAYER], MD_dialogs[_:dialog][DIALOG_VERLINETD]);
  345.         TextDrawShowForPlayer(MD_dialogs[_:dialog][DIALOG_PLAYER], MD_dialogs[_:dialog][DIALOG_MARKERTD]);
  346.         if (!IsMapDialogVisible(dialog)) MD_dialogs[_:dialog][DIALOG_TIMER] = SetTimerEx("MapDialogUpdate", NAVIGATION_UPDATETIME, 1, "i", _:dialog);
  347.         MD_dialogs[_:dialog][DIALOG_VALID] = MD_dialogs[_:dialog][DIALOG_VALID] | 0b0010;
  348.     } else {
  349.         TextDrawHideForPlayer(MD_dialogs[_:dialog][DIALOG_PLAYER], MD_dialogs[_:dialog][DIALOG_BGTD]);
  350.         for (new i = 0; i < 4; i++)
  351.             if (MD_dialogs[_:dialog][DIALOG_VALID] & 1 << (16 + i))
  352.                 TextDrawHideForPlayer(MD_dialogs[_:dialog][DIALOG_PLAYER], MD_dialogs[_:dialog][DIALOG_MAPTD][i]);
  353.         if (MD_dialogs[_:dialog][DIALOG_VALID] & 1 << (4))
  354.             TextDrawHideForPlayer(MD_dialogs[_:dialog][DIALOG_PLAYER], MD_dialogs[_:dialog][DIALOG_POSTD]);
  355.         if (MD_dialogs[_:dialog][DIALOG_VALID] & 1 << (5))
  356.             TextDrawHideForPlayer(MD_dialogs[_:dialog][DIALOG_PLAYER], MD_dialogs[_:dialog][DIALOG_HELPTD]);
  357.         //TextDrawHideForPlayer(MD_dialogs[_:dialog][DIALOG_PLAYER], MD_dialogs[_:dialog][DIALOG_FRAMETD][0]);
  358.         //TextDrawHideForPlayer(MD_dialogs[_:dialog][DIALOG_PLAYER], MD_dialogs[_:dialog][DIALOG_FRAMETD][1]);
  359.         //TextDrawHideForPlayer(MD_dialogs[_:dialog][DIALOG_PLAYER], MD_dialogs[_:dialog][DIALOG_FRAMETD][2]);
  360.         //TextDrawHideForPlayer(MD_dialogs[_:dialog][DIALOG_PLAYER], MD_dialogs[_:dialog][DIALOG_FRAMETD][3]);
  361.         //TextDrawHideForPlayer(MD_dialogs[_:dialog][DIALOG_PLAYER], MD_dialogs[_:dialog][DIALOG_PLAYERTD]);
  362.         //TextDrawHideForPlayer(MD_dialogs[_:dialog][DIALOG_PLAYER], MD_dialogs[_:dialog][DIALOG_HORLINETD]);
  363.         //TextDrawHideForPlayer(MD_dialogs[_:dialog][DIALOG_PLAYER], MD_dialogs[_:dialog][DIALOG_VERLINETD]);
  364.         TextDrawHideForPlayer(MD_dialogs[_:dialog][DIALOG_PLAYER], MD_dialogs[_:dialog][DIALOG_MARKERTD]);
  365.         if (IsMapDialogVisible(dialog)) KillTimer(MD_dialogs[_:dialog][DIALOG_TIMER]);
  366.         MD_dialogs[_:dialog][DIALOG_VALID] = MD_dialogs[_:dialog][DIALOG_VALID] & ~0b0010;
  367.     }
  368. }
  369.  
  370.  
  371.  
  372. // ---------------- INTERNALS --------------------------------------------------
  373.  
  374. stock MapDialog:GetFreeMapDialogSlot()
  375. {
  376.     for (new i = 0; i < MAX_MAPDIALOGS; i++)
  377.     {
  378.         if (!IsValidMapDialog(i)) return MapDialog:i;
  379.     }
  380.     return INVALID_MAPDIALOG;
  381. }
  382.  
  383. public MapDialogUpdate(dialog)
  384. {
  385.     new ud, lr, keys, updated;
  386.     GetPlayerKeys(MD_dialogs[dialog][DIALOG_PLAYER], keys, ud, lr);
  387.    
  388.     if (!IsRelockBitSet(dialog))
  389.     {
  390.         SetPlayerPos(MD_dialogs[_:dialog][DIALOG_PLAYER], MD_dialogs[_:dialog][DIALOG_ENTERX],
  391.                     MD_dialogs[_:dialog][DIALOG_ENTERY], MD_dialogs[_:dialog][DIALOG_ENTERZ]);
  392.     } else {
  393.         GetPlayerPos(MD_dialogs[_:dialog][DIALOG_PLAYER], MD_dialogs[_:dialog][DIALOG_ENTERX],
  394.                     MD_dialogs[_:dialog][DIALOG_ENTERY], MD_dialogs[_:dialog][DIALOG_ENTERZ]);
  395.     }
  396.  
  397.     #if (MAPDIALOG_USE_MOUSE == true)
  398.         if (keys & KEY_HANDBRAKE)
  399.         {
  400.             new Float:vx, Float:vy, Float:vz;
  401.             GetPlayerCameraFrontVector(MD_dialogs[_:dialog][DIALOG_PLAYER], vx, vy, vz);
  402.             if (lr == 0 && ud == 0)
  403.             {
  404.                 lr = floatround(atan2(vx, vy) * MAPDIALOG_MOUSESPEEDMOD);
  405.                 ud = floatround((asin(vz) + 2.864789) * -MAPDIALOG_MOUSESPEEDMOD);
  406.                 if (lr > 512) lr = 512;
  407.                 if (lr < -512) lr = -512;
  408.                 if (ud > 512) ud = 512;
  409.                 if (ud < -512) ud = -512;
  410.             }
  411.         }
  412.         SetCameraBehindPlayer(MD_dialogs[_:dialog][DIALOG_PLAYER]);
  413.         SetPlayerFacingAngle(MD_dialogs[_:dialog][DIALOG_PLAYER], 0.0);
  414.     #endif
  415.    
  416.    
  417.     new Float:x = MD_dialogs[dialog][DIALOG_X],
  418.         Float:y = MD_dialogs[dialog][DIALOG_Y],
  419.         Float:zoom = MD_dialogs[dialog][DIALOG_ZOOM];
  420.    
  421.     if (ud != 0)
  422.     {
  423.         y -= MAPDIALOG_SCROLLSPEED / MD_dialogs[dialog][DIALOG_ZOOM]  * ud;
  424.         updated = true;
  425.     }
  426.    
  427.     if (lr != 0)
  428.     {
  429.         x += MAPDIALOG_SCROLLSPEED / MD_dialogs[dialog][DIALOG_ZOOM] * lr;
  430.         updated = true;
  431.     }
  432.    
  433.     if (keys & MAPDIALOG_ZOOM_OUT)
  434.     {
  435.         zoom *= (1 / MAPDIALOG_ZOOMSPEED);
  436.         updated = true;
  437.     } else if (keys & MAPDIALOG_ZOOM_IN)
  438.     {
  439.         zoom *= MAPDIALOG_ZOOMSPEED;
  440.         updated = true;
  441.     }
  442.     if (keys & MAPDIALOG_JUMP_TO_PLAYER)
  443.     {
  444.         new Float:z;
  445.         GetPlayerPos(MD_dialogs[dialog][DIALOG_PLAYER], x, y, z);
  446.         updated = true;
  447.     }
  448.    
  449.     if ((keys & KEY_FIRE) && !(MD_dialogs[dialog][DIALOG_LASTKEYS] & KEY_FIRE))
  450.     {
  451.         CallLocalFunction("OnMapDialogResponse", "iIffi", dialog,
  452.         MD_dialogs[dialog][DIALOG_MSG], x, y, MAPDIALOG_RESPONSE_CLICK);
  453.     }
  454.    
  455.     if (keys & MAPDIALOG_EXIT)
  456.     {
  457.         if (CallLocalFunction("OnMapDialogResponse", "iiffi", dialog,
  458.             MD_dialogs[dialog][DIALOG_MSG], x, y, MAPDIALOG_RESPONSE_EXIT))
  459.         {
  460.             SetMapDialogVisible(MapDialog:dialog, false);
  461.         }
  462.     }
  463.    
  464.     if (zoom < 0.6) zoom = 0.6;
  465.     if (x > 3000.0) x = 3000.0;
  466.     if (y > 3000.0) y = 3000.0;
  467.     if (x < -3000.0) x = -3000.0;
  468.     if (y < -3000.0) y = -3000.0;
  469.    
  470.     if (updated)
  471.     {
  472.         if (IsMapDialogCallbackActive(dialog))
  473.         {
  474.             if (CallLocalFunction("OnMapDialogNavigation", "iiffffff",
  475.                 _:dialog, MD_dialogs[dialog][DIALOG_MSG],
  476.                 MD_dialogs[dialog][DIALOG_X], MD_dialogs[dialog][DIALOG_Y], MD_dialogs[dialog][DIALOG_ZOOM],
  477.                 x, y, zoom))
  478.             {
  479.                 MapDialogScrollTo2D(MapDialog:dialog, x, y, zoom);
  480.             }
  481.         } else
  482.         {
  483.             MapDialogScrollTo2D(MapDialog:dialog, x, y, zoom);
  484.         }
  485.     }
  486.    
  487.     MD_dialogs[dialog][DIALOG_LASTKEYS] = keys;
  488. }
Advertisement
Add Comment
Please, Sign In to add comment