Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
  • Need help?

    Create a topic in the appropriate section
    Don't write everything in the chat!
  • Take a look at the marketplace

    There you can buy
    everything related to game servers
  • Don't want a ban?

    Please read our rules
    Don't disturb the order!
  • Sell or buy?

    Use services of the guarantor
    We will make your deal safe

Recommended Posts

Собственно вещь нужная на каждом сервере! ИМХО!

 

Сразу скажу - это не мое, а просто перевод отсюда.

 

Что это такое:

При выходе игрока в бою по Alt+F4 или еще как то весь его лут остается в ящике в месте выхода игрока и это место (сообщение с координатами) заносится в лог (RPT).

 

i39575.jpg

 

Установка

1. Распаковываем dayz_server.pbo

2. Открываем compiles/server_onPlayerdisconnect.sqf

находим

private ["

добавляем в начало

private ["_removebackpack","_pos","_backpack","_weapons","_weapons_backpack","_current_magazine","_magazines_backpack","_loot_box","

находим

_playerPos = [];

добавляем после

_removebackpack = false;

находим

	_playerObj setVariable["NORRN_unconscious",true, true];
	_playerObj setVariable["unconsciousTime",300,true];
	
	diag_log format["COMBAT LOGGED: %1 (%2) at location %3", _playerName,_timeout,(getPosATL _playerObj)];
	//diag_log format["SET UNCONCIOUSNESS: %1", _playerName];
	
	// Message whole server when player combat logs
	_message = format["PLAYER COMBAT LOGGED: %1",_playerName];
	[nil, nil, rTitleText, _message, "PLAIN"] call RE;

заменяем этим

        _playerObj setVariable["NORRN_unconscious",true,true];
        _playerObj setVariable["unconsciousTime",120,true];

        _pos                 = getPosAtl _playerObj;
        _backpack            = unitBackpack _playerObj;
        _weapons            = weapons _playerObj;
        _weapons_backpack     = getWeaponCargo _backpack;
        _magazines            = magazines _playerObj;
        _current_magazine    = currentMagazine _playerObj;
        _magazines_backpack = getMagazineCargo _backpack;
        _loot_box             = createVehicle ["USBasicAmmunitionBox",_pos,[],0,"CAN_COLLIDE"];

        clearMagazineCargoGlobal _loot_box;
        clearWeaponCargoGlobal _loot_box;

        {
            _loot_box addWeaponCargoGlobal [_x,1];
        } count (_weapons);

        _magazines set [(count _magazines),_current_magazine];

        {
            _loot_box addMagazineCargoGlobal [_x,1];
        } count (_magazines);

        if (typename _weapons_backpack == "ARRAY") then {

            _i = 0;

            {
                _loot_box addWeaponCargoGlobal [_x,((_weapons_backpack select 1) select _i)];
                _i = _i + 1;
            } count (_weapons_backpack select 0);

        };

        if (typename _magazines_backpack == "ARRAY") then {

            _i = 0;

            {
                _loot_box addMagazineCargoGlobal [_x,((_magazines_backpack select 1) select _i)];
                _i = _i + 1;
            } count (_magazines_backpack select 0);

        };

        if(typeOf _backpack != "") then {
            _loot_box addBackpackCargoGlobal[(typeOf _backpack),1];
        };
    
        diag_log format["COMBAT LOGGED: %1 (%2) at location %3 - DEBUG: Weapons: (%4 - %5) / Magazines: (%6 - %7) / Backpack: (%8)",_playerName,_timeout,(getPosATL _playerObj),_weapons,_weapons_backpack,_magazines,_magazines_backpack,_backpack];

        _message = format["PLAYER COMBAT LOGGED: %1",_playerName];

        [nil, nil, rTitleText, _message, "PLAIN"] call RE;

        _removebackpack = true;

        {
            _playerObj removeMagazine _x;
        } count magazines _playerObj;

        {
            _playerObj removeWeapon _x;
        } count _weapons;

находим

[_playerObj,_magazines,true,true,_isplayernearby] call server_playerSync;

заменяем этим

[_playerObj,_magazines,true,true,_isplayernearby,_removebackpack] call server_playerSync;

 

3. Открываем compiles/server_playersync.sqf

находим

private ["

добавляем

private ["_removebackpack","

находим

_playerwasNearby = false;

после добавляем

_removebackpack = false;

находим

if ((count _this) > 4) then {
    _playerwasNearby = _this select 4;
};

добавляем после

if ((count _this) > 5) then {
    _removebackpack = _this select 5;
};

находим

    if (_isNewGear || _forceGear) then {
        //diag_log ("gear..."); sleep 0.05;
        _playerGear = [weapons _character,_magazines];
        //diag_log ("playerGear: " +str(_playerGear));
        _backpack = unitBackpack _character;
        if(_playerwasNearby) then {
            _empty = [[],[]];
            _playerBackp = [typeOf _backpack,_empty,_empty];
        } else {
            _playerBackp = [typeOf _backpack,getWeaponCargo _backpack,getMagazineCargo _backpack];
        };
    };

добавляем после

    if(_removeBackpack) then {
        _playerBackp = ["",[[],[]],[[],[]]];
    };

Все!

Сохраняем, запаковываем и наслаждаемся!

Edited by TheFirstNoob (see edit history)

Share this post


Link to post
Share on other sites







Уже давно стоит) Скрипт просто супер!

Share this post


Link to post
Share on other sites

да,нормально.только подскажите,какие файлы отвечают за ввод игрока в режим комбат.у меня редко игрок попадает в этот режим,если сам стрелять только начнёт,или попадут в него.

Share this post


Link to post
Share on other sites

 

да,нормально.только подскажите,какие файлы отвечают за ввод игрока в режим комбат.у меня редко игрок попадает в этот режим,если сам стрелять только начнёт,или попадут в него.

Кстати когда просто стреляешь сам, и выходишь альт ф4, то снаряга всё равно на мне, и когда зомби бъёт, короче странно работает.

Edited by all88 (see edit history)

Share this post


Link to post
Share on other sites

Постоянно откатывает на первый заход, после рестарта, в чем может быть проблема? Человек бегает лутается, находит оружие, инвентарь. Выходит во время боя, и заходит в той же точке, где зашел в начале сессии с тем же лутом. Бессмертие получается. А весь лут, что он налутал падает в ящичек.

Edited by BlackJack67 (see edit history)

Share this post


Link to post
Share on other sites

Ящики после рестарта пропадают или как?

Share this post


Link to post
Share on other sites

Ящики после рестарта пропадают или как?

Да, пропадает

Share this post


Link to post
Share on other sites

Возникла проблема, после выхода в бою, в ящике дополнительно появляется обойма на основное оружие. В чем может быть проблема и где это пофиксить?

Share this post


Link to post
Share on other sites

а как он работает  с вшитым в инфи антирелогом?  контачить не будет? 

Share this post


Link to post
Share on other sites

а как он работает  с вшитым в инфи антирелогом?  контачить не будет? 

Это не АнтиРелог, а тупо логирование, что игрок вышел в бою. Попросту бред, ИМХО, только для записи в SLOG. В Обычной Арме есть логирование.

Share this post


Link to post
Share on other sites

Это не АнтиРелог, а тупо логирование, что игрок вышел в бою. Попросту бред, ИМХО, только для записи в SLOG. В Обычной Арме есть логирование.

ясно, спасибо! я просто думал что обморок после выхода в бою завязан где то в инфи

Edited by Linux (see edit history)

Share this post


Link to post
Share on other sites

Собственно вещь нужная на каждом сервере! ИМХО!

 

Сразу скажу - это не мое, а просто перевод отсюда.

 

Что это такое:

При выходе игрока в бою по Alt+F4 или еще как то весь его лут остается в ящике в месте выхода игрока и это место (сообщение с координатами) заносится в лог (RPT).

 

i39575.jpg

 

Установка

1. Распаковываем dayz_server.pbo

2. Открываем compiles/server_onPlayerdisconnect.sqf

находим

private ["

добавляем в начало

private ["_removebackpack","_pos","_backpack","_weapons","_weapons_backpack","_current_magazine","_magazines_backpack","_loot_box","

находим

_playerPos = [];

добавляем после

_removebackpack = false;

находим

	_playerObj setVariable["NORRN_unconscious",true, true];
	_playerObj setVariable["unconsciousTime",300,true];
	
	diag_log format["COMBAT LOGGED: %1 (%2) at location %3", _playerName,_timeout,(getPosATL _playerObj)];
	//diag_log format["SET UNCONCIOUSNESS: %1", _playerName];
	
	// Message whole server when player combat logs
	_message = format["PLAYER COMBAT LOGGED: %1",_playerName];
	[nil, nil, rTitleText, _message, "PLAIN"] call RE;

заменяем этим

        _playerObj setVariable["NORRN_unconscious",true,true];
        _playerObj setVariable["unconsciousTime",120,true];

        _pos                 = getPosAtl _playerObj;
        _backpack            = unitBackpack _playerObj;
        _weapons            = weapons _playerObj;
        _weapons_backpack     = getWeaponCargo _backpack;
        _magazines            = magazines _playerObj;
        _current_magazine    = currentMagazine _playerObj;
        _magazines_backpack = getMagazineCargo _backpack;
        _loot_box             = createVehicle ["USBasicAmmunitionBox",_pos,[],0,"CAN_COLLIDE"];

        clearMagazineCargoGlobal _loot_box;
        clearWeaponCargoGlobal _loot_box;

        {
            _loot_box addWeaponCargoGlobal [_x,1];
        } count (_weapons);

        _magazines set [(count _magazines),_current_magazine];

        {
            _loot_box addMagazineCargoGlobal [_x,1];
        } count (_magazines);

        if (typename _weapons_backpack == "ARRAY") then {

            _i = 0;

            {
                _loot_box addWeaponCargoGlobal [_x,((_weapons_backpack select 1) select _i)];
                _i = _i + 1;
            } count (_weapons_backpack select 0);

        };

        if (typename _magazines_backpack == "ARRAY") then {

            _i = 0;

            {
                _loot_box addMagazineCargoGlobal [_x,((_magazines_backpack select 1) select _i)];
                _i = _i + 1;
            } count (_magazines_backpack select 0);

        };

        if(typeOf _backpack != "") then {
            _loot_box addBackpackCargoGlobal[(typeOf _backpack),1];
        };
    
        diag_log format["COMBAT LOGGED: %1 (%2) at location %3 - DEBUG: Weapons: (%4 - %5) / Magazines: (%6 - %7) / Backpack: (%8)",_playerName,_timeout,(getPosATL _playerObj),_weapons,_weapons_backpack,_magazines,_magazines_backpack,_backpack];

        _message = format["PLAYER COMBAT LOGGED: %1",_playerName];

        [nil, nil, rTitleText, _message, "PLAIN"] call RE;

        _removebackpack = true;

        {
            _playerObj removeMagazine _x;
        } count magazines _playerObj;

        {
            _playerObj removeWeapon _x;
        } count _weapons;

находим

[_playerObj,_magazines,true,true,_isplayernearby] call server_playerSync;

заменяем этим

[_playerObj,_magazines,true,true,_isplayernearby,_removebackpack] call server_playerSync;

 

3. Открываем compiles/server_playersync.sqf

находим

private ["

добавляем

private ["_removebackpack","

находим

_playerwasNearby = false;

после добавляем

_removebackpack = false;

находим

if ((count _this) > 4) then {
    _playerwasNearby = _this select 4;
};

добавляем после

if ((count _this) > 5) then {
    _removebackpack = _this select 5;
};

находим

    if (_isNewGear || _forceGear) then {
        //diag_log ("gear..."); sleep 0.05;
        _playerGear = [weapons _character,_magazines];
        //diag_log ("playerGear: " +str(_playerGear));
        _backpack = unitBackpack _character;
        if(_playerwasNearby) then {
            _empty = [[],[]];
            _playerBackp = [typeOf _backpack,_empty,_empty];
        } else {
            _playerBackp = [typeOf _backpack,getWeaponCargo _backpack,getMagazineCargo _backpack];
        };
    };

добавляем после

    if(_removeBackpack) then {
        _playerBackp = ["",[[],[]],[[],[]]];
    };

Все!

Сохраняем, запаковываем и наслаждаемся!

Хороший скрипт работает,единственное если релог произошел в воздухе, на вертолете допустим был игрок,ящик висит в воздухе и не как не достать, может знает кто нить будь как исправить поделитесь пожалуйста

Share this post


Link to post
Share on other sites

Хороший скрипт работает,единственное если релог произошел в воздухе, на вертолете допустим был игрок,ящик висит в воздухе и не как не достать, может знает кто нить будь как исправить поделитесь пожалуйста

ставить высоту ящика (z) всегда 0

Share this post


Link to post
Share on other sites

ставить высоту ящика (z) всегда 0

Не могу че то найти в какой строчке покажите пример если не сложно

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By notani
      Собственно как отключить антивор? Карта Алтис.
    • By cjanton
      Во время игры вас достало то что на вашем сервере, по случайности вас может убить ваш напарник?. Данный плагин решит эту проблему. 
      Установка
      1) Содержимое архива вытащить в папку вашего сервера
      2) Скопируйте файл "antiteamkillcsgo.smx" в директорию addons\sourcemod\plugins;
      3) Скопируйте файл "antiteamkillcsgo.sp" в директорию addons\sourcemod\scripting.
      Функции:

       
      Внимание. Если вы проводили изменение в файле antiteamkillcsgo.sp вам необходимо произвести компиляцию плагина для применения ваших изменений. Это можно сделать использовав нашу статью о том как компилировать плагин для сервера CS:GO

      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
    • By NoNameUltima
      Как то встала задача, чтобы в ExtraRC (ПКМ опциях), были кликабельны ВСЕ ключи.
      т.е. - при клике на любой ключ, появлялись пункты меню...
      Сам ExtraRC в том виде, в котором он есть, данного не позволяет, а ключей несколько сотен, и добавлять каждый это гиблое дело...
      Но решить проблемку можно достаточно просто, - для этого дела, нам понадобится слегка модернизировать файл
      ui_selectSlot.sqf
      Сам файл теперь будет выглядеть так:
      private ["_control","_button","_parent","_group","_pos","_item","_subItem","_conf","_name","_cfgActions","_numActions","_height","_menu","_config","_type","_script","_outputOriented","_compile","_array","_outputClass","_outputType","_erc_cfgActions", "_erc_numActions"]; disableSerialization; _control = (_this select 0); _button = (_this select 1); _parent = findDisplay 106; if (_button == 1) then { _group = _parent displayCtrl 6902; _pos = ctrlPosition _group; _pos set [0, ((_this select 2) + 0.48)]; _pos set [1, ((_this select 3) + 0.07)]; _item = gearSlotData _control; _conf = configFile >> "cfgMagazines" >> _item; if (!isClass _conf) then {_conf = configFile >> "cfgWeapons" >> _item;}; _name = getText(_conf >> "displayName"); _cfgActions = _conf >> "ItemActions"; _numActions = (count _cfgActions); _height = 0; for "_i" from 0 to (_numActions - 1) do { _menu = _parent displayCtrl (1600 + _i); _menu ctrlShow true; _config = (_cfgActions select _i); _type = getText (_config >> "text"); _script = getText (_config >> "script"); _outputOriented = getNumber (_config >> "outputOriented") == 1; _height = _height + (0.025 * safezoneH); _compile = format["_id = '%2' %1;",_script,_item]; uiNamespace setVariable ['uiControl', _control]; if (_outputOriented) then { _array = getArray (_config >> "output"); _outputClass = (_array select 0); _outputType = (_array select 1); _name = getText (configFile >> _outputType >> _outputClass >> "displayName"); _compile = format["_id = ['%2',%3] %1;",_script,_item,_array]; }; _menu ctrlSetText format[_type, _name]; _menu ctrlSetEventHandler ["ButtonClick", _compile]; }; // Ключи _subItem = _item; _subItem = toArray _subItem; if ( (count _subItem) > 7 ) then {_subItem resize 7;}; _subItem = toString _subItem; if (_subItem == "ItemKey") then {_erc_cfgActions = (missionConfigFile >> "ExtraRc" >> _subItem);} else {_erc_cfgActions = (missionConfigFile >> "ExtraRc" >> _item);}; _erc_numActions = (count _erc_cfgActions); if (isClass _erc_cfgActions) then { for "_j" from 0 to (_erc_numActions - 1) do { _menu = _parent displayCtrl (1600 + _j + _numActions); _menu ctrlShow true; _config = (_erc_cfgActions select _j); _text = getText (_config >> "text"); _script = getText (_config >> "script"); _height = _height + (0.025 * safezoneH); uiNamespace setVariable ['uiControl', _control]; _menu ctrlSetText _text; _compile= format["_item = '%2'; %1", _script, _item]; _menu ctrlSetEventHandler ["ButtonClick", _compile]; }; }; _pos set [3,_height]; _group ctrlShow true; ctrlSetFocus _group; _group ctrlSetPosition _pos; _group ctrlCommit 0; }; А чтобы добавить пункты ко всем ключам, в самом ExtraRC прописываем так:
      class ItemKey { class Ultima_Client_ExtraRC_Vehicle_Find_By_Key { text = "Найти технику"; script = "[] spawn Ultima_Client_Procedure_Vehicle_Find_By_Key;"; }; class Ultima_Client_ExtraRC_Vehicle_Set_Alarm { text = "Поставить на сигнализацию"; script = "[] spawn Ultima_Client_Procedure_Vehicle_Set_Alarm;"; }; }; *Пункты приведены для примера.
    • By tolyan2121
      Всем привет! Столкнулся с проблемой установил новый интерфейс GUI но при combat индикатор не изменяется , читал что в версии 1.0.6 dayz_combat  не используется мб его нужно на что нибудь изменить или включить где нибудь.
      disableSerialization; private ["_display", "_bloodval", "_foodval", "_waterVal", "_temperatureVal", "_bloodval", "_display", "_bloodCtrl", "_foodCtrl", "_waterCtrl", "_temperatureCtrl", "_fpsCtrl", "_battleCtrl", "_painCtrl", "_infectedCtrl", "_bleedingCtrl", "_boneCtrl", "_killedZ", "_killedB", "_killedN", "_killedH", "_GPSCtrl", "_GPSTextCtrl", "_upTimeCtrl", "_hrs", "_humanityCtrl", "_humanityTextCtrl", "_humanity", "_humanityIcon", "_visualCtrl", "_audibleCtrl","_cashMoney"]; //================================================ _foodVal = 1 - (dayz_hunger / SleepFood); _thirstVal = 1 - (dayz_thirst / SleepWater); _array = [_foodVal,_thirstVal]; //================================================ _bloodVal = floor (r_player_blood / r_player_bloodTotal * 100); _foodVal = floor ((1 - dayz_hunger / SleepFood) * 100); _waterVal = floor ((1 - dayz_thirst / SleepWater) * 100); _temperatureVal = ceil (36.6*dayz_temperatur/42); _combatVal = 1 - dayz_combat; // May change later to be a range of red/green to loosely indicate 'time left in combat' if (uiNamespace getVariable ["DZ_displayUI", 0] == 1) exitWith { _array }; if (_bloodVal < 0) then {_bloodVal = 0}; // no more -21k of blood :D _display = uiNamespace getVariable 'DAYZ_GUI_display'; _bloodCtrl = _display displayCtrl 7202; _foodCtrl = _display displayCtrl 7204; _waterCtrl = _display displayCtrl 7206; _temperatureCtrl = _display displayCtrl 7208; _fpsCtrl = _display displayCtrl 7210; _ctrlCombat = _display displayCtrl 7211; _bleedingCtrl = _display displayCtrl 7212; _infectedCtrl = _display displayCtrl 7213; _painCtrl = _display displayCtrl 7214; _boneCtrl = _display displayCtrl 7215; _killedZ = _display displayCtrl 7217; _killedB = _display displayCtrl 7219; _killedN = _display displayCtrl 7221; _killedH = _display displayCtrl 7230; _GPSCtrl = _display displayCtrl 7223; _GPSTextCtrl = _display displayCtrl 7224; _upTimeCtrl = _display displayCtrl 7226; _humanityCtrl = _display displayCtrl 7227; _humanityTextCtrl = _display displayCtrl 7228; _audibleCtrl = _display displayCtrl 7232; _visualCtrl = _display displayCtrl 7234; _cashMoney = _display displayCtrl 7236; //==================================== MAIN ============================================ _bloodCtrl ctrlSetText format ["%1%2", _bloodVal, "%"]; _foodCtrl ctrlSetText format ["%1%2", _foodVal, "%"]; _waterCtrl ctrlSetText format ["%1%2", _waterVal, "%"]; _temperatureCtrl ctrlSetText str(_temperatureVal); _fpsCtrl ctrlSetText str(floor diag_fps); //==================================== STATUS ========================================== if (dayz_combat > 0) then {_ctrlCombat ctrlSetText "addons\tmax_gui\tmax_hud_status_battle.paa";} else {_ctrlCombat ctrlSetText "addons\tmax_gui\tmax_hud_status_battle_d.paa";}; if (r_player_injured) then {_bleedingCtrl ctrlSetText "addons\tmax_gui\tmax_hud_status_bleeding.paa";} else {_bleedingCtrl ctrlSetText "addons\tmax_gui\tmax_hud_status_bleeding_d.paa";}; if (r_player_infected) then {_infectedCtrl ctrlSetText "addons\tmax_gui\tmax_hud_status_infected.paa";} else {_infectedCtrl ctrlSetText "addons\tmax_gui\tmax_hud_status_infected_d.paa";}; if (r_player_inpain) then {_painCtrl ctrlSetText "addons\tmax_gui\tmax_hud_status_pain.paa";} else {_painCtrl ctrlSetText "addons\tmax_gui\tmax_hud_status_pain_d.paa";}; if (r_fracture_legs) then {_boneCtrl ctrlSetText "addons\tmax_gui\tmax_hud_status_bone.paa";} else {_boneCtrl ctrlSetText "addons\tmax_gui\tmax_hud_status_bone_d.paa";}; //==================================== KILLED ========================================== _killedZ ctrlSetText str(player getVariable["zombieKills", 0]); _killedB ctrlSetText str(player getVariable["banditKills", 0]); _killedN ctrlSetText str(player getVariable["humanKills", 0]); _killedH ctrlSetText str(player getVariable["headshots", 0]); //==================================== MISC ========================================== if ("ItemGPS" in weapons player) then { _GPSCtrl ctrlShow true; _GPSTextCtrl ctrlShow true; _GPSTextCtrl ctrlSetText str(mapGridPosition position player); } else { _GPSCtrl ctrlShow false; _GPSTextCtrl ctrlShow false; }; _hrs = floor (serverTime/60/60); _upTimeCtrl ctrlSetText format ["%1h %2m", _hrs, floor (serverTime/60-60*_hrs)]; //???? _humanity = player getVariable ["humanity", 0]; _humanityTextCtrl ctrlSetText str(_humanity); _humanityIcon = "addons\tmax_gui\tmax_hud_neutral.paa"; if (_humanity > 5000) then {_humanityIcon = "addons\tmax_gui\tmax_hud_hero.paa"}; if (_humanity < -5000) then {_humanityIcon = "addons\tmax_gui\tmax_hud_bandit.paa"}; _humanityCtrl ctrlSetText _humanityIcon; _audibleCtrl ctrlSetText format ["%1m", floor dayz_disAudial]; _visualCtrl ctrlSetText format ["%1m", floor dayz_disVisual]; _cashMoney ctrlSetText str(player getVariable["cashMoney", 0]); _array И еще не могу разобраться как включить время отсчета до рестарта как на дебаге
      _time = (round(239-(serverTime)/60)); _hours = (floor(_time/60)); _minutes = (_time - (_hours * 60)); switch(_minutes) do { case 9: {_minutes = "09"}; case 8: {_minutes = "08"}; case 7: {_minutes = "07"}; case 6: {_minutes = "06"}; case 5: {_minutes = "05"}; case 4: {_minutes = "04"}; case 3: {_minutes = "03"}; case 2: {_minutes = "02"}; case 1: {_minutes = "01"}; case 0: {_minutes = "00"}; };  
    • By Golgofinyanin
      Пытался со скрипта взлома машины вывести кто когда и где взломал машину. Нефига не получилось . titleText работает diag_log не в какую. Что то не так делаю или это технически не возможно? 
       
        diag_log format["%2 Взломал %1 по координатам %3", _class,(name player),_post2];
       
  • Our picks

×
×
  • Create New...

Important Information

By using this site, you automaticly agree to our Guidelines and Privacy Policy.
We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.