Need an expert to solve a problem involving desynchronization.

Taishaku

New Member
Reaction score
9
So I am the maker of a map called Wintermaul Redux, a ground-up remake of the original Wintermaul.

You can get a protected copy here:
http://world-editor-tutorials.thehelper.net/maps.php?view=1315

My map, by all accounts, been a successful and rather popular map. However, the map has had an issue with desynchronization for quite some time now, leading to mass disconnects when the first spawn occurs or shortly after the first spawn.

The problem occurs inconsistently; but generally, when they start, they persist in the subsequent games.

I would like for someone with expertise in such matters to assist me in looking over my triggers and finding what is wrong.

If you are interested, PM or reply with your email, and I will email you the unprotected map. I personally don't want multiple unprotected copies of my map floating around the internet.



Details:
-Desynchronization always occurs on the very first spawn, either immediately after the units are created or a few seconds after.
-There are no local player variables as far as I know.
-There are no pan camera variables either.
-There are a few persisting variables that may be considered leaks, but they are necessary for pathing; leaks don't cause splits anyhow.
-All other leaks are removed and this is verified by Leak Check v3.1.
-The map was protected using WC3 Optimizer.
 

Mittsies

New Member
Reaction score
24
It's virtually impossible for me to figure out why your map could desync without being able to look at the triggers themselves. There are several reasons why this could be happening; but my best guess is that you should spawn less units at once. I'm familiar with Wintermaul games, and each wave composes of several hundred units that are all given an order to move somewhere -- which could be a heavy load on the engine.

Try spawning only 1/5th of the creeps you are currently creating and see if there is a difference. If this is the case, you can use a timer to spawn creeps in smaller groups. For instance, instead of spawning 25 creeps all at once: every 1 second -- spawn 5 creeps, and repeat this 5 times.
 

Taishaku

New Member
Reaction score
9
@Mittsies
Hence why I said you should let me email you my map. ^^

And I only have three spawns. 90 units per level, in 6 waves of 15.
 

Mittsies

New Member
Reaction score
24
Sorry, I skimmed and didn't see that you were offering an unprotected map. Either way I recommend you try spawning less units just as a test. Instead of 90, in 6 waves of 15 -- try --, 12, in 6 waves of 2.

edit: lawl we have the same post count.
 

Taishaku

New Member
Reaction score
9
@Mittsies
I only have 2, and we rarely get it to split. xD

Errr... here's the new trigger:

Code:
Create Units
    Events
    Conditions
    Actions
        Set Point = (Center of Left Spawn L <gen>)
        Unit - Create 5 Spawn_Type[Level] for Player 12 (Brown) at Point facing Default building facing degrees
        Unit - Create 5 Spawn_Type[Level] for Player 12 (Brown) at Point facing Default building facing degrees
        Unit - Create 5 Spawn_Type[Level] for Player 12 (Brown) at Point facing Default building facing degrees
        Custom script:   call RemoveLocation(udg_Point)
        Set Point = (Center of Left Spawn R <gen>)
        Unit - Create 5 Spawn_Type[Level] for Player 12 (Brown) at Point facing Default building facing degrees
        Unit - Create 5 Spawn_Type[Level] for Player 12 (Brown) at Point facing Default building facing degrees
        Unit - Create 5 Spawn_Type[Level] for Player 12 (Brown) at Point facing Default building facing degrees
        Custom script:   call RemoveLocation(udg_Point)
        Set Point = (Center of Right Spawn L <gen>)
        Unit - Create 5 Spawn_Type[Level] for Player 12 (Brown) at Point facing Default building facing degrees
        Unit - Create 5 Spawn_Type[Level] for Player 12 (Brown) at Point facing Default building facing degrees
        Unit - Create 5 Spawn_Type[Level] for Player 12 (Brown) at Point facing Default building facing degrees
        Custom script:   call RemoveLocation(udg_Point)
        Set Point = (Center of Right Spawn R <gen>)
        Unit - Create 5 Spawn_Type[Level] for Player 12 (Brown) at Point facing Default building facing degrees
        Unit - Create 5 Spawn_Type[Level] for Player 12 (Brown) at Point facing Default building facing degrees
        Unit - Create 5 Spawn_Type[Level] for Player 12 (Brown) at Point facing Default building facing degrees
        Custom script:   call RemoveLocation(udg_Point)
        Set Point = (Center of Middle Spawn L <gen>)
        Unit - Create 5 Spawn_Type[Level] for Player 12 (Brown) at Point facing Default building facing degrees
        Unit - Create 5 Spawn_Type[Level] for Player 12 (Brown) at Point facing Default building facing degrees
        Unit - Create 5 Spawn_Type[Level] for Player 12 (Brown) at Point facing Default building facing degrees
        Custom script:   call RemoveLocation(udg_Point)
        Set Point = (Center of Middle Spawn R <gen>)
        Unit - Create 5 Spawn_Type[Level] for Player 12 (Brown) at Point facing Default building facing degrees
        Unit - Create 5 Spawn_Type[Level] for Player 12 (Brown) at Point facing Default building facing degrees
        Unit - Create 5 Spawn_Type[Level] for Player 12 (Brown) at Point facing Default building facing degrees
        Custom script:   call RemoveLocation(udg_Point)
        -------- Display Level Info --------
        Set String = (Name of (Last created unit))
        Game - Display to (All players) the text: (Level  + String)

It's run by another trigger. Before, it was:

Code:
        Unit - Create 15 Spawn_Type[Level] for Player 12 (Brown) at Point facing Default building facing degrees
 

Mittsies

New Member
Reaction score
24
I meant something more along the lines of spawning a few, then waiting 1 second, then another group, then waiting 1 second, etc.; but instead of using wait, use a timer. This is doing nothing more than splitting up 15 into 3 immediate groups of 5 -- which is genuinely changing nothing.
 

xxxtrickyxxx

(o Y o)
Reaction score
64
try creating one unit for player 12 with an integer loop. i dont understand why you are creating 5 at once 3 times, just make a 1-15 loop that creates one unit at the location.

so something like

for each integer a 1-15
-create unit at loc

remove loc script
 

AdventCore

New Member
Reaction score
2
I meant something more along the lines of spawning a few, then waiting 1 second, then another group, then waiting 1 second, etc.; but instead of using wait, use a timer. This is doing nothing more than splitting up 15 into 3 immediate groups of 5 -- which is genuinely changing nothing.

Spawning, say, 100 units at once will not make you de-sync but it will make you lag horribly. I'm sorry Tai but I'm no master on this so I cannot help you other than saying that it has nothing to do with the units spawning, directly. It could be indirectly related, however. Good luck in any case.
 

Taishaku

New Member
Reaction score
9
I agree with AdventCore. I do not believe a mass spawning of 90 units would case a desynchronization. It doesn't in normal Wintermaul games, and it shouldn't here.
 

Andrewgosu

The Silent Pandaren Helper
Reaction score
716
I suggest you to at least try the spawn-wait-spawn method instead of spawning them all at once.

I've been disconnected from games that mass-spawn and I'm guessing it's not because of desynchronization, but of lag, though I cannot be really certain because I don't know how the triggers were built up.
 

kingkingyyk3

Visitor (Welcome to the Jungle, Baby!)
Reaction score
216
Use Jass to fix tis prob. If you already use Jass, pls improve your script as much as possible. Dun use mass of createunit function at same time. You should use "every X seconds" to spam creeps. If you really dunno to fix it, i can giv u a helping hand....
 

Taishaku

New Member
Reaction score
9
I do not want to spawn units in a line and I do not want it to take more than one second to spawn all of the units.

Anyhow, I fail to see how Waits would make the situation better.
 

Taishaku

New Member
Reaction score
9
Is it possible to GetLocalPlayer() desynch in GUI?

As stated in the title.

And if you can get a GetLocalPlayer() desynch error from GUI, what would the trigger look like?
 

lindenkron

You can change this now in User CP
Reaction score
102
I was told that:
Trigger:
  • GoldBounty
    • Events
      • Unit - A unit Dies
    • Conditions
      • ((Killing unit) belongs to an enemy of (Owner of (Triggering unit))) Equal to True
      • Or - Any (Conditions) are true
        • Conditions
          • (Unit-type of (Killing unit)) Equal to Wolf
          • (Unit-type of (Killing unit)) Equal to Spirit Wolf
    • Actions
      • Set BountyInt = 0
      • Set Player = (Owner of (Killing unit))
      • Set BountyInt = ((GoldBounty x (Point-value of (Triggering unit))) + (Level of (Killing unit)))
      • Player - Add BountyInt to (Owner of (Killing unit)) Current gold
      • Custom script: if GetLocalPlayer() == udg_Player then
      • Floating Text - Create floating text that reads (String(BountyInt)) above (Triggering unit) with Z offset 0.00, using font size 8.00, color (100.00%, 80.00%, 0.00%), and 0.00% transparency
      • Floating Text - Change (Last created floating text): Disable permanence
      • Floating Text - Change the fading age of (Last created floating text) to 0.50 seconds
      • Floating Text - Change the lifespan of (Last created floating text) to 2.00 seconds
      • Floating Text - Set the velocity of (Last created floating text) to 64.00 towards 90.00 degrees
      • Custom script: endif

Would not desync.

But:
Trigger:
  • GoldBounty
    • Events
      • Unit - A unit Dies
    • Conditions
      • ((Killing unit) belongs to an enemy of (Owner of (Triggering unit))) Equal to True
      • Or - Any (Conditions) are true
        • Conditions
          • (Unit-type of (Killing unit)) Equal to Wolf
          • (Unit-type of (Killing unit)) Equal to Spirit Wolf
    • Actions
      • Custom script: if GetLocalPlayer() == udg_Player then
      • Set BountyInt = 0
      • Set Player = (Owner of (Killing unit))
      • Set BountyInt = ((GoldBounty x (Point-value of (Triggering unit))) + (Level of (Killing unit)))
      • Player - Add BountyInt to (Owner of (Killing unit)) Current gold
      • Floating Text - Create floating text that reads (String(BountyInt)) above (Triggering unit) with Z offset 0.00, using font size 8.00, color (100.00%, 80.00%, 0.00%), and 0.00% transparency
      • Floating Text - Change (Last created floating text): Disable permanence
      • Floating Text - Change the fading age of (Last created floating text) to 0.50 seconds
      • Floating Text - Change the lifespan of (Last created floating text) to 2.00 seconds
      • Floating Text - Set the velocity of (Last created floating text) to 64.00 towards 90.00 degrees
      • Custom script: endif

would desync. Dunno if it's true though, I'm not tasking chances :D I made it the first way.
 

Azlier

Old World Ghost
Reaction score
461
You want a trigger that desyncs in GUI? Very well.

Trigger:
  • Untitled Trigger 001
    • Events
      • Map initialization
    • Conditions
    • Actions
      • Custom script: if GetLocalPlayer() == Player(15) then
      • Item - Create Tome of Experience at (Center of (Playable map area))
      • Custom script: endif


Pan Camera as Necessary also desync. Blizzard was very careless making that. I have a desyncless version, but no one ever really needs Pan Camera as Necessary.
 

Taishaku

New Member
Reaction score
9
@azlier and lindenkron
Hahaha, I was asking if it were possible to get a GetLocalPlayer() desynch using only GUI. No custom script. xD
 

Azlier

Old World Ghost
Reaction score
461
Ah. I misread, then. Still, Jass is Jass. GUI is just an interface for Jass that teaches bad coding habits.

Trigger:
  • Untitled Trigger 001
    • Events
      • Map initialization
    • Conditions
    • Actions
      • Camera - Pan camera as necessary for Player 1 (Red) to (Center of (Playable map area)) over 0.50 seconds
 

Taishaku

New Member
Reaction score
9
@azlier
I know how Pan Camera does it in GUI. I heard GetLocalPlayer() is the other big one. My map desynchs, and is made entirely out of GUI, so I'm trying to figure out why.
 
General chit-chat
Help Users
  • No one is chatting at the moment.

      The Helper Discord

      Staff online

      Members online

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top