diff --git a/.circleci/config.yml b/.circleci/config.yml
new file mode 100644
index 0000000..9e41502
--- /dev/null
+++ b/.circleci/config.yml
@@ -0,0 +1,57 @@
+version: 2
+jobs:
+ app:
+ docker:
+ - image: circleci/golang:1.14
+
+ working_directory: /go/src/github.com/RoboCup-SSL/ssl-simulation-controller
+ steps:
+ - checkout
+ - run: go get -v -t -d ./...
+ - run: go test -v ./...
+ - run:
+ working_directory: cmd/ssl-simulation-controller
+ command: |
+ GOOS=linux GOARCH=amd64 go build -o ../../release/ssl-simulation-controller_linux_amd64
+ GOOS=darwin GOARCH=amd64 go build -o ../../release/ssl-simulation-controller_darwin_amd64
+ GOOS=windows GOARCH=amd64 go build -o ../../release/ssl-simulation-controller_windows_amd64.exe
+ - persist_to_workspace:
+ root: .
+ paths:
+ - release/*
+
+ publish-github-release:
+ docker:
+ - image: circleci/golang:1.14
+ steps:
+ - attach_workspace:
+ at: .
+ - run:
+ name: "Prepare artifacts"
+ working_directory: release
+ command: |
+ mv ssl-simulation-controller_linux_amd64 ssl-simulation-controller_${CIRCLE_TAG}_linux_amd64
+ mv ssl-simulation-controller_darwin_amd64 ssl-simulation-controller_${CIRCLE_TAG}_darwin_amd64
+ mv ssl-simulation-controller_windows_amd64.exe ssl-simulation-controller_${CIRCLE_TAG}_windows_amd64.exe
+ - run:
+ name: "Publish Release on GitHub"
+ command: |
+ go get github.com/tcnksm/ghr
+ ghr -t ${GITHUB_TOKEN} -u ${CIRCLE_PROJECT_USERNAME} -r ${CIRCLE_PROJECT_REPONAME} -c ${CIRCLE_SHA1} -delete ${CIRCLE_TAG} ./release/
+
+workflows:
+ version: 2
+ main:
+ jobs:
+ - app:
+ filters:
+ tags:
+ only: /.*/
+ - publish-github-release:
+ requires:
+ - app
+ filters:
+ branches:
+ ignore: /.*/
+ tags:
+ only: /^v.*/
diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 0000000..f54e4e4
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,4 @@
+/.git
+/Dockerfile
+/.idea
+/.vscode
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..57e6d71
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,8 @@
+# Editor directories and files
+.idea
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw*
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..89214a7
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,13 @@
+FROM golang:1.14-alpine AS build
+WORKDIR /go/src/github.com/RoboCup-SSL/ssl-simulation-controller
+COPY go.mod go.mod
+RUN go mod download
+COPY cmd cmd
+COPY internal internal
+RUN go install ./...
+
+# Start fresh from a smaller image
+FROM alpine:3.9
+COPY --from=build /go/bin/ssl-simulation-controller /app/ssl-simulation-controller
+ENTRYPOINT ["/app/ssl-simulation-controller"]
+CMD []
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..94a9ed0
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..fbbe90d
--- /dev/null
+++ b/README.md
@@ -0,0 +1,45 @@
+[![CircleCI](https://circleci.com/gh/RoboCup-SSL/ssl-simulation-controller/tree/master.svg?style=svg)](https://circleci.com/gh/RoboCup-SSL/ssl-simulation-controller/tree/master)
+[![Go Report Card](https://goreportcard.com/badge/github.com/RoboCup-SSL/ssl-simulation-controller?style=flat-square)](https://goreportcard.com/report/github.com/RoboCup-SSL/ssl-simulation-controller)
+[![Go Doc](https://img.shields.io/badge/godoc-reference-blue.svg?style=flat-square)](https://godoc.org/github.com/RoboCup-SSL/ssl-simulation-controller/pkg/vision)
+[![Release](https://img.shields.io/github/release/RoboCup-SSL/ssl-simulation-controller.svg?style=flat-square)](https://github.com/RoboCup-SSL/ssl-simulation-controller/releases/latest)
+
+# ssl-simulation-controller
+
+A controller for SSL simulation tournaments, that:
+ * places the ball automatically, if it can not be placed by the teams
+ * TODO: Adds and removes robots, if the robot count does not fit
+ * During gameplay, if the [conditions](https://robocup-ssl.github.io/ssl-rules/sslrules.html#_robot_substitution) are met
+ * During stop by selecting robots nearest to either crossing of half-way line and touch line)
+ * TODO: Set robot limits based on some configuration
+
+## Usage
+If you just want to use this app, simply download the latest [release binary](https://github.com/RoboCup-SSL/ssl-simulation-controller/releases/latest).
+The binary is self-contained. No dependencies are required.
+
+You can also use pre-build docker images:
+```shell script
+docker pull robocupssl/ssl-simulation-controller
+docker run --network host robocupssl/ssl-simulation-controller
+```
+
+## Development
+
+### Requirements
+You need to install following dependencies first:
+ * Go >= 1.14
+
+### Prepare
+Download and install to [GOPATH](https://github.com/golang/go/wiki/GOPATH):
+```bash
+go get -u github.com/RoboCup-SSL/ssl-simulation-controller/...
+```
+Switch to project root directory
+```bash
+cd $GOPATH/src/github.com/RoboCup-SSL/ssl-simulation-controller/
+```
+
+### Run
+Run the backend:
+```bash
+go run cmd/ssl-simulation-controller/main.go
+```
diff --git a/cmd/ssl-simulation-controller/main.go b/cmd/ssl-simulation-controller/main.go
new file mode 100644
index 0000000..42f1668
--- /dev/null
+++ b/cmd/ssl-simulation-controller/main.go
@@ -0,0 +1,25 @@
+package main
+
+import (
+ "flag"
+ "github.com/RoboCup-SSL/ssl-simulation-controller/internal/simctl"
+ "os"
+ "os/signal"
+ "syscall"
+)
+
+var visionAddress = flag.String("visionAddress", "224.5.23.2:10006", "The address (ip+port) from which vision packages are received")
+var trackerAddress = flag.String("trackerAddress", "224.5.23.2:10010", "The address (ip+port) from which tracker packages are received")
+var refereeAddress = flag.String("refereeAddress", "224.5.23.1:10003", "The address (ip+port) from which referee packages are received")
+var simControlPort = flag.String("simControlPort", "10300", "The port to which simulation control packets are send")
+
+func main() {
+ flag.Parse()
+ ctl := simctl.NewSimulationController(*visionAddress, *refereeAddress, *trackerAddress, *simControlPort)
+ ctl.Start()
+
+ signals := make(chan os.Signal, 1)
+ signal.Notify(signals, syscall.SIGINT, syscall.SIGTERM)
+ <-signals
+ ctl.Stop()
+}
diff --git a/generateProto.sh b/generateProto.sh
new file mode 100755
index 0000000..e8e1999
--- /dev/null
+++ b/generateProto.sh
@@ -0,0 +1,30 @@
+#!/bin/bash
+
+# Fail on errors
+set -e
+# Print commands
+set -x
+
+# common GC
+protoc -I"./proto" -I"$GOPATH/src" --go_out="$GOPATH/src" proto/ssl_gc_common.proto
+protoc -I"./proto" -I"$GOPATH/src" --go_out="$GOPATH/src" proto/ssl_gc_geometry.proto
+
+# vision
+protoc -I"./proto" -I"$GOPATH/src" --go_out="$GOPATH/src" proto/ssl_vision_detection.proto
+protoc -I"./proto" -I"$GOPATH/src" --go_out="$GOPATH/src" proto/ssl_vision_geometry.proto
+protoc -I"./proto" -I"$GOPATH/src" --go_out="$GOPATH/src" proto/ssl_vision_wrapper.proto
+
+# tracked vision
+protoc -I"./proto" -I"$GOPATH/src" --go_out="$GOPATH/src" proto/ssl_vision_detection_tracked.proto
+protoc -I"./proto" -I"$GOPATH/src" --go_out="$GOPATH/src" proto/ssl_vision_wrapper_tracked.proto
+
+# game events
+protoc -I"./proto" -I"$GOPATH/src" --go_out="$GOPATH/src" proto/ssl_gc_game_event.proto
+
+# referee message
+protoc -I"./proto" -I"$GOPATH/src" --go_out="$GOPATH/src" proto/ssl_gc_referee_message.proto
+
+# simulation control
+protoc -I"./proto" -I"$GOPATH/src" --go_out="$GOPATH/src" proto/ssl_simulation_error.proto
+protoc -I"./proto" -I"$GOPATH/src" --go_out="$GOPATH/src" proto/ssl_simulation_config.proto
+protoc -I"./proto" -I"$GOPATH/src" --go_out="$GOPATH/src" proto/ssl_simulation_control.proto
diff --git a/go.mod b/go.mod
new file mode 100644
index 0000000..ed15868
--- /dev/null
+++ b/go.mod
@@ -0,0 +1,8 @@
+module github.com/RoboCup-SSL/ssl-simulation-controller
+
+go 1.15
+
+require (
+ github.com/golang/protobuf v1.4.3
+ google.golang.org/protobuf v1.25.0
+)
diff --git a/go.sum b/go.sum
new file mode 100644
index 0000000..2384568
--- /dev/null
+++ b/go.sum
@@ -0,0 +1,67 @@
+cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
+github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
+github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
+github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
+github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
+github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
+github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
+github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
+github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
+github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM=
+github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
+github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.0 h1:/QaMHBdZ26BB3SSst0Iwl10Epc+xhTquomWX0oZEB6w=
+github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
+golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
+golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
+golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
+google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
+google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
+google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
+google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
+google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
+google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
+google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
+google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c=
+google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
+honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
diff --git a/internal/geom/geometry.go b/internal/geom/geometry.go
new file mode 100644
index 0000000..5335c33
--- /dev/null
+++ b/internal/geom/geometry.go
@@ -0,0 +1,61 @@
+package geom
+
+import (
+ "fmt"
+ "math"
+)
+
+// NewVector2 creates a new Vector2 from float64 values
+func NewVector2(x, y float64) *Vector2 {
+ return NewVector2Float32(float32(x), float32(y))
+}
+
+// NewVector2Float32 creates a new Vector2 from float32 values
+func NewVector2Float32(x, y float32) *Vector2 {
+ return &Vector2{X: &x, Y: &y}
+}
+
+// Length returns the length of this vector
+func (m *Vector2) Length() float64 {
+ x := *m.X
+ y := *m.Y
+ return math.Sqrt(float64(x*x + y*y))
+}
+
+// Sub subtracts the given vector from this one
+func (m *Vector2) Sub(o *Vector2) *Vector2 {
+ return NewVector2Float32(*m.X-*o.X, *m.Y-*o.Y)
+}
+
+// DistanceTo returns the distance between this vector and the given one
+func (m *Vector2) DistanceTo(o *Vector2) float64 {
+ return m.Sub(o).Length()
+}
+
+// X64 returns the x value as float64
+func (m *Vector2) X64() float64 {
+ return float64(*m.X)
+}
+
+// Y64 returns the y value as float64
+func (m *Vector2) Y64() float64 {
+ return float64(*m.Y)
+}
+
+// ToVector2 converts this vector into a new 2d vector, dropping the z part
+func (m *Vector3) ToVector2() *Vector2 {
+ return NewVector2Float32(*m.X, *m.Y)
+}
+
+// StringPretty converts the vector into a pretty printed string
+func (m *Vector2) StringPretty() string {
+ x := float32(0)
+ y := float32(0)
+ if m.X != nil {
+ x = *m.X
+ }
+ if m.Y != nil {
+ y = *m.Y
+ }
+ return fmt.Sprintf("x: %v, y: %v", x, y)
+}
diff --git a/internal/geom/ssl_gc_geometry.pb.go b/internal/geom/ssl_gc_geometry.pb.go
new file mode 100644
index 0000000..b25e3ae
--- /dev/null
+++ b/internal/geom/ssl_gc_geometry.pb.go
@@ -0,0 +1,239 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// protoc-gen-go v1.25.0
+// protoc v3.12.4
+// source: ssl_gc_geometry.proto
+
+package geom
+
+import (
+ proto "github.com/golang/protobuf/proto"
+ protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+ protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+ reflect "reflect"
+ sync "sync"
+)
+
+const (
+ // Verify that this generated code is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+ // Verify that runtime/protoimpl is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
+
+// A vector with two dimensions
+type Vector2 struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ X *float32 `protobuf:"fixed32,1,req,name=x" json:"x,omitempty"`
+ Y *float32 `protobuf:"fixed32,2,req,name=y" json:"y,omitempty"`
+}
+
+func (x *Vector2) Reset() {
+ *x = Vector2{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_gc_geometry_proto_msgTypes[0]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *Vector2) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Vector2) ProtoMessage() {}
+
+func (x *Vector2) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_gc_geometry_proto_msgTypes[0]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use Vector2.ProtoReflect.Descriptor instead.
+func (*Vector2) Descriptor() ([]byte, []int) {
+ return file_ssl_gc_geometry_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *Vector2) GetX() float32 {
+ if x != nil && x.X != nil {
+ return *x.X
+ }
+ return 0
+}
+
+func (x *Vector2) GetY() float32 {
+ if x != nil && x.Y != nil {
+ return *x.Y
+ }
+ return 0
+}
+
+// A vector with three dimensions
+type Vector3 struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ X *float32 `protobuf:"fixed32,1,req,name=x" json:"x,omitempty"`
+ Y *float32 `protobuf:"fixed32,2,req,name=y" json:"y,omitempty"`
+ Z *float32 `protobuf:"fixed32,3,req,name=z" json:"z,omitempty"`
+}
+
+func (x *Vector3) Reset() {
+ *x = Vector3{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_gc_geometry_proto_msgTypes[1]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *Vector3) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Vector3) ProtoMessage() {}
+
+func (x *Vector3) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_gc_geometry_proto_msgTypes[1]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use Vector3.ProtoReflect.Descriptor instead.
+func (*Vector3) Descriptor() ([]byte, []int) {
+ return file_ssl_gc_geometry_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *Vector3) GetX() float32 {
+ if x != nil && x.X != nil {
+ return *x.X
+ }
+ return 0
+}
+
+func (x *Vector3) GetY() float32 {
+ if x != nil && x.Y != nil {
+ return *x.Y
+ }
+ return 0
+}
+
+func (x *Vector3) GetZ() float32 {
+ if x != nil && x.Z != nil {
+ return *x.Z
+ }
+ return 0
+}
+
+var File_ssl_gc_geometry_proto protoreflect.FileDescriptor
+
+var file_ssl_gc_geometry_proto_rawDesc = []byte{
+ 0x0a, 0x15, 0x73, 0x73, 0x6c, 0x5f, 0x67, 0x63, 0x5f, 0x67, 0x65, 0x6f, 0x6d, 0x65, 0x74, 0x72,
+ 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x25, 0x0a, 0x07, 0x56, 0x65, 0x63, 0x74, 0x6f,
+ 0x72, 0x32, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20, 0x02, 0x28, 0x02, 0x52, 0x01, 0x78,
+ 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x02, 0x28, 0x02, 0x52, 0x01, 0x79, 0x22, 0x33,
+ 0x0a, 0x07, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x33, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01,
+ 0x20, 0x02, 0x28, 0x02, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x02,
+ 0x28, 0x02, 0x52, 0x01, 0x79, 0x12, 0x0c, 0x0a, 0x01, 0x7a, 0x18, 0x03, 0x20, 0x02, 0x28, 0x02,
+ 0x52, 0x01, 0x7a, 0x42, 0x40, 0x5a, 0x3e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f,
+ 0x6d, 0x2f, 0x52, 0x6f, 0x62, 0x6f, 0x43, 0x75, 0x70, 0x2d, 0x53, 0x53, 0x4c, 0x2f, 0x73, 0x73,
+ 0x6c, 0x2d, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x63, 0x6f, 0x6e,
+ 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c,
+ 0x2f, 0x67, 0x65, 0x6f, 0x6d,
+}
+
+var (
+ file_ssl_gc_geometry_proto_rawDescOnce sync.Once
+ file_ssl_gc_geometry_proto_rawDescData = file_ssl_gc_geometry_proto_rawDesc
+)
+
+func file_ssl_gc_geometry_proto_rawDescGZIP() []byte {
+ file_ssl_gc_geometry_proto_rawDescOnce.Do(func() {
+ file_ssl_gc_geometry_proto_rawDescData = protoimpl.X.CompressGZIP(file_ssl_gc_geometry_proto_rawDescData)
+ })
+ return file_ssl_gc_geometry_proto_rawDescData
+}
+
+var file_ssl_gc_geometry_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
+var file_ssl_gc_geometry_proto_goTypes = []interface{}{
+ (*Vector2)(nil), // 0: Vector2
+ (*Vector3)(nil), // 1: Vector3
+}
+var file_ssl_gc_geometry_proto_depIdxs = []int32{
+ 0, // [0:0] is the sub-list for method output_type
+ 0, // [0:0] is the sub-list for method input_type
+ 0, // [0:0] is the sub-list for extension type_name
+ 0, // [0:0] is the sub-list for extension extendee
+ 0, // [0:0] is the sub-list for field type_name
+}
+
+func init() { file_ssl_gc_geometry_proto_init() }
+func file_ssl_gc_geometry_proto_init() {
+ if File_ssl_gc_geometry_proto != nil {
+ return
+ }
+ if !protoimpl.UnsafeEnabled {
+ file_ssl_gc_geometry_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*Vector2); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_gc_geometry_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*Vector3); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ }
+ type x struct{}
+ out := protoimpl.TypeBuilder{
+ File: protoimpl.DescBuilder{
+ GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+ RawDescriptor: file_ssl_gc_geometry_proto_rawDesc,
+ NumEnums: 0,
+ NumMessages: 2,
+ NumExtensions: 0,
+ NumServices: 0,
+ },
+ GoTypes: file_ssl_gc_geometry_proto_goTypes,
+ DependencyIndexes: file_ssl_gc_geometry_proto_depIdxs,
+ MessageInfos: file_ssl_gc_geometry_proto_msgTypes,
+ }.Build()
+ File_ssl_gc_geometry_proto = out.File
+ file_ssl_gc_geometry_proto_rawDesc = nil
+ file_ssl_gc_geometry_proto_goTypes = nil
+ file_ssl_gc_geometry_proto_depIdxs = nil
+}
diff --git a/internal/referee/ssl_gc_common.pb.go b/internal/referee/ssl_gc_common.pb.go
new file mode 100644
index 0000000..430d240
--- /dev/null
+++ b/internal/referee/ssl_gc_common.pb.go
@@ -0,0 +1,295 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// protoc-gen-go v1.25.0
+// protoc v3.12.4
+// source: ssl_gc_common.proto
+
+package referee
+
+import (
+ proto "github.com/golang/protobuf/proto"
+ protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+ protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+ reflect "reflect"
+ sync "sync"
+)
+
+const (
+ // Verify that this generated code is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+ // Verify that runtime/protoimpl is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
+
+// Team is either blue or yellow
+type Team int32
+
+const (
+ // team not set
+ Team_UNKNOWN Team = 0
+ // yellow team
+ Team_YELLOW Team = 1
+ // blue team
+ Team_BLUE Team = 2
+)
+
+// Enum value maps for Team.
+var (
+ Team_name = map[int32]string{
+ 0: "UNKNOWN",
+ 1: "YELLOW",
+ 2: "BLUE",
+ }
+ Team_value = map[string]int32{
+ "UNKNOWN": 0,
+ "YELLOW": 1,
+ "BLUE": 2,
+ }
+)
+
+func (x Team) Enum() *Team {
+ p := new(Team)
+ *p = x
+ return p
+}
+
+func (x Team) String() string {
+ return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (Team) Descriptor() protoreflect.EnumDescriptor {
+ return file_ssl_gc_common_proto_enumTypes[0].Descriptor()
+}
+
+func (Team) Type() protoreflect.EnumType {
+ return &file_ssl_gc_common_proto_enumTypes[0]
+}
+
+func (x Team) Number() protoreflect.EnumNumber {
+ return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Do not use.
+func (x *Team) UnmarshalJSON(b []byte) error {
+ num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b)
+ if err != nil {
+ return err
+ }
+ *x = Team(num)
+ return nil
+}
+
+// Deprecated: Use Team.Descriptor instead.
+func (Team) EnumDescriptor() ([]byte, []int) {
+ return file_ssl_gc_common_proto_rawDescGZIP(), []int{0}
+}
+
+// Division denotes the current division, which influences some rules
+type Division int32
+
+const (
+ Division_DIV_UNKNOWN Division = 0
+ Division_DIV_A Division = 1
+ Division_DIV_B Division = 2
+)
+
+// Enum value maps for Division.
+var (
+ Division_name = map[int32]string{
+ 0: "DIV_UNKNOWN",
+ 1: "DIV_A",
+ 2: "DIV_B",
+ }
+ Division_value = map[string]int32{
+ "DIV_UNKNOWN": 0,
+ "DIV_A": 1,
+ "DIV_B": 2,
+ }
+)
+
+func (x Division) Enum() *Division {
+ p := new(Division)
+ *p = x
+ return p
+}
+
+func (x Division) String() string {
+ return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (Division) Descriptor() protoreflect.EnumDescriptor {
+ return file_ssl_gc_common_proto_enumTypes[1].Descriptor()
+}
+
+func (Division) Type() protoreflect.EnumType {
+ return &file_ssl_gc_common_proto_enumTypes[1]
+}
+
+func (x Division) Number() protoreflect.EnumNumber {
+ return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Do not use.
+func (x *Division) UnmarshalJSON(b []byte) error {
+ num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b)
+ if err != nil {
+ return err
+ }
+ *x = Division(num)
+ return nil
+}
+
+// Deprecated: Use Division.Descriptor instead.
+func (Division) EnumDescriptor() ([]byte, []int) {
+ return file_ssl_gc_common_proto_rawDescGZIP(), []int{1}
+}
+
+// RobotId is the combination of a team and a robot id
+type RobotId struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // the robot number
+ Id *uint32 `protobuf:"varint,1,opt,name=id" json:"id,omitempty"`
+ // the team that the robot belongs to
+ Team *Team `protobuf:"varint,2,opt,name=team,enum=Team" json:"team,omitempty"`
+}
+
+func (x *RobotId) Reset() {
+ *x = RobotId{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_gc_common_proto_msgTypes[0]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *RobotId) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*RobotId) ProtoMessage() {}
+
+func (x *RobotId) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_gc_common_proto_msgTypes[0]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use RobotId.ProtoReflect.Descriptor instead.
+func (*RobotId) Descriptor() ([]byte, []int) {
+ return file_ssl_gc_common_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *RobotId) GetId() uint32 {
+ if x != nil && x.Id != nil {
+ return *x.Id
+ }
+ return 0
+}
+
+func (x *RobotId) GetTeam() Team {
+ if x != nil && x.Team != nil {
+ return *x.Team
+ }
+ return Team_UNKNOWN
+}
+
+var File_ssl_gc_common_proto protoreflect.FileDescriptor
+
+var file_ssl_gc_common_proto_rawDesc = []byte{
+ 0x0a, 0x13, 0x73, 0x73, 0x6c, 0x5f, 0x67, 0x63, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e,
+ 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x34, 0x0a, 0x07, 0x52, 0x6f, 0x62, 0x6f, 0x74, 0x49, 0x64,
+ 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64,
+ 0x12, 0x19, 0x0a, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x05,
+ 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x2a, 0x29, 0x0a, 0x04, 0x54,
+ 0x65, 0x61, 0x6d, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00,
+ 0x12, 0x0a, 0x0a, 0x06, 0x59, 0x45, 0x4c, 0x4c, 0x4f, 0x57, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04,
+ 0x42, 0x4c, 0x55, 0x45, 0x10, 0x02, 0x2a, 0x31, 0x0a, 0x08, 0x44, 0x69, 0x76, 0x69, 0x73, 0x69,
+ 0x6f, 0x6e, 0x12, 0x0f, 0x0a, 0x0b, 0x44, 0x49, 0x56, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57,
+ 0x4e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x44, 0x49, 0x56, 0x5f, 0x41, 0x10, 0x01, 0x12, 0x09,
+ 0x0a, 0x05, 0x44, 0x49, 0x56, 0x5f, 0x42, 0x10, 0x02, 0x42, 0x43, 0x5a, 0x41, 0x67, 0x69, 0x74,
+ 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x52, 0x6f, 0x62, 0x6f, 0x43, 0x75, 0x70, 0x2d,
+ 0x53, 0x53, 0x4c, 0x2f, 0x73, 0x73, 0x6c, 0x2d, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2f, 0x69, 0x6e,
+ 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65,
+}
+
+var (
+ file_ssl_gc_common_proto_rawDescOnce sync.Once
+ file_ssl_gc_common_proto_rawDescData = file_ssl_gc_common_proto_rawDesc
+)
+
+func file_ssl_gc_common_proto_rawDescGZIP() []byte {
+ file_ssl_gc_common_proto_rawDescOnce.Do(func() {
+ file_ssl_gc_common_proto_rawDescData = protoimpl.X.CompressGZIP(file_ssl_gc_common_proto_rawDescData)
+ })
+ return file_ssl_gc_common_proto_rawDescData
+}
+
+var file_ssl_gc_common_proto_enumTypes = make([]protoimpl.EnumInfo, 2)
+var file_ssl_gc_common_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
+var file_ssl_gc_common_proto_goTypes = []interface{}{
+ (Team)(0), // 0: Team
+ (Division)(0), // 1: Division
+ (*RobotId)(nil), // 2: RobotId
+}
+var file_ssl_gc_common_proto_depIdxs = []int32{
+ 0, // 0: RobotId.team:type_name -> Team
+ 1, // [1:1] is the sub-list for method output_type
+ 1, // [1:1] is the sub-list for method input_type
+ 1, // [1:1] is the sub-list for extension type_name
+ 1, // [1:1] is the sub-list for extension extendee
+ 0, // [0:1] is the sub-list for field type_name
+}
+
+func init() { file_ssl_gc_common_proto_init() }
+func file_ssl_gc_common_proto_init() {
+ if File_ssl_gc_common_proto != nil {
+ return
+ }
+ if !protoimpl.UnsafeEnabled {
+ file_ssl_gc_common_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*RobotId); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ }
+ type x struct{}
+ out := protoimpl.TypeBuilder{
+ File: protoimpl.DescBuilder{
+ GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+ RawDescriptor: file_ssl_gc_common_proto_rawDesc,
+ NumEnums: 2,
+ NumMessages: 1,
+ NumExtensions: 0,
+ NumServices: 0,
+ },
+ GoTypes: file_ssl_gc_common_proto_goTypes,
+ DependencyIndexes: file_ssl_gc_common_proto_depIdxs,
+ EnumInfos: file_ssl_gc_common_proto_enumTypes,
+ MessageInfos: file_ssl_gc_common_proto_msgTypes,
+ }.Build()
+ File_ssl_gc_common_proto = out.File
+ file_ssl_gc_common_proto_rawDesc = nil
+ file_ssl_gc_common_proto_goTypes = nil
+ file_ssl_gc_common_proto_depIdxs = nil
+}
diff --git a/internal/referee/ssl_gc_game_event.pb.go b/internal/referee/ssl_gc_game_event.pb.go
new file mode 100644
index 0000000..4232199
--- /dev/null
+++ b/internal/referee/ssl_gc_game_event.pb.go
@@ -0,0 +1,5014 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// protoc-gen-go v1.25.0
+// protoc v3.12.4
+// source: ssl_gc_game_event.proto
+
+package referee
+
+import (
+ geom "github.com/RoboCup-SSL/ssl-simulation-controller/internal/geom"
+ proto "github.com/golang/protobuf/proto"
+ protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+ protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+ reflect "reflect"
+ sync "sync"
+)
+
+const (
+ // Verify that this generated code is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+ // Verify that runtime/protoimpl is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
+
+type GameEvent_Type int32
+
+const (
+ GameEvent_UNKNOWN_GAME_EVENT_TYPE GameEvent_Type = 0
+ GameEvent_BALL_LEFT_FIELD_TOUCH_LINE GameEvent_Type = 6 // triggered by autoRef
+ GameEvent_BALL_LEFT_FIELD_GOAL_LINE GameEvent_Type = 7 // triggered by autoRef
+ GameEvent_AIMLESS_KICK GameEvent_Type = 11 // triggered by autoRef
+ GameEvent_ATTACKER_TOO_CLOSE_TO_DEFENSE_AREA GameEvent_Type = 19 // triggered by autoRef
+ GameEvent_DEFENDER_IN_DEFENSE_AREA GameEvent_Type = 31 // triggered by autoRef
+ GameEvent_BOUNDARY_CROSSING GameEvent_Type = 41 // triggered by autoRef
+ GameEvent_KEEPER_HELD_BALL GameEvent_Type = 13 // triggered by GC
+ GameEvent_BOT_DRIBBLED_BALL_TOO_FAR GameEvent_Type = 17 // triggered by autoRef
+ GameEvent_BOT_PUSHED_BOT GameEvent_Type = 24 // triggered by human ref
+ GameEvent_BOT_HELD_BALL_DELIBERATELY GameEvent_Type = 26 // triggered by human ref
+ GameEvent_BOT_TIPPED_OVER GameEvent_Type = 27 // triggered by human ref
+ GameEvent_ATTACKER_TOUCHED_BALL_IN_DEFENSE_AREA GameEvent_Type = 15 // triggered by autoRef
+ GameEvent_BOT_KICKED_BALL_TOO_FAST GameEvent_Type = 18 // triggered by autoRef
+ GameEvent_BOT_CRASH_UNIQUE GameEvent_Type = 22 // triggered by autoRef
+ GameEvent_BOT_CRASH_DRAWN GameEvent_Type = 21 // triggered by autoRef
+ GameEvent_DEFENDER_TOO_CLOSE_TO_KICK_POINT GameEvent_Type = 29 // triggered by autoRef
+ GameEvent_BOT_TOO_FAST_IN_STOP GameEvent_Type = 28 // triggered by autoRef
+ GameEvent_BOT_INTERFERED_PLACEMENT GameEvent_Type = 20 // triggered by autoRef
+ GameEvent_POSSIBLE_GOAL GameEvent_Type = 39 // triggered by autoRef
+ GameEvent_GOAL GameEvent_Type = 8 // triggered by GC
+ GameEvent_INVALID_GOAL GameEvent_Type = 42 // triggered by GC
+ GameEvent_ATTACKER_DOUBLE_TOUCHED_BALL GameEvent_Type = 14 // triggered by autoRef
+ GameEvent_PLACEMENT_SUCCEEDED GameEvent_Type = 5 // triggered by autoRef
+ GameEvent_PENALTY_KICK_FAILED GameEvent_Type = 43 // triggered by GC and autoRef
+ GameEvent_NO_PROGRESS_IN_GAME GameEvent_Type = 2 // triggered by GC
+ GameEvent_PLACEMENT_FAILED GameEvent_Type = 3 // triggered by GC
+ GameEvent_MULTIPLE_CARDS GameEvent_Type = 32 // triggered by GC
+ GameEvent_MULTIPLE_FOULS GameEvent_Type = 34 // triggered by GC
+ GameEvent_BOT_SUBSTITUTION GameEvent_Type = 37 // triggered by GC
+ GameEvent_TOO_MANY_ROBOTS GameEvent_Type = 38 // triggered by GC
+ GameEvent_CHALLENGE_FLAG GameEvent_Type = 44 // triggered by GC
+ GameEvent_EMERGENCY_STOP GameEvent_Type = 45 // triggered by GC
+ GameEvent_UNSPORTING_BEHAVIOR_MINOR GameEvent_Type = 35 // triggered by human ref
+ GameEvent_UNSPORTING_BEHAVIOR_MAJOR GameEvent_Type = 36 // triggered by human ref
+ // Deprecated: Do not use.
+ GameEvent_PREPARED GameEvent_Type = 1
+ // Deprecated: Do not use.
+ GameEvent_INDIRECT_GOAL GameEvent_Type = 9
+ // Deprecated: Do not use.
+ GameEvent_CHIPPED_GOAL GameEvent_Type = 10
+ // Deprecated: Do not use.
+ GameEvent_KICK_TIMEOUT GameEvent_Type = 12
+ // Deprecated: Do not use.
+ GameEvent_ATTACKER_TOUCHED_OPPONENT_IN_DEFENSE_AREA GameEvent_Type = 16
+ // Deprecated: Do not use.
+ GameEvent_ATTACKER_TOUCHED_OPPONENT_IN_DEFENSE_AREA_SKIPPED GameEvent_Type = 40
+ // Deprecated: Do not use.
+ GameEvent_BOT_CRASH_UNIQUE_SKIPPED GameEvent_Type = 23
+ // Deprecated: Do not use.
+ GameEvent_BOT_PUSHED_BOT_SKIPPED GameEvent_Type = 25
+ // Deprecated: Do not use.
+ GameEvent_DEFENDER_IN_DEFENSE_AREA_PARTIALLY GameEvent_Type = 30
+ // Deprecated: Do not use.
+ GameEvent_MULTIPLE_PLACEMENT_FAILURES GameEvent_Type = 33
+)
+
+// Enum value maps for GameEvent_Type.
+var (
+ GameEvent_Type_name = map[int32]string{
+ 0: "UNKNOWN_GAME_EVENT_TYPE",
+ 6: "BALL_LEFT_FIELD_TOUCH_LINE",
+ 7: "BALL_LEFT_FIELD_GOAL_LINE",
+ 11: "AIMLESS_KICK",
+ 19: "ATTACKER_TOO_CLOSE_TO_DEFENSE_AREA",
+ 31: "DEFENDER_IN_DEFENSE_AREA",
+ 41: "BOUNDARY_CROSSING",
+ 13: "KEEPER_HELD_BALL",
+ 17: "BOT_DRIBBLED_BALL_TOO_FAR",
+ 24: "BOT_PUSHED_BOT",
+ 26: "BOT_HELD_BALL_DELIBERATELY",
+ 27: "BOT_TIPPED_OVER",
+ 15: "ATTACKER_TOUCHED_BALL_IN_DEFENSE_AREA",
+ 18: "BOT_KICKED_BALL_TOO_FAST",
+ 22: "BOT_CRASH_UNIQUE",
+ 21: "BOT_CRASH_DRAWN",
+ 29: "DEFENDER_TOO_CLOSE_TO_KICK_POINT",
+ 28: "BOT_TOO_FAST_IN_STOP",
+ 20: "BOT_INTERFERED_PLACEMENT",
+ 39: "POSSIBLE_GOAL",
+ 8: "GOAL",
+ 42: "INVALID_GOAL",
+ 14: "ATTACKER_DOUBLE_TOUCHED_BALL",
+ 5: "PLACEMENT_SUCCEEDED",
+ 43: "PENALTY_KICK_FAILED",
+ 2: "NO_PROGRESS_IN_GAME",
+ 3: "PLACEMENT_FAILED",
+ 32: "MULTIPLE_CARDS",
+ 34: "MULTIPLE_FOULS",
+ 37: "BOT_SUBSTITUTION",
+ 38: "TOO_MANY_ROBOTS",
+ 44: "CHALLENGE_FLAG",
+ 45: "EMERGENCY_STOP",
+ 35: "UNSPORTING_BEHAVIOR_MINOR",
+ 36: "UNSPORTING_BEHAVIOR_MAJOR",
+ 1: "PREPARED",
+ 9: "INDIRECT_GOAL",
+ 10: "CHIPPED_GOAL",
+ 12: "KICK_TIMEOUT",
+ 16: "ATTACKER_TOUCHED_OPPONENT_IN_DEFENSE_AREA",
+ 40: "ATTACKER_TOUCHED_OPPONENT_IN_DEFENSE_AREA_SKIPPED",
+ 23: "BOT_CRASH_UNIQUE_SKIPPED",
+ 25: "BOT_PUSHED_BOT_SKIPPED",
+ 30: "DEFENDER_IN_DEFENSE_AREA_PARTIALLY",
+ 33: "MULTIPLE_PLACEMENT_FAILURES",
+ }
+ GameEvent_Type_value = map[string]int32{
+ "UNKNOWN_GAME_EVENT_TYPE": 0,
+ "BALL_LEFT_FIELD_TOUCH_LINE": 6,
+ "BALL_LEFT_FIELD_GOAL_LINE": 7,
+ "AIMLESS_KICK": 11,
+ "ATTACKER_TOO_CLOSE_TO_DEFENSE_AREA": 19,
+ "DEFENDER_IN_DEFENSE_AREA": 31,
+ "BOUNDARY_CROSSING": 41,
+ "KEEPER_HELD_BALL": 13,
+ "BOT_DRIBBLED_BALL_TOO_FAR": 17,
+ "BOT_PUSHED_BOT": 24,
+ "BOT_HELD_BALL_DELIBERATELY": 26,
+ "BOT_TIPPED_OVER": 27,
+ "ATTACKER_TOUCHED_BALL_IN_DEFENSE_AREA": 15,
+ "BOT_KICKED_BALL_TOO_FAST": 18,
+ "BOT_CRASH_UNIQUE": 22,
+ "BOT_CRASH_DRAWN": 21,
+ "DEFENDER_TOO_CLOSE_TO_KICK_POINT": 29,
+ "BOT_TOO_FAST_IN_STOP": 28,
+ "BOT_INTERFERED_PLACEMENT": 20,
+ "POSSIBLE_GOAL": 39,
+ "GOAL": 8,
+ "INVALID_GOAL": 42,
+ "ATTACKER_DOUBLE_TOUCHED_BALL": 14,
+ "PLACEMENT_SUCCEEDED": 5,
+ "PENALTY_KICK_FAILED": 43,
+ "NO_PROGRESS_IN_GAME": 2,
+ "PLACEMENT_FAILED": 3,
+ "MULTIPLE_CARDS": 32,
+ "MULTIPLE_FOULS": 34,
+ "BOT_SUBSTITUTION": 37,
+ "TOO_MANY_ROBOTS": 38,
+ "CHALLENGE_FLAG": 44,
+ "EMERGENCY_STOP": 45,
+ "UNSPORTING_BEHAVIOR_MINOR": 35,
+ "UNSPORTING_BEHAVIOR_MAJOR": 36,
+ "PREPARED": 1,
+ "INDIRECT_GOAL": 9,
+ "CHIPPED_GOAL": 10,
+ "KICK_TIMEOUT": 12,
+ "ATTACKER_TOUCHED_OPPONENT_IN_DEFENSE_AREA": 16,
+ "ATTACKER_TOUCHED_OPPONENT_IN_DEFENSE_AREA_SKIPPED": 40,
+ "BOT_CRASH_UNIQUE_SKIPPED": 23,
+ "BOT_PUSHED_BOT_SKIPPED": 25,
+ "DEFENDER_IN_DEFENSE_AREA_PARTIALLY": 30,
+ "MULTIPLE_PLACEMENT_FAILURES": 33,
+ }
+)
+
+func (x GameEvent_Type) Enum() *GameEvent_Type {
+ p := new(GameEvent_Type)
+ *p = x
+ return p
+}
+
+func (x GameEvent_Type) String() string {
+ return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (GameEvent_Type) Descriptor() protoreflect.EnumDescriptor {
+ return file_ssl_gc_game_event_proto_enumTypes[0].Descriptor()
+}
+
+func (GameEvent_Type) Type() protoreflect.EnumType {
+ return &file_ssl_gc_game_event_proto_enumTypes[0]
+}
+
+func (x GameEvent_Type) Number() protoreflect.EnumNumber {
+ return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Do not use.
+func (x *GameEvent_Type) UnmarshalJSON(b []byte) error {
+ num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b)
+ if err != nil {
+ return err
+ }
+ *x = GameEvent_Type(num)
+ return nil
+}
+
+// Deprecated: Use GameEvent_Type.Descriptor instead.
+func (GameEvent_Type) EnumDescriptor() ([]byte, []int) {
+ return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 0}
+}
+
+// GameEvent contains exactly one game event
+// Each game event has optional and required fields. The required fields are mandatory to process the event.
+// Some optional fields are only used for visualization, others are required to determine the ball placement position.
+// If fields are missing that are required for the ball placement position, no ball placement command will be issued.
+// Fields are marked optional to make testing and extending of the protocol easier.
+// An autoRef should ideally set all fields, except if there are good reasons to not do so.
+type GameEvent struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Type *GameEvent_Type `protobuf:"varint,40,opt,name=type,enum=GameEvent_Type" json:"type,omitempty"`
+ // The origins of this game event.
+ // Empty, if it originates from game controller.
+ // Contains autoRef name(s), if it originates from one or more autoRefs.
+ // Ignored if sent by autoRef to game controller.
+ Origin []string `protobuf:"bytes,41,rep,name=origin" json:"origin,omitempty"`
+ // the event that occurred
+ //
+ // Types that are assignable to Event:
+ // *GameEvent_BallLeftFieldTouchLine
+ // *GameEvent_BallLeftFieldGoalLine
+ // *GameEvent_AimlessKick_
+ // *GameEvent_AttackerTooCloseToDefenseArea_
+ // *GameEvent_DefenderInDefenseArea_
+ // *GameEvent_BoundaryCrossing_
+ // *GameEvent_KeeperHeldBall_
+ // *GameEvent_BotDribbledBallTooFar_
+ // *GameEvent_BotPushedBot_
+ // *GameEvent_BotHeldBallDeliberately_
+ // *GameEvent_BotTippedOver_
+ // *GameEvent_AttackerTouchedBallInDefenseArea_
+ // *GameEvent_BotKickedBallTooFast_
+ // *GameEvent_BotCrashUnique_
+ // *GameEvent_BotCrashDrawn_
+ // *GameEvent_DefenderTooCloseToKickPoint_
+ // *GameEvent_BotTooFastInStop_
+ // *GameEvent_BotInterferedPlacement_
+ // *GameEvent_PossibleGoal
+ // *GameEvent_Goal_
+ // *GameEvent_InvalidGoal
+ // *GameEvent_AttackerDoubleTouchedBall_
+ // *GameEvent_PlacementSucceeded_
+ // *GameEvent_PenaltyKickFailed_
+ // *GameEvent_NoProgressInGame_
+ // *GameEvent_PlacementFailed_
+ // *GameEvent_MultipleCards_
+ // *GameEvent_MultipleFouls_
+ // *GameEvent_BotSubstitution_
+ // *GameEvent_TooManyRobots_
+ // *GameEvent_ChallengeFlag_
+ // *GameEvent_EmergencyStop_
+ // *GameEvent_UnsportingBehaviorMinor_
+ // *GameEvent_UnsportingBehaviorMajor_
+ // *GameEvent_Prepared_
+ // *GameEvent_IndirectGoal_
+ // *GameEvent_ChippedGoal_
+ // *GameEvent_KickTimeout_
+ // *GameEvent_AttackerTouchedOpponentInDefenseArea_
+ // *GameEvent_AttackerTouchedOpponentInDefenseAreaSkipped
+ // *GameEvent_BotCrashUniqueSkipped
+ // *GameEvent_BotPushedBotSkipped
+ // *GameEvent_DefenderInDefenseAreaPartially_
+ // *GameEvent_MultiplePlacementFailures_
+ Event isGameEvent_Event `protobuf_oneof:"event"`
+}
+
+func (x *GameEvent) Reset() {
+ *x = GameEvent{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[0]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GameEvent) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GameEvent) ProtoMessage() {}
+
+func (x *GameEvent) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[0]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use GameEvent.ProtoReflect.Descriptor instead.
+func (*GameEvent) Descriptor() ([]byte, []int) {
+ return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *GameEvent) GetType() GameEvent_Type {
+ if x != nil && x.Type != nil {
+ return *x.Type
+ }
+ return GameEvent_UNKNOWN_GAME_EVENT_TYPE
+}
+
+func (x *GameEvent) GetOrigin() []string {
+ if x != nil {
+ return x.Origin
+ }
+ return nil
+}
+
+func (m *GameEvent) GetEvent() isGameEvent_Event {
+ if m != nil {
+ return m.Event
+ }
+ return nil
+}
+
+func (x *GameEvent) GetBallLeftFieldTouchLine() *GameEvent_BallLeftField {
+ if x, ok := x.GetEvent().(*GameEvent_BallLeftFieldTouchLine); ok {
+ return x.BallLeftFieldTouchLine
+ }
+ return nil
+}
+
+func (x *GameEvent) GetBallLeftFieldGoalLine() *GameEvent_BallLeftField {
+ if x, ok := x.GetEvent().(*GameEvent_BallLeftFieldGoalLine); ok {
+ return x.BallLeftFieldGoalLine
+ }
+ return nil
+}
+
+func (x *GameEvent) GetAimlessKick() *GameEvent_AimlessKick {
+ if x, ok := x.GetEvent().(*GameEvent_AimlessKick_); ok {
+ return x.AimlessKick
+ }
+ return nil
+}
+
+func (x *GameEvent) GetAttackerTooCloseToDefenseArea() *GameEvent_AttackerTooCloseToDefenseArea {
+ if x, ok := x.GetEvent().(*GameEvent_AttackerTooCloseToDefenseArea_); ok {
+ return x.AttackerTooCloseToDefenseArea
+ }
+ return nil
+}
+
+func (x *GameEvent) GetDefenderInDefenseArea() *GameEvent_DefenderInDefenseArea {
+ if x, ok := x.GetEvent().(*GameEvent_DefenderInDefenseArea_); ok {
+ return x.DefenderInDefenseArea
+ }
+ return nil
+}
+
+func (x *GameEvent) GetBoundaryCrossing() *GameEvent_BoundaryCrossing {
+ if x, ok := x.GetEvent().(*GameEvent_BoundaryCrossing_); ok {
+ return x.BoundaryCrossing
+ }
+ return nil
+}
+
+func (x *GameEvent) GetKeeperHeldBall() *GameEvent_KeeperHeldBall {
+ if x, ok := x.GetEvent().(*GameEvent_KeeperHeldBall_); ok {
+ return x.KeeperHeldBall
+ }
+ return nil
+}
+
+func (x *GameEvent) GetBotDribbledBallTooFar() *GameEvent_BotDribbledBallTooFar {
+ if x, ok := x.GetEvent().(*GameEvent_BotDribbledBallTooFar_); ok {
+ return x.BotDribbledBallTooFar
+ }
+ return nil
+}
+
+func (x *GameEvent) GetBotPushedBot() *GameEvent_BotPushedBot {
+ if x, ok := x.GetEvent().(*GameEvent_BotPushedBot_); ok {
+ return x.BotPushedBot
+ }
+ return nil
+}
+
+func (x *GameEvent) GetBotHeldBallDeliberately() *GameEvent_BotHeldBallDeliberately {
+ if x, ok := x.GetEvent().(*GameEvent_BotHeldBallDeliberately_); ok {
+ return x.BotHeldBallDeliberately
+ }
+ return nil
+}
+
+func (x *GameEvent) GetBotTippedOver() *GameEvent_BotTippedOver {
+ if x, ok := x.GetEvent().(*GameEvent_BotTippedOver_); ok {
+ return x.BotTippedOver
+ }
+ return nil
+}
+
+func (x *GameEvent) GetAttackerTouchedBallInDefenseArea() *GameEvent_AttackerTouchedBallInDefenseArea {
+ if x, ok := x.GetEvent().(*GameEvent_AttackerTouchedBallInDefenseArea_); ok {
+ return x.AttackerTouchedBallInDefenseArea
+ }
+ return nil
+}
+
+func (x *GameEvent) GetBotKickedBallTooFast() *GameEvent_BotKickedBallTooFast {
+ if x, ok := x.GetEvent().(*GameEvent_BotKickedBallTooFast_); ok {
+ return x.BotKickedBallTooFast
+ }
+ return nil
+}
+
+func (x *GameEvent) GetBotCrashUnique() *GameEvent_BotCrashUnique {
+ if x, ok := x.GetEvent().(*GameEvent_BotCrashUnique_); ok {
+ return x.BotCrashUnique
+ }
+ return nil
+}
+
+func (x *GameEvent) GetBotCrashDrawn() *GameEvent_BotCrashDrawn {
+ if x, ok := x.GetEvent().(*GameEvent_BotCrashDrawn_); ok {
+ return x.BotCrashDrawn
+ }
+ return nil
+}
+
+func (x *GameEvent) GetDefenderTooCloseToKickPoint() *GameEvent_DefenderTooCloseToKickPoint {
+ if x, ok := x.GetEvent().(*GameEvent_DefenderTooCloseToKickPoint_); ok {
+ return x.DefenderTooCloseToKickPoint
+ }
+ return nil
+}
+
+func (x *GameEvent) GetBotTooFastInStop() *GameEvent_BotTooFastInStop {
+ if x, ok := x.GetEvent().(*GameEvent_BotTooFastInStop_); ok {
+ return x.BotTooFastInStop
+ }
+ return nil
+}
+
+func (x *GameEvent) GetBotInterferedPlacement() *GameEvent_BotInterferedPlacement {
+ if x, ok := x.GetEvent().(*GameEvent_BotInterferedPlacement_); ok {
+ return x.BotInterferedPlacement
+ }
+ return nil
+}
+
+func (x *GameEvent) GetPossibleGoal() *GameEvent_Goal {
+ if x, ok := x.GetEvent().(*GameEvent_PossibleGoal); ok {
+ return x.PossibleGoal
+ }
+ return nil
+}
+
+func (x *GameEvent) GetGoal() *GameEvent_Goal {
+ if x, ok := x.GetEvent().(*GameEvent_Goal_); ok {
+ return x.Goal
+ }
+ return nil
+}
+
+func (x *GameEvent) GetInvalidGoal() *GameEvent_Goal {
+ if x, ok := x.GetEvent().(*GameEvent_InvalidGoal); ok {
+ return x.InvalidGoal
+ }
+ return nil
+}
+
+func (x *GameEvent) GetAttackerDoubleTouchedBall() *GameEvent_AttackerDoubleTouchedBall {
+ if x, ok := x.GetEvent().(*GameEvent_AttackerDoubleTouchedBall_); ok {
+ return x.AttackerDoubleTouchedBall
+ }
+ return nil
+}
+
+func (x *GameEvent) GetPlacementSucceeded() *GameEvent_PlacementSucceeded {
+ if x, ok := x.GetEvent().(*GameEvent_PlacementSucceeded_); ok {
+ return x.PlacementSucceeded
+ }
+ return nil
+}
+
+func (x *GameEvent) GetPenaltyKickFailed() *GameEvent_PenaltyKickFailed {
+ if x, ok := x.GetEvent().(*GameEvent_PenaltyKickFailed_); ok {
+ return x.PenaltyKickFailed
+ }
+ return nil
+}
+
+func (x *GameEvent) GetNoProgressInGame() *GameEvent_NoProgressInGame {
+ if x, ok := x.GetEvent().(*GameEvent_NoProgressInGame_); ok {
+ return x.NoProgressInGame
+ }
+ return nil
+}
+
+func (x *GameEvent) GetPlacementFailed() *GameEvent_PlacementFailed {
+ if x, ok := x.GetEvent().(*GameEvent_PlacementFailed_); ok {
+ return x.PlacementFailed
+ }
+ return nil
+}
+
+func (x *GameEvent) GetMultipleCards() *GameEvent_MultipleCards {
+ if x, ok := x.GetEvent().(*GameEvent_MultipleCards_); ok {
+ return x.MultipleCards
+ }
+ return nil
+}
+
+func (x *GameEvent) GetMultipleFouls() *GameEvent_MultipleFouls {
+ if x, ok := x.GetEvent().(*GameEvent_MultipleFouls_); ok {
+ return x.MultipleFouls
+ }
+ return nil
+}
+
+func (x *GameEvent) GetBotSubstitution() *GameEvent_BotSubstitution {
+ if x, ok := x.GetEvent().(*GameEvent_BotSubstitution_); ok {
+ return x.BotSubstitution
+ }
+ return nil
+}
+
+func (x *GameEvent) GetTooManyRobots() *GameEvent_TooManyRobots {
+ if x, ok := x.GetEvent().(*GameEvent_TooManyRobots_); ok {
+ return x.TooManyRobots
+ }
+ return nil
+}
+
+func (x *GameEvent) GetChallengeFlag() *GameEvent_ChallengeFlag {
+ if x, ok := x.GetEvent().(*GameEvent_ChallengeFlag_); ok {
+ return x.ChallengeFlag
+ }
+ return nil
+}
+
+func (x *GameEvent) GetEmergencyStop() *GameEvent_EmergencyStop {
+ if x, ok := x.GetEvent().(*GameEvent_EmergencyStop_); ok {
+ return x.EmergencyStop
+ }
+ return nil
+}
+
+func (x *GameEvent) GetUnsportingBehaviorMinor() *GameEvent_UnsportingBehaviorMinor {
+ if x, ok := x.GetEvent().(*GameEvent_UnsportingBehaviorMinor_); ok {
+ return x.UnsportingBehaviorMinor
+ }
+ return nil
+}
+
+func (x *GameEvent) GetUnsportingBehaviorMajor() *GameEvent_UnsportingBehaviorMajor {
+ if x, ok := x.GetEvent().(*GameEvent_UnsportingBehaviorMajor_); ok {
+ return x.UnsportingBehaviorMajor
+ }
+ return nil
+}
+
+// Deprecated: Do not use.
+func (x *GameEvent) GetPrepared() *GameEvent_Prepared {
+ if x, ok := x.GetEvent().(*GameEvent_Prepared_); ok {
+ return x.Prepared
+ }
+ return nil
+}
+
+// Deprecated: Do not use.
+func (x *GameEvent) GetIndirectGoal() *GameEvent_IndirectGoal {
+ if x, ok := x.GetEvent().(*GameEvent_IndirectGoal_); ok {
+ return x.IndirectGoal
+ }
+ return nil
+}
+
+// Deprecated: Do not use.
+func (x *GameEvent) GetChippedGoal() *GameEvent_ChippedGoal {
+ if x, ok := x.GetEvent().(*GameEvent_ChippedGoal_); ok {
+ return x.ChippedGoal
+ }
+ return nil
+}
+
+// Deprecated: Do not use.
+func (x *GameEvent) GetKickTimeout() *GameEvent_KickTimeout {
+ if x, ok := x.GetEvent().(*GameEvent_KickTimeout_); ok {
+ return x.KickTimeout
+ }
+ return nil
+}
+
+// Deprecated: Do not use.
+func (x *GameEvent) GetAttackerTouchedOpponentInDefenseArea() *GameEvent_AttackerTouchedOpponentInDefenseArea {
+ if x, ok := x.GetEvent().(*GameEvent_AttackerTouchedOpponentInDefenseArea_); ok {
+ return x.AttackerTouchedOpponentInDefenseArea
+ }
+ return nil
+}
+
+// Deprecated: Do not use.
+func (x *GameEvent) GetAttackerTouchedOpponentInDefenseAreaSkipped() *GameEvent_AttackerTouchedOpponentInDefenseArea {
+ if x, ok := x.GetEvent().(*GameEvent_AttackerTouchedOpponentInDefenseAreaSkipped); ok {
+ return x.AttackerTouchedOpponentInDefenseAreaSkipped
+ }
+ return nil
+}
+
+// Deprecated: Do not use.
+func (x *GameEvent) GetBotCrashUniqueSkipped() *GameEvent_BotCrashUnique {
+ if x, ok := x.GetEvent().(*GameEvent_BotCrashUniqueSkipped); ok {
+ return x.BotCrashUniqueSkipped
+ }
+ return nil
+}
+
+// Deprecated: Do not use.
+func (x *GameEvent) GetBotPushedBotSkipped() *GameEvent_BotPushedBot {
+ if x, ok := x.GetEvent().(*GameEvent_BotPushedBotSkipped); ok {
+ return x.BotPushedBotSkipped
+ }
+ return nil
+}
+
+// Deprecated: Do not use.
+func (x *GameEvent) GetDefenderInDefenseAreaPartially() *GameEvent_DefenderInDefenseAreaPartially {
+ if x, ok := x.GetEvent().(*GameEvent_DefenderInDefenseAreaPartially_); ok {
+ return x.DefenderInDefenseAreaPartially
+ }
+ return nil
+}
+
+// Deprecated: Do not use.
+func (x *GameEvent) GetMultiplePlacementFailures() *GameEvent_MultiplePlacementFailures {
+ if x, ok := x.GetEvent().(*GameEvent_MultiplePlacementFailures_); ok {
+ return x.MultiplePlacementFailures
+ }
+ return nil
+}
+
+type isGameEvent_Event interface {
+ isGameEvent_Event()
+}
+
+type GameEvent_BallLeftFieldTouchLine struct {
+ BallLeftFieldTouchLine *GameEvent_BallLeftField `protobuf:"bytes,6,opt,name=ball_left_field_touch_line,json=ballLeftFieldTouchLine,oneof"`
+}
+
+type GameEvent_BallLeftFieldGoalLine struct {
+ BallLeftFieldGoalLine *GameEvent_BallLeftField `protobuf:"bytes,7,opt,name=ball_left_field_goal_line,json=ballLeftFieldGoalLine,oneof"`
+}
+
+type GameEvent_AimlessKick_ struct {
+ AimlessKick *GameEvent_AimlessKick `protobuf:"bytes,11,opt,name=aimless_kick,json=aimlessKick,oneof"`
+}
+
+type GameEvent_AttackerTooCloseToDefenseArea_ struct {
+ AttackerTooCloseToDefenseArea *GameEvent_AttackerTooCloseToDefenseArea `protobuf:"bytes,19,opt,name=attacker_too_close_to_defense_area,json=attackerTooCloseToDefenseArea,oneof"`
+}
+
+type GameEvent_DefenderInDefenseArea_ struct {
+ DefenderInDefenseArea *GameEvent_DefenderInDefenseArea `protobuf:"bytes,31,opt,name=defender_in_defense_area,json=defenderInDefenseArea,oneof"`
+}
+
+type GameEvent_BoundaryCrossing_ struct {
+ BoundaryCrossing *GameEvent_BoundaryCrossing `protobuf:"bytes,43,opt,name=boundary_crossing,json=boundaryCrossing,oneof"`
+}
+
+type GameEvent_KeeperHeldBall_ struct {
+ KeeperHeldBall *GameEvent_KeeperHeldBall `protobuf:"bytes,13,opt,name=keeper_held_ball,json=keeperHeldBall,oneof"`
+}
+
+type GameEvent_BotDribbledBallTooFar_ struct {
+ BotDribbledBallTooFar *GameEvent_BotDribbledBallTooFar `protobuf:"bytes,17,opt,name=bot_dribbled_ball_too_far,json=botDribbledBallTooFar,oneof"`
+}
+
+type GameEvent_BotPushedBot_ struct {
+ BotPushedBot *GameEvent_BotPushedBot `protobuf:"bytes,24,opt,name=bot_pushed_bot,json=botPushedBot,oneof"`
+}
+
+type GameEvent_BotHeldBallDeliberately_ struct {
+ BotHeldBallDeliberately *GameEvent_BotHeldBallDeliberately `protobuf:"bytes,26,opt,name=bot_held_ball_deliberately,json=botHeldBallDeliberately,oneof"`
+}
+
+type GameEvent_BotTippedOver_ struct {
+ BotTippedOver *GameEvent_BotTippedOver `protobuf:"bytes,27,opt,name=bot_tipped_over,json=botTippedOver,oneof"`
+}
+
+type GameEvent_AttackerTouchedBallInDefenseArea_ struct {
+ AttackerTouchedBallInDefenseArea *GameEvent_AttackerTouchedBallInDefenseArea `protobuf:"bytes,15,opt,name=attacker_touched_ball_in_defense_area,json=attackerTouchedBallInDefenseArea,oneof"`
+}
+
+type GameEvent_BotKickedBallTooFast_ struct {
+ BotKickedBallTooFast *GameEvent_BotKickedBallTooFast `protobuf:"bytes,18,opt,name=bot_kicked_ball_too_fast,json=botKickedBallTooFast,oneof"`
+}
+
+type GameEvent_BotCrashUnique_ struct {
+ BotCrashUnique *GameEvent_BotCrashUnique `protobuf:"bytes,22,opt,name=bot_crash_unique,json=botCrashUnique,oneof"`
+}
+
+type GameEvent_BotCrashDrawn_ struct {
+ BotCrashDrawn *GameEvent_BotCrashDrawn `protobuf:"bytes,21,opt,name=bot_crash_drawn,json=botCrashDrawn,oneof"`
+}
+
+type GameEvent_DefenderTooCloseToKickPoint_ struct {
+ DefenderTooCloseToKickPoint *GameEvent_DefenderTooCloseToKickPoint `protobuf:"bytes,29,opt,name=defender_too_close_to_kick_point,json=defenderTooCloseToKickPoint,oneof"`
+}
+
+type GameEvent_BotTooFastInStop_ struct {
+ BotTooFastInStop *GameEvent_BotTooFastInStop `protobuf:"bytes,28,opt,name=bot_too_fast_in_stop,json=botTooFastInStop,oneof"`
+}
+
+type GameEvent_BotInterferedPlacement_ struct {
+ BotInterferedPlacement *GameEvent_BotInterferedPlacement `protobuf:"bytes,20,opt,name=bot_interfered_placement,json=botInterferedPlacement,oneof"`
+}
+
+type GameEvent_PossibleGoal struct {
+ PossibleGoal *GameEvent_Goal `protobuf:"bytes,39,opt,name=possible_goal,json=possibleGoal,oneof"`
+}
+
+type GameEvent_Goal_ struct {
+ Goal *GameEvent_Goal `protobuf:"bytes,8,opt,name=goal,oneof"`
+}
+
+type GameEvent_InvalidGoal struct {
+ InvalidGoal *GameEvent_Goal `protobuf:"bytes,44,opt,name=invalid_goal,json=invalidGoal,oneof"`
+}
+
+type GameEvent_AttackerDoubleTouchedBall_ struct {
+ AttackerDoubleTouchedBall *GameEvent_AttackerDoubleTouchedBall `protobuf:"bytes,14,opt,name=attacker_double_touched_ball,json=attackerDoubleTouchedBall,oneof"`
+}
+
+type GameEvent_PlacementSucceeded_ struct {
+ PlacementSucceeded *GameEvent_PlacementSucceeded `protobuf:"bytes,5,opt,name=placement_succeeded,json=placementSucceeded,oneof"`
+}
+
+type GameEvent_PenaltyKickFailed_ struct {
+ PenaltyKickFailed *GameEvent_PenaltyKickFailed `protobuf:"bytes,45,opt,name=penalty_kick_failed,json=penaltyKickFailed,oneof"`
+}
+
+type GameEvent_NoProgressInGame_ struct {
+ NoProgressInGame *GameEvent_NoProgressInGame `protobuf:"bytes,2,opt,name=no_progress_in_game,json=noProgressInGame,oneof"`
+}
+
+type GameEvent_PlacementFailed_ struct {
+ PlacementFailed *GameEvent_PlacementFailed `protobuf:"bytes,3,opt,name=placement_failed,json=placementFailed,oneof"`
+}
+
+type GameEvent_MultipleCards_ struct {
+ MultipleCards *GameEvent_MultipleCards `protobuf:"bytes,32,opt,name=multiple_cards,json=multipleCards,oneof"`
+}
+
+type GameEvent_MultipleFouls_ struct {
+ MultipleFouls *GameEvent_MultipleFouls `protobuf:"bytes,34,opt,name=multiple_fouls,json=multipleFouls,oneof"`
+}
+
+type GameEvent_BotSubstitution_ struct {
+ BotSubstitution *GameEvent_BotSubstitution `protobuf:"bytes,37,opt,name=bot_substitution,json=botSubstitution,oneof"`
+}
+
+type GameEvent_TooManyRobots_ struct {
+ TooManyRobots *GameEvent_TooManyRobots `protobuf:"bytes,38,opt,name=too_many_robots,json=tooManyRobots,oneof"`
+}
+
+type GameEvent_ChallengeFlag_ struct {
+ ChallengeFlag *GameEvent_ChallengeFlag `protobuf:"bytes,46,opt,name=challenge_flag,json=challengeFlag,oneof"`
+}
+
+type GameEvent_EmergencyStop_ struct {
+ EmergencyStop *GameEvent_EmergencyStop `protobuf:"bytes,47,opt,name=emergency_stop,json=emergencyStop,oneof"`
+}
+
+type GameEvent_UnsportingBehaviorMinor_ struct {
+ UnsportingBehaviorMinor *GameEvent_UnsportingBehaviorMinor `protobuf:"bytes,35,opt,name=unsporting_behavior_minor,json=unsportingBehaviorMinor,oneof"`
+}
+
+type GameEvent_UnsportingBehaviorMajor_ struct {
+ UnsportingBehaviorMajor *GameEvent_UnsportingBehaviorMajor `protobuf:"bytes,36,opt,name=unsporting_behavior_major,json=unsportingBehaviorMajor,oneof"`
+}
+
+type GameEvent_Prepared_ struct {
+ // replaced by ready_to_continue flag
+ //
+ // Deprecated: Do not use.
+ Prepared *GameEvent_Prepared `protobuf:"bytes,1,opt,name=prepared,oneof"`
+}
+
+type GameEvent_IndirectGoal_ struct {
+ // obsolete
+ //
+ // Deprecated: Do not use.
+ IndirectGoal *GameEvent_IndirectGoal `protobuf:"bytes,9,opt,name=indirect_goal,json=indirectGoal,oneof"`
+}
+
+type GameEvent_ChippedGoal_ struct {
+ // replaced by the meta-information in the possible_goal event
+ //
+ // Deprecated: Do not use.
+ ChippedGoal *GameEvent_ChippedGoal `protobuf:"bytes,10,opt,name=chipped_goal,json=chippedGoal,oneof"`
+}
+
+type GameEvent_KickTimeout_ struct {
+ // obsolete
+ //
+ // Deprecated: Do not use.
+ KickTimeout *GameEvent_KickTimeout `protobuf:"bytes,12,opt,name=kick_timeout,json=kickTimeout,oneof"`
+}
+
+type GameEvent_AttackerTouchedOpponentInDefenseArea_ struct {
+ // rule removed
+ //
+ // Deprecated: Do not use.
+ AttackerTouchedOpponentInDefenseArea *GameEvent_AttackerTouchedOpponentInDefenseArea `protobuf:"bytes,16,opt,name=attacker_touched_opponent_in_defense_area,json=attackerTouchedOpponentInDefenseArea,oneof"`
+}
+
+type GameEvent_AttackerTouchedOpponentInDefenseAreaSkipped struct {
+ // obsolete
+ //
+ // Deprecated: Do not use.
+ AttackerTouchedOpponentInDefenseAreaSkipped *GameEvent_AttackerTouchedOpponentInDefenseArea `protobuf:"bytes,42,opt,name=attacker_touched_opponent_in_defense_area_skipped,json=attackerTouchedOpponentInDefenseAreaSkipped,oneof"`
+}
+
+type GameEvent_BotCrashUniqueSkipped struct {
+ // obsolete
+ //
+ // Deprecated: Do not use.
+ BotCrashUniqueSkipped *GameEvent_BotCrashUnique `protobuf:"bytes,23,opt,name=bot_crash_unique_skipped,json=botCrashUniqueSkipped,oneof"`
+}
+
+type GameEvent_BotPushedBotSkipped struct {
+ // can not be used as long as autoRefs do not judge pushing
+ //
+ // Deprecated: Do not use.
+ BotPushedBotSkipped *GameEvent_BotPushedBot `protobuf:"bytes,25,opt,name=bot_pushed_bot_skipped,json=botPushedBotSkipped,oneof"`
+}
+
+type GameEvent_DefenderInDefenseAreaPartially_ struct {
+ // rule removed
+ //
+ // Deprecated: Do not use.
+ DefenderInDefenseAreaPartially *GameEvent_DefenderInDefenseAreaPartially `protobuf:"bytes,30,opt,name=defender_in_defense_area_partially,json=defenderInDefenseAreaPartially,oneof"`
+}
+
+type GameEvent_MultiplePlacementFailures_ struct {
+ // the referee msg already indicates this
+ //
+ // Deprecated: Do not use.
+ MultiplePlacementFailures *GameEvent_MultiplePlacementFailures `protobuf:"bytes,33,opt,name=multiple_placement_failures,json=multiplePlacementFailures,oneof"`
+}
+
+func (*GameEvent_BallLeftFieldTouchLine) isGameEvent_Event() {}
+
+func (*GameEvent_BallLeftFieldGoalLine) isGameEvent_Event() {}
+
+func (*GameEvent_AimlessKick_) isGameEvent_Event() {}
+
+func (*GameEvent_AttackerTooCloseToDefenseArea_) isGameEvent_Event() {}
+
+func (*GameEvent_DefenderInDefenseArea_) isGameEvent_Event() {}
+
+func (*GameEvent_BoundaryCrossing_) isGameEvent_Event() {}
+
+func (*GameEvent_KeeperHeldBall_) isGameEvent_Event() {}
+
+func (*GameEvent_BotDribbledBallTooFar_) isGameEvent_Event() {}
+
+func (*GameEvent_BotPushedBot_) isGameEvent_Event() {}
+
+func (*GameEvent_BotHeldBallDeliberately_) isGameEvent_Event() {}
+
+func (*GameEvent_BotTippedOver_) isGameEvent_Event() {}
+
+func (*GameEvent_AttackerTouchedBallInDefenseArea_) isGameEvent_Event() {}
+
+func (*GameEvent_BotKickedBallTooFast_) isGameEvent_Event() {}
+
+func (*GameEvent_BotCrashUnique_) isGameEvent_Event() {}
+
+func (*GameEvent_BotCrashDrawn_) isGameEvent_Event() {}
+
+func (*GameEvent_DefenderTooCloseToKickPoint_) isGameEvent_Event() {}
+
+func (*GameEvent_BotTooFastInStop_) isGameEvent_Event() {}
+
+func (*GameEvent_BotInterferedPlacement_) isGameEvent_Event() {}
+
+func (*GameEvent_PossibleGoal) isGameEvent_Event() {}
+
+func (*GameEvent_Goal_) isGameEvent_Event() {}
+
+func (*GameEvent_InvalidGoal) isGameEvent_Event() {}
+
+func (*GameEvent_AttackerDoubleTouchedBall_) isGameEvent_Event() {}
+
+func (*GameEvent_PlacementSucceeded_) isGameEvent_Event() {}
+
+func (*GameEvent_PenaltyKickFailed_) isGameEvent_Event() {}
+
+func (*GameEvent_NoProgressInGame_) isGameEvent_Event() {}
+
+func (*GameEvent_PlacementFailed_) isGameEvent_Event() {}
+
+func (*GameEvent_MultipleCards_) isGameEvent_Event() {}
+
+func (*GameEvent_MultipleFouls_) isGameEvent_Event() {}
+
+func (*GameEvent_BotSubstitution_) isGameEvent_Event() {}
+
+func (*GameEvent_TooManyRobots_) isGameEvent_Event() {}
+
+func (*GameEvent_ChallengeFlag_) isGameEvent_Event() {}
+
+func (*GameEvent_EmergencyStop_) isGameEvent_Event() {}
+
+func (*GameEvent_UnsportingBehaviorMinor_) isGameEvent_Event() {}
+
+func (*GameEvent_UnsportingBehaviorMajor_) isGameEvent_Event() {}
+
+func (*GameEvent_Prepared_) isGameEvent_Event() {}
+
+func (*GameEvent_IndirectGoal_) isGameEvent_Event() {}
+
+func (*GameEvent_ChippedGoal_) isGameEvent_Event() {}
+
+func (*GameEvent_KickTimeout_) isGameEvent_Event() {}
+
+func (*GameEvent_AttackerTouchedOpponentInDefenseArea_) isGameEvent_Event() {}
+
+func (*GameEvent_AttackerTouchedOpponentInDefenseAreaSkipped) isGameEvent_Event() {}
+
+func (*GameEvent_BotCrashUniqueSkipped) isGameEvent_Event() {}
+
+func (*GameEvent_BotPushedBotSkipped) isGameEvent_Event() {}
+
+func (*GameEvent_DefenderInDefenseAreaPartially_) isGameEvent_Event() {}
+
+func (*GameEvent_MultiplePlacementFailures_) isGameEvent_Event() {}
+
+// the ball left the field normally
+type GameEvent_BallLeftField struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // the team that last touched the ball
+ ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"`
+ // the bot that last touched the ball
+ ByBot *uint32 `protobuf:"varint,2,opt,name=by_bot,json=byBot" json:"by_bot,omitempty"`
+ // the location where the ball left the field [m]
+ Location *geom.Vector2 `protobuf:"bytes,3,opt,name=location" json:"location,omitempty"`
+}
+
+func (x *GameEvent_BallLeftField) Reset() {
+ *x = GameEvent_BallLeftField{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[1]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GameEvent_BallLeftField) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GameEvent_BallLeftField) ProtoMessage() {}
+
+func (x *GameEvent_BallLeftField) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[1]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use GameEvent_BallLeftField.ProtoReflect.Descriptor instead.
+func (*GameEvent_BallLeftField) Descriptor() ([]byte, []int) {
+ return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 0}
+}
+
+func (x *GameEvent_BallLeftField) GetByTeam() Team {
+ if x != nil && x.ByTeam != nil {
+ return *x.ByTeam
+ }
+ return Team_UNKNOWN
+}
+
+func (x *GameEvent_BallLeftField) GetByBot() uint32 {
+ if x != nil && x.ByBot != nil {
+ return *x.ByBot
+ }
+ return 0
+}
+
+func (x *GameEvent_BallLeftField) GetLocation() *geom.Vector2 {
+ if x != nil {
+ return x.Location
+ }
+ return nil
+}
+
+// the ball left the field via goal line and a team committed an aimless kick
+type GameEvent_AimlessKick struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // the team that last touched the ball
+ ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"`
+ // the bot that last touched the ball
+ ByBot *uint32 `protobuf:"varint,2,opt,name=by_bot,json=byBot" json:"by_bot,omitempty"`
+ // the location where the ball left the field [m]
+ Location *geom.Vector2 `protobuf:"bytes,3,opt,name=location" json:"location,omitempty"`
+ // the location where the ball was last touched [m]
+ KickLocation *geom.Vector2 `protobuf:"bytes,4,opt,name=kick_location,json=kickLocation" json:"kick_location,omitempty"`
+}
+
+func (x *GameEvent_AimlessKick) Reset() {
+ *x = GameEvent_AimlessKick{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[2]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GameEvent_AimlessKick) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GameEvent_AimlessKick) ProtoMessage() {}
+
+func (x *GameEvent_AimlessKick) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[2]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use GameEvent_AimlessKick.ProtoReflect.Descriptor instead.
+func (*GameEvent_AimlessKick) Descriptor() ([]byte, []int) {
+ return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 1}
+}
+
+func (x *GameEvent_AimlessKick) GetByTeam() Team {
+ if x != nil && x.ByTeam != nil {
+ return *x.ByTeam
+ }
+ return Team_UNKNOWN
+}
+
+func (x *GameEvent_AimlessKick) GetByBot() uint32 {
+ if x != nil && x.ByBot != nil {
+ return *x.ByBot
+ }
+ return 0
+}
+
+func (x *GameEvent_AimlessKick) GetLocation() *geom.Vector2 {
+ if x != nil {
+ return x.Location
+ }
+ return nil
+}
+
+func (x *GameEvent_AimlessKick) GetKickLocation() *geom.Vector2 {
+ if x != nil {
+ return x.KickLocation
+ }
+ return nil
+}
+
+// a team shot a goal
+type GameEvent_Goal struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // the team that scored the goal
+ ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"`
+ // the team that shot the goal (different from by_team for own goals)
+ KickingTeam *Team `protobuf:"varint,6,opt,name=kicking_team,json=kickingTeam,enum=Team" json:"kicking_team,omitempty"`
+ // the bot that shot the goal
+ KickingBot *uint32 `protobuf:"varint,2,opt,name=kicking_bot,json=kickingBot" json:"kicking_bot,omitempty"`
+ // the location where the ball entered the goal [m]
+ Location *geom.Vector2 `protobuf:"bytes,3,opt,name=location" json:"location,omitempty"`
+ // the location where the ball was kicked (for deciding if this was a valid goal) [m]
+ KickLocation *geom.Vector2 `protobuf:"bytes,4,opt,name=kick_location,json=kickLocation" json:"kick_location,omitempty"`
+ // the maximum height the ball reached during the goal kick (for deciding if this was a valid goal) [m]
+ MaxBallHeight *float32 `protobuf:"fixed32,5,opt,name=max_ball_height,json=maxBallHeight" json:"max_ball_height,omitempty"`
+ // number of robots of scoring team when the ball entered the goal (for deciding if this was a valid goal)
+ NumRobotsByTeam *uint32 `protobuf:"varint,7,opt,name=num_robots_by_team,json=numRobotsByTeam" json:"num_robots_by_team,omitempty"`
+ // The UNIX timestamp [μs] when the scoring team last touched the ball
+ LastTouchByTeam *uint64 `protobuf:"varint,8,opt,name=last_touch_by_team,json=lastTouchByTeam" json:"last_touch_by_team,omitempty"`
+ // An additional message with e.g. a reason for invalid goals
+ Message *string `protobuf:"bytes,9,opt,name=message" json:"message,omitempty"`
+}
+
+func (x *GameEvent_Goal) Reset() {
+ *x = GameEvent_Goal{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[3]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GameEvent_Goal) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GameEvent_Goal) ProtoMessage() {}
+
+func (x *GameEvent_Goal) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[3]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use GameEvent_Goal.ProtoReflect.Descriptor instead.
+func (*GameEvent_Goal) Descriptor() ([]byte, []int) {
+ return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 2}
+}
+
+func (x *GameEvent_Goal) GetByTeam() Team {
+ if x != nil && x.ByTeam != nil {
+ return *x.ByTeam
+ }
+ return Team_UNKNOWN
+}
+
+func (x *GameEvent_Goal) GetKickingTeam() Team {
+ if x != nil && x.KickingTeam != nil {
+ return *x.KickingTeam
+ }
+ return Team_UNKNOWN
+}
+
+func (x *GameEvent_Goal) GetKickingBot() uint32 {
+ if x != nil && x.KickingBot != nil {
+ return *x.KickingBot
+ }
+ return 0
+}
+
+func (x *GameEvent_Goal) GetLocation() *geom.Vector2 {
+ if x != nil {
+ return x.Location
+ }
+ return nil
+}
+
+func (x *GameEvent_Goal) GetKickLocation() *geom.Vector2 {
+ if x != nil {
+ return x.KickLocation
+ }
+ return nil
+}
+
+func (x *GameEvent_Goal) GetMaxBallHeight() float32 {
+ if x != nil && x.MaxBallHeight != nil {
+ return *x.MaxBallHeight
+ }
+ return 0
+}
+
+func (x *GameEvent_Goal) GetNumRobotsByTeam() uint32 {
+ if x != nil && x.NumRobotsByTeam != nil {
+ return *x.NumRobotsByTeam
+ }
+ return 0
+}
+
+func (x *GameEvent_Goal) GetLastTouchByTeam() uint64 {
+ if x != nil && x.LastTouchByTeam != nil {
+ return *x.LastTouchByTeam
+ }
+ return 0
+}
+
+func (x *GameEvent_Goal) GetMessage() string {
+ if x != nil && x.Message != nil {
+ return *x.Message
+ }
+ return ""
+}
+
+// the ball entered the goal directly during an indirect free kick
+type GameEvent_IndirectGoal struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // the team that tried to shoot the goal
+ ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"`
+ // the bot that kicked the ball - at least the team must be set
+ ByBot *uint32 `protobuf:"varint,2,opt,name=by_bot,json=byBot" json:"by_bot,omitempty"`
+ // the location where the ball entered the goal [m]
+ Location *geom.Vector2 `protobuf:"bytes,3,opt,name=location" json:"location,omitempty"`
+ // the location where the ball was kicked [m]
+ KickLocation *geom.Vector2 `protobuf:"bytes,4,opt,name=kick_location,json=kickLocation" json:"kick_location,omitempty"`
+}
+
+func (x *GameEvent_IndirectGoal) Reset() {
+ *x = GameEvent_IndirectGoal{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[4]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GameEvent_IndirectGoal) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GameEvent_IndirectGoal) ProtoMessage() {}
+
+func (x *GameEvent_IndirectGoal) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[4]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use GameEvent_IndirectGoal.ProtoReflect.Descriptor instead.
+func (*GameEvent_IndirectGoal) Descriptor() ([]byte, []int) {
+ return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 3}
+}
+
+func (x *GameEvent_IndirectGoal) GetByTeam() Team {
+ if x != nil && x.ByTeam != nil {
+ return *x.ByTeam
+ }
+ return Team_UNKNOWN
+}
+
+func (x *GameEvent_IndirectGoal) GetByBot() uint32 {
+ if x != nil && x.ByBot != nil {
+ return *x.ByBot
+ }
+ return 0
+}
+
+func (x *GameEvent_IndirectGoal) GetLocation() *geom.Vector2 {
+ if x != nil {
+ return x.Location
+ }
+ return nil
+}
+
+func (x *GameEvent_IndirectGoal) GetKickLocation() *geom.Vector2 {
+ if x != nil {
+ return x.KickLocation
+ }
+ return nil
+}
+
+// the ball entered the goal, but was initially chipped
+type GameEvent_ChippedGoal struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // the team that tried to shoot the goal
+ ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"`
+ // the bot that kicked the ball
+ ByBot *uint32 `protobuf:"varint,2,opt,name=by_bot,json=byBot" json:"by_bot,omitempty"`
+ // the location where the ball entered the goal [m]
+ Location *geom.Vector2 `protobuf:"bytes,3,opt,name=location" json:"location,omitempty"`
+ // the location where the ball was kicked [m]
+ KickLocation *geom.Vector2 `protobuf:"bytes,4,opt,name=kick_location,json=kickLocation" json:"kick_location,omitempty"`
+ // the maximum height [m] of the ball, before it entered the goal and since the last kick [m]
+ MaxBallHeight *float32 `protobuf:"fixed32,5,opt,name=max_ball_height,json=maxBallHeight" json:"max_ball_height,omitempty"`
+}
+
+func (x *GameEvent_ChippedGoal) Reset() {
+ *x = GameEvent_ChippedGoal{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[5]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GameEvent_ChippedGoal) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GameEvent_ChippedGoal) ProtoMessage() {}
+
+func (x *GameEvent_ChippedGoal) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[5]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use GameEvent_ChippedGoal.ProtoReflect.Descriptor instead.
+func (*GameEvent_ChippedGoal) Descriptor() ([]byte, []int) {
+ return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 4}
+}
+
+func (x *GameEvent_ChippedGoal) GetByTeam() Team {
+ if x != nil && x.ByTeam != nil {
+ return *x.ByTeam
+ }
+ return Team_UNKNOWN
+}
+
+func (x *GameEvent_ChippedGoal) GetByBot() uint32 {
+ if x != nil && x.ByBot != nil {
+ return *x.ByBot
+ }
+ return 0
+}
+
+func (x *GameEvent_ChippedGoal) GetLocation() *geom.Vector2 {
+ if x != nil {
+ return x.Location
+ }
+ return nil
+}
+
+func (x *GameEvent_ChippedGoal) GetKickLocation() *geom.Vector2 {
+ if x != nil {
+ return x.KickLocation
+ }
+ return nil
+}
+
+func (x *GameEvent_ChippedGoal) GetMaxBallHeight() float32 {
+ if x != nil && x.MaxBallHeight != nil {
+ return *x.MaxBallHeight
+ }
+ return 0
+}
+
+// a bot moved too fast while the game was stopped
+type GameEvent_BotTooFastInStop struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // the team that found guilty
+ ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"`
+ // the bot that was too fast
+ ByBot *uint32 `protobuf:"varint,2,opt,name=by_bot,json=byBot" json:"by_bot,omitempty"`
+ // the location of the bot [m]
+ Location *geom.Vector2 `protobuf:"bytes,3,opt,name=location" json:"location,omitempty"`
+ // the bot speed [m/s]
+ Speed *float32 `protobuf:"fixed32,4,opt,name=speed" json:"speed,omitempty"`
+}
+
+func (x *GameEvent_BotTooFastInStop) Reset() {
+ *x = GameEvent_BotTooFastInStop{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[6]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GameEvent_BotTooFastInStop) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GameEvent_BotTooFastInStop) ProtoMessage() {}
+
+func (x *GameEvent_BotTooFastInStop) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[6]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use GameEvent_BotTooFastInStop.ProtoReflect.Descriptor instead.
+func (*GameEvent_BotTooFastInStop) Descriptor() ([]byte, []int) {
+ return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 5}
+}
+
+func (x *GameEvent_BotTooFastInStop) GetByTeam() Team {
+ if x != nil && x.ByTeam != nil {
+ return *x.ByTeam
+ }
+ return Team_UNKNOWN
+}
+
+func (x *GameEvent_BotTooFastInStop) GetByBot() uint32 {
+ if x != nil && x.ByBot != nil {
+ return *x.ByBot
+ }
+ return 0
+}
+
+func (x *GameEvent_BotTooFastInStop) GetLocation() *geom.Vector2 {
+ if x != nil {
+ return x.Location
+ }
+ return nil
+}
+
+func (x *GameEvent_BotTooFastInStop) GetSpeed() float32 {
+ if x != nil && x.Speed != nil {
+ return *x.Speed
+ }
+ return 0
+}
+
+// a bot of the defending team got too close to the kick point during a free kick
+type GameEvent_DefenderTooCloseToKickPoint struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // the team that was found guilty
+ ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"`
+ // the bot that violates the distance to the kick point
+ ByBot *uint32 `protobuf:"varint,2,opt,name=by_bot,json=byBot" json:"by_bot,omitempty"`
+ // the location of the bot [m]
+ Location *geom.Vector2 `protobuf:"bytes,3,opt,name=location" json:"location,omitempty"`
+ // the distance [m] from bot to the kick point (including the minimum radius)
+ Distance *float32 `protobuf:"fixed32,4,opt,name=distance" json:"distance,omitempty"`
+}
+
+func (x *GameEvent_DefenderTooCloseToKickPoint) Reset() {
+ *x = GameEvent_DefenderTooCloseToKickPoint{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[7]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GameEvent_DefenderTooCloseToKickPoint) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GameEvent_DefenderTooCloseToKickPoint) ProtoMessage() {}
+
+func (x *GameEvent_DefenderTooCloseToKickPoint) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[7]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use GameEvent_DefenderTooCloseToKickPoint.ProtoReflect.Descriptor instead.
+func (*GameEvent_DefenderTooCloseToKickPoint) Descriptor() ([]byte, []int) {
+ return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 6}
+}
+
+func (x *GameEvent_DefenderTooCloseToKickPoint) GetByTeam() Team {
+ if x != nil && x.ByTeam != nil {
+ return *x.ByTeam
+ }
+ return Team_UNKNOWN
+}
+
+func (x *GameEvent_DefenderTooCloseToKickPoint) GetByBot() uint32 {
+ if x != nil && x.ByBot != nil {
+ return *x.ByBot
+ }
+ return 0
+}
+
+func (x *GameEvent_DefenderTooCloseToKickPoint) GetLocation() *geom.Vector2 {
+ if x != nil {
+ return x.Location
+ }
+ return nil
+}
+
+func (x *GameEvent_DefenderTooCloseToKickPoint) GetDistance() float32 {
+ if x != nil && x.Distance != nil {
+ return *x.Distance
+ }
+ return 0
+}
+
+// two robots crashed into each other with similar speeds
+type GameEvent_BotCrashDrawn struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // the bot of the yellow team
+ BotYellow *uint32 `protobuf:"varint,1,opt,name=bot_yellow,json=botYellow" json:"bot_yellow,omitempty"`
+ // the bot of the blue team
+ BotBlue *uint32 `protobuf:"varint,2,opt,name=bot_blue,json=botBlue" json:"bot_blue,omitempty"`
+ // the location of the crash (center between both bots) [m]
+ Location *geom.Vector2 `protobuf:"bytes,3,opt,name=location" json:"location,omitempty"`
+ // the calculated crash speed [m/s] of the two bots
+ CrashSpeed *float32 `protobuf:"fixed32,4,opt,name=crash_speed,json=crashSpeed" json:"crash_speed,omitempty"`
+ // the difference [m/s] of the velocity of the two bots
+ SpeedDiff *float32 `protobuf:"fixed32,5,opt,name=speed_diff,json=speedDiff" json:"speed_diff,omitempty"`
+ // the angle [rad] in the range [0, π] of the bot velocity vectors
+ // an angle of 0 rad ( 0°) means, the bots barely touched each other
+ // an angle of π rad (180°) means, the bots crashed frontal into each other
+ CrashAngle *float32 `protobuf:"fixed32,6,opt,name=crash_angle,json=crashAngle" json:"crash_angle,omitempty"`
+}
+
+func (x *GameEvent_BotCrashDrawn) Reset() {
+ *x = GameEvent_BotCrashDrawn{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[8]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GameEvent_BotCrashDrawn) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GameEvent_BotCrashDrawn) ProtoMessage() {}
+
+func (x *GameEvent_BotCrashDrawn) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[8]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use GameEvent_BotCrashDrawn.ProtoReflect.Descriptor instead.
+func (*GameEvent_BotCrashDrawn) Descriptor() ([]byte, []int) {
+ return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 7}
+}
+
+func (x *GameEvent_BotCrashDrawn) GetBotYellow() uint32 {
+ if x != nil && x.BotYellow != nil {
+ return *x.BotYellow
+ }
+ return 0
+}
+
+func (x *GameEvent_BotCrashDrawn) GetBotBlue() uint32 {
+ if x != nil && x.BotBlue != nil {
+ return *x.BotBlue
+ }
+ return 0
+}
+
+func (x *GameEvent_BotCrashDrawn) GetLocation() *geom.Vector2 {
+ if x != nil {
+ return x.Location
+ }
+ return nil
+}
+
+func (x *GameEvent_BotCrashDrawn) GetCrashSpeed() float32 {
+ if x != nil && x.CrashSpeed != nil {
+ return *x.CrashSpeed
+ }
+ return 0
+}
+
+func (x *GameEvent_BotCrashDrawn) GetSpeedDiff() float32 {
+ if x != nil && x.SpeedDiff != nil {
+ return *x.SpeedDiff
+ }
+ return 0
+}
+
+func (x *GameEvent_BotCrashDrawn) GetCrashAngle() float32 {
+ if x != nil && x.CrashAngle != nil {
+ return *x.CrashAngle
+ }
+ return 0
+}
+
+// two robots crashed into each other and one team was found guilty to due significant speed difference
+type GameEvent_BotCrashUnique struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // the team that caused the crash
+ ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"`
+ // the bot that caused the crash
+ Violator *uint32 `protobuf:"varint,2,opt,name=violator" json:"violator,omitempty"`
+ // the bot of the opposite team that was involved in the crash
+ Victim *uint32 `protobuf:"varint,3,opt,name=victim" json:"victim,omitempty"`
+ // the location of the crash (center between both bots) [m]
+ Location *geom.Vector2 `protobuf:"bytes,4,opt,name=location" json:"location,omitempty"`
+ // the calculated crash speed vector [m/s] of the two bots
+ CrashSpeed *float32 `protobuf:"fixed32,5,opt,name=crash_speed,json=crashSpeed" json:"crash_speed,omitempty"`
+ // the difference [m/s] of the velocity of the two bots
+ SpeedDiff *float32 `protobuf:"fixed32,6,opt,name=speed_diff,json=speedDiff" json:"speed_diff,omitempty"`
+ // the angle [rad] in the range [0, π] of the bot velocity vectors
+ // an angle of 0 rad ( 0°) means, the bots barely touched each other
+ // an angle of π rad (180°) means, the bots crashed frontal into each other
+ CrashAngle *float32 `protobuf:"fixed32,7,opt,name=crash_angle,json=crashAngle" json:"crash_angle,omitempty"`
+}
+
+func (x *GameEvent_BotCrashUnique) Reset() {
+ *x = GameEvent_BotCrashUnique{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[9]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GameEvent_BotCrashUnique) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GameEvent_BotCrashUnique) ProtoMessage() {}
+
+func (x *GameEvent_BotCrashUnique) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[9]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use GameEvent_BotCrashUnique.ProtoReflect.Descriptor instead.
+func (*GameEvent_BotCrashUnique) Descriptor() ([]byte, []int) {
+ return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 8}
+}
+
+func (x *GameEvent_BotCrashUnique) GetByTeam() Team {
+ if x != nil && x.ByTeam != nil {
+ return *x.ByTeam
+ }
+ return Team_UNKNOWN
+}
+
+func (x *GameEvent_BotCrashUnique) GetViolator() uint32 {
+ if x != nil && x.Violator != nil {
+ return *x.Violator
+ }
+ return 0
+}
+
+func (x *GameEvent_BotCrashUnique) GetVictim() uint32 {
+ if x != nil && x.Victim != nil {
+ return *x.Victim
+ }
+ return 0
+}
+
+func (x *GameEvent_BotCrashUnique) GetLocation() *geom.Vector2 {
+ if x != nil {
+ return x.Location
+ }
+ return nil
+}
+
+func (x *GameEvent_BotCrashUnique) GetCrashSpeed() float32 {
+ if x != nil && x.CrashSpeed != nil {
+ return *x.CrashSpeed
+ }
+ return 0
+}
+
+func (x *GameEvent_BotCrashUnique) GetSpeedDiff() float32 {
+ if x != nil && x.SpeedDiff != nil {
+ return *x.SpeedDiff
+ }
+ return 0
+}
+
+func (x *GameEvent_BotCrashUnique) GetCrashAngle() float32 {
+ if x != nil && x.CrashAngle != nil {
+ return *x.CrashAngle
+ }
+ return 0
+}
+
+// a bot pushed another bot over a significant distance
+type GameEvent_BotPushedBot struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // the team that pushed the other team
+ ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"`
+ // the bot that pushed the other bot
+ Violator *uint32 `protobuf:"varint,2,opt,name=violator" json:"violator,omitempty"`
+ // the bot of the opposite team that was pushed
+ Victim *uint32 `protobuf:"varint,3,opt,name=victim" json:"victim,omitempty"`
+ // the location of the push (center between both bots) [m]
+ Location *geom.Vector2 `protobuf:"bytes,4,opt,name=location" json:"location,omitempty"`
+ // the pushed distance [m]
+ PushedDistance *float32 `protobuf:"fixed32,5,opt,name=pushed_distance,json=pushedDistance" json:"pushed_distance,omitempty"`
+}
+
+func (x *GameEvent_BotPushedBot) Reset() {
+ *x = GameEvent_BotPushedBot{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[10]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GameEvent_BotPushedBot) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GameEvent_BotPushedBot) ProtoMessage() {}
+
+func (x *GameEvent_BotPushedBot) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[10]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use GameEvent_BotPushedBot.ProtoReflect.Descriptor instead.
+func (*GameEvent_BotPushedBot) Descriptor() ([]byte, []int) {
+ return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 9}
+}
+
+func (x *GameEvent_BotPushedBot) GetByTeam() Team {
+ if x != nil && x.ByTeam != nil {
+ return *x.ByTeam
+ }
+ return Team_UNKNOWN
+}
+
+func (x *GameEvent_BotPushedBot) GetViolator() uint32 {
+ if x != nil && x.Violator != nil {
+ return *x.Violator
+ }
+ return 0
+}
+
+func (x *GameEvent_BotPushedBot) GetVictim() uint32 {
+ if x != nil && x.Victim != nil {
+ return *x.Victim
+ }
+ return 0
+}
+
+func (x *GameEvent_BotPushedBot) GetLocation() *geom.Vector2 {
+ if x != nil {
+ return x.Location
+ }
+ return nil
+}
+
+func (x *GameEvent_BotPushedBot) GetPushedDistance() float32 {
+ if x != nil && x.PushedDistance != nil {
+ return *x.PushedDistance
+ }
+ return 0
+}
+
+// a bot tipped over
+type GameEvent_BotTippedOver struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // the team that found guilty
+ ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"`
+ // the bot that tipped over
+ ByBot *uint32 `protobuf:"varint,2,opt,name=by_bot,json=byBot" json:"by_bot,omitempty"`
+ // the location of the bot [m]
+ Location *geom.Vector2 `protobuf:"bytes,3,opt,name=location" json:"location,omitempty"`
+ // the location of the ball at the moment when this foul occurred [m]
+ BallLocation *geom.Vector2 `protobuf:"bytes,4,opt,name=ball_location,json=ballLocation" json:"ball_location,omitempty"`
+}
+
+func (x *GameEvent_BotTippedOver) Reset() {
+ *x = GameEvent_BotTippedOver{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[11]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GameEvent_BotTippedOver) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GameEvent_BotTippedOver) ProtoMessage() {}
+
+func (x *GameEvent_BotTippedOver) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[11]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use GameEvent_BotTippedOver.ProtoReflect.Descriptor instead.
+func (*GameEvent_BotTippedOver) Descriptor() ([]byte, []int) {
+ return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 10}
+}
+
+func (x *GameEvent_BotTippedOver) GetByTeam() Team {
+ if x != nil && x.ByTeam != nil {
+ return *x.ByTeam
+ }
+ return Team_UNKNOWN
+}
+
+func (x *GameEvent_BotTippedOver) GetByBot() uint32 {
+ if x != nil && x.ByBot != nil {
+ return *x.ByBot
+ }
+ return 0
+}
+
+func (x *GameEvent_BotTippedOver) GetLocation() *geom.Vector2 {
+ if x != nil {
+ return x.Location
+ }
+ return nil
+}
+
+func (x *GameEvent_BotTippedOver) GetBallLocation() *geom.Vector2 {
+ if x != nil {
+ return x.BallLocation
+ }
+ return nil
+}
+
+// a defender other than the keeper was fully located inside its own defense and touched the ball
+type GameEvent_DefenderInDefenseArea struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // the team that found guilty
+ ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"`
+ // the bot that is inside the penalty area
+ ByBot *uint32 `protobuf:"varint,2,opt,name=by_bot,json=byBot" json:"by_bot,omitempty"`
+ // the location of the bot [m]
+ Location *geom.Vector2 `protobuf:"bytes,3,opt,name=location" json:"location,omitempty"`
+ // the distance [m] from bot case to the nearest point outside the defense area
+ Distance *float32 `protobuf:"fixed32,4,opt,name=distance" json:"distance,omitempty"`
+}
+
+func (x *GameEvent_DefenderInDefenseArea) Reset() {
+ *x = GameEvent_DefenderInDefenseArea{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[12]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GameEvent_DefenderInDefenseArea) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GameEvent_DefenderInDefenseArea) ProtoMessage() {}
+
+func (x *GameEvent_DefenderInDefenseArea) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[12]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use GameEvent_DefenderInDefenseArea.ProtoReflect.Descriptor instead.
+func (*GameEvent_DefenderInDefenseArea) Descriptor() ([]byte, []int) {
+ return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 11}
+}
+
+func (x *GameEvent_DefenderInDefenseArea) GetByTeam() Team {
+ if x != nil && x.ByTeam != nil {
+ return *x.ByTeam
+ }
+ return Team_UNKNOWN
+}
+
+func (x *GameEvent_DefenderInDefenseArea) GetByBot() uint32 {
+ if x != nil && x.ByBot != nil {
+ return *x.ByBot
+ }
+ return 0
+}
+
+func (x *GameEvent_DefenderInDefenseArea) GetLocation() *geom.Vector2 {
+ if x != nil {
+ return x.Location
+ }
+ return nil
+}
+
+func (x *GameEvent_DefenderInDefenseArea) GetDistance() float32 {
+ if x != nil && x.Distance != nil {
+ return *x.Distance
+ }
+ return 0
+}
+
+// a defender other than the keeper was partially located inside its own defense area and touched the ball
+type GameEvent_DefenderInDefenseAreaPartially struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // the team that found guilty
+ ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"`
+ // the bot that is partially inside the penalty area
+ ByBot *uint32 `protobuf:"varint,2,opt,name=by_bot,json=byBot" json:"by_bot,omitempty"`
+ // the location of the bot
+ Location *geom.Vector2 `protobuf:"bytes,3,opt,name=location" json:"location,omitempty"`
+ // the distance [m] that the bot is inside the penalty area
+ Distance *float32 `protobuf:"fixed32,4,opt,name=distance" json:"distance,omitempty"`
+ // the location of the ball at the moment when this foul occurred [m]
+ BallLocation *geom.Vector2 `protobuf:"bytes,5,opt,name=ball_location,json=ballLocation" json:"ball_location,omitempty"`
+}
+
+func (x *GameEvent_DefenderInDefenseAreaPartially) Reset() {
+ *x = GameEvent_DefenderInDefenseAreaPartially{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[13]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GameEvent_DefenderInDefenseAreaPartially) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GameEvent_DefenderInDefenseAreaPartially) ProtoMessage() {}
+
+func (x *GameEvent_DefenderInDefenseAreaPartially) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[13]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use GameEvent_DefenderInDefenseAreaPartially.ProtoReflect.Descriptor instead.
+func (*GameEvent_DefenderInDefenseAreaPartially) Descriptor() ([]byte, []int) {
+ return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 12}
+}
+
+func (x *GameEvent_DefenderInDefenseAreaPartially) GetByTeam() Team {
+ if x != nil && x.ByTeam != nil {
+ return *x.ByTeam
+ }
+ return Team_UNKNOWN
+}
+
+func (x *GameEvent_DefenderInDefenseAreaPartially) GetByBot() uint32 {
+ if x != nil && x.ByBot != nil {
+ return *x.ByBot
+ }
+ return 0
+}
+
+func (x *GameEvent_DefenderInDefenseAreaPartially) GetLocation() *geom.Vector2 {
+ if x != nil {
+ return x.Location
+ }
+ return nil
+}
+
+func (x *GameEvent_DefenderInDefenseAreaPartially) GetDistance() float32 {
+ if x != nil && x.Distance != nil {
+ return *x.Distance
+ }
+ return 0
+}
+
+func (x *GameEvent_DefenderInDefenseAreaPartially) GetBallLocation() *geom.Vector2 {
+ if x != nil {
+ return x.BallLocation
+ }
+ return nil
+}
+
+// an attacker touched the ball inside the opponent defense area
+type GameEvent_AttackerTouchedBallInDefenseArea struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // the team that found guilty
+ ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"`
+ // the bot that is inside the penalty area
+ ByBot *uint32 `protobuf:"varint,2,opt,name=by_bot,json=byBot" json:"by_bot,omitempty"`
+ // the location of the bot [m]
+ Location *geom.Vector2 `protobuf:"bytes,3,opt,name=location" json:"location,omitempty"`
+ // the distance [m] that the bot is inside the penalty area
+ Distance *float32 `protobuf:"fixed32,4,opt,name=distance" json:"distance,omitempty"`
+}
+
+func (x *GameEvent_AttackerTouchedBallInDefenseArea) Reset() {
+ *x = GameEvent_AttackerTouchedBallInDefenseArea{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[14]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GameEvent_AttackerTouchedBallInDefenseArea) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GameEvent_AttackerTouchedBallInDefenseArea) ProtoMessage() {}
+
+func (x *GameEvent_AttackerTouchedBallInDefenseArea) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[14]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use GameEvent_AttackerTouchedBallInDefenseArea.ProtoReflect.Descriptor instead.
+func (*GameEvent_AttackerTouchedBallInDefenseArea) Descriptor() ([]byte, []int) {
+ return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 13}
+}
+
+func (x *GameEvent_AttackerTouchedBallInDefenseArea) GetByTeam() Team {
+ if x != nil && x.ByTeam != nil {
+ return *x.ByTeam
+ }
+ return Team_UNKNOWN
+}
+
+func (x *GameEvent_AttackerTouchedBallInDefenseArea) GetByBot() uint32 {
+ if x != nil && x.ByBot != nil {
+ return *x.ByBot
+ }
+ return 0
+}
+
+func (x *GameEvent_AttackerTouchedBallInDefenseArea) GetLocation() *geom.Vector2 {
+ if x != nil {
+ return x.Location
+ }
+ return nil
+}
+
+func (x *GameEvent_AttackerTouchedBallInDefenseArea) GetDistance() float32 {
+ if x != nil && x.Distance != nil {
+ return *x.Distance
+ }
+ return 0
+}
+
+// a bot kicked the ball too fast
+type GameEvent_BotKickedBallTooFast struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // the team that found guilty
+ ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"`
+ // the bot that kicked too fast
+ ByBot *uint32 `protobuf:"varint,2,opt,name=by_bot,json=byBot" json:"by_bot,omitempty"`
+ // the location of the ball at the time of the highest speed [m]
+ Location *geom.Vector2 `protobuf:"bytes,3,opt,name=location" json:"location,omitempty"`
+ // the absolute initial ball speed (kick speed) [m/s]
+ InitialBallSpeed *float32 `protobuf:"fixed32,4,opt,name=initial_ball_speed,json=initialBallSpeed" json:"initial_ball_speed,omitempty"`
+ // was the ball chipped?
+ Chipped *bool `protobuf:"varint,5,opt,name=chipped" json:"chipped,omitempty"`
+}
+
+func (x *GameEvent_BotKickedBallTooFast) Reset() {
+ *x = GameEvent_BotKickedBallTooFast{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[15]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GameEvent_BotKickedBallTooFast) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GameEvent_BotKickedBallTooFast) ProtoMessage() {}
+
+func (x *GameEvent_BotKickedBallTooFast) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[15]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use GameEvent_BotKickedBallTooFast.ProtoReflect.Descriptor instead.
+func (*GameEvent_BotKickedBallTooFast) Descriptor() ([]byte, []int) {
+ return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 14}
+}
+
+func (x *GameEvent_BotKickedBallTooFast) GetByTeam() Team {
+ if x != nil && x.ByTeam != nil {
+ return *x.ByTeam
+ }
+ return Team_UNKNOWN
+}
+
+func (x *GameEvent_BotKickedBallTooFast) GetByBot() uint32 {
+ if x != nil && x.ByBot != nil {
+ return *x.ByBot
+ }
+ return 0
+}
+
+func (x *GameEvent_BotKickedBallTooFast) GetLocation() *geom.Vector2 {
+ if x != nil {
+ return x.Location
+ }
+ return nil
+}
+
+func (x *GameEvent_BotKickedBallTooFast) GetInitialBallSpeed() float32 {
+ if x != nil && x.InitialBallSpeed != nil {
+ return *x.InitialBallSpeed
+ }
+ return 0
+}
+
+func (x *GameEvent_BotKickedBallTooFast) GetChipped() bool {
+ if x != nil && x.Chipped != nil {
+ return *x.Chipped
+ }
+ return false
+}
+
+// a bot dribbled to ball too far
+type GameEvent_BotDribbledBallTooFar struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // the team that found guilty
+ ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"`
+ // the bot that dribbled too far
+ ByBot *uint32 `protobuf:"varint,2,opt,name=by_bot,json=byBot" json:"by_bot,omitempty"`
+ // the location where the dribbling started [m]
+ Start *geom.Vector2 `protobuf:"bytes,3,opt,name=start" json:"start,omitempty"`
+ // the location where the maximum dribbling distance was reached [m]
+ End *geom.Vector2 `protobuf:"bytes,4,opt,name=end" json:"end,omitempty"`
+}
+
+func (x *GameEvent_BotDribbledBallTooFar) Reset() {
+ *x = GameEvent_BotDribbledBallTooFar{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[16]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GameEvent_BotDribbledBallTooFar) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GameEvent_BotDribbledBallTooFar) ProtoMessage() {}
+
+func (x *GameEvent_BotDribbledBallTooFar) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[16]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use GameEvent_BotDribbledBallTooFar.ProtoReflect.Descriptor instead.
+func (*GameEvent_BotDribbledBallTooFar) Descriptor() ([]byte, []int) {
+ return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 15}
+}
+
+func (x *GameEvent_BotDribbledBallTooFar) GetByTeam() Team {
+ if x != nil && x.ByTeam != nil {
+ return *x.ByTeam
+ }
+ return Team_UNKNOWN
+}
+
+func (x *GameEvent_BotDribbledBallTooFar) GetByBot() uint32 {
+ if x != nil && x.ByBot != nil {
+ return *x.ByBot
+ }
+ return 0
+}
+
+func (x *GameEvent_BotDribbledBallTooFar) GetStart() *geom.Vector2 {
+ if x != nil {
+ return x.Start
+ }
+ return nil
+}
+
+func (x *GameEvent_BotDribbledBallTooFar) GetEnd() *geom.Vector2 {
+ if x != nil {
+ return x.End
+ }
+ return nil
+}
+
+// an attacker touched the opponent robot inside defense area
+type GameEvent_AttackerTouchedOpponentInDefenseArea struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // the team that found guilty
+ ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"`
+ // the bot that touched the opponent robot
+ ByBot *uint32 `protobuf:"varint,2,opt,name=by_bot,json=byBot" json:"by_bot,omitempty"`
+ // the bot of the opposite team that was touched
+ Victim *uint32 `protobuf:"varint,4,opt,name=victim" json:"victim,omitempty"`
+ // the location of the contact point between both bots [m]
+ Location *geom.Vector2 `protobuf:"bytes,3,opt,name=location" json:"location,omitempty"`
+}
+
+func (x *GameEvent_AttackerTouchedOpponentInDefenseArea) Reset() {
+ *x = GameEvent_AttackerTouchedOpponentInDefenseArea{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[17]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GameEvent_AttackerTouchedOpponentInDefenseArea) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GameEvent_AttackerTouchedOpponentInDefenseArea) ProtoMessage() {}
+
+func (x *GameEvent_AttackerTouchedOpponentInDefenseArea) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[17]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use GameEvent_AttackerTouchedOpponentInDefenseArea.ProtoReflect.Descriptor instead.
+func (*GameEvent_AttackerTouchedOpponentInDefenseArea) Descriptor() ([]byte, []int) {
+ return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 16}
+}
+
+func (x *GameEvent_AttackerTouchedOpponentInDefenseArea) GetByTeam() Team {
+ if x != nil && x.ByTeam != nil {
+ return *x.ByTeam
+ }
+ return Team_UNKNOWN
+}
+
+func (x *GameEvent_AttackerTouchedOpponentInDefenseArea) GetByBot() uint32 {
+ if x != nil && x.ByBot != nil {
+ return *x.ByBot
+ }
+ return 0
+}
+
+func (x *GameEvent_AttackerTouchedOpponentInDefenseArea) GetVictim() uint32 {
+ if x != nil && x.Victim != nil {
+ return *x.Victim
+ }
+ return 0
+}
+
+func (x *GameEvent_AttackerTouchedOpponentInDefenseArea) GetLocation() *geom.Vector2 {
+ if x != nil {
+ return x.Location
+ }
+ return nil
+}
+
+// an attacker touched the ball multiple times when it was not allowed to
+type GameEvent_AttackerDoubleTouchedBall struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // the team that found guilty
+ ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"`
+ // the bot that touched the ball twice
+ ByBot *uint32 `protobuf:"varint,2,opt,name=by_bot,json=byBot" json:"by_bot,omitempty"`
+ // the location of the ball when it was first touched [m]
+ Location *geom.Vector2 `protobuf:"bytes,3,opt,name=location" json:"location,omitempty"`
+}
+
+func (x *GameEvent_AttackerDoubleTouchedBall) Reset() {
+ *x = GameEvent_AttackerDoubleTouchedBall{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[18]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GameEvent_AttackerDoubleTouchedBall) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GameEvent_AttackerDoubleTouchedBall) ProtoMessage() {}
+
+func (x *GameEvent_AttackerDoubleTouchedBall) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[18]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use GameEvent_AttackerDoubleTouchedBall.ProtoReflect.Descriptor instead.
+func (*GameEvent_AttackerDoubleTouchedBall) Descriptor() ([]byte, []int) {
+ return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 17}
+}
+
+func (x *GameEvent_AttackerDoubleTouchedBall) GetByTeam() Team {
+ if x != nil && x.ByTeam != nil {
+ return *x.ByTeam
+ }
+ return Team_UNKNOWN
+}
+
+func (x *GameEvent_AttackerDoubleTouchedBall) GetByBot() uint32 {
+ if x != nil && x.ByBot != nil {
+ return *x.ByBot
+ }
+ return 0
+}
+
+func (x *GameEvent_AttackerDoubleTouchedBall) GetLocation() *geom.Vector2 {
+ if x != nil {
+ return x.Location
+ }
+ return nil
+}
+
+// an attacker was located too near to the opponent defense area during stop or free kick
+type GameEvent_AttackerTooCloseToDefenseArea struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // the team that found guilty
+ ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"`
+ // the bot that is too close to the defense area
+ ByBot *uint32 `protobuf:"varint,2,opt,name=by_bot,json=byBot" json:"by_bot,omitempty"`
+ // the location of the bot [m]
+ Location *geom.Vector2 `protobuf:"bytes,3,opt,name=location" json:"location,omitempty"`
+ // the distance [m] of the bot to the penalty area
+ Distance *float32 `protobuf:"fixed32,4,opt,name=distance" json:"distance,omitempty"`
+ // the location of the ball at the moment when this foul occurred [m]
+ BallLocation *geom.Vector2 `protobuf:"bytes,5,opt,name=ball_location,json=ballLocation" json:"ball_location,omitempty"`
+}
+
+func (x *GameEvent_AttackerTooCloseToDefenseArea) Reset() {
+ *x = GameEvent_AttackerTooCloseToDefenseArea{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[19]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GameEvent_AttackerTooCloseToDefenseArea) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GameEvent_AttackerTooCloseToDefenseArea) ProtoMessage() {}
+
+func (x *GameEvent_AttackerTooCloseToDefenseArea) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[19]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use GameEvent_AttackerTooCloseToDefenseArea.ProtoReflect.Descriptor instead.
+func (*GameEvent_AttackerTooCloseToDefenseArea) Descriptor() ([]byte, []int) {
+ return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 18}
+}
+
+func (x *GameEvent_AttackerTooCloseToDefenseArea) GetByTeam() Team {
+ if x != nil && x.ByTeam != nil {
+ return *x.ByTeam
+ }
+ return Team_UNKNOWN
+}
+
+func (x *GameEvent_AttackerTooCloseToDefenseArea) GetByBot() uint32 {
+ if x != nil && x.ByBot != nil {
+ return *x.ByBot
+ }
+ return 0
+}
+
+func (x *GameEvent_AttackerTooCloseToDefenseArea) GetLocation() *geom.Vector2 {
+ if x != nil {
+ return x.Location
+ }
+ return nil
+}
+
+func (x *GameEvent_AttackerTooCloseToDefenseArea) GetDistance() float32 {
+ if x != nil && x.Distance != nil {
+ return *x.Distance
+ }
+ return 0
+}
+
+func (x *GameEvent_AttackerTooCloseToDefenseArea) GetBallLocation() *geom.Vector2 {
+ if x != nil {
+ return x.BallLocation
+ }
+ return nil
+}
+
+// a bot held the ball for too long
+type GameEvent_BotHeldBallDeliberately struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // the team that found guilty
+ ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"`
+ // the bot that holds the ball
+ ByBot *uint32 `protobuf:"varint,2,opt,name=by_bot,json=byBot" json:"by_bot,omitempty"`
+ // the location of the ball [m]
+ Location *geom.Vector2 `protobuf:"bytes,3,opt,name=location" json:"location,omitempty"`
+ // the duration [s] that the bot hold the ball
+ Duration *float32 `protobuf:"fixed32,4,opt,name=duration" json:"duration,omitempty"`
+}
+
+func (x *GameEvent_BotHeldBallDeliberately) Reset() {
+ *x = GameEvent_BotHeldBallDeliberately{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[20]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GameEvent_BotHeldBallDeliberately) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GameEvent_BotHeldBallDeliberately) ProtoMessage() {}
+
+func (x *GameEvent_BotHeldBallDeliberately) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[20]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use GameEvent_BotHeldBallDeliberately.ProtoReflect.Descriptor instead.
+func (*GameEvent_BotHeldBallDeliberately) Descriptor() ([]byte, []int) {
+ return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 19}
+}
+
+func (x *GameEvent_BotHeldBallDeliberately) GetByTeam() Team {
+ if x != nil && x.ByTeam != nil {
+ return *x.ByTeam
+ }
+ return Team_UNKNOWN
+}
+
+func (x *GameEvent_BotHeldBallDeliberately) GetByBot() uint32 {
+ if x != nil && x.ByBot != nil {
+ return *x.ByBot
+ }
+ return 0
+}
+
+func (x *GameEvent_BotHeldBallDeliberately) GetLocation() *geom.Vector2 {
+ if x != nil {
+ return x.Location
+ }
+ return nil
+}
+
+func (x *GameEvent_BotHeldBallDeliberately) GetDuration() float32 {
+ if x != nil && x.Duration != nil {
+ return *x.Duration
+ }
+ return 0
+}
+
+// a bot interfered the ball placement of the other team
+type GameEvent_BotInterferedPlacement struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // the team that found guilty
+ ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"`
+ // the bot that interfered the placement
+ ByBot *uint32 `protobuf:"varint,2,opt,name=by_bot,json=byBot" json:"by_bot,omitempty"`
+ // the location of the bot [m]
+ Location *geom.Vector2 `protobuf:"bytes,3,opt,name=location" json:"location,omitempty"`
+}
+
+func (x *GameEvent_BotInterferedPlacement) Reset() {
+ *x = GameEvent_BotInterferedPlacement{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[21]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GameEvent_BotInterferedPlacement) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GameEvent_BotInterferedPlacement) ProtoMessage() {}
+
+func (x *GameEvent_BotInterferedPlacement) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[21]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use GameEvent_BotInterferedPlacement.ProtoReflect.Descriptor instead.
+func (*GameEvent_BotInterferedPlacement) Descriptor() ([]byte, []int) {
+ return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 20}
+}
+
+func (x *GameEvent_BotInterferedPlacement) GetByTeam() Team {
+ if x != nil && x.ByTeam != nil {
+ return *x.ByTeam
+ }
+ return Team_UNKNOWN
+}
+
+func (x *GameEvent_BotInterferedPlacement) GetByBot() uint32 {
+ if x != nil && x.ByBot != nil {
+ return *x.ByBot
+ }
+ return 0
+}
+
+func (x *GameEvent_BotInterferedPlacement) GetLocation() *geom.Vector2 {
+ if x != nil {
+ return x.Location
+ }
+ return nil
+}
+
+// a team collected multiple cards (yellow and red), which results in a penalty kick
+type GameEvent_MultipleCards struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // the team that received multiple yellow cards
+ ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"`
+}
+
+func (x *GameEvent_MultipleCards) Reset() {
+ *x = GameEvent_MultipleCards{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[22]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GameEvent_MultipleCards) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GameEvent_MultipleCards) ProtoMessage() {}
+
+func (x *GameEvent_MultipleCards) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[22]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use GameEvent_MultipleCards.ProtoReflect.Descriptor instead.
+func (*GameEvent_MultipleCards) Descriptor() ([]byte, []int) {
+ return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 21}
+}
+
+func (x *GameEvent_MultipleCards) GetByTeam() Team {
+ if x != nil && x.ByTeam != nil {
+ return *x.ByTeam
+ }
+ return Team_UNKNOWN
+}
+
+// a team collected multiple fouls, which results in a yellow card
+type GameEvent_MultipleFouls struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // the team that collected multiple fouls
+ ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"`
+}
+
+func (x *GameEvent_MultipleFouls) Reset() {
+ *x = GameEvent_MultipleFouls{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[23]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GameEvent_MultipleFouls) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GameEvent_MultipleFouls) ProtoMessage() {}
+
+func (x *GameEvent_MultipleFouls) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[23]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use GameEvent_MultipleFouls.ProtoReflect.Descriptor instead.
+func (*GameEvent_MultipleFouls) Descriptor() ([]byte, []int) {
+ return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 22}
+}
+
+func (x *GameEvent_MultipleFouls) GetByTeam() Team {
+ if x != nil && x.ByTeam != nil {
+ return *x.ByTeam
+ }
+ return Team_UNKNOWN
+}
+
+// a team failed to place the ball multiple times in a row
+type GameEvent_MultiplePlacementFailures struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // the team that failed multiple times
+ ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"`
+}
+
+func (x *GameEvent_MultiplePlacementFailures) Reset() {
+ *x = GameEvent_MultiplePlacementFailures{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[24]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GameEvent_MultiplePlacementFailures) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GameEvent_MultiplePlacementFailures) ProtoMessage() {}
+
+func (x *GameEvent_MultiplePlacementFailures) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[24]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use GameEvent_MultiplePlacementFailures.ProtoReflect.Descriptor instead.
+func (*GameEvent_MultiplePlacementFailures) Descriptor() ([]byte, []int) {
+ return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 23}
+}
+
+func (x *GameEvent_MultiplePlacementFailures) GetByTeam() Team {
+ if x != nil && x.ByTeam != nil {
+ return *x.ByTeam
+ }
+ return Team_UNKNOWN
+}
+
+// timeout waiting for the attacking team to perform the free kick
+type GameEvent_KickTimeout struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // the team that that should have kicked
+ ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"`
+ // the location of the ball [m]
+ Location *geom.Vector2 `protobuf:"bytes,2,opt,name=location" json:"location,omitempty"`
+ // the time [s] that was waited
+ Time *float32 `protobuf:"fixed32,3,opt,name=time" json:"time,omitempty"`
+}
+
+func (x *GameEvent_KickTimeout) Reset() {
+ *x = GameEvent_KickTimeout{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[25]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GameEvent_KickTimeout) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GameEvent_KickTimeout) ProtoMessage() {}
+
+func (x *GameEvent_KickTimeout) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[25]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use GameEvent_KickTimeout.ProtoReflect.Descriptor instead.
+func (*GameEvent_KickTimeout) Descriptor() ([]byte, []int) {
+ return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 24}
+}
+
+func (x *GameEvent_KickTimeout) GetByTeam() Team {
+ if x != nil && x.ByTeam != nil {
+ return *x.ByTeam
+ }
+ return Team_UNKNOWN
+}
+
+func (x *GameEvent_KickTimeout) GetLocation() *geom.Vector2 {
+ if x != nil {
+ return x.Location
+ }
+ return nil
+}
+
+func (x *GameEvent_KickTimeout) GetTime() float32 {
+ if x != nil && x.Time != nil {
+ return *x.Time
+ }
+ return 0
+}
+
+// game was stuck
+type GameEvent_NoProgressInGame struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // the location of the ball
+ Location *geom.Vector2 `protobuf:"bytes,1,opt,name=location" json:"location,omitempty"`
+ // the time [s] that was waited
+ Time *float32 `protobuf:"fixed32,2,opt,name=time" json:"time,omitempty"`
+}
+
+func (x *GameEvent_NoProgressInGame) Reset() {
+ *x = GameEvent_NoProgressInGame{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[26]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GameEvent_NoProgressInGame) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GameEvent_NoProgressInGame) ProtoMessage() {}
+
+func (x *GameEvent_NoProgressInGame) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[26]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use GameEvent_NoProgressInGame.ProtoReflect.Descriptor instead.
+func (*GameEvent_NoProgressInGame) Descriptor() ([]byte, []int) {
+ return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 25}
+}
+
+func (x *GameEvent_NoProgressInGame) GetLocation() *geom.Vector2 {
+ if x != nil {
+ return x.Location
+ }
+ return nil
+}
+
+func (x *GameEvent_NoProgressInGame) GetTime() float32 {
+ if x != nil && x.Time != nil {
+ return *x.Time
+ }
+ return 0
+}
+
+// ball placement failed
+type GameEvent_PlacementFailed struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // the team that failed
+ ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"`
+ // the remaining distance [m] from ball to placement position
+ RemainingDistance *float32 `protobuf:"fixed32,2,opt,name=remaining_distance,json=remainingDistance" json:"remaining_distance,omitempty"`
+}
+
+func (x *GameEvent_PlacementFailed) Reset() {
+ *x = GameEvent_PlacementFailed{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[27]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GameEvent_PlacementFailed) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GameEvent_PlacementFailed) ProtoMessage() {}
+
+func (x *GameEvent_PlacementFailed) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[27]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use GameEvent_PlacementFailed.ProtoReflect.Descriptor instead.
+func (*GameEvent_PlacementFailed) Descriptor() ([]byte, []int) {
+ return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 26}
+}
+
+func (x *GameEvent_PlacementFailed) GetByTeam() Team {
+ if x != nil && x.ByTeam != nil {
+ return *x.ByTeam
+ }
+ return Team_UNKNOWN
+}
+
+func (x *GameEvent_PlacementFailed) GetRemainingDistance() float32 {
+ if x != nil && x.RemainingDistance != nil {
+ return *x.RemainingDistance
+ }
+ return 0
+}
+
+// a team was found guilty for minor unsporting behavior
+type GameEvent_UnsportingBehaviorMinor struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // the team that found guilty
+ ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"`
+ // an explanation of the situation and decision
+ Reason *string `protobuf:"bytes,2,req,name=reason" json:"reason,omitempty"`
+}
+
+func (x *GameEvent_UnsportingBehaviorMinor) Reset() {
+ *x = GameEvent_UnsportingBehaviorMinor{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[28]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GameEvent_UnsportingBehaviorMinor) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GameEvent_UnsportingBehaviorMinor) ProtoMessage() {}
+
+func (x *GameEvent_UnsportingBehaviorMinor) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[28]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use GameEvent_UnsportingBehaviorMinor.ProtoReflect.Descriptor instead.
+func (*GameEvent_UnsportingBehaviorMinor) Descriptor() ([]byte, []int) {
+ return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 27}
+}
+
+func (x *GameEvent_UnsportingBehaviorMinor) GetByTeam() Team {
+ if x != nil && x.ByTeam != nil {
+ return *x.ByTeam
+ }
+ return Team_UNKNOWN
+}
+
+func (x *GameEvent_UnsportingBehaviorMinor) GetReason() string {
+ if x != nil && x.Reason != nil {
+ return *x.Reason
+ }
+ return ""
+}
+
+// a team was found guilty for major unsporting behavior
+type GameEvent_UnsportingBehaviorMajor struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // the team that found guilty
+ ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"`
+ // an explanation of the situation and decision
+ Reason *string `protobuf:"bytes,2,req,name=reason" json:"reason,omitempty"`
+}
+
+func (x *GameEvent_UnsportingBehaviorMajor) Reset() {
+ *x = GameEvent_UnsportingBehaviorMajor{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[29]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GameEvent_UnsportingBehaviorMajor) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GameEvent_UnsportingBehaviorMajor) ProtoMessage() {}
+
+func (x *GameEvent_UnsportingBehaviorMajor) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[29]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use GameEvent_UnsportingBehaviorMajor.ProtoReflect.Descriptor instead.
+func (*GameEvent_UnsportingBehaviorMajor) Descriptor() ([]byte, []int) {
+ return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 28}
+}
+
+func (x *GameEvent_UnsportingBehaviorMajor) GetByTeam() Team {
+ if x != nil && x.ByTeam != nil {
+ return *x.ByTeam
+ }
+ return Team_UNKNOWN
+}
+
+func (x *GameEvent_UnsportingBehaviorMajor) GetReason() string {
+ if x != nil && x.Reason != nil {
+ return *x.Reason
+ }
+ return ""
+}
+
+// a keeper held the ball in its defense area for too long
+type GameEvent_KeeperHeldBall struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // the team that found guilty
+ ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"`
+ // the location of the ball [m]
+ Location *geom.Vector2 `protobuf:"bytes,2,opt,name=location" json:"location,omitempty"`
+ // the duration [s] that the keeper hold the ball
+ Duration *float32 `protobuf:"fixed32,3,opt,name=duration" json:"duration,omitempty"`
+}
+
+func (x *GameEvent_KeeperHeldBall) Reset() {
+ *x = GameEvent_KeeperHeldBall{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[30]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GameEvent_KeeperHeldBall) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GameEvent_KeeperHeldBall) ProtoMessage() {}
+
+func (x *GameEvent_KeeperHeldBall) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[30]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use GameEvent_KeeperHeldBall.ProtoReflect.Descriptor instead.
+func (*GameEvent_KeeperHeldBall) Descriptor() ([]byte, []int) {
+ return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 29}
+}
+
+func (x *GameEvent_KeeperHeldBall) GetByTeam() Team {
+ if x != nil && x.ByTeam != nil {
+ return *x.ByTeam
+ }
+ return Team_UNKNOWN
+}
+
+func (x *GameEvent_KeeperHeldBall) GetLocation() *geom.Vector2 {
+ if x != nil {
+ return x.Location
+ }
+ return nil
+}
+
+func (x *GameEvent_KeeperHeldBall) GetDuration() float32 {
+ if x != nil && x.Duration != nil {
+ return *x.Duration
+ }
+ return 0
+}
+
+// a team successfully placed the ball
+type GameEvent_PlacementSucceeded struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // the team that did the placement
+ ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"`
+ // the time [s] taken for placing the ball
+ TimeTaken *float32 `protobuf:"fixed32,2,opt,name=time_taken,json=timeTaken" json:"time_taken,omitempty"`
+ // the distance [m] between placement location and actual ball position
+ Precision *float32 `protobuf:"fixed32,3,opt,name=precision" json:"precision,omitempty"`
+ // the distance [m] between the initial ball location and the placement position
+ Distance *float32 `protobuf:"fixed32,4,opt,name=distance" json:"distance,omitempty"`
+}
+
+func (x *GameEvent_PlacementSucceeded) Reset() {
+ *x = GameEvent_PlacementSucceeded{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[31]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GameEvent_PlacementSucceeded) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GameEvent_PlacementSucceeded) ProtoMessage() {}
+
+func (x *GameEvent_PlacementSucceeded) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[31]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use GameEvent_PlacementSucceeded.ProtoReflect.Descriptor instead.
+func (*GameEvent_PlacementSucceeded) Descriptor() ([]byte, []int) {
+ return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 30}
+}
+
+func (x *GameEvent_PlacementSucceeded) GetByTeam() Team {
+ if x != nil && x.ByTeam != nil {
+ return *x.ByTeam
+ }
+ return Team_UNKNOWN
+}
+
+func (x *GameEvent_PlacementSucceeded) GetTimeTaken() float32 {
+ if x != nil && x.TimeTaken != nil {
+ return *x.TimeTaken
+ }
+ return 0
+}
+
+func (x *GameEvent_PlacementSucceeded) GetPrecision() float32 {
+ if x != nil && x.Precision != nil {
+ return *x.Precision
+ }
+ return 0
+}
+
+func (x *GameEvent_PlacementSucceeded) GetDistance() float32 {
+ if x != nil && x.Distance != nil {
+ return *x.Distance
+ }
+ return 0
+}
+
+// both teams are prepared - all conditions are met to continue (with kickoff or penalty kick)
+type GameEvent_Prepared struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // the time [s] taken for preparing
+ TimeTaken *float32 `protobuf:"fixed32,1,opt,name=time_taken,json=timeTaken" json:"time_taken,omitempty"`
+}
+
+func (x *GameEvent_Prepared) Reset() {
+ *x = GameEvent_Prepared{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[32]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GameEvent_Prepared) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GameEvent_Prepared) ProtoMessage() {}
+
+func (x *GameEvent_Prepared) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[32]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use GameEvent_Prepared.ProtoReflect.Descriptor instead.
+func (*GameEvent_Prepared) Descriptor() ([]byte, []int) {
+ return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 31}
+}
+
+func (x *GameEvent_Prepared) GetTimeTaken() float32 {
+ if x != nil && x.TimeTaken != nil {
+ return *x.TimeTaken
+ }
+ return 0
+}
+
+// bots are being substituted by a team
+type GameEvent_BotSubstitution struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // the team that substitutes robots
+ ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"`
+}
+
+func (x *GameEvent_BotSubstitution) Reset() {
+ *x = GameEvent_BotSubstitution{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[33]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GameEvent_BotSubstitution) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GameEvent_BotSubstitution) ProtoMessage() {}
+
+func (x *GameEvent_BotSubstitution) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[33]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use GameEvent_BotSubstitution.ProtoReflect.Descriptor instead.
+func (*GameEvent_BotSubstitution) Descriptor() ([]byte, []int) {
+ return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 32}
+}
+
+func (x *GameEvent_BotSubstitution) GetByTeam() Team {
+ if x != nil && x.ByTeam != nil {
+ return *x.ByTeam
+ }
+ return Team_UNKNOWN
+}
+
+// A challenge flag, requested by a team previously, is flagged
+type GameEvent_ChallengeFlag struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // the team that substitutes robots
+ ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"`
+}
+
+func (x *GameEvent_ChallengeFlag) Reset() {
+ *x = GameEvent_ChallengeFlag{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[34]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GameEvent_ChallengeFlag) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GameEvent_ChallengeFlag) ProtoMessage() {}
+
+func (x *GameEvent_ChallengeFlag) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[34]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use GameEvent_ChallengeFlag.ProtoReflect.Descriptor instead.
+func (*GameEvent_ChallengeFlag) Descriptor() ([]byte, []int) {
+ return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 33}
+}
+
+func (x *GameEvent_ChallengeFlag) GetByTeam() Team {
+ if x != nil && x.ByTeam != nil {
+ return *x.ByTeam
+ }
+ return Team_UNKNOWN
+}
+
+// An emergency stop, requested by team previously, occurred
+type GameEvent_EmergencyStop struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // the team that substitutes robots
+ ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"`
+}
+
+func (x *GameEvent_EmergencyStop) Reset() {
+ *x = GameEvent_EmergencyStop{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[35]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GameEvent_EmergencyStop) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GameEvent_EmergencyStop) ProtoMessage() {}
+
+func (x *GameEvent_EmergencyStop) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[35]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use GameEvent_EmergencyStop.ProtoReflect.Descriptor instead.
+func (*GameEvent_EmergencyStop) Descriptor() ([]byte, []int) {
+ return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 34}
+}
+
+func (x *GameEvent_EmergencyStop) GetByTeam() Team {
+ if x != nil && x.ByTeam != nil {
+ return *x.ByTeam
+ }
+ return Team_UNKNOWN
+}
+
+// a team has too many robots on the field
+type GameEvent_TooManyRobots struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // the team that has too many robots
+ ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"`
+ // number of robots allowed at the moment
+ NumRobotsAllowed *int32 `protobuf:"varint,2,opt,name=num_robots_allowed,json=numRobotsAllowed" json:"num_robots_allowed,omitempty"`
+ // number of robots currently on the field
+ NumRobotsOnField *int32 `protobuf:"varint,3,opt,name=num_robots_on_field,json=numRobotsOnField" json:"num_robots_on_field,omitempty"`
+ // the location of the ball at the moment when this foul occurred [m]
+ BallLocation *geom.Vector2 `protobuf:"bytes,4,opt,name=ball_location,json=ballLocation" json:"ball_location,omitempty"`
+}
+
+func (x *GameEvent_TooManyRobots) Reset() {
+ *x = GameEvent_TooManyRobots{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[36]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GameEvent_TooManyRobots) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GameEvent_TooManyRobots) ProtoMessage() {}
+
+func (x *GameEvent_TooManyRobots) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[36]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use GameEvent_TooManyRobots.ProtoReflect.Descriptor instead.
+func (*GameEvent_TooManyRobots) Descriptor() ([]byte, []int) {
+ return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 35}
+}
+
+func (x *GameEvent_TooManyRobots) GetByTeam() Team {
+ if x != nil && x.ByTeam != nil {
+ return *x.ByTeam
+ }
+ return Team_UNKNOWN
+}
+
+func (x *GameEvent_TooManyRobots) GetNumRobotsAllowed() int32 {
+ if x != nil && x.NumRobotsAllowed != nil {
+ return *x.NumRobotsAllowed
+ }
+ return 0
+}
+
+func (x *GameEvent_TooManyRobots) GetNumRobotsOnField() int32 {
+ if x != nil && x.NumRobotsOnField != nil {
+ return *x.NumRobotsOnField
+ }
+ return 0
+}
+
+func (x *GameEvent_TooManyRobots) GetBallLocation() *geom.Vector2 {
+ if x != nil {
+ return x.BallLocation
+ }
+ return nil
+}
+
+// a robot chipped the ball over the field boundary out of the playing surface
+type GameEvent_BoundaryCrossing struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // the team that has too many robots
+ ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"`
+ // the location of the ball [m]
+ Location *geom.Vector2 `protobuf:"bytes,2,opt,name=location" json:"location,omitempty"`
+}
+
+func (x *GameEvent_BoundaryCrossing) Reset() {
+ *x = GameEvent_BoundaryCrossing{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[37]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GameEvent_BoundaryCrossing) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GameEvent_BoundaryCrossing) ProtoMessage() {}
+
+func (x *GameEvent_BoundaryCrossing) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[37]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use GameEvent_BoundaryCrossing.ProtoReflect.Descriptor instead.
+func (*GameEvent_BoundaryCrossing) Descriptor() ([]byte, []int) {
+ return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 36}
+}
+
+func (x *GameEvent_BoundaryCrossing) GetByTeam() Team {
+ if x != nil && x.ByTeam != nil {
+ return *x.ByTeam
+ }
+ return Team_UNKNOWN
+}
+
+func (x *GameEvent_BoundaryCrossing) GetLocation() *geom.Vector2 {
+ if x != nil {
+ return x.Location
+ }
+ return nil
+}
+
+// the penalty kick failed (by time or by keeper)
+type GameEvent_PenaltyKickFailed struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // the team that last touched the ball
+ ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"`
+ // the location of the ball at the moment of this event [m]
+ Location *geom.Vector2 `protobuf:"bytes,2,opt,name=location" json:"location,omitempty"`
+}
+
+func (x *GameEvent_PenaltyKickFailed) Reset() {
+ *x = GameEvent_PenaltyKickFailed{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[38]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GameEvent_PenaltyKickFailed) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GameEvent_PenaltyKickFailed) ProtoMessage() {}
+
+func (x *GameEvent_PenaltyKickFailed) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_gc_game_event_proto_msgTypes[38]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use GameEvent_PenaltyKickFailed.ProtoReflect.Descriptor instead.
+func (*GameEvent_PenaltyKickFailed) Descriptor() ([]byte, []int) {
+ return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 37}
+}
+
+func (x *GameEvent_PenaltyKickFailed) GetByTeam() Team {
+ if x != nil && x.ByTeam != nil {
+ return *x.ByTeam
+ }
+ return Team_UNKNOWN
+}
+
+func (x *GameEvent_PenaltyKickFailed) GetLocation() *geom.Vector2 {
+ if x != nil {
+ return x.Location
+ }
+ return nil
+}
+
+var File_ssl_gc_game_event_proto protoreflect.FileDescriptor
+
+var file_ssl_gc_game_event_proto_rawDesc = []byte{
+ 0x0a, 0x17, 0x73, 0x73, 0x6c, 0x5f, 0x67, 0x63, 0x5f, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x65, 0x76,
+ 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x13, 0x73, 0x73, 0x6c, 0x5f, 0x67,
+ 0x63, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15,
+ 0x73, 0x73, 0x6c, 0x5f, 0x67, 0x63, 0x5f, 0x67, 0x65, 0x6f, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x2e,
+ 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xfa, 0x4e, 0x0a, 0x09, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76,
+ 0x65, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x28, 0x20, 0x01, 0x28,
+ 0x0e, 0x32, 0x0f, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x79,
+ 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x72, 0x69, 0x67,
+ 0x69, 0x6e, 0x18, 0x29, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e,
+ 0x12, 0x56, 0x0a, 0x1a, 0x62, 0x61, 0x6c, 0x6c, 0x5f, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x66, 0x69,
+ 0x65, 0x6c, 0x64, 0x5f, 0x74, 0x6f, 0x75, 0x63, 0x68, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x06,
+ 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74,
+ 0x2e, 0x42, 0x61, 0x6c, 0x6c, 0x4c, 0x65, 0x66, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x48, 0x00,
+ 0x52, 0x16, 0x62, 0x61, 0x6c, 0x6c, 0x4c, 0x65, 0x66, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x54,
+ 0x6f, 0x75, 0x63, 0x68, 0x4c, 0x69, 0x6e, 0x65, 0x12, 0x54, 0x0a, 0x19, 0x62, 0x61, 0x6c, 0x6c,
+ 0x5f, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x67, 0x6f, 0x61, 0x6c,
+ 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x47, 0x61,
+ 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x42, 0x61, 0x6c, 0x6c, 0x4c, 0x65, 0x66, 0x74,
+ 0x46, 0x69, 0x65, 0x6c, 0x64, 0x48, 0x00, 0x52, 0x15, 0x62, 0x61, 0x6c, 0x6c, 0x4c, 0x65, 0x66,
+ 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x47, 0x6f, 0x61, 0x6c, 0x4c, 0x69, 0x6e, 0x65, 0x12, 0x3b,
+ 0x0a, 0x0c, 0x61, 0x69, 0x6d, 0x6c, 0x65, 0x73, 0x73, 0x5f, 0x6b, 0x69, 0x63, 0x6b, 0x18, 0x0b,
+ 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74,
+ 0x2e, 0x41, 0x69, 0x6d, 0x6c, 0x65, 0x73, 0x73, 0x4b, 0x69, 0x63, 0x6b, 0x48, 0x00, 0x52, 0x0b,
+ 0x61, 0x69, 0x6d, 0x6c, 0x65, 0x73, 0x73, 0x4b, 0x69, 0x63, 0x6b, 0x12, 0x75, 0x0a, 0x22, 0x61,
+ 0x74, 0x74, 0x61, 0x63, 0x6b, 0x65, 0x72, 0x5f, 0x74, 0x6f, 0x6f, 0x5f, 0x63, 0x6c, 0x6f, 0x73,
+ 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x64, 0x65, 0x66, 0x65, 0x6e, 0x73, 0x65, 0x5f, 0x61, 0x72, 0x65,
+ 0x61, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76,
+ 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x65, 0x72, 0x54, 0x6f, 0x6f, 0x43,
+ 0x6c, 0x6f, 0x73, 0x65, 0x54, 0x6f, 0x44, 0x65, 0x66, 0x65, 0x6e, 0x73, 0x65, 0x41, 0x72, 0x65,
+ 0x61, 0x48, 0x00, 0x52, 0x1d, 0x61, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x65, 0x72, 0x54, 0x6f, 0x6f,
+ 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x54, 0x6f, 0x44, 0x65, 0x66, 0x65, 0x6e, 0x73, 0x65, 0x41, 0x72,
+ 0x65, 0x61, 0x12, 0x5b, 0x0a, 0x18, 0x64, 0x65, 0x66, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x5f, 0x69,
+ 0x6e, 0x5f, 0x64, 0x65, 0x66, 0x65, 0x6e, 0x73, 0x65, 0x5f, 0x61, 0x72, 0x65, 0x61, 0x18, 0x1f,
+ 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74,
+ 0x2e, 0x44, 0x65, 0x66, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x44, 0x65, 0x66, 0x65, 0x6e,
+ 0x73, 0x65, 0x41, 0x72, 0x65, 0x61, 0x48, 0x00, 0x52, 0x15, 0x64, 0x65, 0x66, 0x65, 0x6e, 0x64,
+ 0x65, 0x72, 0x49, 0x6e, 0x44, 0x65, 0x66, 0x65, 0x6e, 0x73, 0x65, 0x41, 0x72, 0x65, 0x61, 0x12,
+ 0x4a, 0x0a, 0x11, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x5f, 0x63, 0x72, 0x6f, 0x73,
+ 0x73, 0x69, 0x6e, 0x67, 0x18, 0x2b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x47, 0x61, 0x6d,
+ 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x43,
+ 0x72, 0x6f, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x10, 0x62, 0x6f, 0x75, 0x6e, 0x64,
+ 0x61, 0x72, 0x79, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x45, 0x0a, 0x10, 0x6b,
+ 0x65, 0x65, 0x70, 0x65, 0x72, 0x5f, 0x68, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x61, 0x6c, 0x6c, 0x18,
+ 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e,
+ 0x74, 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x65, 0x72, 0x48, 0x65, 0x6c, 0x64, 0x42, 0x61, 0x6c, 0x6c,
+ 0x48, 0x00, 0x52, 0x0e, 0x6b, 0x65, 0x65, 0x70, 0x65, 0x72, 0x48, 0x65, 0x6c, 0x64, 0x42, 0x61,
+ 0x6c, 0x6c, 0x12, 0x5c, 0x0a, 0x19, 0x62, 0x6f, 0x74, 0x5f, 0x64, 0x72, 0x69, 0x62, 0x62, 0x6c,
+ 0x65, 0x64, 0x5f, 0x62, 0x61, 0x6c, 0x6c, 0x5f, 0x74, 0x6f, 0x6f, 0x5f, 0x66, 0x61, 0x72, 0x18,
+ 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e,
+ 0x74, 0x2e, 0x42, 0x6f, 0x74, 0x44, 0x72, 0x69, 0x62, 0x62, 0x6c, 0x65, 0x64, 0x42, 0x61, 0x6c,
+ 0x6c, 0x54, 0x6f, 0x6f, 0x46, 0x61, 0x72, 0x48, 0x00, 0x52, 0x15, 0x62, 0x6f, 0x74, 0x44, 0x72,
+ 0x69, 0x62, 0x62, 0x6c, 0x65, 0x64, 0x42, 0x61, 0x6c, 0x6c, 0x54, 0x6f, 0x6f, 0x46, 0x61, 0x72,
+ 0x12, 0x3f, 0x0a, 0x0e, 0x62, 0x6f, 0x74, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x65, 0x64, 0x5f, 0x62,
+ 0x6f, 0x74, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45,
+ 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x42, 0x6f, 0x74, 0x50, 0x75, 0x73, 0x68, 0x65, 0x64, 0x42, 0x6f,
+ 0x74, 0x48, 0x00, 0x52, 0x0c, 0x62, 0x6f, 0x74, 0x50, 0x75, 0x73, 0x68, 0x65, 0x64, 0x42, 0x6f,
+ 0x74, 0x12, 0x61, 0x0a, 0x1a, 0x62, 0x6f, 0x74, 0x5f, 0x68, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x61,
+ 0x6c, 0x6c, 0x5f, 0x64, 0x65, 0x6c, 0x69, 0x62, 0x65, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x79, 0x18,
+ 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e,
+ 0x74, 0x2e, 0x42, 0x6f, 0x74, 0x48, 0x65, 0x6c, 0x64, 0x42, 0x61, 0x6c, 0x6c, 0x44, 0x65, 0x6c,
+ 0x69, 0x62, 0x65, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x79, 0x48, 0x00, 0x52, 0x17, 0x62, 0x6f, 0x74,
+ 0x48, 0x65, 0x6c, 0x64, 0x42, 0x61, 0x6c, 0x6c, 0x44, 0x65, 0x6c, 0x69, 0x62, 0x65, 0x72, 0x61,
+ 0x74, 0x65, 0x6c, 0x79, 0x12, 0x42, 0x0a, 0x0f, 0x62, 0x6f, 0x74, 0x5f, 0x74, 0x69, 0x70, 0x70,
+ 0x65, 0x64, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e,
+ 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x42, 0x6f, 0x74, 0x54, 0x69, 0x70,
+ 0x70, 0x65, 0x64, 0x4f, 0x76, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0d, 0x62, 0x6f, 0x74, 0x54, 0x69,
+ 0x70, 0x70, 0x65, 0x64, 0x4f, 0x76, 0x65, 0x72, 0x12, 0x7e, 0x0a, 0x25, 0x61, 0x74, 0x74, 0x61,
+ 0x63, 0x6b, 0x65, 0x72, 0x5f, 0x74, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x62, 0x61, 0x6c,
+ 0x6c, 0x5f, 0x69, 0x6e, 0x5f, 0x64, 0x65, 0x66, 0x65, 0x6e, 0x73, 0x65, 0x5f, 0x61, 0x72, 0x65,
+ 0x61, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76,
+ 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x65, 0x72, 0x54, 0x6f, 0x75, 0x63,
+ 0x68, 0x65, 0x64, 0x42, 0x61, 0x6c, 0x6c, 0x49, 0x6e, 0x44, 0x65, 0x66, 0x65, 0x6e, 0x73, 0x65,
+ 0x41, 0x72, 0x65, 0x61, 0x48, 0x00, 0x52, 0x20, 0x61, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x65, 0x72,
+ 0x54, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x64, 0x42, 0x61, 0x6c, 0x6c, 0x49, 0x6e, 0x44, 0x65, 0x66,
+ 0x65, 0x6e, 0x73, 0x65, 0x41, 0x72, 0x65, 0x61, 0x12, 0x59, 0x0a, 0x18, 0x62, 0x6f, 0x74, 0x5f,
+ 0x6b, 0x69, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x62, 0x61, 0x6c, 0x6c, 0x5f, 0x74, 0x6f, 0x6f, 0x5f,
+ 0x66, 0x61, 0x73, 0x74, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x47, 0x61, 0x6d,
+ 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x42, 0x6f, 0x74, 0x4b, 0x69, 0x63, 0x6b, 0x65, 0x64,
+ 0x42, 0x61, 0x6c, 0x6c, 0x54, 0x6f, 0x6f, 0x46, 0x61, 0x73, 0x74, 0x48, 0x00, 0x52, 0x14, 0x62,
+ 0x6f, 0x74, 0x4b, 0x69, 0x63, 0x6b, 0x65, 0x64, 0x42, 0x61, 0x6c, 0x6c, 0x54, 0x6f, 0x6f, 0x46,
+ 0x61, 0x73, 0x74, 0x12, 0x45, 0x0a, 0x10, 0x62, 0x6f, 0x74, 0x5f, 0x63, 0x72, 0x61, 0x73, 0x68,
+ 0x5f, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e,
+ 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x42, 0x6f, 0x74, 0x43, 0x72, 0x61,
+ 0x73, 0x68, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x48, 0x00, 0x52, 0x0e, 0x62, 0x6f, 0x74, 0x43,
+ 0x72, 0x61, 0x73, 0x68, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x12, 0x42, 0x0a, 0x0f, 0x62, 0x6f,
+ 0x74, 0x5f, 0x63, 0x72, 0x61, 0x73, 0x68, 0x5f, 0x64, 0x72, 0x61, 0x77, 0x6e, 0x18, 0x15, 0x20,
+ 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e,
+ 0x42, 0x6f, 0x74, 0x43, 0x72, 0x61, 0x73, 0x68, 0x44, 0x72, 0x61, 0x77, 0x6e, 0x48, 0x00, 0x52,
+ 0x0d, 0x62, 0x6f, 0x74, 0x43, 0x72, 0x61, 0x73, 0x68, 0x44, 0x72, 0x61, 0x77, 0x6e, 0x12, 0x6f,
+ 0x0a, 0x20, 0x64, 0x65, 0x66, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x5f, 0x74, 0x6f, 0x6f, 0x5f, 0x63,
+ 0x6c, 0x6f, 0x73, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x6b, 0x69, 0x63, 0x6b, 0x5f, 0x70, 0x6f, 0x69,
+ 0x6e, 0x74, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45,
+ 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x65, 0x66, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x54, 0x6f, 0x6f,
+ 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x54, 0x6f, 0x4b, 0x69, 0x63, 0x6b, 0x50, 0x6f, 0x69, 0x6e, 0x74,
+ 0x48, 0x00, 0x52, 0x1b, 0x64, 0x65, 0x66, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x54, 0x6f, 0x6f, 0x43,
+ 0x6c, 0x6f, 0x73, 0x65, 0x54, 0x6f, 0x4b, 0x69, 0x63, 0x6b, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12,
+ 0x4d, 0x0a, 0x14, 0x62, 0x6f, 0x74, 0x5f, 0x74, 0x6f, 0x6f, 0x5f, 0x66, 0x61, 0x73, 0x74, 0x5f,
+ 0x69, 0x6e, 0x5f, 0x73, 0x74, 0x6f, 0x70, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e,
+ 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x42, 0x6f, 0x74, 0x54, 0x6f, 0x6f,
+ 0x46, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x53, 0x74, 0x6f, 0x70, 0x48, 0x00, 0x52, 0x10, 0x62, 0x6f,
+ 0x74, 0x54, 0x6f, 0x6f, 0x46, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x53, 0x74, 0x6f, 0x70, 0x12, 0x5d,
+ 0x0a, 0x18, 0x62, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x65, 0x72, 0x65, 0x64,
+ 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b,
+ 0x32, 0x21, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x42, 0x6f, 0x74,
+ 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x65, 0x72, 0x65, 0x64, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x6d,
+ 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x16, 0x62, 0x6f, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66,
+ 0x65, 0x72, 0x65, 0x64, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x36, 0x0a,
+ 0x0d, 0x70, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x67, 0x6f, 0x61, 0x6c, 0x18, 0x27,
+ 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74,
+ 0x2e, 0x47, 0x6f, 0x61, 0x6c, 0x48, 0x00, 0x52, 0x0c, 0x70, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c,
+ 0x65, 0x47, 0x6f, 0x61, 0x6c, 0x12, 0x25, 0x0a, 0x04, 0x67, 0x6f, 0x61, 0x6c, 0x18, 0x08, 0x20,
+ 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e,
+ 0x47, 0x6f, 0x61, 0x6c, 0x48, 0x00, 0x52, 0x04, 0x67, 0x6f, 0x61, 0x6c, 0x12, 0x34, 0x0a, 0x0c,
+ 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x67, 0x6f, 0x61, 0x6c, 0x18, 0x2c, 0x20, 0x01,
+ 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x47,
+ 0x6f, 0x61, 0x6c, 0x48, 0x00, 0x52, 0x0b, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x47, 0x6f,
+ 0x61, 0x6c, 0x12, 0x67, 0x0a, 0x1c, 0x61, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x65, 0x72, 0x5f, 0x64,
+ 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x74, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x62, 0x61,
+ 0x6c, 0x6c, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45,
+ 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x65, 0x72, 0x44, 0x6f, 0x75,
+ 0x62, 0x6c, 0x65, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x64, 0x42, 0x61, 0x6c, 0x6c, 0x48, 0x00,
+ 0x52, 0x19, 0x61, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x65, 0x72, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65,
+ 0x54, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x64, 0x42, 0x61, 0x6c, 0x6c, 0x12, 0x50, 0x0a, 0x13, 0x70,
+ 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x75, 0x63, 0x63, 0x65, 0x65, 0x64,
+ 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45,
+ 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x75,
+ 0x63, 0x63, 0x65, 0x65, 0x64, 0x65, 0x64, 0x48, 0x00, 0x52, 0x12, 0x70, 0x6c, 0x61, 0x63, 0x65,
+ 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x75, 0x63, 0x63, 0x65, 0x65, 0x64, 0x65, 0x64, 0x12, 0x4e, 0x0a,
+ 0x13, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x5f, 0x6b, 0x69, 0x63, 0x6b, 0x5f, 0x66, 0x61,
+ 0x69, 0x6c, 0x65, 0x64, 0x18, 0x2d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x47, 0x61, 0x6d,
+ 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x4b, 0x69,
+ 0x63, 0x6b, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x48, 0x00, 0x52, 0x11, 0x70, 0x65, 0x6e, 0x61,
+ 0x6c, 0x74, 0x79, 0x4b, 0x69, 0x63, 0x6b, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x12, 0x4c, 0x0a,
+ 0x13, 0x6e, 0x6f, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x69, 0x6e, 0x5f,
+ 0x67, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x47, 0x61, 0x6d,
+ 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x4e, 0x6f, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73,
+ 0x73, 0x49, 0x6e, 0x47, 0x61, 0x6d, 0x65, 0x48, 0x00, 0x52, 0x10, 0x6e, 0x6f, 0x50, 0x72, 0x6f,
+ 0x67, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x47, 0x61, 0x6d, 0x65, 0x12, 0x47, 0x0a, 0x10, 0x70,
+ 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x18,
+ 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e,
+ 0x74, 0x2e, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x46, 0x61, 0x69, 0x6c, 0x65,
+ 0x64, 0x48, 0x00, 0x52, 0x0f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x46, 0x61,
+ 0x69, 0x6c, 0x65, 0x64, 0x12, 0x41, 0x0a, 0x0e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65,
+ 0x5f, 0x63, 0x61, 0x72, 0x64, 0x73, 0x18, 0x20, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x47,
+ 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c,
+ 0x65, 0x43, 0x61, 0x72, 0x64, 0x73, 0x48, 0x00, 0x52, 0x0d, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70,
+ 0x6c, 0x65, 0x43, 0x61, 0x72, 0x64, 0x73, 0x12, 0x41, 0x0a, 0x0e, 0x6d, 0x75, 0x6c, 0x74, 0x69,
+ 0x70, 0x6c, 0x65, 0x5f, 0x66, 0x6f, 0x75, 0x6c, 0x73, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0b, 0x32,
+ 0x18, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x4d, 0x75, 0x6c, 0x74,
+ 0x69, 0x70, 0x6c, 0x65, 0x46, 0x6f, 0x75, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x0d, 0x6d, 0x75, 0x6c,
+ 0x74, 0x69, 0x70, 0x6c, 0x65, 0x46, 0x6f, 0x75, 0x6c, 0x73, 0x12, 0x47, 0x0a, 0x10, 0x62, 0x6f,
+ 0x74, 0x5f, 0x73, 0x75, 0x62, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x25,
+ 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74,
+ 0x2e, 0x42, 0x6f, 0x74, 0x53, 0x75, 0x62, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, 0x69, 0x6f, 0x6e,
+ 0x48, 0x00, 0x52, 0x0f, 0x62, 0x6f, 0x74, 0x53, 0x75, 0x62, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74,
+ 0x69, 0x6f, 0x6e, 0x12, 0x42, 0x0a, 0x0f, 0x74, 0x6f, 0x6f, 0x5f, 0x6d, 0x61, 0x6e, 0x79, 0x5f,
+ 0x72, 0x6f, 0x62, 0x6f, 0x74, 0x73, 0x18, 0x26, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x47,
+ 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x6f, 0x6f, 0x4d, 0x61, 0x6e, 0x79,
+ 0x52, 0x6f, 0x62, 0x6f, 0x74, 0x73, 0x48, 0x00, 0x52, 0x0d, 0x74, 0x6f, 0x6f, 0x4d, 0x61, 0x6e,
+ 0x79, 0x52, 0x6f, 0x62, 0x6f, 0x74, 0x73, 0x12, 0x41, 0x0a, 0x0e, 0x63, 0x68, 0x61, 0x6c, 0x6c,
+ 0x65, 0x6e, 0x67, 0x65, 0x5f, 0x66, 0x6c, 0x61, 0x67, 0x18, 0x2e, 0x20, 0x01, 0x28, 0x0b, 0x32,
+ 0x18, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x68, 0x61, 0x6c,
+ 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x48, 0x00, 0x52, 0x0d, 0x63, 0x68, 0x61,
+ 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x12, 0x41, 0x0a, 0x0e, 0x65, 0x6d,
+ 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x73, 0x74, 0x6f, 0x70, 0x18, 0x2f, 0x20, 0x01,
+ 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x45,
+ 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x53, 0x74, 0x6f, 0x70, 0x48, 0x00, 0x52, 0x0d,
+ 0x65, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x53, 0x74, 0x6f, 0x70, 0x12, 0x60, 0x0a,
+ 0x19, 0x75, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x62, 0x65, 0x68, 0x61,
+ 0x76, 0x69, 0x6f, 0x72, 0x5f, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x18, 0x23, 0x20, 0x01, 0x28, 0x0b,
+ 0x32, 0x22, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x55, 0x6e, 0x73,
+ 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x4d,
+ 0x69, 0x6e, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x17, 0x75, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x69,
+ 0x6e, 0x67, 0x42, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x4d, 0x69, 0x6e, 0x6f, 0x72, 0x12,
+ 0x60, 0x0a, 0x19, 0x75, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x62, 0x65,
+ 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x5f, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x18, 0x24, 0x20, 0x01,
+ 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x55,
+ 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f,
+ 0x72, 0x4d, 0x61, 0x6a, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x17, 0x75, 0x6e, 0x73, 0x70, 0x6f, 0x72,
+ 0x74, 0x69, 0x6e, 0x67, 0x42, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x4d, 0x61, 0x6a, 0x6f,
+ 0x72, 0x12, 0x35, 0x0a, 0x08, 0x70, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x64, 0x18, 0x01, 0x20,
+ 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e,
+ 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x64, 0x42, 0x02, 0x18, 0x01, 0x48, 0x00, 0x52, 0x08,
+ 0x70, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x64, 0x12, 0x42, 0x0a, 0x0d, 0x69, 0x6e, 0x64, 0x69,
+ 0x72, 0x65, 0x63, 0x74, 0x5f, 0x67, 0x6f, 0x61, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32,
+ 0x17, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x49, 0x6e, 0x64, 0x69,
+ 0x72, 0x65, 0x63, 0x74, 0x47, 0x6f, 0x61, 0x6c, 0x42, 0x02, 0x18, 0x01, 0x48, 0x00, 0x52, 0x0c,
+ 0x69, 0x6e, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x47, 0x6f, 0x61, 0x6c, 0x12, 0x3f, 0x0a, 0x0c,
+ 0x63, 0x68, 0x69, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x67, 0x6f, 0x61, 0x6c, 0x18, 0x0a, 0x20, 0x01,
+ 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x43,
+ 0x68, 0x69, 0x70, 0x70, 0x65, 0x64, 0x47, 0x6f, 0x61, 0x6c, 0x42, 0x02, 0x18, 0x01, 0x48, 0x00,
+ 0x52, 0x0b, 0x63, 0x68, 0x69, 0x70, 0x70, 0x65, 0x64, 0x47, 0x6f, 0x61, 0x6c, 0x12, 0x3f, 0x0a,
+ 0x0c, 0x6b, 0x69, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x0c, 0x20,
+ 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e,
+ 0x4b, 0x69, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x42, 0x02, 0x18, 0x01, 0x48,
+ 0x00, 0x52, 0x0b, 0x6b, 0x69, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x8e,
+ 0x01, 0x0a, 0x29, 0x61, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x65, 0x72, 0x5f, 0x74, 0x6f, 0x75, 0x63,
+ 0x68, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x5f,
+ 0x64, 0x65, 0x66, 0x65, 0x6e, 0x73, 0x65, 0x5f, 0x61, 0x72, 0x65, 0x61, 0x18, 0x10, 0x20, 0x01,
+ 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x41,
+ 0x74, 0x74, 0x61, 0x63, 0x6b, 0x65, 0x72, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x64, 0x4f, 0x70,
+ 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x44, 0x65, 0x66, 0x65, 0x6e, 0x73, 0x65, 0x41,
+ 0x72, 0x65, 0x61, 0x42, 0x02, 0x18, 0x01, 0x48, 0x00, 0x52, 0x24, 0x61, 0x74, 0x74, 0x61, 0x63,
+ 0x6b, 0x65, 0x72, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x64, 0x4f, 0x70, 0x70, 0x6f, 0x6e, 0x65,
+ 0x6e, 0x74, 0x49, 0x6e, 0x44, 0x65, 0x66, 0x65, 0x6e, 0x73, 0x65, 0x41, 0x72, 0x65, 0x61, 0x12,
+ 0x9d, 0x01, 0x0a, 0x31, 0x61, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x65, 0x72, 0x5f, 0x74, 0x6f, 0x75,
+ 0x63, 0x68, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e,
+ 0x5f, 0x64, 0x65, 0x66, 0x65, 0x6e, 0x73, 0x65, 0x5f, 0x61, 0x72, 0x65, 0x61, 0x5f, 0x73, 0x6b,
+ 0x69, 0x70, 0x70, 0x65, 0x64, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x47, 0x61,
+ 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x65, 0x72,
+ 0x54, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x64, 0x4f, 0x70, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49,
+ 0x6e, 0x44, 0x65, 0x66, 0x65, 0x6e, 0x73, 0x65, 0x41, 0x72, 0x65, 0x61, 0x42, 0x02, 0x18, 0x01,
+ 0x48, 0x00, 0x52, 0x2b, 0x61, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x65, 0x72, 0x54, 0x6f, 0x75, 0x63,
+ 0x68, 0x65, 0x64, 0x4f, 0x70, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x44, 0x65, 0x66,
+ 0x65, 0x6e, 0x73, 0x65, 0x41, 0x72, 0x65, 0x61, 0x53, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x12,
+ 0x58, 0x0a, 0x18, 0x62, 0x6f, 0x74, 0x5f, 0x63, 0x72, 0x61, 0x73, 0x68, 0x5f, 0x75, 0x6e, 0x69,
+ 0x71, 0x75, 0x65, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x18, 0x17, 0x20, 0x01, 0x28,
+ 0x0b, 0x32, 0x19, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x42, 0x6f,
+ 0x74, 0x43, 0x72, 0x61, 0x73, 0x68, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x42, 0x02, 0x18, 0x01,
+ 0x48, 0x00, 0x52, 0x15, 0x62, 0x6f, 0x74, 0x43, 0x72, 0x61, 0x73, 0x68, 0x55, 0x6e, 0x69, 0x71,
+ 0x75, 0x65, 0x53, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x12, 0x52, 0x0a, 0x16, 0x62, 0x6f, 0x74,
+ 0x5f, 0x70, 0x75, 0x73, 0x68, 0x65, 0x64, 0x5f, 0x62, 0x6f, 0x74, 0x5f, 0x73, 0x6b, 0x69, 0x70,
+ 0x70, 0x65, 0x64, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x47, 0x61, 0x6d, 0x65,
+ 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x42, 0x6f, 0x74, 0x50, 0x75, 0x73, 0x68, 0x65, 0x64, 0x42,
+ 0x6f, 0x74, 0x42, 0x02, 0x18, 0x01, 0x48, 0x00, 0x52, 0x13, 0x62, 0x6f, 0x74, 0x50, 0x75, 0x73,
+ 0x68, 0x65, 0x64, 0x42, 0x6f, 0x74, 0x53, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x12, 0x7b, 0x0a,
+ 0x22, 0x64, 0x65, 0x66, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x5f, 0x64, 0x65, 0x66,
+ 0x65, 0x6e, 0x73, 0x65, 0x5f, 0x61, 0x72, 0x65, 0x61, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61,
+ 0x6c, 0x6c, 0x79, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x47, 0x61, 0x6d, 0x65,
+ 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x65, 0x66, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x49, 0x6e,
+ 0x44, 0x65, 0x66, 0x65, 0x6e, 0x73, 0x65, 0x41, 0x72, 0x65, 0x61, 0x50, 0x61, 0x72, 0x74, 0x69,
+ 0x61, 0x6c, 0x6c, 0x79, 0x42, 0x02, 0x18, 0x01, 0x48, 0x00, 0x52, 0x1e, 0x64, 0x65, 0x66, 0x65,
+ 0x6e, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x44, 0x65, 0x66, 0x65, 0x6e, 0x73, 0x65, 0x41, 0x72, 0x65,
+ 0x61, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x6c, 0x79, 0x12, 0x6a, 0x0a, 0x1b, 0x6d, 0x75,
+ 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74,
+ 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x18, 0x21, 0x20, 0x01, 0x28, 0x0b, 0x32,
+ 0x24, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x4d, 0x75, 0x6c, 0x74,
+ 0x69, 0x70, 0x6c, 0x65, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x46, 0x61, 0x69,
+ 0x6c, 0x75, 0x72, 0x65, 0x73, 0x42, 0x02, 0x18, 0x01, 0x48, 0x00, 0x52, 0x19, 0x6d, 0x75, 0x6c,
+ 0x74, 0x69, 0x70, 0x6c, 0x65, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x46, 0x61,
+ 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x1a, 0x6c, 0x0a, 0x0d, 0x42, 0x61, 0x6c, 0x6c, 0x4c, 0x65,
+ 0x66, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1e, 0x0a, 0x07, 0x62, 0x79, 0x5f, 0x74, 0x65,
+ 0x61, 0x6d, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0e, 0x32, 0x05, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52,
+ 0x06, 0x62, 0x79, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x79, 0x5f, 0x62, 0x6f,
+ 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x79, 0x42, 0x6f, 0x74, 0x12, 0x24,
+ 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b,
+ 0x32, 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x99, 0x01, 0x0a, 0x0b, 0x41, 0x69, 0x6d, 0x6c, 0x65, 0x73, 0x73,
+ 0x4b, 0x69, 0x63, 0x6b, 0x12, 0x1e, 0x0a, 0x07, 0x62, 0x79, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18,
+ 0x01, 0x20, 0x02, 0x28, 0x0e, 0x32, 0x05, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x06, 0x62, 0x79,
+ 0x54, 0x65, 0x61, 0x6d, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x79, 0x5f, 0x62, 0x6f, 0x74, 0x18, 0x02,
+ 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x79, 0x42, 0x6f, 0x74, 0x12, 0x24, 0x0a, 0x08, 0x6c,
+ 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e,
+ 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x12, 0x2d, 0x0a, 0x0d, 0x6b, 0x69, 0x63, 0x6b, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f,
+ 0x72, 0x32, 0x52, 0x0c, 0x6b, 0x69, 0x63, 0x6b, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x1a, 0xe2, 0x02, 0x0a, 0x04, 0x47, 0x6f, 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x07, 0x62, 0x79, 0x5f,
+ 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0e, 0x32, 0x05, 0x2e, 0x54, 0x65, 0x61,
+ 0x6d, 0x52, 0x06, 0x62, 0x79, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x28, 0x0a, 0x0c, 0x6b, 0x69, 0x63,
+ 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32,
+ 0x05, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x0b, 0x6b, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x54,
+ 0x65, 0x61, 0x6d, 0x12, 0x1f, 0x0a, 0x0b, 0x6b, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x62,
+ 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x6b, 0x69, 0x63, 0x6b, 0x69, 0x6e,
+ 0x67, 0x42, 0x6f, 0x74, 0x12, 0x24, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32,
+ 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x0d, 0x6b, 0x69,
+ 0x63, 0x6b, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28,
+ 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x52, 0x0c, 0x6b, 0x69, 0x63,
+ 0x6b, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x0f, 0x6d, 0x61, 0x78,
+ 0x5f, 0x62, 0x61, 0x6c, 0x6c, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x05, 0x20, 0x01,
+ 0x28, 0x02, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x42, 0x61, 0x6c, 0x6c, 0x48, 0x65, 0x69, 0x67, 0x68,
+ 0x74, 0x12, 0x2b, 0x0a, 0x12, 0x6e, 0x75, 0x6d, 0x5f, 0x72, 0x6f, 0x62, 0x6f, 0x74, 0x73, 0x5f,
+ 0x62, 0x79, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x6e,
+ 0x75, 0x6d, 0x52, 0x6f, 0x62, 0x6f, 0x74, 0x73, 0x42, 0x79, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x2b,
+ 0x0a, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x6f, 0x75, 0x63, 0x68, 0x5f, 0x62, 0x79, 0x5f,
+ 0x74, 0x65, 0x61, 0x6d, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x6c, 0x61, 0x73, 0x74,
+ 0x54, 0x6f, 0x75, 0x63, 0x68, 0x42, 0x79, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x18, 0x0a, 0x07, 0x6d,
+ 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65,
+ 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x9a, 0x01, 0x0a, 0x0c, 0x49, 0x6e, 0x64, 0x69, 0x72, 0x65,
+ 0x63, 0x74, 0x47, 0x6f, 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x07, 0x62, 0x79, 0x5f, 0x74, 0x65, 0x61,
+ 0x6d, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0e, 0x32, 0x05, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x06,
+ 0x62, 0x79, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x79, 0x5f, 0x62, 0x6f, 0x74,
+ 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x79, 0x42, 0x6f, 0x74, 0x12, 0x24, 0x0a,
+ 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32,
+ 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x0d, 0x6b, 0x69, 0x63, 0x6b, 0x5f, 0x6c, 0x6f, 0x63, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65, 0x63,
+ 0x74, 0x6f, 0x72, 0x32, 0x52, 0x0c, 0x6b, 0x69, 0x63, 0x6b, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x1a, 0xc1, 0x01, 0x0a, 0x0b, 0x43, 0x68, 0x69, 0x70, 0x70, 0x65, 0x64, 0x47, 0x6f,
+ 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x07, 0x62, 0x79, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20,
+ 0x02, 0x28, 0x0e, 0x32, 0x05, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x06, 0x62, 0x79, 0x54, 0x65,
+ 0x61, 0x6d, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x79, 0x5f, 0x62, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01,
+ 0x28, 0x0d, 0x52, 0x05, 0x62, 0x79, 0x42, 0x6f, 0x74, 0x12, 0x24, 0x0a, 0x08, 0x6c, 0x6f, 0x63,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65,
+ 0x63, 0x74, 0x6f, 0x72, 0x32, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12,
+ 0x2d, 0x0a, 0x0d, 0x6b, 0x69, 0x63, 0x6b, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32,
+ 0x52, 0x0c, 0x6b, 0x69, 0x63, 0x6b, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26,
+ 0x0a, 0x0f, 0x6d, 0x61, 0x78, 0x5f, 0x62, 0x61, 0x6c, 0x6c, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68,
+ 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x42, 0x61, 0x6c, 0x6c,
+ 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x1a, 0x85, 0x01, 0x0a, 0x10, 0x42, 0x6f, 0x74, 0x54, 0x6f,
+ 0x6f, 0x46, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x53, 0x74, 0x6f, 0x70, 0x12, 0x1e, 0x0a, 0x07, 0x62,
+ 0x79, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0e, 0x32, 0x05, 0x2e, 0x54,
+ 0x65, 0x61, 0x6d, 0x52, 0x06, 0x62, 0x79, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x15, 0x0a, 0x06, 0x62,
+ 0x79, 0x5f, 0x62, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x79, 0x42,
+ 0x6f, 0x74, 0x12, 0x24, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03,
+ 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x52, 0x08,
+ 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x70, 0x65, 0x65,
+ 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x73, 0x70, 0x65, 0x65, 0x64, 0x1a, 0x96,
+ 0x01, 0x0a, 0x1b, 0x44, 0x65, 0x66, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x54, 0x6f, 0x6f, 0x43, 0x6c,
+ 0x6f, 0x73, 0x65, 0x54, 0x6f, 0x4b, 0x69, 0x63, 0x6b, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x1e,
+ 0x0a, 0x07, 0x62, 0x79, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0e, 0x32,
+ 0x05, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x06, 0x62, 0x79, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x15,
+ 0x0a, 0x06, 0x62, 0x79, 0x5f, 0x62, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05,
+ 0x62, 0x79, 0x42, 0x6f, 0x74, 0x12, 0x24, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72,
+ 0x32, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x64,
+ 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x08, 0x64,
+ 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x1a, 0xd0, 0x01, 0x0a, 0x0d, 0x42, 0x6f, 0x74, 0x43,
+ 0x72, 0x61, 0x73, 0x68, 0x44, 0x72, 0x61, 0x77, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6f, 0x74,
+ 0x5f, 0x79, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x62,
+ 0x6f, 0x74, 0x59, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x12, 0x19, 0x0a, 0x08, 0x62, 0x6f, 0x74, 0x5f,
+ 0x62, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x62, 0x6f, 0x74, 0x42,
+ 0x6c, 0x75, 0x65, 0x12, 0x24, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18,
+ 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x52,
+ 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x72, 0x61,
+ 0x73, 0x68, 0x5f, 0x73, 0x70, 0x65, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0a,
+ 0x63, 0x72, 0x61, 0x73, 0x68, 0x53, 0x70, 0x65, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x70,
+ 0x65, 0x65, 0x64, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x18, 0x05, 0x20, 0x01, 0x28, 0x02, 0x52, 0x09,
+ 0x73, 0x70, 0x65, 0x65, 0x64, 0x44, 0x69, 0x66, 0x66, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x72, 0x61,
+ 0x73, 0x68, 0x5f, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0a,
+ 0x63, 0x72, 0x61, 0x73, 0x68, 0x41, 0x6e, 0x67, 0x6c, 0x65, 0x1a, 0xeb, 0x01, 0x0a, 0x0e, 0x42,
+ 0x6f, 0x74, 0x43, 0x72, 0x61, 0x73, 0x68, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x12, 0x1e, 0x0a,
+ 0x07, 0x62, 0x79, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0e, 0x32, 0x05,
+ 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x06, 0x62, 0x79, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x1a, 0x0a,
+ 0x08, 0x76, 0x69, 0x6f, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52,
+ 0x08, 0x76, 0x69, 0x6f, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x69, 0x63,
+ 0x74, 0x69, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x76, 0x69, 0x63, 0x74, 0x69,
+ 0x6d, 0x12, 0x24, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20,
+ 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x52, 0x08, 0x6c,
+ 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x72, 0x61, 0x73, 0x68,
+ 0x5f, 0x73, 0x70, 0x65, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0a, 0x63, 0x72,
+ 0x61, 0x73, 0x68, 0x53, 0x70, 0x65, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x70, 0x65, 0x65,
+ 0x64, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x18, 0x06, 0x20, 0x01, 0x28, 0x02, 0x52, 0x09, 0x73, 0x70,
+ 0x65, 0x65, 0x64, 0x44, 0x69, 0x66, 0x66, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x72, 0x61, 0x73, 0x68,
+ 0x5f, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0a, 0x63, 0x72,
+ 0x61, 0x73, 0x68, 0x41, 0x6e, 0x67, 0x6c, 0x65, 0x1a, 0xb1, 0x01, 0x0a, 0x0c, 0x42, 0x6f, 0x74,
+ 0x50, 0x75, 0x73, 0x68, 0x65, 0x64, 0x42, 0x6f, 0x74, 0x12, 0x1e, 0x0a, 0x07, 0x62, 0x79, 0x5f,
+ 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0e, 0x32, 0x05, 0x2e, 0x54, 0x65, 0x61,
+ 0x6d, 0x52, 0x06, 0x62, 0x79, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x1a, 0x0a, 0x08, 0x76, 0x69, 0x6f,
+ 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x76, 0x69, 0x6f,
+ 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6d, 0x18,
+ 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6d, 0x12, 0x24, 0x0a,
+ 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32,
+ 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x75, 0x73, 0x68, 0x65, 0x64, 0x5f, 0x64, 0x69,
+ 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0e, 0x70, 0x75,
+ 0x73, 0x68, 0x65, 0x64, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x1a, 0x9b, 0x01, 0x0a,
+ 0x0d, 0x42, 0x6f, 0x74, 0x54, 0x69, 0x70, 0x70, 0x65, 0x64, 0x4f, 0x76, 0x65, 0x72, 0x12, 0x1e,
+ 0x0a, 0x07, 0x62, 0x79, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0e, 0x32,
+ 0x05, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x06, 0x62, 0x79, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x15,
+ 0x0a, 0x06, 0x62, 0x79, 0x5f, 0x62, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05,
+ 0x62, 0x79, 0x42, 0x6f, 0x74, 0x12, 0x24, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72,
+ 0x32, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x0d, 0x62,
+ 0x61, 0x6c, 0x6c, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01,
+ 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x52, 0x0c, 0x62, 0x61,
+ 0x6c, 0x6c, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x90, 0x01, 0x0a, 0x15, 0x44,
+ 0x65, 0x66, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x44, 0x65, 0x66, 0x65, 0x6e, 0x73, 0x65,
+ 0x41, 0x72, 0x65, 0x61, 0x12, 0x1e, 0x0a, 0x07, 0x62, 0x79, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18,
+ 0x01, 0x20, 0x02, 0x28, 0x0e, 0x32, 0x05, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x06, 0x62, 0x79,
+ 0x54, 0x65, 0x61, 0x6d, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x79, 0x5f, 0x62, 0x6f, 0x74, 0x18, 0x02,
+ 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x79, 0x42, 0x6f, 0x74, 0x12, 0x24, 0x0a, 0x08, 0x6c,
+ 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e,
+ 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20,
+ 0x01, 0x28, 0x02, 0x52, 0x08, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x1a, 0xc8, 0x01,
+ 0x0a, 0x1e, 0x44, 0x65, 0x66, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x44, 0x65, 0x66, 0x65,
+ 0x6e, 0x73, 0x65, 0x41, 0x72, 0x65, 0x61, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x6c, 0x79,
+ 0x12, 0x1e, 0x0a, 0x07, 0x62, 0x79, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x02, 0x28,
+ 0x0e, 0x32, 0x05, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x06, 0x62, 0x79, 0x54, 0x65, 0x61, 0x6d,
+ 0x12, 0x15, 0x0a, 0x06, 0x62, 0x79, 0x5f, 0x62, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d,
+ 0x52, 0x05, 0x62, 0x79, 0x42, 0x6f, 0x74, 0x12, 0x24, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74,
+ 0x6f, 0x72, 0x32, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a,
+ 0x08, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52,
+ 0x08, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x2d, 0x0a, 0x0d, 0x62, 0x61, 0x6c,
+ 0x6c, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b,
+ 0x32, 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x52, 0x0c, 0x62, 0x61, 0x6c, 0x6c,
+ 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x9b, 0x01, 0x0a, 0x20, 0x41, 0x74, 0x74,
+ 0x61, 0x63, 0x6b, 0x65, 0x72, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x64, 0x42, 0x61, 0x6c, 0x6c,
+ 0x49, 0x6e, 0x44, 0x65, 0x66, 0x65, 0x6e, 0x73, 0x65, 0x41, 0x72, 0x65, 0x61, 0x12, 0x1e, 0x0a,
+ 0x07, 0x62, 0x79, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0e, 0x32, 0x05,
+ 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x06, 0x62, 0x79, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x15, 0x0a,
+ 0x06, 0x62, 0x79, 0x5f, 0x62, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62,
+ 0x79, 0x42, 0x6f, 0x74, 0x12, 0x24, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32,
+ 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69,
+ 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x08, 0x64, 0x69,
+ 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x1a, 0xbb, 0x01, 0x0a, 0x14, 0x42, 0x6f, 0x74, 0x4b, 0x69,
+ 0x63, 0x6b, 0x65, 0x64, 0x42, 0x61, 0x6c, 0x6c, 0x54, 0x6f, 0x6f, 0x46, 0x61, 0x73, 0x74, 0x12,
+ 0x1e, 0x0a, 0x07, 0x62, 0x79, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0e,
+ 0x32, 0x05, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x06, 0x62, 0x79, 0x54, 0x65, 0x61, 0x6d, 0x12,
+ 0x15, 0x0a, 0x06, 0x62, 0x79, 0x5f, 0x62, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52,
+ 0x05, 0x62, 0x79, 0x42, 0x6f, 0x74, 0x12, 0x24, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f,
+ 0x72, 0x32, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x0a, 0x12,
+ 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x62, 0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x70, 0x65,
+ 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x10, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61,
+ 0x6c, 0x42, 0x61, 0x6c, 0x6c, 0x53, 0x70, 0x65, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x68,
+ 0x69, 0x70, 0x70, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x63, 0x68, 0x69,
+ 0x70, 0x70, 0x65, 0x64, 0x1a, 0x8a, 0x01, 0x0a, 0x15, 0x42, 0x6f, 0x74, 0x44, 0x72, 0x69, 0x62,
+ 0x62, 0x6c, 0x65, 0x64, 0x42, 0x61, 0x6c, 0x6c, 0x54, 0x6f, 0x6f, 0x46, 0x61, 0x72, 0x12, 0x1e,
+ 0x0a, 0x07, 0x62, 0x79, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0e, 0x32,
+ 0x05, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x06, 0x62, 0x79, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x15,
+ 0x0a, 0x06, 0x62, 0x79, 0x5f, 0x62, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05,
+ 0x62, 0x79, 0x42, 0x6f, 0x74, 0x12, 0x1e, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x03,
+ 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x52, 0x05,
+ 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01,
+ 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x52, 0x03, 0x65, 0x6e,
+ 0x64, 0x1a, 0x9b, 0x01, 0x0a, 0x24, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x65, 0x72, 0x54, 0x6f,
+ 0x75, 0x63, 0x68, 0x65, 0x64, 0x4f, 0x70, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x44,
+ 0x65, 0x66, 0x65, 0x6e, 0x73, 0x65, 0x41, 0x72, 0x65, 0x61, 0x12, 0x1e, 0x0a, 0x07, 0x62, 0x79,
+ 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0e, 0x32, 0x05, 0x2e, 0x54, 0x65,
+ 0x61, 0x6d, 0x52, 0x06, 0x62, 0x79, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x79,
+ 0x5f, 0x62, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x79, 0x42, 0x6f,
+ 0x74, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28,
+ 0x0d, 0x52, 0x06, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6d, 0x12, 0x24, 0x0a, 0x08, 0x6c, 0x6f, 0x63,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65,
+ 0x63, 0x74, 0x6f, 0x72, 0x32, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a,
+ 0x78, 0x0a, 0x19, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x65, 0x72, 0x44, 0x6f, 0x75, 0x62, 0x6c,
+ 0x65, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x64, 0x42, 0x61, 0x6c, 0x6c, 0x12, 0x1e, 0x0a, 0x07,
+ 0x62, 0x79, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0e, 0x32, 0x05, 0x2e,
+ 0x54, 0x65, 0x61, 0x6d, 0x52, 0x06, 0x62, 0x79, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x15, 0x0a, 0x06,
+ 0x62, 0x79, 0x5f, 0x62, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x79,
+ 0x42, 0x6f, 0x74, 0x12, 0x24, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18,
+ 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x52,
+ 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xc7, 0x01, 0x0a, 0x1d, 0x41, 0x74,
+ 0x74, 0x61, 0x63, 0x6b, 0x65, 0x72, 0x54, 0x6f, 0x6f, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x54, 0x6f,
+ 0x44, 0x65, 0x66, 0x65, 0x6e, 0x73, 0x65, 0x41, 0x72, 0x65, 0x61, 0x12, 0x1e, 0x0a, 0x07, 0x62,
+ 0x79, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0e, 0x32, 0x05, 0x2e, 0x54,
+ 0x65, 0x61, 0x6d, 0x52, 0x06, 0x62, 0x79, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x15, 0x0a, 0x06, 0x62,
+ 0x79, 0x5f, 0x62, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x79, 0x42,
+ 0x6f, 0x74, 0x12, 0x24, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03,
+ 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x52, 0x08,
+ 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x74,
+ 0x61, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x08, 0x64, 0x69, 0x73, 0x74,
+ 0x61, 0x6e, 0x63, 0x65, 0x12, 0x2d, 0x0a, 0x0d, 0x62, 0x61, 0x6c, 0x6c, 0x5f, 0x6c, 0x6f, 0x63,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65,
+ 0x63, 0x74, 0x6f, 0x72, 0x32, 0x52, 0x0c, 0x62, 0x61, 0x6c, 0x6c, 0x4c, 0x6f, 0x63, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x1a, 0x92, 0x01, 0x0a, 0x17, 0x42, 0x6f, 0x74, 0x48, 0x65, 0x6c, 0x64, 0x42,
+ 0x61, 0x6c, 0x6c, 0x44, 0x65, 0x6c, 0x69, 0x62, 0x65, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x79, 0x12,
+ 0x1e, 0x0a, 0x07, 0x62, 0x79, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0e,
+ 0x32, 0x05, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x06, 0x62, 0x79, 0x54, 0x65, 0x61, 0x6d, 0x12,
+ 0x15, 0x0a, 0x06, 0x62, 0x79, 0x5f, 0x62, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52,
+ 0x05, 0x62, 0x79, 0x42, 0x6f, 0x74, 0x12, 0x24, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f,
+ 0x72, 0x32, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08,
+ 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x08,
+ 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x75, 0x0a, 0x16, 0x42, 0x6f, 0x74, 0x49,
+ 0x6e, 0x74, 0x65, 0x72, 0x66, 0x65, 0x72, 0x65, 0x64, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65,
+ 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x07, 0x62, 0x79, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20,
+ 0x02, 0x28, 0x0e, 0x32, 0x05, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x06, 0x62, 0x79, 0x54, 0x65,
+ 0x61, 0x6d, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x79, 0x5f, 0x62, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01,
+ 0x28, 0x0d, 0x52, 0x05, 0x62, 0x79, 0x42, 0x6f, 0x74, 0x12, 0x24, 0x0a, 0x08, 0x6c, 0x6f, 0x63,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65,
+ 0x63, 0x74, 0x6f, 0x72, 0x32, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a,
+ 0x2f, 0x0a, 0x0d, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x43, 0x61, 0x72, 0x64, 0x73,
+ 0x12, 0x1e, 0x0a, 0x07, 0x62, 0x79, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x02, 0x28,
+ 0x0e, 0x32, 0x05, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x06, 0x62, 0x79, 0x54, 0x65, 0x61, 0x6d,
+ 0x1a, 0x2f, 0x0a, 0x0d, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x46, 0x6f, 0x75, 0x6c,
+ 0x73, 0x12, 0x1e, 0x0a, 0x07, 0x62, 0x79, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x02,
+ 0x28, 0x0e, 0x32, 0x05, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x06, 0x62, 0x79, 0x54, 0x65, 0x61,
+ 0x6d, 0x1a, 0x3b, 0x0a, 0x19, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x50, 0x6c, 0x61,
+ 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x12, 0x1e,
+ 0x0a, 0x07, 0x62, 0x79, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0e, 0x32,
+ 0x05, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x06, 0x62, 0x79, 0x54, 0x65, 0x61, 0x6d, 0x1a, 0x67,
+ 0x0a, 0x0b, 0x4b, 0x69, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x1e, 0x0a,
+ 0x07, 0x62, 0x79, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0e, 0x32, 0x05,
+ 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x06, 0x62, 0x79, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x24, 0x0a,
+ 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32,
+ 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28,
+ 0x02, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x1a, 0x4c, 0x0a, 0x10, 0x4e, 0x6f, 0x50, 0x72, 0x6f,
+ 0x67, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x47, 0x61, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x08, 0x6c,
+ 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e,
+ 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52,
+ 0x04, 0x74, 0x69, 0x6d, 0x65, 0x1a, 0x60, 0x0a, 0x0f, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65,
+ 0x6e, 0x74, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x12, 0x1e, 0x0a, 0x07, 0x62, 0x79, 0x5f, 0x74,
+ 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0e, 0x32, 0x05, 0x2e, 0x54, 0x65, 0x61, 0x6d,
+ 0x52, 0x06, 0x62, 0x79, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x2d, 0x0a, 0x12, 0x72, 0x65, 0x6d, 0x61,
+ 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x02,
+ 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x72, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x44,
+ 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x1a, 0x51, 0x0a, 0x17, 0x55, 0x6e, 0x73, 0x70, 0x6f,
+ 0x72, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x4d, 0x69, 0x6e,
+ 0x6f, 0x72, 0x12, 0x1e, 0x0a, 0x07, 0x62, 0x79, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20,
+ 0x02, 0x28, 0x0e, 0x32, 0x05, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x06, 0x62, 0x79, 0x54, 0x65,
+ 0x61, 0x6d, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x02,
+ 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x1a, 0x51, 0x0a, 0x17, 0x55, 0x6e,
+ 0x73, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72,
+ 0x4d, 0x61, 0x6a, 0x6f, 0x72, 0x12, 0x1e, 0x0a, 0x07, 0x62, 0x79, 0x5f, 0x74, 0x65, 0x61, 0x6d,
+ 0x18, 0x01, 0x20, 0x02, 0x28, 0x0e, 0x32, 0x05, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x06, 0x62,
+ 0x79, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18,
+ 0x02, 0x20, 0x02, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x1a, 0x72, 0x0a,
+ 0x0e, 0x4b, 0x65, 0x65, 0x70, 0x65, 0x72, 0x48, 0x65, 0x6c, 0x64, 0x42, 0x61, 0x6c, 0x6c, 0x12,
+ 0x1e, 0x0a, 0x07, 0x62, 0x79, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0e,
+ 0x32, 0x05, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x06, 0x62, 0x79, 0x54, 0x65, 0x61, 0x6d, 0x12,
+ 0x24, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28,
+ 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x52, 0x08, 0x6c, 0x6f, 0x63,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x1a, 0x8d, 0x01, 0x0a, 0x12, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53,
+ 0x75, 0x63, 0x63, 0x65, 0x65, 0x64, 0x65, 0x64, 0x12, 0x1e, 0x0a, 0x07, 0x62, 0x79, 0x5f, 0x74,
+ 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0e, 0x32, 0x05, 0x2e, 0x54, 0x65, 0x61, 0x6d,
+ 0x52, 0x06, 0x62, 0x79, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65,
+ 0x5f, 0x74, 0x61, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x09, 0x74, 0x69,
+ 0x6d, 0x65, 0x54, 0x61, 0x6b, 0x65, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x65, 0x63, 0x69,
+ 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x09, 0x70, 0x72, 0x65, 0x63,
+ 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63,
+ 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x08, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63,
+ 0x65, 0x1a, 0x29, 0x0a, 0x08, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x64, 0x12, 0x1d, 0x0a,
+ 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x74, 0x61, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28,
+ 0x02, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x54, 0x61, 0x6b, 0x65, 0x6e, 0x1a, 0x31, 0x0a, 0x0f,
+ 0x42, 0x6f, 0x74, 0x53, 0x75, 0x62, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x12,
+ 0x1e, 0x0a, 0x07, 0x62, 0x79, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0e,
+ 0x32, 0x05, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x06, 0x62, 0x79, 0x54, 0x65, 0x61, 0x6d, 0x1a,
+ 0x2f, 0x0a, 0x0d, 0x43, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x46, 0x6c, 0x61, 0x67,
+ 0x12, 0x1e, 0x0a, 0x07, 0x62, 0x79, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x02, 0x28,
+ 0x0e, 0x32, 0x05, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x06, 0x62, 0x79, 0x54, 0x65, 0x61, 0x6d,
+ 0x1a, 0x2f, 0x0a, 0x0d, 0x45, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x53, 0x74, 0x6f,
+ 0x70, 0x12, 0x1e, 0x0a, 0x07, 0x62, 0x79, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x02,
+ 0x28, 0x0e, 0x32, 0x05, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x06, 0x62, 0x79, 0x54, 0x65, 0x61,
+ 0x6d, 0x1a, 0xbb, 0x01, 0x0a, 0x0d, 0x54, 0x6f, 0x6f, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x6f, 0x62,
+ 0x6f, 0x74, 0x73, 0x12, 0x1e, 0x0a, 0x07, 0x62, 0x79, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01,
+ 0x20, 0x02, 0x28, 0x0e, 0x32, 0x05, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x06, 0x62, 0x79, 0x54,
+ 0x65, 0x61, 0x6d, 0x12, 0x2c, 0x0a, 0x12, 0x6e, 0x75, 0x6d, 0x5f, 0x72, 0x6f, 0x62, 0x6f, 0x74,
+ 0x73, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52,
+ 0x10, 0x6e, 0x75, 0x6d, 0x52, 0x6f, 0x62, 0x6f, 0x74, 0x73, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65,
+ 0x64, 0x12, 0x2d, 0x0a, 0x13, 0x6e, 0x75, 0x6d, 0x5f, 0x72, 0x6f, 0x62, 0x6f, 0x74, 0x73, 0x5f,
+ 0x6f, 0x6e, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10,
+ 0x6e, 0x75, 0x6d, 0x52, 0x6f, 0x62, 0x6f, 0x74, 0x73, 0x4f, 0x6e, 0x46, 0x69, 0x65, 0x6c, 0x64,
+ 0x12, 0x2d, 0x0a, 0x0d, 0x62, 0x61, 0x6c, 0x6c, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72,
+ 0x32, 0x52, 0x0c, 0x62, 0x61, 0x6c, 0x6c, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a,
+ 0x58, 0x0a, 0x10, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x43, 0x72, 0x6f, 0x73, 0x73,
+ 0x69, 0x6e, 0x67, 0x12, 0x1e, 0x0a, 0x07, 0x62, 0x79, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01,
+ 0x20, 0x02, 0x28, 0x0e, 0x32, 0x05, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x06, 0x62, 0x79, 0x54,
+ 0x65, 0x61, 0x6d, 0x12, 0x24, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18,
+ 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x52,
+ 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x59, 0x0a, 0x11, 0x50, 0x65, 0x6e,
+ 0x61, 0x6c, 0x74, 0x79, 0x4b, 0x69, 0x63, 0x6b, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x12, 0x1e,
+ 0x0a, 0x07, 0x62, 0x79, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0e, 0x32,
+ 0x05, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x06, 0x62, 0x79, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x24,
+ 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,
+ 0x32, 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xe2, 0x09, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a,
+ 0x17, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x47, 0x41, 0x4d, 0x45, 0x5f, 0x45, 0x56,
+ 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x00, 0x12, 0x1e, 0x0a, 0x1a, 0x42, 0x41,
+ 0x4c, 0x4c, 0x5f, 0x4c, 0x45, 0x46, 0x54, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x54, 0x4f,
+ 0x55, 0x43, 0x48, 0x5f, 0x4c, 0x49, 0x4e, 0x45, 0x10, 0x06, 0x12, 0x1d, 0x0a, 0x19, 0x42, 0x41,
+ 0x4c, 0x4c, 0x5f, 0x4c, 0x45, 0x46, 0x54, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x47, 0x4f,
+ 0x41, 0x4c, 0x5f, 0x4c, 0x49, 0x4e, 0x45, 0x10, 0x07, 0x12, 0x10, 0x0a, 0x0c, 0x41, 0x49, 0x4d,
+ 0x4c, 0x45, 0x53, 0x53, 0x5f, 0x4b, 0x49, 0x43, 0x4b, 0x10, 0x0b, 0x12, 0x26, 0x0a, 0x22, 0x41,
+ 0x54, 0x54, 0x41, 0x43, 0x4b, 0x45, 0x52, 0x5f, 0x54, 0x4f, 0x4f, 0x5f, 0x43, 0x4c, 0x4f, 0x53,
+ 0x45, 0x5f, 0x54, 0x4f, 0x5f, 0x44, 0x45, 0x46, 0x45, 0x4e, 0x53, 0x45, 0x5f, 0x41, 0x52, 0x45,
+ 0x41, 0x10, 0x13, 0x12, 0x1c, 0x0a, 0x18, 0x44, 0x45, 0x46, 0x45, 0x4e, 0x44, 0x45, 0x52, 0x5f,
+ 0x49, 0x4e, 0x5f, 0x44, 0x45, 0x46, 0x45, 0x4e, 0x53, 0x45, 0x5f, 0x41, 0x52, 0x45, 0x41, 0x10,
+ 0x1f, 0x12, 0x15, 0x0a, 0x11, 0x42, 0x4f, 0x55, 0x4e, 0x44, 0x41, 0x52, 0x59, 0x5f, 0x43, 0x52,
+ 0x4f, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x10, 0x29, 0x12, 0x14, 0x0a, 0x10, 0x4b, 0x45, 0x45, 0x50,
+ 0x45, 0x52, 0x5f, 0x48, 0x45, 0x4c, 0x44, 0x5f, 0x42, 0x41, 0x4c, 0x4c, 0x10, 0x0d, 0x12, 0x1d,
+ 0x0a, 0x19, 0x42, 0x4f, 0x54, 0x5f, 0x44, 0x52, 0x49, 0x42, 0x42, 0x4c, 0x45, 0x44, 0x5f, 0x42,
+ 0x41, 0x4c, 0x4c, 0x5f, 0x54, 0x4f, 0x4f, 0x5f, 0x46, 0x41, 0x52, 0x10, 0x11, 0x12, 0x12, 0x0a,
+ 0x0e, 0x42, 0x4f, 0x54, 0x5f, 0x50, 0x55, 0x53, 0x48, 0x45, 0x44, 0x5f, 0x42, 0x4f, 0x54, 0x10,
+ 0x18, 0x12, 0x1e, 0x0a, 0x1a, 0x42, 0x4f, 0x54, 0x5f, 0x48, 0x45, 0x4c, 0x44, 0x5f, 0x42, 0x41,
+ 0x4c, 0x4c, 0x5f, 0x44, 0x45, 0x4c, 0x49, 0x42, 0x45, 0x52, 0x41, 0x54, 0x45, 0x4c, 0x59, 0x10,
+ 0x1a, 0x12, 0x13, 0x0a, 0x0f, 0x42, 0x4f, 0x54, 0x5f, 0x54, 0x49, 0x50, 0x50, 0x45, 0x44, 0x5f,
+ 0x4f, 0x56, 0x45, 0x52, 0x10, 0x1b, 0x12, 0x29, 0x0a, 0x25, 0x41, 0x54, 0x54, 0x41, 0x43, 0x4b,
+ 0x45, 0x52, 0x5f, 0x54, 0x4f, 0x55, 0x43, 0x48, 0x45, 0x44, 0x5f, 0x42, 0x41, 0x4c, 0x4c, 0x5f,
+ 0x49, 0x4e, 0x5f, 0x44, 0x45, 0x46, 0x45, 0x4e, 0x53, 0x45, 0x5f, 0x41, 0x52, 0x45, 0x41, 0x10,
+ 0x0f, 0x12, 0x1c, 0x0a, 0x18, 0x42, 0x4f, 0x54, 0x5f, 0x4b, 0x49, 0x43, 0x4b, 0x45, 0x44, 0x5f,
+ 0x42, 0x41, 0x4c, 0x4c, 0x5f, 0x54, 0x4f, 0x4f, 0x5f, 0x46, 0x41, 0x53, 0x54, 0x10, 0x12, 0x12,
+ 0x14, 0x0a, 0x10, 0x42, 0x4f, 0x54, 0x5f, 0x43, 0x52, 0x41, 0x53, 0x48, 0x5f, 0x55, 0x4e, 0x49,
+ 0x51, 0x55, 0x45, 0x10, 0x16, 0x12, 0x13, 0x0a, 0x0f, 0x42, 0x4f, 0x54, 0x5f, 0x43, 0x52, 0x41,
+ 0x53, 0x48, 0x5f, 0x44, 0x52, 0x41, 0x57, 0x4e, 0x10, 0x15, 0x12, 0x24, 0x0a, 0x20, 0x44, 0x45,
+ 0x46, 0x45, 0x4e, 0x44, 0x45, 0x52, 0x5f, 0x54, 0x4f, 0x4f, 0x5f, 0x43, 0x4c, 0x4f, 0x53, 0x45,
+ 0x5f, 0x54, 0x4f, 0x5f, 0x4b, 0x49, 0x43, 0x4b, 0x5f, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x10, 0x1d,
+ 0x12, 0x18, 0x0a, 0x14, 0x42, 0x4f, 0x54, 0x5f, 0x54, 0x4f, 0x4f, 0x5f, 0x46, 0x41, 0x53, 0x54,
+ 0x5f, 0x49, 0x4e, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x10, 0x1c, 0x12, 0x1c, 0x0a, 0x18, 0x42, 0x4f,
+ 0x54, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x46, 0x45, 0x52, 0x45, 0x44, 0x5f, 0x50, 0x4c, 0x41,
+ 0x43, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x14, 0x12, 0x11, 0x0a, 0x0d, 0x50, 0x4f, 0x53, 0x53,
+ 0x49, 0x42, 0x4c, 0x45, 0x5f, 0x47, 0x4f, 0x41, 0x4c, 0x10, 0x27, 0x12, 0x08, 0x0a, 0x04, 0x47,
+ 0x4f, 0x41, 0x4c, 0x10, 0x08, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44,
+ 0x5f, 0x47, 0x4f, 0x41, 0x4c, 0x10, 0x2a, 0x12, 0x20, 0x0a, 0x1c, 0x41, 0x54, 0x54, 0x41, 0x43,
+ 0x4b, 0x45, 0x52, 0x5f, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x5f, 0x54, 0x4f, 0x55, 0x43, 0x48,
+ 0x45, 0x44, 0x5f, 0x42, 0x41, 0x4c, 0x4c, 0x10, 0x0e, 0x12, 0x17, 0x0a, 0x13, 0x50, 0x4c, 0x41,
+ 0x43, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, 0x45, 0x44, 0x45, 0x44,
+ 0x10, 0x05, 0x12, 0x17, 0x0a, 0x13, 0x50, 0x45, 0x4e, 0x41, 0x4c, 0x54, 0x59, 0x5f, 0x4b, 0x49,
+ 0x43, 0x4b, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x2b, 0x12, 0x17, 0x0a, 0x13, 0x4e,
+ 0x4f, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x5f, 0x49, 0x4e, 0x5f, 0x47, 0x41,
+ 0x4d, 0x45, 0x10, 0x02, 0x12, 0x14, 0x0a, 0x10, 0x50, 0x4c, 0x41, 0x43, 0x45, 0x4d, 0x45, 0x4e,
+ 0x54, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x03, 0x12, 0x12, 0x0a, 0x0e, 0x4d, 0x55,
+ 0x4c, 0x54, 0x49, 0x50, 0x4c, 0x45, 0x5f, 0x43, 0x41, 0x52, 0x44, 0x53, 0x10, 0x20, 0x12, 0x12,
+ 0x0a, 0x0e, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x50, 0x4c, 0x45, 0x5f, 0x46, 0x4f, 0x55, 0x4c, 0x53,
+ 0x10, 0x22, 0x12, 0x14, 0x0a, 0x10, 0x42, 0x4f, 0x54, 0x5f, 0x53, 0x55, 0x42, 0x53, 0x54, 0x49,
+ 0x54, 0x55, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x25, 0x12, 0x13, 0x0a, 0x0f, 0x54, 0x4f, 0x4f, 0x5f,
+ 0x4d, 0x41, 0x4e, 0x59, 0x5f, 0x52, 0x4f, 0x42, 0x4f, 0x54, 0x53, 0x10, 0x26, 0x12, 0x12, 0x0a,
+ 0x0e, 0x43, 0x48, 0x41, 0x4c, 0x4c, 0x45, 0x4e, 0x47, 0x45, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10,
+ 0x2c, 0x12, 0x12, 0x0a, 0x0e, 0x45, 0x4d, 0x45, 0x52, 0x47, 0x45, 0x4e, 0x43, 0x59, 0x5f, 0x53,
+ 0x54, 0x4f, 0x50, 0x10, 0x2d, 0x12, 0x1d, 0x0a, 0x19, 0x55, 0x4e, 0x53, 0x50, 0x4f, 0x52, 0x54,
+ 0x49, 0x4e, 0x47, 0x5f, 0x42, 0x45, 0x48, 0x41, 0x56, 0x49, 0x4f, 0x52, 0x5f, 0x4d, 0x49, 0x4e,
+ 0x4f, 0x52, 0x10, 0x23, 0x12, 0x1d, 0x0a, 0x19, 0x55, 0x4e, 0x53, 0x50, 0x4f, 0x52, 0x54, 0x49,
+ 0x4e, 0x47, 0x5f, 0x42, 0x45, 0x48, 0x41, 0x56, 0x49, 0x4f, 0x52, 0x5f, 0x4d, 0x41, 0x4a, 0x4f,
+ 0x52, 0x10, 0x24, 0x12, 0x10, 0x0a, 0x08, 0x50, 0x52, 0x45, 0x50, 0x41, 0x52, 0x45, 0x44, 0x10,
+ 0x01, 0x1a, 0x02, 0x08, 0x01, 0x12, 0x15, 0x0a, 0x0d, 0x49, 0x4e, 0x44, 0x49, 0x52, 0x45, 0x43,
+ 0x54, 0x5f, 0x47, 0x4f, 0x41, 0x4c, 0x10, 0x09, 0x1a, 0x02, 0x08, 0x01, 0x12, 0x14, 0x0a, 0x0c,
+ 0x43, 0x48, 0x49, 0x50, 0x50, 0x45, 0x44, 0x5f, 0x47, 0x4f, 0x41, 0x4c, 0x10, 0x0a, 0x1a, 0x02,
+ 0x08, 0x01, 0x12, 0x14, 0x0a, 0x0c, 0x4b, 0x49, 0x43, 0x4b, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x4f,
+ 0x55, 0x54, 0x10, 0x0c, 0x1a, 0x02, 0x08, 0x01, 0x12, 0x31, 0x0a, 0x29, 0x41, 0x54, 0x54, 0x41,
+ 0x43, 0x4b, 0x45, 0x52, 0x5f, 0x54, 0x4f, 0x55, 0x43, 0x48, 0x45, 0x44, 0x5f, 0x4f, 0x50, 0x50,
+ 0x4f, 0x4e, 0x45, 0x4e, 0x54, 0x5f, 0x49, 0x4e, 0x5f, 0x44, 0x45, 0x46, 0x45, 0x4e, 0x53, 0x45,
+ 0x5f, 0x41, 0x52, 0x45, 0x41, 0x10, 0x10, 0x1a, 0x02, 0x08, 0x01, 0x12, 0x39, 0x0a, 0x31, 0x41,
+ 0x54, 0x54, 0x41, 0x43, 0x4b, 0x45, 0x52, 0x5f, 0x54, 0x4f, 0x55, 0x43, 0x48, 0x45, 0x44, 0x5f,
+ 0x4f, 0x50, 0x50, 0x4f, 0x4e, 0x45, 0x4e, 0x54, 0x5f, 0x49, 0x4e, 0x5f, 0x44, 0x45, 0x46, 0x45,
+ 0x4e, 0x53, 0x45, 0x5f, 0x41, 0x52, 0x45, 0x41, 0x5f, 0x53, 0x4b, 0x49, 0x50, 0x50, 0x45, 0x44,
+ 0x10, 0x28, 0x1a, 0x02, 0x08, 0x01, 0x12, 0x20, 0x0a, 0x18, 0x42, 0x4f, 0x54, 0x5f, 0x43, 0x52,
+ 0x41, 0x53, 0x48, 0x5f, 0x55, 0x4e, 0x49, 0x51, 0x55, 0x45, 0x5f, 0x53, 0x4b, 0x49, 0x50, 0x50,
+ 0x45, 0x44, 0x10, 0x17, 0x1a, 0x02, 0x08, 0x01, 0x12, 0x1e, 0x0a, 0x16, 0x42, 0x4f, 0x54, 0x5f,
+ 0x50, 0x55, 0x53, 0x48, 0x45, 0x44, 0x5f, 0x42, 0x4f, 0x54, 0x5f, 0x53, 0x4b, 0x49, 0x50, 0x50,
+ 0x45, 0x44, 0x10, 0x19, 0x1a, 0x02, 0x08, 0x01, 0x12, 0x2a, 0x0a, 0x22, 0x44, 0x45, 0x46, 0x45,
+ 0x4e, 0x44, 0x45, 0x52, 0x5f, 0x49, 0x4e, 0x5f, 0x44, 0x45, 0x46, 0x45, 0x4e, 0x53, 0x45, 0x5f,
+ 0x41, 0x52, 0x45, 0x41, 0x5f, 0x50, 0x41, 0x52, 0x54, 0x49, 0x41, 0x4c, 0x4c, 0x59, 0x10, 0x1e,
+ 0x1a, 0x02, 0x08, 0x01, 0x12, 0x23, 0x0a, 0x1b, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x50, 0x4c, 0x45,
+ 0x5f, 0x50, 0x4c, 0x41, 0x43, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x55,
+ 0x52, 0x45, 0x53, 0x10, 0x21, 0x1a, 0x02, 0x08, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65,
+ 0x6e, 0x74, 0x42, 0x43, 0x5a, 0x41, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d,
+ 0x2f, 0x52, 0x6f, 0x62, 0x6f, 0x43, 0x75, 0x70, 0x2d, 0x53, 0x53, 0x4c, 0x2f, 0x73, 0x73, 0x6c,
+ 0x2d, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x63, 0x6f, 0x6e, 0x74,
+ 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f,
+ 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65,
+}
+
+var (
+ file_ssl_gc_game_event_proto_rawDescOnce sync.Once
+ file_ssl_gc_game_event_proto_rawDescData = file_ssl_gc_game_event_proto_rawDesc
+)
+
+func file_ssl_gc_game_event_proto_rawDescGZIP() []byte {
+ file_ssl_gc_game_event_proto_rawDescOnce.Do(func() {
+ file_ssl_gc_game_event_proto_rawDescData = protoimpl.X.CompressGZIP(file_ssl_gc_game_event_proto_rawDescData)
+ })
+ return file_ssl_gc_game_event_proto_rawDescData
+}
+
+var file_ssl_gc_game_event_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
+var file_ssl_gc_game_event_proto_msgTypes = make([]protoimpl.MessageInfo, 39)
+var file_ssl_gc_game_event_proto_goTypes = []interface{}{
+ (GameEvent_Type)(0), // 0: GameEvent.Type
+ (*GameEvent)(nil), // 1: GameEvent
+ (*GameEvent_BallLeftField)(nil), // 2: GameEvent.BallLeftField
+ (*GameEvent_AimlessKick)(nil), // 3: GameEvent.AimlessKick
+ (*GameEvent_Goal)(nil), // 4: GameEvent.Goal
+ (*GameEvent_IndirectGoal)(nil), // 5: GameEvent.IndirectGoal
+ (*GameEvent_ChippedGoal)(nil), // 6: GameEvent.ChippedGoal
+ (*GameEvent_BotTooFastInStop)(nil), // 7: GameEvent.BotTooFastInStop
+ (*GameEvent_DefenderTooCloseToKickPoint)(nil), // 8: GameEvent.DefenderTooCloseToKickPoint
+ (*GameEvent_BotCrashDrawn)(nil), // 9: GameEvent.BotCrashDrawn
+ (*GameEvent_BotCrashUnique)(nil), // 10: GameEvent.BotCrashUnique
+ (*GameEvent_BotPushedBot)(nil), // 11: GameEvent.BotPushedBot
+ (*GameEvent_BotTippedOver)(nil), // 12: GameEvent.BotTippedOver
+ (*GameEvent_DefenderInDefenseArea)(nil), // 13: GameEvent.DefenderInDefenseArea
+ (*GameEvent_DefenderInDefenseAreaPartially)(nil), // 14: GameEvent.DefenderInDefenseAreaPartially
+ (*GameEvent_AttackerTouchedBallInDefenseArea)(nil), // 15: GameEvent.AttackerTouchedBallInDefenseArea
+ (*GameEvent_BotKickedBallTooFast)(nil), // 16: GameEvent.BotKickedBallTooFast
+ (*GameEvent_BotDribbledBallTooFar)(nil), // 17: GameEvent.BotDribbledBallTooFar
+ (*GameEvent_AttackerTouchedOpponentInDefenseArea)(nil), // 18: GameEvent.AttackerTouchedOpponentInDefenseArea
+ (*GameEvent_AttackerDoubleTouchedBall)(nil), // 19: GameEvent.AttackerDoubleTouchedBall
+ (*GameEvent_AttackerTooCloseToDefenseArea)(nil), // 20: GameEvent.AttackerTooCloseToDefenseArea
+ (*GameEvent_BotHeldBallDeliberately)(nil), // 21: GameEvent.BotHeldBallDeliberately
+ (*GameEvent_BotInterferedPlacement)(nil), // 22: GameEvent.BotInterferedPlacement
+ (*GameEvent_MultipleCards)(nil), // 23: GameEvent.MultipleCards
+ (*GameEvent_MultipleFouls)(nil), // 24: GameEvent.MultipleFouls
+ (*GameEvent_MultiplePlacementFailures)(nil), // 25: GameEvent.MultiplePlacementFailures
+ (*GameEvent_KickTimeout)(nil), // 26: GameEvent.KickTimeout
+ (*GameEvent_NoProgressInGame)(nil), // 27: GameEvent.NoProgressInGame
+ (*GameEvent_PlacementFailed)(nil), // 28: GameEvent.PlacementFailed
+ (*GameEvent_UnsportingBehaviorMinor)(nil), // 29: GameEvent.UnsportingBehaviorMinor
+ (*GameEvent_UnsportingBehaviorMajor)(nil), // 30: GameEvent.UnsportingBehaviorMajor
+ (*GameEvent_KeeperHeldBall)(nil), // 31: GameEvent.KeeperHeldBall
+ (*GameEvent_PlacementSucceeded)(nil), // 32: GameEvent.PlacementSucceeded
+ (*GameEvent_Prepared)(nil), // 33: GameEvent.Prepared
+ (*GameEvent_BotSubstitution)(nil), // 34: GameEvent.BotSubstitution
+ (*GameEvent_ChallengeFlag)(nil), // 35: GameEvent.ChallengeFlag
+ (*GameEvent_EmergencyStop)(nil), // 36: GameEvent.EmergencyStop
+ (*GameEvent_TooManyRobots)(nil), // 37: GameEvent.TooManyRobots
+ (*GameEvent_BoundaryCrossing)(nil), // 38: GameEvent.BoundaryCrossing
+ (*GameEvent_PenaltyKickFailed)(nil), // 39: GameEvent.PenaltyKickFailed
+ (Team)(0), // 40: Team
+ (*geom.Vector2)(nil), // 41: Vector2
+}
+var file_ssl_gc_game_event_proto_depIdxs = []int32{
+ 0, // 0: GameEvent.type:type_name -> GameEvent.Type
+ 2, // 1: GameEvent.ball_left_field_touch_line:type_name -> GameEvent.BallLeftField
+ 2, // 2: GameEvent.ball_left_field_goal_line:type_name -> GameEvent.BallLeftField
+ 3, // 3: GameEvent.aimless_kick:type_name -> GameEvent.AimlessKick
+ 20, // 4: GameEvent.attacker_too_close_to_defense_area:type_name -> GameEvent.AttackerTooCloseToDefenseArea
+ 13, // 5: GameEvent.defender_in_defense_area:type_name -> GameEvent.DefenderInDefenseArea
+ 38, // 6: GameEvent.boundary_crossing:type_name -> GameEvent.BoundaryCrossing
+ 31, // 7: GameEvent.keeper_held_ball:type_name -> GameEvent.KeeperHeldBall
+ 17, // 8: GameEvent.bot_dribbled_ball_too_far:type_name -> GameEvent.BotDribbledBallTooFar
+ 11, // 9: GameEvent.bot_pushed_bot:type_name -> GameEvent.BotPushedBot
+ 21, // 10: GameEvent.bot_held_ball_deliberately:type_name -> GameEvent.BotHeldBallDeliberately
+ 12, // 11: GameEvent.bot_tipped_over:type_name -> GameEvent.BotTippedOver
+ 15, // 12: GameEvent.attacker_touched_ball_in_defense_area:type_name -> GameEvent.AttackerTouchedBallInDefenseArea
+ 16, // 13: GameEvent.bot_kicked_ball_too_fast:type_name -> GameEvent.BotKickedBallTooFast
+ 10, // 14: GameEvent.bot_crash_unique:type_name -> GameEvent.BotCrashUnique
+ 9, // 15: GameEvent.bot_crash_drawn:type_name -> GameEvent.BotCrashDrawn
+ 8, // 16: GameEvent.defender_too_close_to_kick_point:type_name -> GameEvent.DefenderTooCloseToKickPoint
+ 7, // 17: GameEvent.bot_too_fast_in_stop:type_name -> GameEvent.BotTooFastInStop
+ 22, // 18: GameEvent.bot_interfered_placement:type_name -> GameEvent.BotInterferedPlacement
+ 4, // 19: GameEvent.possible_goal:type_name -> GameEvent.Goal
+ 4, // 20: GameEvent.goal:type_name -> GameEvent.Goal
+ 4, // 21: GameEvent.invalid_goal:type_name -> GameEvent.Goal
+ 19, // 22: GameEvent.attacker_double_touched_ball:type_name -> GameEvent.AttackerDoubleTouchedBall
+ 32, // 23: GameEvent.placement_succeeded:type_name -> GameEvent.PlacementSucceeded
+ 39, // 24: GameEvent.penalty_kick_failed:type_name -> GameEvent.PenaltyKickFailed
+ 27, // 25: GameEvent.no_progress_in_game:type_name -> GameEvent.NoProgressInGame
+ 28, // 26: GameEvent.placement_failed:type_name -> GameEvent.PlacementFailed
+ 23, // 27: GameEvent.multiple_cards:type_name -> GameEvent.MultipleCards
+ 24, // 28: GameEvent.multiple_fouls:type_name -> GameEvent.MultipleFouls
+ 34, // 29: GameEvent.bot_substitution:type_name -> GameEvent.BotSubstitution
+ 37, // 30: GameEvent.too_many_robots:type_name -> GameEvent.TooManyRobots
+ 35, // 31: GameEvent.challenge_flag:type_name -> GameEvent.ChallengeFlag
+ 36, // 32: GameEvent.emergency_stop:type_name -> GameEvent.EmergencyStop
+ 29, // 33: GameEvent.unsporting_behavior_minor:type_name -> GameEvent.UnsportingBehaviorMinor
+ 30, // 34: GameEvent.unsporting_behavior_major:type_name -> GameEvent.UnsportingBehaviorMajor
+ 33, // 35: GameEvent.prepared:type_name -> GameEvent.Prepared
+ 5, // 36: GameEvent.indirect_goal:type_name -> GameEvent.IndirectGoal
+ 6, // 37: GameEvent.chipped_goal:type_name -> GameEvent.ChippedGoal
+ 26, // 38: GameEvent.kick_timeout:type_name -> GameEvent.KickTimeout
+ 18, // 39: GameEvent.attacker_touched_opponent_in_defense_area:type_name -> GameEvent.AttackerTouchedOpponentInDefenseArea
+ 18, // 40: GameEvent.attacker_touched_opponent_in_defense_area_skipped:type_name -> GameEvent.AttackerTouchedOpponentInDefenseArea
+ 10, // 41: GameEvent.bot_crash_unique_skipped:type_name -> GameEvent.BotCrashUnique
+ 11, // 42: GameEvent.bot_pushed_bot_skipped:type_name -> GameEvent.BotPushedBot
+ 14, // 43: GameEvent.defender_in_defense_area_partially:type_name -> GameEvent.DefenderInDefenseAreaPartially
+ 25, // 44: GameEvent.multiple_placement_failures:type_name -> GameEvent.MultiplePlacementFailures
+ 40, // 45: GameEvent.BallLeftField.by_team:type_name -> Team
+ 41, // 46: GameEvent.BallLeftField.location:type_name -> Vector2
+ 40, // 47: GameEvent.AimlessKick.by_team:type_name -> Team
+ 41, // 48: GameEvent.AimlessKick.location:type_name -> Vector2
+ 41, // 49: GameEvent.AimlessKick.kick_location:type_name -> Vector2
+ 40, // 50: GameEvent.Goal.by_team:type_name -> Team
+ 40, // 51: GameEvent.Goal.kicking_team:type_name -> Team
+ 41, // 52: GameEvent.Goal.location:type_name -> Vector2
+ 41, // 53: GameEvent.Goal.kick_location:type_name -> Vector2
+ 40, // 54: GameEvent.IndirectGoal.by_team:type_name -> Team
+ 41, // 55: GameEvent.IndirectGoal.location:type_name -> Vector2
+ 41, // 56: GameEvent.IndirectGoal.kick_location:type_name -> Vector2
+ 40, // 57: GameEvent.ChippedGoal.by_team:type_name -> Team
+ 41, // 58: GameEvent.ChippedGoal.location:type_name -> Vector2
+ 41, // 59: GameEvent.ChippedGoal.kick_location:type_name -> Vector2
+ 40, // 60: GameEvent.BotTooFastInStop.by_team:type_name -> Team
+ 41, // 61: GameEvent.BotTooFastInStop.location:type_name -> Vector2
+ 40, // 62: GameEvent.DefenderTooCloseToKickPoint.by_team:type_name -> Team
+ 41, // 63: GameEvent.DefenderTooCloseToKickPoint.location:type_name -> Vector2
+ 41, // 64: GameEvent.BotCrashDrawn.location:type_name -> Vector2
+ 40, // 65: GameEvent.BotCrashUnique.by_team:type_name -> Team
+ 41, // 66: GameEvent.BotCrashUnique.location:type_name -> Vector2
+ 40, // 67: GameEvent.BotPushedBot.by_team:type_name -> Team
+ 41, // 68: GameEvent.BotPushedBot.location:type_name -> Vector2
+ 40, // 69: GameEvent.BotTippedOver.by_team:type_name -> Team
+ 41, // 70: GameEvent.BotTippedOver.location:type_name -> Vector2
+ 41, // 71: GameEvent.BotTippedOver.ball_location:type_name -> Vector2
+ 40, // 72: GameEvent.DefenderInDefenseArea.by_team:type_name -> Team
+ 41, // 73: GameEvent.DefenderInDefenseArea.location:type_name -> Vector2
+ 40, // 74: GameEvent.DefenderInDefenseAreaPartially.by_team:type_name -> Team
+ 41, // 75: GameEvent.DefenderInDefenseAreaPartially.location:type_name -> Vector2
+ 41, // 76: GameEvent.DefenderInDefenseAreaPartially.ball_location:type_name -> Vector2
+ 40, // 77: GameEvent.AttackerTouchedBallInDefenseArea.by_team:type_name -> Team
+ 41, // 78: GameEvent.AttackerTouchedBallInDefenseArea.location:type_name -> Vector2
+ 40, // 79: GameEvent.BotKickedBallTooFast.by_team:type_name -> Team
+ 41, // 80: GameEvent.BotKickedBallTooFast.location:type_name -> Vector2
+ 40, // 81: GameEvent.BotDribbledBallTooFar.by_team:type_name -> Team
+ 41, // 82: GameEvent.BotDribbledBallTooFar.start:type_name -> Vector2
+ 41, // 83: GameEvent.BotDribbledBallTooFar.end:type_name -> Vector2
+ 40, // 84: GameEvent.AttackerTouchedOpponentInDefenseArea.by_team:type_name -> Team
+ 41, // 85: GameEvent.AttackerTouchedOpponentInDefenseArea.location:type_name -> Vector2
+ 40, // 86: GameEvent.AttackerDoubleTouchedBall.by_team:type_name -> Team
+ 41, // 87: GameEvent.AttackerDoubleTouchedBall.location:type_name -> Vector2
+ 40, // 88: GameEvent.AttackerTooCloseToDefenseArea.by_team:type_name -> Team
+ 41, // 89: GameEvent.AttackerTooCloseToDefenseArea.location:type_name -> Vector2
+ 41, // 90: GameEvent.AttackerTooCloseToDefenseArea.ball_location:type_name -> Vector2
+ 40, // 91: GameEvent.BotHeldBallDeliberately.by_team:type_name -> Team
+ 41, // 92: GameEvent.BotHeldBallDeliberately.location:type_name -> Vector2
+ 40, // 93: GameEvent.BotInterferedPlacement.by_team:type_name -> Team
+ 41, // 94: GameEvent.BotInterferedPlacement.location:type_name -> Vector2
+ 40, // 95: GameEvent.MultipleCards.by_team:type_name -> Team
+ 40, // 96: GameEvent.MultipleFouls.by_team:type_name -> Team
+ 40, // 97: GameEvent.MultiplePlacementFailures.by_team:type_name -> Team
+ 40, // 98: GameEvent.KickTimeout.by_team:type_name -> Team
+ 41, // 99: GameEvent.KickTimeout.location:type_name -> Vector2
+ 41, // 100: GameEvent.NoProgressInGame.location:type_name -> Vector2
+ 40, // 101: GameEvent.PlacementFailed.by_team:type_name -> Team
+ 40, // 102: GameEvent.UnsportingBehaviorMinor.by_team:type_name -> Team
+ 40, // 103: GameEvent.UnsportingBehaviorMajor.by_team:type_name -> Team
+ 40, // 104: GameEvent.KeeperHeldBall.by_team:type_name -> Team
+ 41, // 105: GameEvent.KeeperHeldBall.location:type_name -> Vector2
+ 40, // 106: GameEvent.PlacementSucceeded.by_team:type_name -> Team
+ 40, // 107: GameEvent.BotSubstitution.by_team:type_name -> Team
+ 40, // 108: GameEvent.ChallengeFlag.by_team:type_name -> Team
+ 40, // 109: GameEvent.EmergencyStop.by_team:type_name -> Team
+ 40, // 110: GameEvent.TooManyRobots.by_team:type_name -> Team
+ 41, // 111: GameEvent.TooManyRobots.ball_location:type_name -> Vector2
+ 40, // 112: GameEvent.BoundaryCrossing.by_team:type_name -> Team
+ 41, // 113: GameEvent.BoundaryCrossing.location:type_name -> Vector2
+ 40, // 114: GameEvent.PenaltyKickFailed.by_team:type_name -> Team
+ 41, // 115: GameEvent.PenaltyKickFailed.location:type_name -> Vector2
+ 116, // [116:116] is the sub-list for method output_type
+ 116, // [116:116] is the sub-list for method input_type
+ 116, // [116:116] is the sub-list for extension type_name
+ 116, // [116:116] is the sub-list for extension extendee
+ 0, // [0:116] is the sub-list for field type_name
+}
+
+func init() { file_ssl_gc_game_event_proto_init() }
+func file_ssl_gc_game_event_proto_init() {
+ if File_ssl_gc_game_event_proto != nil {
+ return
+ }
+ file_ssl_gc_common_proto_init()
+ if !protoimpl.UnsafeEnabled {
+ file_ssl_gc_game_event_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GameEvent); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_gc_game_event_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GameEvent_BallLeftField); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_gc_game_event_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GameEvent_AimlessKick); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_gc_game_event_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GameEvent_Goal); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_gc_game_event_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GameEvent_IndirectGoal); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_gc_game_event_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GameEvent_ChippedGoal); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_gc_game_event_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GameEvent_BotTooFastInStop); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_gc_game_event_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GameEvent_DefenderTooCloseToKickPoint); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_gc_game_event_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GameEvent_BotCrashDrawn); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_gc_game_event_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GameEvent_BotCrashUnique); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_gc_game_event_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GameEvent_BotPushedBot); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_gc_game_event_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GameEvent_BotTippedOver); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_gc_game_event_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GameEvent_DefenderInDefenseArea); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_gc_game_event_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GameEvent_DefenderInDefenseAreaPartially); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_gc_game_event_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GameEvent_AttackerTouchedBallInDefenseArea); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_gc_game_event_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GameEvent_BotKickedBallTooFast); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_gc_game_event_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GameEvent_BotDribbledBallTooFar); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_gc_game_event_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GameEvent_AttackerTouchedOpponentInDefenseArea); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_gc_game_event_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GameEvent_AttackerDoubleTouchedBall); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_gc_game_event_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GameEvent_AttackerTooCloseToDefenseArea); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_gc_game_event_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GameEvent_BotHeldBallDeliberately); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_gc_game_event_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GameEvent_BotInterferedPlacement); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_gc_game_event_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GameEvent_MultipleCards); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_gc_game_event_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GameEvent_MultipleFouls); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_gc_game_event_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GameEvent_MultiplePlacementFailures); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_gc_game_event_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GameEvent_KickTimeout); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_gc_game_event_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GameEvent_NoProgressInGame); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_gc_game_event_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GameEvent_PlacementFailed); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_gc_game_event_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GameEvent_UnsportingBehaviorMinor); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_gc_game_event_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GameEvent_UnsportingBehaviorMajor); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_gc_game_event_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GameEvent_KeeperHeldBall); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_gc_game_event_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GameEvent_PlacementSucceeded); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_gc_game_event_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GameEvent_Prepared); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_gc_game_event_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GameEvent_BotSubstitution); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_gc_game_event_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GameEvent_ChallengeFlag); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_gc_game_event_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GameEvent_EmergencyStop); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_gc_game_event_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GameEvent_TooManyRobots); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_gc_game_event_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GameEvent_BoundaryCrossing); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_gc_game_event_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GameEvent_PenaltyKickFailed); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ }
+ file_ssl_gc_game_event_proto_msgTypes[0].OneofWrappers = []interface{}{
+ (*GameEvent_BallLeftFieldTouchLine)(nil),
+ (*GameEvent_BallLeftFieldGoalLine)(nil),
+ (*GameEvent_AimlessKick_)(nil),
+ (*GameEvent_AttackerTooCloseToDefenseArea_)(nil),
+ (*GameEvent_DefenderInDefenseArea_)(nil),
+ (*GameEvent_BoundaryCrossing_)(nil),
+ (*GameEvent_KeeperHeldBall_)(nil),
+ (*GameEvent_BotDribbledBallTooFar_)(nil),
+ (*GameEvent_BotPushedBot_)(nil),
+ (*GameEvent_BotHeldBallDeliberately_)(nil),
+ (*GameEvent_BotTippedOver_)(nil),
+ (*GameEvent_AttackerTouchedBallInDefenseArea_)(nil),
+ (*GameEvent_BotKickedBallTooFast_)(nil),
+ (*GameEvent_BotCrashUnique_)(nil),
+ (*GameEvent_BotCrashDrawn_)(nil),
+ (*GameEvent_DefenderTooCloseToKickPoint_)(nil),
+ (*GameEvent_BotTooFastInStop_)(nil),
+ (*GameEvent_BotInterferedPlacement_)(nil),
+ (*GameEvent_PossibleGoal)(nil),
+ (*GameEvent_Goal_)(nil),
+ (*GameEvent_InvalidGoal)(nil),
+ (*GameEvent_AttackerDoubleTouchedBall_)(nil),
+ (*GameEvent_PlacementSucceeded_)(nil),
+ (*GameEvent_PenaltyKickFailed_)(nil),
+ (*GameEvent_NoProgressInGame_)(nil),
+ (*GameEvent_PlacementFailed_)(nil),
+ (*GameEvent_MultipleCards_)(nil),
+ (*GameEvent_MultipleFouls_)(nil),
+ (*GameEvent_BotSubstitution_)(nil),
+ (*GameEvent_TooManyRobots_)(nil),
+ (*GameEvent_ChallengeFlag_)(nil),
+ (*GameEvent_EmergencyStop_)(nil),
+ (*GameEvent_UnsportingBehaviorMinor_)(nil),
+ (*GameEvent_UnsportingBehaviorMajor_)(nil),
+ (*GameEvent_Prepared_)(nil),
+ (*GameEvent_IndirectGoal_)(nil),
+ (*GameEvent_ChippedGoal_)(nil),
+ (*GameEvent_KickTimeout_)(nil),
+ (*GameEvent_AttackerTouchedOpponentInDefenseArea_)(nil),
+ (*GameEvent_AttackerTouchedOpponentInDefenseAreaSkipped)(nil),
+ (*GameEvent_BotCrashUniqueSkipped)(nil),
+ (*GameEvent_BotPushedBotSkipped)(nil),
+ (*GameEvent_DefenderInDefenseAreaPartially_)(nil),
+ (*GameEvent_MultiplePlacementFailures_)(nil),
+ }
+ type x struct{}
+ out := protoimpl.TypeBuilder{
+ File: protoimpl.DescBuilder{
+ GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+ RawDescriptor: file_ssl_gc_game_event_proto_rawDesc,
+ NumEnums: 1,
+ NumMessages: 39,
+ NumExtensions: 0,
+ NumServices: 0,
+ },
+ GoTypes: file_ssl_gc_game_event_proto_goTypes,
+ DependencyIndexes: file_ssl_gc_game_event_proto_depIdxs,
+ EnumInfos: file_ssl_gc_game_event_proto_enumTypes,
+ MessageInfos: file_ssl_gc_game_event_proto_msgTypes,
+ }.Build()
+ File_ssl_gc_game_event_proto = out.File
+ file_ssl_gc_game_event_proto_rawDesc = nil
+ file_ssl_gc_game_event_proto_goTypes = nil
+ file_ssl_gc_game_event_proto_depIdxs = nil
+}
diff --git a/internal/referee/ssl_gc_referee_message.pb.go b/internal/referee/ssl_gc_referee_message.pb.go
new file mode 100644
index 0000000..121f14c
--- /dev/null
+++ b/internal/referee/ssl_gc_referee_message.pb.go
@@ -0,0 +1,1006 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// protoc-gen-go v1.25.0
+// protoc v3.12.4
+// source: ssl_gc_referee_message.proto
+
+package referee
+
+import (
+ proto "github.com/golang/protobuf/proto"
+ protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+ protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+ reflect "reflect"
+ sync "sync"
+)
+
+const (
+ // Verify that this generated code is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+ // Verify that runtime/protoimpl is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
+
+// These are the "coarse" stages of the game.
+type Referee_Stage int32
+
+const (
+ // The first half is about to start.
+ // A kickoff is called within this stage.
+ // This stage ends with the NORMAL_START.
+ Referee_NORMAL_FIRST_HALF_PRE Referee_Stage = 0
+ // The first half of the normal game, before half time.
+ Referee_NORMAL_FIRST_HALF Referee_Stage = 1
+ // Half time between first and second halves.
+ Referee_NORMAL_HALF_TIME Referee_Stage = 2
+ // The second half is about to start.
+ // A kickoff is called within this stage.
+ // This stage ends with the NORMAL_START.
+ Referee_NORMAL_SECOND_HALF_PRE Referee_Stage = 3
+ // The second half of the normal game, after half time.
+ Referee_NORMAL_SECOND_HALF Referee_Stage = 4
+ // The break before extra time.
+ Referee_EXTRA_TIME_BREAK Referee_Stage = 5
+ // The first half of extra time is about to start.
+ // A kickoff is called within this stage.
+ // This stage ends with the NORMAL_START.
+ Referee_EXTRA_FIRST_HALF_PRE Referee_Stage = 6
+ // The first half of extra time.
+ Referee_EXTRA_FIRST_HALF Referee_Stage = 7
+ // Half time between first and second extra halves.
+ Referee_EXTRA_HALF_TIME Referee_Stage = 8
+ // The second half of extra time is about to start.
+ // A kickoff is called within this stage.
+ // This stage ends with the NORMAL_START.
+ Referee_EXTRA_SECOND_HALF_PRE Referee_Stage = 9
+ // The second half of extra time.
+ Referee_EXTRA_SECOND_HALF Referee_Stage = 10
+ // The break before penalty shootout.
+ Referee_PENALTY_SHOOTOUT_BREAK Referee_Stage = 11
+ // The penalty shootout.
+ Referee_PENALTY_SHOOTOUT Referee_Stage = 12
+ // The game is over.
+ Referee_POST_GAME Referee_Stage = 13
+)
+
+// Enum value maps for Referee_Stage.
+var (
+ Referee_Stage_name = map[int32]string{
+ 0: "NORMAL_FIRST_HALF_PRE",
+ 1: "NORMAL_FIRST_HALF",
+ 2: "NORMAL_HALF_TIME",
+ 3: "NORMAL_SECOND_HALF_PRE",
+ 4: "NORMAL_SECOND_HALF",
+ 5: "EXTRA_TIME_BREAK",
+ 6: "EXTRA_FIRST_HALF_PRE",
+ 7: "EXTRA_FIRST_HALF",
+ 8: "EXTRA_HALF_TIME",
+ 9: "EXTRA_SECOND_HALF_PRE",
+ 10: "EXTRA_SECOND_HALF",
+ 11: "PENALTY_SHOOTOUT_BREAK",
+ 12: "PENALTY_SHOOTOUT",
+ 13: "POST_GAME",
+ }
+ Referee_Stage_value = map[string]int32{
+ "NORMAL_FIRST_HALF_PRE": 0,
+ "NORMAL_FIRST_HALF": 1,
+ "NORMAL_HALF_TIME": 2,
+ "NORMAL_SECOND_HALF_PRE": 3,
+ "NORMAL_SECOND_HALF": 4,
+ "EXTRA_TIME_BREAK": 5,
+ "EXTRA_FIRST_HALF_PRE": 6,
+ "EXTRA_FIRST_HALF": 7,
+ "EXTRA_HALF_TIME": 8,
+ "EXTRA_SECOND_HALF_PRE": 9,
+ "EXTRA_SECOND_HALF": 10,
+ "PENALTY_SHOOTOUT_BREAK": 11,
+ "PENALTY_SHOOTOUT": 12,
+ "POST_GAME": 13,
+ }
+)
+
+func (x Referee_Stage) Enum() *Referee_Stage {
+ p := new(Referee_Stage)
+ *p = x
+ return p
+}
+
+func (x Referee_Stage) String() string {
+ return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (Referee_Stage) Descriptor() protoreflect.EnumDescriptor {
+ return file_ssl_gc_referee_message_proto_enumTypes[0].Descriptor()
+}
+
+func (Referee_Stage) Type() protoreflect.EnumType {
+ return &file_ssl_gc_referee_message_proto_enumTypes[0]
+}
+
+func (x Referee_Stage) Number() protoreflect.EnumNumber {
+ return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Do not use.
+func (x *Referee_Stage) UnmarshalJSON(b []byte) error {
+ num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b)
+ if err != nil {
+ return err
+ }
+ *x = Referee_Stage(num)
+ return nil
+}
+
+// Deprecated: Use Referee_Stage.Descriptor instead.
+func (Referee_Stage) EnumDescriptor() ([]byte, []int) {
+ return file_ssl_gc_referee_message_proto_rawDescGZIP(), []int{0, 0}
+}
+
+// These are the "fine" states of play on the field.
+type Referee_Command int32
+
+const (
+ // All robots should completely stop moving.
+ Referee_HALT Referee_Command = 0
+ // Robots must keep 50 cm from the ball.
+ Referee_STOP Referee_Command = 1
+ // A prepared kickoff or penalty may now be taken.
+ Referee_NORMAL_START Referee_Command = 2
+ // The ball is dropped and free for either team.
+ Referee_FORCE_START Referee_Command = 3
+ // The yellow team may move into kickoff position.
+ Referee_PREPARE_KICKOFF_YELLOW Referee_Command = 4
+ // The blue team may move into kickoff position.
+ Referee_PREPARE_KICKOFF_BLUE Referee_Command = 5
+ // The yellow team may move into penalty position.
+ Referee_PREPARE_PENALTY_YELLOW Referee_Command = 6
+ // The blue team may move into penalty position.
+ Referee_PREPARE_PENALTY_BLUE Referee_Command = 7
+ // The yellow team may take a direct free kick.
+ Referee_DIRECT_FREE_YELLOW Referee_Command = 8
+ // The blue team may take a direct free kick.
+ Referee_DIRECT_FREE_BLUE Referee_Command = 9
+ // The yellow team may take an indirect free kick.
+ Referee_INDIRECT_FREE_YELLOW Referee_Command = 10
+ // The blue team may take an indirect free kick.
+ Referee_INDIRECT_FREE_BLUE Referee_Command = 11
+ // The yellow team is currently in a timeout.
+ Referee_TIMEOUT_YELLOW Referee_Command = 12
+ // The blue team is currently in a timeout.
+ Referee_TIMEOUT_BLUE Referee_Command = 13
+ // The yellow team just scored a goal.
+ // For information only.
+ // For rules compliance, teams must treat as STOP.
+ // Deprecated: Use the score field from the team infos instead. That way, you can also detect revoked goals.
+ //
+ // Deprecated: Do not use.
+ Referee_GOAL_YELLOW Referee_Command = 14
+ // The blue team just scored a goal. See also GOAL_YELLOW.
+ //
+ // Deprecated: Do not use.
+ Referee_GOAL_BLUE Referee_Command = 15
+ // Equivalent to STOP, but the yellow team must pick up the ball and
+ // drop it in the Designated Position.
+ Referee_BALL_PLACEMENT_YELLOW Referee_Command = 16
+ // Equivalent to STOP, but the blue team must pick up the ball and drop
+ // it in the Designated Position.
+ Referee_BALL_PLACEMENT_BLUE Referee_Command = 17
+)
+
+// Enum value maps for Referee_Command.
+var (
+ Referee_Command_name = map[int32]string{
+ 0: "HALT",
+ 1: "STOP",
+ 2: "NORMAL_START",
+ 3: "FORCE_START",
+ 4: "PREPARE_KICKOFF_YELLOW",
+ 5: "PREPARE_KICKOFF_BLUE",
+ 6: "PREPARE_PENALTY_YELLOW",
+ 7: "PREPARE_PENALTY_BLUE",
+ 8: "DIRECT_FREE_YELLOW",
+ 9: "DIRECT_FREE_BLUE",
+ 10: "INDIRECT_FREE_YELLOW",
+ 11: "INDIRECT_FREE_BLUE",
+ 12: "TIMEOUT_YELLOW",
+ 13: "TIMEOUT_BLUE",
+ 14: "GOAL_YELLOW",
+ 15: "GOAL_BLUE",
+ 16: "BALL_PLACEMENT_YELLOW",
+ 17: "BALL_PLACEMENT_BLUE",
+ }
+ Referee_Command_value = map[string]int32{
+ "HALT": 0,
+ "STOP": 1,
+ "NORMAL_START": 2,
+ "FORCE_START": 3,
+ "PREPARE_KICKOFF_YELLOW": 4,
+ "PREPARE_KICKOFF_BLUE": 5,
+ "PREPARE_PENALTY_YELLOW": 6,
+ "PREPARE_PENALTY_BLUE": 7,
+ "DIRECT_FREE_YELLOW": 8,
+ "DIRECT_FREE_BLUE": 9,
+ "INDIRECT_FREE_YELLOW": 10,
+ "INDIRECT_FREE_BLUE": 11,
+ "TIMEOUT_YELLOW": 12,
+ "TIMEOUT_BLUE": 13,
+ "GOAL_YELLOW": 14,
+ "GOAL_BLUE": 15,
+ "BALL_PLACEMENT_YELLOW": 16,
+ "BALL_PLACEMENT_BLUE": 17,
+ }
+)
+
+func (x Referee_Command) Enum() *Referee_Command {
+ p := new(Referee_Command)
+ *p = x
+ return p
+}
+
+func (x Referee_Command) String() string {
+ return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (Referee_Command) Descriptor() protoreflect.EnumDescriptor {
+ return file_ssl_gc_referee_message_proto_enumTypes[1].Descriptor()
+}
+
+func (Referee_Command) Type() protoreflect.EnumType {
+ return &file_ssl_gc_referee_message_proto_enumTypes[1]
+}
+
+func (x Referee_Command) Number() protoreflect.EnumNumber {
+ return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Do not use.
+func (x *Referee_Command) UnmarshalJSON(b []byte) error {
+ num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b)
+ if err != nil {
+ return err
+ }
+ *x = Referee_Command(num)
+ return nil
+}
+
+// Deprecated: Use Referee_Command.Descriptor instead.
+func (Referee_Command) EnumDescriptor() ([]byte, []int) {
+ return file_ssl_gc_referee_message_proto_rawDescGZIP(), []int{0, 1}
+}
+
+// Each UDP packet contains one of these messages.
+type Referee struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // The UNIX timestamp when the packet was sent, in microseconds.
+ // Divide by 1,000,000 to get a time_t.
+ PacketTimestamp *uint64 `protobuf:"varint,1,req,name=packet_timestamp,json=packetTimestamp" json:"packet_timestamp,omitempty"`
+ Stage *Referee_Stage `protobuf:"varint,2,req,name=stage,enum=Referee_Stage" json:"stage,omitempty"`
+ // The number of microseconds left in the stage.
+ // The following stages have this value; the rest do not:
+ // NORMAL_FIRST_HALF
+ // NORMAL_HALF_TIME
+ // NORMAL_SECOND_HALF
+ // EXTRA_TIME_BREAK
+ // EXTRA_FIRST_HALF
+ // EXTRA_HALF_TIME
+ // EXTRA_SECOND_HALF
+ // PENALTY_SHOOTOUT_BREAK
+ //
+ // If the stage runs over its specified time, this value
+ // becomes negative.
+ StageTimeLeft *int32 `protobuf:"zigzag32,3,opt,name=stage_time_left,json=stageTimeLeft" json:"stage_time_left,omitempty"`
+ Command *Referee_Command `protobuf:"varint,4,req,name=command,enum=Referee_Command" json:"command,omitempty"`
+ // The number of commands issued since startup (mod 2^32).
+ CommandCounter *uint32 `protobuf:"varint,5,req,name=command_counter,json=commandCounter" json:"command_counter,omitempty"`
+ // The UNIX timestamp when the command was issued, in microseconds.
+ // This value changes only when a new command is issued, not on each packet.
+ CommandTimestamp *uint64 `protobuf:"varint,6,req,name=command_timestamp,json=commandTimestamp" json:"command_timestamp,omitempty"`
+ // Information about the two teams.
+ Yellow *Referee_TeamInfo `protobuf:"bytes,7,req,name=yellow" json:"yellow,omitempty"`
+ Blue *Referee_TeamInfo `protobuf:"bytes,8,req,name=blue" json:"blue,omitempty"`
+ DesignatedPosition *Referee_Point `protobuf:"bytes,9,opt,name=designated_position,json=designatedPosition" json:"designated_position,omitempty"`
+ // Information about the direction of play.
+ // True, if the blue team will have it's goal on the positive x-axis of the ssl-vision coordinate system.
+ // Obviously, the yellow team will play on the opposite half.
+ BlueTeamOnPositiveHalf *bool `protobuf:"varint,10,opt,name=blue_team_on_positive_half,json=blueTeamOnPositiveHalf" json:"blue_team_on_positive_half,omitempty"`
+ // The command that will be issued after the current stoppage and ball placement to continue the game.
+ NextCommand *Referee_Command `protobuf:"varint,12,opt,name=next_command,json=nextCommand,enum=Referee_Command" json:"next_command,omitempty"`
+ GameEvents []*GameEvent `protobuf:"bytes,16,rep,name=game_events,json=gameEvents" json:"game_events,omitempty"`
+ GameEventProposals []*GameEventProposalGroup `protobuf:"bytes,17,rep,name=game_event_proposals,json=gameEventProposals" json:"game_event_proposals,omitempty"`
+ // The time in microseconds that is remaining until the current action times out
+ // The time will not be reset. It can get negative.
+ // An autoRef would raise an appropriate event, if the time gets negative.
+ // Possible actions where this time is relevant:
+ // * free kicks
+ // * kickoff, penalty kick, force start
+ // * ball placement
+ CurrentActionTimeRemaining *int32 `protobuf:"varint,15,opt,name=current_action_time_remaining,json=currentActionTimeRemaining" json:"current_action_time_remaining,omitempty"`
+}
+
+func (x *Referee) Reset() {
+ *x = Referee{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_gc_referee_message_proto_msgTypes[0]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *Referee) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Referee) ProtoMessage() {}
+
+func (x *Referee) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_gc_referee_message_proto_msgTypes[0]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use Referee.ProtoReflect.Descriptor instead.
+func (*Referee) Descriptor() ([]byte, []int) {
+ return file_ssl_gc_referee_message_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *Referee) GetPacketTimestamp() uint64 {
+ if x != nil && x.PacketTimestamp != nil {
+ return *x.PacketTimestamp
+ }
+ return 0
+}
+
+func (x *Referee) GetStage() Referee_Stage {
+ if x != nil && x.Stage != nil {
+ return *x.Stage
+ }
+ return Referee_NORMAL_FIRST_HALF_PRE
+}
+
+func (x *Referee) GetStageTimeLeft() int32 {
+ if x != nil && x.StageTimeLeft != nil {
+ return *x.StageTimeLeft
+ }
+ return 0
+}
+
+func (x *Referee) GetCommand() Referee_Command {
+ if x != nil && x.Command != nil {
+ return *x.Command
+ }
+ return Referee_HALT
+}
+
+func (x *Referee) GetCommandCounter() uint32 {
+ if x != nil && x.CommandCounter != nil {
+ return *x.CommandCounter
+ }
+ return 0
+}
+
+func (x *Referee) GetCommandTimestamp() uint64 {
+ if x != nil && x.CommandTimestamp != nil {
+ return *x.CommandTimestamp
+ }
+ return 0
+}
+
+func (x *Referee) GetYellow() *Referee_TeamInfo {
+ if x != nil {
+ return x.Yellow
+ }
+ return nil
+}
+
+func (x *Referee) GetBlue() *Referee_TeamInfo {
+ if x != nil {
+ return x.Blue
+ }
+ return nil
+}
+
+func (x *Referee) GetDesignatedPosition() *Referee_Point {
+ if x != nil {
+ return x.DesignatedPosition
+ }
+ return nil
+}
+
+func (x *Referee) GetBlueTeamOnPositiveHalf() bool {
+ if x != nil && x.BlueTeamOnPositiveHalf != nil {
+ return *x.BlueTeamOnPositiveHalf
+ }
+ return false
+}
+
+func (x *Referee) GetNextCommand() Referee_Command {
+ if x != nil && x.NextCommand != nil {
+ return *x.NextCommand
+ }
+ return Referee_HALT
+}
+
+func (x *Referee) GetGameEvents() []*GameEvent {
+ if x != nil {
+ return x.GameEvents
+ }
+ return nil
+}
+
+func (x *Referee) GetGameEventProposals() []*GameEventProposalGroup {
+ if x != nil {
+ return x.GameEventProposals
+ }
+ return nil
+}
+
+func (x *Referee) GetCurrentActionTimeRemaining() int32 {
+ if x != nil && x.CurrentActionTimeRemaining != nil {
+ return *x.CurrentActionTimeRemaining
+ }
+ return 0
+}
+
+// List of matching proposals
+type GameEventProposalGroup struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // The proposed game event.
+ GameEvent []*GameEvent `protobuf:"bytes,1,rep,name=game_event,json=gameEvent" json:"game_event,omitempty"`
+ // Whether the proposal group was accepted
+ Accepted *bool `protobuf:"varint,2,opt,name=accepted" json:"accepted,omitempty"`
+}
+
+func (x *GameEventProposalGroup) Reset() {
+ *x = GameEventProposalGroup{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_gc_referee_message_proto_msgTypes[1]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GameEventProposalGroup) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GameEventProposalGroup) ProtoMessage() {}
+
+func (x *GameEventProposalGroup) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_gc_referee_message_proto_msgTypes[1]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use GameEventProposalGroup.ProtoReflect.Descriptor instead.
+func (*GameEventProposalGroup) Descriptor() ([]byte, []int) {
+ return file_ssl_gc_referee_message_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *GameEventProposalGroup) GetGameEvent() []*GameEvent {
+ if x != nil {
+ return x.GameEvent
+ }
+ return nil
+}
+
+func (x *GameEventProposalGroup) GetAccepted() bool {
+ if x != nil && x.Accepted != nil {
+ return *x.Accepted
+ }
+ return false
+}
+
+// Information about a single team.
+type Referee_TeamInfo struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // The team's name (empty string if operator has not typed anything).
+ Name *string `protobuf:"bytes,1,req,name=name" json:"name,omitempty"`
+ // The number of goals scored by the team during normal play and overtime.
+ Score *uint32 `protobuf:"varint,2,req,name=score" json:"score,omitempty"`
+ // The number of red cards issued to the team since the beginning of the game.
+ RedCards *uint32 `protobuf:"varint,3,req,name=red_cards,json=redCards" json:"red_cards,omitempty"`
+ // The amount of time (in microseconds) left on each yellow card issued to the team.
+ // If no yellow cards are issued, this array has no elements.
+ // Otherwise, times are ordered from smallest to largest.
+ YellowCardTimes []uint32 `protobuf:"varint,4,rep,packed,name=yellow_card_times,json=yellowCardTimes" json:"yellow_card_times,omitempty"`
+ // The total number of yellow cards ever issued to the team.
+ YellowCards *uint32 `protobuf:"varint,5,req,name=yellow_cards,json=yellowCards" json:"yellow_cards,omitempty"`
+ // The number of timeouts this team can still call.
+ // If in a timeout right now, that timeout is excluded.
+ Timeouts *uint32 `protobuf:"varint,6,req,name=timeouts" json:"timeouts,omitempty"`
+ // The number of microseconds of timeout this team can use.
+ TimeoutTime *uint32 `protobuf:"varint,7,req,name=timeout_time,json=timeoutTime" json:"timeout_time,omitempty"`
+ // The pattern number of this team's goalkeeper.
+ Goalkeeper *uint32 `protobuf:"varint,8,req,name=goalkeeper" json:"goalkeeper,omitempty"`
+ // The total number of countable fouls that act towards yellow cards
+ FoulCounter *uint32 `protobuf:"varint,9,opt,name=foul_counter,json=foulCounter" json:"foul_counter,omitempty"`
+ // The number of consecutive ball placement failures of this team
+ BallPlacementFailures *uint32 `protobuf:"varint,10,opt,name=ball_placement_failures,json=ballPlacementFailures" json:"ball_placement_failures,omitempty"`
+ // Indicate if the team is able and allowed to place the ball
+ CanPlaceBall *bool `protobuf:"varint,12,opt,name=can_place_ball,json=canPlaceBall" json:"can_place_ball,omitempty"`
+ // The maximum number of bots allowed on the field based on division and cards
+ MaxAllowedBots *uint32 `protobuf:"varint,13,opt,name=max_allowed_bots,json=maxAllowedBots" json:"max_allowed_bots,omitempty"`
+ // The team has submitted an intent to substitute one or more robots at the next chance
+ BotSubstitutionIntent *bool `protobuf:"varint,14,opt,name=bot_substitution_intent,json=botSubstitutionIntent" json:"bot_substitution_intent,omitempty"`
+ // Indicate if the team reached the maximum allowed ball placement failures and is thus not allowed to place the ball anymore
+ BallPlacementFailuresReached *bool `protobuf:"varint,15,opt,name=ball_placement_failures_reached,json=ballPlacementFailuresReached" json:"ball_placement_failures_reached,omitempty"`
+}
+
+func (x *Referee_TeamInfo) Reset() {
+ *x = Referee_TeamInfo{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_gc_referee_message_proto_msgTypes[2]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *Referee_TeamInfo) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Referee_TeamInfo) ProtoMessage() {}
+
+func (x *Referee_TeamInfo) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_gc_referee_message_proto_msgTypes[2]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use Referee_TeamInfo.ProtoReflect.Descriptor instead.
+func (*Referee_TeamInfo) Descriptor() ([]byte, []int) {
+ return file_ssl_gc_referee_message_proto_rawDescGZIP(), []int{0, 0}
+}
+
+func (x *Referee_TeamInfo) GetName() string {
+ if x != nil && x.Name != nil {
+ return *x.Name
+ }
+ return ""
+}
+
+func (x *Referee_TeamInfo) GetScore() uint32 {
+ if x != nil && x.Score != nil {
+ return *x.Score
+ }
+ return 0
+}
+
+func (x *Referee_TeamInfo) GetRedCards() uint32 {
+ if x != nil && x.RedCards != nil {
+ return *x.RedCards
+ }
+ return 0
+}
+
+func (x *Referee_TeamInfo) GetYellowCardTimes() []uint32 {
+ if x != nil {
+ return x.YellowCardTimes
+ }
+ return nil
+}
+
+func (x *Referee_TeamInfo) GetYellowCards() uint32 {
+ if x != nil && x.YellowCards != nil {
+ return *x.YellowCards
+ }
+ return 0
+}
+
+func (x *Referee_TeamInfo) GetTimeouts() uint32 {
+ if x != nil && x.Timeouts != nil {
+ return *x.Timeouts
+ }
+ return 0
+}
+
+func (x *Referee_TeamInfo) GetTimeoutTime() uint32 {
+ if x != nil && x.TimeoutTime != nil {
+ return *x.TimeoutTime
+ }
+ return 0
+}
+
+func (x *Referee_TeamInfo) GetGoalkeeper() uint32 {
+ if x != nil && x.Goalkeeper != nil {
+ return *x.Goalkeeper
+ }
+ return 0
+}
+
+func (x *Referee_TeamInfo) GetFoulCounter() uint32 {
+ if x != nil && x.FoulCounter != nil {
+ return *x.FoulCounter
+ }
+ return 0
+}
+
+func (x *Referee_TeamInfo) GetBallPlacementFailures() uint32 {
+ if x != nil && x.BallPlacementFailures != nil {
+ return *x.BallPlacementFailures
+ }
+ return 0
+}
+
+func (x *Referee_TeamInfo) GetCanPlaceBall() bool {
+ if x != nil && x.CanPlaceBall != nil {
+ return *x.CanPlaceBall
+ }
+ return false
+}
+
+func (x *Referee_TeamInfo) GetMaxAllowedBots() uint32 {
+ if x != nil && x.MaxAllowedBots != nil {
+ return *x.MaxAllowedBots
+ }
+ return 0
+}
+
+func (x *Referee_TeamInfo) GetBotSubstitutionIntent() bool {
+ if x != nil && x.BotSubstitutionIntent != nil {
+ return *x.BotSubstitutionIntent
+ }
+ return false
+}
+
+func (x *Referee_TeamInfo) GetBallPlacementFailuresReached() bool {
+ if x != nil && x.BallPlacementFailuresReached != nil {
+ return *x.BallPlacementFailuresReached
+ }
+ return false
+}
+
+// The coordinates of the Designated Position. These are measured in
+// millimetres and correspond to SSL-Vision coordinates. These fields are
+// always either both present (in the case of a ball placement command) or
+// both absent (in the case of any other command).
+type Referee_Point struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ X *float32 `protobuf:"fixed32,1,req,name=x" json:"x,omitempty"`
+ Y *float32 `protobuf:"fixed32,2,req,name=y" json:"y,omitempty"`
+}
+
+func (x *Referee_Point) Reset() {
+ *x = Referee_Point{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_gc_referee_message_proto_msgTypes[3]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *Referee_Point) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Referee_Point) ProtoMessage() {}
+
+func (x *Referee_Point) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_gc_referee_message_proto_msgTypes[3]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use Referee_Point.ProtoReflect.Descriptor instead.
+func (*Referee_Point) Descriptor() ([]byte, []int) {
+ return file_ssl_gc_referee_message_proto_rawDescGZIP(), []int{0, 1}
+}
+
+func (x *Referee_Point) GetX() float32 {
+ if x != nil && x.X != nil {
+ return *x.X
+ }
+ return 0
+}
+
+func (x *Referee_Point) GetY() float32 {
+ if x != nil && x.Y != nil {
+ return *x.Y
+ }
+ return 0
+}
+
+var File_ssl_gc_referee_message_proto protoreflect.FileDescriptor
+
+var file_ssl_gc_referee_message_proto_rawDesc = []byte{
+ 0x0a, 0x1c, 0x73, 0x73, 0x6c, 0x5f, 0x67, 0x63, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65,
+ 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17,
+ 0x73, 0x73, 0x6c, 0x5f, 0x67, 0x63, 0x5f, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x65, 0x76, 0x65, 0x6e,
+ 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x8f, 0x10, 0x0a, 0x07, 0x52, 0x65, 0x66, 0x65,
+ 0x72, 0x65, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x74, 0x69,
+ 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x02, 0x28, 0x04, 0x52, 0x0f, 0x70,
+ 0x61, 0x63, 0x6b, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x24,
+ 0x0a, 0x05, 0x73, 0x74, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x02, 0x28, 0x0e, 0x32, 0x0e, 0x2e,
+ 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x05, 0x73,
+ 0x74, 0x61, 0x67, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x69,
+ 0x6d, 0x65, 0x5f, 0x6c, 0x65, 0x66, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x11, 0x52, 0x0d, 0x73,
+ 0x74, 0x61, 0x67, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x4c, 0x65, 0x66, 0x74, 0x12, 0x2a, 0x0a, 0x07,
+ 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x02, 0x28, 0x0e, 0x32, 0x10, 0x2e,
+ 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52,
+ 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6f, 0x6d, 0x6d,
+ 0x61, 0x6e, 0x64, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x02, 0x28,
+ 0x0d, 0x52, 0x0e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65,
+ 0x72, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d,
+ 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x02, 0x28, 0x04, 0x52, 0x10, 0x63, 0x6f,
+ 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x29,
+ 0x0a, 0x06, 0x79, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x18, 0x07, 0x20, 0x02, 0x28, 0x0b, 0x32, 0x11,
+ 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x49, 0x6e, 0x66,
+ 0x6f, 0x52, 0x06, 0x79, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x12, 0x25, 0x0a, 0x04, 0x62, 0x6c, 0x75,
+ 0x65, 0x18, 0x08, 0x20, 0x02, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65,
+ 0x65, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x62, 0x6c, 0x75, 0x65,
+ 0x12, 0x3f, 0x0a, 0x13, 0x64, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x70,
+ 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e,
+ 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x2e, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x12, 0x64,
+ 0x65, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f,
+ 0x6e, 0x12, 0x3a, 0x0a, 0x1a, 0x62, 0x6c, 0x75, 0x65, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x6f,
+ 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x68, 0x61, 0x6c, 0x66, 0x18,
+ 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x62, 0x6c, 0x75, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x4f,
+ 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x48, 0x61, 0x6c, 0x66, 0x12, 0x33, 0x0a,
+ 0x0c, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x0c, 0x20,
+ 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x2e, 0x43, 0x6f,
+ 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x0b, 0x6e, 0x65, 0x78, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x61,
+ 0x6e, 0x64, 0x12, 0x2b, 0x0a, 0x0b, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74,
+ 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76,
+ 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x67, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12,
+ 0x49, 0x0a, 0x14, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x72,
+ 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x73, 0x18, 0x11, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e,
+ 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61,
+ 0x6c, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x12, 0x67, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e,
+ 0x74, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x73, 0x12, 0x41, 0x0a, 0x1d, 0x63, 0x75,
+ 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d,
+ 0x65, 0x5f, 0x72, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x0f, 0x20, 0x01, 0x28,
+ 0x05, 0x52, 0x1a, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+ 0x54, 0x69, 0x6d, 0x65, 0x52, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x1a, 0xad, 0x04,
+ 0x0a, 0x08, 0x54, 0x65, 0x61, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61,
+ 0x6d, 0x65, 0x18, 0x01, 0x20, 0x02, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14,
+ 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x02, 0x20, 0x02, 0x28, 0x0d, 0x52, 0x05, 0x73,
+ 0x63, 0x6f, 0x72, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x64, 0x5f, 0x63, 0x61, 0x72, 0x64,
+ 0x73, 0x18, 0x03, 0x20, 0x02, 0x28, 0x0d, 0x52, 0x08, 0x72, 0x65, 0x64, 0x43, 0x61, 0x72, 0x64,
+ 0x73, 0x12, 0x2e, 0x0a, 0x11, 0x79, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x63, 0x61, 0x72, 0x64,
+ 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0d, 0x42, 0x02, 0x10, 0x01,
+ 0x52, 0x0f, 0x79, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x43, 0x61, 0x72, 0x64, 0x54, 0x69, 0x6d, 0x65,
+ 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x79, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x63, 0x61, 0x72, 0x64,
+ 0x73, 0x18, 0x05, 0x20, 0x02, 0x28, 0x0d, 0x52, 0x0b, 0x79, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x43,
+ 0x61, 0x72, 0x64, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x73,
+ 0x18, 0x06, 0x20, 0x02, 0x28, 0x0d, 0x52, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x73,
+ 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65,
+ 0x18, 0x07, 0x20, 0x02, 0x28, 0x0d, 0x52, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x54,
+ 0x69, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x67, 0x6f, 0x61, 0x6c, 0x6b, 0x65, 0x65, 0x70, 0x65,
+ 0x72, 0x18, 0x08, 0x20, 0x02, 0x28, 0x0d, 0x52, 0x0a, 0x67, 0x6f, 0x61, 0x6c, 0x6b, 0x65, 0x65,
+ 0x70, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x6f, 0x75, 0x6c, 0x5f, 0x63, 0x6f, 0x75, 0x6e,
+ 0x74, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x66, 0x6f, 0x75, 0x6c, 0x43,
+ 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x36, 0x0a, 0x17, 0x62, 0x61, 0x6c, 0x6c, 0x5f, 0x70,
+ 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65,
+ 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x15, 0x62, 0x61, 0x6c, 0x6c, 0x50, 0x6c, 0x61,
+ 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x12, 0x24,
+ 0x0a, 0x0e, 0x63, 0x61, 0x6e, 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x62, 0x61, 0x6c, 0x6c,
+ 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x63, 0x61, 0x6e, 0x50, 0x6c, 0x61, 0x63, 0x65,
+ 0x42, 0x61, 0x6c, 0x6c, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x61, 0x6c, 0x6c, 0x6f,
+ 0x77, 0x65, 0x64, 0x5f, 0x62, 0x6f, 0x74, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e,
+ 0x6d, 0x61, 0x78, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x42, 0x6f, 0x74, 0x73, 0x12, 0x36,
+ 0x0a, 0x17, 0x62, 0x6f, 0x74, 0x5f, 0x73, 0x75, 0x62, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, 0x69,
+ 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52,
+ 0x15, 0x62, 0x6f, 0x74, 0x53, 0x75, 0x62, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, 0x69, 0x6f, 0x6e,
+ 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x45, 0x0a, 0x1f, 0x62, 0x61, 0x6c, 0x6c, 0x5f, 0x70,
+ 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65,
+ 0x73, 0x5f, 0x72, 0x65, 0x61, 0x63, 0x68, 0x65, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52,
+ 0x1c, 0x62, 0x61, 0x6c, 0x6c, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x46, 0x61,
+ 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x61, 0x63, 0x68, 0x65, 0x64, 0x1a, 0x23, 0x0a,
+ 0x05, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20, 0x02, 0x28,
+ 0x02, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x02, 0x28, 0x02, 0x52,
+ 0x01, 0x79, 0x22, 0xd1, 0x02, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x67, 0x65, 0x12, 0x19, 0x0a, 0x15,
+ 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x5f, 0x46, 0x49, 0x52, 0x53, 0x54, 0x5f, 0x48, 0x41, 0x4c,
+ 0x46, 0x5f, 0x50, 0x52, 0x45, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x4e, 0x4f, 0x52, 0x4d, 0x41,
+ 0x4c, 0x5f, 0x46, 0x49, 0x52, 0x53, 0x54, 0x5f, 0x48, 0x41, 0x4c, 0x46, 0x10, 0x01, 0x12, 0x14,
+ 0x0a, 0x10, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x5f, 0x48, 0x41, 0x4c, 0x46, 0x5f, 0x54, 0x49,
+ 0x4d, 0x45, 0x10, 0x02, 0x12, 0x1a, 0x0a, 0x16, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x5f, 0x53,
+ 0x45, 0x43, 0x4f, 0x4e, 0x44, 0x5f, 0x48, 0x41, 0x4c, 0x46, 0x5f, 0x50, 0x52, 0x45, 0x10, 0x03,
+ 0x12, 0x16, 0x0a, 0x12, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x5f, 0x53, 0x45, 0x43, 0x4f, 0x4e,
+ 0x44, 0x5f, 0x48, 0x41, 0x4c, 0x46, 0x10, 0x04, 0x12, 0x14, 0x0a, 0x10, 0x45, 0x58, 0x54, 0x52,
+ 0x41, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x42, 0x52, 0x45, 0x41, 0x4b, 0x10, 0x05, 0x12, 0x18,
+ 0x0a, 0x14, 0x45, 0x58, 0x54, 0x52, 0x41, 0x5f, 0x46, 0x49, 0x52, 0x53, 0x54, 0x5f, 0x48, 0x41,
+ 0x4c, 0x46, 0x5f, 0x50, 0x52, 0x45, 0x10, 0x06, 0x12, 0x14, 0x0a, 0x10, 0x45, 0x58, 0x54, 0x52,
+ 0x41, 0x5f, 0x46, 0x49, 0x52, 0x53, 0x54, 0x5f, 0x48, 0x41, 0x4c, 0x46, 0x10, 0x07, 0x12, 0x13,
+ 0x0a, 0x0f, 0x45, 0x58, 0x54, 0x52, 0x41, 0x5f, 0x48, 0x41, 0x4c, 0x46, 0x5f, 0x54, 0x49, 0x4d,
+ 0x45, 0x10, 0x08, 0x12, 0x19, 0x0a, 0x15, 0x45, 0x58, 0x54, 0x52, 0x41, 0x5f, 0x53, 0x45, 0x43,
+ 0x4f, 0x4e, 0x44, 0x5f, 0x48, 0x41, 0x4c, 0x46, 0x5f, 0x50, 0x52, 0x45, 0x10, 0x09, 0x12, 0x15,
+ 0x0a, 0x11, 0x45, 0x58, 0x54, 0x52, 0x41, 0x5f, 0x53, 0x45, 0x43, 0x4f, 0x4e, 0x44, 0x5f, 0x48,
+ 0x41, 0x4c, 0x46, 0x10, 0x0a, 0x12, 0x1a, 0x0a, 0x16, 0x50, 0x45, 0x4e, 0x41, 0x4c, 0x54, 0x59,
+ 0x5f, 0x53, 0x48, 0x4f, 0x4f, 0x54, 0x4f, 0x55, 0x54, 0x5f, 0x42, 0x52, 0x45, 0x41, 0x4b, 0x10,
+ 0x0b, 0x12, 0x14, 0x0a, 0x10, 0x50, 0x45, 0x4e, 0x41, 0x4c, 0x54, 0x59, 0x5f, 0x53, 0x48, 0x4f,
+ 0x4f, 0x54, 0x4f, 0x55, 0x54, 0x10, 0x0c, 0x12, 0x0d, 0x0a, 0x09, 0x50, 0x4f, 0x53, 0x54, 0x5f,
+ 0x47, 0x41, 0x4d, 0x45, 0x10, 0x0d, 0x22, 0x8e, 0x03, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61,
+ 0x6e, 0x64, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x41, 0x4c, 0x54, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04,
+ 0x53, 0x54, 0x4f, 0x50, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c,
+ 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x46, 0x4f, 0x52, 0x43,
+ 0x45, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x10, 0x03, 0x12, 0x1a, 0x0a, 0x16, 0x50, 0x52, 0x45,
+ 0x50, 0x41, 0x52, 0x45, 0x5f, 0x4b, 0x49, 0x43, 0x4b, 0x4f, 0x46, 0x46, 0x5f, 0x59, 0x45, 0x4c,
+ 0x4c, 0x4f, 0x57, 0x10, 0x04, 0x12, 0x18, 0x0a, 0x14, 0x50, 0x52, 0x45, 0x50, 0x41, 0x52, 0x45,
+ 0x5f, 0x4b, 0x49, 0x43, 0x4b, 0x4f, 0x46, 0x46, 0x5f, 0x42, 0x4c, 0x55, 0x45, 0x10, 0x05, 0x12,
+ 0x1a, 0x0a, 0x16, 0x50, 0x52, 0x45, 0x50, 0x41, 0x52, 0x45, 0x5f, 0x50, 0x45, 0x4e, 0x41, 0x4c,
+ 0x54, 0x59, 0x5f, 0x59, 0x45, 0x4c, 0x4c, 0x4f, 0x57, 0x10, 0x06, 0x12, 0x18, 0x0a, 0x14, 0x50,
+ 0x52, 0x45, 0x50, 0x41, 0x52, 0x45, 0x5f, 0x50, 0x45, 0x4e, 0x41, 0x4c, 0x54, 0x59, 0x5f, 0x42,
+ 0x4c, 0x55, 0x45, 0x10, 0x07, 0x12, 0x16, 0x0a, 0x12, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x5f,
+ 0x46, 0x52, 0x45, 0x45, 0x5f, 0x59, 0x45, 0x4c, 0x4c, 0x4f, 0x57, 0x10, 0x08, 0x12, 0x14, 0x0a,
+ 0x10, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x5f, 0x46, 0x52, 0x45, 0x45, 0x5f, 0x42, 0x4c, 0x55,
+ 0x45, 0x10, 0x09, 0x12, 0x18, 0x0a, 0x14, 0x49, 0x4e, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x5f,
+ 0x46, 0x52, 0x45, 0x45, 0x5f, 0x59, 0x45, 0x4c, 0x4c, 0x4f, 0x57, 0x10, 0x0a, 0x12, 0x16, 0x0a,
+ 0x12, 0x49, 0x4e, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x5f, 0x46, 0x52, 0x45, 0x45, 0x5f, 0x42,
+ 0x4c, 0x55, 0x45, 0x10, 0x0b, 0x12, 0x12, 0x0a, 0x0e, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54,
+ 0x5f, 0x59, 0x45, 0x4c, 0x4c, 0x4f, 0x57, 0x10, 0x0c, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x49, 0x4d,
+ 0x45, 0x4f, 0x55, 0x54, 0x5f, 0x42, 0x4c, 0x55, 0x45, 0x10, 0x0d, 0x12, 0x13, 0x0a, 0x0b, 0x47,
+ 0x4f, 0x41, 0x4c, 0x5f, 0x59, 0x45, 0x4c, 0x4c, 0x4f, 0x57, 0x10, 0x0e, 0x1a, 0x02, 0x08, 0x01,
+ 0x12, 0x11, 0x0a, 0x09, 0x47, 0x4f, 0x41, 0x4c, 0x5f, 0x42, 0x4c, 0x55, 0x45, 0x10, 0x0f, 0x1a,
+ 0x02, 0x08, 0x01, 0x12, 0x19, 0x0a, 0x15, 0x42, 0x41, 0x4c, 0x4c, 0x5f, 0x50, 0x4c, 0x41, 0x43,
+ 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x59, 0x45, 0x4c, 0x4c, 0x4f, 0x57, 0x10, 0x10, 0x12, 0x17,
+ 0x0a, 0x13, 0x42, 0x41, 0x4c, 0x4c, 0x5f, 0x50, 0x4c, 0x41, 0x43, 0x45, 0x4d, 0x45, 0x4e, 0x54,
+ 0x5f, 0x42, 0x4c, 0x55, 0x45, 0x10, 0x11, 0x4a, 0x04, 0x08, 0x0b, 0x10, 0x0c, 0x4a, 0x04, 0x08,
+ 0x0d, 0x10, 0x0e, 0x4a, 0x04, 0x08, 0x0e, 0x10, 0x0f, 0x22, 0x5f, 0x0a, 0x16, 0x47, 0x61, 0x6d,
+ 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x47, 0x72,
+ 0x6f, 0x75, 0x70, 0x12, 0x29, 0x0a, 0x0a, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x65, 0x76, 0x65, 0x6e,
+ 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76,
+ 0x65, 0x6e, 0x74, 0x52, 0x09, 0x67, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1a,
+ 0x0a, 0x08, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08,
+ 0x52, 0x08, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x42, 0x43, 0x5a, 0x41, 0x67, 0x69,
+ 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x52, 0x6f, 0x62, 0x6f, 0x43, 0x75, 0x70,
+ 0x2d, 0x53, 0x53, 0x4c, 0x2f, 0x73, 0x73, 0x6c, 0x2d, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2f, 0x69,
+ 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65,
+}
+
+var (
+ file_ssl_gc_referee_message_proto_rawDescOnce sync.Once
+ file_ssl_gc_referee_message_proto_rawDescData = file_ssl_gc_referee_message_proto_rawDesc
+)
+
+func file_ssl_gc_referee_message_proto_rawDescGZIP() []byte {
+ file_ssl_gc_referee_message_proto_rawDescOnce.Do(func() {
+ file_ssl_gc_referee_message_proto_rawDescData = protoimpl.X.CompressGZIP(file_ssl_gc_referee_message_proto_rawDescData)
+ })
+ return file_ssl_gc_referee_message_proto_rawDescData
+}
+
+var file_ssl_gc_referee_message_proto_enumTypes = make([]protoimpl.EnumInfo, 2)
+var file_ssl_gc_referee_message_proto_msgTypes = make([]protoimpl.MessageInfo, 4)
+var file_ssl_gc_referee_message_proto_goTypes = []interface{}{
+ (Referee_Stage)(0), // 0: Referee.Stage
+ (Referee_Command)(0), // 1: Referee.Command
+ (*Referee)(nil), // 2: Referee
+ (*GameEventProposalGroup)(nil), // 3: GameEventProposalGroup
+ (*Referee_TeamInfo)(nil), // 4: Referee.TeamInfo
+ (*Referee_Point)(nil), // 5: Referee.Point
+ (*GameEvent)(nil), // 6: GameEvent
+}
+var file_ssl_gc_referee_message_proto_depIdxs = []int32{
+ 0, // 0: Referee.stage:type_name -> Referee.Stage
+ 1, // 1: Referee.command:type_name -> Referee.Command
+ 4, // 2: Referee.yellow:type_name -> Referee.TeamInfo
+ 4, // 3: Referee.blue:type_name -> Referee.TeamInfo
+ 5, // 4: Referee.designated_position:type_name -> Referee.Point
+ 1, // 5: Referee.next_command:type_name -> Referee.Command
+ 6, // 6: Referee.game_events:type_name -> GameEvent
+ 3, // 7: Referee.game_event_proposals:type_name -> GameEventProposalGroup
+ 6, // 8: GameEventProposalGroup.game_event:type_name -> GameEvent
+ 9, // [9:9] is the sub-list for method output_type
+ 9, // [9:9] is the sub-list for method input_type
+ 9, // [9:9] is the sub-list for extension type_name
+ 9, // [9:9] is the sub-list for extension extendee
+ 0, // [0:9] is the sub-list for field type_name
+}
+
+func init() { file_ssl_gc_referee_message_proto_init() }
+func file_ssl_gc_referee_message_proto_init() {
+ if File_ssl_gc_referee_message_proto != nil {
+ return
+ }
+ file_ssl_gc_game_event_proto_init()
+ if !protoimpl.UnsafeEnabled {
+ file_ssl_gc_referee_message_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*Referee); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_gc_referee_message_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GameEventProposalGroup); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_gc_referee_message_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*Referee_TeamInfo); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_gc_referee_message_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*Referee_Point); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ }
+ type x struct{}
+ out := protoimpl.TypeBuilder{
+ File: protoimpl.DescBuilder{
+ GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+ RawDescriptor: file_ssl_gc_referee_message_proto_rawDesc,
+ NumEnums: 2,
+ NumMessages: 4,
+ NumExtensions: 0,
+ NumServices: 0,
+ },
+ GoTypes: file_ssl_gc_referee_message_proto_goTypes,
+ DependencyIndexes: file_ssl_gc_referee_message_proto_depIdxs,
+ EnumInfos: file_ssl_gc_referee_message_proto_enumTypes,
+ MessageInfos: file_ssl_gc_referee_message_proto_msgTypes,
+ }.Build()
+ File_ssl_gc_referee_message_proto = out.File
+ file_ssl_gc_referee_message_proto_rawDesc = nil
+ file_ssl_gc_referee_message_proto_goTypes = nil
+ file_ssl_gc_referee_message_proto_depIdxs = nil
+}
diff --git a/internal/simctl/replace_ball.go b/internal/simctl/replace_ball.go
new file mode 100644
index 0000000..8634133
--- /dev/null
+++ b/internal/simctl/replace_ball.go
@@ -0,0 +1,85 @@
+package simctl
+
+import (
+ "github.com/RoboCup-SSL/ssl-simulation-controller/internal/geom"
+ "github.com/RoboCup-SSL/ssl-simulation-controller/internal/referee"
+ "github.com/golang/protobuf/proto"
+ "log"
+ "time"
+)
+
+type BallReplacer struct {
+ c *SimulationController
+
+ lastTimePlacedBall time.Time
+ haltTime *time.Time
+}
+
+func (r *BallReplacer) handleReplaceBall() {
+ if *r.c.lastRefereeMsg.Command != referee.Referee_HALT {
+ // Only during HALT
+ r.haltTime = nil
+ return
+ }
+ if r.haltTime == nil {
+ r.haltTime = new(time.Time)
+ *r.haltTime = time.Now()
+ }
+
+ if time.Now().Sub(*r.haltTime) < 500*time.Millisecond {
+ // Halt must be set for at least 1 second
+ return
+ }
+
+ if r.c.lastRefereeMsg.DesignatedPosition == nil {
+ // Only when ball placement position set
+ return
+ }
+
+ if time.Now().Sub(r.lastTimePlacedBall) < 500*time.Millisecond {
+ // Placed ball just recently
+ return
+ }
+
+ targetPos := geom.NewVector2Float32(
+ *r.c.lastRefereeMsg.DesignatedPosition.X/1000,
+ *r.c.lastRefereeMsg.DesignatedPosition.Y/1000,
+ )
+
+ balls := r.c.lastTrackedFrame.TrackedFrame.Balls
+ if len(balls) == 0 {
+ r.placeBall(targetPos)
+ return
+ }
+
+ currentPos := geom.NewVector2Float32(*balls[0].Pos.X, *balls[0].Pos.Y)
+
+ if targetPos.DistanceTo(currentPos) > 0.1 {
+ r.placeBall(targetPos)
+ }
+}
+
+func (r *BallReplacer) placeBall(ballPos *geom.Vector2) {
+ log.Printf("Placing ball to %v", ballPos)
+
+ zero := float32(0)
+ command := SimulatorCommand{
+ Control: &SimulatorControl{
+ TeleportBall: &TeleportBall{
+ X: ballPos.X,
+ Y: ballPos.Y,
+ Z: &zero,
+ Vx: &zero,
+ Vy: &zero,
+ Vz: &zero,
+ },
+ },
+ }
+
+ if data, err := proto.Marshal(&command); err != nil {
+ log.Println("Could not marshal command: ", err)
+ } else {
+ r.c.simControlClient.Send(data)
+ r.lastTimePlacedBall = time.Now()
+ }
+}
diff --git a/internal/simctl/simctl.go b/internal/simctl/simctl.go
new file mode 100644
index 0000000..563f2d0
--- /dev/null
+++ b/internal/simctl/simctl.go
@@ -0,0 +1,117 @@
+package simctl
+
+import (
+ "github.com/RoboCup-SSL/ssl-simulation-controller/internal/referee"
+ "github.com/RoboCup-SSL/ssl-simulation-controller/internal/sslnet"
+ "github.com/RoboCup-SSL/ssl-simulation-controller/internal/tracker"
+ "github.com/RoboCup-SSL/ssl-simulation-controller/internal/vision"
+ "github.com/golang/protobuf/proto"
+ "log"
+ "net"
+)
+
+type SimulationController struct {
+ visionServer *sslnet.MulticastServer
+ refereeServer *sslnet.MulticastServer
+ trackerServer *sslnet.MulticastServer
+ simControlClient *sslnet.UdpClient
+
+ simControlPort string
+
+ lastTrackedFrame *tracker.TrackerWrapperPacket
+ lastRefereeMsg *referee.Referee
+ fieldSize *vision.SSL_GeometryFieldSize
+
+ ballReplacer BallReplacer
+}
+
+func NewSimulationController(visionAddress, refereeAddress, trackerAddress string, simControlPort string) (c *SimulationController) {
+ c = new(SimulationController)
+ c.visionServer = sslnet.NewMulticastServer(visionAddress, c.onNewVisionData)
+ c.refereeServer = sslnet.NewMulticastServer(refereeAddress, c.onNewRefereeData)
+ c.trackerServer = sslnet.NewMulticastServer(trackerAddress, c.onNewTrackerData)
+ c.simControlPort = simControlPort
+ c.ballReplacer.c = c
+ return
+}
+
+func (c *SimulationController) onNewVisionData(data []byte, remoteAddr *net.UDPAddr) {
+ wrapper := vision.SSL_WrapperPacket{}
+ if err := proto.Unmarshal(data, &wrapper); err != nil {
+ log.Println("Could not unmarshal vision wrapper packet", err)
+ return
+ }
+
+ if wrapper.Geometry != nil && wrapper.Geometry.Field != nil {
+ c.fieldSize = wrapper.Geometry.Field
+ }
+
+ if c.simControlClient == nil {
+ address := remoteAddr.IP.String() + ":" + c.simControlPort
+ c.simControlClient = sslnet.NewUdpClient(address)
+ c.simControlClient.Consumer = c.onNewSimControlResponseData
+ c.simControlClient.Start()
+ }
+}
+
+func (c *SimulationController) onNewRefereeData(data []byte, _ *net.UDPAddr) {
+ refereeMsg := new(referee.Referee)
+ if err := proto.Unmarshal(data, refereeMsg); err != nil {
+ log.Println("Could not unmarshal referee packet", err)
+ return
+ }
+ c.lastRefereeMsg = refereeMsg
+}
+
+func (c *SimulationController) onNewTrackerData(data []byte, _ *net.UDPAddr) {
+ frame := new(tracker.TrackerWrapperPacket)
+ if err := proto.Unmarshal(data, frame); err != nil {
+ log.Println("Could not unmarshal tracker packet", err)
+ return
+ }
+ if c.lastTrackedFrame == nil || // very first frame
+ *c.lastTrackedFrame.Uuid == *frame.Uuid || // frame from same origin
+ // new frame is significantly newer than last frame
+ (*frame.TrackedFrame.Timestamp-*c.lastTrackedFrame.TrackedFrame.Timestamp) > 5 {
+ c.lastTrackedFrame = frame
+ c.handle()
+ }
+}
+
+func (c *SimulationController) onNewSimControlResponseData(data []byte) {
+ response := new(SimulatorResponse)
+ if err := proto.Unmarshal(data, response); err != nil {
+ log.Println("Could not unmarshal tracker packet", err)
+ return
+ }
+ for _, responseError := range response.Errors {
+ log.Printf("SimControl Error: %v", responseError)
+ }
+}
+
+func (c *SimulationController) handle() {
+ if c.lastTrackedFrame == nil ||
+ c.fieldSize == nil ||
+ c.lastRefereeMsg == nil ||
+ c.simControlClient == nil {
+ return
+ }
+
+ c.ballReplacer.handleReplaceBall()
+}
+
+func (c *SimulationController) Start() {
+ c.visionServer.Start()
+ c.refereeServer.Start()
+ c.trackerServer.Start()
+}
+
+func (c *SimulationController) Stop() {
+ c.visionServer.Stop()
+ c.refereeServer.Stop()
+ c.trackerServer.Stop()
+ if c.simControlClient != nil {
+ c.simControlClient.Stop()
+ c.simControlClient = nil
+ }
+}
diff --git a/internal/simctl/ssl_simulation_config.pb.go b/internal/simctl/ssl_simulation_config.pb.go
new file mode 100644
index 0000000..55e8e0d
--- /dev/null
+++ b/internal/simctl/ssl_simulation_config.pb.go
@@ -0,0 +1,683 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// protoc-gen-go v1.25.0
+// protoc v3.12.4
+// source: ssl_simulation_config.proto
+
+package simctl
+
+import (
+ referee "github.com/RoboCup-SSL/ssl-simulation-controller/internal/referee"
+ vision "github.com/RoboCup-SSL/ssl-simulation-controller/internal/vision"
+ proto "github.com/golang/protobuf/proto"
+ any "github.com/golang/protobuf/ptypes/any"
+ protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+ protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+ reflect "reflect"
+ sync "sync"
+)
+
+const (
+ // Verify that this generated code is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+ // Verify that runtime/protoimpl is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
+
+// Movement limits for a robot
+type RobotLimits struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // Max absolute speed-up acceleration [m/s^2]
+ AccSpeedupAbsoluteMax *float32 `protobuf:"fixed32,1,opt,name=acc_speedup_absolute_max,json=accSpeedupAbsoluteMax" json:"acc_speedup_absolute_max,omitempty"`
+ // Max angular speed-up acceleration [rad/s^2]
+ AccSpeedupAngularMax *float32 `protobuf:"fixed32,2,opt,name=acc_speedup_angular_max,json=accSpeedupAngularMax" json:"acc_speedup_angular_max,omitempty"`
+ // Max absolute brake acceleration [m/s^2]
+ AccBrakeAbsoluteMax *float32 `protobuf:"fixed32,3,opt,name=acc_brake_absolute_max,json=accBrakeAbsoluteMax" json:"acc_brake_absolute_max,omitempty"`
+ // Max angular brake acceleration [rad/s^2]
+ AccBrakeAngularMax *float32 `protobuf:"fixed32,4,opt,name=acc_brake_angular_max,json=accBrakeAngularMax" json:"acc_brake_angular_max,omitempty"`
+ // Max absolute velocity [m/s]
+ VelAbsoluteMax *float32 `protobuf:"fixed32,5,opt,name=vel_absolute_max,json=velAbsoluteMax" json:"vel_absolute_max,omitempty"`
+ // Max angular velocity [rad/s]
+ VelAngularMax *float32 `protobuf:"fixed32,6,opt,name=vel_angular_max,json=velAngularMax" json:"vel_angular_max,omitempty"`
+}
+
+func (x *RobotLimits) Reset() {
+ *x = RobotLimits{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_simulation_config_proto_msgTypes[0]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *RobotLimits) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*RobotLimits) ProtoMessage() {}
+
+func (x *RobotLimits) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_simulation_config_proto_msgTypes[0]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use RobotLimits.ProtoReflect.Descriptor instead.
+func (*RobotLimits) Descriptor() ([]byte, []int) {
+ return file_ssl_simulation_config_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *RobotLimits) GetAccSpeedupAbsoluteMax() float32 {
+ if x != nil && x.AccSpeedupAbsoluteMax != nil {
+ return *x.AccSpeedupAbsoluteMax
+ }
+ return 0
+}
+
+func (x *RobotLimits) GetAccSpeedupAngularMax() float32 {
+ if x != nil && x.AccSpeedupAngularMax != nil {
+ return *x.AccSpeedupAngularMax
+ }
+ return 0
+}
+
+func (x *RobotLimits) GetAccBrakeAbsoluteMax() float32 {
+ if x != nil && x.AccBrakeAbsoluteMax != nil {
+ return *x.AccBrakeAbsoluteMax
+ }
+ return 0
+}
+
+func (x *RobotLimits) GetAccBrakeAngularMax() float32 {
+ if x != nil && x.AccBrakeAngularMax != nil {
+ return *x.AccBrakeAngularMax
+ }
+ return 0
+}
+
+func (x *RobotLimits) GetVelAbsoluteMax() float32 {
+ if x != nil && x.VelAbsoluteMax != nil {
+ return *x.VelAbsoluteMax
+ }
+ return 0
+}
+
+func (x *RobotLimits) GetVelAngularMax() float32 {
+ if x != nil && x.VelAngularMax != nil {
+ return *x.VelAngularMax
+ }
+ return 0
+}
+
+// Robot wheel angle configuration
+// all angles are relative to looking forward,
+// all wheels / angles are clockwise
+type RobotWheelAngles struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // Angle front right [rad]
+ FrontRight *float32 `protobuf:"fixed32,1,req,name=front_right,json=frontRight" json:"front_right,omitempty"`
+ // Angle back right [rad]
+ BackRight *float32 `protobuf:"fixed32,2,req,name=back_right,json=backRight" json:"back_right,omitempty"`
+ // Angle back left [rad]
+ BackLeft *float32 `protobuf:"fixed32,3,req,name=back_left,json=backLeft" json:"back_left,omitempty"`
+ // Angle front left [rad]
+ FrontLeft *float32 `protobuf:"fixed32,4,req,name=front_left,json=frontLeft" json:"front_left,omitempty"`
+}
+
+func (x *RobotWheelAngles) Reset() {
+ *x = RobotWheelAngles{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_simulation_config_proto_msgTypes[1]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *RobotWheelAngles) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*RobotWheelAngles) ProtoMessage() {}
+
+func (x *RobotWheelAngles) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_simulation_config_proto_msgTypes[1]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use RobotWheelAngles.ProtoReflect.Descriptor instead.
+func (*RobotWheelAngles) Descriptor() ([]byte, []int) {
+ return file_ssl_simulation_config_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *RobotWheelAngles) GetFrontRight() float32 {
+ if x != nil && x.FrontRight != nil {
+ return *x.FrontRight
+ }
+ return 0
+}
+
+func (x *RobotWheelAngles) GetBackRight() float32 {
+ if x != nil && x.BackRight != nil {
+ return *x.BackRight
+ }
+ return 0
+}
+
+func (x *RobotWheelAngles) GetBackLeft() float32 {
+ if x != nil && x.BackLeft != nil {
+ return *x.BackLeft
+ }
+ return 0
+}
+
+func (x *RobotWheelAngles) GetFrontLeft() float32 {
+ if x != nil && x.FrontLeft != nil {
+ return *x.FrontLeft
+ }
+ return 0
+}
+
+// Specs of a robot
+type RobotSpecs struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // Id of the robot
+ Id *referee.RobotId `protobuf:"bytes,1,req,name=id" json:"id,omitempty"`
+ // Robot radius [m]
+ Radius *float32 `protobuf:"fixed32,2,opt,name=radius,def=0.09" json:"radius,omitempty"`
+ // Robot height [m]
+ Height *float32 `protobuf:"fixed32,3,opt,name=height,def=0.15" json:"height,omitempty"`
+ // Robot mass [kg]
+ Mass *float32 `protobuf:"fixed32,4,opt,name=mass" json:"mass,omitempty"`
+ // Max linear kick speed [m/s] (unset = unlimited)
+ MaxLinearKickSpeed *float32 `protobuf:"fixed32,7,opt,name=max_linear_kick_speed,json=maxLinearKickSpeed" json:"max_linear_kick_speed,omitempty"`
+ // Max chip kick speed [m/s] (unset = unlimited)
+ MaxChipKickSpeed *float32 `protobuf:"fixed32,8,opt,name=max_chip_kick_speed,json=maxChipKickSpeed" json:"max_chip_kick_speed,omitempty"`
+ // Width of the dribbler [m] (implicitly defines the distance from robot center to dribbler and opening angle)
+ DribblerWidth *float32 `protobuf:"fixed32,9,opt,name=dribbler_width,json=dribblerWidth" json:"dribbler_width,omitempty"`
+ // Movement limits
+ Limits *RobotLimits `protobuf:"bytes,10,opt,name=limits" json:"limits,omitempty"`
+ // Wheel angle configuration
+ WheelAngles *RobotWheelAngles `protobuf:"bytes,13,opt,name=wheel_angles,json=wheelAngles" json:"wheel_angles,omitempty"`
+ // Custom robot spec for specific simulators (the protobuf files are managed by the simulators)
+ Custom *any.Any `protobuf:"bytes,14,opt,name=custom" json:"custom,omitempty"`
+}
+
+// Default values for RobotSpecs fields.
+const (
+ Default_RobotSpecs_Radius = float32(0.09000000357627869)
+ Default_RobotSpecs_Height = float32(0.15000000596046448)
+)
+
+func (x *RobotSpecs) Reset() {
+ *x = RobotSpecs{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_simulation_config_proto_msgTypes[2]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *RobotSpecs) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*RobotSpecs) ProtoMessage() {}
+
+func (x *RobotSpecs) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_simulation_config_proto_msgTypes[2]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use RobotSpecs.ProtoReflect.Descriptor instead.
+func (*RobotSpecs) Descriptor() ([]byte, []int) {
+ return file_ssl_simulation_config_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *RobotSpecs) GetId() *referee.RobotId {
+ if x != nil {
+ return x.Id
+ }
+ return nil
+}
+
+func (x *RobotSpecs) GetRadius() float32 {
+ if x != nil && x.Radius != nil {
+ return *x.Radius
+ }
+ return Default_RobotSpecs_Radius
+}
+
+func (x *RobotSpecs) GetHeight() float32 {
+ if x != nil && x.Height != nil {
+ return *x.Height
+ }
+ return Default_RobotSpecs_Height
+}
+
+func (x *RobotSpecs) GetMass() float32 {
+ if x != nil && x.Mass != nil {
+ return *x.Mass
+ }
+ return 0
+}
+
+func (x *RobotSpecs) GetMaxLinearKickSpeed() float32 {
+ if x != nil && x.MaxLinearKickSpeed != nil {
+ return *x.MaxLinearKickSpeed
+ }
+ return 0
+}
+
+func (x *RobotSpecs) GetMaxChipKickSpeed() float32 {
+ if x != nil && x.MaxChipKickSpeed != nil {
+ return *x.MaxChipKickSpeed
+ }
+ return 0
+}
+
+func (x *RobotSpecs) GetDribblerWidth() float32 {
+ if x != nil && x.DribblerWidth != nil {
+ return *x.DribblerWidth
+ }
+ return 0
+}
+
+func (x *RobotSpecs) GetLimits() *RobotLimits {
+ if x != nil {
+ return x.Limits
+ }
+ return nil
+}
+
+func (x *RobotSpecs) GetWheelAngles() *RobotWheelAngles {
+ if x != nil {
+ return x.WheelAngles
+ }
+ return nil
+}
+
+func (x *RobotSpecs) GetCustom() *any.Any {
+ if x != nil {
+ return x.Custom
+ }
+ return nil
+}
+
+type RealismConfig struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // Custom config for specific simulators (the protobuf files are managed by the simulators)
+ Custom *any.Any `protobuf:"bytes,1,opt,name=custom" json:"custom,omitempty"`
+}
+
+func (x *RealismConfig) Reset() {
+ *x = RealismConfig{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_simulation_config_proto_msgTypes[3]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *RealismConfig) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*RealismConfig) ProtoMessage() {}
+
+func (x *RealismConfig) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_simulation_config_proto_msgTypes[3]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use RealismConfig.ProtoReflect.Descriptor instead.
+func (*RealismConfig) Descriptor() ([]byte, []int) {
+ return file_ssl_simulation_config_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *RealismConfig) GetCustom() *any.Any {
+ if x != nil {
+ return x.Custom
+ }
+ return nil
+}
+
+// Change the simulator configuration
+type SimulatorConfig struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // Update the geometry
+ Geometry *vision.SSL_GeometryData `protobuf:"bytes,1,opt,name=geometry" json:"geometry,omitempty"`
+ // Update the robot specs
+ RobotSpecs []*RobotSpecs `protobuf:"bytes,2,rep,name=robot_specs,json=robotSpecs" json:"robot_specs,omitempty"`
+ // Update realism configuration
+ RealismConfig *RealismConfig `protobuf:"bytes,3,opt,name=realism_config,json=realismConfig" json:"realism_config,omitempty"`
+ // Change the vision publish port
+ VisionPort *uint32 `protobuf:"varint,4,opt,name=vision_port,json=visionPort" json:"vision_port,omitempty"`
+}
+
+func (x *SimulatorConfig) Reset() {
+ *x = SimulatorConfig{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_simulation_config_proto_msgTypes[4]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *SimulatorConfig) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SimulatorConfig) ProtoMessage() {}
+
+func (x *SimulatorConfig) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_simulation_config_proto_msgTypes[4]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use SimulatorConfig.ProtoReflect.Descriptor instead.
+func (*SimulatorConfig) Descriptor() ([]byte, []int) {
+ return file_ssl_simulation_config_proto_rawDescGZIP(), []int{4}
+}
+
+func (x *SimulatorConfig) GetGeometry() *vision.SSL_GeometryData {
+ if x != nil {
+ return x.Geometry
+ }
+ return nil
+}
+
+func (x *SimulatorConfig) GetRobotSpecs() []*RobotSpecs {
+ if x != nil {
+ return x.RobotSpecs
+ }
+ return nil
+}
+
+func (x *SimulatorConfig) GetRealismConfig() *RealismConfig {
+ if x != nil {
+ return x.RealismConfig
+ }
+ return nil
+}
+
+func (x *SimulatorConfig) GetVisionPort() uint32 {
+ if x != nil && x.VisionPort != nil {
+ return *x.VisionPort
+ }
+ return 0
+}
+
+var File_ssl_simulation_config_proto protoreflect.FileDescriptor
+
+var file_ssl_simulation_config_proto_rawDesc = []byte{
+ 0x0a, 0x1b, 0x73, 0x73, 0x6c, 0x5f, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1d, 0x65,
+ 0x64, 0x75, 0x2e, 0x74, 0x69, 0x67, 0x65, 0x72, 0x73, 0x2e, 0x73, 0x75, 0x6d, 0x61, 0x74, 0x72,
+ 0x61, 0x2e, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x13, 0x73, 0x73,
+ 0x6c, 0x5f, 0x67, 0x63, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+ 0x6f, 0x1a, 0x19, 0x73, 0x73, 0x6c, 0x5f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x67, 0x65,
+ 0x6f, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f,
+ 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x61, 0x6e,
+ 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xb7, 0x02, 0x0a, 0x0b, 0x52, 0x6f, 0x62, 0x6f,
+ 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x37, 0x0a, 0x18, 0x61, 0x63, 0x63, 0x5f, 0x73,
+ 0x70, 0x65, 0x65, 0x64, 0x75, 0x70, 0x5f, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x5f,
+ 0x6d, 0x61, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x15, 0x61, 0x63, 0x63, 0x53, 0x70,
+ 0x65, 0x65, 0x64, 0x75, 0x70, 0x41, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x4d, 0x61, 0x78,
+ 0x12, 0x35, 0x0a, 0x17, 0x61, 0x63, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x65, 0x64, 0x75, 0x70, 0x5f,
+ 0x61, 0x6e, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28,
+ 0x02, 0x52, 0x14, 0x61, 0x63, 0x63, 0x53, 0x70, 0x65, 0x65, 0x64, 0x75, 0x70, 0x41, 0x6e, 0x67,
+ 0x75, 0x6c, 0x61, 0x72, 0x4d, 0x61, 0x78, 0x12, 0x33, 0x0a, 0x16, 0x61, 0x63, 0x63, 0x5f, 0x62,
+ 0x72, 0x61, 0x6b, 0x65, 0x5f, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x5f, 0x6d, 0x61,
+ 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x13, 0x61, 0x63, 0x63, 0x42, 0x72, 0x61, 0x6b,
+ 0x65, 0x41, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x4d, 0x61, 0x78, 0x12, 0x31, 0x0a, 0x15,
+ 0x61, 0x63, 0x63, 0x5f, 0x62, 0x72, 0x61, 0x6b, 0x65, 0x5f, 0x61, 0x6e, 0x67, 0x75, 0x6c, 0x61,
+ 0x72, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x12, 0x61, 0x63, 0x63,
+ 0x42, 0x72, 0x61, 0x6b, 0x65, 0x41, 0x6e, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x4d, 0x61, 0x78, 0x12,
+ 0x28, 0x0a, 0x10, 0x76, 0x65, 0x6c, 0x5f, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x5f,
+ 0x6d, 0x61, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0e, 0x76, 0x65, 0x6c, 0x41, 0x62,
+ 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x4d, 0x61, 0x78, 0x12, 0x26, 0x0a, 0x0f, 0x76, 0x65, 0x6c,
+ 0x5f, 0x61, 0x6e, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x06, 0x20, 0x01,
+ 0x28, 0x02, 0x52, 0x0d, 0x76, 0x65, 0x6c, 0x41, 0x6e, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x4d, 0x61,
+ 0x78, 0x22, 0x8e, 0x01, 0x0a, 0x10, 0x52, 0x6f, 0x62, 0x6f, 0x74, 0x57, 0x68, 0x65, 0x65, 0x6c,
+ 0x41, 0x6e, 0x67, 0x6c, 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x5f,
+ 0x72, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x02, 0x28, 0x02, 0x52, 0x0a, 0x66, 0x72, 0x6f,
+ 0x6e, 0x74, 0x52, 0x69, 0x67, 0x68, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x61, 0x63, 0x6b, 0x5f,
+ 0x72, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x02, 0x28, 0x02, 0x52, 0x09, 0x62, 0x61, 0x63,
+ 0x6b, 0x52, 0x69, 0x67, 0x68, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x6c,
+ 0x65, 0x66, 0x74, 0x18, 0x03, 0x20, 0x02, 0x28, 0x02, 0x52, 0x08, 0x62, 0x61, 0x63, 0x6b, 0x4c,
+ 0x65, 0x66, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x5f, 0x6c, 0x65, 0x66,
+ 0x74, 0x18, 0x04, 0x20, 0x02, 0x28, 0x02, 0x52, 0x09, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x4c, 0x65,
+ 0x66, 0x74, 0x22, 0xc5, 0x03, 0x0a, 0x0a, 0x52, 0x6f, 0x62, 0x6f, 0x74, 0x53, 0x70, 0x65, 0x63,
+ 0x73, 0x12, 0x18, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0b, 0x32, 0x08, 0x2e,
+ 0x52, 0x6f, 0x62, 0x6f, 0x74, 0x49, 0x64, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x06, 0x72,
+ 0x61, 0x64, 0x69, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x3a, 0x04, 0x30, 0x2e, 0x30,
+ 0x39, 0x52, 0x06, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x12, 0x1c, 0x0a, 0x06, 0x68, 0x65, 0x69,
+ 0x67, 0x68, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x3a, 0x04, 0x30, 0x2e, 0x31, 0x35, 0x52,
+ 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x61, 0x73, 0x73, 0x18,
+ 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x04, 0x6d, 0x61, 0x73, 0x73, 0x12, 0x31, 0x0a, 0x15, 0x6d,
+ 0x61, 0x78, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x5f, 0x6b, 0x69, 0x63, 0x6b, 0x5f, 0x73,
+ 0x70, 0x65, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x02, 0x52, 0x12, 0x6d, 0x61, 0x78, 0x4c,
+ 0x69, 0x6e, 0x65, 0x61, 0x72, 0x4b, 0x69, 0x63, 0x6b, 0x53, 0x70, 0x65, 0x65, 0x64, 0x12, 0x2d,
+ 0x0a, 0x13, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x68, 0x69, 0x70, 0x5f, 0x6b, 0x69, 0x63, 0x6b, 0x5f,
+ 0x73, 0x70, 0x65, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x02, 0x52, 0x10, 0x6d, 0x61, 0x78,
+ 0x43, 0x68, 0x69, 0x70, 0x4b, 0x69, 0x63, 0x6b, 0x53, 0x70, 0x65, 0x65, 0x64, 0x12, 0x25, 0x0a,
+ 0x0e, 0x64, 0x72, 0x69, 0x62, 0x62, 0x6c, 0x65, 0x72, 0x5f, 0x77, 0x69, 0x64, 0x74, 0x68, 0x18,
+ 0x09, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0d, 0x64, 0x72, 0x69, 0x62, 0x62, 0x6c, 0x65, 0x72, 0x57,
+ 0x69, 0x64, 0x74, 0x68, 0x12, 0x42, 0x0a, 0x06, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x0a,
+ 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x65, 0x64, 0x75, 0x2e, 0x74, 0x69, 0x67, 0x65, 0x72,
+ 0x73, 0x2e, 0x73, 0x75, 0x6d, 0x61, 0x74, 0x72, 0x61, 0x2e, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x6f, 0x62, 0x6f, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73,
+ 0x52, 0x06, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x52, 0x0a, 0x0c, 0x77, 0x68, 0x65, 0x65,
+ 0x6c, 0x5f, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f,
+ 0x2e, 0x65, 0x64, 0x75, 0x2e, 0x74, 0x69, 0x67, 0x65, 0x72, 0x73, 0x2e, 0x73, 0x75, 0x6d, 0x61,
+ 0x74, 0x72, 0x61, 0x2e, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52,
+ 0x6f, 0x62, 0x6f, 0x74, 0x57, 0x68, 0x65, 0x65, 0x6c, 0x41, 0x6e, 0x67, 0x6c, 0x65, 0x73, 0x52,
+ 0x0b, 0x77, 0x68, 0x65, 0x65, 0x6c, 0x41, 0x6e, 0x67, 0x6c, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x06,
+ 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67,
+ 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41,
+ 0x6e, 0x79, 0x52, 0x06, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x22, 0x3d, 0x0a, 0x0d, 0x52, 0x65,
+ 0x61, 0x6c, 0x69, 0x73, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2c, 0x0a, 0x06, 0x63,
+ 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f,
+ 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e,
+ 0x79, 0x52, 0x06, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x22, 0x82, 0x02, 0x0a, 0x0f, 0x53, 0x69,
+ 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2d, 0x0a,
+ 0x08, 0x67, 0x65, 0x6f, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
+ 0x11, 0x2e, 0x53, 0x53, 0x4c, 0x5f, 0x47, 0x65, 0x6f, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x44, 0x61,
+ 0x74, 0x61, 0x52, 0x08, 0x67, 0x65, 0x6f, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x12, 0x4a, 0x0a, 0x0b,
+ 0x72, 0x6f, 0x62, 0x6f, 0x74, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28,
+ 0x0b, 0x32, 0x29, 0x2e, 0x65, 0x64, 0x75, 0x2e, 0x74, 0x69, 0x67, 0x65, 0x72, 0x73, 0x2e, 0x73,
+ 0x75, 0x6d, 0x61, 0x74, 0x72, 0x61, 0x2e, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x2e, 0x52, 0x6f, 0x62, 0x6f, 0x74, 0x53, 0x70, 0x65, 0x63, 0x73, 0x52, 0x0a, 0x72, 0x6f,
+ 0x62, 0x6f, 0x74, 0x53, 0x70, 0x65, 0x63, 0x73, 0x12, 0x53, 0x0a, 0x0e, 0x72, 0x65, 0x61, 0x6c,
+ 0x69, 0x73, 0x6d, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b,
+ 0x32, 0x2c, 0x2e, 0x65, 0x64, 0x75, 0x2e, 0x74, 0x69, 0x67, 0x65, 0x72, 0x73, 0x2e, 0x73, 0x75,
+ 0x6d, 0x61, 0x74, 0x72, 0x61, 0x2e, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x2e, 0x52, 0x65, 0x61, 0x6c, 0x69, 0x73, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0d,
+ 0x72, 0x65, 0x61, 0x6c, 0x69, 0x73, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1f, 0x0a,
+ 0x0b, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01,
+ 0x28, 0x0d, 0x52, 0x0a, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x42, 0x42,
+ 0x5a, 0x40, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x52, 0x6f, 0x62,
+ 0x6f, 0x43, 0x75, 0x70, 0x2d, 0x53, 0x53, 0x4c, 0x2f, 0x73, 0x73, 0x6c, 0x2d, 0x73, 0x69, 0x6d,
+ 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c,
+ 0x65, 0x72, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x73, 0x69, 0x6d, 0x63,
+ 0x74, 0x6c,
+}
+
+var (
+ file_ssl_simulation_config_proto_rawDescOnce sync.Once
+ file_ssl_simulation_config_proto_rawDescData = file_ssl_simulation_config_proto_rawDesc
+)
+
+func file_ssl_simulation_config_proto_rawDescGZIP() []byte {
+ file_ssl_simulation_config_proto_rawDescOnce.Do(func() {
+ file_ssl_simulation_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_ssl_simulation_config_proto_rawDescData)
+ })
+ return file_ssl_simulation_config_proto_rawDescData
+}
+
+var file_ssl_simulation_config_proto_msgTypes = make([]protoimpl.MessageInfo, 5)
+var file_ssl_simulation_config_proto_goTypes = []interface{}{
+ (*RobotLimits)(nil), // 0: edu.tigers.sumatra.simulation.RobotLimits
+ (*RobotWheelAngles)(nil), // 1: edu.tigers.sumatra.simulation.RobotWheelAngles
+ (*RobotSpecs)(nil), // 2: edu.tigers.sumatra.simulation.RobotSpecs
+ (*RealismConfig)(nil), // 3: edu.tigers.sumatra.simulation.RealismConfig
+ (*SimulatorConfig)(nil), // 4: edu.tigers.sumatra.simulation.SimulatorConfig
+ (*referee.RobotId)(nil), // 5: RobotId
+ (*any.Any)(nil), // 6: google.protobuf.Any
+ (*vision.SSL_GeometryData)(nil), // 7: SSL_GeometryData
+}
+var file_ssl_simulation_config_proto_depIdxs = []int32{
+ 5, // 0: edu.tigers.sumatra.simulation.RobotSpecs.id:type_name -> RobotId
+ 0, // 1: edu.tigers.sumatra.simulation.RobotSpecs.limits:type_name -> edu.tigers.sumatra.simulation.RobotLimits
+ 1, // 2: edu.tigers.sumatra.simulation.RobotSpecs.wheel_angles:type_name -> edu.tigers.sumatra.simulation.RobotWheelAngles
+ 6, // 3: edu.tigers.sumatra.simulation.RobotSpecs.custom:type_name -> google.protobuf.Any
+ 6, // 4: edu.tigers.sumatra.simulation.RealismConfig.custom:type_name -> google.protobuf.Any
+ 7, // 5: edu.tigers.sumatra.simulation.SimulatorConfig.geometry:type_name -> SSL_GeometryData
+ 2, // 6: edu.tigers.sumatra.simulation.SimulatorConfig.robot_specs:type_name -> edu.tigers.sumatra.simulation.RobotSpecs
+ 3, // 7: edu.tigers.sumatra.simulation.SimulatorConfig.realism_config:type_name -> edu.tigers.sumatra.simulation.RealismConfig
+ 8, // [8:8] is the sub-list for method output_type
+ 8, // [8:8] is the sub-list for method input_type
+ 8, // [8:8] is the sub-list for extension type_name
+ 8, // [8:8] is the sub-list for extension extendee
+ 0, // [0:8] is the sub-list for field type_name
+}
+
+func init() { file_ssl_simulation_config_proto_init() }
+func file_ssl_simulation_config_proto_init() {
+ if File_ssl_simulation_config_proto != nil {
+ return
+ }
+ if !protoimpl.UnsafeEnabled {
+ file_ssl_simulation_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*RobotLimits); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_simulation_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*RobotWheelAngles); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_simulation_config_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*RobotSpecs); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_simulation_config_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*RealismConfig); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_simulation_config_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*SimulatorConfig); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ }
+ type x struct{}
+ out := protoimpl.TypeBuilder{
+ File: protoimpl.DescBuilder{
+ GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+ RawDescriptor: file_ssl_simulation_config_proto_rawDesc,
+ NumEnums: 0,
+ NumMessages: 5,
+ NumExtensions: 0,
+ NumServices: 0,
+ },
+ GoTypes: file_ssl_simulation_config_proto_goTypes,
+ DependencyIndexes: file_ssl_simulation_config_proto_depIdxs,
+ MessageInfos: file_ssl_simulation_config_proto_msgTypes,
+ }.Build()
+ File_ssl_simulation_config_proto = out.File
+ file_ssl_simulation_config_proto_rawDesc = nil
+ file_ssl_simulation_config_proto_goTypes = nil
+ file_ssl_simulation_config_proto_depIdxs = nil
+}
diff --git a/internal/simctl/ssl_simulation_control.pb.go b/internal/simctl/ssl_simulation_control.pb.go
new file mode 100644
index 0000000..48d4b4a
--- /dev/null
+++ b/internal/simctl/ssl_simulation_control.pb.go
@@ -0,0 +1,640 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// protoc-gen-go v1.25.0
+// protoc v3.12.4
+// source: ssl_simulation_control.proto
+
+package simctl
+
+import (
+ referee "github.com/RoboCup-SSL/ssl-simulation-controller/internal/referee"
+ proto "github.com/golang/protobuf/proto"
+ protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+ protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+ reflect "reflect"
+ sync "sync"
+)
+
+const (
+ // Verify that this generated code is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+ // Verify that runtime/protoimpl is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
+
+// Teleport the ball to a new location and optionally set it to some velocity
+type TeleportBall struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // x-coordinate [m]
+ X *float32 `protobuf:"fixed32,1,opt,name=x" json:"x,omitempty"`
+ // y-coordinate [m]
+ Y *float32 `protobuf:"fixed32,2,opt,name=y" json:"y,omitempty"`
+ // z-coordinate (height) [m]
+ Z *float32 `protobuf:"fixed32,3,opt,name=z" json:"z,omitempty"`
+ // Velocity in x-direction [m/s]
+ Vx *float32 `protobuf:"fixed32,4,opt,name=vx" json:"vx,omitempty"`
+ // Velocity in y-direction [m/s]
+ Vy *float32 `protobuf:"fixed32,5,opt,name=vy" json:"vy,omitempty"`
+ // Velocity in z-direction [m/s]
+ Vz *float32 `protobuf:"fixed32,6,opt,name=vz" json:"vz,omitempty"`
+ // Teleport the ball safely to the target, for example by
+ // moving robots out of the way in case of collision and set speed of robots close-by to zero
+ TeleportSafely *bool `protobuf:"varint,7,opt,name=teleport_safely,json=teleportSafely,def=0" json:"teleport_safely,omitempty"`
+ // Adapt the angular ball velocity such that the ball is rolling
+ Roll *bool `protobuf:"varint,8,opt,name=roll,def=0" json:"roll,omitempty"`
+}
+
+// Default values for TeleportBall fields.
+const (
+ Default_TeleportBall_TeleportSafely = bool(false)
+ Default_TeleportBall_Roll = bool(false)
+)
+
+func (x *TeleportBall) Reset() {
+ *x = TeleportBall{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_simulation_control_proto_msgTypes[0]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *TeleportBall) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*TeleportBall) ProtoMessage() {}
+
+func (x *TeleportBall) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_simulation_control_proto_msgTypes[0]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use TeleportBall.ProtoReflect.Descriptor instead.
+func (*TeleportBall) Descriptor() ([]byte, []int) {
+ return file_ssl_simulation_control_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *TeleportBall) GetX() float32 {
+ if x != nil && x.X != nil {
+ return *x.X
+ }
+ return 0
+}
+
+func (x *TeleportBall) GetY() float32 {
+ if x != nil && x.Y != nil {
+ return *x.Y
+ }
+ return 0
+}
+
+func (x *TeleportBall) GetZ() float32 {
+ if x != nil && x.Z != nil {
+ return *x.Z
+ }
+ return 0
+}
+
+func (x *TeleportBall) GetVx() float32 {
+ if x != nil && x.Vx != nil {
+ return *x.Vx
+ }
+ return 0
+}
+
+func (x *TeleportBall) GetVy() float32 {
+ if x != nil && x.Vy != nil {
+ return *x.Vy
+ }
+ return 0
+}
+
+func (x *TeleportBall) GetVz() float32 {
+ if x != nil && x.Vz != nil {
+ return *x.Vz
+ }
+ return 0
+}
+
+func (x *TeleportBall) GetTeleportSafely() bool {
+ if x != nil && x.TeleportSafely != nil {
+ return *x.TeleportSafely
+ }
+ return Default_TeleportBall_TeleportSafely
+}
+
+func (x *TeleportBall) GetRoll() bool {
+ if x != nil && x.Roll != nil {
+ return *x.Roll
+ }
+ return Default_TeleportBall_Roll
+}
+
+// Teleport a robot to some location and give it a velocity
+type TeleportRobot struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // Robot id to teleport
+ Id *referee.RobotId `protobuf:"bytes,1,req,name=id" json:"id,omitempty"`
+ // x-coordinate [m]
+ X *float32 `protobuf:"fixed32,2,opt,name=x" json:"x,omitempty"`
+ // y-coordinate [m]
+ Y *float32 `protobuf:"fixed32,3,opt,name=y" json:"y,omitempty"`
+ // Orientation [rad], measured from the x-axis counter-clockwise
+ Orientation *float32 `protobuf:"fixed32,4,opt,name=orientation" json:"orientation,omitempty"`
+ // Global velocity [m/s] towards x-axis
+ VX *float32 `protobuf:"fixed32,5,opt,name=v_x,json=vX,def=0" json:"v_x,omitempty"`
+ // Global velocity [m/s] towards y-axis
+ VY *float32 `protobuf:"fixed32,6,opt,name=v_y,json=vY,def=0" json:"v_y,omitempty"`
+ // Angular velocity [rad/s]
+ VAngular *float32 `protobuf:"fixed32,7,opt,name=v_angular,json=vAngular,def=0" json:"v_angular,omitempty"`
+ // Robot should be present on the field?
+ // true -> robot will be added, if it does not exist yet
+ // false -> robot will be removed, if it is present
+ Present *bool `protobuf:"varint,8,opt,name=present" json:"present,omitempty"`
+}
+
+// Default values for TeleportRobot fields.
+const (
+ Default_TeleportRobot_VX = float32(0)
+ Default_TeleportRobot_VY = float32(0)
+ Default_TeleportRobot_VAngular = float32(0)
+)
+
+func (x *TeleportRobot) Reset() {
+ *x = TeleportRobot{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_simulation_control_proto_msgTypes[1]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *TeleportRobot) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*TeleportRobot) ProtoMessage() {}
+
+func (x *TeleportRobot) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_simulation_control_proto_msgTypes[1]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use TeleportRobot.ProtoReflect.Descriptor instead.
+func (*TeleportRobot) Descriptor() ([]byte, []int) {
+ return file_ssl_simulation_control_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *TeleportRobot) GetId() *referee.RobotId {
+ if x != nil {
+ return x.Id
+ }
+ return nil
+}
+
+func (x *TeleportRobot) GetX() float32 {
+ if x != nil && x.X != nil {
+ return *x.X
+ }
+ return 0
+}
+
+func (x *TeleportRobot) GetY() float32 {
+ if x != nil && x.Y != nil {
+ return *x.Y
+ }
+ return 0
+}
+
+func (x *TeleportRobot) GetOrientation() float32 {
+ if x != nil && x.Orientation != nil {
+ return *x.Orientation
+ }
+ return 0
+}
+
+func (x *TeleportRobot) GetVX() float32 {
+ if x != nil && x.VX != nil {
+ return *x.VX
+ }
+ return Default_TeleportRobot_VX
+}
+
+func (x *TeleportRobot) GetVY() float32 {
+ if x != nil && x.VY != nil {
+ return *x.VY
+ }
+ return Default_TeleportRobot_VY
+}
+
+func (x *TeleportRobot) GetVAngular() float32 {
+ if x != nil && x.VAngular != nil {
+ return *x.VAngular
+ }
+ return Default_TeleportRobot_VAngular
+}
+
+func (x *TeleportRobot) GetPresent() bool {
+ if x != nil && x.Present != nil {
+ return *x.Present
+ }
+ return false
+}
+
+// Control the simulation
+type SimulatorControl struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // Teleport the ball
+ TeleportBall *TeleportBall `protobuf:"bytes,1,opt,name=teleport_ball,json=teleportBall" json:"teleport_ball,omitempty"`
+ // Teleport robots
+ TeleportRobot []*TeleportRobot `protobuf:"bytes,2,rep,name=teleport_robot,json=teleportRobot" json:"teleport_robot,omitempty"`
+ // Change the simulation speed
+ SimulationSpeed *float32 `protobuf:"fixed32,3,opt,name=simulation_speed,json=simulationSpeed" json:"simulation_speed,omitempty"`
+}
+
+func (x *SimulatorControl) Reset() {
+ *x = SimulatorControl{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_simulation_control_proto_msgTypes[2]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *SimulatorControl) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SimulatorControl) ProtoMessage() {}
+
+func (x *SimulatorControl) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_simulation_control_proto_msgTypes[2]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use SimulatorControl.ProtoReflect.Descriptor instead.
+func (*SimulatorControl) Descriptor() ([]byte, []int) {
+ return file_ssl_simulation_control_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *SimulatorControl) GetTeleportBall() *TeleportBall {
+ if x != nil {
+ return x.TeleportBall
+ }
+ return nil
+}
+
+func (x *SimulatorControl) GetTeleportRobot() []*TeleportRobot {
+ if x != nil {
+ return x.TeleportRobot
+ }
+ return nil
+}
+
+func (x *SimulatorControl) GetSimulationSpeed() float32 {
+ if x != nil && x.SimulationSpeed != nil {
+ return *x.SimulationSpeed
+ }
+ return 0
+}
+
+// Command from the connected client to the simulator
+type SimulatorCommand struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // Control the simulation
+ Control *SimulatorControl `protobuf:"bytes,1,opt,name=control" json:"control,omitempty"`
+ // Configure the simulation
+ Config *SimulatorConfig `protobuf:"bytes,2,opt,name=config" json:"config,omitempty"`
+}
+
+func (x *SimulatorCommand) Reset() {
+ *x = SimulatorCommand{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_simulation_control_proto_msgTypes[3]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *SimulatorCommand) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SimulatorCommand) ProtoMessage() {}
+
+func (x *SimulatorCommand) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_simulation_control_proto_msgTypes[3]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use SimulatorCommand.ProtoReflect.Descriptor instead.
+func (*SimulatorCommand) Descriptor() ([]byte, []int) {
+ return file_ssl_simulation_control_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *SimulatorCommand) GetControl() *SimulatorControl {
+ if x != nil {
+ return x.Control
+ }
+ return nil
+}
+
+func (x *SimulatorCommand) GetConfig() *SimulatorConfig {
+ if x != nil {
+ return x.Config
+ }
+ return nil
+}
+
+// Response of the simulator to the connected client
+type SimulatorResponse struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // List of errors, like using unsupported features
+ Errors []*SimulatorError `protobuf:"bytes,1,rep,name=errors" json:"errors,omitempty"`
+}
+
+func (x *SimulatorResponse) Reset() {
+ *x = SimulatorResponse{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_simulation_control_proto_msgTypes[4]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *SimulatorResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SimulatorResponse) ProtoMessage() {}
+
+func (x *SimulatorResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_simulation_control_proto_msgTypes[4]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use SimulatorResponse.ProtoReflect.Descriptor instead.
+func (*SimulatorResponse) Descriptor() ([]byte, []int) {
+ return file_ssl_simulation_control_proto_rawDescGZIP(), []int{4}
+}
+
+func (x *SimulatorResponse) GetErrors() []*SimulatorError {
+ if x != nil {
+ return x.Errors
+ }
+ return nil
+}
+
+var File_ssl_simulation_control_proto protoreflect.FileDescriptor
+
+var file_ssl_simulation_control_proto_rawDesc = []byte{
+ 0x0a, 0x1c, 0x73, 0x73, 0x6c, 0x5f, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1d,
+ 0x65, 0x64, 0x75, 0x2e, 0x74, 0x69, 0x67, 0x65, 0x72, 0x73, 0x2e, 0x73, 0x75, 0x6d, 0x61, 0x74,
+ 0x72, 0x61, 0x2e, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x13, 0x73,
+ 0x73, 0x6c, 0x5f, 0x67, 0x63, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f,
+ 0x74, 0x6f, 0x1a, 0x1b, 0x73, 0x73, 0x6c, 0x5f, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a,
+ 0x1a, 0x73, 0x73, 0x6c, 0x5f, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f,
+ 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xb3, 0x01, 0x0a, 0x0c,
+ 0x54, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x61, 0x6c, 0x6c, 0x12, 0x0c, 0x0a, 0x01,
+ 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18,
+ 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x01, 0x79, 0x12, 0x0c, 0x0a, 0x01, 0x7a, 0x18, 0x03, 0x20,
+ 0x01, 0x28, 0x02, 0x52, 0x01, 0x7a, 0x12, 0x0e, 0x0a, 0x02, 0x76, 0x78, 0x18, 0x04, 0x20, 0x01,
+ 0x28, 0x02, 0x52, 0x02, 0x76, 0x78, 0x12, 0x0e, 0x0a, 0x02, 0x76, 0x79, 0x18, 0x05, 0x20, 0x01,
+ 0x28, 0x02, 0x52, 0x02, 0x76, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x76, 0x7a, 0x18, 0x06, 0x20, 0x01,
+ 0x28, 0x02, 0x52, 0x02, 0x76, 0x7a, 0x12, 0x2e, 0x0a, 0x0f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f,
+ 0x72, 0x74, 0x5f, 0x73, 0x61, 0x66, 0x65, 0x6c, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x3a,
+ 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74,
+ 0x53, 0x61, 0x66, 0x65, 0x6c, 0x79, 0x12, 0x19, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x6c, 0x18, 0x08,
+ 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x04, 0x72, 0x6f, 0x6c,
+ 0x6c, 0x22, 0xc9, 0x01, 0x0a, 0x0d, 0x54, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x6f,
+ 0x62, 0x6f, 0x74, 0x12, 0x18, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0b, 0x32,
+ 0x08, 0x2e, 0x52, 0x6f, 0x62, 0x6f, 0x74, 0x49, 0x64, 0x52, 0x02, 0x69, 0x64, 0x12, 0x0c, 0x0a,
+ 0x01, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79,
+ 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x01, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x6f, 0x72, 0x69,
+ 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0b,
+ 0x6f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x03, 0x76,
+ 0x5f, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x02, 0x3a, 0x01, 0x30, 0x52, 0x02, 0x76, 0x58, 0x12,
+ 0x12, 0x0a, 0x03, 0x76, 0x5f, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x02, 0x3a, 0x01, 0x30, 0x52,
+ 0x02, 0x76, 0x59, 0x12, 0x1e, 0x0a, 0x09, 0x76, 0x5f, 0x61, 0x6e, 0x67, 0x75, 0x6c, 0x61, 0x72,
+ 0x18, 0x07, 0x20, 0x01, 0x28, 0x02, 0x3a, 0x01, 0x30, 0x52, 0x08, 0x76, 0x41, 0x6e, 0x67, 0x75,
+ 0x6c, 0x61, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x18, 0x08,
+ 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x22, 0xe4, 0x01,
+ 0x0a, 0x10, 0x53, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x43, 0x6f, 0x6e, 0x74, 0x72,
+ 0x6f, 0x6c, 0x12, 0x50, 0x0a, 0x0d, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x62,
+ 0x61, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x65, 0x64, 0x75, 0x2e,
+ 0x74, 0x69, 0x67, 0x65, 0x72, 0x73, 0x2e, 0x73, 0x75, 0x6d, 0x61, 0x74, 0x72, 0x61, 0x2e, 0x73,
+ 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x54, 0x65, 0x6c, 0x65, 0x70, 0x6f,
+ 0x72, 0x74, 0x42, 0x61, 0x6c, 0x6c, 0x52, 0x0c, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74,
+ 0x42, 0x61, 0x6c, 0x6c, 0x12, 0x53, 0x0a, 0x0e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74,
+ 0x5f, 0x72, 0x6f, 0x62, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x65,
+ 0x64, 0x75, 0x2e, 0x74, 0x69, 0x67, 0x65, 0x72, 0x73, 0x2e, 0x73, 0x75, 0x6d, 0x61, 0x74, 0x72,
+ 0x61, 0x2e, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x54, 0x65, 0x6c,
+ 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x6f, 0x62, 0x6f, 0x74, 0x52, 0x0d, 0x74, 0x65, 0x6c, 0x65,
+ 0x70, 0x6f, 0x72, 0x74, 0x52, 0x6f, 0x62, 0x6f, 0x74, 0x12, 0x29, 0x0a, 0x10, 0x73, 0x69, 0x6d,
+ 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x70, 0x65, 0x65, 0x64, 0x18, 0x03, 0x20,
+ 0x01, 0x28, 0x02, 0x52, 0x0f, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53,
+ 0x70, 0x65, 0x65, 0x64, 0x22, 0xa5, 0x01, 0x0a, 0x10, 0x53, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74,
+ 0x6f, 0x72, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x49, 0x0a, 0x07, 0x63, 0x6f, 0x6e,
+ 0x74, 0x72, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x65, 0x64, 0x75,
+ 0x2e, 0x74, 0x69, 0x67, 0x65, 0x72, 0x73, 0x2e, 0x73, 0x75, 0x6d, 0x61, 0x74, 0x72, 0x61, 0x2e,
+ 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x69, 0x6d, 0x75, 0x6c,
+ 0x61, 0x74, 0x6f, 0x72, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x07, 0x63, 0x6f, 0x6e,
+ 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x46, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02,
+ 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x65, 0x64, 0x75, 0x2e, 0x74, 0x69, 0x67, 0x65, 0x72,
+ 0x73, 0x2e, 0x73, 0x75, 0x6d, 0x61, 0x74, 0x72, 0x61, 0x2e, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x43, 0x6f,
+ 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x5a, 0x0a, 0x11,
+ 0x53, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+ 0x65, 0x12, 0x45, 0x0a, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28,
+ 0x0b, 0x32, 0x2d, 0x2e, 0x65, 0x64, 0x75, 0x2e, 0x74, 0x69, 0x67, 0x65, 0x72, 0x73, 0x2e, 0x73,
+ 0x75, 0x6d, 0x61, 0x74, 0x72, 0x61, 0x2e, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x2e, 0x53, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x45, 0x72, 0x72, 0x6f, 0x72,
+ 0x52, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x42, 0x42, 0x5a, 0x40, 0x67, 0x69, 0x74, 0x68,
+ 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x52, 0x6f, 0x62, 0x6f, 0x43, 0x75, 0x70, 0x2d, 0x53,
+ 0x53, 0x4c, 0x2f, 0x73, 0x73, 0x6c, 0x2d, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2f, 0x69, 0x6e, 0x74,
+ 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x73, 0x69, 0x6d, 0x63, 0x74, 0x6c,
+}
+
+var (
+ file_ssl_simulation_control_proto_rawDescOnce sync.Once
+ file_ssl_simulation_control_proto_rawDescData = file_ssl_simulation_control_proto_rawDesc
+)
+
+func file_ssl_simulation_control_proto_rawDescGZIP() []byte {
+ file_ssl_simulation_control_proto_rawDescOnce.Do(func() {
+ file_ssl_simulation_control_proto_rawDescData = protoimpl.X.CompressGZIP(file_ssl_simulation_control_proto_rawDescData)
+ })
+ return file_ssl_simulation_control_proto_rawDescData
+}
+
+var file_ssl_simulation_control_proto_msgTypes = make([]protoimpl.MessageInfo, 5)
+var file_ssl_simulation_control_proto_goTypes = []interface{}{
+ (*TeleportBall)(nil), // 0: edu.tigers.sumatra.simulation.TeleportBall
+ (*TeleportRobot)(nil), // 1: edu.tigers.sumatra.simulation.TeleportRobot
+ (*SimulatorControl)(nil), // 2: edu.tigers.sumatra.simulation.SimulatorControl
+ (*SimulatorCommand)(nil), // 3: edu.tigers.sumatra.simulation.SimulatorCommand
+ (*SimulatorResponse)(nil), // 4: edu.tigers.sumatra.simulation.SimulatorResponse
+ (*referee.RobotId)(nil), // 5: RobotId
+ (*SimulatorConfig)(nil), // 6: edu.tigers.sumatra.simulation.SimulatorConfig
+ (*SimulatorError)(nil), // 7: edu.tigers.sumatra.simulation.SimulatorError
+}
+var file_ssl_simulation_control_proto_depIdxs = []int32{
+ 5, // 0: edu.tigers.sumatra.simulation.TeleportRobot.id:type_name -> RobotId
+ 0, // 1: edu.tigers.sumatra.simulation.SimulatorControl.teleport_ball:type_name -> edu.tigers.sumatra.simulation.TeleportBall
+ 1, // 2: edu.tigers.sumatra.simulation.SimulatorControl.teleport_robot:type_name -> edu.tigers.sumatra.simulation.TeleportRobot
+ 2, // 3: edu.tigers.sumatra.simulation.SimulatorCommand.control:type_name -> edu.tigers.sumatra.simulation.SimulatorControl
+ 6, // 4: edu.tigers.sumatra.simulation.SimulatorCommand.config:type_name -> edu.tigers.sumatra.simulation.SimulatorConfig
+ 7, // 5: edu.tigers.sumatra.simulation.SimulatorResponse.errors:type_name -> edu.tigers.sumatra.simulation.SimulatorError
+ 6, // [6:6] is the sub-list for method output_type
+ 6, // [6:6] is the sub-list for method input_type
+ 6, // [6:6] is the sub-list for extension type_name
+ 6, // [6:6] is the sub-list for extension extendee
+ 0, // [0:6] is the sub-list for field type_name
+}
+
+func init() { file_ssl_simulation_control_proto_init() }
+func file_ssl_simulation_control_proto_init() {
+ if File_ssl_simulation_control_proto != nil {
+ return
+ }
+ file_ssl_simulation_config_proto_init()
+ file_ssl_simulation_error_proto_init()
+ if !protoimpl.UnsafeEnabled {
+ file_ssl_simulation_control_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*TeleportBall); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_simulation_control_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*TeleportRobot); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_simulation_control_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*SimulatorControl); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_simulation_control_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*SimulatorCommand); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_simulation_control_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*SimulatorResponse); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ }
+ type x struct{}
+ out := protoimpl.TypeBuilder{
+ File: protoimpl.DescBuilder{
+ GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+ RawDescriptor: file_ssl_simulation_control_proto_rawDesc,
+ NumEnums: 0,
+ NumMessages: 5,
+ NumExtensions: 0,
+ NumServices: 0,
+ },
+ GoTypes: file_ssl_simulation_control_proto_goTypes,
+ DependencyIndexes: file_ssl_simulation_control_proto_depIdxs,
+ MessageInfos: file_ssl_simulation_control_proto_msgTypes,
+ }.Build()
+ File_ssl_simulation_control_proto = out.File
+ file_ssl_simulation_control_proto_rawDesc = nil
+ file_ssl_simulation_control_proto_goTypes = nil
+ file_ssl_simulation_control_proto_depIdxs = nil
+}
diff --git a/internal/simctl/ssl_simulation_error.pb.go b/internal/simctl/ssl_simulation_error.pb.go
new file mode 100644
index 0000000..da2f903
--- /dev/null
+++ b/internal/simctl/ssl_simulation_error.pb.go
@@ -0,0 +1,164 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// protoc-gen-go v1.25.0
+// protoc v3.12.4
+// source: ssl_simulation_error.proto
+
+package simctl
+
+import (
+ proto "github.com/golang/protobuf/proto"
+ protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+ protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+ reflect "reflect"
+ sync "sync"
+)
+
+const (
+ // Verify that this generated code is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+ // Verify that runtime/protoimpl is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
+
+// Errors in the simulator
+type SimulatorError struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // Unique code of the error for automatic handling on client side
+ Code *string `protobuf:"bytes,1,opt,name=code" json:"code,omitempty"`
+ // Human readable description of the error
+ Message *string `protobuf:"bytes,2,opt,name=message" json:"message,omitempty"`
+}
+
+func (x *SimulatorError) Reset() {
+ *x = SimulatorError{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_simulation_error_proto_msgTypes[0]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *SimulatorError) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SimulatorError) ProtoMessage() {}
+
+func (x *SimulatorError) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_simulation_error_proto_msgTypes[0]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use SimulatorError.ProtoReflect.Descriptor instead.
+func (*SimulatorError) Descriptor() ([]byte, []int) {
+ return file_ssl_simulation_error_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *SimulatorError) GetCode() string {
+ if x != nil && x.Code != nil {
+ return *x.Code
+ }
+ return ""
+}
+
+func (x *SimulatorError) GetMessage() string {
+ if x != nil && x.Message != nil {
+ return *x.Message
+ }
+ return ""
+}
+
+var File_ssl_simulation_error_proto protoreflect.FileDescriptor
+
+var file_ssl_simulation_error_proto_rawDesc = []byte{
+ 0x0a, 0x1a, 0x73, 0x73, 0x6c, 0x5f, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1d, 0x65, 0x64,
+ 0x75, 0x2e, 0x74, 0x69, 0x67, 0x65, 0x72, 0x73, 0x2e, 0x73, 0x75, 0x6d, 0x61, 0x74, 0x72, 0x61,
+ 0x2e, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3e, 0x0a, 0x0e, 0x53,
+ 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x12, 0x0a,
+ 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64,
+ 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01,
+ 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x42, 0x5a, 0x40, 0x67,
+ 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x52, 0x6f, 0x62, 0x6f, 0x43, 0x75,
+ 0x70, 0x2d, 0x53, 0x53, 0x4c, 0x2f, 0x73, 0x73, 0x6c, 0x2d, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2f,
+ 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x73, 0x69, 0x6d, 0x63, 0x74, 0x6c,
+}
+
+var (
+ file_ssl_simulation_error_proto_rawDescOnce sync.Once
+ file_ssl_simulation_error_proto_rawDescData = file_ssl_simulation_error_proto_rawDesc
+)
+
+func file_ssl_simulation_error_proto_rawDescGZIP() []byte {
+ file_ssl_simulation_error_proto_rawDescOnce.Do(func() {
+ file_ssl_simulation_error_proto_rawDescData = protoimpl.X.CompressGZIP(file_ssl_simulation_error_proto_rawDescData)
+ })
+ return file_ssl_simulation_error_proto_rawDescData
+}
+
+var file_ssl_simulation_error_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
+var file_ssl_simulation_error_proto_goTypes = []interface{}{
+ (*SimulatorError)(nil), // 0: edu.tigers.sumatra.simulation.SimulatorError
+}
+var file_ssl_simulation_error_proto_depIdxs = []int32{
+ 0, // [0:0] is the sub-list for method output_type
+ 0, // [0:0] is the sub-list for method input_type
+ 0, // [0:0] is the sub-list for extension type_name
+ 0, // [0:0] is the sub-list for extension extendee
+ 0, // [0:0] is the sub-list for field type_name
+}
+
+func init() { file_ssl_simulation_error_proto_init() }
+func file_ssl_simulation_error_proto_init() {
+ if File_ssl_simulation_error_proto != nil {
+ return
+ }
+ if !protoimpl.UnsafeEnabled {
+ file_ssl_simulation_error_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*SimulatorError); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ }
+ type x struct{}
+ out := protoimpl.TypeBuilder{
+ File: protoimpl.DescBuilder{
+ GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+ RawDescriptor: file_ssl_simulation_error_proto_rawDesc,
+ NumEnums: 0,
+ NumMessages: 1,
+ NumExtensions: 0,
+ NumServices: 0,
+ },
+ GoTypes: file_ssl_simulation_error_proto_goTypes,
+ DependencyIndexes: file_ssl_simulation_error_proto_depIdxs,
+ MessageInfos: file_ssl_simulation_error_proto_msgTypes,
+ }.Build()
+ File_ssl_simulation_error_proto = out.File
+ file_ssl_simulation_error_proto_rawDesc = nil
+ file_ssl_simulation_error_proto_goTypes = nil
+ file_ssl_simulation_error_proto_depIdxs = nil
+}
diff --git a/internal/sslnet/multicast_server.go b/internal/sslnet/multicast_server.go
new file mode 100644
index 0000000..3e6e92c
--- /dev/null
+++ b/internal/sslnet/multicast_server.go
@@ -0,0 +1,141 @@
+package sslnet
+
+import (
+ "log"
+ "net"
+ "sync"
+ "time"
+)
+
+const maxDatagramSize = 8192
+
+type MulticastServer struct {
+ multicastAddress string
+ connection *net.UDPConn
+ running bool
+ consumer func([]byte, *net.UDPAddr)
+ mutex sync.Mutex
+ SkipInterfaces []string
+ Verbose bool
+}
+
+func NewMulticastServer(multicastAddress string, consumer func([]byte, *net.UDPAddr)) (r *MulticastServer) {
+ r = new(MulticastServer)
+ r.multicastAddress = multicastAddress
+ r.consumer = consumer
+ return
+}
+
+func (r *MulticastServer) Start() {
+ r.running = true
+ go r.receive(r.multicastAddress)
+}
+
+func (r *MulticastServer) Stop() {
+ r.mutex.Lock()
+ defer r.mutex.Unlock()
+ r.running = false
+ if err := r.connection.Close(); err != nil {
+ log.Println("Could not close connection: ", err)
+ }
+}
+
+func (r *MulticastServer) receive(multicastAddress string) {
+ log.Printf("Receiving multicast traffic on %v", multicastAddress)
+ var currentIfiIdx = 0
+ for r.isRunning() {
+ ifis := r.interfaces()
+ currentIfiIdx = currentIfiIdx % len(ifis)
+ ifi := ifis[currentIfiIdx]
+ r.receiveOnInterface(multicastAddress, ifi)
+ currentIfiIdx++
+ if currentIfiIdx >= len(ifis) {
+ // cycled though all interfaces once, make a short break to avoid producing endless log messages
+ time.Sleep(1 * time.Second)
+ }
+ }
+}
+
+func (r *MulticastServer) isRunning() bool {
+ r.mutex.Lock()
+ defer r.mutex.Unlock()
+ return r.running
+}
+
+func (r *MulticastServer) interfaces() (interfaces []net.Interface) {
+ interfaces = []net.Interface{}
+ ifis, err := net.Interfaces()
+ if err != nil {
+ log.Println("Could not get available interfaces: ", err)
+ }
+ for _, ifi := range ifis {
+ if ifi.Flags&net.FlagMulticast == 0 || // No multicast support
+ r.skipInterface(ifi.Name) {
+ continue
+ }
+ interfaces = append(interfaces, ifi)
+ }
+ return
+}
+
+func (r *MulticastServer) skipInterface(ifiName string) bool {
+ for _, skipIfi := range r.SkipInterfaces {
+ if skipIfi == ifiName {
+ return true
+ }
+ }
+ return false
+}
+
+func (r *MulticastServer) receiveOnInterface(multicastAddress string, ifi net.Interface) {
+ addr, err := net.ResolveUDPAddr("udp", multicastAddress)
+ if err != nil {
+ log.Printf("Could resolve multicast address %v: %v", multicastAddress, err)
+ return
+ }
+
+ r.connection, err = net.ListenMulticastUDP("udp", &ifi, addr)
+ if err != nil {
+ log.Printf("Could not listen at %v: %v", multicastAddress, err)
+ return
+ }
+
+ if err := r.connection.SetReadBuffer(maxDatagramSize); err != nil {
+ log.Println("Could not set read buffer: ", err)
+ }
+
+ if r.Verbose {
+ log.Printf("Listening on %s (%s)", multicastAddress, ifi.Name)
+ }
+
+ first := true
+ data := make([]byte, maxDatagramSize)
+ for {
+ if err := r.connection.SetDeadline(time.Now().Add(300 * time.Millisecond)); err != nil {
+ log.Println("Could not set deadline on connection: ", err)
+ }
+ n, remoteAddr, err := r.connection.ReadFromUDP(data)
+ if err != nil {
+ if r.Verbose {
+ log.Println("ReadFromUDP failed:", err)
+ }
+ break
+ }
+
+ if first {
+ log.Printf("Got first data packets from %s (%s)", multicastAddress, ifi.Name)
+ first = false
+ }
+
+ r.consumer(data[:n], remoteAddr)
+ }
+
+ if r.Verbose {
+ log.Printf("Stop listening on %s (%s)", multicastAddress, ifi.Name)
+ }
+
+ if err := r.connection.Close(); err != nil {
+ log.Println("Could not close listener: ", err)
+ }
+ return
+}
diff --git a/internal/sslnet/udp_client.go b/internal/sslnet/udp_client.go
new file mode 100644
index 0000000..b8f8372
--- /dev/null
+++ b/internal/sslnet/udp_client.go
@@ -0,0 +1,125 @@
+package sslnet
+
+import (
+ "log"
+ "net"
+ "sync"
+)
+
+// UdpClient establishes a UDP connection to a server
+type UdpClient struct {
+ Name string
+ Consumer func([]byte)
+ address string
+ conns []*net.UDPConn
+ running bool
+ mutex sync.Mutex
+ receivers sync.WaitGroup
+}
+
+// NewUdpClient creates a new UDP client
+func NewUdpClient(address string) (t *UdpClient) {
+ t = new(UdpClient)
+ t.Name = "UdpClient"
+ t.address = address
+ t.Consumer = func([]byte) {}
+ return
+}
+
+// Start the client by listening for responses it a separate goroutine
+func (c *UdpClient) Start() {
+ c.mutex.Lock()
+ defer c.mutex.Unlock()
+ if !c.running {
+ log.Printf("%v - Starting", c.Name)
+ c.running = true
+ c.connect()
+ log.Printf("%v - Started", c.Name)
+ }
+}
+
+// Stop the client by stop listening for responses and closing all existing connections
+func (c *UdpClient) Stop() {
+ c.mutex.Lock()
+ defer c.mutex.Unlock()
+ if c.running {
+ log.Printf("%v - Stopping", c.Name)
+ c.running = false
+ for _, conn := range c.conns {
+ if err := conn.Close(); err != nil {
+ log.Printf("%v - Could not close client connection: %v", c.Name, err)
+ }
+ }
+ c.receivers.Wait()
+ c.conns = []*net.UDPConn{}
+ log.Printf("%v - Stopped", c.Name)
+ }
+}
+
+// Send data to the server
+func (c *UdpClient) Send(data []byte) {
+ c.mutex.Lock()
+ defer c.mutex.Unlock()
+ for _, conn := range c.conns {
+ if _, err := conn.Write(data); err != nil {
+ log.Printf("%v - Could not write to %s at %s: %s", c.Name, conn.RemoteAddr(), conn.LocalAddr(), err)
+ }
+ }
+}
+
+func (c *UdpClient) connect() {
+ log.Printf("%v - Connecting to %v", c.Name, c.address)
+ addr, err := net.ResolveUDPAddr("udp", c.address)
+ if err != nil {
+ log.Printf("%v - Could resolve address %v: %v", c.Name, c.address, err)
+ return
+ }
+
+ iaddrs, err := net.InterfaceAddrs()
+ if err != nil {
+ log.Printf("%v - Could not retrieve interface addresses: %v", c.Name, err)
+ return
+ }
+
+ for _, iaddr := range iaddrs {
+ ip := iaddr.(*net.IPNet).IP
+ if ip.To4() == nil {
+ // Ignore IPv6 for now
+ continue
+ }
+ laddr := &net.UDPAddr{IP: ip}
+ conn, err := net.DialUDP("udp", laddr, addr)
+ if err != nil {
+ log.Printf("%v - Could not connect to %v at %v: %v", c.Name, addr, laddr, err)
+ continue
+ }
+
+ if err := conn.SetWriteBuffer(maxDatagramSize); err != nil {
+ log.Printf("%v - Could not set read buffer: %v", c.Name, err)
+ }
+
+ c.conns = append(c.conns, conn)
+ go c.receive(conn)
+ }
+}
+
+func (c *UdpClient) receive(conn *net.UDPConn) {
+ log.Printf("%v - Connected to %s at %s", c.Name, conn.RemoteAddr(), conn.LocalAddr())
+ defer log.Printf("%v - Disconnected from %s at %s", c.Name, conn.RemoteAddr(), conn.LocalAddr())
+
+ c.receivers.Add(1)
+ defer c.receivers.Done()
+
+ data := make([]byte, maxDatagramSize)
+ for {
+ n, _, err := conn.ReadFrom(data)
+ if err != nil {
+ if opErr, ok := err.(*net.OpError); !ok || opErr.Err.Error() != "use of closed network connection" {
+ log.Printf("%v - Could not receive data from %s at %s: %s", c.Name, conn.RemoteAddr(), conn.LocalAddr(), err)
+ }
+ return
+ } else {
+ c.Consumer(data[:n])
+ }
+ }
+}
diff --git a/internal/tracker/ssl_vision_detection_tracked.pb.go b/internal/tracker/ssl_vision_detection_tracked.pb.go
new file mode 100644
index 0000000..348b311
--- /dev/null
+++ b/internal/tracker/ssl_vision_detection_tracked.pb.go
@@ -0,0 +1,641 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// protoc-gen-go v1.25.0
+// protoc v3.12.4
+// source: ssl_vision_detection_tracked.proto
+
+package tracker
+
+import (
+ geom "github.com/RoboCup-SSL/ssl-simulation-controller/internal/geom"
+ referee "github.com/RoboCup-SSL/ssl-simulation-controller/internal/referee"
+ proto "github.com/golang/protobuf/proto"
+ protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+ protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+ reflect "reflect"
+ sync "sync"
+)
+
+const (
+ // Verify that this generated code is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+ // Verify that runtime/protoimpl is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
+
+// Capabilities that a source implementation can have
+type Capability int32
+
+const (
+ Capability_CAPABILITY_UNKNOWN Capability = 0
+ Capability_CAPABILITY_DETECT_FLYING_BALLS Capability = 1
+ Capability_CAPABILITY_DETECT_MULTIPLE_BALLS Capability = 2
+ Capability_CAPABILITY_DETECT_KICKED_BALLS Capability = 3
+)
+
+// Enum value maps for Capability.
+var (
+ Capability_name = map[int32]string{
+ 0: "CAPABILITY_UNKNOWN",
+ 1: "CAPABILITY_DETECT_FLYING_BALLS",
+ 2: "CAPABILITY_DETECT_MULTIPLE_BALLS",
+ 3: "CAPABILITY_DETECT_KICKED_BALLS",
+ }
+ Capability_value = map[string]int32{
+ "CAPABILITY_UNKNOWN": 0,
+ "CAPABILITY_DETECT_FLYING_BALLS": 1,
+ "CAPABILITY_DETECT_MULTIPLE_BALLS": 2,
+ "CAPABILITY_DETECT_KICKED_BALLS": 3,
+ }
+)
+
+func (x Capability) Enum() *Capability {
+ p := new(Capability)
+ *p = x
+ return p
+}
+
+func (x Capability) String() string {
+ return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (Capability) Descriptor() protoreflect.EnumDescriptor {
+ return file_ssl_vision_detection_tracked_proto_enumTypes[0].Descriptor()
+}
+
+func (Capability) Type() protoreflect.EnumType {
+ return &file_ssl_vision_detection_tracked_proto_enumTypes[0]
+}
+
+func (x Capability) Number() protoreflect.EnumNumber {
+ return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Do not use.
+func (x *Capability) UnmarshalJSON(b []byte) error {
+ num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b)
+ if err != nil {
+ return err
+ }
+ *x = Capability(num)
+ return nil
+}
+
+// Deprecated: Use Capability.Descriptor instead.
+func (Capability) EnumDescriptor() ([]byte, []int) {
+ return file_ssl_vision_detection_tracked_proto_rawDescGZIP(), []int{0}
+}
+
+// A single tracked ball
+type TrackedBall struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // The position (x, y, height) [m] in the ssl-vision coordinate system
+ Pos *geom.Vector3 `protobuf:"bytes,1,req,name=pos" json:"pos,omitempty"`
+ // The velocity [m/s] in the ssl-vision coordinate system
+ Vel *geom.Vector3 `protobuf:"bytes,2,opt,name=vel" json:"vel,omitempty"`
+ // The visibility of the ball
+ // A value between 0 (not visible) and 1 (visible)
+ // The exact implementation depends on the source software
+ Visibility *float32 `protobuf:"fixed32,3,opt,name=visibility" json:"visibility,omitempty"`
+}
+
+func (x *TrackedBall) Reset() {
+ *x = TrackedBall{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_vision_detection_tracked_proto_msgTypes[0]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *TrackedBall) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*TrackedBall) ProtoMessage() {}
+
+func (x *TrackedBall) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_vision_detection_tracked_proto_msgTypes[0]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use TrackedBall.ProtoReflect.Descriptor instead.
+func (*TrackedBall) Descriptor() ([]byte, []int) {
+ return file_ssl_vision_detection_tracked_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *TrackedBall) GetPos() *geom.Vector3 {
+ if x != nil {
+ return x.Pos
+ }
+ return nil
+}
+
+func (x *TrackedBall) GetVel() *geom.Vector3 {
+ if x != nil {
+ return x.Vel
+ }
+ return nil
+}
+
+func (x *TrackedBall) GetVisibility() float32 {
+ if x != nil && x.Visibility != nil {
+ return *x.Visibility
+ }
+ return 0
+}
+
+// A ball kicked by a robot, including predictions when the ball will come to a stop
+type KickedBall struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // The initial position [m] from which the ball was kicked
+ Pos *geom.Vector2 `protobuf:"bytes,1,req,name=pos" json:"pos,omitempty"`
+ // The initial velocity [m/s] with which the ball was kicked
+ Vel *geom.Vector3 `protobuf:"bytes,2,req,name=vel" json:"vel,omitempty"`
+ // The unix timestamp [s] when the kick was performed
+ StartTimestamp *float64 `protobuf:"fixed64,3,req,name=start_timestamp,json=startTimestamp" json:"start_timestamp,omitempty"`
+ // The predicted unix timestamp [s] when the ball comes to a stop
+ StopTimestamp *float64 `protobuf:"fixed64,4,opt,name=stop_timestamp,json=stopTimestamp" json:"stop_timestamp,omitempty"`
+ // The predicted position [m] at which the ball will come to a stop
+ StopPos *geom.Vector2 `protobuf:"bytes,5,opt,name=stop_pos,json=stopPos" json:"stop_pos,omitempty"`
+ // The robot that kicked the ball
+ RobotId *referee.RobotId `protobuf:"bytes,6,opt,name=robot_id,json=robotId" json:"robot_id,omitempty"`
+}
+
+func (x *KickedBall) Reset() {
+ *x = KickedBall{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_vision_detection_tracked_proto_msgTypes[1]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *KickedBall) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*KickedBall) ProtoMessage() {}
+
+func (x *KickedBall) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_vision_detection_tracked_proto_msgTypes[1]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use KickedBall.ProtoReflect.Descriptor instead.
+func (*KickedBall) Descriptor() ([]byte, []int) {
+ return file_ssl_vision_detection_tracked_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *KickedBall) GetPos() *geom.Vector2 {
+ if x != nil {
+ return x.Pos
+ }
+ return nil
+}
+
+func (x *KickedBall) GetVel() *geom.Vector3 {
+ if x != nil {
+ return x.Vel
+ }
+ return nil
+}
+
+func (x *KickedBall) GetStartTimestamp() float64 {
+ if x != nil && x.StartTimestamp != nil {
+ return *x.StartTimestamp
+ }
+ return 0
+}
+
+func (x *KickedBall) GetStopTimestamp() float64 {
+ if x != nil && x.StopTimestamp != nil {
+ return *x.StopTimestamp
+ }
+ return 0
+}
+
+func (x *KickedBall) GetStopPos() *geom.Vector2 {
+ if x != nil {
+ return x.StopPos
+ }
+ return nil
+}
+
+func (x *KickedBall) GetRobotId() *referee.RobotId {
+ if x != nil {
+ return x.RobotId
+ }
+ return nil
+}
+
+// A single tracked robot
+type TrackedRobot struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ RobotId *referee.RobotId `protobuf:"bytes,1,req,name=robot_id,json=robotId" json:"robot_id,omitempty"`
+ // The position [m] in the ssl-vision coordinate system
+ Pos *geom.Vector2 `protobuf:"bytes,2,req,name=pos" json:"pos,omitempty"`
+ // The orientation [rad] in the ssl-vision coordinate system
+ Orientation *float32 `protobuf:"fixed32,3,req,name=orientation" json:"orientation,omitempty"`
+ // The velocity [m/s] in the ssl-vision coordinate system
+ Vel *geom.Vector2 `protobuf:"bytes,4,opt,name=vel" json:"vel,omitempty"`
+ // The angular velocity [rad/s] in the ssl-vision coordinate system
+ VelAngular *float32 `protobuf:"fixed32,5,opt,name=vel_angular,json=velAngular" json:"vel_angular,omitempty"`
+ // The visibility of the robot
+ // A value between 0 (not visible) and 1 (visible)
+ // The exact implementation depends on the source software
+ Visibility *float32 `protobuf:"fixed32,6,opt,name=visibility" json:"visibility,omitempty"`
+}
+
+func (x *TrackedRobot) Reset() {
+ *x = TrackedRobot{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_vision_detection_tracked_proto_msgTypes[2]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *TrackedRobot) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*TrackedRobot) ProtoMessage() {}
+
+func (x *TrackedRobot) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_vision_detection_tracked_proto_msgTypes[2]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use TrackedRobot.ProtoReflect.Descriptor instead.
+func (*TrackedRobot) Descriptor() ([]byte, []int) {
+ return file_ssl_vision_detection_tracked_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *TrackedRobot) GetRobotId() *referee.RobotId {
+ if x != nil {
+ return x.RobotId
+ }
+ return nil
+}
+
+func (x *TrackedRobot) GetPos() *geom.Vector2 {
+ if x != nil {
+ return x.Pos
+ }
+ return nil
+}
+
+func (x *TrackedRobot) GetOrientation() float32 {
+ if x != nil && x.Orientation != nil {
+ return *x.Orientation
+ }
+ return 0
+}
+
+func (x *TrackedRobot) GetVel() *geom.Vector2 {
+ if x != nil {
+ return x.Vel
+ }
+ return nil
+}
+
+func (x *TrackedRobot) GetVelAngular() float32 {
+ if x != nil && x.VelAngular != nil {
+ return *x.VelAngular
+ }
+ return 0
+}
+
+func (x *TrackedRobot) GetVisibility() float32 {
+ if x != nil && x.Visibility != nil {
+ return *x.Visibility
+ }
+ return 0
+}
+
+// A frame that contains all currently tracked objects on the field on all cameras
+type TrackedFrame struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // A monotonous increasing frame counter
+ FrameNumber *uint32 `protobuf:"varint,1,req,name=frame_number,json=frameNumber" json:"frame_number,omitempty"`
+ // The unix timestamp in [s] of the data
+ // If timestamp is larger than timestamp_captured, the source has applied a prediction already
+ Timestamp *float64 `protobuf:"fixed64,2,req,name=timestamp" json:"timestamp,omitempty"`
+ // The list of detected balls
+ // The first ball is the primary one
+ // Sources may add additional balls based on their capabilities
+ Balls []*TrackedBall `protobuf:"bytes,3,rep,name=balls" json:"balls,omitempty"`
+ // The list of detected robots of both teams
+ Robots []*TrackedRobot `protobuf:"bytes,4,rep,name=robots" json:"robots,omitempty"`
+ // Information about a kicked ball, if the ball was kicked by a robot and is still moving
+ // Note: This field is optional. Some source implementations might not set this at any time
+ KickedBall *KickedBall `protobuf:"bytes,5,opt,name=kicked_ball,json=kickedBall" json:"kicked_ball,omitempty"`
+ // List of capabilities of the source implementation
+ Capabilities []Capability `protobuf:"varint,6,rep,name=capabilities,enum=Capability" json:"capabilities,omitempty"`
+}
+
+func (x *TrackedFrame) Reset() {
+ *x = TrackedFrame{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_vision_detection_tracked_proto_msgTypes[3]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *TrackedFrame) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*TrackedFrame) ProtoMessage() {}
+
+func (x *TrackedFrame) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_vision_detection_tracked_proto_msgTypes[3]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use TrackedFrame.ProtoReflect.Descriptor instead.
+func (*TrackedFrame) Descriptor() ([]byte, []int) {
+ return file_ssl_vision_detection_tracked_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *TrackedFrame) GetFrameNumber() uint32 {
+ if x != nil && x.FrameNumber != nil {
+ return *x.FrameNumber
+ }
+ return 0
+}
+
+func (x *TrackedFrame) GetTimestamp() float64 {
+ if x != nil && x.Timestamp != nil {
+ return *x.Timestamp
+ }
+ return 0
+}
+
+func (x *TrackedFrame) GetBalls() []*TrackedBall {
+ if x != nil {
+ return x.Balls
+ }
+ return nil
+}
+
+func (x *TrackedFrame) GetRobots() []*TrackedRobot {
+ if x != nil {
+ return x.Robots
+ }
+ return nil
+}
+
+func (x *TrackedFrame) GetKickedBall() *KickedBall {
+ if x != nil {
+ return x.KickedBall
+ }
+ return nil
+}
+
+func (x *TrackedFrame) GetCapabilities() []Capability {
+ if x != nil {
+ return x.Capabilities
+ }
+ return nil
+}
+
+var File_ssl_vision_detection_tracked_proto protoreflect.FileDescriptor
+
+var file_ssl_vision_detection_tracked_proto_rawDesc = []byte{
+ 0x0a, 0x22, 0x73, 0x73, 0x6c, 0x5f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x65, 0x74,
+ 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x2e, 0x70,
+ 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x13, 0x73, 0x73, 0x6c, 0x5f, 0x67, 0x63, 0x5f, 0x63, 0x6f, 0x6d,
+ 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x73, 0x73, 0x6c, 0x5f, 0x67,
+ 0x63, 0x5f, 0x67, 0x65, 0x6f, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+ 0x22, 0x65, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x42, 0x61, 0x6c, 0x6c, 0x12,
+ 0x1a, 0x0a, 0x03, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x56,
+ 0x65, 0x63, 0x74, 0x6f, 0x72, 0x33, 0x52, 0x03, 0x70, 0x6f, 0x73, 0x12, 0x1a, 0x0a, 0x03, 0x76,
+ 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f,
+ 0x72, 0x33, 0x52, 0x03, 0x76, 0x65, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x76, 0x69, 0x73, 0x69, 0x62,
+ 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0a, 0x76, 0x69, 0x73,
+ 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x22, 0xde, 0x01, 0x0a, 0x0a, 0x4b, 0x69, 0x63, 0x6b,
+ 0x65, 0x64, 0x42, 0x61, 0x6c, 0x6c, 0x12, 0x1a, 0x0a, 0x03, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20,
+ 0x02, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x52, 0x03, 0x70,
+ 0x6f, 0x73, 0x12, 0x1a, 0x0a, 0x03, 0x76, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x02, 0x28, 0x0b, 0x32,
+ 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x33, 0x52, 0x03, 0x76, 0x65, 0x6c, 0x12, 0x27,
+ 0x0a, 0x0f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d,
+ 0x70, 0x18, 0x03, 0x20, 0x02, 0x28, 0x01, 0x52, 0x0e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69,
+ 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x74, 0x6f, 0x70, 0x5f,
+ 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52,
+ 0x0d, 0x73, 0x74, 0x6f, 0x70, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x23,
+ 0x0a, 0x08, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x70, 0x6f, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b,
+ 0x32, 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x52, 0x07, 0x73, 0x74, 0x6f, 0x70,
+ 0x50, 0x6f, 0x73, 0x12, 0x23, 0x0a, 0x08, 0x72, 0x6f, 0x62, 0x6f, 0x74, 0x5f, 0x69, 0x64, 0x18,
+ 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x52, 0x6f, 0x62, 0x6f, 0x74, 0x49, 0x64, 0x52,
+ 0x07, 0x72, 0x6f, 0x62, 0x6f, 0x74, 0x49, 0x64, 0x22, 0xce, 0x01, 0x0a, 0x0c, 0x54, 0x72, 0x61,
+ 0x63, 0x6b, 0x65, 0x64, 0x52, 0x6f, 0x62, 0x6f, 0x74, 0x12, 0x23, 0x0a, 0x08, 0x72, 0x6f, 0x62,
+ 0x6f, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x52, 0x6f,
+ 0x62, 0x6f, 0x74, 0x49, 0x64, 0x52, 0x07, 0x72, 0x6f, 0x62, 0x6f, 0x74, 0x49, 0x64, 0x12, 0x1a,
+ 0x0a, 0x03, 0x70, 0x6f, 0x73, 0x18, 0x02, 0x20, 0x02, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65,
+ 0x63, 0x74, 0x6f, 0x72, 0x32, 0x52, 0x03, 0x70, 0x6f, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x6f, 0x72,
+ 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x02, 0x28, 0x02, 0x52,
+ 0x0b, 0x6f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x03,
+ 0x76, 0x65, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74,
+ 0x6f, 0x72, 0x32, 0x52, 0x03, 0x76, 0x65, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x76, 0x65, 0x6c, 0x5f,
+ 0x61, 0x6e, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0a, 0x76,
+ 0x65, 0x6c, 0x41, 0x6e, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x76, 0x69, 0x73,
+ 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0a, 0x76,
+ 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x22, 0xf9, 0x01, 0x0a, 0x0c, 0x54, 0x72,
+ 0x61, 0x63, 0x6b, 0x65, 0x64, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x72,
+ 0x61, 0x6d, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0d,
+ 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1c, 0x0a,
+ 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x02, 0x28, 0x01,
+ 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x22, 0x0a, 0x05, 0x62,
+ 0x61, 0x6c, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x54, 0x72, 0x61,
+ 0x63, 0x6b, 0x65, 0x64, 0x42, 0x61, 0x6c, 0x6c, 0x52, 0x05, 0x62, 0x61, 0x6c, 0x6c, 0x73, 0x12,
+ 0x25, 0x0a, 0x06, 0x72, 0x6f, 0x62, 0x6f, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32,
+ 0x0d, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x52, 0x6f, 0x62, 0x6f, 0x74, 0x52, 0x06,
+ 0x72, 0x6f, 0x62, 0x6f, 0x74, 0x73, 0x12, 0x2c, 0x0a, 0x0b, 0x6b, 0x69, 0x63, 0x6b, 0x65, 0x64,
+ 0x5f, 0x62, 0x61, 0x6c, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x4b, 0x69,
+ 0x63, 0x6b, 0x65, 0x64, 0x42, 0x61, 0x6c, 0x6c, 0x52, 0x0a, 0x6b, 0x69, 0x63, 0x6b, 0x65, 0x64,
+ 0x42, 0x61, 0x6c, 0x6c, 0x12, 0x2f, 0x0a, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69,
+ 0x74, 0x69, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x0b, 0x2e, 0x43, 0x61, 0x70,
+ 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c,
+ 0x69, 0x74, 0x69, 0x65, 0x73, 0x2a, 0x92, 0x01, 0x0a, 0x0a, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69,
+ 0x6c, 0x69, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x12, 0x43, 0x41, 0x50, 0x41, 0x42, 0x49, 0x4c, 0x49,
+ 0x54, 0x59, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x22, 0x0a, 0x1e,
+ 0x43, 0x41, 0x50, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x44, 0x45, 0x54, 0x45, 0x43,
+ 0x54, 0x5f, 0x46, 0x4c, 0x59, 0x49, 0x4e, 0x47, 0x5f, 0x42, 0x41, 0x4c, 0x4c, 0x53, 0x10, 0x01,
+ 0x12, 0x24, 0x0a, 0x20, 0x43, 0x41, 0x50, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x44,
+ 0x45, 0x54, 0x45, 0x43, 0x54, 0x5f, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x50, 0x4c, 0x45, 0x5f, 0x42,
+ 0x41, 0x4c, 0x4c, 0x53, 0x10, 0x02, 0x12, 0x22, 0x0a, 0x1e, 0x43, 0x41, 0x50, 0x41, 0x42, 0x49,
+ 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x43, 0x4b,
+ 0x45, 0x44, 0x5f, 0x42, 0x41, 0x4c, 0x4c, 0x53, 0x10, 0x03, 0x42, 0x43, 0x5a, 0x41, 0x67, 0x69,
+ 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x52, 0x6f, 0x62, 0x6f, 0x43, 0x75, 0x70,
+ 0x2d, 0x53, 0x53, 0x4c, 0x2f, 0x73, 0x73, 0x6c, 0x2d, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2f, 0x69,
+ 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x72,
+}
+
+var (
+ file_ssl_vision_detection_tracked_proto_rawDescOnce sync.Once
+ file_ssl_vision_detection_tracked_proto_rawDescData = file_ssl_vision_detection_tracked_proto_rawDesc
+)
+
+func file_ssl_vision_detection_tracked_proto_rawDescGZIP() []byte {
+ file_ssl_vision_detection_tracked_proto_rawDescOnce.Do(func() {
+ file_ssl_vision_detection_tracked_proto_rawDescData = protoimpl.X.CompressGZIP(file_ssl_vision_detection_tracked_proto_rawDescData)
+ })
+ return file_ssl_vision_detection_tracked_proto_rawDescData
+}
+
+var file_ssl_vision_detection_tracked_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
+var file_ssl_vision_detection_tracked_proto_msgTypes = make([]protoimpl.MessageInfo, 4)
+var file_ssl_vision_detection_tracked_proto_goTypes = []interface{}{
+ (Capability)(0), // 0: Capability
+ (*TrackedBall)(nil), // 1: TrackedBall
+ (*KickedBall)(nil), // 2: KickedBall
+ (*TrackedRobot)(nil), // 3: TrackedRobot
+ (*TrackedFrame)(nil), // 4: TrackedFrame
+ (*geom.Vector3)(nil), // 5: Vector3
+ (*geom.Vector2)(nil), // 6: Vector2
+ (*referee.RobotId)(nil), // 7: RobotId
+}
+var file_ssl_vision_detection_tracked_proto_depIdxs = []int32{
+ 5, // 0: TrackedBall.pos:type_name -> Vector3
+ 5, // 1: TrackedBall.vel:type_name -> Vector3
+ 6, // 2: KickedBall.pos:type_name -> Vector2
+ 5, // 3: KickedBall.vel:type_name -> Vector3
+ 6, // 4: KickedBall.stop_pos:type_name -> Vector2
+ 7, // 5: KickedBall.robot_id:type_name -> RobotId
+ 7, // 6: TrackedRobot.robot_id:type_name -> RobotId
+ 6, // 7: TrackedRobot.pos:type_name -> Vector2
+ 6, // 8: TrackedRobot.vel:type_name -> Vector2
+ 1, // 9: TrackedFrame.balls:type_name -> TrackedBall
+ 3, // 10: TrackedFrame.robots:type_name -> TrackedRobot
+ 2, // 11: TrackedFrame.kicked_ball:type_name -> KickedBall
+ 0, // 12: TrackedFrame.capabilities:type_name -> Capability
+ 13, // [13:13] is the sub-list for method output_type
+ 13, // [13:13] is the sub-list for method input_type
+ 13, // [13:13] is the sub-list for extension type_name
+ 13, // [13:13] is the sub-list for extension extendee
+ 0, // [0:13] is the sub-list for field type_name
+}
+
+func init() { file_ssl_vision_detection_tracked_proto_init() }
+func file_ssl_vision_detection_tracked_proto_init() {
+ if File_ssl_vision_detection_tracked_proto != nil {
+ return
+ }
+ if !protoimpl.UnsafeEnabled {
+ file_ssl_vision_detection_tracked_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*TrackedBall); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_vision_detection_tracked_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*KickedBall); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_vision_detection_tracked_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*TrackedRobot); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_vision_detection_tracked_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*TrackedFrame); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ }
+ type x struct{}
+ out := protoimpl.TypeBuilder{
+ File: protoimpl.DescBuilder{
+ GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+ RawDescriptor: file_ssl_vision_detection_tracked_proto_rawDesc,
+ NumEnums: 1,
+ NumMessages: 4,
+ NumExtensions: 0,
+ NumServices: 0,
+ },
+ GoTypes: file_ssl_vision_detection_tracked_proto_goTypes,
+ DependencyIndexes: file_ssl_vision_detection_tracked_proto_depIdxs,
+ EnumInfos: file_ssl_vision_detection_tracked_proto_enumTypes,
+ MessageInfos: file_ssl_vision_detection_tracked_proto_msgTypes,
+ }.Build()
+ File_ssl_vision_detection_tracked_proto = out.File
+ file_ssl_vision_detection_tracked_proto_rawDesc = nil
+ file_ssl_vision_detection_tracked_proto_goTypes = nil
+ file_ssl_vision_detection_tracked_proto_depIdxs = nil
+}
diff --git a/internal/tracker/ssl_vision_wrapper_tracked.pb.go b/internal/tracker/ssl_vision_wrapper_tracked.pb.go
new file mode 100644
index 0000000..2962827
--- /dev/null
+++ b/internal/tracker/ssl_vision_wrapper_tracked.pb.go
@@ -0,0 +1,183 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// protoc-gen-go v1.25.0
+// protoc v3.12.4
+// source: ssl_vision_wrapper_tracked.proto
+
+package tracker
+
+import (
+ proto "github.com/golang/protobuf/proto"
+ protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+ protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+ reflect "reflect"
+ sync "sync"
+)
+
+const (
+ // Verify that this generated code is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+ // Verify that runtime/protoimpl is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
+
+// A wrapper packet containing meta data of the source
+// Also serves for the possibility to extend the protocol later
+type TrackerWrapperPacket struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // A random UUID of the source that is kept constant at the source while running
+ // If multiple sources are broadcasting to the same network, this id can be used to identify individual sources
+ Uuid *string `protobuf:"bytes,1,req,name=uuid" json:"uuid,omitempty"`
+ // The name of the source software that is producing this messages.
+ SourceName *string `protobuf:"bytes,2,opt,name=source_name,json=sourceName" json:"source_name,omitempty"`
+ // The tracked frame
+ TrackedFrame *TrackedFrame `protobuf:"bytes,3,opt,name=tracked_frame,json=trackedFrame" json:"tracked_frame,omitempty"`
+}
+
+func (x *TrackerWrapperPacket) Reset() {
+ *x = TrackerWrapperPacket{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_vision_wrapper_tracked_proto_msgTypes[0]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *TrackerWrapperPacket) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*TrackerWrapperPacket) ProtoMessage() {}
+
+func (x *TrackerWrapperPacket) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_vision_wrapper_tracked_proto_msgTypes[0]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use TrackerWrapperPacket.ProtoReflect.Descriptor instead.
+func (*TrackerWrapperPacket) Descriptor() ([]byte, []int) {
+ return file_ssl_vision_wrapper_tracked_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *TrackerWrapperPacket) GetUuid() string {
+ if x != nil && x.Uuid != nil {
+ return *x.Uuid
+ }
+ return ""
+}
+
+func (x *TrackerWrapperPacket) GetSourceName() string {
+ if x != nil && x.SourceName != nil {
+ return *x.SourceName
+ }
+ return ""
+}
+
+func (x *TrackerWrapperPacket) GetTrackedFrame() *TrackedFrame {
+ if x != nil {
+ return x.TrackedFrame
+ }
+ return nil
+}
+
+var File_ssl_vision_wrapper_tracked_proto protoreflect.FileDescriptor
+
+var file_ssl_vision_wrapper_tracked_proto_rawDesc = []byte{
+ 0x0a, 0x20, 0x73, 0x73, 0x6c, 0x5f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x77, 0x72, 0x61,
+ 0x70, 0x70, 0x65, 0x72, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x2e, 0x70, 0x72, 0x6f,
+ 0x74, 0x6f, 0x1a, 0x22, 0x73, 0x73, 0x6c, 0x5f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x64,
+ 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64,
+ 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x7f, 0x0a, 0x14, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x65,
+ 0x72, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x12,
+ 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x02, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75,
+ 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d,
+ 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e,
+ 0x61, 0x6d, 0x65, 0x12, 0x32, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x66,
+ 0x72, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x54, 0x72, 0x61,
+ 0x63, 0x6b, 0x65, 0x64, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x52, 0x0c, 0x74, 0x72, 0x61, 0x63, 0x6b,
+ 0x65, 0x64, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x42, 0x43, 0x5a, 0x41, 0x67, 0x69, 0x74, 0x68, 0x75,
+ 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x52, 0x6f, 0x62, 0x6f, 0x43, 0x75, 0x70, 0x2d, 0x53, 0x53,
+ 0x4c, 0x2f, 0x73, 0x73, 0x6c, 0x2d, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2f, 0x69, 0x6e, 0x74, 0x65,
+ 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x72,
+}
+
+var (
+ file_ssl_vision_wrapper_tracked_proto_rawDescOnce sync.Once
+ file_ssl_vision_wrapper_tracked_proto_rawDescData = file_ssl_vision_wrapper_tracked_proto_rawDesc
+)
+
+func file_ssl_vision_wrapper_tracked_proto_rawDescGZIP() []byte {
+ file_ssl_vision_wrapper_tracked_proto_rawDescOnce.Do(func() {
+ file_ssl_vision_wrapper_tracked_proto_rawDescData = protoimpl.X.CompressGZIP(file_ssl_vision_wrapper_tracked_proto_rawDescData)
+ })
+ return file_ssl_vision_wrapper_tracked_proto_rawDescData
+}
+
+var file_ssl_vision_wrapper_tracked_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
+var file_ssl_vision_wrapper_tracked_proto_goTypes = []interface{}{
+ (*TrackerWrapperPacket)(nil), // 0: TrackerWrapperPacket
+ (*TrackedFrame)(nil), // 1: TrackedFrame
+}
+var file_ssl_vision_wrapper_tracked_proto_depIdxs = []int32{
+ 1, // 0: TrackerWrapperPacket.tracked_frame:type_name -> TrackedFrame
+ 1, // [1:1] is the sub-list for method output_type
+ 1, // [1:1] is the sub-list for method input_type
+ 1, // [1:1] is the sub-list for extension type_name
+ 1, // [1:1] is the sub-list for extension extendee
+ 0, // [0:1] is the sub-list for field type_name
+}
+
+func init() { file_ssl_vision_wrapper_tracked_proto_init() }
+func file_ssl_vision_wrapper_tracked_proto_init() {
+ if File_ssl_vision_wrapper_tracked_proto != nil {
+ return
+ }
+ file_ssl_vision_detection_tracked_proto_init()
+ if !protoimpl.UnsafeEnabled {
+ file_ssl_vision_wrapper_tracked_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*TrackerWrapperPacket); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ }
+ type x struct{}
+ out := protoimpl.TypeBuilder{
+ File: protoimpl.DescBuilder{
+ GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+ RawDescriptor: file_ssl_vision_wrapper_tracked_proto_rawDesc,
+ NumEnums: 0,
+ NumMessages: 1,
+ NumExtensions: 0,
+ NumServices: 0,
+ },
+ GoTypes: file_ssl_vision_wrapper_tracked_proto_goTypes,
+ DependencyIndexes: file_ssl_vision_wrapper_tracked_proto_depIdxs,
+ MessageInfos: file_ssl_vision_wrapper_tracked_proto_msgTypes,
+ }.Build()
+ File_ssl_vision_wrapper_tracked_proto = out.File
+ file_ssl_vision_wrapper_tracked_proto_rawDesc = nil
+ file_ssl_vision_wrapper_tracked_proto_goTypes = nil
+ file_ssl_vision_wrapper_tracked_proto_depIdxs = nil
+}
diff --git a/internal/vision/ssl_vision_detection.pb.go b/internal/vision/ssl_vision_detection.pb.go
new file mode 100644
index 0000000..d935459
--- /dev/null
+++ b/internal/vision/ssl_vision_detection.pb.go
@@ -0,0 +1,465 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// protoc-gen-go v1.25.0
+// protoc v3.12.4
+// source: ssl_vision_detection.proto
+
+package vision
+
+import (
+ proto "github.com/golang/protobuf/proto"
+ protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+ protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+ reflect "reflect"
+ sync "sync"
+)
+
+const (
+ // Verify that this generated code is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+ // Verify that runtime/protoimpl is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
+
+type SSL_DetectionBall struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Confidence *float32 `protobuf:"fixed32,1,req,name=confidence" json:"confidence,omitempty"`
+ Area *uint32 `protobuf:"varint,2,opt,name=area" json:"area,omitempty"`
+ X *float32 `protobuf:"fixed32,3,req,name=x" json:"x,omitempty"`
+ Y *float32 `protobuf:"fixed32,4,req,name=y" json:"y,omitempty"`
+ Z *float32 `protobuf:"fixed32,5,opt,name=z" json:"z,omitempty"`
+ PixelX *float32 `protobuf:"fixed32,6,req,name=pixel_x,json=pixelX" json:"pixel_x,omitempty"`
+ PixelY *float32 `protobuf:"fixed32,7,req,name=pixel_y,json=pixelY" json:"pixel_y,omitempty"`
+}
+
+func (x *SSL_DetectionBall) Reset() {
+ *x = SSL_DetectionBall{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_vision_detection_proto_msgTypes[0]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *SSL_DetectionBall) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SSL_DetectionBall) ProtoMessage() {}
+
+func (x *SSL_DetectionBall) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_vision_detection_proto_msgTypes[0]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use SSL_DetectionBall.ProtoReflect.Descriptor instead.
+func (*SSL_DetectionBall) Descriptor() ([]byte, []int) {
+ return file_ssl_vision_detection_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *SSL_DetectionBall) GetConfidence() float32 {
+ if x != nil && x.Confidence != nil {
+ return *x.Confidence
+ }
+ return 0
+}
+
+func (x *SSL_DetectionBall) GetArea() uint32 {
+ if x != nil && x.Area != nil {
+ return *x.Area
+ }
+ return 0
+}
+
+func (x *SSL_DetectionBall) GetX() float32 {
+ if x != nil && x.X != nil {
+ return *x.X
+ }
+ return 0
+}
+
+func (x *SSL_DetectionBall) GetY() float32 {
+ if x != nil && x.Y != nil {
+ return *x.Y
+ }
+ return 0
+}
+
+func (x *SSL_DetectionBall) GetZ() float32 {
+ if x != nil && x.Z != nil {
+ return *x.Z
+ }
+ return 0
+}
+
+func (x *SSL_DetectionBall) GetPixelX() float32 {
+ if x != nil && x.PixelX != nil {
+ return *x.PixelX
+ }
+ return 0
+}
+
+func (x *SSL_DetectionBall) GetPixelY() float32 {
+ if x != nil && x.PixelY != nil {
+ return *x.PixelY
+ }
+ return 0
+}
+
+type SSL_DetectionRobot struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Confidence *float32 `protobuf:"fixed32,1,req,name=confidence" json:"confidence,omitempty"`
+ RobotId *uint32 `protobuf:"varint,2,opt,name=robot_id,json=robotId" json:"robot_id,omitempty"`
+ X *float32 `protobuf:"fixed32,3,req,name=x" json:"x,omitempty"`
+ Y *float32 `protobuf:"fixed32,4,req,name=y" json:"y,omitempty"`
+ Orientation *float32 `protobuf:"fixed32,5,opt,name=orientation" json:"orientation,omitempty"`
+ PixelX *float32 `protobuf:"fixed32,6,req,name=pixel_x,json=pixelX" json:"pixel_x,omitempty"`
+ PixelY *float32 `protobuf:"fixed32,7,req,name=pixel_y,json=pixelY" json:"pixel_y,omitempty"`
+ Height *float32 `protobuf:"fixed32,8,opt,name=height" json:"height,omitempty"`
+}
+
+func (x *SSL_DetectionRobot) Reset() {
+ *x = SSL_DetectionRobot{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_vision_detection_proto_msgTypes[1]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *SSL_DetectionRobot) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SSL_DetectionRobot) ProtoMessage() {}
+
+func (x *SSL_DetectionRobot) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_vision_detection_proto_msgTypes[1]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use SSL_DetectionRobot.ProtoReflect.Descriptor instead.
+func (*SSL_DetectionRobot) Descriptor() ([]byte, []int) {
+ return file_ssl_vision_detection_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *SSL_DetectionRobot) GetConfidence() float32 {
+ if x != nil && x.Confidence != nil {
+ return *x.Confidence
+ }
+ return 0
+}
+
+func (x *SSL_DetectionRobot) GetRobotId() uint32 {
+ if x != nil && x.RobotId != nil {
+ return *x.RobotId
+ }
+ return 0
+}
+
+func (x *SSL_DetectionRobot) GetX() float32 {
+ if x != nil && x.X != nil {
+ return *x.X
+ }
+ return 0
+}
+
+func (x *SSL_DetectionRobot) GetY() float32 {
+ if x != nil && x.Y != nil {
+ return *x.Y
+ }
+ return 0
+}
+
+func (x *SSL_DetectionRobot) GetOrientation() float32 {
+ if x != nil && x.Orientation != nil {
+ return *x.Orientation
+ }
+ return 0
+}
+
+func (x *SSL_DetectionRobot) GetPixelX() float32 {
+ if x != nil && x.PixelX != nil {
+ return *x.PixelX
+ }
+ return 0
+}
+
+func (x *SSL_DetectionRobot) GetPixelY() float32 {
+ if x != nil && x.PixelY != nil {
+ return *x.PixelY
+ }
+ return 0
+}
+
+func (x *SSL_DetectionRobot) GetHeight() float32 {
+ if x != nil && x.Height != nil {
+ return *x.Height
+ }
+ return 0
+}
+
+type SSL_DetectionFrame struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ FrameNumber *uint32 `protobuf:"varint,1,req,name=frame_number,json=frameNumber" json:"frame_number,omitempty"`
+ TCapture *float64 `protobuf:"fixed64,2,req,name=t_capture,json=tCapture" json:"t_capture,omitempty"`
+ TSent *float64 `protobuf:"fixed64,3,req,name=t_sent,json=tSent" json:"t_sent,omitempty"`
+ CameraId *uint32 `protobuf:"varint,4,req,name=camera_id,json=cameraId" json:"camera_id,omitempty"`
+ Balls []*SSL_DetectionBall `protobuf:"bytes,5,rep,name=balls" json:"balls,omitempty"`
+ RobotsYellow []*SSL_DetectionRobot `protobuf:"bytes,6,rep,name=robots_yellow,json=robotsYellow" json:"robots_yellow,omitempty"`
+ RobotsBlue []*SSL_DetectionRobot `protobuf:"bytes,7,rep,name=robots_blue,json=robotsBlue" json:"robots_blue,omitempty"`
+}
+
+func (x *SSL_DetectionFrame) Reset() {
+ *x = SSL_DetectionFrame{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_vision_detection_proto_msgTypes[2]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *SSL_DetectionFrame) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SSL_DetectionFrame) ProtoMessage() {}
+
+func (x *SSL_DetectionFrame) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_vision_detection_proto_msgTypes[2]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use SSL_DetectionFrame.ProtoReflect.Descriptor instead.
+func (*SSL_DetectionFrame) Descriptor() ([]byte, []int) {
+ return file_ssl_vision_detection_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *SSL_DetectionFrame) GetFrameNumber() uint32 {
+ if x != nil && x.FrameNumber != nil {
+ return *x.FrameNumber
+ }
+ return 0
+}
+
+func (x *SSL_DetectionFrame) GetTCapture() float64 {
+ if x != nil && x.TCapture != nil {
+ return *x.TCapture
+ }
+ return 0
+}
+
+func (x *SSL_DetectionFrame) GetTSent() float64 {
+ if x != nil && x.TSent != nil {
+ return *x.TSent
+ }
+ return 0
+}
+
+func (x *SSL_DetectionFrame) GetCameraId() uint32 {
+ if x != nil && x.CameraId != nil {
+ return *x.CameraId
+ }
+ return 0
+}
+
+func (x *SSL_DetectionFrame) GetBalls() []*SSL_DetectionBall {
+ if x != nil {
+ return x.Balls
+ }
+ return nil
+}
+
+func (x *SSL_DetectionFrame) GetRobotsYellow() []*SSL_DetectionRobot {
+ if x != nil {
+ return x.RobotsYellow
+ }
+ return nil
+}
+
+func (x *SSL_DetectionFrame) GetRobotsBlue() []*SSL_DetectionRobot {
+ if x != nil {
+ return x.RobotsBlue
+ }
+ return nil
+}
+
+var File_ssl_vision_detection_proto protoreflect.FileDescriptor
+
+var file_ssl_vision_detection_proto_rawDesc = []byte{
+ 0x0a, 0x1a, 0x73, 0x73, 0x6c, 0x5f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x65, 0x74,
+ 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa3, 0x01, 0x0a,
+ 0x11, 0x53, 0x53, 0x4c, 0x5f, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x61,
+ 0x6c, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65,
+ 0x18, 0x01, 0x20, 0x02, 0x28, 0x02, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e,
+ 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x72, 0x65, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d,
+ 0x52, 0x04, 0x61, 0x72, 0x65, 0x61, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x03, 0x20, 0x02, 0x28,
+ 0x02, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x04, 0x20, 0x02, 0x28, 0x02, 0x52,
+ 0x01, 0x79, 0x12, 0x0c, 0x0a, 0x01, 0x7a, 0x18, 0x05, 0x20, 0x01, 0x28, 0x02, 0x52, 0x01, 0x7a,
+ 0x12, 0x17, 0x0a, 0x07, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x5f, 0x78, 0x18, 0x06, 0x20, 0x02, 0x28,
+ 0x02, 0x52, 0x06, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x58, 0x12, 0x17, 0x0a, 0x07, 0x70, 0x69, 0x78,
+ 0x65, 0x6c, 0x5f, 0x79, 0x18, 0x07, 0x20, 0x02, 0x28, 0x02, 0x52, 0x06, 0x70, 0x69, 0x78, 0x65,
+ 0x6c, 0x59, 0x22, 0xd7, 0x01, 0x0a, 0x12, 0x53, 0x53, 0x4c, 0x5f, 0x44, 0x65, 0x74, 0x65, 0x63,
+ 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x6f, 0x62, 0x6f, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6e,
+ 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x02, 0x28, 0x02, 0x52, 0x0a, 0x63,
+ 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x6f, 0x62,
+ 0x6f, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x72, 0x6f, 0x62,
+ 0x6f, 0x74, 0x49, 0x64, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x03, 0x20, 0x02, 0x28, 0x02, 0x52,
+ 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x04, 0x20, 0x02, 0x28, 0x02, 0x52, 0x01, 0x79,
+ 0x12, 0x20, 0x0a, 0x0b, 0x6f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18,
+ 0x05, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0b, 0x6f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x5f, 0x78, 0x18, 0x06, 0x20,
+ 0x02, 0x28, 0x02, 0x52, 0x06, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x58, 0x12, 0x17, 0x0a, 0x07, 0x70,
+ 0x69, 0x78, 0x65, 0x6c, 0x5f, 0x79, 0x18, 0x07, 0x20, 0x02, 0x28, 0x02, 0x52, 0x06, 0x70, 0x69,
+ 0x78, 0x65, 0x6c, 0x59, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x08,
+ 0x20, 0x01, 0x28, 0x02, 0x52, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0xa2, 0x02, 0x0a,
+ 0x12, 0x53, 0x53, 0x4c, 0x5f, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x72,
+ 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x6e, 0x75, 0x6d,
+ 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0d, 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65,
+ 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x5f, 0x63, 0x61, 0x70, 0x74,
+ 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x02, 0x28, 0x01, 0x52, 0x08, 0x74, 0x43, 0x61, 0x70, 0x74,
+ 0x75, 0x72, 0x65, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x5f, 0x73, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20,
+ 0x02, 0x28, 0x01, 0x52, 0x05, 0x74, 0x53, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x61,
+ 0x6d, 0x65, 0x72, 0x61, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x02, 0x28, 0x0d, 0x52, 0x08, 0x63,
+ 0x61, 0x6d, 0x65, 0x72, 0x61, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x05, 0x62, 0x61, 0x6c, 0x6c, 0x73,
+ 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x53, 0x53, 0x4c, 0x5f, 0x44, 0x65, 0x74,
+ 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x61, 0x6c, 0x6c, 0x52, 0x05, 0x62, 0x61, 0x6c, 0x6c,
+ 0x73, 0x12, 0x38, 0x0a, 0x0d, 0x72, 0x6f, 0x62, 0x6f, 0x74, 0x73, 0x5f, 0x79, 0x65, 0x6c, 0x6c,
+ 0x6f, 0x77, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x53, 0x53, 0x4c, 0x5f, 0x44,
+ 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x6f, 0x62, 0x6f, 0x74, 0x52, 0x0c, 0x72,
+ 0x6f, 0x62, 0x6f, 0x74, 0x73, 0x59, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x12, 0x34, 0x0a, 0x0b, 0x72,
+ 0x6f, 0x62, 0x6f, 0x74, 0x73, 0x5f, 0x62, 0x6c, 0x75, 0x65, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b,
+ 0x32, 0x13, 0x2e, 0x53, 0x53, 0x4c, 0x5f, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+ 0x52, 0x6f, 0x62, 0x6f, 0x74, 0x52, 0x0a, 0x72, 0x6f, 0x62, 0x6f, 0x74, 0x73, 0x42, 0x6c, 0x75,
+ 0x65, 0x42, 0x42, 0x5a, 0x40, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,
+ 0x52, 0x6f, 0x62, 0x6f, 0x43, 0x75, 0x70, 0x2d, 0x53, 0x53, 0x4c, 0x2f, 0x73, 0x73, 0x6c, 0x2d,
+ 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72,
+ 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x76,
+ 0x69, 0x73, 0x69, 0x6f, 0x6e,
+}
+
+var (
+ file_ssl_vision_detection_proto_rawDescOnce sync.Once
+ file_ssl_vision_detection_proto_rawDescData = file_ssl_vision_detection_proto_rawDesc
+)
+
+func file_ssl_vision_detection_proto_rawDescGZIP() []byte {
+ file_ssl_vision_detection_proto_rawDescOnce.Do(func() {
+ file_ssl_vision_detection_proto_rawDescData = protoimpl.X.CompressGZIP(file_ssl_vision_detection_proto_rawDescData)
+ })
+ return file_ssl_vision_detection_proto_rawDescData
+}
+
+var file_ssl_vision_detection_proto_msgTypes = make([]protoimpl.MessageInfo, 3)
+var file_ssl_vision_detection_proto_goTypes = []interface{}{
+ (*SSL_DetectionBall)(nil), // 0: SSL_DetectionBall
+ (*SSL_DetectionRobot)(nil), // 1: SSL_DetectionRobot
+ (*SSL_DetectionFrame)(nil), // 2: SSL_DetectionFrame
+}
+var file_ssl_vision_detection_proto_depIdxs = []int32{
+ 0, // 0: SSL_DetectionFrame.balls:type_name -> SSL_DetectionBall
+ 1, // 1: SSL_DetectionFrame.robots_yellow:type_name -> SSL_DetectionRobot
+ 1, // 2: SSL_DetectionFrame.robots_blue:type_name -> SSL_DetectionRobot
+ 3, // [3:3] is the sub-list for method output_type
+ 3, // [3:3] is the sub-list for method input_type
+ 3, // [3:3] is the sub-list for extension type_name
+ 3, // [3:3] is the sub-list for extension extendee
+ 0, // [0:3] is the sub-list for field type_name
+}
+
+func init() { file_ssl_vision_detection_proto_init() }
+func file_ssl_vision_detection_proto_init() {
+ if File_ssl_vision_detection_proto != nil {
+ return
+ }
+ if !protoimpl.UnsafeEnabled {
+ file_ssl_vision_detection_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*SSL_DetectionBall); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_vision_detection_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*SSL_DetectionRobot); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_vision_detection_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*SSL_DetectionFrame); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ }
+ type x struct{}
+ out := protoimpl.TypeBuilder{
+ File: protoimpl.DescBuilder{
+ GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+ RawDescriptor: file_ssl_vision_detection_proto_rawDesc,
+ NumEnums: 0,
+ NumMessages: 3,
+ NumExtensions: 0,
+ NumServices: 0,
+ },
+ GoTypes: file_ssl_vision_detection_proto_goTypes,
+ DependencyIndexes: file_ssl_vision_detection_proto_depIdxs,
+ MessageInfos: file_ssl_vision_detection_proto_msgTypes,
+ }.Build()
+ File_ssl_vision_detection_proto = out.File
+ file_ssl_vision_detection_proto_rawDesc = nil
+ file_ssl_vision_detection_proto_goTypes = nil
+ file_ssl_vision_detection_proto_depIdxs = nil
+}
diff --git a/internal/vision/ssl_vision_geometry.pb.go b/internal/vision/ssl_vision_geometry.pb.go
new file mode 100644
index 0000000..fb0e6c3
--- /dev/null
+++ b/internal/vision/ssl_vision_geometry.pb.go
@@ -0,0 +1,790 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// protoc-gen-go v1.25.0
+// protoc v3.12.4
+// source: ssl_vision_geometry.proto
+
+package vision
+
+import (
+ proto "github.com/golang/protobuf/proto"
+ protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+ protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+ reflect "reflect"
+ sync "sync"
+)
+
+const (
+ // Verify that this generated code is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+ // Verify that runtime/protoimpl is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
+
+// A 2D float vector.
+type Vector2F struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ X *float32 `protobuf:"fixed32,1,req,name=x" json:"x,omitempty"`
+ Y *float32 `protobuf:"fixed32,2,req,name=y" json:"y,omitempty"`
+}
+
+func (x *Vector2F) Reset() {
+ *x = Vector2F{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_vision_geometry_proto_msgTypes[0]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *Vector2F) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Vector2F) ProtoMessage() {}
+
+func (x *Vector2F) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_vision_geometry_proto_msgTypes[0]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use Vector2F.ProtoReflect.Descriptor instead.
+func (*Vector2F) Descriptor() ([]byte, []int) {
+ return file_ssl_vision_geometry_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *Vector2F) GetX() float32 {
+ if x != nil && x.X != nil {
+ return *x.X
+ }
+ return 0
+}
+
+func (x *Vector2F) GetY() float32 {
+ if x != nil && x.Y != nil {
+ return *x.Y
+ }
+ return 0
+}
+
+// Represents a field marking as a line segment represented by a start point p1,
+// and end point p2, and a line thickness. The start and end points are along
+// the center of the line, so the thickness of the line extends by thickness / 2
+// on either side of the line.
+type SSL_FieldLineSegment struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // Name of this field marking.
+ Name *string `protobuf:"bytes,1,req,name=name" json:"name,omitempty"`
+ // Start point of the line segment.
+ P1 *Vector2F `protobuf:"bytes,2,req,name=p1" json:"p1,omitempty"`
+ // End point of the line segment.
+ P2 *Vector2F `protobuf:"bytes,3,req,name=p2" json:"p2,omitempty"`
+ // Thickness of the line segment.
+ Thickness *float32 `protobuf:"fixed32,4,req,name=thickness" json:"thickness,omitempty"`
+}
+
+func (x *SSL_FieldLineSegment) Reset() {
+ *x = SSL_FieldLineSegment{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_vision_geometry_proto_msgTypes[1]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *SSL_FieldLineSegment) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SSL_FieldLineSegment) ProtoMessage() {}
+
+func (x *SSL_FieldLineSegment) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_vision_geometry_proto_msgTypes[1]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use SSL_FieldLineSegment.ProtoReflect.Descriptor instead.
+func (*SSL_FieldLineSegment) Descriptor() ([]byte, []int) {
+ return file_ssl_vision_geometry_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *SSL_FieldLineSegment) GetName() string {
+ if x != nil && x.Name != nil {
+ return *x.Name
+ }
+ return ""
+}
+
+func (x *SSL_FieldLineSegment) GetP1() *Vector2F {
+ if x != nil {
+ return x.P1
+ }
+ return nil
+}
+
+func (x *SSL_FieldLineSegment) GetP2() *Vector2F {
+ if x != nil {
+ return x.P2
+ }
+ return nil
+}
+
+func (x *SSL_FieldLineSegment) GetThickness() float32 {
+ if x != nil && x.Thickness != nil {
+ return *x.Thickness
+ }
+ return 0
+}
+
+// Represents a field marking as a circular arc segment represented by center point, a
+// start angle, an end angle, and an arc thickness.
+type SSL_FieldCicularArc struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // Name of this field marking.
+ Name *string `protobuf:"bytes,1,req,name=name" json:"name,omitempty"`
+ // Center point of the circular arc.
+ Center *Vector2F `protobuf:"bytes,2,req,name=center" json:"center,omitempty"`
+ // Radius of the arc.
+ Radius *float32 `protobuf:"fixed32,3,req,name=radius" json:"radius,omitempty"`
+ // Start angle in counter-clockwise order.
+ A1 *float32 `protobuf:"fixed32,4,req,name=a1" json:"a1,omitempty"`
+ // End angle in counter-clockwise order.
+ A2 *float32 `protobuf:"fixed32,5,req,name=a2" json:"a2,omitempty"`
+ // Thickness of the arc.
+ Thickness *float32 `protobuf:"fixed32,6,req,name=thickness" json:"thickness,omitempty"`
+}
+
+func (x *SSL_FieldCicularArc) Reset() {
+ *x = SSL_FieldCicularArc{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_vision_geometry_proto_msgTypes[2]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *SSL_FieldCicularArc) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SSL_FieldCicularArc) ProtoMessage() {}
+
+func (x *SSL_FieldCicularArc) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_vision_geometry_proto_msgTypes[2]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use SSL_FieldCicularArc.ProtoReflect.Descriptor instead.
+func (*SSL_FieldCicularArc) Descriptor() ([]byte, []int) {
+ return file_ssl_vision_geometry_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *SSL_FieldCicularArc) GetName() string {
+ if x != nil && x.Name != nil {
+ return *x.Name
+ }
+ return ""
+}
+
+func (x *SSL_FieldCicularArc) GetCenter() *Vector2F {
+ if x != nil {
+ return x.Center
+ }
+ return nil
+}
+
+func (x *SSL_FieldCicularArc) GetRadius() float32 {
+ if x != nil && x.Radius != nil {
+ return *x.Radius
+ }
+ return 0
+}
+
+func (x *SSL_FieldCicularArc) GetA1() float32 {
+ if x != nil && x.A1 != nil {
+ return *x.A1
+ }
+ return 0
+}
+
+func (x *SSL_FieldCicularArc) GetA2() float32 {
+ if x != nil && x.A2 != nil {
+ return *x.A2
+ }
+ return 0
+}
+
+func (x *SSL_FieldCicularArc) GetThickness() float32 {
+ if x != nil && x.Thickness != nil {
+ return *x.Thickness
+ }
+ return 0
+}
+
+type SSL_GeometryFieldSize struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ FieldLength *int32 `protobuf:"varint,1,req,name=field_length,json=fieldLength" json:"field_length,omitempty"`
+ FieldWidth *int32 `protobuf:"varint,2,req,name=field_width,json=fieldWidth" json:"field_width,omitempty"`
+ GoalWidth *int32 `protobuf:"varint,3,req,name=goal_width,json=goalWidth" json:"goal_width,omitempty"`
+ GoalDepth *int32 `protobuf:"varint,4,req,name=goal_depth,json=goalDepth" json:"goal_depth,omitempty"`
+ BoundaryWidth *int32 `protobuf:"varint,5,req,name=boundary_width,json=boundaryWidth" json:"boundary_width,omitempty"`
+ FieldLines []*SSL_FieldLineSegment `protobuf:"bytes,6,rep,name=field_lines,json=fieldLines" json:"field_lines,omitempty"`
+ FieldArcs []*SSL_FieldCicularArc `protobuf:"bytes,7,rep,name=field_arcs,json=fieldArcs" json:"field_arcs,omitempty"`
+}
+
+func (x *SSL_GeometryFieldSize) Reset() {
+ *x = SSL_GeometryFieldSize{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_vision_geometry_proto_msgTypes[3]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *SSL_GeometryFieldSize) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SSL_GeometryFieldSize) ProtoMessage() {}
+
+func (x *SSL_GeometryFieldSize) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_vision_geometry_proto_msgTypes[3]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use SSL_GeometryFieldSize.ProtoReflect.Descriptor instead.
+func (*SSL_GeometryFieldSize) Descriptor() ([]byte, []int) {
+ return file_ssl_vision_geometry_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *SSL_GeometryFieldSize) GetFieldLength() int32 {
+ if x != nil && x.FieldLength != nil {
+ return *x.FieldLength
+ }
+ return 0
+}
+
+func (x *SSL_GeometryFieldSize) GetFieldWidth() int32 {
+ if x != nil && x.FieldWidth != nil {
+ return *x.FieldWidth
+ }
+ return 0
+}
+
+func (x *SSL_GeometryFieldSize) GetGoalWidth() int32 {
+ if x != nil && x.GoalWidth != nil {
+ return *x.GoalWidth
+ }
+ return 0
+}
+
+func (x *SSL_GeometryFieldSize) GetGoalDepth() int32 {
+ if x != nil && x.GoalDepth != nil {
+ return *x.GoalDepth
+ }
+ return 0
+}
+
+func (x *SSL_GeometryFieldSize) GetBoundaryWidth() int32 {
+ if x != nil && x.BoundaryWidth != nil {
+ return *x.BoundaryWidth
+ }
+ return 0
+}
+
+func (x *SSL_GeometryFieldSize) GetFieldLines() []*SSL_FieldLineSegment {
+ if x != nil {
+ return x.FieldLines
+ }
+ return nil
+}
+
+func (x *SSL_GeometryFieldSize) GetFieldArcs() []*SSL_FieldCicularArc {
+ if x != nil {
+ return x.FieldArcs
+ }
+ return nil
+}
+
+type SSL_GeometryCameraCalibration struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ CameraId *uint32 `protobuf:"varint,1,req,name=camera_id,json=cameraId" json:"camera_id,omitempty"`
+ FocalLength *float32 `protobuf:"fixed32,2,req,name=focal_length,json=focalLength" json:"focal_length,omitempty"`
+ PrincipalPointX *float32 `protobuf:"fixed32,3,req,name=principal_point_x,json=principalPointX" json:"principal_point_x,omitempty"`
+ PrincipalPointY *float32 `protobuf:"fixed32,4,req,name=principal_point_y,json=principalPointY" json:"principal_point_y,omitempty"`
+ Distortion *float32 `protobuf:"fixed32,5,req,name=distortion" json:"distortion,omitempty"`
+ Q0 *float32 `protobuf:"fixed32,6,req,name=q0" json:"q0,omitempty"`
+ Q1 *float32 `protobuf:"fixed32,7,req,name=q1" json:"q1,omitempty"`
+ Q2 *float32 `protobuf:"fixed32,8,req,name=q2" json:"q2,omitempty"`
+ Q3 *float32 `protobuf:"fixed32,9,req,name=q3" json:"q3,omitempty"`
+ Tx *float32 `protobuf:"fixed32,10,req,name=tx" json:"tx,omitempty"`
+ Ty *float32 `protobuf:"fixed32,11,req,name=ty" json:"ty,omitempty"`
+ Tz *float32 `protobuf:"fixed32,12,req,name=tz" json:"tz,omitempty"`
+ DerivedCameraWorldTx *float32 `protobuf:"fixed32,13,opt,name=derived_camera_world_tx,json=derivedCameraWorldTx" json:"derived_camera_world_tx,omitempty"`
+ DerivedCameraWorldTy *float32 `protobuf:"fixed32,14,opt,name=derived_camera_world_ty,json=derivedCameraWorldTy" json:"derived_camera_world_ty,omitempty"`
+ DerivedCameraWorldTz *float32 `protobuf:"fixed32,15,opt,name=derived_camera_world_tz,json=derivedCameraWorldTz" json:"derived_camera_world_tz,omitempty"`
+}
+
+func (x *SSL_GeometryCameraCalibration) Reset() {
+ *x = SSL_GeometryCameraCalibration{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_vision_geometry_proto_msgTypes[4]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *SSL_GeometryCameraCalibration) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SSL_GeometryCameraCalibration) ProtoMessage() {}
+
+func (x *SSL_GeometryCameraCalibration) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_vision_geometry_proto_msgTypes[4]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use SSL_GeometryCameraCalibration.ProtoReflect.Descriptor instead.
+func (*SSL_GeometryCameraCalibration) Descriptor() ([]byte, []int) {
+ return file_ssl_vision_geometry_proto_rawDescGZIP(), []int{4}
+}
+
+func (x *SSL_GeometryCameraCalibration) GetCameraId() uint32 {
+ if x != nil && x.CameraId != nil {
+ return *x.CameraId
+ }
+ return 0
+}
+
+func (x *SSL_GeometryCameraCalibration) GetFocalLength() float32 {
+ if x != nil && x.FocalLength != nil {
+ return *x.FocalLength
+ }
+ return 0
+}
+
+func (x *SSL_GeometryCameraCalibration) GetPrincipalPointX() float32 {
+ if x != nil && x.PrincipalPointX != nil {
+ return *x.PrincipalPointX
+ }
+ return 0
+}
+
+func (x *SSL_GeometryCameraCalibration) GetPrincipalPointY() float32 {
+ if x != nil && x.PrincipalPointY != nil {
+ return *x.PrincipalPointY
+ }
+ return 0
+}
+
+func (x *SSL_GeometryCameraCalibration) GetDistortion() float32 {
+ if x != nil && x.Distortion != nil {
+ return *x.Distortion
+ }
+ return 0
+}
+
+func (x *SSL_GeometryCameraCalibration) GetQ0() float32 {
+ if x != nil && x.Q0 != nil {
+ return *x.Q0
+ }
+ return 0
+}
+
+func (x *SSL_GeometryCameraCalibration) GetQ1() float32 {
+ if x != nil && x.Q1 != nil {
+ return *x.Q1
+ }
+ return 0
+}
+
+func (x *SSL_GeometryCameraCalibration) GetQ2() float32 {
+ if x != nil && x.Q2 != nil {
+ return *x.Q2
+ }
+ return 0
+}
+
+func (x *SSL_GeometryCameraCalibration) GetQ3() float32 {
+ if x != nil && x.Q3 != nil {
+ return *x.Q3
+ }
+ return 0
+}
+
+func (x *SSL_GeometryCameraCalibration) GetTx() float32 {
+ if x != nil && x.Tx != nil {
+ return *x.Tx
+ }
+ return 0
+}
+
+func (x *SSL_GeometryCameraCalibration) GetTy() float32 {
+ if x != nil && x.Ty != nil {
+ return *x.Ty
+ }
+ return 0
+}
+
+func (x *SSL_GeometryCameraCalibration) GetTz() float32 {
+ if x != nil && x.Tz != nil {
+ return *x.Tz
+ }
+ return 0
+}
+
+func (x *SSL_GeometryCameraCalibration) GetDerivedCameraWorldTx() float32 {
+ if x != nil && x.DerivedCameraWorldTx != nil {
+ return *x.DerivedCameraWorldTx
+ }
+ return 0
+}
+
+func (x *SSL_GeometryCameraCalibration) GetDerivedCameraWorldTy() float32 {
+ if x != nil && x.DerivedCameraWorldTy != nil {
+ return *x.DerivedCameraWorldTy
+ }
+ return 0
+}
+
+func (x *SSL_GeometryCameraCalibration) GetDerivedCameraWorldTz() float32 {
+ if x != nil && x.DerivedCameraWorldTz != nil {
+ return *x.DerivedCameraWorldTz
+ }
+ return 0
+}
+
+type SSL_GeometryData struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Field *SSL_GeometryFieldSize `protobuf:"bytes,1,req,name=field" json:"field,omitempty"`
+ Calib []*SSL_GeometryCameraCalibration `protobuf:"bytes,2,rep,name=calib" json:"calib,omitempty"`
+}
+
+func (x *SSL_GeometryData) Reset() {
+ *x = SSL_GeometryData{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_vision_geometry_proto_msgTypes[5]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *SSL_GeometryData) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SSL_GeometryData) ProtoMessage() {}
+
+func (x *SSL_GeometryData) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_vision_geometry_proto_msgTypes[5]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use SSL_GeometryData.ProtoReflect.Descriptor instead.
+func (*SSL_GeometryData) Descriptor() ([]byte, []int) {
+ return file_ssl_vision_geometry_proto_rawDescGZIP(), []int{5}
+}
+
+func (x *SSL_GeometryData) GetField() *SSL_GeometryFieldSize {
+ if x != nil {
+ return x.Field
+ }
+ return nil
+}
+
+func (x *SSL_GeometryData) GetCalib() []*SSL_GeometryCameraCalibration {
+ if x != nil {
+ return x.Calib
+ }
+ return nil
+}
+
+var File_ssl_vision_geometry_proto protoreflect.FileDescriptor
+
+var file_ssl_vision_geometry_proto_rawDesc = []byte{
+ 0x0a, 0x19, 0x73, 0x73, 0x6c, 0x5f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x67, 0x65, 0x6f,
+ 0x6d, 0x65, 0x74, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x26, 0x0a, 0x08, 0x56,
+ 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x66, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20, 0x02,
+ 0x28, 0x02, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x02, 0x28, 0x02,
+ 0x52, 0x01, 0x79, 0x22, 0x7e, 0x0a, 0x14, 0x53, 0x53, 0x4c, 0x5f, 0x46, 0x69, 0x65, 0x6c, 0x64,
+ 0x4c, 0x69, 0x6e, 0x65, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e,
+ 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x02, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12,
+ 0x19, 0x0a, 0x02, 0x70, 0x31, 0x18, 0x02, 0x20, 0x02, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x56, 0x65,
+ 0x63, 0x74, 0x6f, 0x72, 0x32, 0x66, 0x52, 0x02, 0x70, 0x31, 0x12, 0x19, 0x0a, 0x02, 0x70, 0x32,
+ 0x18, 0x03, 0x20, 0x02, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32,
+ 0x66, 0x52, 0x02, 0x70, 0x32, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x68, 0x69, 0x63, 0x6b, 0x6e, 0x65,
+ 0x73, 0x73, 0x18, 0x04, 0x20, 0x02, 0x28, 0x02, 0x52, 0x09, 0x74, 0x68, 0x69, 0x63, 0x6b, 0x6e,
+ 0x65, 0x73, 0x73, 0x22, 0xa2, 0x01, 0x0a, 0x13, 0x53, 0x53, 0x4c, 0x5f, 0x46, 0x69, 0x65, 0x6c,
+ 0x64, 0x43, 0x69, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x41, 0x72, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x6e,
+ 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x02, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12,
+ 0x21, 0x0a, 0x06, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x02, 0x28, 0x0b, 0x32,
+ 0x09, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x66, 0x52, 0x06, 0x63, 0x65, 0x6e, 0x74,
+ 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x18, 0x03, 0x20, 0x02,
+ 0x28, 0x02, 0x52, 0x06, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x61, 0x31,
+ 0x18, 0x04, 0x20, 0x02, 0x28, 0x02, 0x52, 0x02, 0x61, 0x31, 0x12, 0x0e, 0x0a, 0x02, 0x61, 0x32,
+ 0x18, 0x05, 0x20, 0x02, 0x28, 0x02, 0x52, 0x02, 0x61, 0x32, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x68,
+ 0x69, 0x63, 0x6b, 0x6e, 0x65, 0x73, 0x73, 0x18, 0x06, 0x20, 0x02, 0x28, 0x02, 0x52, 0x09, 0x74,
+ 0x68, 0x69, 0x63, 0x6b, 0x6e, 0x65, 0x73, 0x73, 0x22, 0xad, 0x02, 0x0a, 0x15, 0x53, 0x53, 0x4c,
+ 0x5f, 0x47, 0x65, 0x6f, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x53, 0x69,
+ 0x7a, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6c, 0x65, 0x6e, 0x67,
+ 0x74, 0x68, 0x18, 0x01, 0x20, 0x02, 0x28, 0x05, 0x52, 0x0b, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4c,
+ 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x77,
+ 0x69, 0x64, 0x74, 0x68, 0x18, 0x02, 0x20, 0x02, 0x28, 0x05, 0x52, 0x0a, 0x66, 0x69, 0x65, 0x6c,
+ 0x64, 0x57, 0x69, 0x64, 0x74, 0x68, 0x12, 0x1d, 0x0a, 0x0a, 0x67, 0x6f, 0x61, 0x6c, 0x5f, 0x77,
+ 0x69, 0x64, 0x74, 0x68, 0x18, 0x03, 0x20, 0x02, 0x28, 0x05, 0x52, 0x09, 0x67, 0x6f, 0x61, 0x6c,
+ 0x57, 0x69, 0x64, 0x74, 0x68, 0x12, 0x1d, 0x0a, 0x0a, 0x67, 0x6f, 0x61, 0x6c, 0x5f, 0x64, 0x65,
+ 0x70, 0x74, 0x68, 0x18, 0x04, 0x20, 0x02, 0x28, 0x05, 0x52, 0x09, 0x67, 0x6f, 0x61, 0x6c, 0x44,
+ 0x65, 0x70, 0x74, 0x68, 0x12, 0x25, 0x0a, 0x0e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x72, 0x79,
+ 0x5f, 0x77, 0x69, 0x64, 0x74, 0x68, 0x18, 0x05, 0x20, 0x02, 0x28, 0x05, 0x52, 0x0d, 0x62, 0x6f,
+ 0x75, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x57, 0x69, 0x64, 0x74, 0x68, 0x12, 0x36, 0x0a, 0x0b, 0x66,
+ 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b,
+ 0x32, 0x15, 0x2e, 0x53, 0x53, 0x4c, 0x5f, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4c, 0x69, 0x6e, 0x65,
+ 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4c, 0x69,
+ 0x6e, 0x65, 0x73, 0x12, 0x33, 0x0a, 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x61, 0x72, 0x63,
+ 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x53, 0x53, 0x4c, 0x5f, 0x46, 0x69,
+ 0x65, 0x6c, 0x64, 0x43, 0x69, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x41, 0x72, 0x63, 0x52, 0x09, 0x66,
+ 0x69, 0x65, 0x6c, 0x64, 0x41, 0x72, 0x63, 0x73, 0x22, 0xec, 0x03, 0x0a, 0x1d, 0x53, 0x53, 0x4c,
+ 0x5f, 0x47, 0x65, 0x6f, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x43, 0x61, 0x6d, 0x65, 0x72, 0x61, 0x43,
+ 0x61, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x61,
+ 0x6d, 0x65, 0x72, 0x61, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0d, 0x52, 0x08, 0x63,
+ 0x61, 0x6d, 0x65, 0x72, 0x61, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x6f, 0x63, 0x61, 0x6c,
+ 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x02, 0x20, 0x02, 0x28, 0x02, 0x52, 0x0b, 0x66,
+ 0x6f, 0x63, 0x61, 0x6c, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x2a, 0x0a, 0x11, 0x70, 0x72,
+ 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x78, 0x18,
+ 0x03, 0x20, 0x02, 0x28, 0x02, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c,
+ 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x58, 0x12, 0x2a, 0x0a, 0x11, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69,
+ 0x70, 0x61, 0x6c, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x79, 0x18, 0x04, 0x20, 0x02, 0x28,
+ 0x02, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x50, 0x6f, 0x69, 0x6e,
+ 0x74, 0x59, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x74, 0x69, 0x6f, 0x6e,
+ 0x18, 0x05, 0x20, 0x02, 0x28, 0x02, 0x52, 0x0a, 0x64, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x74, 0x69,
+ 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x71, 0x30, 0x18, 0x06, 0x20, 0x02, 0x28, 0x02, 0x52, 0x02,
+ 0x71, 0x30, 0x12, 0x0e, 0x0a, 0x02, 0x71, 0x31, 0x18, 0x07, 0x20, 0x02, 0x28, 0x02, 0x52, 0x02,
+ 0x71, 0x31, 0x12, 0x0e, 0x0a, 0x02, 0x71, 0x32, 0x18, 0x08, 0x20, 0x02, 0x28, 0x02, 0x52, 0x02,
+ 0x71, 0x32, 0x12, 0x0e, 0x0a, 0x02, 0x71, 0x33, 0x18, 0x09, 0x20, 0x02, 0x28, 0x02, 0x52, 0x02,
+ 0x71, 0x33, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x0a, 0x20, 0x02, 0x28, 0x02, 0x52, 0x02,
+ 0x74, 0x78, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x79, 0x18, 0x0b, 0x20, 0x02, 0x28, 0x02, 0x52, 0x02,
+ 0x74, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x7a, 0x18, 0x0c, 0x20, 0x02, 0x28, 0x02, 0x52, 0x02,
+ 0x74, 0x7a, 0x12, 0x35, 0x0a, 0x17, 0x64, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x5f, 0x63, 0x61,
+ 0x6d, 0x65, 0x72, 0x61, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x5f, 0x74, 0x78, 0x18, 0x0d, 0x20,
+ 0x01, 0x28, 0x02, 0x52, 0x14, 0x64, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x43, 0x61, 0x6d, 0x65,
+ 0x72, 0x61, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x54, 0x78, 0x12, 0x35, 0x0a, 0x17, 0x64, 0x65, 0x72,
+ 0x69, 0x76, 0x65, 0x64, 0x5f, 0x63, 0x61, 0x6d, 0x65, 0x72, 0x61, 0x5f, 0x77, 0x6f, 0x72, 0x6c,
+ 0x64, 0x5f, 0x74, 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x02, 0x52, 0x14, 0x64, 0x65, 0x72, 0x69,
+ 0x76, 0x65, 0x64, 0x43, 0x61, 0x6d, 0x65, 0x72, 0x61, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x54, 0x79,
+ 0x12, 0x35, 0x0a, 0x17, 0x64, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x5f, 0x63, 0x61, 0x6d, 0x65,
+ 0x72, 0x61, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x5f, 0x74, 0x7a, 0x18, 0x0f, 0x20, 0x01, 0x28,
+ 0x02, 0x52, 0x14, 0x64, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x43, 0x61, 0x6d, 0x65, 0x72, 0x61,
+ 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x54, 0x7a, 0x22, 0x76, 0x0a, 0x10, 0x53, 0x53, 0x4c, 0x5f, 0x47,
+ 0x65, 0x6f, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2c, 0x0a, 0x05, 0x66,
+ 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x53, 0x53, 0x4c,
+ 0x5f, 0x47, 0x65, 0x6f, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x53, 0x69,
+ 0x7a, 0x65, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x34, 0x0a, 0x05, 0x63, 0x61, 0x6c,
+ 0x69, 0x62, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x53, 0x53, 0x4c, 0x5f, 0x47,
+ 0x65, 0x6f, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x43, 0x61, 0x6d, 0x65, 0x72, 0x61, 0x43, 0x61, 0x6c,
+ 0x69, 0x62, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x63, 0x61, 0x6c, 0x69, 0x62, 0x42,
+ 0x42, 0x5a, 0x40, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x52, 0x6f,
+ 0x62, 0x6f, 0x43, 0x75, 0x70, 0x2d, 0x53, 0x53, 0x4c, 0x2f, 0x73, 0x73, 0x6c, 0x2d, 0x73, 0x69,
+ 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c,
+ 0x6c, 0x65, 0x72, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x76, 0x69, 0x73,
+ 0x69, 0x6f, 0x6e,
+}
+
+var (
+ file_ssl_vision_geometry_proto_rawDescOnce sync.Once
+ file_ssl_vision_geometry_proto_rawDescData = file_ssl_vision_geometry_proto_rawDesc
+)
+
+func file_ssl_vision_geometry_proto_rawDescGZIP() []byte {
+ file_ssl_vision_geometry_proto_rawDescOnce.Do(func() {
+ file_ssl_vision_geometry_proto_rawDescData = protoimpl.X.CompressGZIP(file_ssl_vision_geometry_proto_rawDescData)
+ })
+ return file_ssl_vision_geometry_proto_rawDescData
+}
+
+var file_ssl_vision_geometry_proto_msgTypes = make([]protoimpl.MessageInfo, 6)
+var file_ssl_vision_geometry_proto_goTypes = []interface{}{
+ (*Vector2F)(nil), // 0: Vector2f
+ (*SSL_FieldLineSegment)(nil), // 1: SSL_FieldLineSegment
+ (*SSL_FieldCicularArc)(nil), // 2: SSL_FieldCicularArc
+ (*SSL_GeometryFieldSize)(nil), // 3: SSL_GeometryFieldSize
+ (*SSL_GeometryCameraCalibration)(nil), // 4: SSL_GeometryCameraCalibration
+ (*SSL_GeometryData)(nil), // 5: SSL_GeometryData
+}
+var file_ssl_vision_geometry_proto_depIdxs = []int32{
+ 0, // 0: SSL_FieldLineSegment.p1:type_name -> Vector2f
+ 0, // 1: SSL_FieldLineSegment.p2:type_name -> Vector2f
+ 0, // 2: SSL_FieldCicularArc.center:type_name -> Vector2f
+ 1, // 3: SSL_GeometryFieldSize.field_lines:type_name -> SSL_FieldLineSegment
+ 2, // 4: SSL_GeometryFieldSize.field_arcs:type_name -> SSL_FieldCicularArc
+ 3, // 5: SSL_GeometryData.field:type_name -> SSL_GeometryFieldSize
+ 4, // 6: SSL_GeometryData.calib:type_name -> SSL_GeometryCameraCalibration
+ 7, // [7:7] is the sub-list for method output_type
+ 7, // [7:7] is the sub-list for method input_type
+ 7, // [7:7] is the sub-list for extension type_name
+ 7, // [7:7] is the sub-list for extension extendee
+ 0, // [0:7] is the sub-list for field type_name
+}
+
+func init() { file_ssl_vision_geometry_proto_init() }
+func file_ssl_vision_geometry_proto_init() {
+ if File_ssl_vision_geometry_proto != nil {
+ return
+ }
+ if !protoimpl.UnsafeEnabled {
+ file_ssl_vision_geometry_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*Vector2F); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_vision_geometry_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*SSL_FieldLineSegment); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_vision_geometry_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*SSL_FieldCicularArc); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_vision_geometry_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*SSL_GeometryFieldSize); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_vision_geometry_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*SSL_GeometryCameraCalibration); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_ssl_vision_geometry_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*SSL_GeometryData); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ }
+ type x struct{}
+ out := protoimpl.TypeBuilder{
+ File: protoimpl.DescBuilder{
+ GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+ RawDescriptor: file_ssl_vision_geometry_proto_rawDesc,
+ NumEnums: 0,
+ NumMessages: 6,
+ NumExtensions: 0,
+ NumServices: 0,
+ },
+ GoTypes: file_ssl_vision_geometry_proto_goTypes,
+ DependencyIndexes: file_ssl_vision_geometry_proto_depIdxs,
+ MessageInfos: file_ssl_vision_geometry_proto_msgTypes,
+ }.Build()
+ File_ssl_vision_geometry_proto = out.File
+ file_ssl_vision_geometry_proto_rawDesc = nil
+ file_ssl_vision_geometry_proto_goTypes = nil
+ file_ssl_vision_geometry_proto_depIdxs = nil
+}
diff --git a/internal/vision/ssl_vision_wrapper.pb.go b/internal/vision/ssl_vision_wrapper.pb.go
new file mode 100644
index 0000000..95d7d26
--- /dev/null
+++ b/internal/vision/ssl_vision_wrapper.pb.go
@@ -0,0 +1,172 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// protoc-gen-go v1.25.0
+// protoc v3.12.4
+// source: ssl_vision_wrapper.proto
+
+package vision
+
+import (
+ proto "github.com/golang/protobuf/proto"
+ protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+ protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+ reflect "reflect"
+ sync "sync"
+)
+
+const (
+ // Verify that this generated code is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+ // Verify that runtime/protoimpl is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
+
+type SSL_WrapperPacket struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Detection *SSL_DetectionFrame `protobuf:"bytes,1,opt,name=detection" json:"detection,omitempty"`
+ Geometry *SSL_GeometryData `protobuf:"bytes,2,opt,name=geometry" json:"geometry,omitempty"`
+}
+
+func (x *SSL_WrapperPacket) Reset() {
+ *x = SSL_WrapperPacket{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_ssl_vision_wrapper_proto_msgTypes[0]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *SSL_WrapperPacket) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SSL_WrapperPacket) ProtoMessage() {}
+
+func (x *SSL_WrapperPacket) ProtoReflect() protoreflect.Message {
+ mi := &file_ssl_vision_wrapper_proto_msgTypes[0]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use SSL_WrapperPacket.ProtoReflect.Descriptor instead.
+func (*SSL_WrapperPacket) Descriptor() ([]byte, []int) {
+ return file_ssl_vision_wrapper_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *SSL_WrapperPacket) GetDetection() *SSL_DetectionFrame {
+ if x != nil {
+ return x.Detection
+ }
+ return nil
+}
+
+func (x *SSL_WrapperPacket) GetGeometry() *SSL_GeometryData {
+ if x != nil {
+ return x.Geometry
+ }
+ return nil
+}
+
+var File_ssl_vision_wrapper_proto protoreflect.FileDescriptor
+
+var file_ssl_vision_wrapper_proto_rawDesc = []byte{
+ 0x0a, 0x18, 0x73, 0x73, 0x6c, 0x5f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x77, 0x72, 0x61,
+ 0x70, 0x70, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1a, 0x73, 0x73, 0x6c, 0x5f,
+ 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+ 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x73, 0x73, 0x6c, 0x5f, 0x76, 0x69, 0x73, 0x69,
+ 0x6f, 0x6e, 0x5f, 0x67, 0x65, 0x6f, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+ 0x6f, 0x22, 0x75, 0x0a, 0x11, 0x53, 0x53, 0x4c, 0x5f, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72,
+ 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x31, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74,
+ 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x53, 0x53, 0x4c, 0x5f,
+ 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x52, 0x09,
+ 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x08, 0x67, 0x65, 0x6f,
+ 0x6d, 0x65, 0x74, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x53, 0x53,
+ 0x4c, 0x5f, 0x47, 0x65, 0x6f, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x52, 0x08,
+ 0x67, 0x65, 0x6f, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x42, 0x42, 0x5a, 0x40, 0x67, 0x69, 0x74, 0x68,
+ 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x52, 0x6f, 0x62, 0x6f, 0x43, 0x75, 0x70, 0x2d, 0x53,
+ 0x53, 0x4c, 0x2f, 0x73, 0x73, 0x6c, 0x2d, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2f, 0x69, 0x6e, 0x74,
+ 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e,
+}
+
+var (
+ file_ssl_vision_wrapper_proto_rawDescOnce sync.Once
+ file_ssl_vision_wrapper_proto_rawDescData = file_ssl_vision_wrapper_proto_rawDesc
+)
+
+func file_ssl_vision_wrapper_proto_rawDescGZIP() []byte {
+ file_ssl_vision_wrapper_proto_rawDescOnce.Do(func() {
+ file_ssl_vision_wrapper_proto_rawDescData = protoimpl.X.CompressGZIP(file_ssl_vision_wrapper_proto_rawDescData)
+ })
+ return file_ssl_vision_wrapper_proto_rawDescData
+}
+
+var file_ssl_vision_wrapper_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
+var file_ssl_vision_wrapper_proto_goTypes = []interface{}{
+ (*SSL_WrapperPacket)(nil), // 0: SSL_WrapperPacket
+ (*SSL_DetectionFrame)(nil), // 1: SSL_DetectionFrame
+ (*SSL_GeometryData)(nil), // 2: SSL_GeometryData
+}
+var file_ssl_vision_wrapper_proto_depIdxs = []int32{
+ 1, // 0: SSL_WrapperPacket.detection:type_name -> SSL_DetectionFrame
+ 2, // 1: SSL_WrapperPacket.geometry:type_name -> SSL_GeometryData
+ 2, // [2:2] is the sub-list for method output_type
+ 2, // [2:2] is the sub-list for method input_type
+ 2, // [2:2] is the sub-list for extension type_name
+ 2, // [2:2] is the sub-list for extension extendee
+ 0, // [0:2] is the sub-list for field type_name
+}
+
+func init() { file_ssl_vision_wrapper_proto_init() }
+func file_ssl_vision_wrapper_proto_init() {
+ if File_ssl_vision_wrapper_proto != nil {
+ return
+ }
+ file_ssl_vision_detection_proto_init()
+ file_ssl_vision_geometry_proto_init()
+ if !protoimpl.UnsafeEnabled {
+ file_ssl_vision_wrapper_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*SSL_WrapperPacket); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ }
+ type x struct{}
+ out := protoimpl.TypeBuilder{
+ File: protoimpl.DescBuilder{
+ GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+ RawDescriptor: file_ssl_vision_wrapper_proto_rawDesc,
+ NumEnums: 0,
+ NumMessages: 1,
+ NumExtensions: 0,
+ NumServices: 0,
+ },
+ GoTypes: file_ssl_vision_wrapper_proto_goTypes,
+ DependencyIndexes: file_ssl_vision_wrapper_proto_depIdxs,
+ MessageInfos: file_ssl_vision_wrapper_proto_msgTypes,
+ }.Build()
+ File_ssl_vision_wrapper_proto = out.File
+ file_ssl_vision_wrapper_proto_rawDesc = nil
+ file_ssl_vision_wrapper_proto_goTypes = nil
+ file_ssl_vision_wrapper_proto_depIdxs = nil
+}
diff --git a/proto/ssl_gc_common.proto b/proto/ssl_gc_common.proto
new file mode 100644
index 0000000..c217fd7
--- /dev/null
+++ b/proto/ssl_gc_common.proto
@@ -0,0 +1,28 @@
+syntax = "proto2";
+
+option go_package = "github.com/RoboCup-SSL/ssl-simulation-controller/internal/referee";
+
+// Team is either blue or yellow
+enum Team {
+ // team not set
+ UNKNOWN = 0;
+ // yellow team
+ YELLOW = 1;
+ // blue team
+ BLUE = 2;
+}
+
+// RobotId is the combination of a team and a robot id
+message RobotId {
+ // the robot number
+ optional uint32 id = 1;
+ // the team that the robot belongs to
+ optional Team team = 2;
+}
+
+// Division denotes the current division, which influences some rules
+enum Division {
+ DIV_UNKNOWN = 0;
+ DIV_A = 1;
+ DIV_B = 2;
+}
diff --git a/proto/ssl_gc_game_event.proto b/proto/ssl_gc_game_event.proto
new file mode 100644
index 0000000..09d4a56
--- /dev/null
+++ b/proto/ssl_gc_game_event.proto
@@ -0,0 +1,554 @@
+syntax = "proto2";
+
+option go_package = "github.com/RoboCup-SSL/ssl-simulation-controller/internal/referee";
+
+import "ssl_gc_common.proto";
+import "ssl_gc_geometry.proto";
+
+// GameEvent contains exactly one game event
+// Each game event has optional and required fields. The required fields are mandatory to process the event.
+// Some optional fields are only used for visualization, others are required to determine the ball placement position.
+// If fields are missing that are required for the ball placement position, no ball placement command will be issued.
+// Fields are marked optional to make testing and extending of the protocol easier.
+// An autoRef should ideally set all fields, except if there are good reasons to not do so.
+message GameEvent {
+
+ optional Type type = 40;
+
+ // The origins of this game event.
+ // Empty, if it originates from game controller.
+ // Contains autoRef name(s), if it originates from one or more autoRefs.
+ // Ignored if sent by autoRef to game controller.
+ repeated string origin = 41;
+
+ // the event that occurred
+ oneof event {
+
+ // Ball out of field events (stopping)
+
+ BallLeftField ball_left_field_touch_line = 6;
+ BallLeftField ball_left_field_goal_line = 7;
+ AimlessKick aimless_kick = 11;
+
+ // Stopping Fouls
+
+ AttackerTooCloseToDefenseArea attacker_too_close_to_defense_area = 19;
+ DefenderInDefenseArea defender_in_defense_area = 31;
+ BoundaryCrossing boundary_crossing = 43;
+ KeeperHeldBall keeper_held_ball = 13;
+ BotDribbledBallTooFar bot_dribbled_ball_too_far = 17;
+
+ BotPushedBot bot_pushed_bot = 24;
+ BotHeldBallDeliberately bot_held_ball_deliberately = 26;
+ BotTippedOver bot_tipped_over = 27;
+
+ // Non-Stopping Fouls
+
+ AttackerTouchedBallInDefenseArea attacker_touched_ball_in_defense_area = 15;
+ BotKickedBallTooFast bot_kicked_ball_too_fast = 18;
+ BotCrashUnique bot_crash_unique = 22;
+ BotCrashDrawn bot_crash_drawn = 21;
+
+ // Fouls while ball out of play
+
+ DefenderTooCloseToKickPoint defender_too_close_to_kick_point = 29;
+ BotTooFastInStop bot_too_fast_in_stop = 28;
+ BotInterferedPlacement bot_interfered_placement = 20;
+
+ // Scoring goals
+
+ Goal possible_goal = 39;
+ Goal goal = 8;
+ Goal invalid_goal = 44;
+
+ // Other events
+
+ AttackerDoubleTouchedBall attacker_double_touched_ball = 14;
+ PlacementSucceeded placement_succeeded = 5;
+ PenaltyKickFailed penalty_kick_failed = 45;
+
+ NoProgressInGame no_progress_in_game = 2;
+ PlacementFailed placement_failed = 3;
+ MultipleCards multiple_cards = 32;
+ MultipleFouls multiple_fouls = 34;
+ BotSubstitution bot_substitution = 37;
+ TooManyRobots too_many_robots = 38;
+ ChallengeFlag challenge_flag = 46;
+ EmergencyStop emergency_stop = 47;
+
+ UnsportingBehaviorMinor unsporting_behavior_minor = 35;
+ UnsportingBehaviorMajor unsporting_behavior_major = 36;
+
+ // Deprecated events
+
+ // replaced by ready_to_continue flag
+ Prepared prepared = 1 [deprecated = true];
+ // obsolete
+ IndirectGoal indirect_goal = 9 [deprecated = true];
+ // replaced by the meta-information in the possible_goal event
+ ChippedGoal chipped_goal = 10 [deprecated = true];
+ // obsolete
+ KickTimeout kick_timeout = 12 [deprecated = true];
+ // rule removed
+ AttackerTouchedOpponentInDefenseArea attacker_touched_opponent_in_defense_area = 16 [deprecated = true];
+ // obsolete
+ AttackerTouchedOpponentInDefenseArea attacker_touched_opponent_in_defense_area_skipped = 42 [deprecated = true];
+ // obsolete
+ BotCrashUnique bot_crash_unique_skipped = 23 [deprecated = true];
+ // can not be used as long as autoRefs do not judge pushing
+ BotPushedBot bot_pushed_bot_skipped = 25 [deprecated = true];
+ // rule removed
+ DefenderInDefenseAreaPartially defender_in_defense_area_partially = 30 [deprecated = true];
+ // the referee msg already indicates this
+ MultiplePlacementFailures multiple_placement_failures = 33 [deprecated = true];
+ }
+
+ // the ball left the field normally
+ message BallLeftField {
+ // the team that last touched the ball
+ required Team by_team = 1;
+ // the bot that last touched the ball
+ optional uint32 by_bot = 2;
+ // the location where the ball left the field [m]
+ optional Vector2 location = 3;
+ }
+ // the ball left the field via goal line and a team committed an aimless kick
+ message AimlessKick {
+ // the team that last touched the ball
+ required Team by_team = 1;
+ // the bot that last touched the ball
+ optional uint32 by_bot = 2;
+ // the location where the ball left the field [m]
+ optional Vector2 location = 3;
+ // the location where the ball was last touched [m]
+ optional Vector2 kick_location = 4;
+ }
+ // a team shot a goal
+ message Goal {
+ // the team that scored the goal
+ required Team by_team = 1;
+ // the team that shot the goal (different from by_team for own goals)
+ optional Team kicking_team = 6;
+ // the bot that shot the goal
+ optional uint32 kicking_bot = 2;
+ // the location where the ball entered the goal [m]
+ optional Vector2 location = 3;
+ // the location where the ball was kicked (for deciding if this was a valid goal) [m]
+ optional Vector2 kick_location = 4;
+ // the maximum height the ball reached during the goal kick (for deciding if this was a valid goal) [m]
+ optional float max_ball_height = 5;
+ // number of robots of scoring team when the ball entered the goal (for deciding if this was a valid goal)
+ optional uint32 num_robots_by_team = 7;
+ // The UNIX timestamp [μs] when the scoring team last touched the ball
+ optional uint64 last_touch_by_team = 8;
+ // An additional message with e.g. a reason for invalid goals
+ optional string message = 9;
+ }
+ // the ball entered the goal directly during an indirect free kick
+ message IndirectGoal {
+ // the team that tried to shoot the goal
+ required Team by_team = 1;
+ // the bot that kicked the ball - at least the team must be set
+ optional uint32 by_bot = 2;
+ // the location where the ball entered the goal [m]
+ optional Vector2 location = 3;
+ // the location where the ball was kicked [m]
+ optional Vector2 kick_location = 4;
+ }
+ // the ball entered the goal, but was initially chipped
+ message ChippedGoal {
+ // the team that tried to shoot the goal
+ required Team by_team = 1;
+ // the bot that kicked the ball
+ optional uint32 by_bot = 2;
+ // the location where the ball entered the goal [m]
+ optional Vector2 location = 3;
+ // the location where the ball was kicked [m]
+ optional Vector2 kick_location = 4;
+ // the maximum height [m] of the ball, before it entered the goal and since the last kick [m]
+ optional float max_ball_height = 5;
+ }
+ // a bot moved too fast while the game was stopped
+ message BotTooFastInStop {
+ // the team that found guilty
+ required Team by_team = 1;
+ // the bot that was too fast
+ optional uint32 by_bot = 2;
+ // the location of the bot [m]
+ optional Vector2 location = 3;
+ // the bot speed [m/s]
+ optional float speed = 4;
+ }
+ // a bot of the defending team got too close to the kick point during a free kick
+ message DefenderTooCloseToKickPoint {
+ // the team that was found guilty
+ required Team by_team = 1;
+ // the bot that violates the distance to the kick point
+ optional uint32 by_bot = 2;
+ // the location of the bot [m]
+ optional Vector2 location = 3;
+ // the distance [m] from bot to the kick point (including the minimum radius)
+ optional float distance = 4;
+ }
+ // two robots crashed into each other with similar speeds
+ message BotCrashDrawn {
+ // the bot of the yellow team
+ optional uint32 bot_yellow = 1;
+ // the bot of the blue team
+ optional uint32 bot_blue = 2;
+ // the location of the crash (center between both bots) [m]
+ optional Vector2 location = 3;
+ // the calculated crash speed [m/s] of the two bots
+ optional float crash_speed = 4;
+ // the difference [m/s] of the velocity of the two bots
+ optional float speed_diff = 5;
+ // the angle [rad] in the range [0, π] of the bot velocity vectors
+ // an angle of 0 rad ( 0°) means, the bots barely touched each other
+ // an angle of π rad (180°) means, the bots crashed frontal into each other
+ optional float crash_angle = 6;
+ }
+ // two robots crashed into each other and one team was found guilty to due significant speed difference
+ message BotCrashUnique {
+ // the team that caused the crash
+ required Team by_team = 1;
+ // the bot that caused the crash
+ optional uint32 violator = 2;
+ // the bot of the opposite team that was involved in the crash
+ optional uint32 victim = 3;
+ // the location of the crash (center between both bots) [m]
+ optional Vector2 location = 4;
+ // the calculated crash speed vector [m/s] of the two bots
+ optional float crash_speed = 5;
+ // the difference [m/s] of the velocity of the two bots
+ optional float speed_diff = 6;
+ // the angle [rad] in the range [0, π] of the bot velocity vectors
+ // an angle of 0 rad ( 0°) means, the bots barely touched each other
+ // an angle of π rad (180°) means, the bots crashed frontal into each other
+ optional float crash_angle = 7;
+ }
+ // a bot pushed another bot over a significant distance
+ message BotPushedBot {
+ // the team that pushed the other team
+ required Team by_team = 1;
+ // the bot that pushed the other bot
+ optional uint32 violator = 2;
+ // the bot of the opposite team that was pushed
+ optional uint32 victim = 3;
+ // the location of the push (center between both bots) [m]
+ optional Vector2 location = 4;
+ // the pushed distance [m]
+ optional float pushed_distance = 5;
+ }
+ // a bot tipped over
+ message BotTippedOver {
+ // the team that found guilty
+ required Team by_team = 1;
+ // the bot that tipped over
+ optional uint32 by_bot = 2;
+ // the location of the bot [m]
+ optional Vector2 location = 3;
+ // the location of the ball at the moment when this foul occurred [m]
+ optional Vector2 ball_location = 4;
+ }
+ // a defender other than the keeper was fully located inside its own defense and touched the ball
+ message DefenderInDefenseArea {
+ // the team that found guilty
+ required Team by_team = 1;
+ // the bot that is inside the penalty area
+ optional uint32 by_bot = 2;
+ // the location of the bot [m]
+ optional Vector2 location = 3;
+ // the distance [m] from bot case to the nearest point outside the defense area
+ optional float distance = 4;
+ }
+ // a defender other than the keeper was partially located inside its own defense area and touched the ball
+ message DefenderInDefenseAreaPartially {
+ // the team that found guilty
+ required Team by_team = 1;
+ // the bot that is partially inside the penalty area
+ optional uint32 by_bot = 2;
+ // the location of the bot
+ optional Vector2 location = 3;
+ // the distance [m] that the bot is inside the penalty area
+ optional float distance = 4;
+ // the location of the ball at the moment when this foul occurred [m]
+ optional Vector2 ball_location = 5;
+ }
+ // an attacker touched the ball inside the opponent defense area
+ message AttackerTouchedBallInDefenseArea {
+ // the team that found guilty
+ required Team by_team = 1;
+ // the bot that is inside the penalty area
+ optional uint32 by_bot = 2;
+ // the location of the bot [m]
+ optional Vector2 location = 3;
+ // the distance [m] that the bot is inside the penalty area
+ optional float distance = 4;
+ }
+ // a bot kicked the ball too fast
+ message BotKickedBallTooFast {
+ // the team that found guilty
+ required Team by_team = 1;
+ // the bot that kicked too fast
+ optional uint32 by_bot = 2;
+ // the location of the ball at the time of the highest speed [m]
+ optional Vector2 location = 3;
+ // the absolute initial ball speed (kick speed) [m/s]
+ optional float initial_ball_speed = 4;
+ // was the ball chipped?
+ optional bool chipped = 5;
+ }
+ // a bot dribbled to ball too far
+ message BotDribbledBallTooFar {
+ // the team that found guilty
+ required Team by_team = 1;
+ // the bot that dribbled too far
+ optional uint32 by_bot = 2;
+ // the location where the dribbling started [m]
+ optional Vector2 start = 3;
+ // the location where the maximum dribbling distance was reached [m]
+ optional Vector2 end = 4;
+ }
+ // an attacker touched the opponent robot inside defense area
+ message AttackerTouchedOpponentInDefenseArea {
+ // the team that found guilty
+ required Team by_team = 1;
+ // the bot that touched the opponent robot
+ optional uint32 by_bot = 2;
+ // the bot of the opposite team that was touched
+ optional uint32 victim = 4;
+ // the location of the contact point between both bots [m]
+ optional Vector2 location = 3;
+ }
+ // an attacker touched the ball multiple times when it was not allowed to
+ message AttackerDoubleTouchedBall {
+ // the team that found guilty
+ required Team by_team = 1;
+ // the bot that touched the ball twice
+ optional uint32 by_bot = 2;
+ // the location of the ball when it was first touched [m]
+ optional Vector2 location = 3;
+ }
+ // an attacker was located too near to the opponent defense area during stop or free kick
+ message AttackerTooCloseToDefenseArea {
+ // the team that found guilty
+ required Team by_team = 1;
+ // the bot that is too close to the defense area
+ optional uint32 by_bot = 2;
+ // the location of the bot [m]
+ optional Vector2 location = 3;
+ // the distance [m] of the bot to the penalty area
+ optional float distance = 4;
+ // the location of the ball at the moment when this foul occurred [m]
+ optional Vector2 ball_location = 5;
+ }
+ // a bot held the ball for too long
+ message BotHeldBallDeliberately {
+ // the team that found guilty
+ required Team by_team = 1;
+ // the bot that holds the ball
+ optional uint32 by_bot = 2;
+ // the location of the ball [m]
+ optional Vector2 location = 3;
+ // the duration [s] that the bot hold the ball
+ optional float duration = 4;
+ }
+ // a bot interfered the ball placement of the other team
+ message BotInterferedPlacement {
+ // the team that found guilty
+ required Team by_team = 1;
+ // the bot that interfered the placement
+ optional uint32 by_bot = 2;
+ // the location of the bot [m]
+ optional Vector2 location = 3;
+ }
+ // a team collected multiple cards (yellow and red), which results in a penalty kick
+ message MultipleCards {
+ // the team that received multiple yellow cards
+ required Team by_team = 1;
+ }
+ // a team collected multiple fouls, which results in a yellow card
+ message MultipleFouls {
+ // the team that collected multiple fouls
+ required Team by_team = 1;
+ }
+ // a team failed to place the ball multiple times in a row
+ message MultiplePlacementFailures {
+ // the team that failed multiple times
+ required Team by_team = 1;
+ }
+ // timeout waiting for the attacking team to perform the free kick
+ message KickTimeout {
+ // the team that that should have kicked
+ required Team by_team = 1;
+ // the location of the ball [m]
+ optional Vector2 location = 2;
+ // the time [s] that was waited
+ optional float time = 3;
+ }
+ // game was stuck
+ message NoProgressInGame {
+ // the location of the ball
+ optional Vector2 location = 1;
+ // the time [s] that was waited
+ optional float time = 2;
+ }
+ // ball placement failed
+ message PlacementFailed {
+ // the team that failed
+ required Team by_team = 1;
+ // the remaining distance [m] from ball to placement position
+ optional float remaining_distance = 2;
+ }
+ // a team was found guilty for minor unsporting behavior
+ message UnsportingBehaviorMinor {
+ // the team that found guilty
+ required Team by_team = 1;
+ // an explanation of the situation and decision
+ required string reason = 2;
+ }
+ // a team was found guilty for major unsporting behavior
+ message UnsportingBehaviorMajor {
+ // the team that found guilty
+ required Team by_team = 1;
+ // an explanation of the situation and decision
+ required string reason = 2;
+ }
+ // a keeper held the ball in its defense area for too long
+ message KeeperHeldBall {
+ // the team that found guilty
+ required Team by_team = 1;
+ // the location of the ball [m]
+ optional Vector2 location = 2;
+ // the duration [s] that the keeper hold the ball
+ optional float duration = 3;
+ }
+ // a team successfully placed the ball
+ message PlacementSucceeded {
+ // the team that did the placement
+ required Team by_team = 1;
+ // the time [s] taken for placing the ball
+ optional float time_taken = 2;
+ // the distance [m] between placement location and actual ball position
+ optional float precision = 3;
+ // the distance [m] between the initial ball location and the placement position
+ optional float distance = 4;
+ }
+ // both teams are prepared - all conditions are met to continue (with kickoff or penalty kick)
+ message Prepared {
+ // the time [s] taken for preparing
+ optional float time_taken = 1;
+ }
+ // bots are being substituted by a team
+ message BotSubstitution {
+ // the team that substitutes robots
+ required Team by_team = 1;
+ }
+ // A challenge flag, requested by a team previously, is flagged
+ message ChallengeFlag {
+ // the team that substitutes robots
+ required Team by_team = 1;
+ }
+ // An emergency stop, requested by team previously, occurred
+ message EmergencyStop {
+ // the team that substitutes robots
+ required Team by_team = 1;
+ }
+ // a team has too many robots on the field
+ message TooManyRobots {
+ // the team that has too many robots
+ required Team by_team = 1;
+ // number of robots allowed at the moment
+ optional int32 num_robots_allowed = 2;
+ // number of robots currently on the field
+ optional int32 num_robots_on_field = 3;
+ // the location of the ball at the moment when this foul occurred [m]
+ optional Vector2 ball_location = 4;
+ }
+ // a robot chipped the ball over the field boundary out of the playing surface
+ message BoundaryCrossing {
+ // the team that has too many robots
+ required Team by_team = 1;
+ // the location of the ball [m]
+ optional Vector2 location = 2;
+ }
+ // the penalty kick failed (by time or by keeper)
+ message PenaltyKickFailed {
+ // the team that last touched the ball
+ required Team by_team = 1;
+ // the location of the ball at the moment of this event [m]
+ optional Vector2 location = 2;
+ }
+
+ enum Type {
+ UNKNOWN_GAME_EVENT_TYPE = 0;
+
+ // Ball out of field events (stopping)
+
+ BALL_LEFT_FIELD_TOUCH_LINE = 6; // triggered by autoRef
+ BALL_LEFT_FIELD_GOAL_LINE = 7; // triggered by autoRef
+ AIMLESS_KICK = 11; // triggered by autoRef
+
+ // Stopping Fouls
+
+ ATTACKER_TOO_CLOSE_TO_DEFENSE_AREA = 19; // triggered by autoRef
+ DEFENDER_IN_DEFENSE_AREA = 31; // triggered by autoRef
+ BOUNDARY_CROSSING = 41; // triggered by autoRef
+ KEEPER_HELD_BALL = 13; // triggered by GC
+ BOT_DRIBBLED_BALL_TOO_FAR = 17; // triggered by autoRef
+
+ BOT_PUSHED_BOT = 24; // triggered by human ref
+ BOT_HELD_BALL_DELIBERATELY = 26; // triggered by human ref
+ BOT_TIPPED_OVER = 27; // triggered by human ref
+
+ // Non-Stopping Fouls
+
+ ATTACKER_TOUCHED_BALL_IN_DEFENSE_AREA = 15; // triggered by autoRef
+ BOT_KICKED_BALL_TOO_FAST = 18; // triggered by autoRef
+ BOT_CRASH_UNIQUE = 22; // triggered by autoRef
+ BOT_CRASH_DRAWN = 21; // triggered by autoRef
+
+ // Fouls while ball out of play
+
+ DEFENDER_TOO_CLOSE_TO_KICK_POINT = 29; // triggered by autoRef
+ BOT_TOO_FAST_IN_STOP = 28; // triggered by autoRef
+ BOT_INTERFERED_PLACEMENT = 20; // triggered by autoRef
+
+ // Scoring goals
+
+ POSSIBLE_GOAL = 39; // triggered by autoRef
+ GOAL = 8; // triggered by GC
+ INVALID_GOAL = 42; // triggered by GC
+
+ // Other events
+
+ ATTACKER_DOUBLE_TOUCHED_BALL = 14; // triggered by autoRef
+ PLACEMENT_SUCCEEDED = 5; // triggered by autoRef
+ PENALTY_KICK_FAILED = 43; // triggered by GC and autoRef
+
+ NO_PROGRESS_IN_GAME = 2; // triggered by GC
+ PLACEMENT_FAILED = 3; // triggered by GC
+ MULTIPLE_CARDS = 32; // triggered by GC
+ MULTIPLE_FOULS = 34; // triggered by GC
+ BOT_SUBSTITUTION = 37; // triggered by GC
+ TOO_MANY_ROBOTS = 38; // triggered by GC
+ CHALLENGE_FLAG = 44; // triggered by GC
+ EMERGENCY_STOP = 45; // triggered by GC
+
+ UNSPORTING_BEHAVIOR_MINOR = 35; // triggered by human ref
+ UNSPORTING_BEHAVIOR_MAJOR = 36; // triggered by human ref
+
+ // Deprecated events
+
+ PREPARED = 1 [deprecated = true];
+ INDIRECT_GOAL = 9 [deprecated = true];
+ CHIPPED_GOAL = 10 [deprecated = true];
+ KICK_TIMEOUT = 12 [deprecated = true];
+ ATTACKER_TOUCHED_OPPONENT_IN_DEFENSE_AREA = 16 [deprecated = true];
+ ATTACKER_TOUCHED_OPPONENT_IN_DEFENSE_AREA_SKIPPED = 40 [deprecated = true];
+ BOT_CRASH_UNIQUE_SKIPPED = 23 [deprecated = true];
+ BOT_PUSHED_BOT_SKIPPED = 25 [deprecated = true];
+ DEFENDER_IN_DEFENSE_AREA_PARTIALLY = 30 [deprecated = true];
+ MULTIPLE_PLACEMENT_FAILURES = 33 [deprecated = true];
+ }
+}
diff --git a/proto/ssl_gc_geometry.proto b/proto/ssl_gc_geometry.proto
new file mode 100644
index 0000000..daf3593
--- /dev/null
+++ b/proto/ssl_gc_geometry.proto
@@ -0,0 +1,16 @@
+syntax = "proto2";
+
+option go_package = "github.com/RoboCup-SSL/ssl-simulation-controller/internal/geom";
+
+// A vector with two dimensions
+message Vector2 {
+ required float x = 1;
+ required float y = 2;
+}
+
+// A vector with three dimensions
+message Vector3 {
+ required float x = 1;
+ required float y = 2;
+ required float z = 3;
+}
diff --git a/proto/ssl_gc_referee_message.proto b/proto/ssl_gc_referee_message.proto
new file mode 100644
index 0000000..f604e1b
--- /dev/null
+++ b/proto/ssl_gc_referee_message.proto
@@ -0,0 +1,209 @@
+syntax = "proto2";
+
+option go_package = "github.com/RoboCup-SSL/ssl-simulation-controller/internal/referee";
+
+import "ssl_gc_game_event.proto";
+
+// Each UDP packet contains one of these messages.
+message Referee {
+ // The UNIX timestamp when the packet was sent, in microseconds.
+ // Divide by 1,000,000 to get a time_t.
+ required uint64 packet_timestamp = 1;
+
+ // These are the "coarse" stages of the game.
+ enum Stage {
+ // The first half is about to start.
+ // A kickoff is called within this stage.
+ // This stage ends with the NORMAL_START.
+ NORMAL_FIRST_HALF_PRE = 0;
+ // The first half of the normal game, before half time.
+ NORMAL_FIRST_HALF = 1;
+ // Half time between first and second halves.
+ NORMAL_HALF_TIME = 2;
+ // The second half is about to start.
+ // A kickoff is called within this stage.
+ // This stage ends with the NORMAL_START.
+ NORMAL_SECOND_HALF_PRE = 3;
+ // The second half of the normal game, after half time.
+ NORMAL_SECOND_HALF = 4;
+ // The break before extra time.
+ EXTRA_TIME_BREAK = 5;
+ // The first half of extra time is about to start.
+ // A kickoff is called within this stage.
+ // This stage ends with the NORMAL_START.
+ EXTRA_FIRST_HALF_PRE = 6;
+ // The first half of extra time.
+ EXTRA_FIRST_HALF = 7;
+ // Half time between first and second extra halves.
+ EXTRA_HALF_TIME = 8;
+ // The second half of extra time is about to start.
+ // A kickoff is called within this stage.
+ // This stage ends with the NORMAL_START.
+ EXTRA_SECOND_HALF_PRE = 9;
+ // The second half of extra time.
+ EXTRA_SECOND_HALF = 10;
+ // The break before penalty shootout.
+ PENALTY_SHOOTOUT_BREAK = 11;
+ // The penalty shootout.
+ PENALTY_SHOOTOUT = 12;
+ // The game is over.
+ POST_GAME = 13;
+ }
+ required Stage stage = 2;
+
+ // The number of microseconds left in the stage.
+ // The following stages have this value; the rest do not:
+ // NORMAL_FIRST_HALF
+ // NORMAL_HALF_TIME
+ // NORMAL_SECOND_HALF
+ // EXTRA_TIME_BREAK
+ // EXTRA_FIRST_HALF
+ // EXTRA_HALF_TIME
+ // EXTRA_SECOND_HALF
+ // PENALTY_SHOOTOUT_BREAK
+ //
+ // If the stage runs over its specified time, this value
+ // becomes negative.
+ optional sint32 stage_time_left = 3;
+
+ // These are the "fine" states of play on the field.
+ enum Command {
+ // All robots should completely stop moving.
+ HALT = 0;
+ // Robots must keep 50 cm from the ball.
+ STOP = 1;
+ // A prepared kickoff or penalty may now be taken.
+ NORMAL_START = 2;
+ // The ball is dropped and free for either team.
+ FORCE_START = 3;
+ // The yellow team may move into kickoff position.
+ PREPARE_KICKOFF_YELLOW = 4;
+ // The blue team may move into kickoff position.
+ PREPARE_KICKOFF_BLUE = 5;
+ // The yellow team may move into penalty position.
+ PREPARE_PENALTY_YELLOW = 6;
+ // The blue team may move into penalty position.
+ PREPARE_PENALTY_BLUE = 7;
+ // The yellow team may take a direct free kick.
+ DIRECT_FREE_YELLOW = 8;
+ // The blue team may take a direct free kick.
+ DIRECT_FREE_BLUE = 9;
+ // The yellow team may take an indirect free kick.
+ INDIRECT_FREE_YELLOW = 10;
+ // The blue team may take an indirect free kick.
+ INDIRECT_FREE_BLUE = 11;
+ // The yellow team is currently in a timeout.
+ TIMEOUT_YELLOW = 12;
+ // The blue team is currently in a timeout.
+ TIMEOUT_BLUE = 13;
+ // The yellow team just scored a goal.
+ // For information only.
+ // For rules compliance, teams must treat as STOP.
+ // Deprecated: Use the score field from the team infos instead. That way, you can also detect revoked goals.
+ GOAL_YELLOW = 14 [deprecated = true];
+ // The blue team just scored a goal. See also GOAL_YELLOW.
+ GOAL_BLUE = 15 [deprecated = true];
+ // Equivalent to STOP, but the yellow team must pick up the ball and
+ // drop it in the Designated Position.
+ BALL_PLACEMENT_YELLOW = 16;
+ // Equivalent to STOP, but the blue team must pick up the ball and drop
+ // it in the Designated Position.
+ BALL_PLACEMENT_BLUE = 17;
+ }
+ required Command command = 4;
+
+ // The number of commands issued since startup (mod 2^32).
+ required uint32 command_counter = 5;
+
+ // The UNIX timestamp when the command was issued, in microseconds.
+ // This value changes only when a new command is issued, not on each packet.
+ required uint64 command_timestamp = 6;
+
+ // Information about a single team.
+ message TeamInfo {
+ // The team's name (empty string if operator has not typed anything).
+ required string name = 1;
+ // The number of goals scored by the team during normal play and overtime.
+ required uint32 score = 2;
+ // The number of red cards issued to the team since the beginning of the game.
+ required uint32 red_cards = 3;
+ // The amount of time (in microseconds) left on each yellow card issued to the team.
+ // If no yellow cards are issued, this array has no elements.
+ // Otherwise, times are ordered from smallest to largest.
+ repeated uint32 yellow_card_times = 4 [packed = true];
+ // The total number of yellow cards ever issued to the team.
+ required uint32 yellow_cards = 5;
+ // The number of timeouts this team can still call.
+ // If in a timeout right now, that timeout is excluded.
+ required uint32 timeouts = 6;
+ // The number of microseconds of timeout this team can use.
+ required uint32 timeout_time = 7;
+ // The pattern number of this team's goalkeeper.
+ required uint32 goalkeeper = 8;
+ // The total number of countable fouls that act towards yellow cards
+ optional uint32 foul_counter = 9;
+ // The number of consecutive ball placement failures of this team
+ optional uint32 ball_placement_failures = 10;
+ // Indicate if the team is able and allowed to place the ball
+ optional bool can_place_ball = 12;
+ // The maximum number of bots allowed on the field based on division and cards
+ optional uint32 max_allowed_bots = 13;
+ // The team has submitted an intent to substitute one or more robots at the next chance
+ optional bool bot_substitution_intent = 14;
+ // Indicate if the team reached the maximum allowed ball placement failures and is thus not allowed to place the ball anymore
+ optional bool ball_placement_failures_reached = 15;
+ }
+
+ // Information about the two teams.
+ required TeamInfo yellow = 7;
+ required TeamInfo blue = 8;
+
+ // The coordinates of the Designated Position. These are measured in
+ // millimetres and correspond to SSL-Vision coordinates. These fields are
+ // always either both present (in the case of a ball placement command) or
+ // both absent (in the case of any other command).
+ message Point {
+ required float x = 1;
+ required float y = 2;
+ }
+ optional Point designated_position = 9;
+
+ // Information about the direction of play.
+ // True, if the blue team will have it's goal on the positive x-axis of the ssl-vision coordinate system.
+ // Obviously, the yellow team will play on the opposite half.
+ optional bool blue_team_on_positive_half = 10;
+
+ // The game event that caused the referee command.
+ // deprecated in favor of game_events.
+// optional Game_Event game_event = 11 [deprecated = true];
+ reserved 11;
+
+ // The command that will be issued after the current stoppage and ball placement to continue the game.
+ optional Command next_command = 12;
+
+ // All game events that were detected since the last RUNNING state.
+ // Will be cleared as soon as the game is continued.
+ reserved 13;
+ repeated GameEvent game_events = 16;
+
+ // All non-finished proposed game events that may be processed next.
+ reserved 14;
+ repeated GameEventProposalGroup game_event_proposals = 17;
+
+ // The time in microseconds that is remaining until the current action times out
+ // The time will not be reset. It can get negative.
+ // An autoRef would raise an appropriate event, if the time gets negative.
+ // Possible actions where this time is relevant:
+ // * free kicks
+ // * kickoff, penalty kick, force start
+ // * ball placement
+ optional int32 current_action_time_remaining = 15;
+}
+
+// List of matching proposals
+message GameEventProposalGroup {
+ // The proposed game event.
+ repeated GameEvent game_event = 1;
+ // Whether the proposal group was accepted
+ optional bool accepted = 2;
+}
diff --git a/proto/ssl_simulation_config.proto b/proto/ssl_simulation_config.proto
new file mode 100644
index 0000000..f7f84c7
--- /dev/null
+++ b/proto/ssl_simulation_config.proto
@@ -0,0 +1,78 @@
+syntax = "proto2";
+option go_package = "github.com/RoboCup-SSL/ssl-simulation-controller/internal/simctl";
+package edu.tigers.sumatra.simulation;
+
+import "ssl_gc_common.proto";
+import "ssl_vision_geometry.proto";
+import "google/protobuf/any.proto";
+
+// Movement limits for a robot
+message RobotLimits {
+ // Max absolute speed-up acceleration [m/s^2]
+ optional float acc_speedup_absolute_max = 1;
+ // Max angular speed-up acceleration [rad/s^2]
+ optional float acc_speedup_angular_max = 2;
+ // Max absolute brake acceleration [m/s^2]
+ optional float acc_brake_absolute_max = 3;
+ // Max angular brake acceleration [rad/s^2]
+ optional float acc_brake_angular_max = 4;
+ // Max absolute velocity [m/s]
+ optional float vel_absolute_max = 5;
+ // Max angular velocity [rad/s]
+ optional float vel_angular_max = 6;
+}
+
+// Robot wheel angle configuration
+// all angles are relative to looking forward,
+// all wheels / angles are clockwise
+message RobotWheelAngles {
+ // Angle front right [rad]
+ required float front_right = 1;
+ // Angle back right [rad]
+ required float back_right = 2;
+ // Angle back left [rad]
+ required float back_left = 3;
+ // Angle front left [rad]
+ required float front_left = 4;
+}
+
+// Specs of a robot
+message RobotSpecs {
+ // Id of the robot
+ required RobotId id = 1;
+ // Robot radius [m]
+ optional float radius = 2 [default = 0.09];
+ // Robot height [m]
+ optional float height = 3 [default = 0.15];
+ // Robot mass [kg]
+ optional float mass = 4;
+ // Max linear kick speed [m/s] (unset = unlimited)
+ optional float max_linear_kick_speed = 7;
+ // Max chip kick speed [m/s] (unset = unlimited)
+ optional float max_chip_kick_speed = 8;
+ // Width of the dribbler [m] (implicitly defines the distance from robot center to dribbler and opening angle)
+ optional float dribbler_width = 9;
+ // Movement limits
+ optional RobotLimits limits = 10;
+ // Wheel angle configuration
+ optional RobotWheelAngles wheel_angles = 13;
+ // Custom robot spec for specific simulators (the protobuf files are managed by the simulators)
+ optional google.protobuf.Any custom = 14;
+}
+
+message RealismConfig {
+ // Custom config for specific simulators (the protobuf files are managed by the simulators)
+ optional google.protobuf.Any custom = 1;
+}
+
+// Change the simulator configuration
+message SimulatorConfig {
+ // Update the geometry
+ optional SSL_GeometryData geometry = 1;
+ // Update the robot specs
+ repeated RobotSpecs robot_specs = 2;
+ // Update realism configuration
+ optional RealismConfig realism_config = 3;
+ // Change the vision publish port
+ optional uint32 vision_port = 4;
+}
\ No newline at end of file
diff --git a/proto/ssl_simulation_control.proto b/proto/ssl_simulation_control.proto
new file mode 100644
index 0000000..47ff308
--- /dev/null
+++ b/proto/ssl_simulation_control.proto
@@ -0,0 +1,74 @@
+syntax = "proto2";
+option go_package = "github.com/RoboCup-SSL/ssl-simulation-controller/internal/simctl";
+package edu.tigers.sumatra.simulation;
+
+import "ssl_gc_common.proto";
+import "ssl_simulation_config.proto";
+import "ssl_simulation_error.proto";
+
+// Teleport the ball to a new location and optionally set it to some velocity
+message TeleportBall {
+ // x-coordinate [m]
+ optional float x = 1;
+ // y-coordinate [m]
+ optional float y = 2;
+ // z-coordinate (height) [m]
+ optional float z = 3;
+ // Velocity in x-direction [m/s]
+ optional float vx = 4;
+ // Velocity in y-direction [m/s]
+ optional float vy = 5;
+ // Velocity in z-direction [m/s]
+ optional float vz = 6;
+ // Teleport the ball safely to the target, for example by
+ // moving robots out of the way in case of collision and set speed of robots close-by to zero
+ optional bool teleport_safely = 7 [default = false];
+ // Adapt the angular ball velocity such that the ball is rolling
+ optional bool roll = 8 [default = false];
+}
+
+// Teleport a robot to some location and give it a velocity
+message TeleportRobot {
+ // Robot id to teleport
+ required RobotId id = 1;
+ // x-coordinate [m]
+ optional float x = 2;
+ // y-coordinate [m]
+ optional float y = 3;
+ // Orientation [rad], measured from the x-axis counter-clockwise
+ optional float orientation = 4;
+ // Global velocity [m/s] towards x-axis
+ optional float v_x = 5 [default = 0];
+ // Global velocity [m/s] towards y-axis
+ optional float v_y = 6 [default = 0];
+ // Angular velocity [rad/s]
+ optional float v_angular = 7 [default = 0];
+ // Robot should be present on the field?
+ // true -> robot will be added, if it does not exist yet
+ // false -> robot will be removed, if it is present
+ optional bool present = 8;
+}
+
+// Control the simulation
+message SimulatorControl {
+ // Teleport the ball
+ optional TeleportBall teleport_ball = 1;
+ // Teleport robots
+ repeated TeleportRobot teleport_robot = 2;
+ // Change the simulation speed
+ optional float simulation_speed = 3;
+}
+
+// Command from the connected client to the simulator
+message SimulatorCommand {
+ // Control the simulation
+ optional SimulatorControl control = 1;
+ // Configure the simulation
+ optional SimulatorConfig config = 2;
+}
+
+// Response of the simulator to the connected client
+message SimulatorResponse {
+ // List of errors, like using unsupported features
+ repeated SimulatorError errors = 1;
+}
diff --git a/proto/ssl_simulation_error.proto b/proto/ssl_simulation_error.proto
new file mode 100644
index 0000000..6ca4d6c
--- /dev/null
+++ b/proto/ssl_simulation_error.proto
@@ -0,0 +1,11 @@
+syntax = "proto2";
+option go_package = "github.com/RoboCup-SSL/ssl-simulation-controller/internal/simctl";
+package edu.tigers.sumatra.simulation;
+
+// Errors in the simulator
+message SimulatorError {
+ // Unique code of the error for automatic handling on client side
+ optional string code = 1;
+ // Human readable description of the error
+ optional string message = 2;
+}
diff --git a/proto/ssl_vision_detection.proto b/proto/ssl_vision_detection.proto
new file mode 100644
index 0000000..093aea8
--- /dev/null
+++ b/proto/ssl_vision_detection.proto
@@ -0,0 +1,34 @@
+syntax = "proto2";
+
+option go_package = "github.com/RoboCup-SSL/ssl-simulation-controller/internal/vision";
+
+message SSL_DetectionBall {
+ required float confidence = 1;
+ optional uint32 area = 2;
+ required float x = 3;
+ required float y = 4;
+ optional float z = 5;
+ required float pixel_x = 6;
+ required float pixel_y = 7;
+}
+
+message SSL_DetectionRobot {
+ required float confidence = 1;
+ optional uint32 robot_id = 2;
+ required float x = 3;
+ required float y = 4;
+ optional float orientation = 5;
+ required float pixel_x = 6;
+ required float pixel_y = 7;
+ optional float height = 8;
+}
+
+message SSL_DetectionFrame {
+ required uint32 frame_number = 1;
+ required double t_capture = 2;
+ required double t_sent = 3;
+ required uint32 camera_id = 4;
+ repeated SSL_DetectionBall balls = 5;
+ repeated SSL_DetectionRobot robots_yellow = 6;
+ repeated SSL_DetectionRobot robots_blue = 7;
+}
diff --git a/proto/ssl_vision_detection_tracked.proto b/proto/ssl_vision_detection_tracked.proto
new file mode 100644
index 0000000..8e9087e
--- /dev/null
+++ b/proto/ssl_vision_detection_tracked.proto
@@ -0,0 +1,91 @@
+syntax = "proto2";
+
+option go_package = "github.com/RoboCup-SSL/ssl-simulation-controller/internal/tracker";
+
+import "ssl_gc_common.proto";
+import "ssl_gc_geometry.proto";
+
+// Default network address: 224.5.23.2:10010
+
+// Capabilities that a source implementation can have
+enum Capability {
+ CAPABILITY_UNKNOWN = 0;
+ CAPABILITY_DETECT_FLYING_BALLS = 1;
+ CAPABILITY_DETECT_MULTIPLE_BALLS = 2;
+ CAPABILITY_DETECT_KICKED_BALLS = 3;
+}
+
+// A single tracked ball
+message TrackedBall {
+ // The position (x, y, height) [m] in the ssl-vision coordinate system
+ required Vector3 pos = 1;
+
+ // The velocity [m/s] in the ssl-vision coordinate system
+ optional Vector3 vel = 2;
+
+ // The visibility of the ball
+ // A value between 0 (not visible) and 1 (visible)
+ // The exact implementation depends on the source software
+ optional float visibility = 3;
+}
+
+// A ball kicked by a robot, including predictions when the ball will come to a stop
+message KickedBall {
+ // The initial position [m] from which the ball was kicked
+ required Vector2 pos = 1;
+ // The initial velocity [m/s] with which the ball was kicked
+ required Vector3 vel = 2;
+ // The unix timestamp [s] when the kick was performed
+ required double start_timestamp = 3;
+
+ // The predicted unix timestamp [s] when the ball comes to a stop
+ optional double stop_timestamp = 4;
+ // The predicted position [m] at which the ball will come to a stop
+ optional Vector2 stop_pos = 5;
+
+ // The robot that kicked the ball
+ optional RobotId robot_id = 6;
+}
+
+// A single tracked robot
+message TrackedRobot {
+ required RobotId robot_id = 1;
+
+ // The position [m] in the ssl-vision coordinate system
+ required Vector2 pos = 2;
+ // The orientation [rad] in the ssl-vision coordinate system
+ required float orientation = 3;
+
+ // The velocity [m/s] in the ssl-vision coordinate system
+ optional Vector2 vel = 4;
+ // The angular velocity [rad/s] in the ssl-vision coordinate system
+ optional float vel_angular = 5;
+
+ // The visibility of the robot
+ // A value between 0 (not visible) and 1 (visible)
+ // The exact implementation depends on the source software
+ optional float visibility = 6;
+}
+
+// A frame that contains all currently tracked objects on the field on all cameras
+message TrackedFrame {
+ // A monotonous increasing frame counter
+ required uint32 frame_number = 1;
+ // The unix timestamp in [s] of the data
+ // If timestamp is larger than timestamp_captured, the source has applied a prediction already
+ required double timestamp = 2;
+
+ // The list of detected balls
+ // The first ball is the primary one
+ // Sources may add additional balls based on their capabilities
+ repeated TrackedBall balls = 3;
+ // The list of detected robots of both teams
+ repeated TrackedRobot robots = 4;
+
+ // Information about a kicked ball, if the ball was kicked by a robot and is still moving
+ // Note: This field is optional. Some source implementations might not set this at any time
+ optional KickedBall kicked_ball = 5;
+
+ // List of capabilities of the source implementation
+ repeated Capability capabilities = 6;
+}
diff --git a/proto/ssl_vision_geometry.proto b/proto/ssl_vision_geometry.proto
new file mode 100644
index 0000000..ad82d78
--- /dev/null
+++ b/proto/ssl_vision_geometry.proto
@@ -0,0 +1,74 @@
+syntax = "proto2";
+
+option go_package = "github.com/RoboCup-SSL/ssl-simulation-controller/internal/vision";
+
+// A 2D float vector.
+message Vector2f {
+ required float x = 1;
+ required float y = 2;
+}
+
+// Represents a field marking as a line segment represented by a start point p1,
+// and end point p2, and a line thickness. The start and end points are along
+// the center of the line, so the thickness of the line extends by thickness / 2
+// on either side of the line.
+message SSL_FieldLineSegment {
+ // Name of this field marking.
+ required string name = 1;
+ // Start point of the line segment.
+ required Vector2f p1 = 2;
+ // End point of the line segment.
+ required Vector2f p2 = 3;
+ // Thickness of the line segment.
+ required float thickness = 4;
+}
+
+// Represents a field marking as a circular arc segment represented by center point, a
+// start angle, an end angle, and an arc thickness.
+message SSL_FieldCicularArc {
+ // Name of this field marking.
+ required string name = 1;
+ // Center point of the circular arc.
+ required Vector2f center = 2;
+ // Radius of the arc.
+ required float radius = 3;
+ // Start angle in counter-clockwise order.
+ required float a1 = 4;
+ // End angle in counter-clockwise order.
+ required float a2 = 5;
+ // Thickness of the arc.
+ required float thickness = 6;
+}
+
+message SSL_GeometryFieldSize {
+ required int32 field_length = 1;
+ required int32 field_width = 2;
+ required int32 goal_width = 3;
+ required int32 goal_depth = 4;
+ required int32 boundary_width = 5;
+ repeated SSL_FieldLineSegment field_lines = 6;
+ repeated SSL_FieldCicularArc field_arcs = 7;
+}
+
+message SSL_GeometryCameraCalibration {
+ required uint32 camera_id = 1;
+ required float focal_length = 2;
+ required float principal_point_x = 3;
+ required float principal_point_y = 4;
+ required float distortion = 5;
+ required float q0 = 6;
+ required float q1 = 7;
+ required float q2 = 8;
+ required float q3 = 9;
+ required float tx = 10;
+ required float ty = 11;
+ required float tz = 12;
+ optional float derived_camera_world_tx = 13;
+ optional float derived_camera_world_ty = 14;
+ optional float derived_camera_world_tz = 15;
+}
+
+message SSL_GeometryData {
+ required SSL_GeometryFieldSize field = 1;
+ repeated SSL_GeometryCameraCalibration calib = 2;
+}
diff --git a/proto/ssl_vision_wrapper.proto b/proto/ssl_vision_wrapper.proto
new file mode 100644
index 0000000..cc682b2
--- /dev/null
+++ b/proto/ssl_vision_wrapper.proto
@@ -0,0 +1,11 @@
+syntax = "proto2";
+
+option go_package = "github.com/RoboCup-SSL/ssl-simulation-controller/internal/vision";
+
+import "ssl_vision_detection.proto";
+import "ssl_vision_geometry.proto";
+
+message SSL_WrapperPacket {
+ optional SSL_DetectionFrame detection = 1;
+ optional SSL_GeometryData geometry = 2;
+}
diff --git a/proto/ssl_vision_wrapper_tracked.proto b/proto/ssl_vision_wrapper_tracked.proto
new file mode 100644
index 0000000..714497c
--- /dev/null
+++ b/proto/ssl_vision_wrapper_tracked.proto
@@ -0,0 +1,17 @@
+syntax = "proto2";
+
+option go_package = "github.com/RoboCup-SSL/ssl-simulation-controller/internal/tracker";
+
+import "ssl_vision_detection_tracked.proto";
+
+// A wrapper packet containing meta data of the source
+// Also serves for the possibility to extend the protocol later
+message TrackerWrapperPacket {
+ // A random UUID of the source that is kept constant at the source while running
+ // If multiple sources are broadcasting to the same network, this id can be used to identify individual sources
+ required string uuid = 1;
+ // The name of the source software that is producing this messages.
+ optional string source_name = 2;
+ // The tracked frame
+ optional TrackedFrame tracked_frame = 3;
+}