almaxkiller 1 Posted March 15, 2013 Hey guys, I am not seeing anything on this yet in the ARMA 3 section so I am wondering if anybody can help me out. I am looking to do a short Day/Night cycle on our server. I am looking to do either 30 min of day and 30 mins of night, or do 1 hour of each. Can anybody post the code needed to do this and where it needs to be placed? I was on a ARMA 3 server the other night that had 20 min day and 20 min night and it was a blast, which is why I want to get something like that running on ours as well. Thank you for anybody who can help! Share this post Link to post Share on other sites
cm. 10 Posted March 17, 2013 It's mission specific, so you would need to script it into every mission that you have on the server. I can't remember the script off the top of my head though. Share this post Link to post Share on other sites
almaxkiller 1 Posted March 18, 2013 It's mission specific, so you would need to script it into every mission that you have on the server. I can't remember the script off the top of my head though. I figured as much, that is why I was asking for it. If anybody can help me out I would appreciate it! Share this post Link to post Share on other sites
gammadust 12 Posted March 18, 2013 If you want to time compress the skipTime is the command you're looking for. I have made a mod to do this. Though is a single player only version, then the problem would be synching all players with the server time. I may look into making it mp compatible. In the mean time feel free to check how i did it. Share this post Link to post Share on other sites
almaxkiller 1 Posted March 18, 2013 If you want to time compress the skipTime is the command you're looking for.I have made a mod to do this. Though is a single player only version, then the problem would be synching all players with the server time. I may look into making it mp compatible. In the mean time feel free to check how i did it. What would I put in and where would I put it? I read the wiki on skiptime but was unable to understand what achieved what results (the examples are pretty poor and do not even say what they do). Share this post Link to post Share on other sites
gammadust 12 Posted March 18, 2013 based on my latest implementation: init.sqf TimeXFactor = 30; // change this value to suit your needs (ie 600 >> 10 in-game minutes pass in a real time second) thisframebegintime = diag_tickTime; // we must set before starting the loop onEachFrame { lastframetime = diag_tickTime - thisframebegintime; thisframebegintime = diag_tickTime; skipTime (((TimeXFactor * lastframetime)-lastframetime) / 3600 ); }; drop the above in you mission init.qf The thing is this is absolutely single player. onEachFrame is also a command that should not work in ded server so it is hard to have the server get a proper time/date value to send to clients in order to put them in sync. I am investigating a way to do this. Share this post Link to post Share on other sites
terox 316 Posted March 18, 2013 Wrong forums for this, when youn have a working system, update your initial post there for others to see skiptime is not the best way to synchronise this. (It used to be) Best way now is setdate Look up the following commands in the comref ( http://community.bistudio.com/wiki/Category:Scripting_Commands_ArmA2_ "addpublicvariableeventhandler" call compile preprocessfilelinumbers Date SetDate here are the basics //////////////////////////////////////// INIT.SQF 1) Define a publicvariable eventhandler for the variable Tag_NewDate 2) Have the pv eventhandler call a function ///////////////////////////////////////////////////////// The code for that function would look something like Just one line of code nothing else setdate _this select 1; ////////////////////////////////////////////////// // SERVERSIDE SCRIPT If ! (IsServer)exitwith{}; _addtime = 10; // Number of minutes you want to advance per cycle) _delay = 180; // delay in seconds between loops (3 minutes in this example) While{TRUE}do { sleep _delay; Tag_NewDate = [date select 0, date select 1, date select 2, date select 3, (date select 4 + _addtime)]; PublicVariable "Tag_NewDate"; SetDate Tag_NewDate; }; //////////////////////////////////////////////////////////////// What this does The server script , in the above example loops every 3 minutes On each loop it gets the current date array which contains the current time as part of its elements It then saves that date array as variable called Tag_NewDate and amends the value of the minutes (Date select 4) (dont worry if you have a value of 58 minutes when you add 10 minutes, it will still increment the time 10 minutes into the next hour) It then broadcasts this value over the net to the clients The clients receive this via the publicvariableventhandler That eventhandler then launches a function The value of Tag_NewDate is passed to the function as _this select 0 Setdate command then redefines Date with the new value defined by Tag_NewDate Important to note. The server will not initialise the Publicvariable eventhandler this is why you have the code "SetDate Tag_NewDate;" in the serverside script loop You will have to play about with the values _delay _addtime until you can create a smooth transition, especially around 1st light and last light Share this post Link to post Share on other sites
gammadust 12 Posted March 18, 2013 (edited) I think i've got it (the mp part), i'll have to digest it though. Many thanks for that... you're saving me a lot of searching. Edited March 18, 2013 by gammadust Share this post Link to post Share on other sites
gammadust 12 Posted March 19, 2013 @OP in my search i found this. It was probably the script that server was running. Share this post Link to post Share on other sites
skydive 1 Posted March 20, 2013 @OP in my search i found this. It was probably the script that server was running. I tried running that and it does work, but time transitions are not very smooth and after it has been running for about an hour or more, it seems to get confused and then starts jumping around in time. Share this post Link to post Share on other sites
terox 316 Posted March 20, 2013 during first light and last light timings you can have a switch that modifies the speed of the updates and the speed of the time changes. Something like If ! (IsServer)exitwith{}; _addtime = 10; // Number of minutes you want to advance per cycle) _delay = 180; // delay in seconds between loops (3 minutes in this example) While{TRUE}do { // If the time is between 4am and 6pm, lets speed up the updates and reduce the time advance if((Date select 3) > 4)&&((Date select 3) < 6))then{_delay = 60; _addtime = 5}else{_delay = 180; addtime = 10}; // If the time is between 6pm and 8pm, lets speed up the updates and reduce the time advance if((Date select 3) > 18)&&((Date select 3) < 20))then{_delay = 60; _addtime = 5}else{_delay = 180; addtime = 10}; sleep _delay; Tag_NewDate = [date select 0, date select 1, date select 2, date select 3, (date select 4 + _addtime)]; PublicVariable "Tag_NewDate"; SetDate Tag_NewDate; }; Again play about with the various _delay and _addtime values to get a smoother transition Share this post Link to post Share on other sites
skydive 1 Posted March 20, 2013 I was able to get it sorted out and works pretty good now. Share this post Link to post Share on other sites
gammadust 12 Posted March 22, 2013 I think this might still be worthwhile here. Check my solution combining my existing TimeXleration client smoothness with server/client time synchronization - DL demo mission / post with details. Personal thanks to Terox for the server side of things. Server testers needed > feedback on same thread ^^. Share this post Link to post Share on other sites