{$CLEO .s}

SCRIPT_NAME 'BUYMOLV'

//***********************************************************************************//
///////////////////////////////////////////////////////////////////////////////////////
// Buy Molotovs at Gas Stations
// Author: AlvarynGTA
///////////////////////////////////////////////////////////////////////////////////////
CONST
    WEAPON_TYPE = 18 // Molotov

    PAD_BUTTON = 15 // Return-Triangle-Y

    ANIM_LIB = "BD_FIRE"
    ANIM_USE = "WASH_UP"

    ANIM2_LIB = "HEIST9"
    ANIM2_USE = "USE_SWIPECARD"

    HELP_TEXT = 'MOLBUY'

    BOTTLE_MODEL = 344

    PUMP_MODEL1 = 3465
    PUMP_MODEL2 = 1686
    PUMP_MODEL3 = 1676
END

// Arguments
INT playerID

// INI settings
INT price, amount, show_help_txt
FLOAT search_radius, detect_offset
FLOAT detect_radius_x, detect_radius_y, detect_radius_z
FLOAT slide_x, slide_y, slide_z

// Variables
INT scPlayer, state, objPump, objHealth, objBottle
INT taskStatus, intSequence
INT requiredPrice, negativePrice
INT activeSide
INT attachedObj

FLOAT slide_x_neg, slide_y_neg, detect_offset_neg
FLOAT x, y, z, heading
//***********************************************************************************//

GOSUB @read_INI

scPlayer = -1
state = 0
activeSide = 0
attachedObj = 0

requiredPrice = price
requiredPrice -= 1

negativePrice = 0
negativePrice -= price

detect_offset_neg = detect_offset
detect_offset_neg *= -1.0

slide_x_neg = slide_x
slide_x_neg *= -1.0

slide_y_neg = slide_y
slide_y_neg *= -1.0

//-----------------------------------------------------------------------------------//
///////////////////////////////////////////////////////////////////////////////////////
//-----------------------------------------------------------------------------------//

//-----------------------------------------------------------------------------//
:MAIN_LOOP
//-----------------------------------------------------------------------------//
WAIT 50

IF NOT IS_PLAYER_PLAYING playerID
THEN
    scPlayer = -1
    IF state > 0
    THEN GOSUB @FULL_RESET
    END
    GOTO @MAIN_LOOP
END

IF OR
    scPlayer <= -1
    NOT DOES_CHAR_EXIST scPlayer
THEN
    scPlayer = GET_PLAYER_CHAR playerID
    IF state > 0
    THEN GOSUB @FULL_RESET
    END
    GOTO @MAIN_LOOP
END

IF OR
    IS_CHAR_DEAD scPlayer
    NOT IS_CHAR_ON_FOOT scPlayer
THEN
    IF state > 0
    THEN GOSUB @FULL_RESET
    END
    GOTO @MAIN_LOOP
END

GOSUB @FIND_NEARBY_PUMP

IF OR
    objPump == -1
    NOT DOES_OBJECT_EXIST objPump
THEN
    IF state > 0
    THEN GOSUB @FULL_RESET
    END
    GOTO @MAIN_LOOP
END

IF state == 0
THEN
    REQUEST_ANIMATION ANIM_LIB
    REQUEST_ANIMATION ANIM2_LIB
    state = 1
END

IF state == 1
THEN
    IF AND
        HAS_ANIMATION_LOADED ANIM_LIB
        HAS_ANIMATION_LOADED ANIM2_LIB
    THEN
        GOSUB @DETECT_ACTIVE_SIDE

        IF activeSide <> 0
        THEN
            IF show_help_txt == 1
            THEN PRINT_HELP_FOREVER_WITH_NUMBER HELP_TEXT price
            END

            SET_PLAYER_ENTER_CAR_BUTTON playerID False
            state = 2
        END
    ELSE state = 0
    END
END

IF state == 2
THEN
    GOSUB @DETECT_ACTIVE_SIDE

    IF activeSide <> 0
    THEN
        IF AND
            IS_BUTTON_PRESSED playerID PAD_BUTTON
            CAN_PLAYER_START_MISSION playerID
        THEN
            IF IS_SCORE_GREATER playerID requiredPrice
            THEN GOSUB @START_PURCHASE
            ELSE
                x, y, z = GET_CHAR_COORDINATES scPlayer
                ADD_ONE_OFF_SOUND x y z 1053 //SoundAmmunationBuyWeaponDenied
            END
        END
    ELSE GOSUB @RESET_TO_READY
    END
END

IF state == 3
THEN
    IF AND
        IS_CHAR_PLAYING_ANIM scPlayer ANIM_USE
        attachedObj == 0
    THEN
        TASK_PICK_UP_OBJECT scPlayer objBottle 0.0 0.0 0.0 6 16 "NULL" "NULL" 1
        attachedObj = 1
    END

    taskStatus = GET_SCRIPT_TASK_STATUS scPlayer 1560
    IF taskStatus == 7
    THEN
        IF show_help_txt == 1
        THEN CLEAR_HELP
        END

        GIVE_WEAPON_TO_CHAR scPlayer WEAPON_TYPE amount
        SET_PLAYER_ENTER_CAR_BUTTON playerID True

        CLEAR_CHAR_TASKS scPlayer

        IF DOES_OBJECT_EXIST objBottle
        THEN DELETE_OBJECT objBottle
        END

        REMOVE_ANIMATION ANIM_LIB
        REMOVE_ANIMATION ANIM2_LIB

        state = 0
        activeSide = 0
        attachedObj = 0
    END
END

GOTO @MAIN_LOOP

//-----------------------------------------------------------------------------------//
///////////////////////////////////////////////////////////////////////////////////////
//-----------------------------------------------------------------------------------//

//_______________________________________________________________
:FIND_NEARBY_PUMP
//_______________________________________________________________
objPump = -1
x, y ,z = GET_CHAR_COORDINATES scPlayer

objPump = GET_RANDOM_OBJECT_IN_SPHERE_NO_SAVE_RECURSIVE x y z search_radius 0

WHILE objPump <> -1
    IF OR
        DOES_OBJECT_HAVE_THIS_MODEL objPump PUMP_MODEL1
        DOES_OBJECT_HAVE_THIS_MODEL objPump PUMP_MODEL2
        DOES_OBJECT_HAVE_THIS_MODEL objPump PUMP_MODEL3
    THEN
        objHealth = GET_OBJECT_HEALTH objPump
        IF objHealth > 0
        THEN RETURN
        END
    END

    objPump = GET_RANDOM_OBJECT_IN_SPHERE_NO_SAVE_RECURSIVE x y z search_radius 1
END
RETURN

//_______________________________________________________________
:DETECT_ACTIVE_SIDE
//_______________________________________________________________
activeSide = 0

// Front
IF DOES_OBJECT_HAVE_THIS_MODEL objPump PUMP_MODEL3
THEN x, y, z = GET_OFFSET_FROM_OBJECT_IN_WORLD_COORDS objPump 0.0 detect_offset_neg 0.0
ELSE x, y, z = GET_OFFSET_FROM_OBJECT_IN_WORLD_COORDS objPump detect_offset_neg 0.0 0.0
END
IF LOCATE_CHAR_ON_FOOT_3D scPlayer x y z detect_radius_x, detect_radius_y, detect_radius_z False
THEN
    activeSide = -1
    RETURN
END

//Back
IF DOES_OBJECT_HAVE_THIS_MODEL objPump PUMP_MODEL3
THEN x, y, z = GET_OFFSET_FROM_OBJECT_IN_WORLD_COORDS objPump 0.0 detect_offset 0.0
ELSE x, y, z = GET_OFFSET_FROM_OBJECT_IN_WORLD_COORDS objPump detect_offset 0.0 0.0
END
IF LOCATE_CHAR_ON_FOOT_3D scPlayer x y z detect_radius_x, detect_radius_y, detect_radius_z False
THEN
    activeSide = 1
    RETURN
END

RETURN

//_______________________________________________________________
:START_PURCHASE
//_______________________________________________________________
heading = GET_OBJECT_HEADING objPump
IF NOT DOES_OBJECT_HAVE_THIS_MODEL objPump PUMP_MODEL3
THEN heading -= 90.0
END

x, y, z = GET_OFFSET_FROM_OBJECT_IN_WORLD_COORDS objPump 0.0 0.0 0.0
objBottle = CREATE_OBJECT_NO_OFFSET BOTTLE_MODEL x y z
SET_OBJECT_VISIBLE objBottle 0

IF activeSide == -1
THEN
    IF DOES_OBJECT_HAVE_THIS_MODEL objPump PUMP_MODEL3
    THEN x, y, z = GET_OFFSET_FROM_OBJECT_IN_WORLD_COORDS objPump slide_x slide_y_neg slide_z
    ELSE x, y, z = GET_OFFSET_FROM_OBJECT_IN_WORLD_COORDS objPump slide_y_neg slide_x_neg slide_z
    END
END

IF activeSide == 1
THEN
    IF DOES_OBJECT_HAVE_THIS_MODEL objPump PUMP_MODEL3
    THEN x, y, z = GET_OFFSET_FROM_OBJECT_IN_WORLD_COORDS objPump slide_x slide_y slide_z
    ELSE x, y, z = GET_OFFSET_FROM_OBJECT_IN_WORLD_COORDS objPump slide_y slide_x slide_z
    END
    heading += 180.0
END

//-----------------------------------
intSequence = OPEN_SEQUENCE_TASK
TASK_CHAR_SLIDE_TO_COORD_AND_PLAY_ANIM -1 x y z heading 0.4 ANIM2_USE ANIM2_LIB 4.0 False False False True 500
TASK_PLAY_ANIM -1 ANIM_USE ANIM_LIB 4.0 False False False False 2000
TASK_PLAY_ANIM -1 ANIM2_USE ANIM2_LIB 4.0 False False False False -1

CLOSE_SEQUENCE_TASK intSequence
PERFORM_SEQUENCE_TASK scPlayer intSequence
CLEAR_SEQUENCE_TASK intSequence
//-----------------------------------

ADD_SCORE playerID negativePrice

IF show_help_txt == 1
THEN CLEAR_HELP
END

x, y, z = GET_CHAR_COORDINATES scPlayer
ADD_ONE_OFF_SOUND x y z 1052

state = 3
RETURN

//_______________________________________________________________
:RESET_TO_READY
//_______________________________________________________________
IF show_help_txt == 1
THEN CLEAR_HELP
END

SET_PLAYER_ENTER_CAR_BUTTON playerID True
state = 1
activeSide = 0
RETURN

//_______________________________________________________________
:FULL_RESET
//_______________________________________________________________
IF state > 1
THEN
    IF show_help_txt == 1
    THEN CLEAR_HELP
    END
    SET_PLAYER_ENTER_CAR_BUTTON playerID True
END

IF AND
    state > 2
    DOES_CHAR_EXIST scPlayer
THEN CLEAR_CHAR_TASKS scPlayer
END

IF DOES_OBJECT_EXIST objBottle
THEN DELETE_OBJECT objBottle
END

REMOVE_ANIMATION ANIM_LIB
REMOVE_ANIMATION ANIM2_LIB

state = 0
activeSide = 0
attachedObj = 0
RETURN

//-----------------------------------------------------------------------------------//
///////////////////////////////////////////////////////////////////////////////////////
//-----------------------------------------------------------------------------------//

//=========================================================================//
:read_INI
//=========================================================================//
IF NOT READ_INT_FROM_INI_FILE "CLEO\BuyMolotovs.ini" "Settings" "PRICE" price
THEN price = 100
END
IF price < 0
THEN price = 0
ELSE
    IF price > 100000
    THEN price = 100000
    END
END

IF NOT READ_INT_FROM_INI_FILE "CLEO\BuyMolotovs.ini" "Settings" "MOLOTOV_AMOUNT" amount
THEN amount = 1
END
IF amount < 1
THEN amount = 1
ELSE
    IF amount > 9999
    THEN amount = 9999
    END
END

IF NOT READ_INT_FROM_INI_FILE "CLEO\BuyMolotovs.ini" "Settings" "SHOW_HELP_TEXT" show_help_txt
THEN show_help_txt = 1
END
IF show_help_txt <> 1
THEN show_help_txt = 0
END

IF NOT READ_FLOAT_FROM_INI_FILE "CLEO\BuyMolotovs.ini" "Settings" "SEARCH_RADIUS" search_radius
THEN search_radius = 3.0
END
IF search_radius < 1.0
THEN search_radius = 1.0
ELSE
    IF search_radius > 10.0
    THEN search_radius = 10.0
    END
END

IF NOT READ_FLOAT_FROM_INI_FILE "CLEO\BuyMolotovs.ini" "Settings" "DETECT_OFFSET" detect_offset
THEN detect_offset = 1.0
END

IF NOT READ_FLOAT_FROM_INI_FILE "CLEO\BuyMolotovs.ini" "Settings" "DETECT_RADIUS_X" detect_radius_x
THEN detect_radius_x = 1.0
END
IF NOT READ_FLOAT_FROM_INI_FILE "CLEO\BuyMolotovs.ini" "Settings" "DETECT_RADIUS_Y" detect_radius_y
THEN detect_radius_y = 1.0
END
IF NOT READ_FLOAT_FROM_INI_FILE "CLEO\BuyMolotovs.ini" "Settings" "DETECT_RADIUS_Z" detect_radius_z
THEN detect_radius_z = 1.2
END

IF NOT READ_FLOAT_FROM_INI_FILE "CLEO\BuyMolotovs.ini" "Settings" "SLIDE_X" slide_x
THEN slide_x = 0.2
END
IF NOT READ_FLOAT_FROM_INI_FILE "CLEO\BuyMolotovs.ini" "Settings" "SLIDE_Y" slide_y
THEN slide_y = 0.8
END
IF NOT READ_FLOAT_FROM_INI_FILE "CLEO\BuyMolotovs.ini" "Settings" "SLIDE_Z" slide_z
THEN slide_z = 0.0
END

RETURN