void CTFGameType::shipTouchFlag(Ship *theShip, FlagItem *theFlag) { GameConnection *controlConnection = theShip->getControllingClient(); ClientRef *cl = controlConnection->getClientRef(); if(!cl) return; if(cl->teamId == theFlag->getTeam()) { if(!theFlag->isAtHome()) { static StringTableEntry returnString("%e0 returned the %e1 flag."); Vector<StringTableEntry> e; e.push_back(cl->name); e.push_back(mTeams[theFlag->getTeam()].name); for(S32 i = 0; i < mClientList.size(); i++) mClientList[i]->clientConnection->s2cDisplayMessageE(GameConnection::ColorNuclearGreen, SFXFlagReturn, returnString, e); theFlag->sendHome(); cl->score += ReturnScore; } else { // check if this client has an enemy flag mounted for(S32 i = 0; i < theShip->mMountedItems.size(); i++) { Item *theItem = theShip->mMountedItems[i]; FlagItem *mountedFlag = dynamic_cast<FlagItem *>(theItem); if(mountedFlag) { setTeamScore(cl->teamId, mTeams[cl->teamId].score + 1); static StringTableEntry capString("%e0 captured the %e1 flag!"); Vector<StringTableEntry> e; e.push_back(cl->name); e.push_back(mTeams[mountedFlag->getTeam()].name); for(S32 i = 0; i < mClientList.size(); i++) mClientList[i]->clientConnection->s2cDisplayMessageE(GameConnection::ColorNuclearGreen, SFXFlagCapture, capString, e); // score the flag for the client's team... mountedFlag->dismount(); mountedFlag->sendHome(); cl->score += CapScore; } } } } else { static StringTableEntry takeString("%e0 took the %e1 flag!"); Vector<StringTableEntry> e; e.push_back(cl->name); e.push_back(mTeams[theFlag->getTeam()].name); for(S32 i = 0; i < mClientList.size(); i++) mClientList[i]->clientConnection->s2cDisplayMessageE(GameConnection::ColorNuclearGreen, SFXFlagSnatch, takeString, e); theFlag->mountToShip(theShip); } }
void shipTouchFlag(Ship *theShip, FlagItem *theFlag) { // see if the ship is already carrying a flag - can only carry one at a time for(S32 i = 0; i < theShip->mMountedItems.size(); i++) if(theShip->mMountedItems[i].isValid() && (theShip->mMountedItems[i]->getObjectTypeMask() & FlagType)) return; S32 flagIndex; for(flagIndex = 0; flagIndex < mFlags.size(); flagIndex++) if(mFlags[flagIndex] == theFlag) break; GameConnection *controlConnection = theShip->getControllingClient(); ClientRef *cl = controlConnection->getClientRef(); if(!cl) return; // see if this flag is already in a flag zone owned by the ship's team if(theFlag->getZone() != NULL && theFlag->getZone()->getTeam() == theShip->getTeam()) return; static StringTableEntry stealString("%e0 stole a flag from team %e1!"); static StringTableEntry takeString("%e0 of team %e1 took a flag!"); static StringTableEntry oneFlagTakeString("%e0 of team %e1 took the flag!"); StringTableEntry r = takeString; if(mFlags.size() == 1) r = oneFlagTakeString; S32 teamIndex; if(theFlag->getZone() == NULL) teamIndex = cl->teamId; else { r = stealString; teamIndex = theFlag->getZone()->getTeam(); setTeamScore(teamIndex, mTeams[teamIndex].score - 1); } Vector<StringTableEntry> e; e.push_back(cl->name); e.push_back(mTeams[teamIndex].name); for(S32 i = 0; i < mClientList.size(); i++) mClientList[i]->clientConnection->s2cDisplayMessageE( GameConnection::ColorNuclearGreen, SFXFlagSnatch, r, e); theFlag->mountToShip(theShip); theFlag->setZone(NULL); }
void shipTouchZone(Ship *s, GoalZone *z) { GameConnection *controlConnection = s->getControllingClient(); ClientRef *cl = controlConnection->getClientRef(); if(!cl) return; // see if this is an opposing team's zone if(s->getTeam() != z->getTeam()) return; // see if this zone already has a flag in it... for(S32 i = 0; i < mFlags.size(); i++) if(mFlags[i]->getZone() == z) return; // ok, it's an empty zone on our team: // see if this ship is carrying a flag S32 i; for(i = 0; i < s->mMountedItems.size(); i++) if(s->mMountedItems[i].isValid() && (s->mMountedItems[i]->getObjectTypeMask() & FlagType)) break; if(i == s->mMountedItems.size()) return; // ok, the ship has a flag and it's on the ship... Item *theItem = s->mMountedItems[i]; FlagItem *mountedFlag = dynamic_cast<FlagItem *>(theItem); if(mountedFlag) { setTeamScore(cl->teamId, mTeams[cl->teamId].score + 1); static StringTableEntry capString("%e0 retrieved a flag!"); static StringTableEntry oneFlagCapString("%e0 retrieved the flag!"); Vector<StringTableEntry> e; e.push_back(cl->name); for(S32 i = 0; i < mClientList.size(); i++) mClientList[i]->clientConnection->s2cDisplayMessageE(GameConnection::ColorNuclearGreen, SFXFlagCapture, (mFlags.size() == 1) ? oneFlagCapString : capString, e); // score the flag for the client's team... mountedFlag->dismount(); S32 flagIndex; for(flagIndex = 0; flagIndex < mFlags.size(); flagIndex++) if(mFlags[flagIndex] == mountedFlag) break; mFlags[flagIndex]->setZone(z); mountedFlag->setActualPos(z->getExtent().getCenter()); cl->score += CapScore; // see if all the flags are owned by one team for(S32 i = 0; i < mFlags.size(); i++) { if(!mFlags[i]->getZone() || mFlags[i]->getZone()->getTeam() != cl->teamId) return; } if(mFlags.size() != 1) { static StringTableEntry capAllString("Team %e0 retrieved all the flags!"); e[0] = mTeams[cl->teamId].name; for(S32 i = 0; i < mClientList.size(); i++) mClientList[i]->clientConnection->s2cDisplayMessageE(GameConnection::ColorNuclearGreen, SFXFlagCapture, capAllString, e); } for(S32 i = 0; i < mFlags.size(); i++) { mFlags[i]->setZone(NULL); mFlags[i]->sendHome(); } } }