232 lines
10 KiB
C++
232 lines
10 KiB
C++
#include "cbase.h"
|
|
#include "asw_voting_missions.h"
|
|
#include "asw_player.h"
|
|
#include "missionchooser/iasw_mission_chooser.h"
|
|
#include "missionchooser/iasw_mission_chooser_source.h"
|
|
#include "vstdlib/random.h"
|
|
|
|
// memdbgon must be the last include file in a .cpp file!!!
|
|
#include "tier0/memdbgon.h"
|
|
|
|
// todo: send proxy for our data table, so it only goes to one player?
|
|
|
|
LINK_ENTITY_TO_CLASS( asw_voting_missions, CASW_Voting_Missions );
|
|
|
|
extern void SendProxy_String_tToString( const SendProp *pProp, const void *pStruct, const void *pData, DVariant *pOut, int iElement, int objectID );
|
|
|
|
IMPLEMENT_SERVERCLASS_ST( CASW_Voting_Missions, DT_ASW_Voting_Missions )
|
|
// mission names
|
|
SendPropStringT( SENDINFO_NETWORKARRAYELEM( m_iszMissionNames, 0 ) ),
|
|
SendPropStringT( SENDINFO_NETWORKARRAYELEM( m_iszMissionNames, 1 ) ),
|
|
SendPropStringT( SENDINFO_NETWORKARRAYELEM( m_iszMissionNames, 2 ) ),
|
|
SendPropStringT( SENDINFO_NETWORKARRAYELEM( m_iszMissionNames, 3 ) ),
|
|
SendPropStringT( SENDINFO_NETWORKARRAYELEM( m_iszMissionNames, 4 ) ),
|
|
SendPropStringT( SENDINFO_NETWORKARRAYELEM( m_iszMissionNames, 5 ) ),
|
|
SendPropStringT( SENDINFO_NETWORKARRAYELEM( m_iszMissionNames, 6 ) ),
|
|
SendPropStringT( SENDINFO_NETWORKARRAYELEM( m_iszMissionNames, 7 ) ),
|
|
// campaign names
|
|
SendPropStringT( SENDINFO_NETWORKARRAYELEM( m_iszCampaignNames, 0 ) ),
|
|
SendPropStringT( SENDINFO_NETWORKARRAYELEM( m_iszCampaignNames, 1 ) ),
|
|
SendPropStringT( SENDINFO_NETWORKARRAYELEM( m_iszCampaignNames, 2 ) ),
|
|
// save names
|
|
SendPropStringT( SENDINFO_NETWORKARRAYELEM( m_iszSaveNames, 0 ) ),
|
|
SendPropStringT( SENDINFO_NETWORKARRAYELEM( m_iszSaveNames, 1 ) ),
|
|
SendPropStringT( SENDINFO_NETWORKARRAYELEM( m_iszSaveNames, 2 ) ),
|
|
SendPropStringT( SENDINFO_NETWORKARRAYELEM( m_iszSaveNames, 3 ) ),
|
|
SendPropStringT( SENDINFO_NETWORKARRAYELEM( m_iszSaveNames, 4 ) ),
|
|
SendPropStringT( SENDINFO_NETWORKARRAYELEM( m_iszSaveNames, 5 ) ),
|
|
SendPropStringT( SENDINFO_NETWORKARRAYELEM( m_iszSaveNames, 6 ) ),
|
|
SendPropStringT( SENDINFO_NETWORKARRAYELEM( m_iszSaveNames, 7 ) ),
|
|
// saved campaign names
|
|
SendPropStringT( SENDINFO_NETWORKARRAYELEM( m_iszSaveCampaignNames, 0 ) ),
|
|
SendPropStringT( SENDINFO_NETWORKARRAYELEM( m_iszSaveCampaignNames, 1 ) ),
|
|
SendPropStringT( SENDINFO_NETWORKARRAYELEM( m_iszSaveCampaignNames, 2 ) ),
|
|
SendPropStringT( SENDINFO_NETWORKARRAYELEM( m_iszSaveCampaignNames, 3 ) ),
|
|
SendPropStringT( SENDINFO_NETWORKARRAYELEM( m_iszSaveCampaignNames, 4 ) ),
|
|
SendPropStringT( SENDINFO_NETWORKARRAYELEM( m_iszSaveCampaignNames, 5 ) ),
|
|
SendPropStringT( SENDINFO_NETWORKARRAYELEM( m_iszSaveCampaignNames, 6 ) ),
|
|
SendPropStringT( SENDINFO_NETWORKARRAYELEM( m_iszSaveCampaignNames, 7 ) ),
|
|
// save date times
|
|
SendPropStringT( SENDINFO_NETWORKARRAYELEM( m_iszSaveDateTimes, 0 ) ),
|
|
SendPropStringT( SENDINFO_NETWORKARRAYELEM( m_iszSaveDateTimes, 1 ) ),
|
|
SendPropStringT( SENDINFO_NETWORKARRAYELEM( m_iszSaveDateTimes, 2 ) ),
|
|
SendPropStringT( SENDINFO_NETWORKARRAYELEM( m_iszSaveDateTimes, 3 ) ),
|
|
SendPropStringT( SENDINFO_NETWORKARRAYELEM( m_iszSaveDateTimes, 4 ) ),
|
|
SendPropStringT( SENDINFO_NETWORKARRAYELEM( m_iszSaveDateTimes, 5 ) ),
|
|
SendPropStringT( SENDINFO_NETWORKARRAYELEM( m_iszSaveDateTimes, 6 ) ),
|
|
SendPropStringT( SENDINFO_NETWORKARRAYELEM( m_iszSaveDateTimes, 7 ) ),
|
|
// save player names
|
|
SendPropStringT( SENDINFO_NETWORKARRAYELEM( m_iszSavePlayerNames, 0 ) ),
|
|
SendPropStringT( SENDINFO_NETWORKARRAYELEM( m_iszSavePlayerNames, 1 ) ),
|
|
SendPropStringT( SENDINFO_NETWORKARRAYELEM( m_iszSavePlayerNames, 2 ) ),
|
|
SendPropStringT( SENDINFO_NETWORKARRAYELEM( m_iszSavePlayerNames, 3 ) ),
|
|
SendPropStringT( SENDINFO_NETWORKARRAYELEM( m_iszSavePlayerNames, 4 ) ),
|
|
SendPropStringT( SENDINFO_NETWORKARRAYELEM( m_iszSavePlayerNames, 5 ) ),
|
|
SendPropStringT( SENDINFO_NETWORKARRAYELEM( m_iszSavePlayerNames, 6 ) ),
|
|
SendPropStringT( SENDINFO_NETWORKARRAYELEM( m_iszSavePlayerNames, 7 ) ),
|
|
|
|
SendPropArray3( SENDINFO_ARRAY3( m_iSaveMissionsComplete ), SendPropInt( SENDINFO_ARRAY( m_iSaveMissionsComplete ), 8, SPROP_UNSIGNED ) ),
|
|
SendPropInt( SENDINFO(m_iListType ) ),
|
|
SendPropInt( SENDINFO(m_iNumMissions ) ),
|
|
SendPropInt( SENDINFO(m_iNumOverviewMissions ) ),
|
|
SendPropInt( SENDINFO(m_iNumCampaigns ) ),
|
|
SendPropInt( SENDINFO(m_iNumSavedCampaigns ) ),
|
|
SendPropInt( SENDINFO(m_nCampaignIndex) ),
|
|
END_SEND_TABLE()
|
|
|
|
BEGIN_DATADESC( CASW_Voting_Missions )
|
|
DEFINE_ARRAY( m_iszMissionNames, FIELD_STRING, ASW_SAVES_PER_PAGE),
|
|
DEFINE_ARRAY( m_iszCampaignNames, FIELD_STRING, ASW_CAMPAIGNS_PER_PAGE),
|
|
DEFINE_ARRAY( m_iszSaveNames, FIELD_STRING, ASW_SAVES_PER_PAGE),
|
|
DEFINE_ARRAY( m_iszSaveCampaignNames, FIELD_STRING, ASW_SAVES_PER_PAGE),
|
|
DEFINE_ARRAY( m_iszSaveDateTimes, FIELD_STRING, ASW_SAVES_PER_PAGE),
|
|
DEFINE_ARRAY( m_iszSavePlayerNames, FIELD_STRING, ASW_SAVES_PER_PAGE),
|
|
DEFINE_ARRAY( m_iSaveMissionsComplete, FIELD_INTEGER, ASW_SAVES_PER_PAGE),
|
|
DEFINE_FIELD( m_hPlayer, FIELD_EHANDLE ),
|
|
DEFINE_FIELD( m_iListType, FIELD_INTEGER ),
|
|
DEFINE_FIELD( m_iNumMissions, FIELD_INTEGER ),
|
|
DEFINE_FIELD( m_iNumOverviewMissions, FIELD_INTEGER ),
|
|
DEFINE_FIELD( m_iNumCampaigns, FIELD_INTEGER ),
|
|
DEFINE_FIELD( m_iNumSavedCampaigns, FIELD_INTEGER ),
|
|
DEFINE_FIELD( m_nOffset, FIELD_INTEGER ),
|
|
DEFINE_FIELD( m_iNumSlots, FIELD_INTEGER ),
|
|
DEFINE_THINKFUNC( ScanThink ),
|
|
END_DATADESC()
|
|
|
|
CASW_Voting_Missions::CASW_Voting_Missions()
|
|
{
|
|
m_nCampaignIndex = -1;
|
|
m_nOffset = 0;
|
|
m_iNumSlots = ASW_SAVES_PER_PAGE;
|
|
m_hPlayer = NULL;
|
|
for (int i=0;i<ASW_SAVES_PER_PAGE;i++)
|
|
{
|
|
m_iszMissionNames.Set(i, NULL_STRING);
|
|
}
|
|
}
|
|
|
|
// only transmit to the player we're preparing a map list for
|
|
int CASW_Voting_Missions::ShouldTransmit( const CCheckTransmitInfo *pInfo )
|
|
{
|
|
if ( m_hPlayer.Get() && m_hPlayer->edict() == pInfo->m_pClientEnt )
|
|
{
|
|
return FL_EDICT_ALWAYS;
|
|
}
|
|
return FL_EDICT_DONTSEND;
|
|
}
|
|
|
|
void CASW_Voting_Missions::Spawn()
|
|
{
|
|
BaseClass::Spawn();
|
|
SetThink(NULL);
|
|
}
|
|
|
|
void CASW_Voting_Missions::ScanThink()
|
|
{
|
|
if (m_iListType == 0) // if the player isn't looking at any particular list at the moment, don't bother updating our strings
|
|
{
|
|
SetThink( NULL );
|
|
return;
|
|
}
|
|
|
|
if (!missionchooser || !missionchooser->LocalMissionSource())
|
|
return;
|
|
|
|
IASW_Mission_Chooser_Source* pMissionSource = missionchooser->LocalMissionSource();
|
|
|
|
// let the source think, in case it needs to be scanning folders
|
|
pMissionSource->Think();
|
|
|
|
// player is looking at the list of missions
|
|
if (m_iListType == 1)
|
|
{
|
|
if ( m_nCampaignIndex == -1 )
|
|
{
|
|
// make sure the source is setup to be looking at our page of missions (need to do this every time in case someone else is using the source too)
|
|
pMissionSource->FindMissions(m_nOffset, m_iNumSlots, true);
|
|
// copy them from the local source into our networked array
|
|
ASW_Mission_Chooser_Mission* missions = pMissionSource->GetMissions();
|
|
bool bChanged = false;
|
|
for (int i=0;i<m_iNumSlots;i++)
|
|
{
|
|
if (i<ASW_SAVES_PER_PAGE && Q_strcmp(missions[i].m_szMissionName, STRING(m_iszMissionNames[i])))
|
|
{
|
|
bChanged = true;
|
|
m_iszMissionNames.Set(i, AllocPooledString(missions[i].m_szMissionName));
|
|
m_iszMissionNames.GetForModify(i);
|
|
}
|
|
}
|
|
m_iNumMissions = pMissionSource->GetNumMissions(false);
|
|
m_iNumOverviewMissions = pMissionSource->GetNumMissions(true);
|
|
}
|
|
else
|
|
{
|
|
// make sure the source is setup to be looking at our page of missions (need to do this every time in case someone else is using the source too)
|
|
pMissionSource->FindMissionsInCampaign(m_nCampaignIndex, m_nOffset, m_iNumSlots);
|
|
// copy them from the local source into our networked array
|
|
ASW_Mission_Chooser_Mission* missions = pMissionSource->GetMissions();
|
|
bool bChanged = false;
|
|
for (int i=0;i<m_iNumSlots;i++)
|
|
{
|
|
if (i<ASW_SAVES_PER_PAGE && Q_strcmp(missions[i].m_szMissionName, STRING(m_iszMissionNames[i])))
|
|
{
|
|
bChanged = true;
|
|
m_iszMissionNames.Set(i, AllocPooledString(missions[i].m_szMissionName));
|
|
m_iszMissionNames.GetForModify(i);
|
|
}
|
|
}
|
|
m_iNumMissions = pMissionSource->GetNumMissionsInCampaign( m_nCampaignIndex );
|
|
m_iNumOverviewMissions = m_iNumMissions;
|
|
}
|
|
}
|
|
else if (m_iListType == 2) // player is looking at a list of campaigns
|
|
{
|
|
// make sure the source is setup to be looking at our page of campaign (need to do this every time in case someone else is using the source too)
|
|
pMissionSource->FindCampaigns(m_nOffset, m_iNumSlots);
|
|
// copy them from the local source into our networked array
|
|
ASW_Mission_Chooser_Mission* campaigns = pMissionSource->GetCampaigns();
|
|
for (int i=0;i<m_iNumSlots;i++)
|
|
{
|
|
if (i<ASW_CAMPAIGNS_PER_PAGE && Q_strcmp(campaigns[i].m_szMissionName, STRING(m_iszCampaignNames[i])))
|
|
{
|
|
m_iszCampaignNames.Set(i, AllocPooledString(campaigns[i].m_szMissionName));
|
|
}
|
|
}
|
|
m_iNumCampaigns = pMissionSource->GetNumCampaigns();
|
|
}
|
|
else if (m_iListType == 3) // player is looking at a list of saved campaign games
|
|
{
|
|
// make sure the source is setup to be looking at our page of saves (need to do this every time in case someone else is using the source too)
|
|
bool bMulti = !( ASWGameResource() && ASWGameResource()->IsOfflineGame() );
|
|
pMissionSource->FindSavedCampaigns(m_nOffset, m_iNumSlots, bMulti, (m_hPlayer.Get() && bMulti) ? m_hPlayer->GetASWNetworkID() : NULL);
|
|
m_iNumSavedCampaigns = pMissionSource->GetNumSavedCampaigns(bMulti, (m_hPlayer.Get() && bMulti) ? m_hPlayer->GetASWNetworkID() : NULL);
|
|
// copy them from the local source into our networked array
|
|
ASW_Mission_Chooser_Saved_Campaign* saved = pMissionSource->GetSavedCampaigns();
|
|
for (int i=0;i<m_iNumSlots;i++)
|
|
{
|
|
if (i<ASW_SAVES_PER_PAGE && Q_strcmp(saved[i].m_szSaveName, STRING(m_iszSaveNames[i])))
|
|
{
|
|
m_iszSaveNames.Set(i, AllocPooledString(saved[i].m_szSaveName));
|
|
m_iszSaveCampaignNames.Set(i, AllocPooledString(saved[i].m_szCampaignName));
|
|
m_iszSaveDateTimes.Set(i, AllocPooledString(saved[i].m_szDateTime));
|
|
m_iszSavePlayerNames.Set(i, AllocPooledString(saved[i].m_szPlayerNames));
|
|
m_iSaveMissionsComplete.Set(i, saved[i].m_iMissionsComplete);
|
|
}
|
|
}
|
|
}
|
|
|
|
SetThink( &CASW_Voting_Missions::ScanThink );
|
|
SetNextThink(gpGlobals->curtime + 0.1f);
|
|
}
|
|
|
|
void CASW_Voting_Missions::SetListType(CASW_Player *pPlayer, int iListType, int nOffset, int iNumSlots, int iCampaignIndex)
|
|
{
|
|
Msg("CASW_Voting_Missions::SetListType %d\n", iListType);
|
|
m_hPlayer = pPlayer;
|
|
m_iListType = iListType;
|
|
m_nOffset = nOffset;
|
|
m_iNumSlots = iNumSlots;
|
|
m_nCampaignIndex = iCampaignIndex;
|
|
SetThink( &CASW_Voting_Missions::ScanThink );
|
|
SetNextThink(gpGlobals->curtime + 0.1f);
|
|
} |