mirror of
https://github.com/rlabrecque/SteamworksSDK.git
synced 2026-10-10 17:36:39 +08:00
v1.30
This commit is contained in:
@@ -51,7 +51,8 @@ CSpaceWarClient::CSpaceWarClient( IGameEngine *pGameEngine ) :
|
||||
m_SteamServerConnectFailure( this, &CSpaceWarClient::OnSteamServerConnectFailure ),
|
||||
m_GameJoinRequested( this, &CSpaceWarClient::OnGameJoinRequested ),
|
||||
m_CallbackGameOverlayActivated( this, &CSpaceWarClient::OnGameOverlayActivated ),
|
||||
m_CallbackGameWebCallback( this, &CSpaceWarClient::OnGameWebCallback )
|
||||
m_CallbackGameWebCallback( this, &CSpaceWarClient::OnGameWebCallback ),
|
||||
m_CallbackWorkshopItemInstalled( this, &CSpaceWarClient::OnWorkshopItemInstalled )
|
||||
{
|
||||
Init( pGameEngine );
|
||||
}
|
||||
@@ -128,6 +129,12 @@ void CSpaceWarClient::Init( IGameEngine *pGameEngine )
|
||||
// Initialize sun
|
||||
m_pSun = new CSun( pGameEngine );
|
||||
|
||||
m_nNumWorkshopItems = 0;
|
||||
for (uint32 i = 0; i < MAX_WORKSHOP_ITEMS; ++i)
|
||||
{
|
||||
m_rgpWorkshopItems[i] = NULL;
|
||||
}
|
||||
|
||||
// initialize P2P auth engine
|
||||
m_pP2PAuthedGame = new CP2PAuthedGame( m_pGameEngine );
|
||||
|
||||
@@ -148,6 +155,8 @@ void CSpaceWarClient::Init( IGameEngine *pGameEngine )
|
||||
|
||||
// P2P voice chat
|
||||
m_pVoiceChat = new CVoiceChat( pGameEngine );
|
||||
|
||||
LoadWorkshopItems();
|
||||
}
|
||||
|
||||
|
||||
@@ -203,6 +212,15 @@ CSpaceWarClient::~CSpaceWarClient()
|
||||
m_rgpShips[i] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
for (uint32 i = 0; i < MAX_WORKSHOP_ITEMS; ++i)
|
||||
{
|
||||
if ( m_rgpWorkshopItems[i] )
|
||||
{
|
||||
delete m_rgpWorkshopItems[i];
|
||||
m_rgpWorkshopItems[i] = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1304,6 +1322,14 @@ void CSpaceWarClient::RunFrame()
|
||||
if ( bEscapePressed )
|
||||
SetGameState( k_EClientGameMenu );
|
||||
break;
|
||||
case k_EClientWorkshop:
|
||||
m_pStarField->Render();
|
||||
DrawWorkshopItems();
|
||||
|
||||
if (bEscapePressed)
|
||||
SetGameState(k_EClientGameMenu);
|
||||
break;
|
||||
|
||||
case k_EClientStatsAchievements:
|
||||
m_pStarField->Render();
|
||||
m_pStatsAndAchievements->Render();
|
||||
@@ -1389,6 +1415,14 @@ void CSpaceWarClient::RunFrame()
|
||||
if ( m_rgpShips[i] )
|
||||
m_rgpShips[i]->RunFrame();
|
||||
}
|
||||
|
||||
for (uint32 i = 0; i < MAX_WORKSHOP_ITEMS; ++i)
|
||||
{
|
||||
if (m_rgpWorkshopItems[i])
|
||||
m_rgpWorkshopItems[i]->RunFrame();
|
||||
}
|
||||
|
||||
|
||||
DrawHUDText();
|
||||
|
||||
m_pStatsAndAchievements->RunFrame();
|
||||
@@ -1503,6 +1537,13 @@ void CSpaceWarClient::RunFrame()
|
||||
if ( m_rgpShips[i] )
|
||||
m_rgpShips[i]->Render();
|
||||
}
|
||||
|
||||
for (uint32 i = 0; i < MAX_WORKSHOP_ITEMS; ++i)
|
||||
{
|
||||
if ( m_rgpWorkshopItems[i] )
|
||||
m_rgpWorkshopItems[i]->Render();
|
||||
}
|
||||
|
||||
break;
|
||||
default:
|
||||
// Any needed drawing was already done above before server updates
|
||||
@@ -2003,3 +2044,184 @@ void CSpaceWarClient::ExecCommandLineConnect( const char *pchServerAddress, cons
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: parse CWorkshopItem from text file
|
||||
//-----------------------------------------------------------------------------
|
||||
CWorkshopItem *CSpaceWarClient::LoadWorkshopItemFromFile( const char *pszFileName )
|
||||
{
|
||||
FILE *file = fopen( pszFileName, "rt");
|
||||
if (!file)
|
||||
return NULL;
|
||||
|
||||
CWorkshopItem *pItem = NULL;
|
||||
|
||||
char szLine[1024];
|
||||
|
||||
if ( fgets(szLine, sizeof(szLine), file) )
|
||||
{
|
||||
float flXPos, flYPos, flXVelocity, flYVelocity;
|
||||
// initialize object
|
||||
if ( sscanf(szLine, "%f %f %f %f", &flXPos, &flYPos, &flXVelocity, &flYVelocity) )
|
||||
{
|
||||
pItem = new CWorkshopItem( m_pGameEngine, 0 );
|
||||
|
||||
pItem->SetPosition( flXPos, flYPos );
|
||||
pItem->SetVelocity( flXVelocity, flYVelocity );
|
||||
|
||||
while (!feof(file))
|
||||
{
|
||||
float xPos0, yPos0, xPos1, yPos1;
|
||||
DWORD dwColor;
|
||||
fgets(szLine, sizeof(szLine), file);
|
||||
|
||||
if (sscanf(szLine, "%f %f %f %f %x", &xPos0, &yPos0, &xPos1, &yPos1, &dwColor) >= 5)
|
||||
{
|
||||
// Add a line to the entity
|
||||
pItem->AddLine(xPos0, yPos0, xPos1, yPos1, dwColor);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fclose(file);
|
||||
|
||||
return pItem;
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: load a Workshop item by PublishFileID
|
||||
//-----------------------------------------------------------------------------
|
||||
bool CSpaceWarClient::LoadWorkshopItem( PublishedFileId_t workshopItemID )
|
||||
{
|
||||
if ( m_nNumWorkshopItems == MAX_WORKSHOP_ITEMS )
|
||||
return false; // too much
|
||||
|
||||
uint64 unSizeOnDisk = 0;
|
||||
char szItemFolder[1024] = { 0 };
|
||||
if ( !SteamUGC()->GetItemInstallInfo( workshopItemID, &unSizeOnDisk, szItemFolder, sizeof(szItemFolder) ) )
|
||||
return false;
|
||||
|
||||
char szFile[1024];
|
||||
_snprintf(szFile, sizeof(szFile), "%s/workshopitem.txt", szItemFolder);
|
||||
|
||||
CWorkshopItem *pItem = LoadWorkshopItemFromFile( szFile );
|
||||
|
||||
if ( !pItem )
|
||||
return false;
|
||||
|
||||
pItem->m_ItemDetails.m_nPublishedFileId = workshopItemID;
|
||||
m_rgpWorkshopItems[m_nNumWorkshopItems++] = pItem;
|
||||
|
||||
// get Workshop item details
|
||||
SteamAPICall_t hSteamAPICall = SteamUGC()->RequestUGCDetails( workshopItemID, 60 );
|
||||
pItem->m_SteamCallResultUGCDetails.Set(hSteamAPICall, pItem, &CWorkshopItem::OnUGCDetailsResult);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: load all subscribed workshop items
|
||||
//-----------------------------------------------------------------------------
|
||||
void CSpaceWarClient::LoadWorkshopItems()
|
||||
{
|
||||
// reset workshop Items
|
||||
for (uint32 i = 0; i < MAX_WORKSHOP_ITEMS; ++i)
|
||||
{
|
||||
if ( m_rgpWorkshopItems[i] )
|
||||
{
|
||||
delete m_rgpWorkshopItems[i];
|
||||
m_rgpWorkshopItems[i] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
m_nNumWorkshopItems = 0; // load default test item
|
||||
|
||||
PublishedFileId_t vecSubscribedItems[MAX_WORKSHOP_ITEMS];
|
||||
|
||||
int numSubscribedItems = SteamUGC()->GetSubscribedItems( vecSubscribedItems, MAX_WORKSHOP_ITEMS );
|
||||
|
||||
if ( numSubscribedItems > MAX_WORKSHOP_ITEMS )
|
||||
numSubscribedItems = MAX_WORKSHOP_ITEMS; // crop
|
||||
|
||||
// load all subscribed workshop items
|
||||
for ( int iSubscribedItem=0; iSubscribedItem<numSubscribedItems; iSubscribedItem++ )
|
||||
{
|
||||
PublishedFileId_t workshopItemID = vecSubscribedItems[iSubscribedItem];
|
||||
LoadWorkshopItem( workshopItemID );
|
||||
}
|
||||
|
||||
// load local test item
|
||||
if ( m_nNumWorkshopItems < MAX_WORKSHOP_ITEMS )
|
||||
{
|
||||
CWorkshopItem *pItem = LoadWorkshopItemFromFile("workshop/workshopitem.txt");
|
||||
|
||||
if ( pItem )
|
||||
{
|
||||
strncpy( pItem->m_ItemDetails.m_rgchTitle, "Test Item", k_cchPublishedDocumentTitleMax );
|
||||
strncpy( pItem->m_ItemDetails.m_rgchDescription, "This is a local test item for debugging", k_cchPublishedDocumentDescriptionMax );
|
||||
m_rgpWorkshopItems[m_nNumWorkshopItems++] = pItem;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: new Workshop was installed, load it instantly
|
||||
//-----------------------------------------------------------------------------
|
||||
void CSpaceWarClient::OnWorkshopItemInstalled( ItemInstalled_t *pParam )
|
||||
{
|
||||
if ( pParam->m_unAppID == SteamUtils()->GetAppID() )
|
||||
LoadWorkshopItem( pParam->m_nPublishedFileId );
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Draws PublishFileID, title & description for each subscribed Workshop item
|
||||
//-----------------------------------------------------------------------------
|
||||
void CSpaceWarClient::DrawWorkshopItems()
|
||||
{
|
||||
const int32 width = m_pGameEngine->GetViewportWidth();
|
||||
|
||||
RECT rect;
|
||||
rect.top = 0;
|
||||
rect.bottom = 64;
|
||||
rect.left = 0;
|
||||
rect.right = width;
|
||||
|
||||
char rgchBuffer[1024];
|
||||
sprintf_safe(rgchBuffer, "Subscribed Workshop Items");
|
||||
m_pGameEngine->BDrawString( m_hInstructionsFont, rect, D3DCOLOR_ARGB(255, 25, 200, 25), TEXTPOS_CENTER |TEXTPOS_VCENTER, rgchBuffer);
|
||||
|
||||
rect.left = 32;
|
||||
rect.top = 64;
|
||||
rect.bottom = 96;
|
||||
|
||||
for (int iSubscribedItem = 0; iSubscribedItem < MAX_WORKSHOP_ITEMS; iSubscribedItem++)
|
||||
{
|
||||
CWorkshopItem *pItem = m_rgpWorkshopItems[ iSubscribedItem ];
|
||||
|
||||
if ( !pItem )
|
||||
continue;
|
||||
|
||||
rect.top += 32;
|
||||
rect.bottom += 32;
|
||||
|
||||
sprintf_safe( rgchBuffer, "%u. \"%s\" (%llu) : %s", iSubscribedItem+1,
|
||||
pItem->m_ItemDetails.m_rgchTitle, pItem->m_ItemDetails.m_nPublishedFileId, pItem->m_ItemDetails.m_rgchDescription );
|
||||
|
||||
m_pGameEngine->BDrawString( m_hInstructionsFont, rect, D3DCOLOR_ARGB(255, 25, 200, 25), TEXTPOS_LEFT |TEXTPOS_VCENTER, rgchBuffer);
|
||||
}
|
||||
|
||||
rect.left = 0;
|
||||
rect.right = width;
|
||||
rect.top = LONG(m_pGameEngine->GetViewportHeight() * 0.8);
|
||||
rect.bottom = m_pGameEngine->GetViewportHeight();
|
||||
|
||||
sprintf_safe(rgchBuffer, "Press ESC to return to the Main Menu");
|
||||
m_pGameEngine->BDrawString(m_hInstructionsFont, rect, D3DCOLOR_ARGB(255, 25, 200, 25), TEXTPOS_CENTER | TEXTPOS_TOP, rgchBuffer);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user