/*------------------------------------------------------------------------- * get_Count() *------------------------------------------------------------------------- * Purpose: * For some internal VB script stuff. * * Returns: * pnCount: the size of the collection (in elements) * */ STDMETHODIMP CAdminUsers :: get_Count(long* pnCount) { *pnCount = 0; long i = 0; if (m_pIGCmission) { const ShipListIGC * plistShip = m_pIGCmission->GetShips(); // // Iterate thru all ships in mission // for(ShipLinkIGC * plinkShip = plistShip->first(); plinkShip; plinkShip = plinkShip->next()) { CFSShip * pfsShip = (CFSShip *) plinkShip->data()->GetPrivateData(); if (pfsShip->IsPlayer()) ++i; } *pnCount = i; } else { *pnCount = (long)g.pServerCounters->cPlayersOnline; } // Indicate success return S_OK; }
void CFSShip::ShipStatusSpotted(IsideIGC* pside) { SideID sideID = pside->GetObjectID(); SectorID sectorID; { IclusterIGC* pcluster = GetIGCShip()->GetCluster(); if (pcluster == NULL) { IstationIGC* pstation = GetIGCShip()->GetStation(); assert (pstation); pcluster = pstation->GetCluster(); } sectorID = pcluster->GetObjectID(); } ShipStatus* pss = &m_rgShipStatus[sideID]; pss->SetStateTime(g.timeNow.clock()); pss->SetState(c_ssFlying); pss->SetParentID(NA); pss->SetHullID(GetIGCShip()->GetHullType()->GetObjectID()); pss->SetSectorID(sectorID); //Flag that we have been detected as well IsideIGC* mySide = GetSide(); SideID mySideID = mySide->GetObjectID(); if (mySide != pside && !mySide->AlliedSides(mySide, pside)) //#ALLY -was: mySide != pside (Imago fixed 7/8/09) m_rgShipStatus[mySideID].SetDetected(true); //Adjust the ship status for all of the children as well { for (ShipLinkIGC* psl = GetIGCShip()->GetChildShips()->first(); (psl != NULL); psl = psl->next()) { IshipIGC* pship = psl->data(); CFSShip* pfsship = ((CFSShip*)(pship->GetPrivateData())); ShipStatus* pss = pfsship->GetShipStatus(sideID); pss->SetState((pship->GetTurretID() == NA) ? c_ssObserver : c_ssTurret); pss->SetHullID(NA); pss->SetSectorID(sectorID); pss->SetParentID(GetShipID()); if (mySide != pside && !mySide->AlliedSides(mySide, pside)) //#ALLY -was != (Imago fixed 7/8/09) pfsship->GetShipStatus(mySideID)->SetDetected(true); } } }
void CFSShip::ShipStatusHidden(IsideIGC* pside) { SideID sideID = pside->GetObjectID(); m_rgShipStatus[sideID].SetUnknown(); IsideIGC* mySide = GetSide(); SideID mySideID = mySide->GetObjectID(); //Does anyone see us? bool detectedF = false; { CFSMission* pmission = this->GetMission(); if (pmission) { for (SideLinkIGC* psl = pmission->GetIGCMission()->GetSides()->first(); (psl != NULL); psl = psl->next()) { if (psl->data() != mySide && !mySide->AlliedSides(psl->data(), mySide)) //#ALLY -was: != (Imago fixed 7/8/09) { ShipStatus* pss = GetShipStatus(psl->data()->GetObjectID()); if (!pss->GetUnknown()) { detectedF = true; break; } } } } } m_rgShipStatus[mySideID].SetDetected(detectedF); //Adjust the ship status for all of the children as well { for (ShipLinkIGC* psl = GetIGCShip()->GetChildShips()->first(); (psl != NULL); psl = psl->next()) { IshipIGC* pship = psl->data(); CFSShip* pfsShip = ((CFSShip*)(pship->GetPrivateData())); ShipStatus* pss = pfsShip->GetShipStatus(sideID); pss->SetUnknown(); pfsShip->GetShipStatus(mySideID)->SetDetected(detectedF); } } }
/*------------------------------------------------------------------------- * get__NewEnum() *------------------------------------------------------------------------- * Purpose: * Provide iteration support for things (like VB/Javascript languages) * that use this COM object. */ STDMETHODIMP CAdminUsers :: get__NewEnum(IUnknown** ppunkEnum) { // Clear the [out] parameter CLEAROUT(ppunkEnum, (IUnknown*)NULL); // Create a new CComEnum enumerator object typedef CComObject<CComEnum<IEnumVARIANT, &IID_IEnumVARIANT, VARIANT, _Copy<VARIANT> > > CEnum; CEnum* pEnum = new CEnum; assert(NULL != pEnum); // // Copy the pCAdminGame elements into to a temporary CComVariant vector // long cTotal; get_Count(&cTotal); CComVariant* pargTemp = new CComVariant[cTotal]; long i = 0; if (m_pIGCmission) { // // Iterate thru all ships in mission // for(ShipLinkIGC * plinkShip = m_pIGCmission->GetShips()->first(); plinkShip; plinkShip = plinkShip->next()) { CFSShip * pfsShip = (CFSShip *) plinkShip->data()->GetPrivateData(); if (pfsShip->IsPlayer()) { CFSPlayer * pfsPlayer = pfsShip->GetPlayer(); IAdminUser *pIAdminUser; RETURN_FAILED (pfsPlayer->CAdminSponsor<CAdminUser>::Make(IID_IAdminUser, (void**)&pIAdminUser)); pfsPlayer->CAdminSponsor<CAdminUser>::GetLimb()->Init(pfsPlayer); pargTemp[i] = pIAdminUser; ++i; // at this point we now we are done. This is not only an optimization but // a safeguard incase IGC is flawed. if (i >= cTotal) break; } } } else { // // Iterate thru all missions // const ListFSMission * plistMission = CFSMission::GetMissions(); for (LinkFSMission * plinkMission = plistMission->first(); plinkMission; plinkMission = plinkMission->next()) { CFSMission * pfsMission = plinkMission->data(); ImissionIGC * pIGCmission = pfsMission->GetIGCMission(); const ShipListIGC * plistShip = pIGCmission->GetShips(); // // Iterate thru all ships in mission // for(ShipLinkIGC * plinkShip = plistShip->first(); plinkShip; plinkShip = plinkShip->next()) { CFSShip * pfsShip = (CFSShip *) plinkShip->data()->GetPrivateData(); if (pfsShip->IsPlayer()) { CFSPlayer * pfsPlayer = pfsShip->GetPlayer(); IAdminUser *pIAdminUser; RETURN_FAILED (pfsPlayer->CAdminSponsor<CAdminUser>::Make(IID_IAdminUser, (void**)&pIAdminUser)); pfsPlayer->CAdminSponsor<CAdminUser>::GetLimb()->Init(pfsPlayer); pargTemp[i] = pIAdminUser; ++i; // at this point we now we are done. This is not only an optimization but // a safeguard incase IGC is flawed. if (i >= cTotal) goto exit_loops; } } } } exit_loops: // Initialize enumerator object with the temporary CComVariant vector HRESULT hr = pEnum->Init(&pargTemp[0], &pargTemp[cTotal], NULL, AtlFlagCopy); delete [] pargTemp; if (SUCCEEDED(hr)) hr = pEnum->QueryInterface(IID_IEnumVARIANT, (void**)ppunkEnum); if (FAILED(hr)) delete pEnum; // Return the last result return hr; }
HRESULT FedSrvLobbySite::OnAppMessage(FedMessaging * pthis, CFMConnection & cnxnFrom, FEDMESSAGE * pfm) { HRESULT hr = S_OK; assert(&g.fmLobby == pthis); static CTempTimer timerOnAppMessage("in FedSrvLobbySite::OnAppMessage", .02f); timerOnAppMessage.Start(); switch (pfm->fmid) { // KGJV #114 - reactivate create mission //#if !defined(ALLSRV_STANDALONE) case FM_L_CREATE_MISSION_REQ: { #if !defined(SRV_CHILD) CASTPFM(pfmCreateMissionReq, L, CREATE_MISSION_REQ, pfm); MissionParams mp; Strcpy(mp.strGameName, ZString(FM_VAR_REF(pfmCreateMissionReq, GameName)));// + "'s game"); Strcpy(mp.szIGCStaticFile, ZString(FM_VAR_REF(pfmCreateMissionReq, IGCStaticFile))); mp.bScoresCount = false;// dont set to true till clients can change this! mp.iMaxImbalance = 0x7ffe;// added assert(!mp.Invalid()); #endif //Imago - give birth right here, feed it and off it goes... #if defined(SRV_PARENT) //start missions as thier own process STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); ZeroMemory(&pi, sizeof(pi)); char szCmd[255]; char szName[32]; char szFile[32]; ZString strName = mp.strGameName; ZString strFile = mp.szIGCStaticFile; si.lpTitle = mp.strGameName; Strcpy(szName, (PCC)strName); Strcpy(szFile, (PCC)strFile); sprintf(szCmd, "AllSrv.exe \"%s\" %s %x", szName, szFile, pfmCreateMissionReq->dwCookie); // Create a NULL dacl to give "everyone" access SECURITY_DESCRIPTOR sd; SECURITY_ATTRIBUTES sa = { sizeof(sa), &sd, false }; InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION); SetSecurityDescriptorDacl(&sd, true, NULL, FALSE); if (!CreateProcess( NULL, // No module name (use command line). szCmd, NULL, NULL, FALSE, // Set handle inheritance to FALSE. CREATE_NEW_PROCESS_GROUP | CREATE_NEW_CONSOLE, // we're destined to do amazing things NULL, // Use parent's environment block. NULL, // Use parent's starting directory. &si, // Pointer to STARTUPINFO structure. &pi) // Pointer to PROCESS_INFORMATION structure. ) { debugf("CreateProcess failed (%d).\n", GetLastError()); } // check to make sure the child is ready before restart char strFilename[10] = "\0"; sprintf(strFilename, "%d.pid", pi.dwProcessId); HANDLE hFile = (HANDLE)CreateFile(strFilename, 0, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING, NULL); DWORD dwError = GetLastError(); int i = 0; while (hFile == INVALID_HANDLE_VALUE || dwError == ERROR_FILE_NOT_FOUND) { if (i >= 14) //30s break; Sleep(2500); hFile = (HANDLE)CreateFile(strFilename, 0, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING, NULL); dwError = GetLastError(); i++; } _Module.AddPID(pi.dwProcessId); CloseHandle(hFile); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); g.bRestarting = true; PostQuitMessage(0); #endif #if !defined(SRV_CHILD) #if !defined(SRV_PARENT) // pkk 2011-07-24 - Create games only with IGCs from cores.txt bool ValidCore = false; for (int i = 0; i < g.cStaticCoreInfo; i++) { if (!strcmpi(mp.szIGCStaticFile, g.vStaticCoreInfo[i].cbIGCFile)) { ValidCore = true; break; // quit loop } } if (ValidCore == true) { //Imago - start the mission in this thread as usual FedSrvSite * psiteFedSrv = new FedSrvSite(); CFSMission * pfsMissionNew = new CFSMission(mp, "", psiteFedSrv, psiteFedSrv, NULL, NULL); pfsMissionNew->SetCookie(pfmCreateMissionReq->dwCookie); } else { debugf("Lobby sent invalid core information %s, ignoring message\n", mp.szIGCStaticFile); } // pkk end #endif #endif } //Imago 6/22/08 break; //#endif -- reactivate create mission case FM_L_NEW_MISSION_ACK: { CASTPFM(pfmNewMissionAck, L, NEW_MISSION_ACK, pfm); CFSMission * pfsm = CFSMission::GetMissionFromIGCMissionID(pfmNewMissionAck->dwIGCMissionID); if (pfsm) { pfsm->SetCookie(pfmNewMissionAck->dwCookie); // If we already have players (e.g. reconnect), tell the lobby who's in the game const ShipListIGC * plistShip = pfsm->GetIGCMission()->GetShips(); for (ShipLinkIGC * plinkShip = plistShip->first(); plinkShip; plinkShip = plinkShip->next()) { IshipIGC * pShip = plinkShip->data(); CFSShip * pfsShip = GETFSSHIP(pShip); if (pfsShip->IsPlayer() && !pShip->IsGhost()) { CFSPlayer* pfsPlayer = pfsShip->GetPlayer(); BEGIN_PFM_CREATE(g.fmLobby, pfmPlayerJoined, S, PLAYER_JOINED) FM_VAR_PARM(pfsPlayer->GetName(), CB_ZTS) END_PFM_CREATE pfmPlayerJoined->dwMissionCookie = pfsm->GetCookie(); } } HRESULT hr = pthis->SendMessages(pthis->GetServerConnection(), FM_GUARANTEED, FM_FLUSH); } } break; case FM_L_TOKEN: { CASTPFM(pfmToken, L, TOKEN, pfm); Strcpy(g.m_szToken, FM_VAR_REF(pfmToken, Token)); } break; case FM_L_REMOVE_PLAYER: { CASTPFM(pfmRemovePlayer, L, REMOVE_PLAYER, pfm); CFSMission * pfsMission = CFSMission::GetMission(pfmRemovePlayer->dwMissionCookie); const char* szCharacterName = FM_VAR_REF(pfmRemovePlayer, szCharacterName); const char* szMessageParam = FM_VAR_REF(pfmRemovePlayer, szMessageParam); // try to find the player in question if (!pfsMission) { debugf("Asked to boot character %s from mission %x by lobby, " "but the mission was not found.\n", szCharacterName, pfmRemovePlayer->dwMissionCookie); } else if (!pfsMission->RemovePlayerByName(szCharacterName, (pfmRemovePlayer->reason == RPR_duplicateCDKey) ? QSR_DuplicateCDKey : QSR_DuplicateRemoteLogon, szMessageParam)) { debugf("Asked to boot character %s from mission %x by lobby, " "but the character was not found.\n", szCharacterName, pfmRemovePlayer->dwMissionCookie); } } break; case FM_L_LOGON_SERVER_NACK: { char * szReason; CASTPFM(pfmLogonNack, L, LOGON_SERVER_NACK, pfm); szReason = FM_VAR_REF(pfmLogonNack, Reason); OnMessageBox(pthis, szReason ? szReason : "Error while try to log onto server.", "Allegiance Server Error", MB_SERVICE_NOTIFICATION); // TODO: consider firing out an event message PostQuitMessage(-1); } // BT - 12/21/2010 ACSS - The lobby server will relay the rank details back to the game server. case FM_LS_PLAYER_RANK: { CQLogonStats * pquery = new CQLogonStats(GotLogonDetails); CQLogonStatsData * pqd = pquery->GetData(); CASTPFM(pfmPlayerRank, LS, PLAYER_RANK, pfm); Strcpy(pqd->szCDKey, FM_VAR_REF(pfmPlayerRank, szCDKey)); Strcpy(pqd->szCharacterName, FM_VAR_REF(pfmPlayerRank, szCharacterName)); Strcpy(pqd->szPassword, FM_VAR_REF(pfmPlayerRank, szPassword)); Strcpy(pqd->szReason, FM_VAR_REF(pfmPlayerRank, szReason)); pqd->characterID = pfmPlayerRank->characterID; pqd->fCanCheat = pfmPlayerRank->fCanCheat; pqd->fRetry = pfmPlayerRank->fRetry; pqd->dwCookie = pfmPlayerRank->dwCookie; pqd->fValid = pfmPlayerRank->fValid; pqd->dwConnectionID = pfmPlayerRank->dwConnectionID; pqd->rank = pfmPlayerRank->rank; pqd->sigma = pfmPlayerRank->sigma; pqd->mu = pfmPlayerRank->mu; pqd->commandRank = pfmPlayerRank->commandRank; pqd->commandSigma = pfmPlayerRank->commandSigma; pqd->commandMu = pfmPlayerRank->commandMu; PostThreadMessage(g.idReceiveThread, wm_sql_querydone, (WPARAM)NULL, (LPARAM)pquery); break; } break; } timerOnAppMessage.Stop("...for message type %s\n", g_rgszMsgNames[pfm->fmid]); return hr; }
//This should only be called from the ChangeCluster() callback. void CFSPlayer::SetCluster(IclusterIGC* pcluster, bool bViewOnly) { CFSShip::SetCluster(pcluster, bViewOnly); if (pcluster) { SetDPGroup((CFSCluster*)(pcluster->GetPrivateData()), true); IshipIGC* pshipParent = GetIGCShip()->GetParentShip(); if ((pshipParent == NULL) || bViewOnly) { ShipID shipID = GetIGCShip()->GetObjectID(); assert(0 == g.fm.CbUsedSpaceInOutbox()); if (!bViewOnly) { //Move the player to his destination BEGIN_PFM_CREATE(g.fm, pfmSetCluster, S, SET_CLUSTER) END_PFM_CREATE pfmSetCluster->sectorID = pcluster->GetObjectID(); //Send the position of the parent ship if we are a child, otherwise our position IshipIGC* pshipSource = pshipParent ? pshipParent : GetIGCShip(); pshipSource->ExportShipUpdate(&(pfmSetCluster->shipupdate)); pfmSetCluster->cookie = NewCookie(); } { for (ShipLinkIGC* pshiplink = pcluster->GetShips()->first(); pshiplink; pshiplink = pshiplink->next()) { IshipIGC * pshipExist = pshiplink->data(); if ((pshipExist != GetIGCShip()) && (pshipExist != pshipParent)) { IshipIGC* pshipExistParent = pshipExist->GetParentShip(); //Tell the new player where the existing ship is/was //provided the existing ship is not the child of some other ship //and is not the parent of the new ship if (pshipExistParent == NULL) { CFSShip * pfsShipExist = (CFSShip *) pshipExist->GetPrivateData(); pfsShipExist->QueueLoadoutChange(); BEGIN_PFM_CREATE(g.fm, pfmSSU, S, SINGLE_SHIP_UPDATE) END_PFM_CREATE //Always use the ship update based on the server's current view of the universe //(this shouldn't be a lot worse than anything the player sent and it is easier) pshipExist->ExportShipUpdate(&(pfmSSU->shipupdate)); { ImodelIGC* pmodelTarget = pshipExist->GetCommandTarget(c_cmdCurrent); if (pmodelTarget) { pfmSSU->otTarget = pmodelTarget->GetObjectType(); pfmSSU->oidTarget = pmodelTarget->GetObjectID(); } else { pfmSSU->otTarget = NA; pfmSSU->oidTarget = NA; } } pfmSSU->bIsRipcording = pshipExist->fRipcordActive(); } } } } { // Let's build up a list of station updates so we can batch 'em down IsideIGC* pside = GetIGCShip()->GetSide(); { const StationListIGC * pstnlist = pcluster->GetStations(); int nStations = 0; { //Count the number of visible stations for (StationLinkIGC* pstnlink = pstnlist->first(); pstnlink; pstnlink = pstnlink->next()) { IstationIGC* pstation = pstnlink->data(); if (pstation->SeenBySide(pside)) nStations++; } } if (nStations != 0) { // tell the client what happened BEGIN_PFM_CREATE(g.fm, pfmStationsUpdate, S, STATIONS_UPDATE) FM_VAR_PARM(NULL, nStations * sizeof(StationState)) END_PFM_CREATE StationState* pss = (StationState*)(FM_VAR_REF(pfmStationsUpdate, rgStationStates)); for (StationLinkIGC* pstnlink = pstnlist->first(); pstnlink; pstnlink = pstnlink->next()) { IstationIGC * pstation = pstnlink->data(); if (pstation->SeenBySide(pside)) { pss->stationID = pstation->GetObjectID(); pss->bpHullFraction = pstation->GetFraction(); (pss++)->bpShieldFraction = pstation->GetShieldFraction(); } } } } { //Let's build up a list of probe updates and batch them on down (only damage & visible probes) const ProbeListIGC * pprblist = pcluster->GetProbes(); int nProbes = 0; { for (ProbeLinkIGC* pprblink = pprblist->first(); pprblink; pprblink = pprblink->next()) { if (pprblink->data()->SeenBySide(pside)) nProbes++; } } if (nProbes != 0) { BEGIN_PFM_CREATE(g.fm, pfmProbesUpdate, S, PROBES_UPDATE) FM_VAR_PARM(NULL, nProbes * sizeof(ProbeState)) END_PFM_CREATE ProbeState* pps = (ProbeState*)(FM_VAR_REF(pfmProbesUpdate, rgProbeStates)); for (ProbeLinkIGC* pprblink = pprblist->first(); pprblink; pprblink = pprblink->next()) { IprobeIGC * pprobe = pprblink->data(); if (pprobe->SeenBySide(pside)) { pps->probeID = pprobe->GetObjectID(); (pps++)->bpFraction = pprobe->GetFraction(); } } } } { //Let's build up a list of asteroid updates and batch them on down const AsteroidListIGC * pastlist = pcluster->GetAsteroids(); int nAsteroids = 0; { for (AsteroidLinkIGC* pastlink = pastlist->first(); pastlink; pastlink = pastlink->next()) { if (pastlink->data()->SeenBySide(pside)) nAsteroids++; } } if (nAsteroids != 0) { BEGIN_PFM_CREATE(g.fm, pfmAsteroidsUpdate, S, ASTEROIDS_UPDATE) FM_VAR_PARM(NULL, nAsteroids * sizeof(AsteroidState)) END_PFM_CREATE AsteroidState* pas = (AsteroidState*)(FM_VAR_REF(pfmAsteroidsUpdate, rgAsteroidStates)); for (AsteroidLinkIGC* pastlink = pastlist->first(); pastlink; pastlink = pastlink->next()) { IasteroidIGC * pasteroid = pastlink->data(); if (pasteroid->SeenBySide(pside)) { pas->asteroidID = pasteroid->GetObjectID(); pas->ore = short(pasteroid->GetOre()); pas->co.Set(pasteroid->GetOrientation()); (pas++)->bpFraction = pasteroid->GetFraction(); } } } } } //Also send the identical message to all of the ship's children] if (!bViewOnly) //TheRock 4-1-2010 fixed ships overlaying in f3 while on a turret { for (ShipLinkIGC* psl = GetIGCShip()->GetChildShips()->first(); (psl != NULL); psl = psl->next()) { CFSShip* pfsShip = (CFSShip*)(psl->data()->GetPrivateData()); assert (pfsShip->IsPlayer()); pfsShip->GetPlayer()->ResetLastUpdate(); g.fm.SendMessages(pfsShip->GetPlayer()->GetConnection(), FM_GUARANTEED, FM_DONT_FLUSH); } } g.fm.SendMessages(GetConnection(), FM_GUARANTEED, FM_FLUSH); } } else if (bViewOnly) { IstationIGC* pstation = GetIGCShip()->GetStation(); assert (pstation); CFSCluster* pfsCluster = (CFSCluster*)(pstation->GetCluster()->GetPrivateData()); SetDPGroup(pfsCluster, false); } else SetDPGroup(NULL, false); }
/*------------------------------------------------------------------------- * CaptureStation *------------------------------------------------------------------------- * Purpose: * Handle a station being captured by a ship */ void CFSShip::CaptureStation(IstationIGC * pstation) { { //Fudge the hitpoints of the station //All those guns inside damage the hull pstation->SetFraction(pstation->GetFraction() * 0.5f); //But the heroic engineer's get the shields up. pstation->SetShieldFraction(0.8f); //pstation->GetShieldFraction() + 0.5f); } { GetPlayerScoreObject()->CaptureBase(true); for (ShipLinkIGC* psl = GetIGCShip()->GetChildShips()->first(); (psl != NULL); psl = psl->next()) { CFSShip* ps = (CFSShip*)(psl->data()->GetPrivateData()); ps->GetPlayerScoreObject()->CaptureBase(false); } } IsideIGC * pside = GetSide(); pside->AddBaseCapture(); SideID iSide = pside->GetObjectID(); IsideIGC* psideOld = pstation->GetSide(); StationID stationID = pstation->GetObjectID(); BEGIN_PFM_CREATE(g.fm, pfmStationCapture, S, STATION_CAPTURE) END_PFM_CREATE pfmStationCapture->stationID = stationID; pfmStationCapture->sidOld = psideOld->GetObjectID(); pfmStationCapture->sidNew = iSide; pfmStationCapture->shipIDCredit = GetIGCShip()->GetObjectID(); g.fm.SendMessages(GetMission()->GetGroupRealSides(), FM_GUARANTEED, FM_FLUSH); pstation->SetSide(pside); // TE: Fire AGCEvent when base is captured CFSMission * pfsMission = this->GetMission(); LPCSTR pszContext = pfsMission->GetIGCMission() ? pfsMission->GetIGCMission()->GetContextName() : NULL; _AGCModule.TriggerContextEvent(NULL, EventID_StationChangesSides, pszContext, GetName(), GetShipID(), pside->GetUniqueID(), -1, 4, "GameID" , VT_I4 , pfsMission->GetMissionID(), "OldTeam" , VT_I4 , psideOld->GetUniqueID(), "OldTeamName", VT_LPSTR, psideOld->GetName(), "StationName", VT_LPSTR, pstation->GetName()); // TE end // yp: Add event for players who were involved in the capture of an enemy base. // mmf commented this out for now pending additional testing #if 0 ZString pszPlayerList = ""; // this creates a new ZString object and set its value to "", it's not a pointer to "" if(m_pfsMission->GetIGCMission() && m_pfsMission->GetIGCMission()->GetShips()) { ShipLinkIGC * pShiplink = m_pfsMission->GetIGCMission()->GetShips()->first(); while (pShiplink) { CFSShip * pfsShip = (CFSShip *) pShiplink->data()->GetPrivateData(); if (pfsShip && pfsShip->IsPlayer()) { // this logic might need to be tweeked to include the ship that did the capture if its if(pfsShip->GetSide() && pfsShip->GetSide()->GetObjectID() == iSide && // if they are on the side that did the Capture. and.. pfsShip->GetPlayer()->GetIGCShip()->GetObjectID() == GetIGCShip()->GetObjectID() || // they are the ship that did the caputure. or pfsShip->GetCluster() && pstation->GetCluster() && pfsShip->GetCluster()->GetObjectID() == pstation->GetCluster()->GetObjectID()) // they are in this sector { pszPlayerList = pszPlayerList + ";" + ZString(pfsShip->GetPlayer()->GetName()); // players name // The distance the player is from the station that was destroyed. if(pfsShip->GetPlayer()->GetIGCShip() ) { pszPlayerList = pszPlayerList + ":" + ZString( (pstation->GetPosition() - pfsShip->GetPlayer()->GetIGCShip()->GetPosition()).Length()); // the distance } } } pShiplink = pShiplink->next(); } } // Fire AGCEvent listing players in the sector // TODO: Might want to add into the event weither or not this was a VICTORY capture.. should we track that as well? _AGCModule.TriggerContextEvent(NULL, EventID_StationChangesSides, pszContext, GetName(), GetShipID(), pside->GetUniqueID(), -1, 4, "GameID" , VT_I4 , pfsMission->GetMissionID(), "OldTeam" , VT_I4 , psideOld->GetUniqueID(), "OldTeamName", VT_LPSTR, psideOld->GetName(), "zPlayerList", VT_LPSTR, pszPlayerList); // pszPlayerList should look like ";player@squad:1500;player2@squad:500" // yp:end #endif //Possibly the built themselves to a victory IsideIGC* psideWin = m_pfsMission->CheckForVictoryByStationCapture(pside, psideOld); if (psideWin) { static char szReason[100]; //Make this static so we only need to keep a pointer to it around sprintf(szReason, "%s won because %s captured %s", psideWin->GetName(), GetIGCShip()->GetName(), pstation->GetName()); m_pfsMission->GameOver(psideWin, szReason); } else if (psideOld->GetActiveF()) //RESET OUR EYE HERE? IMAGO CAPTURE EYE BUG FIX? REVIEW 7/23/09 m_pfsMission->VacateStation(pstation); }