// process a destroy feature msg. bool recvDestroyFeature(NETQUEUE queue) { FEATURE *pF; uint32_t id; NETbeginDecode(queue, GAME_DEBUG_REMOVE_FEATURE); NETuint32_t(&id); NETend(); if (!getDebugMappingStatus() && bMultiPlayer) { debug(LOG_WARNING, "Failed to remove feature for player %u.", NetPlay.players[queue.index].position); return false; } pF = IdToFeature(id,ANYPLAYER); if (pF == NULL) { debug(LOG_FEATURE, "feature id %d not found (probably already destroyed)", id); return false; } debug(LOG_FEATURE, "p%d feature id %d destroyed (%s)", pF->player, pF->id, pF->psStats->pName); // Remove the feature locally turnOffMultiMsg(true); destroyFeature(pF, gameTime - deltaGameTime + 1); // deltaGameTime is actually 0 here, since we're between updates. However, the value of gameTime - deltaGameTime + 1 will not change when we start the next tick. turnOffMultiMsg(false); return true; }
///////////////////////////////////////////////////////////////////////////////// // Returns a pointer to base object, given an id and optionally a player. BASE_OBJECT *IdToPointer(UDWORD id,UDWORD player) { DROID *pD; STRUCTURE *pS; FEATURE *pF; // droids. pD = IdToDroid(id, player); if (pD) { return (BASE_OBJECT*)pD; } // structures pS = IdToStruct(id,player); if(pS) { return (BASE_OBJECT*)pS; } // features pF = IdToFeature(id,player); if(pF) { return (BASE_OBJECT*)pF; } return NULL; }
// //////////////////////////////////////////////////////////////////////////// // process droid order static BASE_OBJECT *processDroidTarget(OBJECT_TYPE desttype, uint32_t destid) { // Target is a location if (destid == 0 && desttype == 0) { return NULL; } // Target is an object else { BASE_OBJECT *psObj = NULL; DROID *pD; switch (desttype) { case OBJ_DROID: if (IdToDroid(destid, ANYPLAYER, &pD)) { psObj = (BASE_OBJECT*)pD; } break; case OBJ_STRUCTURE: psObj = (BASE_OBJECT*)IdToStruct(destid,ANYPLAYER); break; case OBJ_FEATURE: psObj = (BASE_OBJECT*)IdToFeature(destid,ANYPLAYER); break; // We should not get this! case OBJ_PROJECTILE: debug(LOG_ERROR, "ProcessDroidOrder: order specified destination as a bullet. what am i to do??"); break; default: debug(LOG_ERROR, "ProcessDroidOrder: unknown object type"); break; } // If we did not find anything, return if (!psObj) // failed to find it; { syncDebug("Target missing"); return TargetMissing; // Can't return NULL, since then the order would still be attempted. } return psObj; } }
static QScriptValue js_label(QScriptContext *context, QScriptEngine *engine) { QString label = context->argument(0).toString(); QScriptValue ret = engine->newObject(); if (labels.contains(label)) { labeltype p = labels.value(label); if (p.type == AREA || p.type == POSITION) { ret.setProperty("x", map_coord(p.p1.x), QScriptValue::ReadOnly); ret.setProperty("y", map_coord(p.p1.y), QScriptValue::ReadOnly); } if (p.type == AREA) { ret.setProperty("x2", map_coord(p.p2.x), QScriptValue::ReadOnly); ret.setProperty("xy", map_coord(p.p2.y), QScriptValue::ReadOnly); } else if (p.type == OBJ_DROID) { DROID *psDroid = IdToDroid(p.id, p.player); if (psDroid) ret = convDroid(psDroid, engine); } else if (p.type == OBJ_STRUCTURE) { STRUCTURE *psStruct = IdToStruct(p.id, p.player); if (psStruct) ret = convStructure(psStruct, engine); } else if (p.type == OBJ_FEATURE) { FEATURE *psFeature = IdToFeature(p.id, p.player); if (psFeature) ret = convFeature(psFeature, engine); } } else debug(LOG_ERROR, "label %s not found!", label.toUtf8().constData()); return ret; }