callbacks
[vg.git] / src / vg / vg_steam.h
index d6866b209e0f00deb0ca72d2437fbf91a540db95..d1e88be3af60ec5f35c7db01a836cf53c78d6a40 100644 (file)
@@ -27,6 +27,14 @@ typedef int E_iCallBack_t;
 typedef u64    u64_steamid;
 typedef u64 SteamAPICall_t;
 
+typedef u32 AppId_t;
+const AppId_t k_uAppIdInvalid = 0x0;
+
+typedef u32 DepotId_t;
+const DepotId_t k_uDepotIdInvalid = 0x0;
+
+typedef u32 RTime32;
+
 enum { k_iSteamUserCallbacks = 100 };
 enum { k_iSteamGameServerCallbacks = 200 };
 enum { k_iSteamFriendsCallbacks = 300 };
@@ -421,6 +429,15 @@ int   SteamGameServer_Init( u32 unIP, u16 usGamePort, u16 usQueryPort,
                                          eServerMode, pchVersionString );
 }
 
+
+void *SteamAPI_SteamGameServer_v014(void);
+void *SteamAPI_SteamGameServer(void) 
+{ 
+   return SteamAPI_SteamGameServer_v014(); 
+}
+
+void SteamAPI_ISteamGameServer_LogOnAnonymous( void* self );
+
 void SteamGameServer_Shutdown(void);
 
 int  SteamGameServer_BSecure(void);
@@ -453,8 +470,43 @@ steam_async *steam_new_async(void)
    return &steam_async_trackers[ steam_async_track_count ++ ];
 }
 
+/*
+ * Regular callbacks
+ * =============================================================================
+ */
+
+typedef struct steam_callback_handler steam_callback_handler;
+struct steam_callback_handler
+{
+   u32 callback_id;
+   void (*p_handler)( CallbackMsg_t *msg );
+}
+static steam_callback_handlers[64];
+static u32 steam_callback_handler_count;
+
+static int steam_register_callback( u32 id, 
+                                    void (*p_handler)( CallbackMsg_t *msg ) )
+{
+   if( steam_callback_handler_count == vg_list_size(steam_callback_handlers) )
+   {
+      vg_error( "Too many steam callback handlers registered (%u)\n", 
+                  steam_callback_handler_count );
+
+      return 0;
+   }
+   
+   steam_callback_handler *handler = &steam_callback_handlers[
+      steam_callback_handler_count ++ ];
+
+   handler->p_handler = p_handler;
+   handler->callback_id = id;
+   
+   return 1;
+}
+
 /*
  * Event loop
+ * =============================================================================
  */
 HSteamPipe SteamAPI_GetHSteamPipe(void);
 HSteamPipe SteamGameServer_GetHSteamPipe(void);
@@ -470,8 +522,7 @@ int SteamAPI_ManualDispatch_GetAPICallResult( HSteamPipe hSteamPipe,
 
 void   SteamAPI_ReleaseCurrentThreadMemory(void);
 
-static void steamworks_event_loop( HSteamPipe pipe, 
-                                   void(*callback_handler)(CallbackMsg_t *msg) )
+static void steamworks_event_loop( HSteamPipe pipe )
 {
        SteamAPI_ManualDispatch_RunFrame( pipe );
        CallbackMsg_t callback;
@@ -560,11 +611,30 @@ static void steamworks_event_loop( HSteamPipe pipe,
                         * void *data = callback.m_pubParam;
           */
 
-         callback_handler(&callback);
+         for( int i=0; i<steam_callback_handler_count; i++ )
+         {
+            steam_callback_handler *handler = &steam_callback_handlers[i];
+            if( handler->callback_id == callback.m_iCallback )
+            {
+               handler->p_handler( &callback );
+               break;
+            }
+         }
                }
                
                SteamAPI_ManualDispatch_FreeLastCallback( pipe );
        }
 }
 
+/*
+ * This is required to run the server outside of steamcmd environment.
+ * It can be any appid but idealy the one that is actually your game
+ */
+static void steamworks_ensure_txt( const char *appid_str )
+{
+   FILE *txt = fopen("steam_appid.txt", "w");
+   fputs( appid_str, txt );
+   fclose( txt );
+}
+
 #endif /* VG_STEAM_H */