Initial Framework
authorksg <ken@mihrtec.com>
Thu, 23 Jun 2016 02:26:17 +0000 (19:26 -0700)
committerksg <ken@mihrtec.com>
Thu, 23 Jun 2016 02:26:17 +0000 (19:26 -0700)
18 files changed:
.gitignore [new file with mode: 0644]
src/Makefile [new file with mode: 0644]
src/core/_rules.mk [new file with mode: 0644]
src/core/main.c [new file with mode: 0644]
src/core/util.c [new file with mode: 0644]
src/deps.sh [new file with mode: 0755]
src/html/index.html [new file with mode: 0644]
src/html/js/pre.js [new file with mode: 0644]
src/html/js/the_march.config.js [new file with mode: 0644]
src/proto/.gitignore [new file with mode: 0644]
src/proto/_rules.mk [new file with mode: 0644]
src/proto/cstrike15_gcmessages.proto [new file with mode: 0644]
src/proto/cstrike15_usermessages_public.proto [new file with mode: 0644]
src/proto/netmessages_public.proto [new file with mode: 0644]
src/proto/proto.h [new file with mode: 0644]
src/proto/steammessages.proto [new file with mode: 0644]
thefuck [deleted file]
theshit [deleted file]

diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..a9fcf01
--- /dev/null
@@ -0,0 +1,3 @@
+*.[oad]
+*.bc
+dist/*
diff --git a/src/Makefile b/src/Makefile
new file mode 100644 (file)
index 0000000..cd6d638
--- /dev/null
@@ -0,0 +1,115 @@
+#Mihrtec Standard Makefile
+#Author: ksg
+
+#Project Info
+APPNAME     := the_march
+MODULES     := core
+CFLAGS      := -Wall
+APP_RULES   :=
+CLEAN_RULES :=
+SCRUB_RULES :=
+
+
+ifdef EMSCRIPTEN_TOOLS
+#Emscripten build environment
+APP_RULES += move
+HTML      := index.html js/the_march.config.js
+CC        := emcc
+EXPORTS   := '_em_main'
+EMOPTS    := --separate-asm -s ALLOW_MEMORY_GROWTH=1 -s FORCE_FILESYSTEM=1 --pre-js html/js/pre.js
+LIBS      += -s USE_SDL=2 -s USE_SDL_TTF=2 -s USE_SDL_IMAGE=2 -s SDL2_IMAGE_FORMATS='["png"]'
+EXEPATH   := ../dist/bin/jasm/js
+EXE       := $(APPNAME).js
+OBJFILE   :=bc
+EMFLAGS   := $(EMOPTS) $(LIBS) -s EXPORTED_FUNCTIONS="[$(EXPORTS)]"
+EMFLAGS   += -I/usr/include/google
+BYPRODUCT := $(APPNAME).asm.js $(APPNAME).js.mem
+else
+#Native Build Environment
+CC        := gcc
+LIBS      := -lprotobuf-c
+LIBS      += -lSDL2_ttf -lSDL2_image -lSDL2main -lSDL2 -lopengl32
+EXEPATH   := ../dist/bin/$(shell uname -m)
+#windows mingw build rules
+ifeq ($(OS), Windows_NT)
+LIBS      := -lmingw32 -mwindows $(LIBS)
+EXE       := $(APPNAME).exe
+else
+EXE       := $(APPNAME)
+endif
+OBJFILE   :=o
+endif
+
+#-I each of the module directories, include directory, and define APPNAME.
+CFLAGS    += $(patsubst %,-I%, $(MODULES))
+CFLAGS    += -Iinclude -I.
+CFLAGS    += -DAPPNAME=$(APPNAME)
+
+#auto include all .c files
+SRC       += $(patsubst %,%/*.c,$(MODULES))
+SRC       := $(wildcard $(SRC))
+
+#Targets that don't generate a file
+.PHONY: $(APPNAME) run push dox doc clean scrub all default move
+#Define default rules to point to APPNAME
+all default: clean $(APPNAME)
+
+#include rules from any .mk file found in a module directory
+include $(wildcard $(patsubst %,%/*.mk,$(MODULES)))
+
+#populate C objects and dependency files to generate from SRC
+COBJ       += $(patsubst %.c,%.$(OBJFILE), $(filter %.c,$(SRC)))
+CDEP       += $(COBJ:.$(OBJFILE)=.d)
+
+include $(CDEP)
+
+#Build the executable
+$(APPNAME): $(APP_RULES) $(CDEP) $(COBJ)
+       @mkdir -p $(EXEPATH)
+       $(CC) -o $(EXEPATH)/$(EXE) $(EMFLAGS) $(CXXFLAGS) $(CFLAGS) core/main.$(OBJFILE) $(LIBS)
+
+#run the game after making it
+run: $(APPNAME)
+       $(EXEPATH)/$(EXE)
+
+#push to github after successful compile
+push: $(APPNAME)
+       @printf '\nEnter a commit message:\n'; \
+               read CMT; \
+               git commit -am "$$CMT"
+       git push origin master
+
+dox doc:
+       doxygen dox.conf
+
+#clean up intermediate dependency files and binaries
+clean: $(CLEAN_RULES)
+       @echo "Cleaning - Recompiling .d (deps) and .$(OBJFILE) (obj)"
+       @rm -f $(EXEPATH)/$(EXE) $(patsubst %,$(EXEPATH)/%, $(BYPRODUCT))
+       @rm -f $(patsubst %,%/*.$(OBJFILE), $(MODULES))
+       @rm -f $(patsubst %,%/*.d, $(MODULES))
+
+#Scrub down to minimal distribution
+scrub: clean $(SCRUB_RULES)
+
+#construct list of move rules for each HTML item
+.PHONY: $(HTML)
+$(HTML):
+       @cp -f html/$@ ../dist/bin/jasm/$@
+#move js/html files
+move: $(HTML)
+
+################## DEFAULTS #####################
+#cancel default %.o behavior for %.d dependency
+%.o : %.c
+
+#new default .o for .c files
+%.bc %.o: %.c %.d
+       $(CC) -c $(EMFLAGS) $(CPPFLAGS) $(CFLAGS) $< -o $@
+
+#default for .d dependency files (output from gcc -M)
+%.d: %.c
+       @./deps.sh 'dirname $*.c' $(CFLAGS) $*.c > $@
+       @sed -i 's/$(*F)[\.]o/$(@D)\/$(*F)\.o/g' $@
+       @cat $@ | sed 's/[\.][o]/.bc/g' >> $@
+
diff --git a/src/core/_rules.mk b/src/core/_rules.mk
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/src/core/main.c b/src/core/main.c
new file mode 100644 (file)
index 0000000..b8a8e12
--- /dev/null
@@ -0,0 +1,192 @@
+/*!@file
+  \brief   engine entry
+  \details initializes necessary subsystems before invoking the preloader,
+           which loads initial game data, before finally invoking the
+           main loop gameloop(void)
+  \author  Ken
+  \date    2016
+------------------------------------------------------------------------------*/
+#ifdef __Win32
+#include <windows.h>
+#endif
+#ifdef __EMSCRIPTEN__
+#define main em_main
+#include <emscripten/emscripten.h>
+#else
+#define INFINITE_MAINLOOP
+#endif
+#include <SDL2/SDL.h>
+#include <SDL2/SDL_image.h>
+#include <SDL_ttf.h>
+#include <stdint.h>
+#include <setjmp.h>
+#include <stdio.h>
+
+/* debug level */
+#define DEBUG 1
+
+/* Exit Codes */
+#define EXIT_GRACEFUL 1
+#define EXIT_DEBUG 2
+#define EXIT_PANIC 3
+
+/* Target frames per second */
+#ifndef TARGET_FPS
+#define TARGET_FPS 60
+#endif
+
+/* Target milliseconds per frame */
+#define TARGET_DT (1000 / TARGET_FPS)
+
+/* precompiler round-up division */
+#define DIV_UP(x,y) ((x + (y / 2)) / y)
+
+/* internally exposed functions */
+int  main_init(void);
+void main_loop(void);
+
+/* unexposed externs *
+extern int         state_init(void);
+extern void        state_tick(uint32_t delta_ticks);
+extern const char* state_get_error(void);
+extern void        state_quit(void);
+extern void        state_handle_event(SDL_Event event);
+extern int         io_init(void);
+extern const char* io_get_error(void);
+extern void        io_quit(void);*/
+
+/* Function trigger stack for "unwinding" initialization of modules */
+#define MAX_TRIGGERS 16
+struct call_trigger
+{ int num_funcs;
+  void (*func[MAX_TRIGGERS])(void);
+} quit_trigger = {0};
+
+#define TRIGGER_SET(TARG, FUNC) TARG.func[TARG.num_funcs++] = FUNC
+#define TRIGGER(TARG) while(TARG.num_funcs) (TARG.func[--TARG.num_funcs])()
+
+/* main jump buffer */
+jmp_buf jmp_main;
+
+/** initializes subsystems and calls main_loop(void)
+  @return (exit_status - 1), where a normal shutdown's exit_status = 1.
+
+  main sets a jump buffer for its primary switch, which may be jumped to
+  at any time.  Jumping with a 0 return value is equivalent to calling
+  setjmp directly, which initializes the system and begins the main loop.
+  Jumping with any other value will process one of the directives associated
+  with the exit codes in core.h
+*******************************************************************************/
+int main (int argc, char** argv)
+{ switch(setjmp(jmp_main))
+    { case 0:
+        if (main_init())
+          return -1;
+        main_loop(); /* no return during native execution */
+#ifdef __EMSCRIPTEN__
+        emscripten_set_main_loop(main_loop,0,0);
+        return 0;
+#endif
+      case EXIT_GRACEFUL:
+        break;
+      default:
+      case EXIT_PANIC:
+        //dump some debug info
+        break;
+    }
+  TRIGGER(quit_trigger);
+  return 0;
+}
+
+/** initializer
+  @return 0 if successful, -1 SDL, -2 IMG, -3 TTF, -4 STATE.
+  SDL and logging is available after this is called
+*******************************************************************************/
+int main_init()
+{ static char bInitialized = 0;
+  if (bInitialized++)
+    { SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "Resetting [%d]\n", bInitialized);
+      return 0;
+    }
+
+  if (SDL_Init(SDL_INIT_EVERYTHING & ~(SDL_INIT_TIMER | SDL_INIT_HAPTIC)) < 0)
+    { fprintf(stderr, "SDL_Init failed: %s\n", SDL_GetError());
+      return - 1;
+    }
+  TRIGGER_SET(quit_trigger, SDL_Quit);
+
+  if (IMG_Init(IMG_INIT_PNG) != IMG_INIT_PNG)
+    { fprintf(stderr, "IMG_Init failed: %s\n", IMG_GetError());
+      return -2;
+    }
+  TRIGGER_SET(quit_trigger, IMG_Quit);
+
+  if (TTF_Init() == -1)
+    { fprintf(stderr, "TTF_Init failed: %s\n", TTF_GetError());
+      return -3;
+    }
+  TRIGGER_SET(quit_trigger, TTF_Quit);
+  /*
+  if (state_init())
+  { printf("state_init failed: %s\n", state_get_error());
+    return -4;
+  }
+  TRIGGER_SET(quit_trigger, state_quit);
+  if (renderer_init())
+  { printf("state_init failed: %s\n", renderer_get_error());
+    return -5;
+  }
+  TRIGGER_SET(quit_trigger, renderer_quit);
+  if (io_init())
+  { printf("io_init failed: %s\n", io_get_error());
+    return -6;
+  }
+  TRIGGER_SET(quit_trigger, io_quit);
+  */
+  SDL_Log("Initialization Complete.");
+  return 0;
+}
+
+/** main loop.
+  exits only during core_shutdown and core_panic if in an infinite loop
+*******************************************************************************/
+void main_loop()
+{ static uint32_t main_loop_last_ticks = 0;
+  static SDL_Event event;
+  uint32_t delta_ticks;
+loop:
+  /* Poll events */
+  while (SDL_PollEvent(&event))
+    //state_handle_event(&event);
+    ;
+
+  /* change in time since last loop */
+  delta_ticks = SDL_GetTicks() - main_loop_last_ticks;
+
+  /* handle breakpoints (long pause likely a breakpoint) */
+  if (delta_ticks > 1000)
+  { SDL_LogWarn(SDL_LOG_CATEGORY_SYSTEM, "Recovering from long pause.");
+    delta_ticks = TARGET_DT;
+  }
+
+  /* tick the state manager forward by the change in time */
+  //state_tick(delta_ticks);
+  main_loop_last_ticks = SDL_GetTicks();
+
+  /* render the scene to backbuffer */
+////todo...
+  /* swap in the backbuffer for display */
+////todo...
+
+  /* cap the framerate if we're handling the loop mechanism directly, but only
+     yield if we have a substantial portion of time to yield (1/10th of the
+     target delta) */
+  printf("%d\n", main_loop_last_ticks);
+#ifdef INFINITE_MAINLOOP
+  delta_ticks = SDL_GetTicks() - main_loop_last_ticks;
+  if ((delta_ticks + DIV_UP(TARGET_DT, 10)) < TARGET_DT)
+    SDL_Delay(TARGET_DT - delta_ticks);
+
+  goto loop;
+#endif
+}
diff --git a/src/core/util.c b/src/core/util.c
new file mode 100644 (file)
index 0000000..f0c26fc
--- /dev/null
@@ -0,0 +1,18 @@
+/*!@file
+  \brief   The March Init
+  \details Initialization of subsystems and third party software
+  \author  Ken
+  \date    2016
+  ------------------------------------------------------------------------------*/
+#include <stdio.h>
+#include <unistd.h>
+#include <ctype.h>
+#include <string.h>
+#ifdef __Win32
+#include <windows.h>
+#endif
+#ifdef __EMSCRIPTEN__
+#include <emscripten/emscripten.h>
+#endif
+
+
diff --git a/src/deps.sh b/src/deps.sh
new file mode 100755 (executable)
index 0000000..bcbb54b
--- /dev/null
@@ -0,0 +1,13 @@
+#!/bin/sh
+DIR="$1"
+shift 1
+case "$DIR" in
+    "" | ".")
+        gcc -MM -MG "$@" |
+            sed -e ’s@ˆ\(.*\)\.o:@\1.d \1.o:@’
+        ;;
+    *)
+        gcc -MM -MG "$@" |
+            sed -e "s@ˆ\(.*\)\.o:@$DIR/\1.d $DIR/\1.o:@"
+        ;;
+esac
diff --git a/src/html/index.html b/src/html/index.html
new file mode 100644 (file)
index 0000000..0834270
--- /dev/null
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html language="en">
+  <head>
+    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous">
+   <meta charset="UTF-8" />
+  </head>
+  <body>
+    Usage: the_march [-opts]<br>
+    <div class="row">
+      <div class="col-md-5 col-md-offset-5">
+        <input class="" type="submit" value="Launch Game" id="launch_game">
+      </div>
+    </div>
+    <script type="text/javascript" src="http://code.jquery.com/jquery-2.2.4.min.js"></script>
+    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js" integrity="sha384-0mSbJDEHialfmuBBQP6A4Qrprq5OVfW37PRR3j5ELqxss1yVqOtnepnHVP9aJ7xS" crossorigin="anonymous"></script>
+    <script type="text/javascript" src="js/the_march.config.js"></script>
+    <script type="text/javascript" src="js/the_march.asm.js"></script>
+    <script type="text/javascript" src="js/the_march.js"></script>
+  </body>
+</html>
diff --git a/src/html/js/pre.js b/src/html/js/pre.js
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/src/html/js/the_march.config.js b/src/html/js/the_march.config.js
new file mode 100644 (file)
index 0000000..7751827
--- /dev/null
@@ -0,0 +1,40 @@
+var Module =
+    {
+        'noExitRuntime': true,
+        'arguments': [],
+
+        print: function(text) { for(var i=0; i<text.length; i++) document.write(String.fromCharCode(text.charCodeAt(i))); document.write("<br />");},
+        printErr: function(text) { console.log("ERR: " + text); },
+
+        //Execute the default em_main instead of main
+        execute: function(text)
+        {
+            const PTR_BYTES = 4;
+
+            //Parse argv and argc
+            var argv = text.replace(/[\s]+/g," ").split(" ");
+            var argc = argv.length;
+
+            //Allocate C stack memory for the arg pointers
+            var argv_ptr = Runtime.stackAlloc(argc * PTR_BYTES);
+
+            var arg_ptrs = [];
+            for(var i = 0; i < argc; i++)
+            {
+                //stack allocate for each argument
+                arg_ptrs[i] = Runtime.stackAlloc(argv[i].length+1);
+                //Add to argv's list of pointers in c-memory, then copy data
+                setValue(argv_ptr + i * PTR_BYTES, arg_ptrs[i], 'i32');
+                writeStringToMemory(argv[i], arg_ptrs[i]);
+            }
+
+            _em_main(argc, argv_ptr, 0);
+        }
+    };
+
+function start_game(event)
+{
+    Module.execute("the_march");
+};
+document.getElementById("launch_game").addEventListener("click", start_game, false);
+
diff --git a/src/proto/.gitignore b/src/proto/.gitignore
new file mode 100644 (file)
index 0000000..f0ea0c0
--- /dev/null
@@ -0,0 +1,2 @@
+google
+*.pb-c.*
diff --git a/src/proto/_rules.mk b/src/proto/_rules.mk
new file mode 100644 (file)
index 0000000..484b28c
--- /dev/null
@@ -0,0 +1,45 @@
+#Protobuf Compilation
+PROTOCC    := protoc-c
+PROTOLIBS  := proto
+PBUFV      := 2.5.0
+
+#Proto Module Compile rules
+PROTOFLAGS  += $(patsubst %,--proto_path=%,$(PROTOLIBS))
+APP_RULES   += gen_proto
+CLEAN_RULES += protoclean
+SCRUB_RULES += protoscrub
+PROTO_SRC   := $(wildcard proto/*.proto)
+PROTO_TARG  := $(PROTO_SRC:.proto=.pb-c.c)
+PROTO_TARG  := $(PROTO_TARG) $(PROTO_TARG:.c=.h)
+
+.PHONY: protoclean protoscrub gen_proto
+
+gen_proto: $(PROTO_TARG)
+
+#download protobuf and move the google proto files.
+proto/google:
+       @mkdir tmp
+#      @git clone git@github.com:google/protobuf.git tmp
+       @curl https://protobuf.googlecode.com/files/protobuf-$(PBUFV).tar.gz | tar xz --directory=tmp
+       @mv tmp/protobuf-$(PBUFV)/src/google proto/google
+       @$(PROTOCC) --proto_path=proto/google/protobuf --c_out=proto/google/protobuf proto/google/protobuf/descriptor.proto
+       @echo "google" > proto/.gitignore
+       @echo "*.pb-c.*" >> proto/.gitignore
+       @rm -Rf tmp
+
+#default rule for making protobuf-compiled C code
+%.pb-c.h %.pb-c.c: %.proto proto/google
+       @$(PROTOCC) $(PROTOFLAGS) --c_out=$(@D) $<
+
+%.pb-c.h %.pb-c.c: proto/%.proto proto/google
+       @$(PROTOCC) $(PROTOFLAGS) --c_out=proto $<
+
+%.pb-c.o %.pb-c.bc: %.pb-c.h %.pb-c.c
+       @$(CC) -c -static $(CPPFLAGS) $(CFLAGS) -I/usr/include/google $< -o $@
+
+protoclean:
+       rm -f proto/*.pb-c.*
+
+protoscrub:
+       rm -Rf proto/google
+       rm -f proto/.gitignore
diff --git a/src/proto/cstrike15_gcmessages.proto b/src/proto/cstrike15_gcmessages.proto
new file mode 100644 (file)
index 0000000..75494ab
--- /dev/null
@@ -0,0 +1,945 @@
+import "steammessages.proto";
+
+option optimize_for = SPEED;
+option cc_generic_services = false;
+
+enum ECsgoGCMsg {
+       k_EMsgGCCStrike15_v2_Base = 9100;
+       k_EMsgGCCStrike15_v2_MatchmakingStart = 9101;
+       k_EMsgGCCStrike15_v2_MatchmakingStop = 9102;
+       k_EMsgGCCStrike15_v2_MatchmakingClient2ServerPing = 9103;
+       k_EMsgGCCStrike15_v2_MatchmakingGC2ClientUpdate = 9104;
+       k_EMsgGCCStrike15_v2_MatchmakingGC2ServerReserve = 9105;
+       k_EMsgGCCStrike15_v2_MatchmakingServerReservationResponse = 9106;
+       k_EMsgGCCStrike15_v2_MatchmakingGC2ClientReserve = 9107;
+       k_EMsgGCCStrike15_v2_MatchmakingServerRoundStats = 9108;
+       k_EMsgGCCStrike15_v2_MatchmakingClient2GCHello = 9109;
+       k_EMsgGCCStrike15_v2_MatchmakingGC2ClientHello = 9110;
+       k_EMsgGCCStrike15_v2_MatchmakingServerMatchEnd = 9111;
+       k_EMsgGCCStrike15_v2_MatchmakingGC2ClientAbandon = 9112;
+       k_EMsgGCCStrike15_v2_MatchmakingServer2GCKick = 9113;
+       k_EMsgGCCStrike15_v2_MatchmakingGC2ServerConfirm = 9114;
+       k_EMsgGCCStrike15_v2_MatchmakingGCOperationalStats = 9115;
+       k_EMsgGCCStrike15_v2_MatchmakingGC2ServerRankUpdate = 9116;
+       k_EMsgGCCStrike15_v2_MatchmakingOperator2GCBlogUpdate = 9117;
+       k_EMsgGCCStrike15_v2_ServerNotificationForUserPenalty = 9118;
+       k_EMsgGCCStrike15_v2_ClientReportPlayer = 9119;
+       k_EMsgGCCStrike15_v2_ClientReportServer = 9120;
+       k_EMsgGCCStrike15_v2_ClientCommendPlayer = 9121;
+       k_EMsgGCCStrike15_v2_ClientReportResponse = 9122;
+       k_EMsgGCCStrike15_v2_ClientCommendPlayerQuery = 9123;
+       k_EMsgGCCStrike15_v2_ClientCommendPlayerQueryResponse = 9124;
+       k_EMsgGCCStrike15_v2_WatchInfoUsers = 9126;
+       k_EMsgGCCStrike15_v2_ClientRequestPlayersProfile = 9127;
+       k_EMsgGCCStrike15_v2_PlayersProfile = 9128;
+       k_EMsgGCCStrike15_v2_SetMyMedalsInfo = 9129;
+       k_EMsgGCCStrike15_v2_PlayerOverwatchCaseUpdate = 9131;
+       k_EMsgGCCStrike15_v2_PlayerOverwatchCaseAssignment = 9132;
+       k_EMsgGCCStrike15_v2_PlayerOverwatchCaseStatus = 9133;
+       k_EMsgGCCStrike15_v2_GC2ClientTextMsg = 9134;
+       k_EMsgGCCStrike15_v2_Client2GCTextMsg = 9135;
+       k_EMsgGCCStrike15_v2_MatchEndRunRewardDrops = 9136;
+       k_EMsgGCCStrike15_v2_MatchEndRewardDropsNotification = 9137;
+       k_EMsgGCCStrike15_v2_ClientRequestWatchInfoFriends2 = 9138;
+       k_EMsgGCCStrike15_v2_MatchList = 9139;
+       k_EMsgGCCStrike15_v2_MatchListRequestCurrentLiveGames = 9140;
+       k_EMsgGCCStrike15_v2_MatchListRequestRecentUserGames = 9141;
+       k_EMsgGCCStrike15_v2_GC2ServerReservationUpdate = 9142;
+       k_EMsgGCCStrike15_v2_ClientVarValueNotificationInfo = 9144;
+       k_EMsgGCCStrike15_v2_TournamentMatchRewardDropsNotification = 9145;
+       k_EMsgGCCStrike15_v2_MatchListRequestTournamentGames = 9146;
+       k_EMsgGCCStrike15_v2_MatchListRequestFullGameInfo = 9147;
+       k_EMsgGCCStrike15_v2_GiftsLeaderboardRequest = 9148;
+       k_EMsgGCCStrike15_v2_GiftsLeaderboardResponse = 9149;
+       k_EMsgGCCStrike15_v2_ServerVarValueNotificationInfo = 9150;
+       k_EMsgGCToGCReloadVersions = 9151;
+       k_EMsgGCCStrike15_v2_ClientSubmitSurveyVote = 9152;
+       k_EMsgGCCStrike15_v2_Server2GCClientValidate = 9153;
+       k_EMsgGCCStrike15_v2_MatchListRequestLiveGameForUser = 9154;
+       k_EMsgGCCStrike15_v2_Server2GCPureServerValidationFailure = 9155;
+       k_EMsgGCCStrike15_v2_Client2GCEconPreviewDataBlockRequest = 9156;
+       k_EMsgGCCStrike15_v2_Client2GCEconPreviewDataBlockResponse = 9157;
+       k_EMsgGCCStrike15_v2_AccountPrivacySettings = 9158;
+       k_EMsgGCCStrike15_v2_SetMyActivityInfo = 9159;
+       k_EMsgGCCStrike15_v2_MatchListRequestTournamentPredictions = 9160;
+       k_EMsgGCCStrike15_v2_MatchListUploadTournamentPredictions = 9161;
+       k_EMsgGCCStrike15_v2_DraftSummary = 9162;
+       k_EMsgGCCStrike15_v2_ClientRequestJoinFriendData = 9163;
+       k_EMsgGCCStrike15_v2_ClientRequestJoinServerData = 9164;
+       k_EMsgGCCStrike15_v2_ClientRequestNewMission = 9165;
+       k_EMsgGCCStrike15_v2_GC2ServerNotifyXPRewarded = 9166;
+       k_EMsgGCCStrike15_v2_GC2ClientTournamentInfo = 9167;
+       k_EMsgGC_GlobalGame_Subscribe = 9168;
+       k_EMsgGC_GlobalGame_Unsubscribe = 9169;
+       k_EMsgGC_GlobalGame_Play = 9170;
+       k_EMsgGCCStrike15_v2_AcknowledgePenalty = 9171;
+       k_EMsgGCCStrike15_v2_Client2GCRequestPrestigeCoin = 9172;
+       k_EMsgGCCStrike15_v2_GC2ClientGlobalStats = 9173;
+       k_EMsgGCCStrike15_v2_Client2GCStreamUnlock = 9174;
+       k_EMsgGCCStrike15_v2_FantasyRequestClientData = 9175;
+       k_EMsgGCCStrike15_v2_FantasyUpdateClientData = 9176;
+}
+
+message GameServerPing {
+       optional uint64 gameserver_id = 1;
+       optional int32 ping = 2;
+       optional uint32 ip = 3;
+       optional uint32 port = 4;
+       optional uint32 instances = 5;
+}
+
+message DetailedSearchStatistic {
+       optional uint32 game_type = 1;
+       optional uint32 search_time_avg = 2;
+       optional uint32 players_searching = 4;
+}
+
+message TournamentPlayer {
+       optional uint32 account_id = 1;
+       optional string player_nick = 2;
+       optional string player_name = 3;
+       optional uint32 player_dob = 4;
+       optional string player_flag = 5;
+       optional string player_location = 6;
+       optional string player_desc = 7;
+}
+
+message TournamentTeam {
+       optional int32 team_id = 1;
+       optional string team_tag = 2;
+       optional string team_flag = 3;
+       optional string team_name = 4;
+       repeated .TournamentPlayer players = 5;
+}
+
+message TournamentEvent {
+       optional int32 event_id = 1;
+       optional string event_tag = 2;
+       optional string event_name = 3;
+       optional uint32 event_time_start = 4;
+       optional uint32 event_time_end = 5;
+       optional int32 event_public = 6;
+       optional int32 event_stage_id = 7;
+       optional string event_stage_name = 8;
+       optional uint32 active_section_id = 9;
+}
+
+message GlobalStatistics {
+       optional uint32 players_online = 1;
+       optional uint32 servers_online = 2;
+       optional uint32 players_searching = 3;
+       optional uint32 servers_available = 4;
+       optional uint32 ongoing_matches = 5;
+       optional uint32 search_time_avg = 6;
+       repeated .DetailedSearchStatistic search_statistics = 7;
+       optional string main_post_url = 8;
+       optional uint32 required_appid_version = 9;
+       optional uint32 pricesheet_version = 10;
+       optional uint32 twitch_streams_version = 11;
+       optional uint32 active_tournament_eventid = 12;
+       optional uint32 active_survey_id = 13;
+}
+
+message OperationalStatisticDescription {
+       optional string name = 1;
+       optional uint32 idkey = 2;
+}
+
+message OperationalStatisticElement {
+       optional uint32 idkey = 1;
+       repeated int32 values = 2;
+}
+
+message OperationalStatisticsPacket {
+       optional int32 packetid = 1;
+       optional int32 mstimestamp = 2;
+       repeated .OperationalStatisticElement values = 3;
+}
+
+message PlayerRankingInfo {
+       optional uint32 account_id = 1;
+       optional uint32 rank_id = 2;
+       optional uint32 wins = 3;
+       optional float rank_change = 4;
+}
+
+message PlayerCommendationInfo {
+       optional uint32 cmd_friendly = 1;
+       optional uint32 cmd_teaching = 2;
+       optional uint32 cmd_leader = 4;
+}
+
+message PlayerMedalsInfo {
+       optional uint32 medal_team = 1;
+       optional uint32 medal_combat = 2;
+       optional uint32 medal_weapon = 3;
+       optional uint32 medal_global = 4;
+       optional uint32 medal_arms = 5;
+       repeated uint32 display_items_defidx = 7;
+       optional uint32 featured_display_item_defidx = 8;
+}
+
+message AccountActivity {
+       optional uint32 activity = 1;
+       optional uint32 mode = 2;
+       optional uint32 map = 3;
+}
+
+message TournamentMatchSetup {
+       optional int32 event_id = 1;
+       optional int32 team_id_ct = 2;
+       optional int32 team_id_t = 3;
+       optional int32 event_stage_id = 4;
+}
+
+message ServerHltvInfo {
+       optional uint32 tv_udp_port = 1;
+       optional uint64 tv_watch_key = 2;
+       optional uint32 tv_slots = 3;
+       optional uint32 tv_clients = 4;
+       optional uint32 tv_proxies = 5;
+       optional uint32 tv_time = 6;
+       optional uint32 game_type = 8;
+       optional string game_mapgroup = 9;
+       optional string game_map = 10;
+       optional uint64 tv_master_steamid = 11;
+       optional uint32 tv_local_slots = 12;
+       optional uint32 tv_local_clients = 13;
+       optional uint32 tv_local_proxies = 14;
+       optional uint32 tv_relay_slots = 15;
+       optional uint32 tv_relay_clients = 16;
+       optional uint32 tv_relay_proxies = 17;
+       optional uint32 tv_relay_address = 18;
+       optional uint32 tv_relay_port = 19;
+       optional uint64 tv_relay_steamid = 20;
+}
+
+message IpAddressMask {
+       optional uint32 a = 1;
+       optional uint32 b = 2;
+       optional uint32 c = 3;
+       optional uint32 d = 4;
+       optional uint32 bits = 5;
+       optional uint32 token = 6;
+}
+
+message XpProgressData {
+       optional uint32 xp_points = 1;
+       optional int32 xp_category = 2;
+}
+
+message MatchEndItemUpdates {
+       optional uint64 item_id = 1;
+       optional uint32 item_attr_defidx = 2;
+       optional uint32 item_attr_delta_value = 3;
+}
+
+message ScoreLeaderboardData {
+       message Entry {
+               optional uint32 tag = 1;
+               optional uint32 val = 2;
+       }
+
+       message AccountEntries {
+               optional uint32 accountid = 1;
+               repeated .ScoreLeaderboardData.Entry entries = 2;
+       }
+
+       optional uint64 quest_id = 1;
+       optional uint32 score = 2;
+       repeated .ScoreLeaderboardData.AccountEntries accountentries = 3;
+       repeated .ScoreLeaderboardData.Entry matchentries = 5;
+}
+
+message PlayerQuestData {
+       message QuestItemData {
+               optional uint64 quest_id = 1;
+               optional int32 quest_normal_points_earned = 2;
+               optional int32 quest_bonus_points_earned = 3;
+       }
+
+       optional uint32 quester_account_id = 1;
+       repeated .PlayerQuestData.QuestItemData quest_item_data = 2;
+       repeated .XpProgressData xp_progress_data = 3;
+       optional uint32 time_played = 4;
+       optional uint32 mm_game_mode = 5;
+       repeated .MatchEndItemUpdates item_updates = 6;
+}
+
+message CMsgGC_ServerQuestUpdateData {
+       repeated .PlayerQuestData player_quest_data = 1;
+       optional bytes binary_data = 2;
+       optional uint32 mm_game_mode = 3;
+       optional .ScoreLeaderboardData missionlbsdata = 4;
+}
+
+message CMsgGCCStrike15_v2_MatchmakingGCOperationalStats {
+       optional int32 packetid = 1;
+       repeated .OperationalStatisticDescription namekeys = 2;
+       repeated .OperationalStatisticsPacket packets = 3;
+}
+
+message CMsgGCCStrike15_v2_MatchmakingGC2ServerConfirm {
+       optional uint32 token = 1;
+       optional uint32 stamp = 2;
+       optional uint64 exchange = 3;
+}
+
+message CMsgGCCStrike15_v2_GC2ServerReservationUpdate {
+       optional uint32 viewers_external_total = 1;
+       optional uint32 viewers_external_steam = 2;
+}
+
+message CMsgGCCStrike15_v2_MatchmakingStart {
+       repeated uint32 account_ids = 1;
+       optional uint32 game_type = 2;
+       optional string ticket_data = 3;
+       optional uint32 client_version = 4;
+       optional .TournamentMatchSetup tournament_match = 5;
+}
+
+message CMsgGCCStrike15_v2_MatchmakingStop {
+       optional int32 abandon = 1;
+}
+
+message CMsgGCCStrike15_v2_MatchmakingClient2ServerPing {
+       repeated .GameServerPing gameserverpings = 1;
+       optional int32 offset_index = 2;
+       optional int32 final_batch = 3;
+}
+
+message CMsgGCCStrike15_v2_MatchmakingGC2ClientUpdate {
+       message Note {
+               optional int32 type = 1;
+               optional int32 region_id = 2;
+               optional float region_r = 3;
+               optional float distance = 4;
+       }
+
+       optional int32 matchmaking = 1;
+       repeated uint32 waiting_account_id_sessions = 2;
+       optional string error = 3;
+       repeated uint32 ongoingmatch_account_id_sessions = 6;
+       optional .GlobalStatistics global_stats = 7;
+       repeated uint32 failping_account_id_sessions = 8;
+       repeated uint32 penalty_account_id_sessions = 9;
+       repeated uint32 failready_account_id_sessions = 10;
+       repeated uint32 vacbanned_account_id_sessions = 11;
+       optional .IpAddressMask server_ipaddress_mask = 12;
+       repeated .CMsgGCCStrike15_v2_MatchmakingGC2ClientUpdate.Note notes = 13;
+       repeated uint32 penalty_account_id_sessions_green = 14;
+       repeated uint32 insufficientlevel_sessions = 15;
+}
+
+message CDataGCCStrike15_v2_TournamentMatchDraft {
+       message Entry {
+               optional int32 mapid = 1;
+               optional int32 team_id_ct = 2;
+       }
+
+       optional int32 event_id = 1;
+       optional int32 event_stage_id = 2;
+       optional int32 team_id_0 = 3;
+       optional int32 team_id_1 = 4;
+       optional int32 maps_count = 5;
+       optional int32 maps_current = 6;
+       optional int32 team_id_start = 7;
+       optional int32 team_id_veto1 = 8;
+       optional int32 team_id_pickn = 9;
+       repeated .CDataGCCStrike15_v2_TournamentMatchDraft.Entry drafts = 10;
+}
+
+message CPreMatchInfoData {
+       message TeamStats {
+               optional int32 match_info_idxtxt = 1;
+               optional string match_info_txt = 2;
+               repeated string match_info_teams = 3;
+       }
+
+       optional int32 predictions_pct = 1;
+       optional .CDataGCCStrike15_v2_TournamentMatchDraft draft = 4;
+       repeated .CPreMatchInfoData.TeamStats stats = 5;
+}
+
+message CMsgGCCStrike15_v2_MatchmakingGC2ServerReserve {
+       repeated uint32 account_ids = 1;
+       optional uint32 game_type = 2;
+       optional uint64 match_id = 3;
+       optional uint32 server_version = 4;
+       repeated .PlayerRankingInfo rankings = 5;
+       optional uint64 encryption_key = 6;
+       optional uint64 encryption_key_pub = 7;
+       repeated uint32 party_ids = 8;
+       repeated .IpAddressMask whitelist = 9;
+       optional uint64 tv_master_steamid = 10;
+       optional .TournamentEvent tournament_event = 11;
+       repeated .TournamentTeam tournament_teams = 12;
+       repeated uint32 tournament_casters_account_ids = 13;
+       optional uint64 tv_relay_steamid = 14;
+       optional .CPreMatchInfoData pre_match_data = 15;
+}
+
+message CMsgGCCStrike15_v2_MatchmakingServerReservationResponse {
+       optional uint64 reservationid = 1;
+       optional .CMsgGCCStrike15_v2_MatchmakingGC2ServerReserve reservation = 2;
+       optional string map = 3;
+       optional uint64 gc_reservation_sent = 4;
+       optional uint32 server_version = 5;
+       optional .ServerHltvInfo tv_info = 6;
+       repeated uint32 reward_player_accounts = 7;
+       repeated uint32 idle_player_accounts = 8;
+       optional uint32 reward_item_attr_def_idx = 9;
+       optional uint32 reward_item_attr_value = 10;
+       optional uint32 reward_item_attr_reward_idx = 11;
+       optional uint32 reward_drop_list = 12;
+       optional string tournament_tag = 13;
+       optional uint32 steamdatagram_port = 14;
+}
+
+message CMsgGCCStrike15_v2_MatchmakingGC2ClientReserve {
+       optional uint64 serverid = 1;
+       optional string server_address = 7;
+       optional uint32 legacy_serverip = 2;
+       optional uint32 legacy_serverport = 3;
+       optional uint64 reservationid = 4;
+       optional .CMsgGCCStrike15_v2_MatchmakingGC2ServerReserve reservation = 5;
+       optional string map = 6;
+}
+
+message CMsgGCCStrike15_v2_MatchmakingServerRoundStats {
+       message DropInfo {
+               optional uint32 account_mvp = 1;
+       }
+
+       optional uint64 reservationid = 1;
+       optional .CMsgGCCStrike15_v2_MatchmakingGC2ServerReserve reservation = 2;
+       optional string map = 3;
+       optional int32 round = 4;
+       repeated int32 kills = 5;
+       repeated int32 assists = 6;
+       repeated int32 deaths = 7;
+       repeated int32 scores = 8;
+       repeated int32 pings = 9;
+       optional int32 round_result = 10;
+       optional int32 match_result = 11;
+       repeated int32 team_scores = 12;
+       optional .CMsgGCCStrike15_v2_MatchmakingGC2ServerConfirm confirm = 13;
+       optional int32 reservation_stage = 14;
+       optional int32 match_duration = 15;
+       repeated int32 enemy_kills = 16;
+       repeated int32 enemy_headshots = 17;
+       repeated int32 enemy_3ks = 18;
+       repeated int32 enemy_4ks = 19;
+       repeated int32 enemy_5ks = 20;
+       repeated int32 mvps = 21;
+       optional uint32 spectators_count = 22;
+       optional uint32 spectators_count_tv = 23;
+       optional uint32 spectators_count_lnk = 24;
+       repeated int32 enemy_kills_agg = 25;
+       optional .CMsgGCCStrike15_v2_MatchmakingServerRoundStats.DropInfo drop_info = 26;
+}
+
+message CMsgGCCStrike15_v2_MatchmakingServerMatchEnd {
+       optional .CMsgGCCStrike15_v2_MatchmakingServerRoundStats stats = 1;
+       optional .CMsgGCCStrike15_v2_MatchmakingGC2ServerConfirm confirm = 3;
+       optional uint64 rematch = 4;
+       optional uint32 replay_token = 5;
+       optional uint32 replay_cluster_id = 6;
+       optional bool aborted_match = 7;
+       optional .CMsgGC_ServerQuestUpdateData match_end_quest_data = 8;
+       optional uint32 server_version = 9;
+}
+
+message CMsgGCCStrike15_v2_MatchmakingClient2GCHello {
+}
+
+message CMsgGCCStrike15_v2_MatchmakingGC2ClientHello {
+       optional uint32 account_id = 1;
+       optional .CMsgGCCStrike15_v2_MatchmakingGC2ClientReserve ongoingmatch = 2;
+       optional .GlobalStatistics global_stats = 3;
+       optional uint32 penalty_seconds = 4;
+       optional uint32 penalty_reason = 5;
+       optional int32 vac_banned = 6;
+       optional .PlayerRankingInfo ranking = 7;
+       optional .PlayerCommendationInfo commendation = 8;
+       optional .PlayerMedalsInfo medals = 9;
+       optional .TournamentEvent my_current_event = 10;
+       repeated .TournamentTeam my_current_event_teams = 11;
+       optional .TournamentTeam my_current_team = 12;
+       repeated .TournamentEvent my_current_event_stages = 13;
+       optional uint32 survey_vote = 14;
+       optional .AccountActivity activity = 15;
+       optional int32 player_level = 17;
+       optional int32 player_cur_xp = 18;
+       optional int32 player_xp_bonus_flags = 19;
+}
+
+message CMsgGCCStrike15_v2_AccountPrivacySettings {
+       message Setting {
+               optional uint32 setting_type = 1;
+               optional uint32 setting_value = 2;
+       }
+
+       repeated .CMsgGCCStrike15_v2_AccountPrivacySettings.Setting settings = 1;
+}
+
+message CMsgGCCStrike15_v2_MatchmakingGC2ClientAbandon {
+       optional uint32 account_id = 1;
+       optional .CMsgGCCStrike15_v2_MatchmakingGC2ClientReserve abandoned_match = 2;
+       optional uint32 penalty_seconds = 3;
+       optional uint32 penalty_reason = 4;
+}
+
+message CMsgGCCStrike15_v2_MatchmakingServer2GCKick {
+       optional uint32 account_id = 1;
+       optional .CMsgGCCStrike15_v2_MatchmakingGC2ServerReserve reservation = 2;
+       optional uint32 reason = 3;
+}
+
+message CMsgGCCStrike15_v2_MatchmakingGC2ServerRankUpdate {
+       repeated .PlayerRankingInfo rankings = 1;
+       optional uint64 match_id = 2;
+}
+
+message CMsgGCCStrike15_v2_MatchmakingOperator2GCBlogUpdate {
+       optional string main_post_url = 1;
+}
+
+message CMsgGCCStrike15_v2_ServerNotificationForUserPenalty {
+       optional uint32 account_id = 1;
+       optional uint32 reason = 2;
+       optional uint32 seconds = 3;
+}
+
+message CMsgGCCStrike15_v2_ClientReportPlayer {
+       optional uint32 account_id = 1;
+       optional uint32 rpt_aimbot = 2;
+       optional uint32 rpt_wallhack = 3;
+       optional uint32 rpt_speedhack = 4;
+       optional uint32 rpt_teamharm = 5;
+       optional uint32 rpt_textabuse = 6;
+       optional uint32 rpt_voiceabuse = 7;
+       optional uint64 match_id = 8;
+}
+
+message CMsgGCCStrike15_v2_ClientCommendPlayer {
+       optional uint32 account_id = 1;
+       optional uint64 match_id = 8;
+       optional .PlayerCommendationInfo commendation = 9;
+       optional uint32 tokens = 10;
+}
+
+message CMsgGCCStrike15_v2_ClientReportServer {
+       optional uint32 rpt_poorperf = 1;
+       optional uint32 rpt_abusivemodels = 2;
+       optional uint32 rpt_badmotd = 3;
+       optional uint32 rpt_listingabuse = 4;
+       optional uint32 rpt_inventoryabuse = 5;
+       optional uint64 match_id = 8;
+}
+
+message CMsgGCCStrike15_v2_ClientReportResponse {
+       optional uint64 confirmation_id = 1;
+       optional uint32 account_id = 2;
+       optional uint32 server_ip = 3;
+       optional uint32 response_type = 4;
+       optional uint32 response_result = 5;
+       optional uint32 tokens = 6;
+}
+
+message CMsgGCCStrike15_v2_ClientRequestWatchInfoFriends {
+       optional uint32 request_id = 1;
+       repeated uint32 account_ids = 2;
+       optional uint64 serverid = 3;
+       optional uint64 matchid = 4;
+}
+
+message WatchableMatchInfo {
+       optional uint32 server_ip = 1;
+       optional uint32 tv_port = 2;
+       optional uint32 tv_spectators = 3;
+       optional uint32 tv_time = 4;
+       optional bytes tv_watch_password = 5;
+       optional uint64 cl_decryptdata_key = 6;
+       optional uint64 cl_decryptdata_key_pub = 7;
+       optional uint32 game_type = 8;
+       optional string game_mapgroup = 9;
+       optional string game_map = 10;
+       optional uint64 server_id = 11;
+       optional uint64 match_id = 12;
+       optional uint64 reservation_id = 13;
+}
+
+message CMsgGCCStrike15_v2_ClientRequestJoinFriendData {
+       optional uint32 version = 1;
+       optional uint32 account_id = 2;
+       optional uint32 join_token = 3;
+       optional uint32 join_ipp = 4;
+       optional .CMsgGCCStrike15_v2_MatchmakingGC2ClientReserve res = 5;
+       optional string errormsg = 6;
+}
+
+message CMsgGCCStrike15_v2_ClientRequestJoinServerData {
+       optional uint32 version = 1;
+       optional uint32 account_id = 2;
+       optional uint64 serverid = 3;
+       optional uint32 server_ip = 4;
+       optional uint32 server_port = 5;
+       optional .CMsgGCCStrike15_v2_MatchmakingGC2ClientReserve res = 6;
+}
+
+message CMsgGCCstrike15_v2_ClientRequestNewMission {
+       optional uint32 mission_id = 2;
+       optional uint32 campaign_id = 3;
+}
+
+message CMsgGCCstrike15_v2_GC2ServerNotifyXPRewarded {
+       repeated .XpProgressData xp_progress_data = 1;
+       optional uint32 account_id = 2;
+       optional uint32 current_xp = 3;
+       optional uint32 current_level = 4;
+       optional uint32 upgraded_defidx = 5;
+}
+
+message CMsgGCCStrike15_v2_WatchInfoUsers {
+       optional uint32 request_id = 1;
+       repeated uint32 account_ids = 2;
+       repeated .WatchableMatchInfo watchable_match_infos = 3;
+       optional uint32 extended_timeout = 5;
+}
+
+message CMsgGCCStrike15_v2_ClientRequestPlayersProfile {
+       optional uint32 request_id__deprecated = 1;
+       repeated uint32 account_ids__deprecated = 2;
+       optional uint32 account_id = 3;
+       optional uint32 request_level = 4;
+}
+
+message CMsgGCCStrike15_v2_PlayersProfile {
+       optional uint32 request_id = 1;
+       repeated .CMsgGCCStrike15_v2_MatchmakingGC2ClientHello account_profiles = 2;
+}
+
+message CMsgGCCStrike15_v2_PlayerOverwatchCaseUpdate {
+       optional uint64 caseid = 1;
+       optional uint32 suspectid = 3;
+       optional uint32 fractionid = 4;
+       optional uint32 rpt_aimbot = 5;
+       optional uint32 rpt_wallhack = 6;
+       optional uint32 rpt_speedhack = 7;
+       optional uint32 rpt_teamharm = 8;
+       optional uint32 reason = 9;
+}
+
+message CMsgGCCStrike15_v2_PlayerOverwatchCaseAssignment {
+       optional uint64 caseid = 1;
+       optional string caseurl = 2;
+       optional uint32 verdict = 3;
+       optional uint32 timestamp = 4;
+       optional uint32 throttleseconds = 5;
+       optional uint32 suspectid = 6;
+       optional uint32 fractionid = 7;
+       optional uint32 numrounds = 8;
+       optional uint32 fractionrounds = 9;
+       optional int32 streakconvictions = 10;
+       optional uint32 reason = 11;
+}
+
+message CMsgGCCStrike15_v2_PlayerOverwatchCaseStatus {
+       optional uint64 caseid = 1;
+       optional uint32 statusid = 2;
+}
+
+message CClientHeaderOverwatchEvidence {
+       optional uint32 accountid = 1;
+       optional uint64 caseid = 2;
+}
+
+message CMsgGCCStrike15_v2_GC2ClientTextMsg {
+       optional uint32 id = 1;
+       optional uint32 type = 2;
+       optional bytes payload = 3;
+}
+
+message CMsgGCCStrike15_v2_Client2GCTextMsg {
+       optional uint32 id = 1;
+       repeated bytes args = 2;
+}
+
+message CMsgGCCStrike15_v2_MatchEndRunRewardDrops {
+       optional .CMsgGCCStrike15_v2_MatchmakingServerReservationResponse serverinfo = 3;
+       optional .CMsgGC_ServerQuestUpdateData match_end_quest_data = 4;
+}
+
+message CEconItemPreviewDataBlock {
+       message Sticker {
+               optional uint32 slot = 1;
+               optional uint32 sticker_id = 2;
+               optional float wear = 3;
+               optional float scale = 4;
+               optional float rotation = 5;
+       }
+
+       optional uint32 accountid = 1;
+       optional uint64 itemid = 2;
+       optional uint32 defindex = 3;
+       optional uint32 paintindex = 4;
+       optional uint32 rarity = 5;
+       optional uint32 quality = 6;
+       optional uint32 paintwear = 7;
+       optional uint32 paintseed = 8;
+       optional uint32 killeaterscoretype = 9;
+       optional uint32 killeatervalue = 10;
+       optional string customname = 11;
+       repeated .CEconItemPreviewDataBlock.Sticker stickers = 12;
+       optional uint32 inventory = 13;
+       optional uint32 origin = 14;
+       optional uint32 questid = 15;
+       optional uint32 dropreason = 16;
+}
+
+message CMsgGCCStrike15_v2_MatchEndRewardDropsNotification {
+       optional .CEconItemPreviewDataBlock iteminfo = 6;
+}
+
+message CMsgItemAcknowledged {
+       optional .CEconItemPreviewDataBlock iteminfo = 1;
+}
+
+message CMsgGCCStrike15_v2_Client2GCEconPreviewDataBlockRequest {
+       optional uint64 param_s = 1;
+       optional uint64 param_a = 2;
+       optional uint64 param_d = 3;
+       optional uint64 param_m = 4;
+}
+
+message CMsgGCCStrike15_v2_Client2GCEconPreviewDataBlockResponse {
+       optional .CEconItemPreviewDataBlock iteminfo = 1;
+}
+
+message CMsgGCCStrike15_v2_TournamentMatchRewardDropsNotification {
+       optional uint64 match_id = 1;
+       optional uint32 defindex = 2;
+       repeated uint32 accountids = 3;
+}
+
+message CMsgGCCStrike15_v2_MatchListRequestCurrentLiveGames {
+}
+
+message CMsgGCCStrike15_v2_MatchListRequestLiveGameForUser {
+       optional uint32 accountid = 1;
+}
+
+message CMsgGCCStrike15_v2_MatchListRequestRecentUserGames {
+       optional uint32 accountid = 1;
+}
+
+message CMsgGCCStrike15_v2_MatchListRequestTournamentGames {
+       optional int32 eventid = 1;
+}
+
+message CMsgGCCStrike15_v2_MatchListRequestFullGameInfo {
+       optional uint64 matchid = 1;
+       optional uint64 outcomeid = 2;
+       optional uint32 token = 3;
+}
+
+message CDataGCCStrike15_v2_MatchInfo {
+       optional uint64 matchid = 1;
+       optional uint32 matchtime = 2;
+       optional .WatchableMatchInfo watchablematchinfo = 3;
+       optional .CMsgGCCStrike15_v2_MatchmakingServerRoundStats roundstats_legacy = 4;
+       repeated .CMsgGCCStrike15_v2_MatchmakingServerRoundStats roundstatsall = 5;
+}
+
+message CDataGCCStrike15_v2_TournamentGroupTeam {
+       optional int32 team_id = 1;
+       optional int32 score = 2;
+       optional bool correctpick = 3;
+}
+
+message CDataGCCStrike15_v2_TournamentGroup {
+       message Picks {
+               repeated int32 pickids = 1;
+       }
+
+       optional uint32 groupid = 1;
+       optional string name = 2;
+       optional string desc = 3;
+       optional uint32 picks__deprecated = 4;
+       repeated .CDataGCCStrike15_v2_TournamentGroupTeam teams = 5;
+       repeated int32 stage_ids = 6;
+       optional uint32 picklockuntiltime = 7;
+       optional uint32 pickableteams = 8;
+       optional uint32 points_per_pick = 9;
+       repeated .CDataGCCStrike15_v2_TournamentGroup.Picks picks = 10;
+}
+
+message CDataGCCStrike15_v2_TournamentSection {
+       optional uint32 sectionid = 1;
+       optional string name = 2;
+       optional string desc = 3;
+       repeated .CDataGCCStrike15_v2_TournamentGroup groups = 4;
+}
+
+message CDataGCCStrike15_v2_TournamentInfo {
+       repeated .CDataGCCStrike15_v2_TournamentSection sections = 1;
+       optional .TournamentEvent tournament_event = 2;
+       repeated .TournamentTeam tournament_teams = 3;
+}
+
+message CMsgGCCStrike15_v2_MatchList {
+       optional uint32 msgrequestid = 1;
+       optional uint32 accountid = 2;
+       optional uint32 servertime = 3;
+       repeated .CDataGCCStrike15_v2_MatchInfo matches = 4;
+       repeated .TournamentTeam streams = 5;
+       optional .CDataGCCStrike15_v2_TournamentInfo tournamentinfo = 6;
+}
+
+message CMsgGCCStrike15_v2_Predictions {
+       message GroupMatchTeamPick {
+               optional int32 sectionid = 1;
+               optional int32 groupid = 2;
+               optional int32 index = 3;
+               optional int32 teamid = 4;
+               optional uint64 itemid = 5;
+       }
+
+       optional uint32 event_id = 1;
+       repeated .CMsgGCCStrike15_v2_Predictions.GroupMatchTeamPick group_match_team_picks = 2;
+}
+
+message CMsgGCCStrike15_v2_Fantasy {
+       message FantasySlot {
+               optional int32 type = 1;
+               optional int32 pick = 2;
+               optional uint64 itemid = 3;
+       }
+
+       message FantasyTeam {
+               optional int32 sectionid = 1;
+               repeated .CMsgGCCStrike15_v2_Fantasy.FantasySlot slots = 2;
+       }
+
+       optional uint32 event_id = 1;
+       repeated .CMsgGCCStrike15_v2_Fantasy.FantasyTeam teams = 2;
+}
+
+message CAttribute_String {
+       optional string value = 1;
+}
+
+message CMsgGCToGCReloadVersions {
+}
+
+message CMsgCStrike15Welcome {
+       optional uint32 store_item_hash = 5;
+       optional uint32 timeplayedconsecutively = 6;
+       optional uint32 time_first_played = 10;
+       optional uint32 last_time_played = 12;
+       optional uint32 last_ip_address = 13;
+       optional uint64 gscookieid = 18;
+       optional uint64 uniqueid = 19;
+}
+
+message CMsgGCCStrike15_v2_ClientVarValueNotificationInfo {
+       optional string value_name = 1;
+       optional int32 value_int = 2;
+       optional uint32 server_addr = 3;
+       optional uint32 server_port = 4;
+       repeated string choked_blocks = 5;
+}
+
+message CMsgGCCStrike15_v2_ServerVarValueNotificationInfo {
+       optional uint32 accountid = 1;
+       repeated uint32 viewangles = 2;
+       optional uint32 type = 3;
+}
+
+message CMsgGCCStrike15_v2_GiftsLeaderboardRequest {
+}
+
+message CMsgGCCStrike15_v2_GiftsLeaderboardResponse {
+       message GiftLeaderboardEntry {
+               optional uint32 accountid = 1;
+               optional uint32 gifts = 2;
+       }
+
+       optional uint32 servertime = 1;
+       optional uint32 time_period_seconds = 2;
+       optional uint32 total_gifts_given = 3;
+       optional uint32 total_givers = 4;
+       repeated .CMsgGCCStrike15_v2_GiftsLeaderboardResponse.GiftLeaderboardEntry entries = 5;
+}
+
+message CMsgGCCStrike15_v2_ClientSubmitSurveyVote {
+       optional uint32 survey_id = 1;
+       optional uint32 vote = 2;
+}
+
+message CMsgGCCStrike15_v2_Server2GCClientValidate {
+       optional uint32 accountid = 1;
+}
+
+message CMsgGCCStrike15_v2_Server2GCPureServerValidationFailure {
+       optional uint32 accountid = 1;
+       optional string path = 2;
+       optional string file = 3;
+       optional uint32 crc = 4;
+       optional int32 hash = 5;
+       optional int32 len = 6;
+       optional int32 pack_number = 7;
+       optional int32 pack_file_id = 8;
+}
+
+message CMsgGCCStrike15_v2_GC2ClientTournamentInfo {
+       optional uint32 eventid = 1;
+       optional uint32 stageid = 2;
+       optional uint32 game_type = 3;
+       repeated uint32 teamids = 4;
+}
+
+message CSOEconCoupon {
+       optional uint32 entryid = 1 [(key_field) = true];
+       optional uint32 defidx = 2;
+       optional fixed32 expiration_date = 3;
+}
+
+message CSOQuestProgress {
+       optional uint32 questid = 1 [(key_field) = true];
+       optional uint32 points_remaining = 2;
+       optional uint32 bonus_points = 3;
+}
+
+message CSOPersonaDataPublic {
+       optional int32 player_level = 1;
+       optional .PlayerCommendationInfo commendation = 2;
+}
+
+message CMsgGC_GlobalGame_Subscribe {
+       optional uint64 ticket = 1;
+}
+
+message CMsgGC_GlobalGame_Unsubscribe {
+       optional int32 timeleft = 1;
+}
+
+message CMsgGC_GlobalGame_Play {
+       optional uint64 ticket = 1;
+       optional uint32 gametimems = 2;
+       optional uint32 msperpoint = 3;
+}
+
+message CMsgGCCStrike15_v2_AcknowledgePenalty {
+       optional int32 acknowledged = 1;
+}
+
+message CMsgGCCStrike15_v2_Client2GCRequestPrestigeCoin {
+}
+
+message CMsgGCCStrike15_v2_Client2GCStreamUnlock {
+       optional uint64 ticket = 1;
+       optional int32 os = 2;
+}
+
diff --git a/src/proto/cstrike15_usermessages_public.proto b/src/proto/cstrike15_usermessages_public.proto
new file mode 100644 (file)
index 0000000..957a00a
--- /dev/null
@@ -0,0 +1,506 @@
+//====== Copyright (c) 2013, Valve Corporation, All rights reserved. ========//
+//
+// Redistribution and use in source and binary forms, with or without 
+// modification, are permitted provided that the following conditions are met:
+//
+// Redistributions of source code must retain the above copyright notice, this
+// list of conditions and the following disclaimer.
+// Redistributions in binary form must reproduce the above copyright notice, 
+// this list of conditions and the following disclaimer in the documentation 
+// and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 
+// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 
+// THE POSSIBILITY OF SUCH DAMAGE.
+//===========================================================================//
+//
+// Purpose: The file defines our Google Protocol Buffers which are used in over 
+// the wire messages for the Source engine.
+//
+//=============================================================================
+
+// We care more about speed than code size
+option optimize_for = SPEED;
+
+// We don't use the service generation functionality
+option cc_generic_services = false;
+
+
+// 
+// STYLE NOTES:
+//
+// Use CamelCase CMsgMyMessageName style names for messages.
+// 
+// Use lowercase _ delimited names like my_steam_id for field names, this is non-standard for Steam,
+// but plays nice with the Google formatted code generation.  
+// 
+// Try not to use required fields ever. Only do so if you are really really sure you'll never want them removed. 
+// Optional should be preffered as it will make versioning easier and cleaner in the future if someone refactors
+// your message and wants to remove or rename fields.
+//
+// Use fixed64 for JobId_t, GID_t, or SteamID.  This is appropriate for any field that is normally
+// going to be larger than 2^56.  Otherwise use int64 for 64 bit values that are frequently smaller
+// than 2^56 as it will safe space on the wire in those cases.
+//
+// Similar to fixed64, use fixed32 for RTime32 or other 32 bit values that are frequently larger than
+// 2^28.  It will safe space in those cases, otherwise use int32 which will safe space for smaller values.
+// An exception to this rule for RTime32 is if the value will frequently be zero rather than set to an actual 
+// time.
+//
+
+import "google/protobuf/descriptor.proto";
+
+// for CMsgVector, etc.
+import "netmessages_public.proto";
+
+import "cstrike15_gcmessages.proto";
+//=============================================================================
+// CStrike15 User Messages
+//=============================================================================
+
+enum ECstrike15UserMessages {
+       CS_UM_VGUIMenu = 1;
+       CS_UM_Geiger = 2;
+       CS_UM_Train = 3;
+       CS_UM_HudText = 4;
+       CS_UM_SayText = 5;
+       CS_UM_SayText2 = 6;
+       CS_UM_TextMsg = 7;
+       CS_UM_HudMsg = 8;
+       CS_UM_ResetHud = 9;
+       CS_UM_GameTitle = 10;
+       CS_UM_Shake = 12;
+       CS_UM_Fade = 13;
+       CS_UM_Rumble = 14;
+       CS_UM_CloseCaption = 15;
+       CS_UM_CloseCaptionDirect = 16;
+       CS_UM_SendAudio = 17;
+       CS_UM_RawAudio = 18;
+       CS_UM_VoiceMask = 19;
+       CS_UM_RequestState = 20;
+       CS_UM_Damage = 21;
+       CS_UM_RadioText = 22;
+       CS_UM_HintText = 23;
+       CS_UM_KeyHintText = 24;
+       CS_UM_ProcessSpottedEntityUpdate = 25;
+       CS_UM_ReloadEffect = 26;
+       CS_UM_AdjustMoney = 27;
+       CS_UM_StopSpectatorMode = 29;
+       CS_UM_KillCam = 30;
+       CS_UM_DesiredTimescale = 31;
+       CS_UM_CurrentTimescale = 32;
+       CS_UM_AchievementEvent = 33;
+       CS_UM_MatchEndConditions = 34;
+       CS_UM_DisconnectToLobby = 35;
+       CS_UM_PlayerStatsUpdate = 36;
+       CS_UM_DisplayInventory = 37;
+       CS_UM_WarmupHasEnded = 38;
+       CS_UM_ClientInfo = 39;
+       CS_UM_XRankGet = 40;
+       CS_UM_XRankUpd = 41;
+       CS_UM_CallVoteFailed = 45;
+       CS_UM_VoteStart = 46;
+       CS_UM_VotePass = 47;
+       CS_UM_VoteFailed = 48;
+       CS_UM_VoteSetup = 49;
+       CS_UM_ServerRankRevealAll = 50;
+       CS_UM_SendLastKillerDamageToClient = 51;
+       CS_UM_ServerRankUpdate = 52;
+       CS_UM_ItemPickup = 53;
+       CS_UM_ShowMenu = 54;
+       CS_UM_BarTime = 55;
+       CS_UM_AmmoDenied = 56;
+       CS_UM_MarkAchievement = 57;
+       CS_UM_MatchStatsUpdate = 58;
+       CS_UM_ItemDrop = 59;
+       CS_UM_GlowPropTurnOff = 60;
+       CS_UM_SendPlayerItemDrops = 61;
+       CS_UM_RoundBackupFilenames = 62;
+       CS_UM_SendPlayerItemFound = 63;
+       CS_UM_ReportHit = 64;
+       CS_UM_XpUpdate = 65;
+       CS_UM_QuestProgress = 66;
+       CS_UM_ScoreLeaderboardData = 67;
+}
+
+message CCSUsrMsg_VGUIMenu {
+       message Subkey {
+               optional string name = 1;
+               optional string str = 2;
+       }
+
+       optional string name = 1;
+       optional bool show = 2;
+       repeated .CCSUsrMsg_VGUIMenu.Subkey subkeys = 3;
+}
+
+message CCSUsrMsg_Geiger {
+       optional int32 range = 1;
+}
+
+message CCSUsrMsg_Train {
+       optional int32 train = 1;
+}
+
+message CCSUsrMsg_HudText {
+       optional string text = 1;
+}
+
+message CCSUsrMsg_SayText {
+       optional int32 ent_idx = 1;
+       optional string text = 2;
+       optional bool chat = 3;
+       optional bool textallchat = 4;
+}
+
+message CCSUsrMsg_SayText2 {
+       optional int32 ent_idx = 1;
+       optional bool chat = 2;
+       optional string msg_name = 3;
+       repeated string params = 4;
+       optional bool textallchat = 5;
+}
+
+message CCSUsrMsg_TextMsg {
+       optional int32 msg_dst = 1;
+       repeated string params = 3;
+}
+
+message CCSUsrMsg_HudMsg {
+       optional int32 channel = 1;
+       optional CMsgVector2D pos = 2;
+       optional CMsgRGBA clr1 = 3;
+       optional CMsgRGBA clr2 = 4;
+       optional int32 effect = 5;
+       optional float fade_in_time = 6;
+       optional float fade_out_time = 7;
+       optional float hold_time = 9;
+       optional float fx_time = 10;
+       optional string text = 11;
+}
+
+message CCSUsrMsg_Shake {
+       optional int32 command = 1;
+       optional float local_amplitude = 2;
+       optional float frequency = 3;
+       optional float duration = 4;
+}
+
+message CCSUsrMsg_Fade {
+       optional int32 duration = 1;
+       optional int32 hold_time = 2;
+       optional int32 flags = 3;
+       optional CMsgRGBA clr = 4;
+}
+
+message CCSUsrMsg_Rumble {
+       optional int32 index = 1;
+       optional int32 data = 2;
+       optional int32 flags = 3;
+}
+
+message CCSUsrMsg_CloseCaption {
+       optional uint32 hash = 1;
+       optional int32 duration = 2;
+       optional bool from_player = 3;
+}
+
+message CCSUsrMsg_CloseCaptionDirect {
+       optional uint32 hash = 1;
+       optional int32 duration = 2;
+       optional bool from_player = 3;
+}
+
+message CCSUsrMsg_SendAudio {
+       optional string radio_sound = 1;
+}
+
+message CCSUsrMsg_RawAudio {
+       optional int32 pitch = 1;
+       optional int32 entidx = 2;
+       optional float duration = 3;
+       optional string voice_filename = 4;
+}
+
+message CCSUsrMsg_VoiceMask {
+       message PlayerMask {
+               optional int32 game_rules_mask = 1;
+               optional int32 ban_masks = 2;
+       }
+
+       repeated .CCSUsrMsg_VoiceMask.PlayerMask player_masks = 1;
+       optional bool player_mod_enable = 2;
+}
+
+message CCSUsrMsg_Damage {
+       optional int32 amount = 1;
+       optional CMsgVector inflictor_world_pos = 2;
+       optional int32 victim_entindex = 3;
+}
+
+message CCSUsrMsg_RadioText {
+       optional int32 msg_dst = 1;
+       optional int32 client = 2;
+       optional string msg_name = 3;
+       repeated string params = 4;
+}
+
+message CCSUsrMsg_HintText {
+       optional string text = 1;
+}
+
+message CCSUsrMsg_KeyHintText {
+       repeated string hints = 1;
+}
+
+message CCSUsrMsg_ProcessSpottedEntityUpdate {
+       message SpottedEntityUpdate {
+               optional int32 entity_idx = 1;
+               optional int32 class_id = 2;
+               optional int32 origin_x = 3;
+               optional int32 origin_y = 4;
+               optional int32 origin_z = 5;
+               optional int32 angle_y = 6;
+               optional bool defuser = 7;
+               optional bool player_has_defuser = 8;
+               optional bool player_has_c4 = 9;
+       }
+
+       optional bool new_update = 1;
+       repeated .CCSUsrMsg_ProcessSpottedEntityUpdate.SpottedEntityUpdate entity_updates = 2;
+}
+
+message CCSUsrMsg_SendPlayerItemDrops {
+       repeated .CEconItemPreviewDataBlock entity_updates = 1;
+}
+
+message CCSUsrMsg_SendPlayerItemFound {
+       optional CEconItemPreviewDataBlock iteminfo = 1;
+       optional int32 entindex = 2;
+}
+
+message CCSUsrMsg_ReloadEffect {
+       optional int32 entidx = 1;
+       optional int32 actanim = 2;
+       optional float origin_x = 3;
+       optional float origin_y = 4;
+       optional float origin_z = 5;
+}
+
+message CCSUsrMsg_AdjustMoney {
+       optional int32 amount = 1;
+}
+
+message CCSUsrMsg_ReportHit {
+       optional float pos_x = 1;
+       optional float pos_y = 2;
+       optional float timestamp = 4;
+       optional float pos_z = 3;
+}
+
+message CCSUsrMsg_KillCam {
+       optional int32 obs_mode = 1;
+       optional int32 first_target = 2;
+       optional int32 second_target = 3;
+}
+
+message CCSUsrMsg_DesiredTimescale {
+       optional float desired_timescale = 1;
+       optional float duration_realtime_sec = 2;
+       optional int32 interpolator_type = 3;
+       optional float start_blend_time = 4;
+}
+
+message CCSUsrMsg_CurrentTimescale {
+       optional float cur_timescale = 1;
+}
+
+message CCSUsrMsg_AchievementEvent {
+       optional int32 achievement = 1;
+       optional int32 count = 2;
+       optional int32 user_id = 3;
+}
+
+message CCSUsrMsg_MatchEndConditions {
+       optional int32 fraglimit = 1;
+       optional int32 mp_maxrounds = 2;
+       optional int32 mp_winlimit = 3;
+       optional int32 mp_timelimit = 4;
+}
+
+message CCSUsrMsg_PlayerStatsUpdate {
+       message Stat {
+               optional int32 idx = 1;
+               optional int32 delta = 2;
+       }
+
+       optional int32 version = 1;
+       repeated .CCSUsrMsg_PlayerStatsUpdate.Stat stats = 4;
+       optional int32 user_id = 5;
+       optional int32 crc = 6;
+}
+
+message CCSUsrMsg_DisplayInventory {
+       optional bool display = 1;
+       optional int32 user_id = 2;
+}
+
+message CCSUsrMsg_QuestProgress {
+       optional uint32 quest_id = 1;
+       optional uint32 normal_points = 2;
+       optional uint32 bonus_points = 3;
+       optional bool is_event_quest = 4;
+}
+
+message CCSUsrMsg_ScoreLeaderboardData {
+       optional ScoreLeaderboardData data = 1;
+}
+
+message CCSUsrMsg_XRankGet {
+       optional int32 mode_idx = 1;
+       optional int32 controller = 2;
+}
+
+message CCSUsrMsg_XRankUpd {
+       optional int32 mode_idx = 1;
+       optional int32 controller = 2;
+       optional int32 ranking = 3;
+}
+
+message CCSUsrMsg_CallVoteFailed {
+       optional int32 reason = 1;
+       optional int32 time = 2;
+}
+
+message CCSUsrMsg_VoteStart {
+       optional int32 team = 1;
+       optional int32 ent_idx = 2;
+       optional int32 vote_type = 3;
+       optional string disp_str = 4;
+       optional string details_str = 5;
+       optional string other_team_str = 6;
+       optional bool is_yes_no_vote = 7;
+}
+
+message CCSUsrMsg_VotePass {
+       optional int32 team = 1;
+       optional int32 vote_type = 2;
+       optional string disp_str = 3;
+       optional string details_str = 4;
+}
+
+message CCSUsrMsg_VoteFailed {
+       optional int32 team = 1;
+       optional int32 reason = 2;
+}
+
+message CCSUsrMsg_VoteSetup {
+       repeated string potential_issues = 1;
+}
+
+message CCSUsrMsg_SendLastKillerDamageToClient {
+       optional int32 num_hits_given = 1;
+       optional int32 damage_given = 2;
+       optional int32 num_hits_taken = 3;
+       optional int32 damage_taken = 4;
+}
+
+message CCSUsrMsg_ServerRankUpdate {
+       message RankUpdate {
+               optional int32 account_id = 1;
+               optional int32 rank_old = 2;
+               optional int32 rank_new = 3;
+               optional int32 num_wins = 4;
+               optional float rank_change = 5;
+       }
+
+       repeated .CCSUsrMsg_ServerRankUpdate.RankUpdate rank_update = 1;
+}
+
+message CCSUsrMsg_XpUpdate {
+       optional CMsgGCCstrike15_v2_GC2ServerNotifyXPRewarded data = 1;
+}
+
+message CCSUsrMsg_ItemPickup {
+       optional string item = 1;
+}
+
+message CCSUsrMsg_ShowMenu {
+       optional int32 bits_valid_slots = 1;
+       optional int32 display_time = 2;
+       optional string menu_string = 3;
+}
+
+message CCSUsrMsg_BarTime {
+       optional string time = 1;
+}
+
+message CCSUsrMsg_AmmoDenied {
+       optional int32 ammoIdx = 1;
+}
+
+message CCSUsrMsg_MarkAchievement {
+       optional string achievement = 1;
+}
+
+message CCSUsrMsg_MatchStatsUpdate {
+       optional string update = 1;
+}
+
+message CCSUsrMsg_ItemDrop {
+       optional int64 itemid = 1;
+       optional bool death = 2;
+}
+
+message CCSUsrMsg_GlowPropTurnOff {
+       optional int32 entidx = 1;
+}
+
+message CCSUsrMsg_RoundBackupFilenames {
+       optional int32 count = 1;
+       optional int32 index = 2;
+       optional string filename = 3;
+       optional string nicename = 4;
+}
+
+message CCSUsrMsg_ResetHud {
+       optional bool reset = 1;
+}
+
+message CCSUsrMsg_GameTitle {
+       optional int32 dummy = 1;
+}
+
+message CCSUsrMsg_RequestState {
+       optional int32 dummy = 1;
+}
+
+message CCSUsrMsg_StopSpectatorMode {
+       optional int32 dummy = 1;
+}
+
+message CCSUsrMsg_DisconnectToLobby {
+       optional int32 dummy = 1;
+}
+
+message CCSUsrMsg_WarmupHasEnded {
+       optional int32 dummy = 1;
+}
+
+message CCSUsrMsg_ClientInfo {
+       optional int32 dummy = 1;
+}
+
+message CCSUsrMsg_ServerRankRevealAll {
+       optional int32 seconds_till_shutdown = 1;
+}
+
+
diff --git a/src/proto/netmessages_public.proto b/src/proto/netmessages_public.proto
new file mode 100644 (file)
index 0000000..8ad1d53
--- /dev/null
@@ -0,0 +1,555 @@
+//====== Copyright (c) 2013, Valve Corporation, All rights reserved. ========//\r
+//\r
+// Redistribution and use in source and binary forms, with or without \r
+// modification, are permitted provided that the following conditions are met:\r
+//\r
+// Redistributions of source code must retain the above copyright notice, this\r
+// list of conditions and the following disclaimer.\r
+// Redistributions in binary form must reproduce the above copyright notice, \r
+// this list of conditions and the following disclaimer in the documentation \r
+// and/or other materials provided with the distribution.\r
+//\r
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"\r
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE \r
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE \r
+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE \r
+// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR \r
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF \r
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS \r
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN \r
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) \r
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF \r
+// THE POSSIBILITY OF SUCH DAMAGE.\r
+//===========================================================================//\r
+//\r
+// Purpose: The file defines our Google Protocol Buffers which are used in over \r
+// the wire messages for the Source engine.\r
+//\r
+//=============================================================================\r
+\r
+// Note about encoding:\r
+//     http://code.google.com/apis/protocolbuffers/docs/encoding.html\r
+//\r
+// TL;DR: Use sint32/sint64 for values that may be negative.\r
+//\r
+// There is an important difference between the signed int types (sint32 and sint64)\r
+// and the "standard" int types (int32 and int64) when it comes to encoding negative\r
+// numbers.  If you use int32 or int64 as the type for a negative number, the\r
+// resulting varint is always ten bytes long \96 it is, effectively, treated like a\r
+// very large unsigned integer.  If you use one of the signed types, the resulting\r
+// varint uses ZigZag encoding, which is much more efficient.\r
+\r
+\r
+// Commenting this out allows it to be compiled for SPEED or LITE_RUNTIME.\r
+// option optimize_for = SPEED;\r
+\r
+// We don't use the service generation functionality\r
+option cc_generic_services = false;\r
+\r
+\r
+// \r
+// STYLE NOTES:\r
+//\r
+// Use CamelCase CMsgMyMessageName style names for messages.\r
+// \r
+// Use lowercase _ delimited names like my_steam_id for field names, this is non-standard for Steam,\r
+// but plays nice with the Google formatted code generation.  \r
+// \r
+// Try not to use required fields ever. Only do so if you are really really sure you'll never want them removed. \r
+// Optional should be preffered as it will make versioning easier and cleaner in the future if someone refactors\r
+// your message and wants to remove or rename fields.\r
+//\r
+// Use fixed64 for JobId_t, GID_t, or SteamID.  This is appropriate for any field that is normally\r
+// going to be larger than 2^56.  Otherwise use int64 for 64 bit values that are frequently smaller\r
+// than 2^56 as it will safe space on the wire in those cases.\r
+//\r
+// Similar to fixed64, use fixed32 for RTime32 or other 32 bit values that are frequently larger than\r
+// 2^28.  It will safe space in those cases, otherwise use int32 which will safe space for smaller values.\r
+// An exception to this rule for RTime32 is if the value will frequently be zero rather than set to an actual \r
+// time.\r
+//\r
+\r
+import "google/protobuf/descriptor.proto";\r
+\r
+enum NET_Messages {\r
+       net_NOP = 0;\r
+       net_Disconnect = 1;\r
+       net_File = 2;\r
+       net_SplitScreenUser = 3;\r
+       net_Tick = 4;\r
+       net_StringCmd = 5;\r
+       net_SetConVar = 6;\r
+       net_SignonState = 7;\r
+       net_PlayerAvatarData = 100;\r
+}\r
+\r
+enum CLC_Messages {\r
+       clc_ClientInfo = 8;\r
+       clc_Move = 9;\r
+       clc_VoiceData = 10;\r
+       clc_BaselineAck = 11;\r
+       clc_ListenEvents = 12;\r
+       clc_RespondCvarValue = 13;\r
+       clc_FileCRCCheck = 14;\r
+       clc_LoadingProgress = 15;\r
+       clc_SplitPlayerConnect = 16;\r
+       clc_ClientMessage = 17;\r
+       clc_CmdKeyValues = 18;\r
+       clc_HltvReplay = 20;\r
+}\r
+\r
+enum VoiceDataFormat_t {\r
+       VOICEDATA_FORMAT_STEAM = 0;\r
+       VOICEDATA_FORMAT_ENGINE = 1;\r
+}\r
+\r
+enum ESplitScreenMessageType {\r
+       option allow_alias = true;\r
+       MSG_SPLITSCREEN_ADDUSER = 0;\r
+       MSG_SPLITSCREEN_REMOVEUSER = 1;\r
+       MSG_SPLITSCREEN_TYPE_BITS = 1;\r
+}\r
+\r
+enum SVC_Messages {\r
+       svc_ServerInfo = 8;\r
+       svc_SendTable = 9;\r
+       svc_ClassInfo = 10;\r
+       svc_SetPause = 11;\r
+       svc_CreateStringTable = 12;\r
+       svc_UpdateStringTable = 13;\r
+       svc_VoiceInit = 14;\r
+       svc_VoiceData = 15;\r
+       svc_Print = 16;\r
+       svc_Sounds = 17;\r
+       svc_SetView = 18;\r
+       svc_FixAngle = 19;\r
+       svc_CrosshairAngle = 20;\r
+       svc_BSPDecal = 21;\r
+       svc_SplitScreen = 22;\r
+       svc_UserMessage = 23;\r
+       svc_EntityMessage = 24;\r
+       svc_GameEvent = 25;\r
+       svc_PacketEntities = 26;\r
+       svc_TempEntities = 27;\r
+       svc_Prefetch = 28;\r
+       svc_Menu = 29;\r
+       svc_GameEventList = 30;\r
+       svc_GetCvarValue = 31;\r
+       svc_PaintmapData = 33;\r
+       svc_CmdKeyValues = 34;\r
+       svc_EncryptedData = 35;\r
+       svc_HltvReplay = 36;\r
+}\r
+\r
+enum ReplayEventType_t {\r
+       REPLAY_EVENT_CANCEL = 0;\r
+       REPLAY_EVENT_DEATH = 1;\r
+       REPLAY_EVENT_GENERIC = 2;\r
+       REPLAY_EVENT_STUCK_NEED_FULL_UPDATE = 3;\r
+}\r
+\r
+message CMsgVector {\r
+       optional float x = 1;\r
+       optional float y = 2;\r
+       optional float z = 3;\r
+}\r
+\r
+message CMsgVector2D {\r
+       optional float x = 1;\r
+       optional float y = 2;\r
+}\r
+\r
+message CMsgQAngle {\r
+       optional float x = 1;\r
+       optional float y = 2;\r
+       optional float z = 3;\r
+}\r
+\r
+message CMsgRGBA {\r
+       optional int32 r = 1;\r
+       optional int32 g = 2;\r
+       optional int32 b = 3;\r
+       optional int32 a = 4;\r
+}\r
+\r
+message CNETMsg_Tick {\r
+       optional uint32 tick = 1;\r
+       optional uint32 host_computationtime = 4;\r
+       optional uint32 host_computationtime_std_deviation = 5;\r
+       optional uint32 host_framestarttime_std_deviation = 6;\r
+       optional uint32 hltv_replay_flags = 7;\r
+}\r
+\r
+message CNETMsg_StringCmd {\r
+       optional string command = 1;\r
+}\r
+\r
+message CNETMsg_SignonState {\r
+       optional uint32 signon_state = 1;\r
+       optional uint32 spawn_count = 2;\r
+       optional uint32 num_server_players = 3;\r
+       repeated string players_networkids = 4;\r
+       optional string map_name = 5;\r
+}\r
+\r
+message CMsg_CVars {\r
+       message CVar {\r
+               optional string name = 1;\r
+               optional string value = 2;\r
+               optional uint32 dictionary_name = 3;\r
+       }\r
+\r
+       repeated .CMsg_CVars.CVar cvars = 1;\r
+}\r
+\r
+message CNETMsg_SetConVar {\r
+       optional .CMsg_CVars convars = 1;\r
+}\r
+\r
+message CNETMsg_NOP {\r
+}\r
+\r
+message CNETMsg_Disconnect {\r
+       optional string text = 1;\r
+}\r
+\r
+message CNETMsg_File {\r
+       optional int32 transfer_id = 1;\r
+       optional string file_name = 2;\r
+       optional bool is_replay_demo_file = 3;\r
+       optional bool deny = 4;\r
+}\r
+\r
+message CNETMsg_SplitScreenUser {\r
+       optional int32 slot = 1;\r
+}\r
+\r
+message CNETMsg_PlayerAvatarData {\r
+       optional uint32 accountid = 1;\r
+       optional bytes rgb = 2;\r
+}\r
+\r
+message CCLCMsg_ClientInfo {\r
+       optional fixed32 send_table_crc = 1;\r
+       optional uint32 server_count = 2;\r
+       optional bool is_hltv = 3;\r
+       optional bool is_replay = 4;\r
+       optional uint32 friends_id = 5;\r
+       optional string friends_name = 6;\r
+       repeated fixed32 custom_files = 7;\r
+}\r
+\r
+message CCLCMsg_Move {\r
+       optional uint32 num_backup_commands = 1;\r
+       optional uint32 num_new_commands = 2;\r
+       optional bytes data = 3;\r
+}\r
+\r
+message CCLCMsg_VoiceData {\r
+       optional bytes data = 1;\r
+       optional fixed64 xuid = 2;\r
+       optional .VoiceDataFormat_t format = 3 [default = VOICEDATA_FORMAT_ENGINE];\r
+       optional int32 sequence_bytes = 4;\r
+       optional uint32 section_number = 5;\r
+       optional uint32 uncompressed_sample_offset = 6;\r
+}\r
+\r
+message CCLCMsg_BaselineAck {\r
+       optional int32 baseline_tick = 1;\r
+       optional int32 baseline_nr = 2;\r
+}\r
+\r
+message CCLCMsg_ListenEvents {\r
+       repeated fixed32 event_mask = 1;\r
+}\r
+\r
+message CCLCMsg_RespondCvarValue {\r
+       optional int32 cookie = 1;\r
+       optional int32 status_code = 2;\r
+       optional string name = 3;\r
+       optional string value = 4;\r
+}\r
+\r
+message CCLCMsg_FileCRCCheck {\r
+       optional int32 code_path = 1;\r
+       optional string path = 2;\r
+       optional int32 code_filename = 3;\r
+       optional string filename = 4;\r
+       optional int32 file_fraction = 5;\r
+       optional bytes md5 = 6;\r
+       optional uint32 crc = 7;\r
+       optional int32 file_hash_type = 8;\r
+       optional int32 file_len = 9;\r
+       optional int32 pack_file_id = 10;\r
+       optional int32 pack_file_number = 11;\r
+}\r
+\r
+message CCLCMsg_LoadingProgress {\r
+       optional int32 progress = 1;\r
+}\r
+\r
+message CCLCMsg_SplitPlayerConnect {\r
+       optional .CMsg_CVars convars = 1;\r
+}\r
+\r
+message CCLCMsg_CmdKeyValues {\r
+       optional bytes keyvalues = 1;\r
+}\r
+\r
+message CSVCMsg_ServerInfo {\r
+       optional int32 protocol = 1;\r
+       optional int32 server_count = 2;\r
+       optional bool is_dedicated = 3;\r
+       optional bool is_official_valve_server = 4;\r
+       optional bool is_hltv = 5;\r
+       optional bool is_replay = 6;\r
+       optional bool is_redirecting_to_proxy_relay = 21;\r
+       optional int32 c_os = 7;\r
+       optional fixed32 map_crc = 8;\r
+       optional fixed32 client_crc = 9;\r
+       optional fixed32 string_table_crc = 10;\r
+       optional int32 max_clients = 11;\r
+       optional int32 max_classes = 12;\r
+       optional int32 player_slot = 13;\r
+       optional float tick_interval = 14;\r
+       optional string game_dir = 15;\r
+       optional string map_name = 16;\r
+       optional string map_group_name = 17;\r
+       optional string sky_name = 18;\r
+       optional string host_name = 19;\r
+       optional uint32 public_ip = 20;\r
+       optional uint64 ugc_map_id = 22;\r
+}\r
+\r
+message CSVCMsg_ClassInfo {\r
+       message class_t {\r
+               optional int32 class_id = 1;\r
+               optional string data_table_name = 2;\r
+               optional string class_name = 3;\r
+       }\r
+\r
+       optional bool create_on_client = 1;\r
+       repeated .CSVCMsg_ClassInfo.class_t classes = 2;\r
+}\r
+\r
+message CSVCMsg_SendTable {\r
+       message sendprop_t {\r
+               optional int32 type = 1;\r
+               optional string var_name = 2;\r
+               optional int32 flags = 3;\r
+               optional int32 priority = 4;\r
+               optional string dt_name = 5;\r
+               optional int32 num_elements = 6;\r
+               optional float low_value = 7;\r
+               optional float high_value = 8;\r
+               optional int32 num_bits = 9;\r
+       }\r
+\r
+       optional bool is_end = 1;\r
+       optional string net_table_name = 2;\r
+       optional bool needs_decoder = 3;\r
+       repeated .CSVCMsg_SendTable.sendprop_t props = 4;\r
+}\r
+\r
+message CSVCMsg_Print {\r
+       optional string text = 1;\r
+}\r
+\r
+message CSVCMsg_SetPause {\r
+       optional bool paused = 1;\r
+}\r
+\r
+message CSVCMsg_SetView {\r
+       optional int32 entity_index = 1;\r
+}\r
+\r
+message CSVCMsg_CreateStringTable {\r
+       optional string name = 1;\r
+       optional int32 max_entries = 2;\r
+       optional int32 num_entries = 3;\r
+       optional bool user_data_fixed_size = 4;\r
+       optional int32 user_data_size = 5;\r
+       optional int32 user_data_size_bits = 6;\r
+       optional int32 flags = 7;\r
+       optional bytes string_data = 8;\r
+}\r
+\r
+message CSVCMsg_UpdateStringTable {\r
+       optional int32 table_id = 1;\r
+       optional int32 num_changed_entries = 2;\r
+       optional bytes string_data = 3;\r
+}\r
+\r
+message CSVCMsg_VoiceInit {\r
+       optional int32 quality = 1;\r
+       optional string codec = 2;\r
+       optional int32 version = 3 [default = 0];\r
+}\r
+\r
+message CSVCMsg_VoiceData {\r
+       optional int32 client = 1;\r
+       optional bool proximity = 2;\r
+       optional fixed64 xuid = 3;\r
+       optional int32 audible_mask = 4;\r
+       optional bytes voice_data = 5;\r
+       optional bool caster = 6;\r
+       optional .VoiceDataFormat_t format = 7 [default = VOICEDATA_FORMAT_ENGINE];\r
+       optional int32 sequence_bytes = 8;\r
+       optional uint32 section_number = 9;\r
+       optional uint32 uncompressed_sample_offset = 10;\r
+}\r
+\r
+message CSVCMsg_FixAngle {\r
+       optional bool relative = 1;\r
+       optional .CMsgQAngle angle = 2;\r
+}\r
+\r
+message CSVCMsg_CrosshairAngle {\r
+       optional .CMsgQAngle angle = 1;\r
+}\r
+\r
+message CSVCMsg_Prefetch {\r
+       optional int32 sound_index = 1;\r
+}\r
+\r
+message CSVCMsg_BSPDecal {\r
+       optional .CMsgVector pos = 1;\r
+       optional int32 decal_texture_index = 2;\r
+       optional int32 entity_index = 3;\r
+       optional int32 model_index = 4;\r
+       optional bool low_priority = 5;\r
+}\r
+\r
+message CSVCMsg_SplitScreen {\r
+       optional .ESplitScreenMessageType type = 1 [default = MSG_SPLITSCREEN_ADDUSER];\r
+       optional int32 slot = 2;\r
+       optional int32 player_index = 3;\r
+}\r
+\r
+message CSVCMsg_GetCvarValue {\r
+       optional int32 cookie = 1;\r
+       optional string cvar_name = 2;\r
+}\r
+\r
+message CSVCMsg_Menu {\r
+       optional int32 dialog_type = 1;\r
+       optional bytes menu_key_values = 2;\r
+}\r
+\r
+message CSVCMsg_UserMessage {\r
+       optional int32 msg_type = 1;\r
+       optional bytes msg_data = 2;\r
+       optional int32 passthrough = 3;\r
+}\r
+\r
+message CSVCMsg_PaintmapData {\r
+       optional bytes paintmap = 1;\r
+}\r
+\r
+message CSVCMsg_GameEvent {\r
+       message key_t {\r
+               optional int32 type = 1;\r
+               optional string val_string = 2;\r
+               optional float val_float = 3;\r
+               optional int32 val_long = 4;\r
+               optional int32 val_short = 5;\r
+               optional int32 val_byte = 6;\r
+               optional bool val_bool = 7;\r
+               optional uint64 val_uint64 = 8;\r
+               optional bytes val_wstring = 9;\r
+       }\r
+\r
+       optional string event_name = 1;\r
+       optional int32 eventid = 2;\r
+       repeated .CSVCMsg_GameEvent.key_t keys = 3;\r
+       optional int32 passthrough = 4;\r
+}\r
+\r
+message CSVCMsg_GameEventList {\r
+       message key_t {\r
+               optional int32 type = 1;\r
+               optional string name = 2;\r
+       }\r
+\r
+       message descriptor_t {\r
+               optional int32 eventid = 1;\r
+               optional string name = 2;\r
+               repeated .CSVCMsg_GameEventList.key_t keys = 3;\r
+       }\r
+\r
+       repeated .CSVCMsg_GameEventList.descriptor_t descriptors = 1;\r
+}\r
+\r
+message CSVCMsg_TempEntities {\r
+       optional bool reliable = 1;\r
+       optional int32 num_entries = 2;\r
+       optional bytes entity_data = 3;\r
+}\r
+\r
+message CSVCMsg_PacketEntities {\r
+       optional int32 max_entries = 1;\r
+       optional int32 updated_entries = 2;\r
+       optional bool is_delta = 3;\r
+       optional bool update_baseline = 4;\r
+       optional int32 baseline = 5;\r
+       optional int32 delta_from = 6;\r
+       optional bytes entity_data = 7;\r
+}\r
+\r
+message CSVCMsg_Sounds {\r
+       message sounddata_t {\r
+               optional sint32 origin_x = 1;\r
+               optional sint32 origin_y = 2;\r
+               optional sint32 origin_z = 3;\r
+               optional uint32 volume = 4;\r
+               optional float delay_value = 5;\r
+               optional int32 sequence_number = 6;\r
+               optional int32 entity_index = 7;\r
+               optional int32 channel = 8;\r
+               optional int32 pitch = 9;\r
+               optional int32 flags = 10;\r
+               optional uint32 sound_num = 11;\r
+               optional fixed32 sound_num_handle = 12;\r
+               optional int32 speaker_entity = 13;\r
+               optional int32 random_seed = 14;\r
+               optional int32 sound_level = 15;\r
+               optional bool is_sentence = 16;\r
+               optional bool is_ambient = 17;\r
+       }\r
+\r
+       optional bool reliable_sound = 1;\r
+       repeated .CSVCMsg_Sounds.sounddata_t sounds = 2;\r
+}\r
+\r
+message CSVCMsg_EntityMsg {\r
+       optional int32 ent_index = 1;\r
+       optional int32 class_id = 2;\r
+       optional bytes ent_data = 3;\r
+}\r
+\r
+message CSVCMsg_CmdKeyValues {\r
+       optional bytes keyvalues = 1;\r
+}\r
+\r
+message CSVCMsg_EncryptedData {\r
+       optional bytes encrypted = 1;\r
+       optional int32 key_type = 2;\r
+}\r
+\r
+message CSVCMsg_HltvReplay {\r
+       optional int32 delay = 1;\r
+       optional int32 primary_target = 2;\r
+       optional int32 replay_stop_at = 3;\r
+       optional int32 replay_start_at = 4;\r
+       optional int32 replay_slowdown_begin = 5;\r
+       optional int32 replay_slowdown_end = 6;\r
+       optional float replay_slowdown_rate = 7;\r
+}\r
+\r
+message CCLCMsg_HltvReplay {\r
+       optional int32 request = 1;\r
+       optional float slowdown_length = 2;\r
+       optional float slowdown_rate = 3;\r
+       optional int32 primary_target_ent_index = 4;\r
+       optional float event_time = 5;\r
+}\r
diff --git a/src/proto/proto.h b/src/proto/proto.h
new file mode 100644 (file)
index 0000000..b7dd531
--- /dev/null
@@ -0,0 +1,14 @@
+#ifndef PROTO_H
+#define PROTO_H
+
+typedef void proto_data;
+typedef void proto_info;
+
+proto_info* parse_proto_data(proto_data*);
+
+proto_info*
+parse_proto_data(proto_data* pd)
+{ static char buf[256];
+  return (proto_info*)&buf;
+}
+#endif
diff --git a/src/proto/steammessages.proto b/src/proto/steammessages.proto
new file mode 100644 (file)
index 0000000..b5d4374
--- /dev/null
@@ -0,0 +1,524 @@
+import "google/protobuf/descriptor.proto";
+
+option optimize_for = SPEED;
+option cc_generic_services = false;
+
+extend .google.protobuf.FieldOptions {
+       optional bool key_field = 60000 [default = false];
+}
+
+extend .google.protobuf.MessageOptions {
+       optional int32 msgpool_soft_limit = 60000 [default = 32];
+       optional int32 msgpool_hard_limit = 60001 [default = 384];
+}
+
+enum GCProtoBufMsgSrc {
+       GCProtoBufMsgSrc_Unspecified = 0;
+       GCProtoBufMsgSrc_FromSystem = 1;
+       GCProtoBufMsgSrc_FromSteamID = 2;
+       GCProtoBufMsgSrc_FromGC = 3;
+       GCProtoBufMsgSrc_ReplySystem = 4;
+}
+
+message CMsgProtoBufHeader {
+       option (msgpool_soft_limit) = 256;
+       option (msgpool_hard_limit) = 1024;
+       optional fixed64 client_steam_id = 1;
+       optional int32 client_session_id = 2;
+       optional uint32 source_app_id = 3;
+       optional fixed64 job_id_source = 10 [default = 18446744073709551615];
+       optional fixed64 job_id_target = 11 [default = 18446744073709551615];
+       optional string target_job_name = 12;
+       optional int32 eresult = 13 [default = 2];
+       optional string error_message = 14;
+       optional .GCProtoBufMsgSrc gc_msg_src = 200 [default = GCProtoBufMsgSrc_Unspecified];
+       optional uint32 gc_dir_index_source = 201;
+}
+
+message CMsgWebAPIKey {
+       optional uint32 status = 1 [default = 255];
+       optional uint32 account_id = 2 [default = 0];
+       optional uint32 publisher_group_id = 3 [default = 0];
+       optional uint32 key_id = 4;
+       optional string domain = 5;
+}
+
+message CMsgHttpRequest {
+       message RequestHeader {
+               optional string name = 1;
+               optional string value = 2;
+       }
+
+       message QueryParam {
+               optional string name = 1;
+               optional bytes value = 2;
+       }
+
+       optional uint32 request_method = 1;
+       optional string hostname = 2;
+       optional string url = 3;
+       repeated .CMsgHttpRequest.RequestHeader headers = 4;
+       repeated .CMsgHttpRequest.QueryParam get_params = 5;
+       repeated .CMsgHttpRequest.QueryParam post_params = 6;
+       optional bytes body = 7;
+       optional uint32 absolute_timeout = 8;
+}
+
+message CMsgWebAPIRequest {
+       optional string UNUSED_job_name = 1;
+       optional string interface_name = 2;
+       optional string method_name = 3;
+       optional uint32 version = 4;
+       optional .CMsgWebAPIKey api_key = 5;
+       optional .CMsgHttpRequest request = 6;
+       optional uint32 routing_app_id = 7;
+}
+
+message CMsgHttpResponse {
+       message ResponseHeader {
+               optional string name = 1;
+               optional string value = 2;
+       }
+
+       optional uint32 status_code = 1;
+       repeated .CMsgHttpResponse.ResponseHeader headers = 2;
+       optional bytes body = 3;
+}
+
+message CMsgAMFindAccounts {
+       optional uint32 search_type = 1;
+       optional string search_string = 2;
+}
+
+message CMsgAMFindAccountsResponse {
+       repeated fixed64 steam_id = 1;
+}
+
+message CMsgNotifyWatchdog {
+       optional uint32 source = 1;
+       optional uint32 alert_type = 2;
+       optional uint32 alert_destination = 3;
+       optional bool critical = 4;
+       optional uint32 time = 5;
+       optional uint32 appid = 6;
+       optional string text = 7;
+}
+
+message CMsgAMGetLicenses {
+       optional fixed64 steamid = 1;
+}
+
+message CMsgPackageLicense {
+       optional uint32 package_id = 1;
+       optional uint32 time_created = 2;
+       optional uint32 owner_id = 3;
+}
+
+message CMsgAMGetLicensesResponse {
+       repeated .CMsgPackageLicense license = 1;
+       optional uint32 result = 2;
+}
+
+message CMsgAMGetUserGameStats {
+       optional fixed64 steam_id = 1;
+       optional fixed64 game_id = 2;
+       repeated uint32 stats = 3;
+}
+
+message CMsgAMGetUserGameStatsResponse {
+       message Stats {
+               optional uint32 stat_id = 1;
+               optional uint32 stat_value = 2;
+       }
+
+       message Achievement_Blocks {
+               optional uint32 achievement_id = 1;
+               optional uint32 achievement_bit_id = 2;
+               optional fixed32 unlock_time = 3;
+       }
+
+       optional fixed64 steam_id = 1;
+       optional fixed64 game_id = 2;
+       optional int32 eresult = 3 [default = 2];
+       repeated .CMsgAMGetUserGameStatsResponse.Stats stats = 4;
+       repeated .CMsgAMGetUserGameStatsResponse.Achievement_Blocks achievement_blocks = 5;
+}
+
+message CMsgGCGetCommandList {
+       optional uint32 app_id = 1;
+       optional string command_prefix = 2;
+}
+
+message CMsgGCGetCommandListResponse {
+       repeated string command_name = 1;
+}
+
+message CGCMsgMemCachedGet {
+       repeated string keys = 1;
+}
+
+message CGCMsgMemCachedGetResponse {
+       message ValueTag {
+               optional bool found = 1;
+               optional bytes value = 2;
+       }
+
+       repeated .CGCMsgMemCachedGetResponse.ValueTag values = 1;
+}
+
+message CGCMsgMemCachedSet {
+       message KeyPair {
+               optional string name = 1;
+               optional bytes value = 2;
+       }
+
+       repeated .CGCMsgMemCachedSet.KeyPair keys = 1;
+}
+
+message CGCMsgMemCachedDelete {
+       repeated string keys = 1;
+}
+
+message CGCMsgMemCachedStats {
+}
+
+message CGCMsgMemCachedStatsResponse {
+       optional uint64 curr_connections = 1;
+       optional uint64 cmd_get = 2;
+       optional uint64 cmd_set = 3;
+       optional uint64 cmd_flush = 4;
+       optional uint64 get_hits = 5;
+       optional uint64 get_misses = 6;
+       optional uint64 delete_hits = 7;
+       optional uint64 delete_misses = 8;
+       optional uint64 bytes_read = 9;
+       optional uint64 bytes_written = 10;
+       optional uint64 limit_maxbytes = 11;
+       optional uint64 curr_items = 12;
+       optional uint64 evictions = 13;
+       optional uint64 bytes = 14;
+}
+
+message CGCMsgSQLStats {
+       optional uint32 schema_catalog = 1;
+}
+
+message CGCMsgSQLStatsResponse {
+       optional uint32 threads = 1;
+       optional uint32 threads_connected = 2;
+       optional uint32 threads_active = 3;
+       optional uint32 operations_submitted = 4;
+       optional uint32 prepared_statements_executed = 5;
+       optional uint32 non_prepared_statements_executed = 6;
+       optional uint32 deadlock_retries = 7;
+       optional uint32 operations_timed_out_in_queue = 8;
+       optional uint32 errors = 9;
+}
+
+message CMsgAMAddFreeLicense {
+       optional fixed64 steamid = 1;
+       optional uint32 ip_public = 2;
+       optional uint32 packageid = 3;
+       optional string store_country_code = 4;
+}
+
+message CMsgAMAddFreeLicenseResponse {
+       optional int32 eresult = 1 [default = 2];
+       optional int32 purchase_result_detail = 2;
+       optional fixed64 transid = 3;
+}
+
+message CGCMsgGetIPLocation {
+       repeated fixed32 ips = 1;
+}
+
+message CIPLocationInfo {
+       optional uint32 ip = 1;
+       optional float latitude = 2;
+       optional float longitude = 3;
+       optional string country = 4;
+       optional string state = 5;
+       optional string city = 6;
+}
+
+message CGCMsgGetIPLocationResponse {
+       repeated .CIPLocationInfo infos = 1;
+}
+
+message CGCMsgSystemStatsSchema {
+       optional uint32 gc_app_id = 1;
+       optional bytes schema_kv = 2;
+}
+
+message CGCMsgGetSystemStats {
+}
+
+message CGCMsgGetSystemStatsResponse {
+       optional uint32 gc_app_id = 1;
+       optional bytes stats_kv = 2;
+       optional uint32 active_jobs = 3;
+       optional uint32 yielding_jobs = 4;
+       optional uint32 user_sessions = 5;
+       optional uint32 game_server_sessions = 6;
+       optional uint32 socaches = 7;
+       optional uint32 socaches_to_unload = 8;
+       optional uint32 socaches_loading = 9;
+       optional uint32 writeback_queue = 10;
+       optional uint32 steamid_locks = 11;
+       optional uint32 logon_queue = 12;
+       optional uint32 logon_jobs = 13;
+}
+
+message CMsgAMSendEmail {
+       message ReplacementToken {
+               optional string token_name = 1;
+               optional string token_value = 2;
+       }
+
+       message PersonaNameReplacementToken {
+               optional fixed64 steamid = 1;
+               optional string token_name = 2;
+       }
+
+       optional fixed64 steamid = 1;
+       optional uint32 email_msg_type = 2;
+       optional uint32 email_format = 3;
+       repeated .CMsgAMSendEmail.PersonaNameReplacementToken persona_name_tokens = 5;
+       optional uint32 source_gc = 6;
+       repeated .CMsgAMSendEmail.ReplacementToken tokens = 7;
+}
+
+message CMsgAMSendEmailResponse {
+       optional uint32 eresult = 1 [default = 2];
+}
+
+message CMsgGCGetEmailTemplate {
+       optional uint32 app_id = 1;
+       optional uint32 email_msg_type = 2;
+       optional int32 email_lang = 3;
+       optional int32 email_format = 4;
+}
+
+message CMsgGCGetEmailTemplateResponse {
+       optional uint32 eresult = 1 [default = 2];
+       optional bool template_exists = 2;
+       optional string template = 3;
+}
+
+message CMsgAMGrantGuestPasses2 {
+       optional fixed64 steam_id = 1;
+       optional uint32 package_id = 2;
+       optional int32 passes_to_grant = 3;
+       optional int32 days_to_expiration = 4;
+       optional int32 action = 5;
+}
+
+message CMsgAMGrantGuestPasses2Response {
+       optional int32 eresult = 1 [default = 2];
+       optional int32 passes_granted = 2 [default = 0];
+}
+
+message CGCSystemMsg_GetAccountDetails {
+       option (msgpool_soft_limit) = 128;
+       option (msgpool_hard_limit) = 512;
+       optional fixed64 steamid = 1;
+       optional uint32 appid = 2;
+}
+
+message CGCSystemMsg_GetAccountDetails_Response {
+       option (msgpool_soft_limit) = 128;
+       option (msgpool_hard_limit) = 512;
+       optional uint32 eresult_deprecated = 1 [default = 2];
+       optional string account_name = 2;
+       optional string persona_name = 3;
+       optional bool is_profile_public = 4;
+       optional bool is_inventory_public = 5;
+       optional bool is_vac_banned = 7;
+       optional bool is_cyber_cafe = 8;
+       optional bool is_school_account = 9;
+       optional bool is_limited = 10;
+       optional bool is_subscribed = 11;
+       optional uint32 package = 12;
+       optional bool is_free_trial_account = 13;
+       optional uint32 free_trial_expiration = 14;
+       optional bool is_low_violence = 15;
+       optional bool is_account_locked_down = 16;
+       optional bool is_community_banned = 17;
+       optional bool is_trade_banned = 18;
+       optional uint32 trade_ban_expiration = 19;
+       optional uint32 accountid = 20;
+       optional uint32 suspension_end_time = 21;
+       optional string currency = 22;
+       optional uint32 steam_level = 23;
+       optional uint32 friend_count = 24;
+       optional uint32 account_creation_time = 25;
+       optional bool is_steamguard_enabled = 27;
+       optional bool is_phone_verified = 28;
+       optional bool is_two_factor_auth_enabled = 29;
+       optional uint32 two_factor_enabled_time = 30;
+       optional uint32 phone_verification_time = 31;
+       optional uint64 phone_id = 33;
+       optional bool is_phone_identifying = 34;
+}
+
+message CMsgGCGetPersonaNames {
+       repeated fixed64 steamids = 1;
+}
+
+message CMsgGCGetPersonaNames_Response {
+       message PersonaName {
+               optional fixed64 steamid = 1;
+               optional string persona_name = 2;
+       }
+
+       repeated .CMsgGCGetPersonaNames_Response.PersonaName succeeded_lookups = 1;
+       repeated fixed64 failed_lookup_steamids = 2;
+}
+
+message CMsgGCCheckFriendship {
+       optional fixed64 steamid_left = 1;
+       optional fixed64 steamid_right = 2;
+}
+
+message CMsgGCCheckFriendship_Response {
+       optional bool success = 1;
+       optional bool found_friendship = 2;
+}
+
+message CMsgGCMsgMasterSetDirectory {
+       message SubGC {
+               optional uint32 dir_index = 1;
+               optional string name = 2;
+               optional string box = 3;
+               optional string command_line = 4;
+               optional string gc_binary = 5;
+       }
+
+       optional uint32 master_dir_index = 1;
+       repeated .CMsgGCMsgMasterSetDirectory.SubGC dir = 2;
+}
+
+message CMsgGCMsgMasterSetDirectory_Response {
+       optional int32 eresult = 1 [default = 2];
+}
+
+message CMsgGCMsgWebAPIJobRequestForwardResponse {
+       optional uint32 dir_index = 1;
+}
+
+message CGCSystemMsg_GetPurchaseTrust_Request {
+       optional fixed64 steamid = 1;
+}
+
+message CGCSystemMsg_GetPurchaseTrust_Response {
+       optional bool has_prior_purchase_history = 1;
+       optional bool has_no_recent_password_resets = 2;
+       optional bool is_wallet_cash_trusted = 3;
+       optional uint32 time_all_trusted = 4;
+}
+
+message CMsgGCHAccountVacStatusChange {
+       optional fixed64 steam_id = 1;
+       optional uint32 app_id = 2;
+       optional uint32 rtime_vacban_starts = 3;
+       optional bool is_banned_now = 4;
+       optional bool is_banned_future = 5;
+}
+
+message CMsgGCGetPartnerAccountLink {
+       optional fixed64 steamid = 1;
+}
+
+message CMsgGCGetPartnerAccountLink_Response {
+       optional uint32 pwid = 1;
+       optional uint32 nexonid = 2;
+}
+
+message CMsgGCRoutingInfo {
+       enum RoutingMethod {
+               RANDOM = 0;
+               DISCARD = 1;
+               CLIENT_STEAMID = 2;
+               PROTOBUF_FIELD_UINT64 = 3;
+               WEBAPI_PARAM_UINT64 = 4;
+       }
+
+       repeated uint32 dir_index = 1;
+       optional .CMsgGCRoutingInfo.RoutingMethod method = 2 [default = RANDOM];
+       optional .CMsgGCRoutingInfo.RoutingMethod fallback = 3 [default = DISCARD];
+       optional uint32 protobuf_field = 4;
+       optional string webapi_param = 5;
+}
+
+message CMsgGCMsgMasterSetWebAPIRouting {
+       message Entry {
+               optional string interface_name = 1;
+               optional string method_name = 2;
+               optional .CMsgGCRoutingInfo routing = 3;
+       }
+
+       repeated .CMsgGCMsgMasterSetWebAPIRouting.Entry entries = 1;
+}
+
+message CMsgGCMsgMasterSetClientMsgRouting {
+       message Entry {
+               optional uint32 msg_type = 1;
+               optional .CMsgGCRoutingInfo routing = 2;
+       }
+
+       repeated .CMsgGCMsgMasterSetClientMsgRouting.Entry entries = 1;
+}
+
+message CMsgGCMsgMasterSetWebAPIRouting_Response {
+       optional int32 eresult = 1 [default = 2];
+}
+
+message CMsgGCMsgMasterSetClientMsgRouting_Response {
+       optional int32 eresult = 1 [default = 2];
+}
+
+message CMsgGCMsgSetOptions {
+       message MessageRange {
+               required uint32 low = 1;
+               required uint32 high = 2;
+       }
+
+       enum Option {
+               NOTIFY_USER_SESSIONS = 0;
+               NOTIFY_SERVER_SESSIONS = 1;
+               NOTIFY_ACHIEVEMENTS = 2;
+               NOTIFY_VAC_ACTION = 3;
+       }
+
+       repeated .CMsgGCMsgSetOptions.Option options = 1;
+       repeated .CMsgGCMsgSetOptions.MessageRange client_msg_ranges = 2;
+}
+
+message CMsgGCHUpdateSession {
+       message ExtraField {
+               optional string name = 1;
+               optional string value = 2;
+       }
+
+       optional fixed64 steam_id = 1;
+       optional uint32 app_id = 2;
+       optional bool online = 3;
+       optional fixed64 server_steam_id = 4;
+       optional uint32 server_addr = 5;
+       optional uint32 server_port = 6;
+       optional uint32 os_type = 7;
+       optional uint32 client_addr = 8;
+       repeated .CMsgGCHUpdateSession.ExtraField extra_fields = 9;
+}
+
+message CMsgNotificationOfSuspiciousActivity {
+       message MultipleGameInstances {
+               optional uint32 app_instance_count = 1;
+               repeated fixed64 other_steamids = 2;
+       }
+
+       optional fixed64 steamid = 1;
+       optional uint32 appid = 2;
+       optional .CMsgNotificationOfSuspiciousActivity.MultipleGameInstances multiple_instances = 3;
+}
+
diff --git a/thefuck b/thefuck
deleted file mode 100644 (file)
index ca11610..0000000
--- a/thefuck
+++ /dev/null
@@ -1,5 +0,0 @@
-i
-Deah im the shit i should put febreeze on it 
-A
-A
-
diff --git a/theshit b/theshit
deleted file mode 100644 (file)
index 8576acb..0000000
--- a/theshit
+++ /dev/null
@@ -1,5 +0,0 @@
-i
-Deah im the fuck i should put febreeze on it 
-A
-A
-