@@ -39,6 +39,86 @@ public SiegeMap(SiegeMapConfig config, MapTemplate template) {
39
39
this .time = 1000 ;
40
40
}
41
41
42
+ private static SiegeMap merge (SiegeActive active , SiegeMap oldMap , SiegeMap newMap ) {
43
+ var world = active .world ;
44
+ var gameSpace = active .gameSpace ;
45
+
46
+ for (var newFlag : newMap .flags ) {
47
+ oldMap .flags .stream ().filter (f -> f .id .equals (newFlag .id )).findFirst ()
48
+ .ifPresent (oldFlag -> {
49
+ newFlag .captureProgressTicks = oldFlag .captureProgressTicks ;
50
+ newFlag .team = oldFlag .team ;
51
+ newFlag .setTeamBlocks (world , newFlag .team );
52
+ });
53
+ }
54
+
55
+ for (var oldFlag : oldMap .flags ) {
56
+ oldFlag .captureBar .clearPlayers ();
57
+ }
58
+
59
+ for (var newGate : newMap .gates ) {
60
+ oldMap .gates .stream ().filter (g -> g .id .equals (newGate .id )).findFirst ()
61
+ .ifPresent (oldGate -> {
62
+ newGate .bashedOpen = oldGate .bashedOpen ;
63
+ newGate .health = oldGate .health ;
64
+ newGate .openSlide = oldGate .openSlide ;
65
+
66
+ if (newGate .bashedOpen ) {
67
+ newGate .slider .setOpen (world );
68
+ } else {
69
+ newGate .slider .set (world , newGate .openSlide );
70
+ }
71
+ });
72
+ }
73
+
74
+ newMap .spawnKitStands (active );
75
+
76
+ for (var player : gameSpace .getPlayers ()) {
77
+ if (!newMap .template .getBounds ().contains (player .getBlockPos ()) || player .isInsideWall ()) {
78
+ SiegeSpawnLogic .spawnPlayer (player , newMap .waitingSpawn , world );
79
+ }
80
+ }
81
+
82
+ gameSpace .getPlayers ().sendMessage (Text .literal ("[Siege] Map reloaded!" ));
83
+ return newMap ;
84
+ }
85
+
86
+ public void reload (SiegeActive active ) {
87
+ var world = active .world ;
88
+ var gameSpace = active .gameSpace ;
89
+
90
+ var server = world .getServer ();
91
+
92
+ long time = System .currentTimeMillis ();
93
+ var newMap = SiegeMapLoader .load (server , this .config );
94
+ System .out .printf ("Loading took %sms%n" , System .currentTimeMillis () - time );
95
+
96
+ time = System .currentTimeMillis ();
97
+ var diff = newMap .template .diff (this .template );
98
+ System .out .printf ("Diffing took %sms%n" , System .currentTimeMillis () - time );
99
+
100
+ Siege .LOGGER .info ("Loaded new template with diff {}" , diff );
101
+
102
+ if (diff .needsRegeneration ()) {
103
+ Siege .LOGGER .info ("Regenerating world" );
104
+ gameSpace .getWorlds ().regenerate (world , newMap .asGenerator (server ), newMap .template .getBounds ().union (this .template .getBounds ()));
105
+ } else {
106
+ Siege .LOGGER .debug ("Diff does not warrant regeneration" );
107
+ }
108
+
109
+ if (newMap .time != this .time ) {
110
+ Siege .LOGGER .info ("Changing time from {} to {}" , this .time , newMap .time );
111
+ world .setTimeOfDay (newMap .time );
112
+ } else {
113
+ Siege .LOGGER .debug ("Skipping changing time, as they are the same" );
114
+ }
115
+
116
+ var merged = merge (active , this , newMap );
117
+ Siege .LOGGER .info ("Done reloading map!" );
118
+
119
+ active .map = merged ;
120
+ }
121
+
42
122
public SiegeSpawn getFirstSpawn (GameTeam team ) {
43
123
if (team == SiegeTeams .ATTACKERS ) {
44
124
return this .attackerFirstSpawn ;
0 commit comments