OFPEC Forum
Editors Depot - Mission Editing and Scripting => OFP - Editing/Scripting Multiplayer => Topic started by: Killswitch on 14 Sep 2003, 21:33:18
-
This thread: player=? on dedicated server (http://www.ofpec.com/yabbse/index.php?board=7;action=display;threadid=9589;start=0) hints at a nice trick for checking wether a script is run on a dedicated server:
? format ["%1",player] == "<NULL-object>": do-stuff-for-a-dedicated
However, I believe I have found a snag with that. There are three cases where player is a null object:
- In missions running on a dedicated server (as above)
- During an intro (in SP)
- During an outro (in SP)
The deal, you ask? Well, there are scripts out there and addons with event handlers that do the above check
(player equalling the null object) and conclude "Ok, I'm on a deddy". Nuh-uh...
Case in point: the OFPEC Blood addon scripts do this and, for performance reasons, don't activate parts that would be meaningless to run on a dedicated server.
This could potentially affect the way one expects scripts and/or addons to behave while in an intro or an outro.
So... does anyone have a good idea on how to detect a dedicated server conclusively?
Assume that you are running from an addon event handler and therefore cannot do any fancy scripting in, say, a initIntro.sqs script in order to set something like "SPIntro=true" or expect the existence of a GameLogic conveniently named "Server".
-
?! (local player)
You can take it for granted that a mission will always have a player
however the player will never be local to the server on a dedi, so unless i am mistaken, the above should do the trick
-
I thought so too at first... however, the expression !(local player) evaluates to true during an intro (and an outro, perhaps, didn't test that).
-
why do you want to do this.
I mean if its an MP it cant have an intro just a cutscene
my other thjoughts are, as u posted
player = objnull type thing
how about (Stabbing in the dark)
! Player
or maybe this weird one
?(!alive player) 0r (alive player):exit
why do you need to distinguish this so much, are you trying to create something that will run in all cases or an SP and an MP player server and a dedicated server
-
why do you want to do this.
Like I hinted at - imagine using an addon init event handler to set up some extra functionality/effects for an addon. Parts of these features may be unnecessary to run on a dedicated server (to save CPU load). However, the same init event handler running on a machine that is not a deddy might be running during an intro. The simple heuristic above for determining "running on a deddy" might lead to that addon wrongly disabling visual features that actually should be showing during an intro/outro.
why do you need to distinguish this so much, are you trying to create something that will run in all cases or an SP and an MP player server and a dedicated server
Yes. Addons worth their name should do precisely that. A working solution is good enough. We don't have that as of yet.
-
well short of a readme file with the addon explaining the need for and how to implement a gamelogic i really dont see a solution
There are commands that only work in an SP game, campaign saves etc etc, maybe this would be be avenue pursuing
Did you try the two player lines. I didnt even run them in editor, they were just wild guesses, however if the command is accepted then maybe it will be part of the solution
Is there anything in the COC network system that would accomodate.
Good luck in your quest!
-
Don't go about it like that. The need to implement a game logic only pisses off ppl, and since 90% of the ppl is stupid, many will not understand why/how to do that ;)
Fortunately it doesn't matter if the game logic is created by the map designer or a script. So you can use
_ServerLogic="logic" createVehicle [0,0,0]
?local _ServerLogic: ...
without probs :)
-
Don't go about it like that. The need to implement a game logic only pisses off ppl, and since 90% of the ppl is stupid, many will not understand why/how to do that ;)
Fortunately it doesn't matter if the game logic is created by the map designer or a script. So you can use
_ServerLogic="logic" createVehicle [0,0,0]
?local _ServerLogic: ...
without probs :)
Saw that one coming a mile out... ok, it's time for a slight exercise: Assume we do create a GL on the fly. Combine that with the "player not existing" trick as per the first post. Now try it out in your minds: where does this lead us with regard to discerning between a dedicated server session and a SP intro/outro?
Yup. "Nowheres" :-X
Wonder if we should get on our knees and beg Suma/BIS for something like a "isDedicated" script command. That and a command that would return the version of the game would be like a cold one after a day in the desert, i.e just what the doctor ordered.
Note to budding mission makers/scripters: the "create a GL on the fly" is a very useful trick under many circumstances, so don't forget that little tidbit, even if it won't solve the problem at hand.
Terox: I will try some of the things you suggested. Indeed, there might be a way to use some of the scripting commands in a clever way to infer "running on a deddy". I have had my eyes on the load/save thingies just as you hint at, but havent had the time to further investigate the matter. I'll be sure to tell you all if I succed in my quest. ;D
-
Excuse my ignorance Killswitch, but I didn't bother to read the full thread :)
But if you need to find out if you're in SP or MP, put the following in your init EH:
?format ["%1",clients]=="scalar bool array string 0xfcffffef":clients=0;publicVaiable "clients"
clients=clients+1
publicVariable "clients"
In those script that need to know if its SP or MP, you can assume that a second after mission start, the "client" variable will be unequal to 1 in MP. This, together with the "player=player" query, should be enough to find out if you're on a dedi or not!
>That and a command that would return the version of the game
Mhmm didn't try this yet, but probably you can find out the version. Count up a float var from, say, 1.46 to 1.92, and pass it to the requiredVersion command (use "format"). Store the last one that passed the test in a var "theVersion". When the test fails the first time, quit the loop, and "theVersion" should contain the game's version.
Again: I didn't test this, so don't blame me if it doesn't work
-
i can see a flaw in the version command query due to linux 1.91 not being recognised as 1.91 only 1.90, however when (If) 1.92 comes out of beta (Has it already dont know) then that shoudnt be an issue anymore
-
Rubble's first "pass the counter around" looks like a possible solution.
In addition to the linux flaw Terox mentioned, the requiredVersion method has a problem in that it gives you a error dialog the first time the test fails. Doing a "result = requiredVersion 1.93" on the 1.92 beta gives a "this game requires..." (or something like that) dialog, much like the "Missing addons..." dialog, thereby requiring user input.