Jump to content

meatball

Member
  • Content Count

    734
  • Joined

  • Last visited

  • Medals

Everything posted by meatball

  1. You can get around the delay for overcast using skipTime. skipTime -24; 86400 setOvercast 1; skipTime 24; While that will boost overcast up to 1, it unfortunately still has no immediate affect on cloud cover. To me, that's not as big of a deal, as I have that in my script. The only problem I can't get around this point is forcing a set cloud level on mission start based on scripting in any way. You can do it with the intel Overcast slider, which leads me to believe there's a command hiding/function somewhere or not available to us, but you cannot do it with scripting. What really makes things more confusing is if you script a mission to start with full overcast, it'll start with overCast 1, but no clouds. Yet if you exit/save, go back out to the unit selection screen and pick another unit and come back in, you have full overcast and cloud cover.
  2. Just a heads up, there is a bug report submitted on this. Go vote it up if you can, maybe we can get it fixed in the engine.
  3. Normally when you see 'any' pop up for the variable that's because it's not defined on that client/machine. Those should all be defined on both clients/servers as the mission starts but maybe the variables are getting called at some point before they're being defined/broadcast. How are you calling those variables?
  4. 'Random' is relative because the script does know what the forecast is, it just picks a random number first and starts driving the weather towards that. As for the 10 minutes, it is a bit much, but there's two reasons behind it. First, when I wrote the script and was doing cloud updates (before they pulled simulSetHumidity) since the cloud changes would happen instantly, I needed to have weather updates more frequently so the changes were smaller and not so jarring when they happened. Secondly, and more importantly, the current incarnation of A3 weather doesn't play very well with MP. You could easily set the script to just run new updates (with bigger possible changes) once every hour or two. The problem is, each client is then 'on it's own' to get from the current weather to the forecasted weather, and you could easily see differences in weather across the clients. So say you are at .2 overcast and set it to go to 1 overcast in two hours. Both clients should stay somewhat in synch as to overcast levels, but they may see differences in rain. Once client could see rain at .6, while another doesn't see rain until it hits .8 which totally throws off the immersion for players. The only way around it is to try to force the clients all to a consistent state at a more regular basis. Of course, I've only been Arma scripting for a few months now, so I could be way off base.
  5. @tortu - Yeah, it does somewhat make changes to weather mediocre, but since this is running every 10 minutes, I don't think that's a bad thing. Weather over the short term has a lot more chance to stay the same as opposed to over the long term. Theoretically with the script you could a shift of .15 every 10 minutes and .90 in an hour. Of course, that'll never happen and things will trend to stay closer to the starting weather, but over the long term it can lead to broad changes in weather. I'm certainly open to any better ideas. Maybe Enigma will just revise his A2 dynamicWeather script and we can all just start using that. :) @gamma - Ran a quick test, and you're right. Setting overcast to .5 will allow you to create rain. They must have changes that. I wish BIS would just publish the 'rules' of weather somewhere.
  6. They already are for the most part so you really don't need to worry about that yourself. The game engine will not let it rain unless Overcast is above a certain level. It used to be .7 in Arma 2, so I assume it's the same as the Wiki has not changed, but I've not tested it to find out if it'll rain at lower overcast values. Additionally, setRain really just forces it to rain. I'm pretty sure the weather engine will automatically create rain when the overcast conditions are correct randomly. The reason I use it is to force the issue and make sure everyone in a MP environment sees rain at the same time.
  7. Alright, so I _think_ I figured out the problem with cloud level not being set correctly at mission start. Remember that setOvercast does not control cloud cover directly and the simulSetHumidity used to do that. setOvercast simply adjusts the amount of sunlight that is reaching the ground from the sky. Use setOvercast to 0 and it'll be bright and sunny on the ground, setOvercast 1 and it'll appear dark and dingy on the ground and the sky will appear muted, all regardless of the amount of clouds in the sky. What appears to be happening though is that the the "Overcast" settings you can configure in the editor in your mission Intel is still creating a cloud level that should match the overcast setting (using simulSetHumidity that was pulled from scripting use perhaps?) you have set in Intel. So, if you try to configure the overcast level using scripting in your init.sqf or through a script like mine, it does tell the engine to change the overcast level, but the cloud level that was set by the Intel overcast setting does not automatically update and you'll have a cloud level at mission start matching the Intel overcast settings, and not the newly updated overcast you set using setOvercast. I figured it out with a simple test. I created a dummy mission and dumped a player unit in it. I then set the Intel overcast level to 0 for Start, and then created an init.sqf that only contained: skipTime -24;86400 setOvercast 1;skipTime 24; When I launched I had a nice dark and gloomy environment, but there wasn't a cloud in the sky. I then did the opposite, setting the mission intel Overcast to 100, and then changed the init.sqf setOvercast value to 0. Started up and everything looked bright and sunny on the ground, even to the point that I saw shadows, yet up in the sky it was loaded with clouds and started raining immediately. So, no matter what you do scriptwise, the cloud level at the start of your mission will always be at a level that 'matches' the overcast level set in your mission Intel in the editor. Until they fix it, the only thing I can think of is to set the Intel overcast to 40-50 so if your script sets a mission to have any type of cloud level, the players will at least see some clouds at mission start. The downside is if the players pick clear weather, the sky will still be half filled with clouds...
  8. Not sure what maxWind in engine is to be honest, but it's not really set on a percentage basis like the other weather variables. http://community.bistudio.com/wiki/setWind The numbers are specific meters / second of the wind, so for example, you could set it to 5 m/s, 10, 30, 100, whatever. Just don't know if there's an upper limit the engine takes. Just a reference point for understanding. 1 meters/second = 3.6 km/hour = 2.2 miles/hour
  9. Yeah, that's an easy way to pick random starting weather if you don't want to give the player the ability to edit it. As for all those initial weather values and 10 minute adjustment numbers, they are my best guesses about what looks good to me. Certainly change them to whatever you like as well. Just remember that all the weather variables are between 0 and 1 with the exception of wind values. 0 is 0% for that weather variable, .5 being 50%, 1 being 100%. Wind is actually the value of wind in meters/second in each directions. So a value of 10 is a wind of 10m/sec.
  10. There's probably a way to have a single script that can handle everything, but just stripping out the client side stuff and public variable broadcasts _should_ work for SP. I haven't tested this, but this might work. /* spRandomWeather.sqf v 0.1 By Meatball Script Requirements: 1) Put this code/script in a file named "spRandomWeather.sqf" in root mission folder. 2) Create a call in init.sqf execVM "spRandomWeather.sqf"; 3) Have the following code in the "class Params" section of your description.ext to create weather as a selectable parameter for the players. // paramsArray[5] class initialWeather { title = "Initial Weather"; values[] = {1,2,3,4,5,6,7}; texts[] = {"Clear","Overcast","Light Rain","Heavy Rain","Light Fog","Heavy Fog","Random"}; default = 1; }; 4) Note: Due to issues with current A3 weather code, overall weather should work correctly, but clouds if overcast will not appear correctly at mission start. */ // Make sure the # in the select below matches what # in the order of parameters your initialWeather class is in the description.ext initialWeather = (paramsArray select 5); switch (initialWeather) do{ case 1: {forecastOvercast = 0;forecastRain = 0;forecastFog = 0;forecastWindE = 1;forecastWindN = 1;}; // Clear case 2: {forecastOvercast = .45;forecastRain = .45;forecastFog = 0;forecastWindE = 2;forecastWindN = 2;}; // Overcast case 3: {forecastOvercast = .70;forecastRain = .70;forecastFog = .05;forecastWindE = 3;forecastWindN = 3;}; // Light Rain case 4: {forecastOvercast = 1;forecastRain = 1;forecastFog = .05;forecastWindE = 4;forecastWindN = 4;}; // Heavy Rain case 5: {forecastOvercast = .75;forecastRain = .10;forecastFog = .30;forecastWindE = 1;forecastWindN = 1;}; // Light Fog case 6: {forecastOvercast = .85;forecastRain = .20;forecastFog = .50;forecastWindE = 0;forecastWindN = 0;}; // Heavy Fog case 7: {forecastOvercast = random(1);forecastRain = random(1);forecastFog = random(.20);forecastWindE = (random(14)-7);forecastWindN = (random(14)-7);}; // Random }; // Set up variable to track server weather updates. serverWeather = 0; // Set up initial weather for server and all clients using values from parameters. waitUntil {!isnil "serverWeather"}; skiptime -24; 86400 setOvercast forecastOvercast; 86400 setFog forecastFog; 86400 setRain forecastRain; skipTime 24; setWind [forecastWindE,forecastWindN,true]; // Debug Hint //hint "Initial Weather Setup"; // Begin loop to create a new weather forecast every 10 minutes. while {serverWeather >= 0} do { // This will always be true and it will run as long as server runs. // Configure weather settings on server to match next 10 minute weather forecast. 600 setOvercast forecastOvercast; 600 setFog forecastFog; 600 setRain forecastRain; sleep 600; setWind [forecastWindE,forecastWindN,true]; // Create random numbers for next forecast. _randOvercast = (round((random(0.3)-0.15)*100))/100; _randRain = (round((random(0.3)-0.15)*100))/100; _randFog = (round((random(0.1)-0.05)*100))/100; _randWindE = (round((random(1)-.05)*100))/100; _randWindN = (round((random(1)-.05)*100))/100; // Create next random overcast level and keep it between 0 and 1 forecastOvercast = forecastOvercast + _randOvercast; if (forecastOvercast > 1) then {forecastOvercast = forecastOvercast - (2*_randOvercast)}; if (forecastOvercast < 0) then {forecastOvercast = forecastOvercast + (abs(2*_randOvercast))}; // Create next random rain level and keep it between 0 and 1 forecastRain = forecastRain + _randRain; if (forecastRain > 1) then {forecastRain = forecastRain - (2*_randRain)}; if (forecastRain < 0) then {forecastRain = forecastRain + (abs(2*_randRain))}; // Create next random fog level and keep between 0 and 0.5 forecastFog = forecastFog + _randFog; if (forecastFog > 0.5) then {forecastFog = forecastFog - (2*_randFog)}; if (forecastFog < 0) then {forecastFog = forecastFog + (abs(2*_randFog))}; // Create next random E-W Wind level and keep between -10 and 10 forecastWindE = forecastWindE + _randWindE; if (forecastWindE > 10) then {forecastWindE = forecastWindE - (2*_randWindE)}; if (forecastWindE < -10) then {forecastWindE = forecastWindE + (abs(2*_randWindE))}; // Create next random N-S Wind level and keep between -10 and 10 forecastWindN = forecastWindN + _randWindN; if (forecastWindN > 10) then {forecastWindN = forecastWindN - (2*_randWindN)}; if (forecastWindN < -10) then {forecastWindN = forecastWindN + (abs(2*_randWindN))}; // Increment variable to track updates to server weather serverWeather = serverWeather + 1; // Debug Hint - Show Current and Forecast Overcast, Humidity, Fog and Wind Levels on the Server. // hint format ["Updating Weather Forecast # %1 CO: %2 | CH: %3 | CR: %4 | CF: %5 |CW: %6 | FO: %7 | FH: %8 | FR: %9 | FF: %10 | FW: %11,%12",serverWeather,Overcast,Humidity,Rain,Fog,wind,forecastOvercast,forecastHumidity,forecastRain,forecastFog,forecastWindE,forecastWindN]; };
  11. meatball

    Cant add binoculars

    Great they fixed the binocs, anyone tested to see if it also fixed Rangefinders/Laser Designators as well?
  12. meatball

    Cant add binoculars

    Hmm...must be something off with my mission or one of the scripts I'm using. I do have CBA (most recent Beta 4). If I open up an empty mission, and add a unit with that in the init, it works fine, but units with the same info in my mission will not get Binocs. Must be something on my end, yet strange it used to work fine.
  13. meatball

    Cant add binoculars

    Neither, I'm actually launching a fully hosted game.
  14. meatball

    Cant add binoculars

    Are you doing it in DEV? Using it in the latest stable (1.02.110424) neither 'unit addWeapon "Binocular";' nor 'this addWeapon "Binocular";' put in the units Initialization box works. Binocs don't show in inventory and don't pop up when 'B' is pressed. Could be that I'm just oblivious though...
  15. meatball

    Cant add binoculars

    Could be, but they do not show up in the player inventory, nor are they accessible if the player hits the 'B' key.
  16. meatball

    Cant add binoculars

    That does not appear to work. I've been trying to add binocs and rangefinders to players since the last patch with no luck. Used to be able just add a simple 'this addWeapon "Binocular";' or 'this addWeapon "Rangefinder";' in the player init and it'd work but no more since the latest patch.
  17. Yeah, that's the issue with the loss of simulSetHumidity. Clouds have no bearing on rain and/or thunder & lightning right now. Overcast on the other hand does. So, setting overcast to 1, you won't see any clouds, but you can have a downpour of rain and thunder/lightning going on. Not sure if you can have thunder/lighting with low overcast though. Hopefully they link the amount of clouds in the sky back to Overcast like it was in A2...
  18. Man, I love A3, but the way the game handles saved missions is just ridiculous. A mission file can be saved in so many locations it makes it really hard trying to organize missions. Here's just a few of the locations that Arma may keep saved missions... Single Player Missions C:\Program Files\Steam\SteamApps\common\Arma3\Missions\ - SP games exported from the in-game editor as .pbo's are stored here. C:\Users\Username\My Documents\Arma 3 - Other Profiles\A3ProfileName\missions\ - SP games created in the in-game editor with all files/folders are stored here. C:\Users\Username\My Documents\Arma 3 - Other Profiles\A3ProfileName\Saved\missions\ - Folders appear to be created for every SP game ever launched and savegames are stored here. C:\Users\Username\My Documents\Arma 3 - Other Profiles\A3ProfileName\UserSaved\missions\ - Same as above folder Multi Player Missions C:\Program Files\Steam\SteamApps\common\Arma3\Missions\ - MP games exported from the in-game editor as .pbo's are stored here. C:\Users\Username\My Documents\Arma 3 - Other Profiles\A3ProfileName\MPMissions\ - MP games created in the in-game editor with all files/folders are stored here. C:\Users\Username\My Documents\Arma 3 - Other Profiles\A3ProfileName\Saved\mpmissions\ - Folders appear to be created for every MP game ever launched and savegames are stored here. C:\Users\Username\My Documents\Arma 3 - Other Profiles\A3ProfileName\UserSaved\mpmissions\ - Save as above folder. C:\Users\Username\AppData\Local\Arma 3\MPMissionsCache\ - Appears to be .pbo files you've downloaded from servers you've connected to. Steam Workshop Subscribed Missions C:\Users\Username\My Documents\Arma 3 - Other Profiles\A3ProfileName\Saved\steamMPMission - Appears to contain any missions you've subscribed to through Steam Workshop. Unfortunately it creates a separate folder for every subscribed mission, and names the mission files 'mission.pbo', which really screws up using these files on a dedicated server. C:\Users\Username\AppData\Local\Arma 3\ - Appears to contain a cache of the .pbo files for any Steam Workshop Subscribed Missions you've played. C:\Users\Username\AppData\Local\Arma 3\SteamMissionsCache - Once again, another cache of .pbo files related to Steam Workshop Subscribed Missions. Other Unknown Folders C:\Users\Username\My Documents\Arma 3 - Other Profiles\A3ProfileName\Saved\a3\missions_f - Various saved folders for scenarios / showcases, some completely empty C:\Users\Username\My Documents\Arma 3 - Other Profiles\A3ProfileName\Saved\a3\Missions_F_Beta - Same as above C:\Users\Username\My Documents\Arma 3 - Other Profiles\A3ProfileName\Saved\a3\missions_f_gamma - Same as above I may have missed some, or mistaken the purpose of some of these folders, but am I the only one that thinks 15+ folders that can contain mission data is a bit much? :)
  19. Updated version of the script. With the most recent patch, this does now appear to work for both hosted MP missions and dedicated server missions with one caveat. Cloud cover does not work correctly at mission start since there's no longer a command to set cloud cover with simulSetHumidity removed. Clouds will begin to show up over time and the script appears to work correctly for all other intents and purposes. Feel free to use it and let me know if you find any issues. /* randomWeather.sqf v 0.7 By Meatball Script Requirements: 1) Put this code/script in a file named "randomWeather.sqf" in root mission folder. 2) Create a call in init.sqf that will run for the server and all clients. execVM "randomWeather.sqf"; 3) Have the following code in the "class Params" section of your description.ext to create weather as a selectable parameter for the players. // paramsArray[5] class initialWeather { title = "Initial Weather"; values[] = {1,2,3,4,5,6,7}; texts[] = {"Clear","Overcast","Light Rain","Heavy Rain","Light Fog","Heavy Fog","Random"}; default = 1; }; 4) Note: Due to issues with current A3 weather code, overall weather should work correctly, but clouds if overcast will not appear correctly at mission start. */ // On server, set forecast Weather from Parameter options chosen by players. if(isServer) then { // Make sure the # in the select below matches what # in the order of parameters your initialWeather class is in the description.ext initialWeather = (paramsArray select 5); switch (initialWeather) do{ case 1: {forecastOvercast = 0;forecastRain = 0;forecastFog = 0;forecastWindE = 1;forecastWindN = 1;}; // Clear case 2: {forecastOvercast = .45;forecastRain = .45;forecastFog = 0;forecastWindE = 2;forecastWindN = 2;}; // Overcast case 3: {forecastOvercast = .70;forecastRain = .70;forecastFog = .05;forecastWindE = 3;forecastWindN = 3;}; // Light Rain case 4: {forecastOvercast = 1;forecastRain = 1;forecastFog = .05;forecastWindE = 4;forecastWindN = 4;}; // Heavy Rain case 5: {forecastOvercast = .75;forecastRain = .10;forecastFog = .30;forecastWindE = 1;forecastWindN = 1;}; // Light Fog case 6: {forecastOvercast = .85;forecastRain = .20;forecastFog = .50;forecastWindE = 0;forecastWindN = 0;}; // Heavy Fog case 7: {forecastOvercast = random(1);forecastRain = random(1);forecastFog = random(.20);forecastWindE = (random(14)-7);forecastWindN = (random(14)-7);}; // Random }; // Set up variable to track server weather updates. serverWeather = 0; // Broadcast initial weather settings from parameters. publicVariable "forecastOvercast"; publicVariable "forecastRain"; publicVariable "forecastFog"; publicVariable "forecastWindE"; publicVariable "forecastWindN"; publicVariable "serverWeather"; }; // Set up initial weather for server and all clients using values from parameters. waitUntil {!isnil "serverWeather"}; skiptime -24; 86400 setOvercast forecastOvercast; 86400 setFog forecastFog; 86400 setRain forecastRain; // simulSetHumidity forecastRain; skipTime 24; setWind [forecastWindE,forecastWindN,true]; // Debug Hint //hint "Initial Weather Setup"; // Begin server loop to create a new weather forecast every 10 minutes. if(isServer) then { while {serverWeather >= 0} do { // This will always be true and it will run as long as server runs. // Configure weather settings on server to match next 10 minute weather forecast. 600 setOvercast forecastOvercast; 600 setFog forecastFog; 600 setRain forecastRain; sleep 600; setWind [forecastWindE,forecastWindN,true]; // Create random numbers for next forecast. _randOvercast = (round((random(0.3)-0.15)*100))/100; _randRain = (round((random(0.3)-0.15)*100))/100; _randFog = (round((random(0.1)-0.05)*100))/100; _randWindE = (round((random(1)-.05)*100))/100; _randWindN = (round((random(1)-.05)*100))/100; // Create next random overcast level and keep it between 0 and 1 forecastOvercast = forecastOvercast + _randOvercast; if (forecastOvercast > 1) then {forecastOvercast = forecastOvercast - (2*_randOvercast)}; if (forecastOvercast < 0) then {forecastOvercast = forecastOvercast + (abs(2*_randOvercast))}; // Create next random rain level and keep it between 0 and 1 forecastRain = forecastRain + _randRain; if (forecastRain > 1) then {forecastRain = forecastRain - (2*_randRain)}; if (forecastRain < 0) then {forecastRain = forecastRain + (abs(2*_randRain))}; // Create next random fog level and keep between 0 and 0.5 forecastFog = forecastFog + _randFog; if (forecastFog > 0.5) then {forecastFog = forecastFog - (2*_randFog)}; if (forecastFog < 0) then {forecastFog = forecastFog + (abs(2*_randFog))}; // Create next random E-W Wind level and keep between -10 and 10 forecastWindE = forecastWindE + _randWindE; if (forecastWindE > 10) then {forecastWindE = forecastWindE - (2*_randWindE)}; if (forecastWindE < -10) then {forecastWindE = forecastWindE + (abs(2*_randWindE))}; // Create next random N-S Wind level and keep between -10 and 10 forecastWindN = forecastWindN + _randWindN; if (forecastWindN > 10) then {forecastWindN = forecastWindN - (2*_randWindN)}; if (forecastWindN < -10) then {forecastWindN = forecastWindN + (abs(2*_randWindN))}; // Increment variable to track updates to server weather serverWeather = serverWeather + 1; // Debug Hint - Show Current and Forecast Overcast, Humidity, Fog and Wind Levels on the Server. // hint format ["Updating Server Forecast # %1 CO: %2 | CH: %3 | CR: %4 | CF: %5 |CW: %6 | FO: %7 | FH: %8 | FR: %9 | FF: %10 | FW: %11,%12",serverWeather,Overcast,Humidity,Rain,Fog,wind,forecastOvercast,forecastHumidity,forecastRain,forecastFog,forecastWindE,forecastWindN]; // Broadcast server weather forecast information to clients. publicVariable "forecastOvercast"; publicVariable "forecastRain"; publicVariable "forecastFog"; publicVariable "forecastWindE"; publicVariable "forecastWindN"; publicVariable "serverWeather"; }; }; if (!isServer) then { // Non Server Weather loop // Set up counter on client to compare local client weather serverWeather counter. clientWeather = 0; // Run a continuous loop on the client to look for updated weather values from the server every 10 seconds. while {clientWeather >= 0} do { sleep 10; // If client Weather is older than the server weather, set client 10 minute weather forecast to match server. if (clientWeather < serverWeather) then { // Set clientWeather counter to match serverWeather counter so local client weather will not update until next server weather update. clientWeather = clientWeather + 1; // Debug Hint - Show Current and Forecast Overcast, Humidity, Fog and Wind Levels on the Client // hint format ["Updated Client Forecast # %1 - CO: %2 | CH: %3 | CR: %4 | CF: %5 |CW: %6 | FO: %7 | FH: %8 | FR: %9 | FF: %10 | FW: %11,%12",clientWeather,Overcast,Humidity,Rain,Fog,wind,forecastOvercast,forecastHumidity,forecastRain,forecastFog,forecastWindE,forecastWindN]; // Set 10 minute forecast for the client. 600 setOvercast forecastOvercast; 600 setFog forecastFog; 600 setRain forecastRain; sleep 600; setWind [forecastWindE,forecastWindN,true]; }; }; };
  20. meatball

    =BTC= Revive

    So...where's the PayPal/donation account that all of us slackers that don't want to write our own healing scripts and use BTC revive can send a few dollars to and help you get the machine back up and running? :)
  21. Not speaking from any type of true knowledge, but a simple answer would be: A bullet without splash damage that deals 10 points. Hits a point on the house, house takes 10 points of damage. A bullet with splash damage that deals 10 points on hit, then 10 (or even less) points in every single direction around the original hit, house takes tons more damage per hit and will reach it's damage threshold to collapse a lot sooner. Throw in the fact that a bullet may go through the wall, deal splash damage to that wall and then hit another wall inside, dealing more splash damage to that wall and so on and you can see a house will take a lot of damage in a hurry. That'd be my guess...
  22. Some more strangeness...Start up a test a mission with the following in your init.sqf. skipTime -24; 86400 setOvercast 1; 86400 setFog 0; 86400 setRain 1; skipTime 24; Start up the mission. Not a cloud in the sky (yet it still may start raining) but the sun is definitely muted. Hit escape, click on "Save & Exit" and go to the unit selection screen. Click another unit to come in, launch (it loads from the saved point and only a second or two of actual 'time' has elapsed according to the in game watch) and poof, the sky is full of clouds and it's raining.
  23. Ah, I think you're right, but there's still the issue of there now not being a simple way to randomly (or by parameter selection) start a mission with a full cloud cover. You can start with a script setting setOvercast to 1, but there won't be a cloud in the sky.
  24. setOvercast does not set cloud level in A3 all it does is 'darken' the amount of sun that comes from the sky to the ground. Believe me, I've been fighting with setOvercast, setRain, simulSetHumidtity and other weather commands for a while now. :)
  25. Interesting, but those all appear to be cloud 'checks' for different variables on clouds. Do not see anything in the list that allows you to actually set, increment/decrement cloud levels. Maybe that's not possible anymore and the engine automatically handles clouds, but we still need some way to be able to manually set/change all aspects of weather so people can set missions to have random or configurable weather choices.
×