/** Receive info about a droid that is being unloaded from a transporter */ bool recvDroidDisEmbark(NETQUEUE queue) { DROID *psFoundDroid = NULL, *psTransporterDroid = NULL; DROID *psCheckDroid = NULL; NETbeginDecode(queue, GAME_DROIDDISEMBARK); { uint32_t player; uint32_t droidID; uint32_t transporterID; NETuint32_t(&player); NETuint32_t(&droidID); NETuint32_t(&transporterID); NETend(); // find the transporter first psTransporterDroid = IdToDroid(transporterID, player); if (!psTransporterDroid) { // Possible it already died? (sync error?) debug(LOG_WARNING, "player's %d transport droid %d wasn't found?", player, transporterID); return false; } if (!canGiveOrdersFor(queue.index, psTransporterDroid->player)) { return false; } // we need to find the droid *in* the transporter psCheckDroid = psTransporterDroid ->psGroup->psList; while (psCheckDroid) { // is this the one we want? if (psCheckDroid->id == droidID) { psFoundDroid = psCheckDroid; break; } // not found, so check next one in *group* psCheckDroid = psCheckDroid->psGrpNext; } // don't continue if we couldn't find it. if (!psFoundDroid) { // I don't think this could ever be possible...but debug(LOG_ERROR, "Couldn't find droid %d to disembark from player %d's transporter?", droidID, player); return false; } transporterRemoveDroid(psTransporterDroid, psFoundDroid, ModeImmediate); } return true; }
static void _intProcessTransporter(UDWORD id) { if (id >= IDTRANS_START && id <= IDTRANS_END) { /* A Transporter button has been pressed */ setCurrentTransporter(id); /*refresh the Contents list */ intAddTransporterContents(); } else if (id >= IDTRANS_CONTSTART && id <= IDTRANS_CONTEND) { //got to have a current transporter for this to work - and can't be flying if (psCurrTransporter != NULL && !transporterFlying(psCurrTransporter)) { unsigned currID = IDTRANS_CONTSTART; DROID *psDroid; for (psDroid = psCurrTransporter->psGroup->psList; psDroid != NULL && psDroid != psCurrTransporter; psDroid = psDroid->psGrpNext) { if (psDroid->selected) { continue; // Already scheduled this droid for removal. } if (currID == id) { break; } currID++; } if (psDroid != NULL) { transporterRemoveDroid(psCurrTransporter, psDroid, ModeQueue); } /*refresh the Contents list */ intAddTransporterContents(); if (onMission) { /*refresh the Avail list */ intAddDroidsAvailForm(); } } } else if (id == IDTRANS_CLOSE) { intRemoveTransContent(); intRemoveTrans(); psCurrTransporter = NULL; } else if (id == IDTRANS_CONTCLOSE) { intRemoveTransContent(); } else if (id == IDTRANS_DROIDCLOSE) { intRemoveTransDroidsAvail(); } else if (id >= IDTRANS_DROIDSTART && id <= IDTRANS_DROIDEND) { //got to have a current transporter for this to work - and can't be flying if (psCurrTransporter != NULL && !transporterFlying(psCurrTransporter)) { intTransporterAddDroid(id); /*don't need to explicitly refresh here since intRefreshScreen() is called by intTransporterAddDroid()*/ } } }