Jump to content

VictorFarbau

Member
  • Content Count

    557
  • Joined

  • Last visited

  • Medals

Everything posted by VictorFarbau

  1. I must say I didn't like the scripts I saw so far It's good work and appreciated, sure, but to me it all looks a bit lengthy and clumsy. So I decided to throw a new script into the ring which I claim is the shortest fully MP compatible time sync script. Nothing wrong with a bit of competition, right? Just having fun. Instructions for a test: 1. Create a new mission that contains a player, an "H (invisible)" object called "mytimeobject" and of course a logic object called "Server" (as usual for MP missions). 2. Call both scripts "MPtimeserver.sqs", "MPtimeclient.sqs" 3. Watch the dawn The server script maintains an absolute hour:minute time format, all clients will synchronize to the exact server time, whether this means in- oder decreasing the current localtime by the necessary values. MPtimeserver.sqs <table border="0" align="center" width="95%" cellpadding="0" cellspacing="0"><tr><td>Code Sample </td></tr><tr><td id="CODE"># _servertime = continuous count of time in minutes, starts at 05:00h in this example # _accel = acceleration factor (1h in 24h = accel 24) ?!(local Server): exit _servertime = 5 * 3600 _accel = 24 _updateinterval = 1 mytimeobject setpos [0,0,0] #tempusfugit ~_updateinterval _servertime = _servertime + (_updateinterval * _accel) _abshours = floor(_servertime / 3600) _absmin = floor((_servertime MOD 3600) / 60) mytimeobject setpos [_abshours,_absmin,0] goto "tempusfugit" MPtimeclient.sqs <table border="0" align="center" width="95%" cellpadding="0" cellspacing="0"><tr><td>Code Sample </td></tr><tr><td id="CODE"># Time client script _serverhours = 0 _servermin = 0 #tempusfugit ~2 _localhours = floor daytime _localmin = 60 * (daytime MOD (floor daytime)) _serverhours = (getpos mytimeobject) select 0 _servermin = (getpos mytimeobject) select 1 skipTime (_serverhours - _localhours) skipTime ((_servermin - _localmin) / 60) goto "tempusfugit" Regards, Victor
  2. VictorFarbau

    Pointer structures available?

    "call" and "compile" indeed do the trick - even though the syntax has slightly changed from OFP. Somehow these commands were not on my radar screen anymore. But it does exactly what I need - convert variable names transferred as strings back into useable code lines throughout multiple script calls. Still no pointers but a working solution Excellent, thanks a lot guys for all your input! Regards, Victor
  3. Hello, I was wondering if anybody knows this. Are there any pointers available in the scripting language of ArmA? In my current project I have a master script that spawns a couple of child processes and they all depend on one or more global variables which are supposed to control actions of the child processes. I don't want to hard code the global variable names into each single script. This would be pointless looking at future extension of this mission and the names might change anyway. But I haven't found a way to pass on a pointer reference to scripts. All I can pass on using the [x] exec "y.sqs" syntax is absolute values or strings but no references. Anybody ever had a genius idea how to overcome this? Thanks, Victor
  4. 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
  5. VictorFarbau

    Pointer structures available?

    I am afraid that's not the point Donnervogel. As said, I just need a way how to pass on global variable names to scripts. All I get is their values instead when I pass them on. I guess this means no pointers no luck here. Victor
  6. 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
  7. VictorFarbau

    Pointer structures available?

    @Donnervogel: I have to say that I am always writing missions and scripts 100% Multiplayer compatible. I know a lot of problems stem from this and would never occur in SP setup in the first place. <table border="0" align="center" width="95%" cellpadding="0" cellspacing="0"><tr><td>Code Sample </td></tr><tr><td id="CODE">_a = [1,2,3]; _b = _a; This is a good thought and straight to the point - but it doesn't work across scripts since the local reference is lost. And global references is what I am looking for. Regards, Victor
  8. VictorFarbau

    Pointer structures available?

    Before I answer to the good comments above let me clarify what my problem is using a simplified scenario: I have a global variable called "sector1alert". This basically watches for intrusion of a given sector. If "sector1alert" is "1" then 10 sub-scripts will be spawned that place a mine each in that sector and wait for proximity of an enemy. Inside, each of the 10 subscripts must know whether "sector1alert" is still "1" - if it is back to "0" each script must exit. Easy to realize if I am hardcoding the "sector1alert" part into the subscripts. Here's the catch: What if I need to monitor a variable amount of sectors each time? How can I make sure that each spawned script looks at the right sectorXalert variable? Ok, I'll create an array and can pass on each element to the subscripts a la: <table border="0" align="center" width="95%" cellpadding="0" cellspacing="0"><tr><td>Code Sample </td></tr><tr><td id="CODE"> alerts = [sector1alert,sector2alert,sector3alert...sector99alert] [alerts select _index] exec "placemines.sqs" [alerts select _index+1] exec "placemines.sqs" ... Problem will be that the subscripts will receive the actual value of the "_alerts select _index" reference (so "1" or "0") but not the variable name so they can't check the ongoing state of this variable, they have no way of referencing it. Man, this is a lot of explaining for a real simple issue Hope it is at least a bit more clear now. I need global references / pointers to global variables since passing on the variable names simply doesn't work - only the values get passed on that way. Regards, Victor
  9. 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
  10. 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
  11. 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
  12. 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
  13. VictorFarbau

    waypoints with multiple groups

    If you ask me: yes it is the way you need to do it to keep best control and flexibility. I am not a friend of complex map trigger matrices - often you loose overview with these and it's almost impossible to troubleshoot syntax errors in these little text boxes. The script should be a rather simple iteration of if..then..else constructs that change waypoints according to situations. Regards, Victor
  14. VictorFarbau

    NIM Dynamic Weather

    I ran this on a dedicated server with a map on which I just placed a nice thunderstorm. Works fine on each client; so it is MP-ready the way it is for all I can say. But this indeed requires all players to have that addon installed; which is also not really a problem in my view since this is the very concept of addons (complex code and resources preinstalled on clients instead of huge network transfers). To split this up and embed the scripts and resources in separate missions is certainly possible but a bit of a redundant effort in my mind. Cheers, Victor
  15. VictorFarbau

    NIM Dynamic Weather

    @Smiley_Nick -> PM Hope we manage to get this fully SP/MP compatible soon. Victor
  16. VictorFarbau

    NIM Dynamic Weather

    @Whoever owns this addon project now - I can share my little time&weather MP scripts with you if you like. These are very small and just synchronize time and weather conditions across MP players, nothing fancy and easy to use for your addon too I guess. I would really like to see this great addon work in MP Just let me know if you'd like the scripts or a hand with the implementation. Regards, Victor
  17. I am busy creating a mission that spawns (and un-spawns) up to 80 - 120 enemy units (mainly soldiers, a few jeeps and BMPs) in a given sector; but never more than this at a time. Not only can I crash the game just by playing this mission for about 10 min; I also noticed that the ARMA.RPT file is sometimes about 5MB, sometimes even up to 20MB and it's full with one message only: I don't know what this exactly refers to; but indeed my enemy units act kind of stupid. Often I run into them while they are already engaged in a wild firefight amongst themselves They seem to particularly hate any (friendly) UAZMG since they attack these very often and get shot back by the other group then. Is there anything I could improve to avoid this error? Regards, Victor * System Specs: Core2Duo 6400@2133Mhz, 2GB DDR-667, GF7800GTX@256MB,320GB SATA2 * Addons used: STR_DEBUG Console
  18. VictorFarbau

    w:\c\Poseidon\lib\AI\aiArcade.cpp(1357) ERRORS

    Hey Mr Tea, well, now that we know it it is of course an obvious mistake. That's why I suggested to make the waypointtype function a bit more strict and protect it against such user errors. The effects this has are quite dramatic (thousands or errors silently logged, game crashes) so this wouldn't be a bad thing. Victor
  19. VictorFarbau

    w:\c\Poseidon\lib\AI\aiArcade.cpp(1357) ERRORS

    Suma, this was the golden tip of the day - solved! Changed the waypoints to "SAD" - no more errors. Thanks so much. This is really a tricky one since it is mostly invisible to the user/scripter; maybe this could be improved in a future patch. E.g. do not allow the DESTROY type unless the waypoint has already a target attached or the like. Regards, Victor
  20. SNKMAN, ok, so the code I showed is meant to be used in a script indeed. But this script is supposed to be used instead of a map trigger and not together with it. You can place an object (e.g. an "invisible H") called "watchme" somewhere on the map and then the script example below checks the vicinity 100m for any present / alive western soldiers (= class "Man"). If there are, then the global variable "alertmode" is set to 1. This can then be used by any other script or map trigger. <table border="0" align="center" width="95%" cellpadding="0" cellspacing="0"><tr><td>Code Sample </td></tr><tr><td id="CODE"> #watchit _intruders = nearestObjects [watchme, ["Man"], 100] IF (west countSide _intruders > 0) THEN {alertmode = 1; publicVariable "alertmode";} ~1 goto "watchit" Hope this is more clear now. Victor
  21. Hello again, cascaded AND statements like this might confuse the parser and thus lead to unpredictable results (happens to me). You could try to enclose each statement with brackets () AND () AND (). You might as well create a trigger with a custom script (much nicer and more flexible). I am busy writing my own CTI mega-mission which makes extensive use of these. All you need is a spot and the radius you want to watch. Then you could use this piece of code in a loop and make it fit to your needs: <table border="0" align="center" width="95%" cellpadding="0" cellspacing="0"><tr><td>Code Sample </td></tr><tr><td id="CODE"> _intruders = nearestObjects [_startpoint, ["Car","Tank", "Man","Air"], _triggerradius] IF (west countSide _intruders > 0) THEN {_alertmode = 1} Do you understand the above? Not sure how script-savvy you are. This fills an _intruders array with all objects in the _triggerradius vicinity which are of type Car, Tank, Man or Air and then counts the number of West objects in there. So Car Tank Man and Air are the classes you can identify, remove or add them as needed. West and East and Guer are the sides present in the game usually (if at least 1 object of the side exists at mission start). All clear? Cheers, Victor
  22. VictorFarbau

    Data storage

    In regards to writing data to the game I had an idea I will pursue a bit during the weekend. UNN managed to create a systematic error reports such as: I am thinking of writing a small daemon program (in Windows) to pick up this type of data and transform this into an "example.sqs" script in the desired mission folder such as: This way the mission could start example.sqs at a defined point in time and all important global variables would get updated within the current game. Here's the problem: how do you get the mission to start such an example.sqs outside of the mission.pbo? Would the engine accept a singled-out file anywhere else? Cheers, Victor
  23. VictorFarbau

    Data storage

    Very true - I have dreamt about this for a long time. Saving and loading complete scenarios (all objects & variables) in SP and MP games would enhance gameplay considerably in my mind. You cannot expect people to play more complex war scenarios in one session only. Then again it's boring to start all over again each time since this does not value any accomplishments made so far. Exchanging data through files would open a new perspective on mission design altogether. I'd say we need it Â
  24. Not a problem, you can edit this all yourself since the voice is computer-generated and you know how to handle a sound editor as it seems. Now, to have more people benefit from this I started a new thread which includes a download of a howto plus some samples. I agree that everybody would like different voices and amplification levels - this is all possible and easy for you to do yourself. So look for a thread called "Best practice sharing - Voice creation" and have fun creating all your messages. Regards, Victor
  25. Hey SNKMAN, you sure have some bad reception there! How do you like the quick sample I made completely free and using web services? Try Me I have used this method of creating in-game voices for a couple of missions since only a few amongst us really have a fancy presenter's voice... More if you're interested. Victor
×