C_far icon

PreviewModelDialog.inc - v4.5.1

C_far | PRO | 05/01/18 07:08:27 AM UTC | 0 ⭐ | 7607 👁️ | Never ⏰ | []
Pawn |

56.21 KB

|

None

|

0 👍

/

0 👎

#if defined previewmodel_dialog_included
    #endinput
#endif
#define previewmodel_dialog_included
 
/**************************************/
/* PreviewModelDialog.inc - v4.5.1 - Last Updated:  01 May, 2018 - By C_far (adding Dialog_SetListitemPreviewVehCol)
                                                    24 March, 2018 - By Gammix*/
/***************************************/
 
// by BigETI
#include <memory.inc>
 
// definitions
#if !defined MAX_DIALOG_PREVIEW_MODELS
    #define MAX_DIALOG_PREVIEW_MODELS 350
#endif
 
#if !defined MAX_DIALOG_PREVIEW_TEXTSIZE
    #define MAX_DIALOG_PREVIEW_TEXTSIZE 128
#endif
 
#define DIALOG_STYLE_PREVIEW_MODEL 6 // new dialog id definition
#define DIALOG_STYLE_PREVMODEL DIALOG_STYLE_PREVIEW_MODEL
 
#define MAX_DIALOG_PREVIEW_ROWS 2
#define MAX_DIALOG_PREVIEW_COLUMNS 6
 
#define DIALOG_PREVIEW_HORIZONTAL_GAP 56.5
#define DIALOG_PREVIEW_VERTICAL_GAP 63.5
 
#define DIALOG_PREVIEW_SELECT_COLOR 0xFF0000FF
#define DIALOG_PREVIEW_UNSELECT_COLOR 0x464646FF
 
#define SCROLL_BAR_UP_TEXTDRAW Prev@FrameTD[4]
#define SCROLL_BAR_DOWN_TEXTDRAW Prev@FrameTD[6]
 
#define LEFT_BUTTON_TEXTDRAW Prev@LeftButtonTD[0]
#define RIGHT_BUTTON_TEXTDRAW Prev@RightButtonTD[0]
#define CENTER_BUTTON_TEXTDRAW Prev@CenterButtonTD[0]
 
#define LISTITEM_TEXTDRAW<%0> Prev@ModelTD[%0][0]
#define LISTITEM_ROTATE_LEFT_TEXTDRAW<%0> Prev@ModelTD[%0][2]
#define LISTITEM_ROTATE_RIGHT_TEXTDRAW<%0> Prev@ModelTD[%0][3]
#define LISTITEM_ZOOM_IN_TEXTDRAW<%0> Prev@ModelTD[%0][4]
#define LISTITEM_ZOOM_OUT_TEXTDRAW<%0> Prev@ModelTD[%0][5]
 
// variables
static Text:Prev@FrameTD[8];
static Text:Prev@LeftButtonTD[2];
static Text:Prev@RightButtonTD[2];
static Text:Prev@CenterButtonTD[2];
static Text:Prev@ModelTD[MAX_DIALOG_PREVIEW_ROWS * MAX_DIALOG_PREVIEW_COLUMNS][8];
 
static PlayerText:Prev@HeaderPTD[MAX_PLAYERS];
static PlayerText:Prev@LeftButtonPTD[MAX_PLAYERS];
static PlayerText:Prev@RightButtonPTD[MAX_PLAYERS];
static PlayerText:Prev@CenterButtonPTD[MAX_PLAYERS];
static PlayerText:Prev@PageNumberPTD[MAX_PLAYERS];
static PlayerText:Prev@ScrollBarPTD[MAX_PLAYERS];
static PlayerText:Prev@ModelTextPTD[MAX_PLAYERS][MAX_DIALOG_PREVIEW_ROWS * MAX_DIALOG_PREVIEW_COLUMNS][3];
 
static bool:Prev@CancelSelection[MAX_PLAYERS];
 
static Prev@PlayerDialogID[MAX_PLAYERS];
static Prev@PlayerDialogListitem[MAX_PLAYERS];
static Prev@PlayerDialogNumListitems[MAX_PLAYERS];
static Prev@PlayerDialogPage[MAX_PLAYERS];
static Prev@PlayerDialogTickCount[MAX_PLAYERS];
 
static Pointer:Prev@PlayerModelsPointer[MAX_PLAYERS];
static Pointer:Prev@PlayerModelRotsPointer[MAX_PLAYERS][4];
static Pointer:Prev@PlayerModelNamesPointer[MAX_PLAYERS][MAX_DIALOG_PREVIEW_MODELS];
static Pointer:Prev@PlayerModelsVehColPointer[MAX_PLAYERS][2];
 
// public function decleration
ShowPreviewModelDialog(playerid, dialogid, caption[], models[], labels[][], button1[], button2[], size = sizeof models);
SetDialogPreviewRotation(playerid, listitem, Float:rx, Float:ry, Float:rz, Float:zoom);
SetDialogPreviewVehCol(playerid, listitem, color1, color2);
 
// internal functions
static Prev_GetNumPages(playerid) {
    new SIZE = Prev@PlayerDialogNumListitems[playerid];
    new PAGESIZE = (MAX_DIALOG_PREVIEW_ROWS * MAX_DIALOG_PREVIEW_COLUMNS);
    return ((SIZE / PAGESIZE) + ((SIZE % PAGESIZE) ? 1 : 0));
}
 
static Prev_CancelSelectTextDraw(playerid) {
    Prev@CancelSelection[playerid] = true;
    return CancelSelectTextDraw(playerid);
}
 
static Prev_CreateTextDraws() {
    /*
    * FRAME
    */
    Prev@FrameTD[0] = TextDrawCreate(144.0000, 143.0000, "CONTENT_BOX");
    TextDrawFont(Prev@FrameTD[0], 2);
    TextDrawLetterSize(Prev@FrameTD[0], 0.0000, 19.5000);
    TextDrawColor(Prev@FrameTD[0], -1);
    TextDrawSetShadow(Prev@FrameTD[0], 0);
    TextDrawSetOutline(Prev@FrameTD[0], 0);
    TextDrawBackgroundColor(Prev@FrameTD[0], 255);
    TextDrawSetProportional(Prev@FrameTD[0], 1);
    TextDrawUseBox(Prev@FrameTD[0], 1);
    TextDrawBoxColor(Prev@FrameTD[0], 175);
    TextDrawTextSize(Prev@FrameTD[0], 501.0000, 0.0000);
 
    Prev@FrameTD[1] = TextDrawCreate(146.5000, 155.5000, "LD_SPAC:WHITE");
    TextDrawFont(Prev@FrameTD[1], 4);
    TextDrawLetterSize(Prev@FrameTD[1], 0.0000, 18.2000);
    TextDrawColor(Prev@FrameTD[1], -1);
    TextDrawSetShadow(Prev@FrameTD[1], 0);
    TextDrawSetOutline(Prev@FrameTD[1], 0);
    TextDrawBackgroundColor(Prev@FrameTD[1], 255);
    TextDrawSetProportional(Prev@FrameTD[1], 1);
    TextDrawUseBox(Prev@FrameTD[1], 1);
    TextDrawBoxColor(Prev@FrameTD[1], 150);
    TextDrawTextSize(Prev@FrameTD[1], 351.5000, 130.0000);
 
    Prev@FrameTD[2] = TextDrawCreate(147.0000, 156.0000, "LD_SPAC:BLACK");
    TextDrawFont(Prev@FrameTD[2], 4);
    TextDrawLetterSize(Prev@FrameTD[2], 0.0000, 18.2000);
    TextDrawColor(Prev@FrameTD[2], -1);
    TextDrawSetShadow(Prev@FrameTD[2], 0);
    TextDrawSetOutline(Prev@FrameTD[2], 0);
    TextDrawBackgroundColor(Prev@FrameTD[2], 255);
    TextDrawSetProportional(Prev@FrameTD[2], 1);
    TextDrawUseBox(Prev@FrameTD[2], 1);
    TextDrawBoxColor(Prev@FrameTD[2], 150);
    TextDrawTextSize(Prev@FrameTD[2], 340.5000, 129.0000);
 
    Prev@FrameTD[3] = TextDrawCreate(488.0000, 156.0000, "LD_SPAC:BLACK");
    TextDrawFont(Prev@FrameTD[3], 4);
    TextDrawLetterSize(Prev@FrameTD[3], 0.0000, 18.2000);
    TextDrawColor(Prev@FrameTD[3], -1);
    TextDrawSetShadow(Prev@FrameTD[3], 0);
    TextDrawSetOutline(Prev@FrameTD[3], 0);
    TextDrawBackgroundColor(Prev@FrameTD[3], 255);
    TextDrawSetProportional(Prev@FrameTD[3], 1);
    TextDrawUseBox(Prev@FrameTD[3], 1);
    TextDrawBoxColor(Prev@FrameTD[3], 150);
    TextDrawTextSize(Prev@FrameTD[3], 9.5000, 129.0000);
 
    // button for scrolling up
    Prev@FrameTD[4] = TextDrawCreate(488.0000, 156.0000, "LD_POOL:BALL");
    TextDrawFont(Prev@FrameTD[4], 4);
    TextDrawLetterSize(Prev@FrameTD[4], 0.0000, 18.2000);
    TextDrawColor(Prev@FrameTD[4], -1);
    TextDrawSetShadow(Prev@FrameTD[4], 0);
    TextDrawSetOutline(Prev@FrameTD[4], 0);
    TextDrawBackgroundColor(Prev@FrameTD[4], 255);
    TextDrawSetProportional(Prev@FrameTD[4], 1);
    TextDrawUseBox(Prev@FrameTD[4], 1);
    TextDrawBoxColor(Prev@FrameTD[4], 150);
    TextDrawTextSize(Prev@FrameTD[4], 9.5000, 9.5000);
    TextDrawSetSelectable(Prev@FrameTD[4], 1);
    //
 
    Prev@FrameTD[5] = TextDrawCreate(489.0000, 156.5000, "LD_BEAT:UP");
    TextDrawFont(Prev@FrameTD[5], 4);
    TextDrawLetterSize(Prev@FrameTD[5], 0.0000, 18.2000);
    TextDrawColor(Prev@FrameTD[5], 255);
    TextDrawSetShadow(Prev@FrameTD[5], 0);
    TextDrawSetOutline(Prev@FrameTD[5], 0);
    TextDrawBackgroundColor(Prev@FrameTD[5], 255);
    TextDrawSetProportional(Prev@FrameTD[5], 1);
    TextDrawUseBox(Prev@FrameTD[5], 1);
    TextDrawBoxColor(Prev@FrameTD[5], 150);
    TextDrawTextSize(Prev@FrameTD[5], 7.5000, 7.5000);
 
    // button for scrolling down
    Prev@FrameTD[6] = TextDrawCreate(488.0000, 275.5000, "LD_POOL:BALL");
    TextDrawFont(Prev@FrameTD[6], 4);
    TextDrawLetterSize(Prev@FrameTD[6], 0.0000, 18.2000);
    TextDrawColor(Prev@FrameTD[6], -1);
    TextDrawSetShadow(Prev@FrameTD[6], 0);
    TextDrawSetOutline(Prev@FrameTD[6], 0);
    TextDrawBackgroundColor(Prev@FrameTD[6], 255);
    TextDrawSetProportional(Prev@FrameTD[6], 1);
    TextDrawUseBox(Prev@FrameTD[6], 1);
    TextDrawBoxColor(Prev@FrameTD[6], 150);
    TextDrawTextSize(Prev@FrameTD[6], 9.5000, 9.5000);
    TextDrawSetSelectable(Prev@FrameTD[6], 1);
    //
 
    Prev@FrameTD[7] = TextDrawCreate(489.0000, 277.0000, "LD_BEAT:DOWN");
    TextDrawFont(Prev@FrameTD[7], 4);
    TextDrawLetterSize(Prev@FrameTD[7], 0.0000, 18.2000);
    TextDrawColor(Prev@FrameTD[7], 255);
    TextDrawSetShadow(Prev@FrameTD[7], 0);
    TextDrawSetOutline(Prev@FrameTD[7], 0);
    TextDrawBackgroundColor(Prev@FrameTD[7], 255);
    TextDrawSetProportional(Prev@FrameTD[7], 1);
    TextDrawUseBox(Prev@FrameTD[7], 1);
    TextDrawBoxColor(Prev@FrameTD[7], 150);
    TextDrawTextSize(Prev@FrameTD[7], 7.5000, 7.5000);
 
    /*
    * LEFT BUTTON (button1)
    */
    // left button for response type "1"
    Prev@LeftButtonTD[0] = TextDrawCreate(260.0000, 293.0000, "LD_SPAC:WHITE");
    TextDrawFont(Prev@LeftButtonTD[0], 4);
    TextDrawLetterSize(Prev@LeftButtonTD[0], 0.5000, 1.0000);
    TextDrawColor(Prev@LeftButtonTD[0], -1);
    TextDrawSetShadow(Prev@LeftButtonTD[0], 0);
    TextDrawSetOutline(Prev@LeftButtonTD[0], 0);
    TextDrawBackgroundColor(Prev@LeftButtonTD[0], 255);
    TextDrawSetProportional(Prev@LeftButtonTD[0], 1);
    TextDrawTextSize(Prev@LeftButtonTD[0], 55.0000, 18.0000);
    TextDrawSetSelectable(Prev@LeftButtonTD[0], 1);
    //
 
    Prev@LeftButtonTD[1] = TextDrawCreate(260.5000, 293.5000, "LD_SPAC:BLACK");
    TextDrawFont(Prev@LeftButtonTD[1], 4);
    TextDrawLetterSize(Prev@LeftButtonTD[1], 0.5000, 1.0000);
    TextDrawColor(Prev@LeftButtonTD[1], -1);
    TextDrawSetShadow(Prev@LeftButtonTD[1], 0);
    TextDrawSetOutline(Prev@LeftButtonTD[1], 0);
    TextDrawBackgroundColor(Prev@LeftButtonTD[1], 255);
    TextDrawSetProportional(Prev@LeftButtonTD[1], 1);
    TextDrawTextSize(Prev@LeftButtonTD[1], 54.0000, 17.0000);
 
    /*
    * RIGHT BUTTON (button2)
    */
    // right button for response type "0"
    Prev@RightButtonTD[0] = TextDrawCreate(325.0000, 293.0000, "LD_SPAC:WHITE");
    TextDrawFont(Prev@RightButtonTD[0], 4);
    TextDrawLetterSize(Prev@RightButtonTD[0], 0.5000, 1.0000);
    TextDrawColor(Prev@RightButtonTD[0], -1);
    TextDrawSetShadow(Prev@RightButtonTD[0], 0);
    TextDrawSetOutline(Prev@RightButtonTD[0], 0);
    TextDrawBackgroundColor(Prev@RightButtonTD[0], 255);
    TextDrawSetProportional(Prev@RightButtonTD[0], 1);
    TextDrawTextSize(Prev@RightButtonTD[0], 55.0000, 18.0000);
    TextDrawSetSelectable(Prev@RightButtonTD[0], 1);
    //
 
    Prev@RightButtonTD[1] = TextDrawCreate(325.5000, 293.5000, "LD_SPAC:BLACK");
    TextDrawFont(Prev@RightButtonTD[1], 4);
    TextDrawLetterSize(Prev@RightButtonTD[1], 0.5000, 1.0000);
    TextDrawColor(Prev@RightButtonTD[1], -1);
    TextDrawSetShadow(Prev@RightButtonTD[1], 0);
    TextDrawSetOutline(Prev@RightButtonTD[1], 0);
    TextDrawBackgroundColor(Prev@RightButtonTD[1], 255);
    TextDrawSetProportional(Prev@RightButtonTD[1], 1);
    TextDrawTextSize(Prev@RightButtonTD[1], 54.0000, 17.0000);
 
    /*
    * CENTER BUTTON (button3)
    */
    // right button for response type "0"
    Prev@CenterButtonTD[0] = TextDrawCreate(290.5000, 293.0000, "LD_SPAC:WHITE");
    TextDrawFont(Prev@CenterButtonTD[0], 4);
    TextDrawLetterSize(Prev@CenterButtonTD[0], 0.5000, 1.0000);
    TextDrawColor(Prev@CenterButtonTD[0], -1);
    TextDrawSetShadow(Prev@CenterButtonTD[0], 0);
    TextDrawSetOutline(Prev@CenterButtonTD[0], 0);
    TextDrawBackgroundColor(Prev@CenterButtonTD[0], 255);
    TextDrawSetProportional(Prev@CenterButtonTD[0], 1);
    TextDrawTextSize(Prev@CenterButtonTD[0], 55.0000, 18.0000);
    TextDrawSetSelectable(Prev@CenterButtonTD[0], 1);
    //
 
    Prev@CenterButtonTD[1] = TextDrawCreate(291.0000, 293.5000, "LD_SPAC:BLACK");
    TextDrawFont(Prev@CenterButtonTD[1], 4);
    TextDrawLetterSize(Prev@CenterButtonTD[1], 0.5000, 1.0000);
    TextDrawColor(Prev@CenterButtonTD[1], -1);
    TextDrawSetShadow(Prev@CenterButtonTD[1], 0);
    TextDrawSetOutline(Prev@CenterButtonTD[1], 0);
    TextDrawBackgroundColor(Prev@CenterButtonTD[1], 255);
    TextDrawSetProportional(Prev@CenterButtonTD[1], 1);
    TextDrawTextSize(Prev@CenterButtonTD[1], 54.0000, 17.0000);
 
    /*
    * PREVIEW MODEL LISTITEMS
    */
    new textdrawid;
 
    for (new a = 0; a < MAX_DIALOG_PREVIEW_ROWS; a++) {
        for (new b = 0; b < MAX_DIALOG_PREVIEW_COLUMNS; b++) {
            textdrawid = ((a * MAX_DIALOG_PREVIEW_COLUMNS) + b);
 
            // listitem border button to select item
            Prev@ModelTD[textdrawid][0] = TextDrawCreate((148.5000 + (b * DIALOG_PREVIEW_HORIZONTAL_GAP)), (157.5000 + (a * DIALOG_PREVIEW_VERTICAL_GAP)), "LD_SPAC:WHITE");
            TextDrawFont(Prev@ModelTD[textdrawid][0], 4);
            TextDrawLetterSize(Prev@ModelTD[textdrawid][0], 0.5000, 1.0000);
            TextDrawColor(Prev@ModelTD[textdrawid][0], -16776961);
            TextDrawSetShadow(Prev@ModelTD[textdrawid][0], 0);
            TextDrawSetOutline(Prev@ModelTD[textdrawid][0], 0);
            TextDrawBackgroundColor(Prev@ModelTD[textdrawid][0], 255);
            TextDrawSetProportional(Prev@ModelTD[textdrawid][0], 1);
            TextDrawTextSize(Prev@ModelTD[textdrawid][0], 55.0000, 62.0000);
            TextDrawSetSelectable(Prev@ModelTD[textdrawid][0], 1);
            //
 
            Prev@ModelTD[textdrawid][1] = TextDrawCreate((149.0000 + (b * DIALOG_PREVIEW_HORIZONTAL_GAP)), (158.0000 + (a * DIALOG_PREVIEW_VERTICAL_GAP)), "MODEL");
            TextDrawFont(Prev@ModelTD[textdrawid][1], 5);
            TextDrawLetterSize(Prev@ModelTD[textdrawid][1], 0.5000, 1.0000);
            TextDrawColor(Prev@ModelTD[textdrawid][1], -1);
            TextDrawSetShadow(Prev@ModelTD[textdrawid][1], 0);
            TextDrawSetOutline(Prev@ModelTD[textdrawid][1], 0);
            TextDrawBackgroundColor(Prev@ModelTD[textdrawid][1], 842150655);
            TextDrawSetProportional(Prev@ModelTD[textdrawid][1], 1);
            TextDrawTextSize(Prev@ModelTD[textdrawid][1], 54.0000, 61.0000);
            TextDrawSetPreviewModel(Prev@ModelTD[textdrawid][1], 132);
            TextDrawSetPreviewRot(Prev@ModelTD[textdrawid][1], 0.0000, 0.0000, -50.0000, 1.0000);
 
            // listitem rotation button (left)
            Prev@ModelTD[textdrawid][2] = TextDrawCreate((157.5000 + (b * DIALOG_PREVIEW_HORIZONTAL_GAP)), (204.0000 + (a * DIALOG_PREVIEW_VERTICAL_GAP)), "LD_BEAT:LEFT");
            TextDrawFont(Prev@ModelTD[textdrawid][2], 4);
            TextDrawLetterSize(Prev@ModelTD[textdrawid][2], 0.5000, 1.0000);
            TextDrawColor(Prev@ModelTD[textdrawid][2], -156);
            TextDrawSetShadow(Prev@ModelTD[textdrawid][2], 0);
            TextDrawSetOutline(Prev@ModelTD[textdrawid][2], 0);
            TextDrawBackgroundColor(Prev@ModelTD[textdrawid][2], 255);
            TextDrawSetProportional(Prev@ModelTD[textdrawid][2], 1);
            TextDrawTextSize(Prev@ModelTD[textdrawid][2], 10.0000, 10.0000);
            TextDrawSetSelectable(Prev@ModelTD[textdrawid][2], 1);
            //
 
            // listitem rotation button (right)
            Prev@ModelTD[textdrawid][3] = TextDrawCreate((185.0000 + (b * DIALOG_PREVIEW_HORIZONTAL_GAP)), (204.0000 + (a * DIALOG_PREVIEW_VERTICAL_GAP)), "LD_BEAT:RIGHT");
            TextDrawFont(Prev@ModelTD[textdrawid][3], 4);
            TextDrawLetterSize(Prev@ModelTD[textdrawid][3], 0.5000, 1.0000);
            TextDrawColor(Prev@ModelTD[textdrawid][3], -156);
            TextDrawSetShadow(Prev@ModelTD[textdrawid][3], 0);
            TextDrawSetOutline(Prev@ModelTD[textdrawid][3], 0);
            TextDrawBackgroundColor(Prev@ModelTD[textdrawid][3], 255);
            TextDrawSetProportional(Prev@ModelTD[textdrawid][3], 1);
            TextDrawTextSize(Prev@ModelTD[textdrawid][3], 10.0000, 10.0000);
            TextDrawSetSelectable(Prev@ModelTD[textdrawid][3], 1);
            //
 
            // listitem zoom-in button
            Prev@ModelTD[textdrawid][4] = TextDrawCreate((191.5000 + (b * DIALOG_PREVIEW_HORIZONTAL_GAP)), (171.0000 + (a * DIALOG_PREVIEW_VERTICAL_GAP)), "LD_BEAT:UP");
            TextDrawFont(Prev@ModelTD[textdrawid][4], 4);
            TextDrawLetterSize(Prev@ModelTD[textdrawid][4], 0.5000, 1.0000);
            TextDrawColor(Prev@ModelTD[textdrawid][4], -156);
            TextDrawSetShadow(Prev@ModelTD[textdrawid][4], 0);
            TextDrawSetOutline(Prev@ModelTD[textdrawid][4], 0);
            TextDrawBackgroundColor(Prev@ModelTD[textdrawid][4], 255);
            TextDrawSetProportional(Prev@ModelTD[textdrawid][4], 1);
            TextDrawTextSize(Prev@ModelTD[textdrawid][4], 10.0000, 10.0000);
            TextDrawSetSelectable(Prev@ModelTD[textdrawid][4], 1);
            //
 
            // listitem zoom-out button
            Prev@ModelTD[textdrawid][5] = TextDrawCreate((191.5000 + (b * DIALOG_PREVIEW_HORIZONTAL_GAP)), (193.0000 + (a * DIALOG_PREVIEW_VERTICAL_GAP)), "LD_BEAT:DOWN");
            TextDrawFont(Prev@ModelTD[textdrawid][5], 4);
            TextDrawLetterSize(Prev@ModelTD[textdrawid][5], 0.5000, 1.0000);
            TextDrawColor(Prev@ModelTD[textdrawid][5], -156);
            TextDrawSetShadow(Prev@ModelTD[textdrawid][5], 0);
            TextDrawSetOutline(Prev@ModelTD[textdrawid][5], 0);
            TextDrawBackgroundColor(Prev@ModelTD[textdrawid][5], 255);
            TextDrawSetProportional(Prev@ModelTD[textdrawid][5], 1);
            TextDrawTextSize(Prev@ModelTD[textdrawid][5], 10.0000, 10.0000);
            TextDrawSetSelectable(Prev@ModelTD[textdrawid][5], 1);
            //
        }
    }
}
 
static Prev_DestroyTextDraws() {
    /*
    * FRAME
    */
    for (new i = 0; i < sizeof Prev@FrameTD; i++) {
        TextDrawDestroy(Prev@FrameTD[i]);
    }
 
    /*
    * LEFT BUTTON (button1)
    */
    TextDrawDestroy(Prev@LeftButtonTD[0]);
    TextDrawDestroy(Prev@LeftButtonTD[1]);
 
    /*
    * RIGHT BUTTON (button2)
    */
    TextDrawDestroy(Prev@RightButtonTD[0]);
    TextDrawDestroy(Prev@RightButtonTD[1]);
 
    /*
    * CENTER BUTTON (button1)
    */
    TextDrawDestroy(Prev@CenterButtonTD[0]);
    TextDrawDestroy(Prev@CenterButtonTD[1]);
 
    /*
    * PREVIEW MODEL LISTITEMS
    */
    for (new i = 0; i < (MAX_DIALOG_PREVIEW_ROWS * MAX_DIALOG_PREVIEW_COLUMNS); i++) {
        TextDrawDestroy(Prev@ModelTD[i][0]);
        TextDrawDestroy(Prev@ModelTD[i][1]);
        TextDrawDestroy(Prev@ModelTD[i][2]);
        TextDrawDestroy(Prev@ModelTD[i][3]);
        TextDrawDestroy(Prev@ModelTD[i][4]);
        TextDrawDestroy(Prev@ModelTD[i][5]);
    }
}
 
static Prev_CreatePlayerTextDraws(playerid, header[], button1[], button2[], button3[], totalItems) {
    /*
    * HEADER
    */
    Prev@HeaderPTD[playerid] = CreatePlayerTextDraw(playerid, 144.0000, 143.0000, header);
    PlayerTextDrawFont(playerid, Prev@HeaderPTD[playerid], 2);
    PlayerTextDrawLetterSize(playerid, Prev@HeaderPTD[playerid], 0.1399, 0.8999);
    PlayerTextDrawColor(playerid, Prev@HeaderPTD[playerid], -1);
    PlayerTextDrawSetShadow(playerid, Prev@HeaderPTD[playerid], 0);
    PlayerTextDrawSetOutline(playerid, Prev@HeaderPTD[playerid], 0);
    PlayerTextDrawBackgroundColor(playerid, Prev@HeaderPTD[playerid], 255);
    PlayerTextDrawSetProportional(playerid, Prev@HeaderPTD[playerid], 1);
    PlayerTextDrawUseBox(playerid, Prev@HeaderPTD[playerid], 1);
    PlayerTextDrawBoxColor(playerid, Prev@HeaderPTD[playerid], 255);
    PlayerTextDrawTextSize(playerid, Prev@HeaderPTD[playerid], 501.0000, 0.0000);
 
    /*
    * LEFT BUTTON (button1)
    */
    if (button1[0] != EOS) {
        Prev@LeftButtonPTD[playerid] = CreatePlayerTextDraw(playerid, 287.5000, 297.0000, button1);
        PlayerTextDrawFont(playerid, Prev@LeftButtonPTD[playerid], 2);
        PlayerTextDrawLetterSize(playerid, Prev@LeftButtonPTD[playerid], 0.1399, 0.8999);
        PlayerTextDrawAlignment(playerid, Prev@LeftButtonPTD[playerid], 2);
        PlayerTextDrawColor(playerid, Prev@LeftButtonPTD[playerid], -1);
        PlayerTextDrawSetShadow(playerid, Prev@LeftButtonPTD[playerid], 0);
        PlayerTextDrawSetOutline(playerid, Prev@LeftButtonPTD[playerid], 0);
        PlayerTextDrawBackgroundColor(playerid, Prev@LeftButtonPTD[playerid], 255);
        PlayerTextDrawSetProportional(playerid, Prev@LeftButtonPTD[playerid], 1);
        PlayerTextDrawTextSize(playerid, Prev@LeftButtonPTD[playerid], 0.0000, 480.0000);
    } else {
        Prev@LeftButtonPTD[playerid] = PlayerText:INVALID_TEXT_DRAW;
    }
 
    /*
    * RIGHT BUTTON (button2)
    */
    if (button2[0] != EOS) {
        Prev@RightButtonPTD[playerid] = CreatePlayerTextDraw(playerid, 352.5000, 297.0000, button2);
        PlayerTextDrawFont(playerid, Prev@RightButtonPTD[playerid], 2);
        PlayerTextDrawLetterSize(playerid, Prev@RightButtonPTD[playerid], 0.1399, 0.8999);
        PlayerTextDrawAlignment(playerid, Prev@RightButtonPTD[playerid], 2);
        PlayerTextDrawColor(playerid, Prev@RightButtonPTD[playerid], -1);
        PlayerTextDrawSetShadow(playerid, Prev@RightButtonPTD[playerid], 0);
        PlayerTextDrawSetOutline(playerid, Prev@RightButtonPTD[playerid], 0);
        PlayerTextDrawBackgroundColor(playerid, Prev@RightButtonPTD[playerid], 255);
        PlayerTextDrawSetProportional(playerid, Prev@RightButtonPTD[playerid], 1);
        PlayerTextDrawTextSize(playerid, Prev@RightButtonPTD[playerid], 0.0000, 480.0000);
    } else {
        Prev@RightButtonPTD[playerid] = PlayerText:INVALID_TEXT_DRAW;
    }
 
    /*
    * CENTER BUTTON (button3)
    */
    if (button3[0] != EOS) {
        Prev@CenterButtonPTD[playerid] = CreatePlayerTextDraw(playerid, 318.0000, 297.0000, button3);
        PlayerTextDrawFont(playerid, Prev@CenterButtonPTD[playerid], 2);
        PlayerTextDrawLetterSize(playerid, Prev@CenterButtonPTD[playerid], 0.1399, 0.8999);
        PlayerTextDrawAlignment(playerid, Prev@CenterButtonPTD[playerid], 2);
        PlayerTextDrawColor(playerid, Prev@CenterButtonPTD[playerid], -1);
        PlayerTextDrawSetShadow(playerid, Prev@CenterButtonPTD[playerid], 0);
        PlayerTextDrawSetOutline(playerid, Prev@CenterButtonPTD[playerid], 0);
        PlayerTextDrawBackgroundColor(playerid, Prev@CenterButtonPTD[playerid], 255);
        PlayerTextDrawSetProportional(playerid, Prev@CenterButtonPTD[playerid], 1);
        PlayerTextDrawTextSize(playerid, Prev@CenterButtonPTD[playerid], 0.0000, 480.0000);
    } else {
        Prev@CenterButtonPTD[playerid] = PlayerText:INVALID_TEXT_DRAW;
    }
 
    /*
    * PAGE NUMBER
    */
    if (totalItems > (MAX_DIALOG_PREVIEW_ROWS * MAX_DIALOG_PREVIEW_COLUMNS)) { // if there are more than "12" listitems, create page textdraw
        Prev@PageNumberPTD[playerid] = CreatePlayerTextDraw(playerid, 501.5000, 143.0000, "Page: 1");
        PlayerTextDrawFont(playerid, Prev@PageNumberPTD[playerid], 2);
        PlayerTextDrawLetterSize(playerid, Prev@PageNumberPTD[playerid], 0.1399, 0.8999);
        PlayerTextDrawAlignment(playerid, Prev@PageNumberPTD[playerid], 3);
        PlayerTextDrawColor(playerid, Prev@PageNumberPTD[playerid], -1);
        PlayerTextDrawSetShadow(playerid, Prev@PageNumberPTD[playerid], 0);
        PlayerTextDrawSetOutline(playerid, Prev@PageNumberPTD[playerid], 0);
        PlayerTextDrawBackgroundColor(playerid, Prev@PageNumberPTD[playerid], 255);
        PlayerTextDrawSetProportional(playerid, Prev@PageNumberPTD[playerid], 1);
        PlayerTextDrawTextSize(playerid, Prev@PageNumberPTD[playerid], 501.0000, 0.0000);
    } else {
        Prev@PageNumberPTD[playerid] = PlayerText:INVALID_TEXT_DRAW;
    }
 
    /*
    * PREVIEW MODEL LISTITEMS
    */
    new textdrawid;
 
    for (new a = 0; a < MAX_DIALOG_PREVIEW_ROWS; a++) {
        for (new b = 0; b < MAX_DIALOG_PREVIEW_COLUMNS; b++) {
            textdrawid = ((a * MAX_DIALOG_PREVIEW_COLUMNS) + b);
 
            if (textdrawid >= totalItems) {
                Prev@ModelTextPTD[playerid][textdrawid][0] = PlayerText:INVALID_TEXT_DRAW;
                Prev@ModelTextPTD[playerid][textdrawid][1] = PlayerText:INVALID_TEXT_DRAW;
                continue;
            }
 
            Prev@ModelTextPTD[playerid][textdrawid][0] = CreatePlayerTextDraw(playerid, (153.5000 + (b * DIALOG_PREVIEW_HORIZONTAL_GAP)), (161.5000 + (a * DIALOG_PREVIEW_VERTICAL_GAP)), "");
            PlayerTextDrawFont(playerid, Prev@ModelTextPTD[playerid][textdrawid][0], 2);
            PlayerTextDrawLetterSize(playerid, Prev@ModelTextPTD[playerid][textdrawid][0], 0.1399, 0.8999);
            PlayerTextDrawColor(playerid, Prev@ModelTextPTD[playerid][textdrawid][0], -1);
            PlayerTextDrawSetShadow(playerid, Prev@ModelTextPTD[playerid][textdrawid][0], 0);
            PlayerTextDrawSetOutline(playerid, Prev@ModelTextPTD[playerid][textdrawid][0], 0);
            PlayerTextDrawBackgroundColor(playerid, Prev@ModelTextPTD[playerid][textdrawid][0], 255);
            PlayerTextDrawSetProportional(playerid, Prev@ModelTextPTD[playerid][textdrawid][0], 1);
            PlayerTextDrawUseBox(playerid, Prev@ModelTextPTD[playerid][textdrawid][0], 1);
            PlayerTextDrawBoxColor(playerid, Prev@ModelTextPTD[playerid][textdrawid][0], 0);
            PlayerTextDrawTextSize(playerid, Prev@ModelTextPTD[playerid][textdrawid][0], (201.5000 + (b * DIALOG_PREVIEW_HORIZONTAL_GAP)), 0.0000);
 
            Prev@ModelTextPTD[playerid][textdrawid][1] = CreatePlayerTextDraw(playerid, (176.5000 + (b * DIALOG_PREVIEW_HORIZONTAL_GAP)), (204.5000 + (a * DIALOG_PREVIEW_VERTICAL_GAP)), "0.0");
            PlayerTextDrawFont(playerid, Prev@ModelTextPTD[playerid][textdrawid][1], 2);
            PlayerTextDrawLetterSize(playerid, Prev@ModelTextPTD[playerid][textdrawid][1], 0.1399, 0.8999);
            PlayerTextDrawAlignment(playerid, Prev@ModelTextPTD[playerid][textdrawid][1], 2);
            PlayerTextDrawColor(playerid, Prev@ModelTextPTD[playerid][textdrawid][1], -156);
            PlayerTextDrawSetShadow(playerid, Prev@ModelTextPTD[playerid][textdrawid][1], 0);
            PlayerTextDrawSetOutline(playerid, Prev@ModelTextPTD[playerid][textdrawid][1], 0);
            PlayerTextDrawBackgroundColor(playerid, Prev@ModelTextPTD[playerid][textdrawid][1], 255);
            PlayerTextDrawSetProportional(playerid, Prev@ModelTextPTD[playerid][textdrawid][1], 1);
            PlayerTextDrawTextSize(playerid, Prev@ModelTextPTD[playerid][textdrawid][1], 640.0000, 480.0000);
 
            Prev@ModelTextPTD[playerid][textdrawid][2] = CreatePlayerTextDraw(playerid, (196.5000 + (b * DIALOG_PREVIEW_HORIZONTAL_GAP)), (182.0000 + (a * DIALOG_PREVIEW_VERTICAL_GAP)), "0.0");
            PlayerTextDrawFont(playerid, Prev@ModelTextPTD[playerid][textdrawid][2], 2);
            PlayerTextDrawLetterSize(playerid, Prev@ModelTextPTD[playerid][textdrawid][2], 0.1399, 0.8999);
            PlayerTextDrawAlignment(playerid, Prev@ModelTextPTD[playerid][textdrawid][2], 2);
            PlayerTextDrawColor(playerid, Prev@ModelTextPTD[playerid][textdrawid][2], -156);
            PlayerTextDrawSetShadow(playerid, Prev@ModelTextPTD[playerid][textdrawid][2], 0);
            PlayerTextDrawSetOutline(playerid, Prev@ModelTextPTD[playerid][textdrawid][2], 0);
            PlayerTextDrawBackgroundColor(playerid, Prev@ModelTextPTD[playerid][textdrawid][2], 255);
            PlayerTextDrawSetProportional(playerid, Prev@ModelTextPTD[playerid][textdrawid][2], 1);
            PlayerTextDrawTextSize(playerid, Prev@ModelTextPTD[playerid][textdrawid][2], 640.0000, 480.0000);
        }
    }
 
    /*
    * SCROLLBAR
    */
    Prev@ScrollBarPTD[playerid] = PlayerText:INVALID_TEXT_DRAW; // we will create this later if needed in dialog
}
 
static Prev_DestroyPlayerTextDraws(playerid) {
    /*
    * HEADER
    */
    PlayerTextDrawDestroy(playerid, Prev@HeaderPTD[playerid]);
 
    /*
    * LEFT BUTTON (button1)
    */
    PlayerTextDrawDestroy(playerid, Prev@LeftButtonPTD[playerid]);
 
    /*
    * RIGHT BUTTON (button2)
    */
    PlayerTextDrawDestroy(playerid, Prev@RightButtonPTD[playerid]);
 
    /*
    * CENTER BUTTON (button3)
    */
    PlayerTextDrawDestroy(playerid, Prev@CenterButtonPTD[playerid]);
 
    /*
    * PAGE NUMBER
    */
    PlayerTextDrawDestroy(playerid, Prev@PageNumberPTD[playerid]);
 
    /*
    * SCROLLBAR
    */
    PlayerTextDrawDestroy(playerid, Prev@ScrollBarPTD[playerid]);
 
    /*
    * PREVIEW MODEL LISTITEMS
    */
    for (new i = 0; i < (MAX_DIALOG_PREVIEW_ROWS * MAX_DIALOG_PREVIEW_COLUMNS); i++) {
        PlayerTextDrawDestroy(playerid, Prev@ModelTextPTD[playerid][i][0]);
        PlayerTextDrawDestroy(playerid, Prev@ModelTextPTD[playerid][i][1]);
        PlayerTextDrawDestroy(playerid, Prev@ModelTextPTD[playerid][i][2]);
    }
}
 
static Prev_UpdateScrollBar(playerid, page, totalPages) {
    PlayerTextDrawDestroy(playerid, Prev@ScrollBarPTD[playerid]);
 
    const Float:MAX_HEIGHT = 108.0000;
    new Float:height = (MAX_HEIGHT / totalPages);
    new Float:y = 166.5000;
    y += (height * page);
 
    Prev@ScrollBarPTD[playerid] = CreatePlayerTextDraw(playerid, 489.0000, y, "LD_SPAC:WHITE");
    PlayerTextDrawFont(playerid, Prev@ScrollBarPTD[playerid], 4);
    PlayerTextDrawLetterSize(playerid, Prev@ScrollBarPTD[playerid], 0.0000, 18.2000);
    PlayerTextDrawColor(playerid, Prev@ScrollBarPTD[playerid], -16776961);
    PlayerTextDrawSetShadow(playerid, Prev@ScrollBarPTD[playerid], 0);
    PlayerTextDrawSetOutline(playerid, Prev@ScrollBarPTD[playerid], 0);
    PlayerTextDrawBackgroundColor(playerid, Prev@ScrollBarPTD[playerid], 255);
    PlayerTextDrawSetProportional(playerid, Prev@ScrollBarPTD[playerid], 1);
    PlayerTextDrawUseBox(playerid, Prev@ScrollBarPTD[playerid], 1);
    PlayerTextDrawBoxColor(playerid, Prev@ScrollBarPTD[playerid], 150);
    PlayerTextDrawTextSize(playerid, Prev@ScrollBarPTD[playerid], 7.5000, height);
 
    PlayerTextDrawShow(playerid, Prev@ScrollBarPTD[playerid]);
}
 
static Prev_UpdateListitems(playerid, page, selected, totalItems) {
    new textdrawid;
    new listitem;
 
    new name[MAX_DIALOG_PREVIEW_TEXTSIZE];
 
    for (new a = 0; a < MAX_DIALOG_PREVIEW_ROWS; a++) {
        for (new b = 0; b < MAX_DIALOG_PREVIEW_COLUMNS; b++) {
            textdrawid = ((a * MAX_DIALOG_PREVIEW_COLUMNS) + b);
            listitem = ((page * (MAX_DIALOG_PREVIEW_ROWS * MAX_DIALOG_PREVIEW_COLUMNS)) + textdrawid);
 
            if (listitem >= totalItems) {
                TextDrawHideForPlayer(playerid, Prev@ModelTD[textdrawid][0]);
                TextDrawHideForPlayer(playerid, Prev@ModelTD[textdrawid][1]);
                TextDrawHideForPlayer(playerid, Prev@ModelTD[textdrawid][2]);
                TextDrawHideForPlayer(playerid, Prev@ModelTD[textdrawid][3]);
                TextDrawHideForPlayer(playerid, Prev@ModelTD[textdrawid][4]);
                TextDrawHideForPlayer(playerid, Prev@ModelTD[textdrawid][5]);
 
                PlayerTextDrawHide(playerid, Prev@ModelTextPTD[playerid][textdrawid][0]);
                PlayerTextDrawHide(playerid, Prev@ModelTextPTD[playerid][textdrawid][1]);
                PlayerTextDrawHide(playerid, Prev@ModelTextPTD[playerid][textdrawid][2]);
 
                continue;
            }
 
            TextDrawSetPreviewModel(Prev@ModelTD[textdrawid][1], MEM_get_val(Prev@PlayerModelsPointer[playerid], listitem));
            TextDrawSetPreviewRot(Prev@ModelTD[textdrawid][1], Float:MEM_get_val(Prev@PlayerModelRotsPointer[playerid][0], listitem), Float:MEM_get_val(Prev@PlayerModelRotsPointer[playerid][1], listitem), Float:MEM_get_val(Prev@PlayerModelRotsPointer[playerid][2], listitem), Float:MEM_get_val(Prev@PlayerModelRotsPointer[playerid][3], listitem));
            TextDrawSetPreviewVehCol(Prev@ModelTD[textdrawid][1], MEM_get_val(Prev@PlayerModelsVehColPointer[playerid][0], listitem), MEM_get_val(Prev@PlayerModelsVehColPointer[playerid][1], listitem));
            TextDrawShowForPlayer(playerid, Prev@ModelTD[textdrawid][1]);
 
            if (textdrawid == selected) {
                TextDrawColor(Prev@ModelTD[textdrawid][0], DIALOG_PREVIEW_SELECT_COLOR);
                TextDrawShowForPlayer(playerid, Prev@ModelTD[textdrawid][0]);
 
                TextDrawShowForPlayer(playerid, Prev@ModelTD[textdrawid][2]);
                TextDrawShowForPlayer(playerid, Prev@ModelTD[textdrawid][3]);
 
                TextDrawShowForPlayer(playerid, Prev@ModelTD[textdrawid][4]);
                TextDrawShowForPlayer(playerid, Prev@ModelTD[textdrawid][5]);
 
                new string[16];
                format(string, sizeof string, "%0.1f", Float:MEM_get_val(Prev@PlayerModelRotsPointer[playerid][2], listitem));
                PlayerTextDrawSetString(playerid, Prev@ModelTextPTD[playerid][textdrawid][1], string);
                PlayerTextDrawShow(playerid, Prev@ModelTextPTD[playerid][textdrawid][1]);
 
                format(string, sizeof string, "%0.1f", Float:MEM_get_val(Prev@PlayerModelRotsPointer[playerid][3], listitem));
                PlayerTextDrawSetString(playerid, Prev@ModelTextPTD[playerid][textdrawid][2], string);
                PlayerTextDrawShow(playerid, Prev@ModelTextPTD[playerid][textdrawid][2]);
            } else {
                TextDrawColor(Prev@ModelTD[textdrawid][0], DIALOG_PREVIEW_UNSELECT_COLOR);
                TextDrawShowForPlayer(playerid, Prev@ModelTD[textdrawid][0]);
 
                TextDrawHideForPlayer(playerid, Prev@ModelTD[textdrawid][2]);
                TextDrawHideForPlayer(playerid, Prev@ModelTD[textdrawid][3]);
 
                TextDrawHideForPlayer(playerid, Prev@ModelTD[textdrawid][4]);
                TextDrawHideForPlayer(playerid, Prev@ModelTD[textdrawid][5]);
 
                PlayerTextDrawHide(playerid, Prev@ModelTextPTD[playerid][textdrawid][1]);
                PlayerTextDrawHide(playerid, Prev@ModelTextPTD[playerid][textdrawid][2]);
            }
 
            if (MEM_get_arr(Prev@PlayerModelNamesPointer[playerid][listitem], 0, name, MEM_get_size(Prev@PlayerModelNamesPointer[playerid][listitem])) != MEM_NULLFEPTR) {
                PlayerTextDrawSetString(playerid, Prev@ModelTextPTD[playerid][textdrawid][0], name);
                PlayerTextDrawShow(playerid, Prev@ModelTextPTD[playerid][textdrawid][0]);
            } else {
                PlayerTextDrawHide(playerid, Prev@ModelTextPTD[playerid][textdrawid][0]);
            }
        }
    }
 
    new string[16];
    format(string, sizeof string, "PAGE: %i/%i", (page + 1), Prev_GetNumPages(playerid));
    PlayerTextDrawSetString(playerid, Prev@PageNumberPTD[playerid], string);
}
 
static Prev_HidePlayerDialog(playerid) {
    /*
    * FRAME
    */
    for (new i = 0; i < sizeof Prev@FrameTD; i++) {
        TextDrawHideForPlayer(playerid, Prev@FrameTD[i]);
    }
 
    /*
    * LEFT BUTTON
    */
    TextDrawHideForPlayer(playerid, Prev@LeftButtonTD[0]);
    TextDrawHideForPlayer(playerid, Prev@LeftButtonTD[1]);
 
    /*
    * RIGHT BUTTON
    */
    TextDrawHideForPlayer(playerid, Prev@RightButtonTD[0]);
    TextDrawHideForPlayer(playerid, Prev@RightButtonTD[1]);
 
    /*
    * CENTER BUTTON
    */
    TextDrawHideForPlayer(playerid, Prev@CenterButtonTD[0]);
    TextDrawHideForPlayer(playerid, Prev@CenterButtonTD[1]);
 
    /*
    * PREVIEW MODEL LISTITEMS
    */
    for (new i = 0; i < (MAX_DIALOG_PREVIEW_ROWS * MAX_DIALOG_PREVIEW_COLUMNS); i++) {
        TextDrawHideForPlayer(playerid, Prev@ModelTD[i][0]);
        TextDrawHideForPlayer(playerid, Prev@ModelTD[i][1]);
        TextDrawHideForPlayer(playerid, Prev@ModelTD[i][2]);
        TextDrawHideForPlayer(playerid, Prev@ModelTD[i][3]);
        TextDrawHideForPlayer(playerid, Prev@ModelTD[i][4]);
        TextDrawHideForPlayer(playerid, Prev@ModelTD[i][5]);
    }
 
    /*
    * DESTROY DIALOG PLAYER TEXTDRAWS
    */
    Prev_DestroyPlayerTextDraws(playerid);
 
    // reset player data
    MEM_delete(Prev@PlayerModelsPointer[playerid]);
    Prev@PlayerModelsPointer[playerid] = MEM_NULLPTR;
 
    for (new i = 0; i < Prev@PlayerDialogNumListitems[playerid]; i++) {
        MEM_delete(Prev@PlayerModelNamesPointer[playerid][i]);
        Prev@PlayerModelNamesPointer[playerid][i] = MEM_NULLPTR;
    }
 
    Prev@PlayerDialogID[playerid] = -1;
 
    return Prev_CancelSelectTextDraw(playerid);
}
 
// hooked methods
public OnGameModeInit() {
    Prev_CreateTextDraws();
 
    #if defined PDialog_OnGameModeInit
        return PDialog_OnGameModeInit();
    #else
        return 1;
    #endif
}
#if defined _ALS_OnGameModeInit
    #undef OnGameModeInit
#else
    #define _ALS_OnGameModeInit
#endif
#define OnGameModeInit PDialog_OnGameModeInit
#if defined PDialog_OnGameModeInit
    forward PDialog_OnGameModeInit();
#endif
 
public OnGameModeExit() {
    Prev_DestroyTextDraws();
 
    #if defined PDialog_OnGameModeExit
        return PDialog_OnGameModeExit();
    #else
        return 1;
    #endif
}
#if defined _ALS_OnGameModeExit
    #undef OnGameModeExit
#else
    #define _ALS_OnGameModeExit
#endif
#define OnGameModeExit PDialog_OnGameModeExit
#if defined PDialog_OnGameModeExit
    forward PDialog_OnGameModeExit();
#endif
 
public OnFilterScriptInit() {
    Prev_CreateTextDraws();
 
    #if defined PDialog_OnFilterScriptInit
        return PDialog_OnFilterScriptInit();
    #else
        return 1;
    #endif
}
#if defined _ALS_OnFilterScriptInit
    #undef OnFilterScriptInit
#else
    #define _ALS_OnFilterScriptInit
#endif
#define OnFilterScriptInit PDialog_OnFilterScriptInit
#if defined PDialog_OnFilterScriptInit
    forward PDialog_OnFilterScriptInit();
#endif
 
public OnFilterScriptExit() {
    Prev_DestroyTextDraws();
 
    #if defined PDialog_OnFilterScriptExit
        return PDialog_OnFilterScriptExit();
    #else
        return 1;
    #endif
}
#if defined _ALS_OnFilterScriptExit
    #undef OnFilterScriptExit
#else
    #define _ALS_OnFilterScriptExit
#endif
#define OnFilterScriptExit PDialog_OnFilterScriptExit
#if defined PDialog_OnFilterScriptExit
    forward PDialog_OnFilterScriptExit();
#endif
 
public OnPlayerConnect(playerid) {
    Prev@CancelSelection[playerid] = false;
 
    Prev@PlayerDialogID[playerid] = -1;
 
    static const Float:__ROTATIONS[MAX_DIALOG_PREVIEW_MODELS] = {0.0, ...};
    Prev@PlayerModelRotsPointer[playerid][0] = MEM_new_arr(_:__ROTATIONS, MAX_DIALOG_PREVIEW_MODELS);
    Prev@PlayerModelRotsPointer[playerid][1] = MEM_new_arr(_:__ROTATIONS, MAX_DIALOG_PREVIEW_MODELS);
    Prev@PlayerModelRotsPointer[playerid][2] = MEM_new_arr(_:__ROTATIONS, MAX_DIALOG_PREVIEW_MODELS);
 
    static const __COLORS[MAX_DIALOG_PREVIEW_MODELS] = {0, ...};
    Prev@PlayerModelsVehColPointer[playerid][0] = MEM_new_arr(__COLORS, MAX_DIALOG_PREVIEW_MODELS);
    Prev@PlayerModelsVehColPointer[playerid][1] = MEM_new_arr(__COLORS, MAX_DIALOG_PREVIEW_MODELS);
 
    static const Float:__ZOOM[MAX_DIALOG_PREVIEW_MODELS] = {1.0, ...};
    Prev@PlayerModelRotsPointer[playerid][3] = MEM_new_arr(_:__ZOOM, MAX_DIALOG_PREVIEW_MODELS);
 
    #if defined PDialog_OnPlayerConnect
        return PDialog_OnPlayerConnect(playerid);
    #else
        return 1;
    #endif
}
#if defined _ALS_OnPlayerConnect
    #undef OnPlayerConnect
#else
    #define _ALS_OnPlayerConnect
#endif
#define OnPlayerConnect PDialog_OnPlayerConnect
#if defined PDialog_OnPlayerConnect
    forward PDialog_OnPlayerConnect(playerid);
#endif
 
public OnPlayerDisconnect(playerid, reason) {
    MEM_delete(Prev@PlayerModelsPointer[playerid]);
    Prev@PlayerModelsPointer[playerid] = MEM_NULLPTR;
 
    MEM_delete(Prev@PlayerModelRotsPointer[playerid][0]);
    MEM_delete(Prev@PlayerModelRotsPointer[playerid][1]);
    MEM_delete(Prev@PlayerModelRotsPointer[playerid][2]);
    MEM_delete(Prev@PlayerModelRotsPointer[playerid][3]);
    Prev@PlayerModelRotsPointer[playerid][0] = MEM_NULLPTR;
    Prev@PlayerModelRotsPointer[playerid][1] = MEM_NULLPTR;
    Prev@PlayerModelRotsPointer[playerid][2] = MEM_NULLPTR;
    Prev@PlayerModelRotsPointer[playerid][3] = MEM_NULLPTR;
 
    MEM_delete(Prev@PlayerModelsVehColPointer[playerid][0]);
    MEM_delete(Prev@PlayerModelsVehColPointer[playerid][1]);
    Prev@PlayerModelsVehColPointer[playerid][0] = MEM_NULLPTR;
    Prev@PlayerModelsVehColPointer[playerid][1] = MEM_NULLPTR;
 
    for (new i = 0; i < Prev@PlayerDialogNumListitems[playerid]; i++) {
        MEM_delete(Prev@PlayerModelNamesPointer[playerid][i]);
        Prev@PlayerModelNamesPointer[playerid][i] = MEM_NULLPTR;
    }
 
    #if defined PDialog_OnPlayerDisconnect
        return PDialog_OnPlayerDisconnect(playerid, reason);
    #else
        return 1;
    #endif
}
#if defined _ALS_OnPlayerDisconnect
    #undef OnPlayerDisconnect
#else
    #define _ALS_OnPlayerDisconnect
#endif
#define OnPlayerDisconnect PDialog_OnPlayerDisconnect
#if defined PDialog_OnPlayerDisconnect
    forward PDialog_OnPlayerDisconnect(playerid, reason);
#endif
 
public OnPlayerClickTextDraw(playerid, Text:clickedid) {
    if (Prev@CancelSelection[playerid]) {
        Prev@CancelSelection[playerid] = false;
 
        #if defined PDialog_OnPlayerClickTextDraw
            return PDialog_OnPlayerClickTextDraw(playerid, Text:clickedid);
        #else
            return 1;
        #endif
    }
 
    if (Prev@PlayerDialogID[playerid] != -1) {
        if (clickedid == Text:INVALID_TEXT_DRAW || clickedid == RIGHT_BUTTON_TEXTDRAW) {
            new dialogid = Prev@PlayerDialogID[playerid];
            new listitem = ((Prev@PlayerDialogPage[playerid] * (MAX_DIALOG_PREVIEW_ROWS * MAX_DIALOG_PREVIEW_COLUMNS)) + Prev@PlayerDialogListitem[playerid]);
            new inputtext[16];
            valstr(inputtext, MEM_get_val(Prev@PlayerModelsPointer[playerid], listitem));
 
            Prev_HidePlayerDialog(playerid);
 
            CallLocalFunction("OnDialogResponse", "iiiis", playerid, dialogid, 0, listitem, inputtext);
 
        } else if (clickedid == SCROLL_BAR_UP_TEXTDRAW) {
            if (Prev@PlayerDialogPage[playerid] > 0) {
                Prev_UpdateListitems(playerid, --Prev@PlayerDialogPage[playerid], 0, Prev@PlayerDialogNumListitems[playerid]);
                Prev_UpdateScrollBar(playerid, Prev@PlayerDialogPage[playerid], Prev_GetNumPages(playerid));
 
                Prev@PlayerDialogListitem[playerid] = 0;
            }
 
        } else if (clickedid == SCROLL_BAR_DOWN_TEXTDRAW) {
            if ((Prev@PlayerDialogPage[playerid] + 1) < Prev_GetNumPages(playerid)) {
                Prev_UpdateListitems(playerid, ++Prev@PlayerDialogPage[playerid], 0, Prev@PlayerDialogNumListitems[playerid]);
                Prev_UpdateScrollBar(playerid, Prev@PlayerDialogPage[playerid], Prev_GetNumPages(playerid));
 
                Prev@PlayerDialogListitem[playerid] = 0;
            }
 
        } else if (clickedid == LEFT_BUTTON_TEXTDRAW || clickedid == CENTER_BUTTON_TEXTDRAW) {
            new dialogid = Prev@PlayerDialogID[playerid];
            new listitem = ((Prev@PlayerDialogPage[playerid] * (MAX_DIALOG_PREVIEW_ROWS * MAX_DIALOG_PREVIEW_COLUMNS)) + Prev@PlayerDialogListitem[playerid]);
            new inputtext[16];
            valstr(inputtext, MEM_get_val(Prev@PlayerModelsPointer[playerid], listitem));
 
            Prev_HidePlayerDialog(playerid);
 
            CallLocalFunction("OnDialogResponse", "iiiis", playerid, dialogid, 1, listitem, inputtext);
 
        } else if (clickedid == LISTITEM_ROTATE_LEFT_TEXTDRAW<Prev@PlayerDialogListitem[playerid]>) {
            new listitem = ((Prev@PlayerDialogPage[playerid] * (MAX_DIALOG_PREVIEW_ROWS * MAX_DIALOG_PREVIEW_COLUMNS)) + Prev@PlayerDialogListitem[playerid]);
 
            new Float:rx, Float:ry, Float:rz, Float:rzoom;
            rx = Float:MEM_get_val(Prev@PlayerModelRotsPointer[playerid][0], listitem);
            ry = Float:MEM_get_val(Prev@PlayerModelRotsPointer[playerid][1], listitem);
            rz = Float:MEM_get_val(Prev@PlayerModelRotsPointer[playerid][2], listitem);
            rzoom = Float:MEM_get_val(Prev@PlayerModelRotsPointer[playerid][3], listitem);
 
            rz -= 10.0;
            MEM_set_val(Prev@PlayerModelRotsPointer[playerid][2], listitem, _:rz);
 
            TextDrawSetPreviewRot(Prev@ModelTD[Prev@PlayerDialogListitem[playerid]][1], rx, ry, rz, rzoom);
            TextDrawShowForPlayer(playerid, Prev@ModelTD[Prev@PlayerDialogListitem[playerid]][1]);
 
            new string[16];
            format(string, sizeof string, "%0.1f", rz);
            PlayerTextDrawSetString(playerid, Prev@ModelTextPTD[playerid][Prev@PlayerDialogListitem[playerid]][1], string);
            PlayerTextDrawShow(playerid, Prev@ModelTextPTD[playerid][Prev@PlayerDialogListitem[playerid]][1]);
 
        } else if (clickedid == LISTITEM_ROTATE_RIGHT_TEXTDRAW<Prev@PlayerDialogListitem[playerid]>) {
            new listitem = ((Prev@PlayerDialogPage[playerid] * (MAX_DIALOG_PREVIEW_ROWS * MAX_DIALOG_PREVIEW_COLUMNS)) + Prev@PlayerDialogListitem[playerid]);
 
            new Float:rx, Float:ry, Float:rz, Float:rzoom;
            rx = Float:MEM_get_val(Prev@PlayerModelRotsPointer[playerid][0], listitem);
            ry = Float:MEM_get_val(Prev@PlayerModelRotsPointer[playerid][1], listitem);
            rz = Float:MEM_get_val(Prev@PlayerModelRotsPointer[playerid][2], listitem);
            rzoom = Float:MEM_get_val(Prev@PlayerModelRotsPointer[playerid][3], listitem);
 
            rz += 10.0;
            MEM_set_val(Prev@PlayerModelRotsPointer[playerid][2], listitem, _:rz);
 
            TextDrawSetPreviewRot(Prev@ModelTD[Prev@PlayerDialogListitem[playerid]][1], rx, ry, rz, rzoom);
            TextDrawShowForPlayer(playerid, Prev@ModelTD[Prev@PlayerDialogListitem[playerid]][1]);
 
            new string[16];
            format(string, sizeof string, "%0.1f", rz);
            PlayerTextDrawSetString(playerid, Prev@ModelTextPTD[playerid][Prev@PlayerDialogListitem[playerid]][1], string);
            PlayerTextDrawShow(playerid, Prev@ModelTextPTD[playerid][Prev@PlayerDialogListitem[playerid]][1]);
 
        } else if (clickedid == LISTITEM_ZOOM_IN_TEXTDRAW<Prev@PlayerDialogListitem[playerid]>) {
            new listitem = ((Prev@PlayerDialogPage[playerid] * (MAX_DIALOG_PREVIEW_ROWS * MAX_DIALOG_PREVIEW_COLUMNS)) + Prev@PlayerDialogListitem[playerid]);
 
            new Float:rx, Float:ry, Float:rz, Float:rzoom;
            rx = Float:MEM_get_val(Prev@PlayerModelRotsPointer[playerid][0], listitem);
            ry = Float:MEM_get_val(Prev@PlayerModelRotsPointer[playerid][1], listitem);
            rz = Float:MEM_get_val(Prev@PlayerModelRotsPointer[playerid][2], listitem);
            rzoom = Float:MEM_get_val(Prev@PlayerModelRotsPointer[playerid][3], listitem);
 
            rzoom -= 0.1;
            MEM_set_val(Prev@PlayerModelRotsPointer[playerid][3], listitem, _:rzoom);
 
            TextDrawSetPreviewRot(Prev@ModelTD[Prev@PlayerDialogListitem[playerid]][1], rx, ry, rz, rzoom);
            TextDrawShowForPlayer(playerid, Prev@ModelTD[Prev@PlayerDialogListitem[playerid]][1]);
 
            new string[16];
            format(string, sizeof string, "%0.1f", rzoom);
            PlayerTextDrawSetString(playerid, Prev@ModelTextPTD[playerid][Prev@PlayerDialogListitem[playerid]][2], string);
            PlayerTextDrawShow(playerid, Prev@ModelTextPTD[playerid][Prev@PlayerDialogListitem[playerid]][2]);
 
        } else if (clickedid == LISTITEM_ZOOM_OUT_TEXTDRAW<Prev@PlayerDialogListitem[playerid]>) {
            new listitem = ((Prev@PlayerDialogPage[playerid] * (MAX_DIALOG_PREVIEW_ROWS * MAX_DIALOG_PREVIEW_COLUMNS)) + Prev@PlayerDialogListitem[playerid]);
 
            new Float:rx, Float:ry, Float:rz, Float:rzoom;
            rx = Float:MEM_get_val(Prev@PlayerModelRotsPointer[playerid][0], listitem);
            ry = Float:MEM_get_val(Prev@PlayerModelRotsPointer[playerid][1], listitem);
            rz = Float:MEM_get_val(Prev@PlayerModelRotsPointer[playerid][2], listitem);
            rzoom = Float:MEM_get_val(Prev@PlayerModelRotsPointer[playerid][3], listitem);
 
            rzoom += 0.1;
            MEM_set_val(Prev@PlayerModelRotsPointer[playerid][3], listitem, _:rzoom);
 
            TextDrawSetPreviewRot(Prev@ModelTD[Prev@PlayerDialogListitem[playerid]][1], rx, ry, rz, rzoom);
            TextDrawShowForPlayer(playerid, Prev@ModelTD[Prev@PlayerDialogListitem[playerid]][1]);
 
            new string[16];
            format(string, sizeof string, "%0.1f", rzoom);
            PlayerTextDrawSetString(playerid, Prev@ModelTextPTD[playerid][Prev@PlayerDialogListitem[playerid]][2], string);
            PlayerTextDrawShow(playerid, Prev@ModelTextPTD[playerid][Prev@PlayerDialogListitem[playerid]][2]);
 
        } else {
            for (new i = 0; i < (MAX_DIALOG_PREVIEW_ROWS * MAX_DIALOG_PREVIEW_COLUMNS); i++) {
                if (clickedid == LISTITEM_TEXTDRAW<i>) {
 
                    if (Prev@PlayerDialogListitem[playerid] == i && (GetTickCount() - Prev@PlayerDialogTickCount[playerid]) <= 200) {
                        new dialogid = Prev@PlayerDialogID[playerid];
                        new listitem = ((Prev@PlayerDialogPage[playerid] * (MAX_DIALOG_PREVIEW_ROWS * MAX_DIALOG_PREVIEW_COLUMNS)) + Prev@PlayerDialogListitem[playerid]);
                        new inputtext[16];
                        valstr(inputtext, MEM_get_val(Prev@PlayerModelsPointer[playerid], listitem));
 
                        Prev_HidePlayerDialog(playerid);
 
                        CallLocalFunction("OnDialogResponse", "iiiis", playerid, dialogid, 1, listitem, inputtext);
 
                    } else {
                        // reset previous listitem
                        new previous = Prev@PlayerDialogListitem[playerid];
 
                        TextDrawColor(Prev@ModelTD[previous][0], DIALOG_PREVIEW_UNSELECT_COLOR);
                        TextDrawShowForPlayer(playerid, Prev@ModelTD[previous][0]);
 
                        TextDrawHideForPlayer(playerid, Prev@ModelTD[previous][2]);
                        TextDrawHideForPlayer(playerid, Prev@ModelTD[previous][3]);
 
                        TextDrawHideForPlayer(playerid, Prev@ModelTD[previous][4]);
                        TextDrawHideForPlayer(playerid, Prev@ModelTD[previous][5]);
 
                        PlayerTextDrawHide(playerid, Prev@ModelTextPTD[playerid][previous][1]);
                        PlayerTextDrawHide(playerid, Prev@ModelTextPTD[playerid][previous][2]);
 
                        // update new selected listitem
                        TextDrawColor(Prev@ModelTD[i][0], DIALOG_PREVIEW_SELECT_COLOR);
                        TextDrawShowForPlayer(playerid, Prev@ModelTD[i][0]);
 
                        TextDrawShowForPlayer(playerid, Prev@ModelTD[i][2]);
                        TextDrawShowForPlayer(playerid, Prev@ModelTD[i][3]);
 
                        TextDrawShowForPlayer(playerid, Prev@ModelTD[i][4]);
                        TextDrawShowForPlayer(playerid, Prev@ModelTD[i][5]);
 
                        new listitem = ((Prev@PlayerDialogPage[playerid] * (MAX_DIALOG_PREVIEW_ROWS * MAX_DIALOG_PREVIEW_COLUMNS)) + i);
                        new string[16];
                        format(string, sizeof string, "%0.1f", Float:MEM_get_val(Prev@PlayerModelRotsPointer[playerid][2], listitem));
                        PlayerTextDrawSetString(playerid, Prev@ModelTextPTD[playerid][i][1], string);
                        PlayerTextDrawShow(playerid, Prev@ModelTextPTD[playerid][i][1]);
                        
                        format(string, sizeof string, "%0.1f", Float:MEM_get_val(Prev@PlayerModelRotsPointer[playerid][3], listitem));
                        PlayerTextDrawSetString(playerid, Prev@ModelTextPTD[playerid][i][2], string);
                        PlayerTextDrawShow(playerid, Prev@ModelTextPTD[playerid][i][2]);
 
                        Prev@PlayerDialogListitem[playerid] = i;
                        Prev@PlayerDialogTickCount[playerid] = GetTickCount();
                    }
 
                    break;
                }
            }
        }
    }
 
    #if defined PDialog_OnPlayerClickTextDraw
        return PDialog_OnPlayerClickTextDraw(playerid, Text:clickedid);
    #else
        return 1;
    #endif
}
#if defined _ALS_OnPlayerClickTextDraw
    #undef OnPlayerClickTextDraw
#else
    #define _ALS_OnPlayerClickTextDraw
#endif
#define OnPlayerClickTextDraw PDialog_OnPlayerClickTextDraw
#if defined PDialog_OnPlayerClickTextDraw
    forward PDialog_OnPlayerClickTextDraw(playerid, Text:clickedid);
#endif
 
stock Prev_ShowPlayerDialog(playerid, dialogid, style, caption[], info[], button1[], button2[]) {
    if (playerid < 0 || playerid >= MAX_PLAYERS) {
        return 0;
    }
 
    if (Prev@PlayerDialogID[playerid] != -1) {
        Prev_HidePlayerDialog(playerid);
    }
 
    if (style != DIALOG_STYLE_PREVIEW_MODEL) {
        return ShowPlayerDialog(playerid, dialogid, style, caption, info, button1, button2);
    }
 
    if (dialogid < 0) {
        if (style == DIALOG_STYLE_PREVIEW_MODEL) {
            return 1;
        }
 
        return ShowPlayerDialog(playerid, dialogid, style, caption, info, button1, button2);
    }
 
    new modelstr[8];
    new listitem[sizeof(modelstr) + 2 + MAX_DIALOG_PREVIEW_TEXTSIZE];
    new pos = 0;
    new next;
    new end;
    new count = 0;
    new bool:valid;
    new models[MAX_DIALOG_PREVIEW_MODELS];
 
    do {
        // split "info" to indvidual listitems
        next = strfind(info, "\n", false, pos);
        end = (next == -1) ? strlen(info) : next;
 
        strmid(listitem, info, pos, end, sizeof(listitem));
 
        pos = (next == -1) ? -1 : (next + 1);
 
        // split "listitem" from '\t' delim
        next = strfind(listitem, "\t");
        if (next == -1) {
            modelstr[0] = EOS;
            strcat(modelstr, listitem);
        }
        else {
            strmid(modelstr, listitem, 0, pos);
        }
 
        // model validity check
        valid = false;
        for (new i = 0; modelstr[i] != EOS; i++) {
            if (modelstr[i] >= '0' && modelstr[i] <= '9') {
                valid = true;
                break;
            }
        }
 
        if (!valid)
            continue;
 
        models[count] = strval(modelstr);
 
        // listitem text validity check
        valid = false;
        for (new i = next + 1; listitem[i] != EOS; i++) {
            if (listitem[i] != ' ') {
                valid = true;
                break;
            }
        }
 
        Prev@PlayerModelNamesPointer[playerid][count] = valid ? MEM_new_arr(listitem[next + 1], strlen(listitem[next + 1])) : MEM_NULLPTR;
 
        // check if number of models doesnt exceed the array size
        if (++count == MAX_DIALOG_PREVIEW_MODELS) {
            printf("[PreviewModelDialog.inc] - Warning: You have more than \"MAX_DIALOG_PREVIEW_MODELS\" ("#MAX_DIALOG_PREVIEW_MODELS") listitems in your dialog, only the first "#MAX_DIALOG_PREVIEW_MODELS" listitems were loaded.");
            break;
        }
 
    } while (pos != -1);
 
    if (count == 0) {
        return 0;
    }
 
    // set player data
    Prev@PlayerDialogID[playerid] = dialogid;
    Prev@PlayerDialogListitem[playerid] = 0;
    Prev@PlayerDialogNumListitems[playerid] = count;
    Prev@PlayerDialogPage[playerid] = 0;
    Prev@PlayerDialogTickCount[playerid] = 0;
 
    Prev@PlayerModelsPointer[playerid] = MEM_new_arr(models, Prev@PlayerDialogNumListitems[playerid]);
 
    /*
    * FRAME
    */
    for (new i = 0; i < sizeof Prev@FrameTD; i++) {
        TextDrawShowForPlayer(playerid, Prev@FrameTD[i]);
    }
 
    /*
    * BUTTONS AND PLAYER DIALOG TEXTDRAWS
    */
    if (button2[0] == EOS) { // only one center button
        TextDrawHideForPlayer(playerid, Prev@LeftButtonTD[0]);
        TextDrawHideForPlayer(playerid, Prev@LeftButtonTD[1]);
 
        TextDrawHideForPlayer(playerid, Prev@RightButtonTD[0]);
        TextDrawHideForPlayer(playerid, Prev@RightButtonTD[1]);
 
        TextDrawShowForPlayer(playerid, Prev@CenterButtonTD[0]);
        TextDrawShowForPlayer(playerid, Prev@CenterButtonTD[1]);
 
        Prev_CreatePlayerTextDraws(playerid, caption, "", "", button1, Prev@PlayerDialogNumListitems[playerid]);
        PlayerTextDrawShow(playerid, Prev@CenterButtonPTD[playerid]);
    } else { // dual buttons
        TextDrawShowForPlayer(playerid, Prev@LeftButtonTD[0]);
        TextDrawShowForPlayer(playerid, Prev@LeftButtonTD[1]);
 
        TextDrawShowForPlayer(playerid, Prev@RightButtonTD[0]);
        TextDrawShowForPlayer(playerid, Prev@RightButtonTD[1]);
 
        TextDrawHideForPlayer(playerid, Prev@CenterButtonTD[0]);
        TextDrawHideForPlayer(playerid, Prev@CenterButtonTD[1]);
 
        Prev_CreatePlayerTextDraws(playerid, caption, button1, button2, "", Prev@PlayerDialogNumListitems[playerid]);
        PlayerTextDrawShow(playerid, Prev@LeftButtonPTD[playerid]);
        PlayerTextDrawShow(playerid, Prev@RightButtonPTD[playerid]);
    }
 
    /*
    * HEADER
    */
    PlayerTextDrawShow(playerid, Prev@HeaderPTD[playerid]);
 
    /*
    * PAGE NUMBER
    */
    PlayerTextDrawShow(playerid, Prev@PageNumberPTD[playerid]);
 
    /*
    * SCROLLBAR
    */
    Prev@ScrollBarPTD[playerid] = PlayerText:INVALID_TEXT_DRAW;
    if (Prev@PlayerDialogNumListitems[playerid] > (MAX_DIALOG_PREVIEW_ROWS * MAX_DIALOG_PREVIEW_COLUMNS)) {
        Prev_UpdateScrollBar(playerid, 0, Prev_GetNumPages(playerid));
    }
 
    /*
    * PREVIEW MODEL LISTITEMS
    */
    Prev_UpdateListitems(playerid, 0, 0, Prev@PlayerDialogNumListitems[playerid]);
 
    return SelectTextDraw(playerid, DIALOG_PREVIEW_SELECT_COLOR);
}
#if defined _ALS_ShowPlayerDialog
    #undef ShowPlayerDialog
#else
    #define _ALS_ShowPlayerDialog
#endif
#define ShowPlayerDialog Prev_ShowPlayerDialog
 
stock ShowPreviewModelDialog(playerid, dialogid, caption[], models[], labels[][], button1[], button2[], size = sizeof models) {
    if (playerid < 0 || playerid >= MAX_PLAYERS) {
        return 0;
    }
 
    if (Prev@PlayerDialogID[playerid] != -1) {
        Prev_HidePlayerDialog(playerid);
    }
 
    if (dialogid < 0 || size <= 0) {
        return 0;
    }
 
    if (size >= MAX_DIALOG_PREVIEW_MODELS) {
        size = MAX_DIALOG_PREVIEW_MODELS;
        printf("[PreviewModelDialog.inc] - Warning: You have more than \"MAX_DIALOG_PREVIEW_MODELS\" ("#MAX_DIALOG_PREVIEW_MODELS") listitems in your dialog, only the first "#MAX_DIALOG_PREVIEW_MODELS" listitems were loaded.");
    }
 
    Prev@PlayerModelsPointer[playerid] = MEM_new_arr(models, size);
 
    for (new i = 0; i < size; i++) {
        Prev@PlayerModelNamesPointer[playerid][i] = MEM_new_arr(labels[i], strlen(labels[i]));
    }
 
    /*
    * FRAME
    */
    for (new i = 0; i < sizeof Prev@FrameTD; i++) {
        TextDrawShowForPlayer(playerid, Prev@FrameTD[i]);
    }
 
    // set player data
    Prev@PlayerDialogID[playerid] = dialogid;
    Prev@PlayerDialogListitem[playerid] = 0;
    Prev@PlayerDialogNumListitems[playerid] = size;
    Prev@PlayerDialogPage[playerid] = 0;
    Prev@PlayerDialogTickCount[playerid] = 0;
 
    /*
    * BUTTONS AND PLAYER DIALOG TEXTDRAWS
    */
    if (button2[0] == EOS) { // only one center button
        TextDrawHideForPlayer(playerid, Prev@LeftButtonTD[0]);
        TextDrawHideForPlayer(playerid, Prev@LeftButtonTD[1]);
 
        TextDrawHideForPlayer(playerid, Prev@RightButtonTD[0]);
        TextDrawHideForPlayer(playerid, Prev@RightButtonTD[1]);
 
        TextDrawShowForPlayer(playerid, Prev@CenterButtonTD[0]);
        TextDrawShowForPlayer(playerid, Prev@CenterButtonTD[1]);
 
        Prev_CreatePlayerTextDraws(playerid, caption, "", "", button1, Prev@PlayerDialogNumListitems[playerid]);
        PlayerTextDrawShow(playerid, Prev@CenterButtonPTD[playerid]);
    } else { // dual buttons
        TextDrawShowForPlayer(playerid, Prev@LeftButtonTD[0]);
        TextDrawShowForPlayer(playerid, Prev@LeftButtonTD[1]);
 
        TextDrawShowForPlayer(playerid, Prev@RightButtonTD[0]);
        TextDrawShowForPlayer(playerid, Prev@RightButtonTD[1]);
 
        TextDrawHideForPlayer(playerid, Prev@CenterButtonTD[0]);
        TextDrawHideForPlayer(playerid, Prev@CenterButtonTD[1]);
 
        Prev_CreatePlayerTextDraws(playerid, caption, button1, button2, "", Prev@PlayerDialogNumListitems[playerid]);
        PlayerTextDrawShow(playerid, Prev@LeftButtonPTD[playerid]);
        PlayerTextDrawShow(playerid, Prev@RightButtonPTD[playerid]);
    }
 
    /*
    * HEADER
    */
    PlayerTextDrawShow(playerid, Prev@HeaderPTD[playerid]);
 
    /*
    * PAGE NUMBER
    */
    PlayerTextDrawShow(playerid, Prev@PageNumberPTD[playerid]);
 
    /*
    * SCROLLBAR
    */
    Prev@ScrollBarPTD[playerid] = PlayerText:INVALID_TEXT_DRAW;
    if (Prev@PlayerDialogNumListitems[playerid] > (MAX_DIALOG_PREVIEW_ROWS * MAX_DIALOG_PREVIEW_COLUMNS)) {
        Prev_UpdateScrollBar(playerid, 0, Prev_GetNumPages(playerid));
    }
 
    /*
    * PREVIEW MODEL LISTITEMS
    */
    Prev_UpdateListitems(playerid, 0, 0, Prev@PlayerDialogNumListitems[playerid]);
 
    return SelectTextDraw(playerid, DIALOG_PREVIEW_SELECT_COLOR);
}
 
#define Dialog_ShowPreviewModelDialog \
    ShowPreviewModelDialog
 
#define ShowPlayerPreviewModelDialog \
    ShowPreviewModelDialog
 
stock SetDialogPreviewRotation(playerid, listitem, Float:rx, Float:ry, Float:rz, Float:zoom) {
    if (playerid < 0 || playerid >= MAX_PLAYERS) {
        return 0;
    }
 
    if (listitem < 0 || listitem >= MAX_DIALOG_PREVIEW_MODELS) {
        return 0;
    }
 
    MEM_set_val(Prev@PlayerModelRotsPointer[playerid][0], listitem, _:rx);
    MEM_set_val(Prev@PlayerModelRotsPointer[playerid][1], listitem, _:ry);
    MEM_set_val(Prev@PlayerModelRotsPointer[playerid][2], listitem, _:rz);
    MEM_set_val(Prev@PlayerModelRotsPointer[playerid][3], listitem, _:zoom);
    return 1;
}
 
#define Dialog_SetListitemPreviewRot \
    SetDialogPreviewRotation
 
#define Dialog_SetModelRot \
    Dialog_SetListitemPreviewRot
 
stock SetDialogPreviewVehCol(playerid, listitem, color1, color2) {
    if (playerid < 0 || playerid >= MAX_PLAYERS) {
        return 0;
    }
 
    if (listitem < 0 || listitem >= MAX_DIALOG_PREVIEW_MODELS) {
        return 0;
    }
 
    MEM_set_val(Prev@PlayerModelsVehColPointer[playerid][0], listitem, color1);
    MEM_set_val(Prev@PlayerModelsVehColPointer[playerid][1], listitem, color2);
    return 1;
}
 
#define Dialog_SetListitemPreviewVehCol \
    SetDialogPreviewVehCol
 
#define Dialog_SetModelVehCol \
    Dialog_SetListitemPreviewVehCol

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎