@@ -39,6 +39,86 @@ public SiegeMap(SiegeMapConfig config, MapTemplate template) {
3939 this .time = 1000 ;
4040 }
4141
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+
42122 public SiegeSpawn getFirstSpawn (GameTeam team ) {
43123 if (team == SiegeTeams .ATTACKERS ) {
44124 return this .attackerFirstSpawn ;
0 commit comments