#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;iedict() == 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;iGetNumMissions(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;iGetNumMissionsInCampaign( 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;iGetNumCampaigns(); } 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;icurtime + 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); }