public Builder mergeFrom(org.bwapi.proxy.messages.Messages.FrameMessage other) {
        if (other == org.bwapi.proxy.messages.Messages.FrameMessage.getDefaultInstance()) return this;
        if (other.hasFrameCount()) {
          setFrameCount(other.getFrameCount());
        }
        if (other.hasMouseX()) {
          setMouseX(other.getMouseX());
        }
        if (other.hasMouseY()) {
          setMouseY(other.getMouseY());
        }
        if (other.hasScreenX()) {
          setScreenX(other.getScreenX());
        }
        if (other.hasScreenY()) {
          setScreenY(other.getScreenY());
        }
        if (unitsBuilder_ == null) {
          if (!other.units_.isEmpty()) {
            if (units_.isEmpty()) {
              units_ = other.units_;
              bitField0_ = (bitField0_ & ~0x00000020);
            } else {
              ensureUnitsIsMutable();
              units_.addAll(other.units_);
            }
            onChanged();
          }
        } else {
          if (!other.units_.isEmpty()) {
            if (unitsBuilder_.isEmpty()) {
              unitsBuilder_.dispose();
              unitsBuilder_ = null;
              units_ = other.units_;
              bitField0_ = (bitField0_ & ~0x00000020);
              unitsBuilder_ = 
                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
                   getUnitsFieldBuilder() : null;
            } else {
              unitsBuilder_.addAllMessages(other.units_);
            }
          }
        }
        if (bulletsBuilder_ == null) {
          if (!other.bullets_.isEmpty()) {
            if (bullets_.isEmpty()) {
              bullets_ = other.bullets_;
              bitField0_ = (bitField0_ & ~0x00000040);
            } else {
              ensureBulletsIsMutable();
              bullets_.addAll(other.bullets_);
            }
            onChanged();
          }
        } else {
          if (!other.bullets_.isEmpty()) {
            if (bulletsBuilder_.isEmpty()) {
              bulletsBuilder_.dispose();
              bulletsBuilder_ = null;
              bullets_ = other.bullets_;
              bitField0_ = (bitField0_ & ~0x00000040);
              bulletsBuilder_ = 
                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
                   getBulletsFieldBuilder() : null;
            } else {
              bulletsBuilder_.addAllMessages(other.bullets_);
            }
          }
        }
        if (playersBuilder_ == null) {
          if (!other.players_.isEmpty()) {
            if (players_.isEmpty()) {
              players_ = other.players_;
              bitField0_ = (bitField0_ & ~0x00000080);
            } else {
              ensurePlayersIsMutable();
              players_.addAll(other.players_);
            }
            onChanged();
          }
        } else {
          if (!other.players_.isEmpty()) {
            if (playersBuilder_.isEmpty()) {
              playersBuilder_.dispose();
              playersBuilder_ = null;
              players_ = other.players_;
              bitField0_ = (bitField0_ & ~0x00000080);
              playersBuilder_ = 
                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
                   getPlayersFieldBuilder() : null;
            } else {
              playersBuilder_.addAllMessages(other.players_);
            }
          }
        }
        if (createdUnitsBuilder_ == null) {
          if (!other.createdUnits_.isEmpty()) {
            if (createdUnits_.isEmpty()) {
              createdUnits_ = other.createdUnits_;
              bitField0_ = (bitField0_ & ~0x00000100);
            } else {
              ensureCreatedUnitsIsMutable();
              createdUnits_.addAll(other.createdUnits_);
            }
            onChanged();
          }
        } else {
          if (!other.createdUnits_.isEmpty()) {
            if (createdUnitsBuilder_.isEmpty()) {
              createdUnitsBuilder_.dispose();
              createdUnitsBuilder_ = null;
              createdUnits_ = other.createdUnits_;
              bitField0_ = (bitField0_ & ~0x00000100);
              createdUnitsBuilder_ = 
                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
                   getCreatedUnitsFieldBuilder() : null;
            } else {
              createdUnitsBuilder_.addAllMessages(other.createdUnits_);
            }
          }
        }
        if (destroyedUnitsBuilder_ == null) {
          if (!other.destroyedUnits_.isEmpty()) {
            if (destroyedUnits_.isEmpty()) {
              destroyedUnits_ = other.destroyedUnits_;
              bitField0_ = (bitField0_ & ~0x00000200);
            } else {
              ensureDestroyedUnitsIsMutable();
              destroyedUnits_.addAll(other.destroyedUnits_);
            }
            onChanged();
          }
        } else {
          if (!other.destroyedUnits_.isEmpty()) {
            if (destroyedUnitsBuilder_.isEmpty()) {
              destroyedUnitsBuilder_.dispose();
              destroyedUnitsBuilder_ = null;
              destroyedUnits_ = other.destroyedUnits_;
              bitField0_ = (bitField0_ & ~0x00000200);
              destroyedUnitsBuilder_ = 
                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
                   getDestroyedUnitsFieldBuilder() : null;
            } else {
              destroyedUnitsBuilder_.addAllMessages(other.destroyedUnits_);
            }
          }
        }
        if (morphedUnitsBuilder_ == null) {
          if (!other.morphedUnits_.isEmpty()) {
            if (morphedUnits_.isEmpty()) {
              morphedUnits_ = other.morphedUnits_;
              bitField0_ = (bitField0_ & ~0x00000400);
            } else {
              ensureMorphedUnitsIsMutable();
              morphedUnits_.addAll(other.morphedUnits_);
            }
            onChanged();
          }
        } else {
          if (!other.morphedUnits_.isEmpty()) {
            if (morphedUnitsBuilder_.isEmpty()) {
              morphedUnitsBuilder_.dispose();
              morphedUnitsBuilder_ = null;
              morphedUnits_ = other.morphedUnits_;
              bitField0_ = (bitField0_ & ~0x00000400);
              morphedUnitsBuilder_ = 
                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
                   getMorphedUnitsFieldBuilder() : null;
            } else {
              morphedUnitsBuilder_.addAllMessages(other.morphedUnits_);
            }
          }
        }
        if (shownUnitsBuilder_ == null) {
          if (!other.shownUnits_.isEmpty()) {
            if (shownUnits_.isEmpty()) {
              shownUnits_ = other.shownUnits_;
              bitField0_ = (bitField0_ & ~0x00000800);
            } else {
              ensureShownUnitsIsMutable();
              shownUnits_.addAll(other.shownUnits_);
            }
            onChanged();
          }
        } else {
          if (!other.shownUnits_.isEmpty()) {
            if (shownUnitsBuilder_.isEmpty()) {
              shownUnitsBuilder_.dispose();
              shownUnitsBuilder_ = null;
              shownUnits_ = other.shownUnits_;
              bitField0_ = (bitField0_ & ~0x00000800);
              shownUnitsBuilder_ = 
                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
                   getShownUnitsFieldBuilder() : null;
            } else {
              shownUnitsBuilder_.addAllMessages(other.shownUnits_);
            }
          }
        }
        if (hiddenUnitsBuilder_ == null) {
          if (!other.hiddenUnits_.isEmpty()) {
            if (hiddenUnits_.isEmpty()) {
              hiddenUnits_ = other.hiddenUnits_;
              bitField0_ = (bitField0_ & ~0x00001000);
            } else {
              ensureHiddenUnitsIsMutable();
              hiddenUnits_.addAll(other.hiddenUnits_);
            }
            onChanged();
          }
        } else {
          if (!other.hiddenUnits_.isEmpty()) {
            if (hiddenUnitsBuilder_.isEmpty()) {
              hiddenUnitsBuilder_.dispose();
              hiddenUnitsBuilder_ = null;
              hiddenUnits_ = other.hiddenUnits_;
              bitField0_ = (bitField0_ & ~0x00001000);
              hiddenUnitsBuilder_ = 
                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
                   getHiddenUnitsFieldBuilder() : null;
            } else {
              hiddenUnitsBuilder_.addAllMessages(other.hiddenUnits_);
            }
          }
        }
        if (renegadedUnitsBuilder_ == null) {
          if (!other.renegadedUnits_.isEmpty()) {
            if (renegadedUnits_.isEmpty()) {
              renegadedUnits_ = other.renegadedUnits_;
              bitField0_ = (bitField0_ & ~0x00002000);
            } else {
              ensureRenegadedUnitsIsMutable();
              renegadedUnits_.addAll(other.renegadedUnits_);
            }
            onChanged();
          }
        } else {
          if (!other.renegadedUnits_.isEmpty()) {
            if (renegadedUnitsBuilder_.isEmpty()) {
              renegadedUnitsBuilder_.dispose();
              renegadedUnitsBuilder_ = null;
              renegadedUnits_ = other.renegadedUnits_;
              bitField0_ = (bitField0_ & ~0x00002000);
              renegadedUnitsBuilder_ = 
                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
                   getRenegadedUnitsFieldBuilder() : null;
            } else {
              renegadedUnitsBuilder_.addAllMessages(other.renegadedUnits_);
            }
          }
        }
        if (!other.leftplayers_.isEmpty()) {
          if (leftplayers_.isEmpty()) {
            leftplayers_ = other.leftplayers_;
            bitField0_ = (bitField0_ & ~0x00004000);
          } else {
            ensureLeftplayersIsMutable();
            leftplayers_.addAll(other.leftplayers_);
          }
          onChanged();
        }
        if (receivedTextsBuilder_ == null) {
          if (!other.receivedTexts_.isEmpty()) {
            if (receivedTexts_.isEmpty()) {
              receivedTexts_ = other.receivedTexts_;
              bitField0_ = (bitField0_ & ~0x00008000);
            } else {
              ensureReceivedTextsIsMutable();
              receivedTexts_.addAll(other.receivedTexts_);
            }
            onChanged();
          }
        } else {
          if (!other.receivedTexts_.isEmpty()) {
            if (receivedTextsBuilder_.isEmpty()) {
              receivedTextsBuilder_.dispose();
              receivedTextsBuilder_ = null;
              receivedTexts_ = other.receivedTexts_;
              bitField0_ = (bitField0_ & ~0x00008000);
              receivedTextsBuilder_ = 
                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
                   getReceivedTextsFieldBuilder() : null;
            } else {
              receivedTextsBuilder_.addAllMessages(other.receivedTexts_);
            }
          }
        }
        if (selectedUnitsBuilder_ == null) {
          if (!other.selectedUnits_.isEmpty()) {
            if (selectedUnits_.isEmpty()) {
              selectedUnits_ = other.selectedUnits_;
              bitField0_ = (bitField0_ & ~0x00010000);
            } else {
              ensureSelectedUnitsIsMutable();
              selectedUnits_.addAll(other.selectedUnits_);
            }
            onChanged();
          }
        } else {
          if (!other.selectedUnits_.isEmpty()) {
            if (selectedUnitsBuilder_.isEmpty()) {
              selectedUnitsBuilder_.dispose();
              selectedUnitsBuilder_ = null;
              selectedUnits_ = other.selectedUnits_;
              bitField0_ = (bitField0_ & ~0x00010000);
              selectedUnitsBuilder_ = 
                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
                   getSelectedUnitsFieldBuilder() : null;
            } else {
              selectedUnitsBuilder_.addAllMessages(other.selectedUnits_);
            }
          }
        }
        if (!other.sentText_.isEmpty()) {
          if (sentText_.isEmpty()) {
            sentText_ = other.sentText_;
            bitField0_ = (bitField0_ & ~0x00020000);
          } else {
            ensureSentTextIsMutable();
            sentText_.addAll(other.sentText_);
          }
          onChanged();
        }
        if (other.hasNukeDetect()) {
          mergeNukeDetect(other.getNukeDetect());
        }
        if (other.hasPaused()) {
          setPaused(other.getPaused());
        }
        if (other.hasReplay()) {
          setReplay(other.getReplay());
        }
        if (other.hasMultiplayer()) {
          setMultiplayer(other.getMultiplayer());
        }
        if (other.hasGameover()) {
          setGameover(other.getGameover());
        }
        if (other.hasIsWinner()) {
          setIsWinner(other.getIsWinner());
        }
        if (other.hasScreenPosition()) {
          mergeScreenPosition(other.getScreenPosition());
        }
        if (other.hasLatency()) {
          setLatency(other.getLatency());
        }
        if (other.hasDynamicTerrainInfo()) {
          mergeDynamicTerrainInfo(other.getDynamicTerrainInfo());
        }
        if (other.hasTerrainInfo()) {
          mergeTerrainInfo(other.getTerrainInfo());
        }
        this.mergeUnknownFields(other.getUnknownFields());
        return this;
      }