Help me with persisting desynchronization/server splits.

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.

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 shortly after the first spawn. No triggers are active when the disconnect occurs, as far as I know of.

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

Now, I have asked of my problems before, and one of my attempts to fix it has reduced the frequency of the server splits. But they still occur and I want to eliminate them entirely before I release the final version.

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 here with your email, and I will email you the unprotected map. I don't want multiple unprotected copies of my map floating around the internet.



Details:
-The map has only a handful of doodads and only four terrain types; for each, only one texture is used.
-At most, 90 enemies are spawned on the map in 6 clumps of 15.
-Desynchronization only occurs on the first level and inconsistently.
-There are no local player variables as far as I know.
-There are no Pan Camera Actions either.
-There are a few "permanent" 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.
 

Tyrulan

Ultra Cool Member
Reaction score
37
Spray- is also currently having the same problem with his Maze/Tower Defense/Maul map. If we the community find a solution I'll be glad to help.
 

Scary Nachos

Castro flashing Gang Signs!
Reaction score
45
Oh.. i think, because it is a copy of a map you get that effect, i would think that if you did copy it, and modify it then you wont be able to get to it, and also, if your code is really really leaky then that might cause it as well... if it is a copied map, i would just start a new one over.
 

Tyrulan

Ultra Cool Member
Reaction score
37
Copied map? That can't have anything to with it. When uploading a map(by hosting it online BNET) you are creating several copies of the same map. I can't see this being the problem.
 

Scary Nachos

Castro flashing Gang Signs!
Reaction score
45
Well it can.. if it was deprotected somehow. By copied i mean.. Stolen and by stolen i mean deprotected/hacked :p
 

Tyrulan

Ultra Cool Member
Reaction score
37
Completely different lol.... It just might be considering it is a maul and most mauls are just a copy of the last one made. You make an excellent point.
 

Sneakster

Active Member
Reaction score
24
If you use Vexorian's Map Optimizer and check the compress names option it can cause problems if no common.j or blizzard.j files are provided
 

Taishaku

New Member
Reaction score
9
@Scary Nacho
Errr... it's made from a scratch map with an imported Wintermaul Object list and Triggers list, both of which were subsequently edited for either balance or restructuring (the people who modified Wintermaul thoroughly trashed it). The pathing system, tower abilities, and miscellaneous triggers, and most of the units, for example, are entirely my original work. Almost everything in the map has been modified in one way or another.

How would a person corrupt a map anyhow?

@Sneakster
I do not use Compress Names. I use "Optimize Script," all of "Map Optimization Options," and all of "Extra Cleaning."
 

Taishaku

New Member
Reaction score
9
Bump with sad puppy eyes. T_T

Does anyone want to look at my map itself?

Here are some of the triggers:

Code:
Spawn Points
    Events
        Map initialization
    Conditions
    Actions
        Set PointLL = (Center of Left Spawn L <gen>)
        Set PointLR = (Center of Left Spawn R <gen>)
        Set PointML = (Center of Middle Spawn L <gen>)
        Set PointMR = (Center of Middle Spawn R <gen>)
        Set PointRL = (Center of Right Spawn L <gen>)
        Set PointRR = (Center of Right Spawn R <gen>)

These are the floating location variables I use to spawn my units.

Code:
Creep Spawns
    Events
        Map initialization
    Conditions
    Actions
        Set Spawn_Type[1] = 01 - Scout
        Set Spawn_Type[2] = 02 - Engineer
        Set Spawn_Type[3] = 03 - Night Ranger
        Set Spawn_Type[4] = 04 - Barbarian
        Set Spawn_Type[5] = 05 - Baby Dragon
        Set Spawn_Type[6] = 06 - Rock Golem
        Set Spawn_Type[7] = 07 - Water Runner
        Set Spawn_Type[8] = 08 - Ice Troll
        Set Spawn_Type[9] = 09 - Stalker
        Set Spawn_Type[10] = 10 - Wyvern
        Set Spawn_Type[11] = 11 - Hovercraft
        Set Spawn_Type[12] = 12 - Goblin Machine
        Set Spawn_Type[13] = 13 - Wolf Rider
        Set Spawn_Type[14] = 14 - Frosty Reptile
        Set Spawn_Type[15] = 15 - Mature Dragon
        Set Spawn_Type[16] = 16 - Supply Wagon
        Set Spawn_Type[17] = 17 - Grave Spirit
        Set Spawn_Type[18] = 18 - Demonic Pet
        Set Spawn_Type[19] = 19 - Walking Corpse
        Set Spawn_Type[20] = 20 - Spirit Wyvern
        Set Spawn_Type[21] = 21 - Steel Golem
        Set Spawn_Type[22] = 22 - Polar Bear
        Set Spawn_Type[23] = 23 - Rogue Knight
        Set Spawn_Type[24] = 24 - Totem Carrier
        Set Spawn_Type[25] = 25 - Adult Dragon
        Set Spawn_Type[26] = 26 - Infernal
        Set Spawn_Type[27] = 27 - Spider Fiend
        Set Spawn_Type[28] = 28 - Possessed Hunter
        Set Spawn_Type[29] = 29 - Corrupt Chieftain
        Set Spawn_Type[30] = 30 - Ancient Dragon
        Set Spawn_Type[31] = Duke Wintermaul
        Trigger - Run Preloading <gen> (checking conditions)

At the beginning of the map, all units are stored into an array.

Code:
Preloading
    Events
    Conditions
    Actions
        Set Point = (Center of Preloading <gen>)
        For each (Integer A) from 1 to 31, do (Actions)
            Loop - Actions
                Unit - Create 1 Spawn_Type[(Integer A)] for Player 12 (Brown) at Point facing Default building facing degrees
        Custom script:   call RemoveLocation(udg_Point)
        Set UnitGroup = (Units in Preloading <gen>)
        Unit Group - Pick every unit in UnitGroup and do (Actions)
            Loop - Actions
                Unit - Remove (Picked unit) from the game
        Custom script:   call DestroyGroup(udg_UnitGroup)

The units are spawned and removed in the beginning to prevent later lag. Note the Custom Script, which removes memory leaks caused by temporary variables, in contrast to the permanent variables loaded at Map Initialization.

Code:
Level Setup
    Events
        Time - Timer expires
    Conditions
        Defeat Equal to False
    Actions
        -------- Pause Timer --------
        Countdown Timer - Pause Timer
        Countdown Timer - Destroy (Last created timer window)
        -------- Spawn Setup --------
        If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            If - Conditions
                Level Less than or equal to 30
            Then - Actions
                Trigger - Run Create Units <gen> (checking conditions)
            Else - Actions
                Trigger - Run Create Boss <gen> (checking conditions)
        Wait 1.00 game-time seconds
        Trigger - Run End Level <gen> (checking conditions)

When the timer expires, the units are spawned. Within one solid second, the End Level trigger runs; my map has a "race" format.

Code:
End Level
    Events
    Conditions
        Defeat Equal to False
    Actions
        Set Level = (Level + 1)
        If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            If - Conditions
                Level Less than or equal to 30
            Then - Actions
                Countdown Timer - Start Timer as a One-shot timer that will expire in 90.00 seconds
                Countdown Timer - Create a timer window for Timer with title ((Level  + (String(Level))) +  in...)
            Else - Actions
                Do nothing
        If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            If - Conditions
                Level Equal to 31
            Then - Actions
                Trigger - Turn on Duke Wintermaul <gen>
            Else - Actions
                Do nothing
        -------- Victory On --------
        If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            If - Conditions
                Level Equal to 32
                (Victory <gen> is on) Equal to False
            Then - Actions
                Trigger - Turn on Victory <gen>
            Else - Actions
                Do nothing
        -------- Free Lumber --------
        If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            If - Conditions
                Level Equal to 16
            Then - Actions
                Game - Display to (All players) the text: |cff20c000You have ...
                For each (Integer A) from 1 to 9, do (Actions)
                    Loop - Actions
                        Player - Add 1 to (Player((Integer A))) Current lumber
                        Player - Set the current research level of Level 15  to 1 for (Player((Integer A)))
            Else - Actions
                Do nothing

This increases Level, which is the integer used in the spawn array. End of level triggers go here as well.

Code:
Create Units
    Events
    Conditions
    Actions
        Unit - Create 15 Spawn_Type[Level] for Player 12 (Brown) at PointLL facing Default building facing degrees
        Unit - Create 15 Spawn_Type[Level] for Player 12 (Brown) at PointLR facing Default building facing degrees
        Unit - Create 15 Spawn_Type[Level] for Player 12 (Brown) at PointML facing Default building facing degrees
        Unit - Create 15 Spawn_Type[Level] for Player 12 (Brown) at PointMR facing Default building facing degrees
        Unit - Create 15 Spawn_Type[Level] for Player 12 (Brown) at PointRL facing Default building facing degrees
        Unit - Create 15 Spawn_Type[Level] for Player 12 (Brown) at PointRR facing Default building facing degrees
        -------- Display Level Info --------
        Set String = (Name of (Last created unit))
        Game - Display to (All players) the text: (Level  + String)

This spawns the units. There are always 90 except on the boss level.

Code:
Left Spawn L
    Events
        Unit - A unit enters Left Spawn L <gen>
    Conditions
        (Owner of (Triggering unit)) Equal to Player 12 (Brown)
    Actions
        Unit - Set the custom value of (Triggering unit) to 2
        If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            If - Conditions
                Or - Any (Conditions) are true
                    Conditions
                        Level Equal to 5
                        Level Equal to 10
                        Level Equal to 15
                        Level Equal to 20
                        Level Equal to 25
                        Level Equal to 30
            Then - Actions
                Wait 1.00 seconds
            Else - Actions
                Do nothing
        Unit - Order (Triggering unit) to Move To LL_2_to_3

The units move the instant they are spawned, except on levels that are a multiple of 5. These are air levels.
 

Defi4nc3

Developer of DORPG
Reaction score
20
Is there any pre-loading involved? My maps tend to automatically disconnect from bnet cause of tons of pre-loading...
 

Taishaku

New Member
Reaction score
9
@Defi4nc3
There is one Preloading trigger. 31 units are made and then removed at the beginning of the game. However, this has not caused any problems.
 

kingkingyyk3

Visitor (Welcome to the Jungle, Baby!)
Reaction score
216
in my experience, GUI does not cause any desync. Erm, blizzard made GUI functions are safer than Jass.
 

Romek

Super Moderator
Reaction score
964
Just to note, bump after 24 hours have passed. Not 2 hours.

> There are no local player variables as far as I know.
Local players aren't a problem. GetLocalPlayer is. :p

> in my experience, GUI does not cause any desync. Erm, blizzard made GUI functions are safer than Jass.
How inexperienced.

Have you got any other triggers in your map which use GetLocalPlayer?
 

Darthfett

Aerospace/Cybersecurity Software Engineer
Reaction score
615
Have you got any other triggers in your map which use GetLocalPlayer?

I've taken a look at the map, I haven't seen anything unusual for a regular TD map. There are no Pan Camera as Necessary actions, or anything that I know of using GetLocalPlayer.

The map uses full GUI, no JASS at all.

He does have map replays of the server splits, but because I do not have the newest version of WCIII (just using 1.21b for actually editing maps currently), I can't view them to see if this actually is a desync.

He says this has happened multiple times, so it's not just a one-time problem he had.

To the Original Poster:

Do you host other maps often? Could this problem have anything to do with your connection, or are you sure that it's specific to your map?
 

2evil

New Member
Reaction score
16
One or two of the objects may be corrupt or buggy as well, you have to remember that WM has been around since the archaic ages of WC3, and those units have probably been imported from map to map, edited over and over, deprotected and reprotected many times. 4-5 years of constant autor changes and editing can cause bad things to happen
 

Taishaku

New Member
Reaction score
9
@Romek
Ah, I waited 17 hours. =P

No, I didn't use any JASS in the making of this map. Why would I need to? It's a Wintermaul, not some AoS map.

@Darthfett
I have a tester. He hosts all sorts of other maps fine.

@2evil
Would be a valid point if I didn't make it from scratch. I imported the unit and trigger list into a blank map and then heavily modified them for balance.

When this was last suggested to me as a possible problem, I exported the triggers and units AGAIN onto a blank map and then reconnected the regions and whatnot. Still desynchronizes.

Actually, I'm beginning to get tempted to just post the dang map here for everyone to see. But the aforementioned 4-5 years of editing and re-authoring makes me hesitant. Poor Duke Wintermaul, his map is an unrecognizable horror now.
 

2evil

New Member
Reaction score
16
I imported the unit and trigger list into a blank map and then heavily modified them for balance

You did not make it from scratch. if there is a problem with one of the things in the object editor, it would still persist
 

Taishaku

New Member
Reaction score
9
@2evil
Are you serious? Some unit values and the spawn trigger list can cause this entire mess?

Even if the newly changed units are re-imported into ANOTHER map?

SIGH. If I redo the map and it doesn't work, there will be blood. -_-"

EDIT: Oh! But the desynchronization ONLY occurs on level 1 after the spawn. Hm... could it be that Shade or one of the towers is corrupted? =O
 
General chit-chat
Help Users
  • No one is chatting at the moment.
  • Ghan Ghan:
    Still lurking
    +3
  • The Helper The Helper:
    I am great and it is fantastic to see you my friend!
    +1
  • The Helper The Helper:
    If you are new to the site please check out the Recipe and Food Forum https://www.thehelper.net/forums/recipes-and-food.220/
  • Monovertex Monovertex:
    How come you're so into recipes lately? Never saw this much interest in this topic in the old days of TH.net
  • Monovertex Monovertex:
    Hmm, how do I change my signature?
  • tom_mai78101 tom_mai78101:
    Signatures can be edit in your account profile. As for the old stuffs, I'm thinking it's because Blizzard is now under Microsoft, and because of Microsoft Xbox going the way it is, it's dreadful.
  • The Helper The Helper:
    I am not big on the recipes I am just promoting them - I use the site as a practice place promoting stuff
    +2
  • Monovertex Monovertex:
    @tom_mai78101 I must be blind. If I go on my profile I don't see any area to edit the signature; If I go to account details (settings) I don't see any signature area either.
  • The Helper The Helper:
    You can get there if you click the bell icon (alerts) and choose preferences from the bottom, signature will be in the menu on the left there https://www.thehelper.net/account/preferences
  • The Helper The Helper:
    I think I need to split the Sci/Tech news forum into 2 one for Science and one for Tech but I am hating all the moving of posts I would have to do
  • The Helper The Helper:
    What is up Old Mountain Shadow?
  • The Helper The Helper:
    Happy Thursday!
    +1
  • Varine Varine:
    Crazy how much 3d printing has come in the last few years. Sad that it's not as easily modifiable though
  • Varine Varine:
    I bought an Ender 3 during the pandemic and tinkered with it all the time. Just bought a Sovol, not as easy. I'm trying to make it use a different nozzle because I have a fuck ton of Volcanos, and they use what is basically a modified volcano that is just a smidge longer, and almost every part on this thing needs to be redone to make it work
  • Varine Varine:
    Luckily I have a 3d printer for that, I guess. But it's ridiculous. The regular volcanos are 21mm, these Sovol versions are about 23.5mm
  • Varine Varine:
    So, 2.5mm longer. But the thing that measures the bed is about 1.5mm above the nozzle, so if I swap it with a volcano then I'm 1mm behind it. So cool, new bracket to swap that, but THEN the fan shroud to direct air at the part is ALSO going to be .5mm to low, and so I need to redo that, but by doing that it is a little bit off where it should be blowing and it's throwing it at the heating block instead of the part, and fuck man
  • Varine Varine:
    I didn't realize they designed this entire thing to NOT be modded. I would have just got a fucking Bambu if I knew that, the whole point was I could fuck with this. And no one else makes shit for Sovol so I have to go through them, and they have... interesting pricing models. So I have a new extruder altogether that I'm taking apart and going to just design a whole new one to use my nozzles. Dumb design.
  • Varine Varine:
    Can't just buy a new heatblock, you need to get a whole hotend - so block, heater cartridge, thermistor, heatbreak, and nozzle. And they put this fucking paste in there so I can't take the thermistor or cartridge out with any ease, that's 30 dollars. Or you can get the whole extrudor with the direct driver AND that heatblock for like 50, but you still can't get any of it to come apart
  • Varine Varine:
    Partsbuilt has individual parts I found but they're expensive. I think I can get bits swapped around and make this work with generic shit though
  • Ghan Ghan:
    Heard Houston got hit pretty bad by storms last night. Hope all is well with TH.
  • The Helper The Helper:
    Power back on finally - all is good here no damage
    +2
  • V-SNES V-SNES:
    Happy Friday!
    +1
  • The Helper The Helper:
    New recipe is another summer dessert Berry and Peach Cheesecake - https://www.thehelper.net/threads/recipe-berry-and-peach-cheesecake.194169/

      The Helper Discord

      Members online

      No members online now.

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top