55 * Only need to implement LatCom for current frame, the server updates the next frame already if latcom is enabled.
66 * Use Caches for all internal state that might be affected by latcom, and add the (current) frame, to let Player & Unit
77 * check if they need to use the cached/latcom version of the value or the from server (or a combination of both)
8- *
8+ * <p>
99 * Inspiration:
1010 * https://github.com/bwapi/bwapi/blob/e4a29d73e6021037901da57ceb06e37248760240/bwapi/include/BWAPI/Client/CommandTemp.h
1111 */
@@ -34,7 +34,7 @@ int getUnitID(Unit unit) {
3434 }
3535
3636 void execute () {
37- switch (command .type ) {
37+ switch (command .type ) {
3838 case Halt_Construction :
3939 eventType = EventType .Order ;
4040 default :
@@ -45,7 +45,9 @@ void execute() {
4545
4646 void execute (boolean isCurrentFrame ) {
4747 // Immediately return if latency compensation is disabled or if the command was queued
48- if (!game .isLatComEnabled () || command .isQueued ()) return ;
48+ if (!game .isLatComEnabled () || command .isQueued ()) {
49+ return ;
50+ }
4951 Unit unit = command .unit ;
5052 Unit target = command .target ;
5153 int frame = game .getFrameCount ();
@@ -55,8 +57,9 @@ void execute(boolean isCurrentFrame) {
5557 case Morph : // Morph, Build_Addon and Train orders may reserve resources or supply that
5658 case Build_Addon : // SC does not take until the next frame to protect bots from overspending.
5759 case Train :
58- if (eventType == EventType .Resource )
60+ if (eventType == EventType .Resource ) {
5961 break ;
62+ }
6063 return ;
6164 default :
6265 return ;
@@ -88,7 +91,7 @@ void execute(boolean isCurrentFrame) {
8891 break ;
8992 }
9093
91- switch (command .type ) {
94+ switch (command .type ) {
9295 // RLF
9396 case Attack_Move :
9497 unit .self ().order .set (Order .AttackMove , frame );
@@ -100,8 +103,9 @@ void execute(boolean isCurrentFrame) {
100103
101104 // RLF
102105 case Attack_Unit :
103- if (target == null || !target .exists () || !unit .getType ().canAttack ())
106+ if (target == null || !target .exists () || !unit .getType ().canAttack ()) {
104107 return ;
108+ }
105109 unit .self ().order .set (Order .AttackUnit , frame );
106110 unit .self ().target .set (getUnitID (target ), frame );
107111 break ;
@@ -149,7 +153,7 @@ void execute(boolean isCurrentFrame) {
149153 // RLF: Resource event
150154 // RLF + 1: Order event
151155 case Cancel_Addon :
152- switch (eventType ) {
156+ switch (eventType ) {
153157 case Resource : {
154158 UnitType addonType = unit .getBuildType ();
155159 player .self ().minerals .setOrAdd ((int ) (addonType .mineralPrice () * 0.75 ), frame );
@@ -226,16 +230,15 @@ void execute(boolean isCurrentFrame) {
226230 // RLF + 13: Finish event (only for unit . unit morphs)
227231 // RLF + 15: Finish event (only for building . building morphs)
228232 case Cancel_Morph :
229- switch (eventType ) {
233+ switch (eventType ) {
230234 case Resource : {
231235 UnitType builtType = unit .getBuildType ();
232236 UnitType newType = builtType .whatBuilds ().getFirst ();
233237
234238 if (newType .isBuilding ()) {
235239 player .self ().minerals .setOrAdd ((int ) (builtType .mineralPrice () * 0.75 ), frame );
236240 player .self ().gas .setOrAdd ((int ) (builtType .gasPrice () * 0.75 ), frame );
237- }
238- else {
241+ } else {
239242 player .self ().minerals .setOrAdd (builtType .mineralPrice (), frame );
240243 player .self ().gas .setOrAdd (builtType .gasPrice (), frame );
241244 }
@@ -260,19 +263,18 @@ void execute(boolean isCurrentFrame) {
260263
261264 case Order :
262265 if (unit .getType ().isBuilding ()) {// This event would hopefully not have been created
263- // if this wasn't true (see event note above)
266+ // if this wasn't true (see event note above)
264267 unit .self ().isIdle .set (true , frame );
265268 unit .self ().order .set (Order .Nothing , frame );
266- if (unit .getType () == UnitType .Zerg_Hatchery || unit .getType () == UnitType .Zerg_Lair ) {
267- // Type should have updated during last event to the cancelled type
269+ if (unit .getType () == UnitType .Zerg_Hatchery || unit .getType () == UnitType .Zerg_Lair ) {
270+ // Type should have updated during last event to the cancelled type
268271 unit .self ().secondaryOrder .set (Order .SpreadCreep , frame );
269272 }
270- }
271- else {
273+ } else {
272274 player .self ().supplyUsed [unit .getType ().getRace ().id ]
273275 .setOrAdd (
274- - (unit .getType ().supplyRequired () * (1 + (unit .getType ().isTwoUnitsInOneEgg () ? 1 : 0 ))),
275- frame );
276+ - (unit .getType ().supplyRequired () * (1 + (unit .getType ().isTwoUnitsInOneEgg () ? 1 : 0 ))),
277+ frame );
276278
277279 player .self ().supplyUsed [unit .getType ().getRace ().id ].setOrAdd ( // Could these races be different? Probably not.
278280 // Should we handle it? Definetely.
@@ -286,15 +288,14 @@ void execute(boolean isCurrentFrame) {
286288 break ;
287289
288290 case Finish :
289- if (unit .getType () == UnitType .Zerg_Hatchery || unit .getType () == UnitType .Zerg_Lair ) {
291+ if (unit .getType () == UnitType .Zerg_Hatchery || unit .getType () == UnitType .Zerg_Lair ) {
290292 unit .self ().secondaryOrder .set (Order .SpawningLarva , frame );
291- }
292- else if (!unit .getType ().isBuilding ()) {
293+ } else if (!unit .getType ().isBuilding ()) {
293294 unit .self ().order .set (Order .PlayerGuard , frame );
294295 unit .self ().isCompleted .set (true , frame );
295296 unit .self ().isConstructing .set (false , frame );
296297 unit .self ().isIdle .set (true , frame );
297- unit .self ().isMorphing .set (false , frame );
298+ unit .self ().isMorphing .set (false , frame );
298299 }
299300 break ;
300301 }
@@ -304,9 +305,9 @@ else if(!unit.getType().isBuilding()) {
304305 // RLF: Resource event
305306 // RLF + 1: Order update
306307 case Cancel_Research : {
307- switch (eventType ) {
308+ switch (eventType ) {
308309 case Resource : {
309- TechType techType = unit .getTech ();
310+ TechType techType = unit .getTech ();
310311 player .self ().minerals .setOrAdd (techType .mineralPrice (), frame );
311312 player .self ().gas .setOrAdd (techType .gasPrice (), frame );
312313 unit .self ().remainingResearchTime .set (0 , frame );
@@ -316,7 +317,7 @@ else if(!unit.getType().isBuilding()) {
316317
317318 case Order :
318319 unit .self ().order .set (Order .Nothing , frame );
319- unit .self ().isIdle .set (true , frame );
320+ unit .self ().isIdle .set (true , frame );
320321 break ;
321322 }
322323 }
@@ -338,7 +339,7 @@ else if(!unit.getType().isBuilding()) {
338339 unit .self ().trainingQueue [i ].set (unit .getTrainingQueue ().get (i + 1 ), frame );
339340 }
340341
341- unit .self ().trainingQueueCount .setOrAdd (- 1 , frame );
342+ unit .self ().trainingQueueCount .setOrAdd (-1 , frame );
342343 }
343344 break ;
344345 }
@@ -348,7 +349,7 @@ else if(!unit.getType().isBuilding()) {
348349 // RLF + 1: Order event
349350 // RLF + 3: Finish event
350351 case Cancel_Train : {
351- switch (eventType ) {
352+ switch (eventType ) {
352353 case Resource : {
353354 UnitType unitType = unit .getTrainingQueue ().get (unit .getTrainingQueueCount () - 1 );
354355 player .self ().minerals .setOrAdd (unitType .mineralPrice (), frame );
@@ -364,15 +365,14 @@ else if(!unit.getType().isBuilding()) {
364365 }
365366
366367 case Order : {
367- unit .self ().trainingQueueCount .setOrAdd (- 1 , frame );
368+ unit .self ().trainingQueueCount .setOrAdd (-1 , frame );
368369 UnitType unitType = unit .getTrainingQueue ().get (unit .getTrainingQueueCount ());
369370 player .self ().supplyUsed [unitType .getRace ().id ]
370371 .setOrAdd (-unitType .supplyRequired (), frame );
371372
372373 if (unit .getTrainingQueueCount () == 0 ) {
373374 unit .self ().buildType .set (UnitType .None , frame );
374- }
375- else {
375+ } else {
376376 UnitType ut = unit .getTrainingQueue ().get (unit .getTrainingQueueCount () - 1 );
377377 // Actual time decreases, but we'll let it be the buildTime until latency catches up.
378378 unit .self ().remainingTrainTime .set (ut .buildTime (), frame );
@@ -394,10 +394,10 @@ else if(!unit.getType().isBuilding()) {
394394 // RLF: Resource event
395395 // RLF + 1: Order event
396396 case Cancel_Upgrade :
397- switch (eventType ) {
397+ switch (eventType ) {
398398 case Resource : {
399399 UpgradeType upgradeType = unit .getUpgrade ();
400- int nextLevel = unit .getPlayer ().getUpgradeLevel (upgradeType ) + 1 ;
400+ int nextLevel = unit .getPlayer ().getUpgradeLevel (upgradeType ) + 1 ;
401401
402402 player .self ().minerals .setOrAdd (upgradeType .mineralPrice (nextLevel ), frame );
403403 player .self ().gas .setOrAdd (upgradeType .gasPrice (nextLevel ), frame );
@@ -442,27 +442,28 @@ else if(!unit.getType().isBuilding()) {
442442 unit .self ().isGathering .set (true , frame );
443443
444444 // @TODO: Fully time and test this order
445- if (target != null && target .exists () && target .getType ().isMineralField ())
445+ if (target != null && target .exists () && target .getType ().isMineralField ()) {
446446 unit .self ().order .set (Order .MoveToMinerals , frame );
447- else if (target != null && target .exists () && target .getType ().isRefinery ())
447+ } else if (target != null && target .exists () && target .getType ().isRefinery ()) {
448448 unit .self ().order .set (Order .MoveToGas , frame );
449+ }
449450
450451 break ;
451452
452453 // RLF: Order event
453454 // RLF + 1: Finish event
454455 case Halt_Construction :
455- switch (eventType ) {
456+ switch (eventType ) {
456457 case Order :
457458 Unit building = unit .getBuildUnit ();
458459 if (building != null ) {
459- building .self ().buildUnit .set (-1 , frame );
460- }
461- unit .self ().buildUnit .set (-1 , frame );
462- unit .self ().order .set (Order .ResetCollision , frame );
463- unit .self ().isConstructing .set (false , frame );
464- unit .self ().buildType .set (UnitType .None , frame );
465- break ;
460+ building .self ().buildUnit .set (-1 , frame );
461+ }
462+ unit .self ().buildUnit .set (-1 , frame );
463+ unit .self ().order .set (Order .ResetCollision , frame );
464+ unit .self ().isConstructing .set (false , frame );
465+ unit .self ().buildType .set (UnitType .None , frame );
466+ break ;
466467
467468 case Finish :
468469 unit .self ().order .set (Order .PlayerGuard , frame );
@@ -496,12 +497,10 @@ else if (target != null && target.exists() && target.getType().isRefinery())
496497 if (unit .getType () == UnitType .Terran_Bunker ) {
497498 unit .self ().order .set (Order .PickupBunker , frame );
498499 unit .self ().target .set (getUnitID (target ), frame );
499- }
500- else if (unit .getType ().spaceProvided () != 0 ) {
500+ } else if (unit .getType ().spaceProvided () != 0 ) {
501501 unit .self ().order .set (Order .PickupTransport , frame );
502502 unit .self ().target .set (getUnitID (target ), frame );
503- }
504- else if (target != null && target .exists () && target .getType ().spaceProvided () != 0 ) {
503+ } else if (target != null && target .exists () && target .getType ().spaceProvided () != 0 ) {
505504 unit .self ().order .set (Order .EnterTransport , frame );
506505 unit .self ().target .set (getUnitID (target ), frame );
507506 }
@@ -518,7 +517,7 @@ else if (target != null && target.exists() && target.getType().spaceProvided() !
518517
519518 switch (eventType ) {
520519 case Resource :
521- if (!isCurrentFrame ) {
520+ if (!isCurrentFrame ) {
522521 unit .self ().isCompleted .set (false , frame );
523522 unit .self ().isIdle .set (false , frame );
524523 unit .self ().isConstructing .set (true , frame );
@@ -533,20 +532,19 @@ else if (target != null && target.exists() && target.getType().spaceProvided() !
533532 }
534533 player .self ().minerals .setOrAdd (-morphType .mineralPrice (), frame );
535534 player .self ().gas .setOrAdd (-morphType .gasPrice (), frame );
536- }
537- else {
535+ } else {
538536 player .self ().supplyUsed [morphType .getRace ().id ]
539537 .setOrAdd (morphType .supplyRequired () *
540- (1 + (morphType .isTwoUnitsInOneEgg () ? 1 : 0 )) - unit .getType ().supplyRequired (),
541- frame );
538+ (1 + (morphType .isTwoUnitsInOneEgg () ? 1 : 0 )) - unit .getType ().supplyRequired (),
539+ frame );
542540
543- if (!isCurrentFrame ) {
541+ if (!isCurrentFrame ) {
544542 unit .self ().order .set (Order .ZergUnitMorph , frame );
545543
546544 player .self ().minerals .setOrAdd (-morphType .mineralPrice (), frame );
547545 player .self ().gas .setOrAdd (-morphType .gasPrice (), frame );
548546
549- switch (morphType ) {
547+ switch (morphType ) {
550548 case Zerg_Lurker_Egg :
551549 unit .self ().type .set (UnitType .Zerg_Lurker_Egg , frame );
552550 break ;
@@ -561,7 +559,7 @@ else if (target != null && target.exists() && target.getType().spaceProvided() !
561559 break ;
562560 }
563561 unit .self ().trainingQueue [unit .getTrainingQueueCount ()].set (morphType , frame );
564- unit .self ().trainingQueueCount .setOrAdd ( +1 , frame );
562+ unit .self ().trainingQueueCount .setOrAdd (+1 , frame );
565563
566564 }
567565 }
@@ -756,9 +754,8 @@ else if (target != null && target.exists() && target.getType().spaceProvided() !
756754 case Unload_All :
757755 if (unit .getType () == UnitType .Terran_Bunker ) {
758756 unit .self ().order .set (Order .Unload , frame );
759- }
760- else {
761- unit .self ().order .set (Order .MoveUnload , frame );
757+ } else {
758+ unit .self ().order .set (Order .MoveUnload , frame );
762759 unit .self ().targetPositionX .set (command .x , frame );
763760 unit .self ().targetPositionY .set (command .y , frame );
764761 unit .self ().orderTargetPositionX .set (command .x , frame );
@@ -789,13 +786,13 @@ else if (target != null && target.exists() && target.getType().spaceProvided() !
789786 unit .self ().upgrade .set (upgradeType , frame );
790787 unit .self ().isIdle .set (false , frame );
791788
792- int level = unit .getPlayer ().getUpgradeLevel (upgradeType );
789+ int level = unit .getPlayer ().getUpgradeLevel (upgradeType );
793790 unit .self ().remainingUpgradeTime .set (upgradeType .upgradeTime (level + 1 ), frame );
794791
795792 player .self ().minerals .setOrAdd (-upgradeType .mineralPrice (level + 1 ), frame );
796793 player .self ().gas .setOrAdd (upgradeType .gasPrice (level + 1 ), frame );
797794
798- player .self ().isUpgrading [upgradeType .id ].set ( true , frame );
795+ player .self ().isUpgrading [upgradeType .id ].set (true , frame );
799796 }
800797 break ;
801798
@@ -836,7 +833,7 @@ else if (target != null && target.exists() && target.getType().spaceProvided() !
836833 unit .self ().order .set (techType .getOrder (), frame );
837834 unit .self ().orderTarget .set (getUnitID (target ), frame );
838835
839- Position targetPosition = target .getPosition ();
836+ Position targetPosition = target .getPosition ();
840837
841838 unit .self ().targetPositionX .set (targetPosition .x , frame );
842839 unit .self ().targetPositionY .set (targetPosition .y , frame );
0 commit comments