Friday, September 20, 2024 1:22:39 AM
> settings

Customize


Authenticate

> ExileServer_MarXet_network_buyNowRequest.sqf
/**
 *
 * Author: WolfkillArcadia
 * www.arcasindustries.com
 * © 2017 Arcas Industries
 *
 * This work is protected by Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0). 
 *
 */

//
//          [format[""],"DEBUG"] call ExileServer_MarXet_util_log;
//
_sessionID = _this select 0;
_package = _this select 1;
_listingID = _package select 0;
_thatOneThingThatISentToTheServer = _package select 1;
_vehicleObject = "";
_buyerIsSeller = false;

try {
    // Perform the usual checks to make sure the player is real.
    _playerObject = _sessionID call ExileServer_system_session_getPlayerObject;
    if (isNull _playerObject) then
	{
		throw "Who are you again?";
	};

    if (_listingID isEqualTo "") then
    {
        throw "Listing ID doesn't exist!";
    };

    // Return our stock
    _stock = _listingID call ExileServer_MarXet_inventory_confirmStock;

    // Not available? Shoot, send it back to the client.
    if (_stock isEqualTo false) then
    {
        throw "Oh noes! The item is no longer available!";
    };

    _sellersUID = _stock select 4;
    _buyerUID = getPlayerUID _playerObject;

    // Assume the seller is different than the buyer.
    _price = parseNumber(_stock select 3);
    
    // Check to see if the sellers locker is maxed (thx to Adam Kadmon)
    _sellerLocker = format["getLocker:%1", _sellersUID] call ExileServer_system_database_query_selectSingleField;
    _lockerLimit = (getNumber(missionConfigFile >> "CfgLocker" >> "maxDeposit"));

    if ((_sellerLocker + _price) > _lockerLimit) then
    {
       throw "Seller's locker is maxed out. They will need to remove some poptabs before this item can be purchased!";
    };

    // But we are going to check to make sure anyway, set the price to 0 if they are.
    if (_buyerUID isEqualTo _sellersUID && {getNumber(missionConfigFile >> "CfgMarXet" >> "Settings" >> "disableSellerBuyback") isEqualTo 0}) then
    {
        _divisor = getNumber(missionConfigFile >> "CfgMarXet" >> "Settings" >> "sellerBuybackPercentage");
        _price = if (_divisor > 0 && {_divisor < 1}) then { _price - (_price * _divisor) } else { 0 };
        _buyerIsSeller = true;
    };

    _playerMoney = _playerObject getVariable ["ExileMoney",0];

    // If vehicle, spawn it in
    if (count(_stock select 2) > 1) then
    {
        _listingArray = _stock select 2;
        _vehicleClass = _listingArray select 0;

        // before anything else, see if they have enough money including the rekeying charge
        _vehicleCost = getNumber (missionConfigFile >> "CfgExileArsenal" >> _vehicleClass >> "price");
        _rekeyCost = _vehicleCost * (getNumber (missionConfigFile >> "CfgTrading" >> "rekeyPriceFactor"));
        if (_buyerIsSeller) then
        {
            _price = _rekeyCost;
        }
        else
        {
            _price = _price + _rekeyCost;
        };

        if (_playerMoney < _price) then
        {
            throw "You don't have enough money to purchase";
        };

        // Check to see if it's got anything in it that would make the server unhappy
    	_forbiddenCharacter = [_thatOneThingThatISentToTheServer, "1234567890"] call ExileClient_util_string_containsForbiddenCharacter;

    	if !(_forbiddenCharacter isEqualTo -1) then
    	{
    		throw format ["Forbidden character in PIN! I have no idea how it got there. [%1]", _forbiddenCharacter];
    	};
        _pinCode = _thatOneThingThatISentToTheServer;

        // Check to see if they preset helipads or not
        _staticVehicleSpawning = (getNumber(missionConfigFile >> "CfgMarXet" >> "Settings" >> "staticVehicleSpawning") isEqualTo 1);
        if (_staticVehicleSpawning) then
        {
            if (_vehicleClass isKindOf "Ship") then
            {
                _helipad = nearestObject [(getPosATL _playerObject), "Land_HelipadEmpty_F"];
                if (isNull _helipad) then
                {
                    throw "Couldn't find a suitable position for the ship";
                };
                _position = (getPosASL _helipad);
                _position set [2,0];
                _vehicleObject = [_vehicleClass, _position, (random 360), false, _pinCode] call ExileServer_object_vehicle_createPersistentVehicle;
            }
            else
            {
                if (_vehicleClass isKindOf "Air") then
                {
                    _helipad = nearestObject [(getPosATL _playerObject), "Land_HelipadSquare_F"];
                    if (isNull _helipad) then
                    {
                        throw "Couldn't find a suitable position for the air vehicle";
                    };
                    _position = (getPosATL _helipad);
                    _position set [2,0];
                }
                else
                {
                    _helipad = nearestObject [(getPosATL _playerObject), "Land_HelipadEmpty_F"];
                    if (isNull _helipad) then
                    {
                        throw "Couldn't find a suitable position for the vehicle";
                    };
                    _position = (getPosATL _helipad);
                    _position set [2,0];
                };
                _vehicleObject = [_vehicleClass, _position, (random 360), true, _pinCode] call ExileServer_object_vehicle_createPersistentVehicle;
            };
        }
        else
        {
            if (_vehicleClass isKindOf "Ship") then
            {
                _position = [(getPosATL _playerObject), 80, 10] call ExileClient_util_world_findWaterPosition;

                _vehicleObject = [_vehicleClass, _position, (random 360), false, _pinCode] call ExileServer_object_vehicle_createPersistentVehicle;
            }
            else
            {
                _position = (getPos _playerObject) findEmptyPosition [10, 175, _vehicleClass];

                if (_position isEqualTo []) then
                {
                    throw "Couldn't find a suitable position for vehicle";
                };

                _vehicleObject = [_vehicleClass, _position, (random 360), true, _pinCode] call ExileServer_object_vehicle_createPersistentVehicle;
            };
        };

        // Set ownership
        _vehicleObject setVariable ["ExileOwnerUID", _buyerUID];
        _vehicleObject setVariable ["ExileIsLocked",0];
        _vehicleObject lock 0;

        // Save vehicle in database
        _vehicleObject call ExileServer_object_vehicle_database_insert;

        // Set fuel and damage
        _vehicleObject setFuel (_listingArray select 1);
        _vehicleObject setDamage (_listingArray select 2);

        // Set the hitpoints
        _hitpoints = _listingArray select 3;

        if ((typeName _hitpoints) isEqualTo "ARRAY") then
        {
        	{
        		_vehicleObject setHitPointDamage [_x select 0, _x select 1];
        	}
        	forEach _hitpoints;
        };

        // update position/stats
        _vehicleObject call ExileServer_object_vehicle_database_update;
        _vehicleObject = netID _vehicleObject;
    }
    else
    {
        if (_playerMoney < _price) then
        {
            throw "You don't have enough money to purchase the item";
        };
    };

    // Make sure to update our inventory
    _listingID call ExileServer_MarXet_inventory_updateStock;

    // What if we buy our thing back?
    if (_buyerIsSeller) then
    {
        // Charge the seller the rekey cost of the vehicle
        if (_price > 0) then
        {
            _playerMoney = _playerMoney - _price;
            _playerObject setVariable ["ExileMoney",_playerMoney,true];
            format["setPlayerMoney:%1:%2",_playerMoney,_playerObject getVariable ["ExileDatabaseID", 0]] call ExileServer_system_database_query_fireAndForget;
        };
        [_sessionID,"buyerBuyNowResponse",[_stock,_thatOneThingThatISentToTheServer,_vehicleObject,str(_price)]] call ExileServer_system_network_send_to;
        [format["Player: %1 bought their %2 back. Vehicle: %3. Rekey Cost if vehicle: %4",_buyerUID, (_stock select 2) select 0, (_price > 0), _price],"BuyNowRequest"] call ExileServer_MarXet_util_log;
    }
    else
    {
        // Looks good, set their account money
        _newMoney = _playerMoney - _price;
        _playerObject setVariable ["ExileMoney",_newMoney,true];


        format["setPlayerMoney:%1:%2",_newMoney,_playerObject getVariable ["ExileDatabaseID", 0]] call ExileServer_system_database_query_fireAndForget;

        [_sessionID,"buyerBuyNowResponse",[_stock,_thatOneThingThatISentToTheServer,_vehicleObject,str(_price)]] call ExileServer_system_network_send_to;

        // Get the seller's player object if they are connected.
        _sellerPlayerObject = _sellersUID call ExileServer_MarXet_system_getPlayerObject;

        // If seller isn't connected, update the database. If they are, process like normal.
        if (_sellerPlayerObject isEqualTo "") then
        {
            _stats = format["getAccountStats:%1", _sellersUID] call ExileServer_system_database_query_selectSingle;
            _sellersMoney = _stats select 4;
            _newSellerMoney = _sellersMoney + _price;
            format["updateLocker:%1:%2",_newSellerMoney, _sellersUID] call ExileServer_system_database_query_fireAndForget;
        }
        else
        {
            _sellersMoney = _sellerPlayerObject getVariable ["ExileLocker", 0];
            _newSellerMoney = _sellersMoney + _price;
            _sellerSessionID = _sellerPlayerObject getVariable ["ExileSessionID",-1];
            _sellerPlayerObject setVariable ["ExileLocker",_newSellerMoney,true];
            format["updateLocker:%1:%2",_newSellerMoney, _sellersUID] call ExileServer_system_database_query_fireAndForget;
            if !(_sellerSessionID isEqualTo -1) then
            {
                [_sellerSessionID,"sellerBuyNowResponse",[_stock]] call ExileServer_system_network_send_to;
            };
        };
        [format["Player: %1 bought player: %2's %3 for %4",_buyerUID,_sellersUID, (_stock select 2) select 0, _price],"BuyNowRequest"] call ExileServer_MarXet_util_log;
    };
}
catch
{
    [_sessionID, "toastRequest", ["ErrorTitleAndText", ["FAILED!", _exception]]] call ExileServer_system_network_send_to;
    [_exception,"BuyNowRequest"] call ExileServer_MarXet_util_log;
    if (!isNil "_stock" && !(_stock isEqualTo false)) then
    {
        _count = -1;
        {
            if ((_x find _listingID) != -1) then
            {
                _count = _forEachIndex;
            };
        } forEach MarXetInventory;
        (MarXetInventory select _count) set [1,1];
    };
};
All opinions represented herein are my own
- © 2024 itsthedevman
- build 340fbb8