snkman 351 Posted February 25, 2007 Hi guy's, well someone know's how to do that? If you play 1 hour ArmA it should be night and day ( 1 hour Realtime = 24 hour's in ArmA ) For MP and synchronously for all client's. Share this post Link to post Share on other sites
fasad 1 Posted February 26, 2007 just run a script on all clients that skips time at the the appropriate rate (assuming skipTime still has a local effect). Share this post Link to post Share on other sites
terox 316 Posted February 26, 2007 skiptime is local, the trick is to synchronise the times with the server, if you dont i can assure you that as time passes, clients and server will become more and more out ofm sync obviously sync'ing every skiptime is too much, so i would reduce this to once every 5 minutes or some such delay Share this post Link to post Share on other sites
snkman 351 Posted February 26, 2007 Can you Guy's please maybe give me some code's how to do that? Share this post Link to post Share on other sites
VictorFarbau 0 Posted February 26, 2007 I think by now there are numerous time scripts out there which run in MP. At least I am using mine for years now. The principle is very simple. 1. On the server (and only there! you run a time keeper script that updates a global variable every 5 min. 2. On each client you run a watch script that checks whether the global variable has changed and if so runs a skiptime command on the client. Commands used: publicVariable (global effect) skiptime (local effect) Cheers, Victor Share this post Link to post Share on other sites
C4P741N 0 Posted February 26, 2007 I think by now there are numerous time scripts out there which run in MP... You'd be surprised. In OFP I was never given a solution (or one that I could get working) on how to do this. I could use this in sooo many missions. I would have most of my missions using 1hr RT=24hr game time. It gives the impression of being in a prolonged conflict zone. Share this post Link to post Share on other sites
mattxr 9 Posted February 26, 2007 I managed to do it, but the only problem was people JIP they would start with the time that everyone started at, at the start of the mission and they had daylight while everyone was nighttime and it just screwed things up lol. Share this post Link to post Share on other sites
Infam0us 10 Posted February 26, 2007 skiptime is local, the trick is to synchronise the times with the server, if you dont i can assure you that as time passes, clients and server will become more and more out ofm syncobviously sync'ing every skiptime is too much, so i would reduce this to once every 5 minutes or some such delay Is that why when I die on a coop mission, then disconnect from the server, join again in a different slot its daytime for me. But still night for my other teammates? Share this post Link to post Share on other sites
sickboy 13 Posted February 26, 2007 skiptime is local, the trick is to synchronise the times with the server, if you dont i can assure you that as time passes, clients and server will become more and more out ofm syncobviously sync'ing every skiptime is too much, so i would reduce this to once every 5 minutes or some such delay Is this proven? I have the idea that I played at night time and another guy at day time and it didn't make *ANY* difference and was NOT causing any desyncs etc. But I could be wrong?JIP Compatible, Time, Fog & Overcast Sync: This will Sync time and weather with server every 240 seconds, and IF there is change in the weather, there will be a 30 second transition-time. - Place a Gamelogic on the map and name it: server - Make/add to end of init.sqf:<table border="0" align="center" width="95%" cellpadding="0" cellspacing="0"><tr><td>Code Sample </td></tr><tr><td id="CODE">[240, 30] spawn compile preProcessFile "Sync.sqf"; - Make Sync.sqf: <table border="0" align="center" width="95%" cellpadding="0" cellspacing="0"><tr><td>Code Sample </td></tr><tr><td id="CODE">// Sync Time & Weather - by Sickboy (sb_at_6thSense.eu) private ["_transtime","_synctime"]; _synctime = _this select 0; // Every xx Seconds server will broadcast to sync Time & Weather _transtime = _this select 1; // Seconds needed per Weather Transition (From Current Weather to New Weather (if any)) if(isnil "var_syncset")then{var_syncset=false;};if(isnil "var_currtime")then{var_currtime=0;}; if(isnil "var_currfog")then{var_currfog=0;};if(isnil "var_curroc")then{var_curroc=0;}; // Initialize Server/Client Engines if(local server)then{[_synctime] spawn compile preProcessFile "Sync_srv.sqf";} else {[_transtime] spawn compile preProcessFile "Sync_cl.sqf";}; - Make Sync_srv.sqf:<table border="0" align="center" width="95%" cellpadding="0" cellspacing="0"><tr><td>Code Sample </td></tr><tr><td id="CODE">// Sync Time & Weather - by Sickboy (sb_at_6thSense.eu) private ["_synctime"]; _synctime=_this select 0; scr_sync={var_currtime=daytime;publicVariable "var_currtime";var_currfog=fog;publicVariable "var_currfog";var_curroc=overcast;publicVariable "var_curroc";var_syncset=true;publicVariable "var_syncset";}; // Join In Progress Publisher onPlayerConnected "[] spawn scr_sync"; // Server Loop for publishing waitUntil{sleep _synctime;[] spawn scr_sync; false}; - Make Sync_cl.sqf: <table border="0" align="center" width="95%" cellpadding="0" cellspacing="0"><tr><td>Code Sample </td></tr><tr><td id="CODE">// Sync Time & Weather - by Sickboy (sb_at_6thSense.eu) private ["_transtime"]; _transtime=_this select 0; // Client Loop for Receiving from Server waitUntil{waitUntil{var_syncset};var_syncset=false;skipTime (var_currtime - daytime + 24) % 24;_transtime setfog var_currfog;_transtime setOvercast var_curroc; false}; If you Want Speedup Time: This should skiptime by 0.2 hour (14 minutes) every 30 seconds (1 hour real time = 24 hour game time) - Add this to the init.sqf:<table border="0" align="center" width="95%" cellpadding="0" cellspacing="0"><tr><td>Code Sample </td></tr><tr><td id="CODE">[30, 0.2] spawn compile preProcessFile "speedTime.sqf"; - Make speedTime.sqf: <table border="0" align="center" width="95%" cellpadding="0" cellspacing="0"><tr><td>Code Sample </td></tr><tr><td id="CODE">// Speedup Time - by Sickboy (sb_at_6thSense.eu) // (Every _sleep seconds, skiptime _skip.) private ["_sleep","_skip"]; _sleep = _this select 0; // Sleep in seconds to skip time _skip = _this select 1; // Amount of time skipped to accomodate your wishes // Looping Timeskip on Server & Client waitUntil {sleep _sleep;skipTime _skip; false}; If you Want Random Overcast & Fog: - Add this to the init.sqf:<table border="0" align="center" width="95%" cellpadding="0" cellspacing="0"><tr><td>Code Sample </td></tr><tr><td id="CODE">private ["_scr"]; _scr=compile preProcessFile "dynWeather.sqf"; if(local server)then{["Overcast", 120, 0.1, 0.7, 0.08] spawn _scr;["Fog", 120, 0.05, 0.5, 0.05] spawn _scr;}; - make dynWeather.sqf: <table border="0" align="center" width="95%" cellpadding="0" cellspacing="0"><tr><td>Code Sample </td></tr><tr><td id="CODE">// Simple Dynamic Weather - by Sickboy (sb_at_6thSense.eu) // (Every _sleep seconds, set up to max or down to min.) private ["_c","_i","_sleep","_min","_max","_steps"]; _type = _this select 0; // "Overcast" or "Fog" _sleep = _this select 1; // Sleep until Change on server (Clients will receive the updated info through sync.sqf every _synctime) _min = _this select 2; // Minimum _max = _this select 3; // Maximum _steps = _this select 4; // Step-size up and down // Code to run _c="waitUntil   {    _i=%1;    while{_i<=_max}do{sleep _sleep;_i=_i+_steps;10 set%1 _i};    while{_i>=_min}do{sleep _sleep;_i=_i-_steps;10 set%1 _i};    false   };"; // Execute Loop call compile format[_c,_type];You can leave out all the 'Sync' scripts for Single Player if you wish Tested in v1.02, working fine (Didn't test the overcast/fog though) Share this post Link to post Share on other sites
VictorFarbau 0 Posted February 26, 2007 I am indeed surprised that there is still a need for these. So let me simply share my two scripts (client and server) here if it helps anybody. Note 1: de-sync issues observed at a 1% rate, happens more when clients have sub-par connectivity. In that case a global variable updated by the server might not reach the client or -worse- be set to 0. As said, can happen but rarely. Note 2: The map needs a EMPTY-GAME LOGIC called "server" on it (as for most other MP compatible missions as well). Code for "Timeserver.sqs" <table border="0" align="center" width="95%" cellpadding="0" cellspacing="0"><tr><td>Code Sample </td></tr><tr><td id="CODE"> # Timeserver build 007 # Victor Farbau 2004 ?!(local Server): exit #update interval in minutes _updateinterval = 6 #could be totally random, but these daytimes create the best atmosphere _hours = [5,6,7,12,17,18,19,20] _hourcount = (count _hours) - 1 globaltime = _hours select (random _hourcount) #weatherloop globalfog = random 0.5 globaloc = random 1 globaltwready = 1 sbcflag = sbcflag + 1 sbcmsg = 1 publicVariable "sbcflag" publicVariable "sbcmsg" publicVariable "globaltime" publicVariable "globalfog" publicVariable "globaloc" publicVariable "globaltwready" ~(_updateinterval * 60) goto "weatherloop" Code for "Timeclient.sqs" <table border="0" align="center" width="95%" cellpadding="0" cellspacing="0"><tr><td>Code Sample </td></tr><tr><td id="CODE"> # Time and weather client build 009 # Victor Farbau 2005 #client ~5 ?(globaltwready != 1): goto "client" #waitfortime ~2 ?((globaltime < 0) OR (globaltime > 24)): goto "waitfortime" skiptime globaltime #waitforfog ~2 ?((globalfog < 0) OR (globalfog > 1)): goto "waitforfog" 15 setfog globalfog #waitforovercast ~2 ?((globaloc < 0) OR (globaloc > 1)): goto "waitforovercast" 15 setOvercast globaloc _checksum = (globalfog + globaloc) #waitforupdate ~15 ?((globalfog + globaloc) == _checksum): goto "waitforupdate" goto "waitforfog" Regards, Victor Share this post Link to post Share on other sites
sickboy 13 Posted February 26, 2007 ... Hi there Victor, I am not really sure how your script is going to speed up time and synchronise it every xx Minutes? Aswell as that the server does not skiptime, unless you run the timeskipCLIENT also on the server In your example, the time will be skipped by either any of these amounts of hours: [5,6,7,12,17,18,19,20] (picked at the start of the script), and then skips this amount of time every 6 minutes (adjustable). I don't see any parts which synchronise the time or JIP considerations. Aswell as that this setup requires the time ALWAYS to be updated by the server, which means you cant make it update every few seconds, because then you would need the server to publicVariable every few seconds and you dont want that in Multiplayer The problem is that if you do long delays before skipping time, Â the skiptime must be bigger, and because of this the daytime transactions will seem large (every 6 minutes the time would skip 2.4 hours (this could make a change from light into night ;D)) Share this post Link to post Share on other sites
VictorFarbau 0 Posted February 26, 2007 That is correct sickboy, I didn't bother to change my script specifically to the needs. I thought the necessary changes might be obvious and easy to do. Don't get me wrong - I am just assuming a certain level of script understanding so I honestly thought this is obvious enough. I believe that's the best way to learn as well - study how other people solved problems and learn from modification. I wasn't aware whether this was a request a la "here's what I need - gimme a script!". I am sure SNKMAN's knowledge will grow further if he manages to pull this off now  And to the script question of yours: yes the server does not execute the skiptime command. This would be pointless for a dedicated server and "skiptime" only has a local effect on each client. If you run a non-dedicated server then both scripts will run on your machine and the time will still be skipped. The odds and ends of local versus global effects in OFP/Arma are a fountain of joy, I can tell you  Greetz, Victor Share this post Link to post Share on other sites
terox 316 Posted February 26, 2007 i made a skiptime script for OFP, i shall post it here, however whether it will run soundly in arma and how to modify it for JIP is another matter But it will give you some idea of how the sync works and how to speed up/slow down during sunrise and sunset periods to give a smoother transiytion from day to night There are 3 scripts and ofcourse it uses a gamelogic called "server" so that you can identify which node is the server (gamelogics being local only to the server machine) therefore ?(local) server: actually means, is the gamelogic server local on this machine I could have simply named the gamelogic "Dedi" and used ?(local Dedi): to reach the same conclusion Enough of the basics already!! here's the code updateclock.sqs Quote[/b] ]?(local Server):exitnewTime = false #start @(newTime) _serverTime = currentServerTime _timeChange = _serverTime - daytime skipTime _timeChange newTime = false goto "start" updateclockserver.sqs Quote[/b] ]?!(local Server):exitnewTime = false;PublicVariable "newTime" ~5 #start ~10 currentServerTime = daytime; PublicVariable "currentServerTime" newTime = true; PublicVariable "newTime" goto "start" updateskiptimeserver.sqs Quote[/b] ]?!(Local Server):Exit #start <span style='color:red'>? (daytime >= 4.5) && (daytime < 7.5):_delay = 2.5;_skip = .05 ? (daytime >= 7.5) && (daytime < 16.5):_delay = 30;_skip = 0.4 ? (daytime >= 16.5) && (daytime < 20):_delay = 2.5;_skip = .05 ? ((daytime >= 20) && (daytime < 24)) || ((daytime > 0) && (daytime < 4.5)):_delay = 20;_skip = 0.4</span> ~_delay skipTime _skip goto "start" This code is ancient, I havent looked at it for over 3 years, its not very efficient and for arma requires a complete re-write and modification to sqf format, but will give you some idea of what is involved NB the text in red allows for a smoother transition for sunrise sunset Hope that helps Share this post Link to post Share on other sites
sickboy 13 Posted February 26, 2007 Quote[/b] ]NB the text in red allows for a  smoother transition for sunrise sunsetThat's nicely thought of! That is correct sickboy, I didn't bother to change my script specifically to the needs. I thought the necessary changes might be obvious and easy to do. Don't get me wrong - I am just assuming a certain level of script understanding so I honestly thought this is obvious enough. I believe that's the best way to learn as well - study how other people solved problems and learn from modification. I wasn't aware whether this was a request a la "here's what I need - gimme a script!". I am sure SNKMAN's knowledge will grow further if he manages to pull this off now  And to the script question of yours: yes the server does not execute the skiptime command. This would be pointless for a dedicated server and "skiptime" only has a local effect on each client. If you run a non-dedicated server then both scripts will run on your machine and the time will still be skipped. The odds and ends of local versus global effects in OFP/Arma are a fountain of joy, I can tell you  Greetz, Victor I also assumed that, but it seems that some ppl simply need the scripts... as they can see what the script supposed to do and how that is related to scriting syntax I think it is important to have the time of the clients synced with the time of the server..... 1. If the clients do not have 1 universal source to sync from, then they can never be really synced And How can a new joined player, know how far he needs to skip time? 2. All scripts that rely on daytime, being night, light, morning, afternoon etc. etc. will not work as they should on the server, if you do not update the time on the server... Share this post Link to post Share on other sites
VictorFarbau 0 Posted February 26, 2007 Sickboy, but the clients are synchronized with the server. But through a global variable managed by the server and not actually the servers local time. Main point is that all clients have the same local time. Answering: 1. The universal source in the quoted script is the "globaltime" variable managed by the server and distributed to all clients via the "globalVariable" function. 2. This shouldn't be a problem. Each time the script starts it checks whether "globaltime" has a valid value already and if so skips the amount of hours to reach the same time. When joining a game a client should typically get updated on all global variables and objects first thing. Cheers, Victor Share this post Link to post Share on other sites
sickboy 13 Posted February 26, 2007 1. The universal source in the quoted script is the "globaltime" variable managed by the server and distributed to all clients via the "globalVariable" function.2. This shouldn't be a problem. Each time the script starts it checks whether "globaltime" has a valid value already and if so skips the amount of hours to reach the same time. When joining a game a client should typically get updated on all global variables and objects first thing. 1. The globaltime variable is not a time variable at all, but an amount of hours that it should skip PER timeskip, there is no synchronising in this way, only the same amount of hours PER skip... which does not make all the clients always have the same time or near the same time Especially since some clients join the game later.... 2. As far as I know, the global variables are NOT broadcasted when new clients connect (JIP), hence that we need onPlayerConnected... Share this post Link to post Share on other sites
VictorFarbau 0 Posted February 26, 2007 Ok, if you need to be such a nitpick... If you want it real easy: 1. create an HeliHempty object and call it "timerobject" somewhere on the map and let the server set its position to [0..24,0..60,0] according to the desired time 0..24:0..60 2. The position of map objects will be synchronized during connect and later on as well so each client can simply read the position of "timerobject" and set the local clock accordingly using skipTime 3. Repeat steps 1 and 2 as desired on servers and clients. Bang boom global time is set; it's just not elegant to always use these workarounds instead of proper programming. Cheers, Victor Share this post Link to post Share on other sites
sickboy 13 Posted February 26, 2007 Ok, if you need to be such a nitpick...If you want it real easy: 1. create an HeliHempty object and call it "timerobject" somewhere on the map and let the server set its position to [0..24,0..60,0] according to the desired time 0..24:0..60 2. The position of map objects will be synchronized during connect and later on as well so each client can simply read the position of "timerobject" and set the local clock accordingly using skipTime 3. Repeat steps 1 and 2 as desired on servers and clients. Bang boom global time is set; it's just not elegant to always use these workarounds instead of proper programming. Cheers, Victor It has nothing to do with NitPicking, it has simply todo with keeping a good framework without creating inconsistencies that later on or in other situations create problems... Nice about the position btw Thanks for the tip Quote[/b] ]Bang boom global time is set; it's just not elegant to always use these workarounds instead of proper programming.Sure it isn't ... But ur programming code was lacking certain aspects... But anyway, "Nitpicking" anyways, right?.. Share this post Link to post Share on other sites
snkman 351 Posted February 26, 2007 Hey Guy's, thank's alot for the help. Well i choosed sickboy's script and it work's really well! @sickboy Just one question to your Script: Does it change weather too? Or is it only to Sync the Weather? In the script i saw "var_currfog" what does it do? Share this post Link to post Share on other sites
VictorFarbau 0 Posted February 26, 2007 Sickboy, ah well, I just found it nitpicking to elaborate on the function of skipTime and its usage to skip time instead of setting it. I know darn well since I programmed and tested that stuff myself. But that's all right with me, it's the sum of all aspects and concerns that usually creates the solution so keep on nitpicking Anyway, for most MP script parts I started to use map objects as well now; I am just slowly getting tired of trying all the proper ways that often won't work for any apparent reason. So the HeliHEmpty object has become the single most useful component in my ArmA programming these days By setting the position you can basically transfer 3 variables at the same time in a way that works almost 100% in MP. SP missions are much more simple and usually quickly done - only to fail miserably when it comes to playing them on a server. Regards, Victor Share this post Link to post Share on other sites
sickboy 13 Posted February 26, 2007 @sickboy Just one question to your Script: Does it change weather too? Or is it only to Sync the Weather? In the script i saw "var_currfog" what does it do? Nice to hear that it works m8 You might want to incorporate some of the ideas by Terox which include skipping time more slowly around the crucial day-change times like in the morning and afternoon. The weather is not automaticly changed. It is merely synced. var_currfog saves the fog setting of the server and gets broadcasted for the clients to read back and put as their fog setting, it's only there for the purpose of syncing the fog, it should remain untouched by other scripts I updated my Post with Random Overcast/Fog and split the time part out into seperate script. http://www.flashpoint1985.com/cgi-bin....1012084 Share this post Link to post Share on other sites
snkman 351 Posted February 26, 2007 GREATE! Thank's a lot pal. Share this post Link to post Share on other sites
sickboy 13 Posted February 27, 2007 GREATE! Â Â Thank's a lot pal. Â It was updated oncemore... Better configuration options and setup, if you ask me I will release these scripts in some scripting package sometime, together with some other handy stuff Share this post Link to post Share on other sites
mattxr 9 Posted February 27, 2007 Sickboys Scripts [ Tested 1.04 ] Work Perfectly. Share this post Link to post Share on other sites
Guest Posted February 27, 2007 hey guys, mind if I ask a question regarding all of this accel time function - I have a script written by CSL, that does pretty much the same thing, its just simplified for single player use, although even at most optimum settings, it still lags a little due to clouds being pushed thru frames each skip time incriment, is there any way to disable the clouds from being affected by an accel time script? It doesent appear there is, thought id ask as it looks like you guys got a pretty solid angle on this script app Share this post Link to post Share on other sites