Buildings destroyed by 3DEN Editors "Edit Terrain Object" module are not working properly in multiplayer missions on dedicated servers. Target building doesn't appear destroyed for players but instead ruins are shown in addition to original building which appears undamaged.
Description
Details
- Severity
- Minor
- Resolution
- Open
- Reproducibility
- N/A
- Operating System
- Windows 7 x64
- Operating System Version
- Ultimate
- Category
- Editor
- Create multiplayer mission and put "Edit Terrain Object" module on some building that is originally in the map.
- Select "destroyed" state from module attributes.
- Run mission on dedicated server.
- Undamaged target building and its ruins are both visible for players.
Problem doesn't occur in singleplayer or in multiplayer if client is same than server. Only on dedicated servers for non-local players.
EDIT, more info: Occurrance of problem is dependant on player count. Propability of problem occurring rises when there are bigger amount of players on server.
Related Objects
Event Timeline
Would to confirm that I have too experienced this on a dedicated server I run. The player count did not make any difference to the results described here (tested 1 and 12 players).
The same is true for the state of the doors. Open/close are more or less random on dedicate server.
The solution is known. Instead of a "server only" module trying to execute some weird EG (effect global) commands, it could be far more efficient to run a script locally, at least for destruction which is not supposed to evolve during game. the module must be global.
See the workaround here for destroyed building.
@Wulf It's been almost a year and this is still broken. The "Enable Damage" checkbox is also affected. The problem as far as I can tell is that the code is executed locally to the host. The below workaround is why I believe that.
@PiepMGI A better workaround, although I haven't tested it on the damage states, is to run whatever code is necessary through the "Global Object Init". For example I leave the "Enable Damage" checkbox checked and then enter in the Global Object Init _this allowDamage false;. For the damage states one could try _this setDamage 0.5;. However having to manually script the functions kind of defeats the purpose of the module if you ask me.
I've probably managed to find the source of this issue, it's the buildings locality of course. Building is destroyed using _building setDamage [1,false];, everything should be ok as it's AG/EG function. @veteran29 helped me with pointing out that every player has his own copy of the building with the same ID. So we thought that when executing damage function on building, the server object is damaged/destroyed and synchronized but player's building wasn't really touched (it's a different object but with the same ID, right?), that's why we have building duplication. Later we've found out that only the destruction doesn't work and remoteExec'ing the setdamage made it work on dedicated (but not in 3den).
I've extracted the code function from module "init" switch case, placed a module on a building (but without setting anything) and call the edited function in the server init box of the module (the first one). Changing _building setDamage [1,false]; to [_building, [1, false]] remoteExecCall ["setDamage", 0, true]; removed the issue on dedicated server. However, that didn't work properly in 3den, building was not destroyed (the module of course worked fine in 3den).
This is the effect on the dedicated server:
1 - Building damaged using module
2 - Building destroyed using module (duplication can be seen)
3 - Building damaged using module function changed to use [_building, ["Hitzone_1_hitpoint",1,false]] remoteExecCall ["setHitPointDamage", 0, true]; instead of _building setHitpointDamage ["Hitzone_1_hitpoint",1,false];
4 - Nothing interesting
5 - Building destroyed using module function changed to use [_building, [1, false]] remoteExecCall ["setDamage", 0, true]; instead of _building setDamage [1,false]; (no duplication)
6 - Building not destroyed using module function without changing to remoteExecCall
Attached is the mission file + functions I used for testing.
Undamaged model inside ruins has been fixed in game engine rev. 151158, no need to remoteExec setDamage and setHitPointDamage see https://feedback.bistudio.com/T176730
But in this module functionality there are two script issues
1-
The variable to lock doors is not public(global) broadcasting although code executed on the server, this leads that selected doors on the dedicated server will not be locked
issue location:
\a3\modules_f\environment\editterrainobject\defines.inc line 62
from building setVariable [format ["bis_disabled_door_%1", id + 1], [0,1,0] select state];\
change to ↓↓↓↓↓↓↓↓↓↓↓↓↓↓
building setVariable [format ["bis_disabled_door_%1", id + 1], [0,1,0] select state, true];\ i.e. add 'Public' boolean (, true) so variable is broadcast globally and is persistent (JIP compatible). After the doors can be successfully locked in MP
2-
issue location:
\a3\modules_f\environment\editterrainobject\init.sqf lines: 163, 260, 305
Again, this module functionality work on the server, as said @BIS_fnc_KK in Discord massage
… allow damage needs to be disabled on every client and jip …
In dedicated server the damage was not be disable and provides problem from this ticket, so we need something like this:
line 163
from _current allowDamage _allowDamage;
change to ↓↓↓↓↓↓↓↓↓↓↓↓↓↓
[_current, _allowDamage] remoteExec ["allowDamage", 0, true];
line 260
from _building allowDamage _allowDamage;
change to ↓↓↓↓↓↓↓↓↓↓↓↓↓↓
[_building, _allowDamage] remoteExec ["allowDamage", 0, true];
line 305
from _building allowDamage false;
change to ↓↓↓↓↓↓↓↓↓↓↓↓↓↓
[_building, false] remoteExec ["allowDamage", 0, true];
STEPS TO REPRODUCE
repro mission, launch it on dedicated server
1- repro
- damage for Green House was disabled by Edit Terrain Object module checkbox
- make your cursorObject on Green House
- exec isDamageAllowed cursorObject
- returns true, expected false
- after destruction ruins not be spawned
2- repro
- All Red House doors was locked by Edit Terrain Object module
- try to open any doors
- you've been be able to do this, expected doors locked
dev rev. 151218
after fix (this issue appeared in the new dev branch update) I cannot return state of building from 'Destroyed' back to 'Undamaged' until editor restart
- place module on building
- set it destroyed, press ok
- set building as undamaged (or damaged any state). Or delete module from building, press ok
- result → the building is still a ruin
No-no this issue is also reproduced on PROF v11, cannot repro on stable
here is video howto repro https://www.youtube.com/watch?v=pK9xd1TeSjM
This is not related to this ticket, so please next time create a ticket per issue even if it looks like the same issue, as it creates a bit of a mess on our end. Fixed in Revision: 151230
This fuction do some setHitPointDamage commands, can execution forceHitPointsDamageSync in module code be useful for MP work safety, maybe worth to add?
Also I confirm all issues from ticket fixed in dev, thanks!