rendered paste body#include <a_samp>#define GLOBAL_OBJECT_ARRAY gObjects // Change if you use a different variablestock bool:operator==(xor:oper1, xor:oper2) return (oper1 || oper2) && !(oper1 && oper2);forward ObjectsLoop();#define CEIL_DIV(%1,%2) (((%1) + (%2) - 1) / (%2)) // Round int divisions up#define PLAYERS_ARRAY_COUNT CEIL_DIV(MAX_PLAYERS, cellbits)#if MAX_WORLDS > 32 #define VW_ARRAY_COUNT CEIL_DIV(MAX_WORLDS, cellbits)#else #define VW_ARRAY_COUNT 2#endif#define OBJECTS_ARRAY_COUNT CEIL_DIV(MAX_DYN_OBJECTS, cellbits)#define SHOW_ALL_PLAYERS 0x80000000#define SHOW_ALL_WORLDS 0x40000000#define OBJECT_MOVING1 0x20000000#define OBJECT_MOVING2 0x10000000#define OBJECT_MOVING 0x30000000#define OBJECT_JUMPED 0x08000000#define OBJECT_ROTATED 0x04000000enum OBJECT_DATA{ Float:OD_POSITION[6], // Current location in the world #if defined OBJECTS_MOVE Float:OD_TARGET[4], // Place it's moving to #endif #if defined PLAYER_ONLY OD_PLAYERS[PLAYERS_ARRAY_COUNT], // Bit array of players #endif #if MAX_WORLDS > 0 OD_WORLDS[VW_ARRAY_COUNT], // Bit array of worlds #endif OD_MODEL // Model of the object, -1 = inactive, highest byte= flags}#define NO_OBJECT -1#define DISTANCE(%1,%2,%3) DistanceToOrigin((X - (%1)), (Y - (%2)), (Z - (%3)))#define SET_ACTIVE(%1,%2) %1[(%2) / cellbits] |= 0x01 << ((%2) % cellbits)#define IS_BIT(%1,%2) (%1[(%2) / cellbits] & 0x01 << ((%2) % cellbits))#define COLOR_BLUE 0x0000FFAA#define OBJECT_COUNT sizeof (gObjects)new gObjects[MAX_DYN_OBJECTS][OBJECT_DATA];forward rot();stock GetDynamicObjectPos(objectid, &Float:X, &Float:Y, &Float:Z){ if (IsValidDynamicObject(objectid)) { X = GLOBAL_OBJECT_ARRAY[objectid][OD_POSITION][0]; Y = GLOBAL_OBJECT_ARRAY[objectid][OD_POSITION][1]; Z = GLOBAL_OBJECT_ARRAY[objectid][OD_POSITION][2]; return 1; } return 0;}stock GetDynamicObjectRot(objectid, &Float:RX, &Float:RY, &Float:RZ){ if (IsValidDynamicObject(objectid)) { RX = GLOBAL_OBJECT_ARRAY[objectid][OD_POSITION][3]; RY = GLOBAL_OBJECT_ARRAY[objectid][OD_POSITION][4]; RZ = GLOBAL_OBJECT_ARRAY[objectid][OD_POSITION][5]; return 1; } return 0;}stock MoveDynamicObject(objectid, Float:X, Float:Y, Float:Z, Float:S){ #if defined OBJECTS_MOVE if (IsValidDynamicObject(objectid)) { // Uses overloaded == operator, using xor: tags to do logical XOR // Very counter intuative but you can't define a ^^ operator // So although this looks like == it's true if ONLY ONE is true if (xor:(GLOBAL_OBJECT_ARRAY[objectid][OD_MODEL] & OBJECT_MOVING1) == xor:(GLOBAL_OBJECT_ARRAY[objectid][OD_MODEL] & OBJECT_MOVING2)) { // One of the moving flags is set // There's two so models can be re-moved GLOBAL_OBJECT_ARRAY[objectid][OD_MODEL] ^= OBJECT_MOVING; // Swap which flag is on } else { // Else and error checking - neither or both (can't be) were on GLOBAL_OBJECT_ARRAY[objectid][OD_MODEL] |= OBJECT_MOVING1; } GLOBAL_OBJECT_ARRAY[objectid][OD_TARGET][0] = X; GLOBAL_OBJECT_ARRAY[objectid][OD_TARGET][1] = Y; GLOBAL_OBJECT_ARRAY[objectid][OD_TARGET][2] = Z; GLOBAL_OBJECT_ARRAY[objectid][OD_TARGET][3] = S; return 1; } #else #pragma unused objectid, X, Y, Z, S #endif return 0;}stock StopDynamicObject(objectid){ #if defined OBJECTS_MOVE if (IsValidDynamicObject(objectid)) { // Get rid of both moving flags GLOBAL_OBJECT_ARRAY[objectid][OD_MODEL] &= ~(OBJECT_MOVING); } #else #pragma unused objectid #endif return 0;}stock IsValidDynamicObject(objectid){ if (objectid >= 0 && objectid < MAX_DYN_OBJECTS && GLOBAL_OBJECT_ARRAY[objectid][OD_MODEL] != NO_OBJECT) return 1; return 0;}stock InitObjectPool(){ ObjectsLoop(); // Initial call to setup variables for (new i = 0; i < MAX_DYN_OBJECTS; i++) { GLOBAL_OBJECT_ARRAY[i][OD_MODEL] = NO_OBJECT; } SetTimer("ObjectsLoop", 1000 / LOOP_GRANULARITY, 1);}stock CreateDynamicObject(model, Float:X, Float:Y, Float:Z, Float:RX, Float:RY, Float:RZ){ new object = InternalAddObject(model, X, Y, Z, RX, RY, RZ); if (object != NO_OBJECT) { GLOBAL_OBJECT_ARRAY[object][OD_MODEL] |= SHOW_ALL_PLAYERS | SHOW_ALL_WORLDS; // 0b11000000... } return object;}stock CreatePlayerDynamicObject(playerid, model, Float:X, Float:Y, Float:Z, Float:RX, Float:RY, Float:RZ){ new object; #if defined PLAYER_ONLY object = InternalAddObject(model, X, Y, Z, RX, RY, RZ); if (object != NO_OBJECT) { GLOBAL_OBJECT_ARRAY[object][OD_PLAYERS] = AddPlayer(GLOBAL_OBJECT_ARRAY[object][OD_PLAYERS], playerid, 1); GLOBAL_OBJECT_ARRAY[object][OD_MODEL] |= SHOW_ALL_WORLDS; // 0b01000000... } #else #pragma unused playerid object = CreateDynamicObject(model, X, Y, Z, RX, RY, RZ); #endif return object;}stock CreateVWDynamicObject(virtualworld, model, Float:X, Float:Y, Float:Z, Float:RX, Float:RY, Float:RZ){ new object; #if MAX_WORLDS > 0 object = InternalAddObject(model, X, Y, Z, RX, RY, RZ); if (object != NO_OBJECT) { GLOBAL_OBJECT_ARRAY[object][OD_WORLDS] = AddVW(GLOBAL_OBJECT_ARRAY[object][OD_WORLDS], virtualworld, 1); GLOBAL_OBJECT_ARRAY[object][OD_MODEL] |= SHOW_ALL_PLAYERS; // 0b10000000... } #else #pragma unused virtualworld object = CreateDynamicObject(model, X, Y, Z, RX, RY, RZ); #endif return object;}stock CreatePlayerVWDynamicObject(playerid, virtualworld, model, Float:X, Float:Y, Float:Z, Float:RX, Float:RY, Float:RZ){ new object; #if defined PLAYER_ONLY #if MAX_WORLDS > 0 object = InternalAddObject(model, X, Y, Z, RX, RY, RZ); if (object != NO_OBJECT) { GLOBAL_OBJECT_ARRAY[object][OD_WORLDS] = AddVW(GLOBAL_OBJECT_ARRAY[object][OD_WORLDS], virtualworld, 1); GLOBAL_OBJECT_ARRAY[object][OD_PLAYERS] = AddPlayer(GLOBAL_OBJECT_ARRAY[object][OD_PLAYERS], playerid, 1); } #else #pragma unused virtualworld object = CreatePlayerDynamicObject(playerid, model, X, Y, Z, RX, RY, RZ); #endif #else #pragma unused playerid object = CreateVWDynamicObject(virtualworld, model, X, Y, Z, RX, RY, RZ); #endif return object;}InternalAddObject(model, Float:X, Float:Y, Float:Z, Float:RX, Float:RY, Float:RZ){ // Check model here, all calls to the system go through here model &= 0x00FFFFFF; // Just make sure if (!IsValidModel(model)) return NO_OBJECT; for (new i = 0; i < MAX_DYN_OBJECTS; i++) { if (GLOBAL_OBJECT_ARRAY[i][OD_MODEL] == NO_OBJECT) { GLOBAL_OBJECT_ARRAY[i][OD_MODEL] = model; GLOBAL_OBJECT_ARRAY[i][OD_POSITION][0] = X; GLOBAL_OBJECT_ARRAY[i][OD_POSITION][1] = Y; GLOBAL_OBJECT_ARRAY[i][OD_POSITION][2] = Z; GLOBAL_OBJECT_ARRAY[i][OD_POSITION][3] = RX; GLOBAL_OBJECT_ARRAY[i][OD_POSITION][4] = RY; GLOBAL_OBJECT_ARRAY[i][OD_POSITION][5] = RZ; return i; } } return NO_OBJECT;}stock AddPlayerToObject(objectid, playerid){ #if defined PLAYER_ONLY if (objectid < MAX_DYN_OBJECTS && GLOBAL_OBJECT_ARRAY[objectid][OD_MODEL] != NO_OBJECT) { GLOBAL_OBJECT_ARRAY[objectid][OD_PLAYERS] = AddPlayer(GLOBAL_OBJECT_ARRAY[objectid][OD_PLAYERS], playerid); return 1; } #else #pragma unused objectid, playerid #endif return 0;}stock AddVWToObject(objectid, virtualworld){ #if MAX_WORLDS > 0 if (IsValidDynamicObject(objectid)) { GLOBAL_OBJECT_ARRAY[objectid][OD_WORLDS] = AddVW(GLOBAL_OBJECT_ARRAY[objectid][OD_WORLDS], virtualworld); return 1; } #else #pragma unused objectid, virtualworld #endif return 0;}stock AddAllVWToObject(objectid){ #if MAX_WORLDS > 0 if (IsValidDynamicObject(objectid)) { GLOBAL_OBJECT_ARRAY[objectid][OD_MODEL] |= SHOW_ALL_WORLDS; return 1; } #else #pragma unused objectid #endif return 0;}stock AddAllPlayersToObject(objectid){ #if defined PLAYER_ONLY if (IsValidDynamicObject(objectid)) { GLOBAL_OBJECT_ARRAY[objectid][OD_MODEL] |= SHOW_ALL_PLAYERS; return 1; } #else #pragma unused objectid #endif return 0;}stock RemovePlayerFromObject(objectid, playerid){ #if defined PLAYER_ONLY if (IsValidDynamicObject(objectid)) { GLOBAL_OBJECT_ARRAY[objectid][OD_PLAYERS] = RemovePlayer(GLOBAL_OBJECT_ARRAY[objectid][OD_PLAYERS], playerid); return 1; } #else #pragma unused objectid, playerid #endif return 0;}stock RemoveVWFromObject(objectid, virtualworld){ #if MAX_WORLDS > 0 if (IsValidDynamicObject(objectid)) { GLOBAL_OBJECT_ARRAY[objectid][OD_WORLDS] = RemoveVW(GLOBAL_OBJECT_ARRAY[objectid][OD_WORLDS], virtualworld); return 1; } #else #pragma unused objectid, virtualworld #endif return 0;}#if defined PLAYER_ONLY stock RemovePlayer(players[], playerid) { new temp[PLAYERS_ARRAY_COUNT]; for (new i = 0; i < PLAYERS_ARRAY_COUNT; i++) { temp[i] = players[i]; } temp[playerid / cellbits] &= ~(0x01 << (playerid % cellbits)); return temp; } stock AddPlayer(players[], playerid, set = 0) { new temp[PLAYERS_ARRAY_COUNT]; for (new i = 0; i < PLAYERS_ARRAY_COUNT; i++) { temp[i] = players[i]; } if (set) { temp[playerid / cellbits] = 0; } SET_ACTIVE(temp, playerid); return temp; }#endif#if MAX_WORLDS > 0 stock RemoveVW(worlds[], vwid) { new temp[VW_ARRAY_COUNT]; for (new i = 0; i < VW_ARRAY_COUNT; i++) { temp[i] = worlds[i]; } temp[vwid / cellbits] &= ~(0x01 << (vwid % cellbits)); return temp; } stock AddVW(worlds[], vwid, set = 0) { new temp[VW_ARRAY_COUNT]; for (new i = 0; i < VW_ARRAY_COUNT; i++) { temp[i] = worlds[i]; } if (set) { temp[vwid / cellbits] = 0; } SET_ACTIVE(temp, vwid); return temp; }#endifstock DestroyDynamicObject(objectid){ if (IsValidDynamicObject(objectid)) { GLOBAL_OBJECT_ARRAY[objectid][OD_MODEL] = NO_OBJECT; return 1; } return 0;}stock SetDynamicObjectPos(objectid, Float:X, Float:Y, Float:Z){ if (IsValidDynamicObject(objectid)) { GLOBAL_OBJECT_ARRAY[objectid][OD_POSITION][0] = X; GLOBAL_OBJECT_ARRAY[objectid][OD_POSITION][1] = Y; GLOBAL_OBJECT_ARRAY[objectid][OD_POSITION][2] = Z; GLOBAL_OBJECT_ARRAY[objectid][OD_MODEL] |= OBJECT_JUMPED; // Mark the object as having jumped to be recreated if it exists return 1; } return 0;}stock SetDynamicObjectRot(objectid, Float:RX, Float:RY, Float:RZ){ if (IsValidDynamicObject(objectid)) { GLOBAL_OBJECT_ARRAY[objectid][OD_POSITION][3] = RX; GLOBAL_OBJECT_ARRAY[objectid][OD_POSITION][4] = RY; GLOBAL_OBJECT_ARRAY[objectid][OD_POSITION][5] = RZ; GLOBAL_OBJECT_ARRAY[objectid][OD_MODEL] |= OBJECT_ROTATED; // Mark the object as having jumped to be recreated if it exists return 1; } return 0;}stock GetObject(j){ return GLOBAL_OBJECT_ARRAY[j];}stock PlayerObject(object[OBJECT_DATA], playerid){ // This function determines wether or not the player can see the object // Based on settings for the object and compile options for the script // If neither Worlds or Individuals are defined the result MUST be 1 #if MAX_WORLDS > 0 new vwid = GetPlayerVirtualWorld(playerid); if ((object[OD_MODEL] & SHOW_ALL_WORLDS) || IS_BIT(object[OD_WORLDS], vwid)) { #endif #if defined PLAYER_ONLY if ((object[OD_MODEL] & SHOW_ALL_PLAYERS) || IS_BIT(object[OD_PLAYERS], playerid)) { #endif #if MAX_WORLDS > 0 || defined PLAYER_ONLY return 1; #endif #if defined PLAYER_ONLY } #endif #if MAX_WORLDS > 0 } #endif #if MAX_WORLDS > 0 || defined PLAYER_ONLY return 0; #else #pragma unused object, playerid return 1; #endif}stock Float:DistanceToOrigin(Float:X, Float:Y, Float:Z){ return floatsqroot((X * X) + (Y * Y) + (Z * Z));}#if defined OBJECTS_MOVE stock Float:DistanceRemaining(objectid) { return DistanceToOrigin(GLOBAL_OBJECT_ARRAY[objectid][OD_POSITION][0] - GLOBAL_OBJECT_ARRAY[objectid][OD_TARGET][0], GLOBAL_OBJECT_ARRAY[objectid][OD_POSITION][1] - GLOBAL_OBJECT_ARRAY[objectid][OD_TARGET][1], GLOBAL_OBJECT_ARRAY[objectid][OD_POSITION][2] - GLOBAL_OBJECT_ARRAY[objectid][OD_TARGET][2]); } stock InternalMoveObject(objectid, Float:elapsedtime) { new Float:distance = elapsedtime * GLOBAL_OBJECT_ARRAY[objectid][OD_TARGET][3]; new Float:remaining = DistanceRemaining(objectid); if (distance >= remaining) { GLOBAL_OBJECT_ARRAY[objectid][OD_POSITION][0] = GLOBAL_OBJECT_ARRAY[objectid][OD_TARGET][0]; GLOBAL_OBJECT_ARRAY[objectid][OD_POSITION][1] = GLOBAL_OBJECT_ARRAY[objectid][OD_TARGET][1]; GLOBAL_OBJECT_ARRAY[objectid][OD_POSITION][2] = GLOBAL_OBJECT_ARRAY[objectid][OD_TARGET][2]; new oldmove = GLOBAL_OBJECT_ARRAY[objectid][OD_MODEL] & OBJECT_MOVING; //OnDynamicObjectMoved(objectid); CallRemoteFunction("OnDynamicObjectMoved", "i", objectid); if (oldmove == GLOBAL_OBJECT_ARRAY[objectid][OD_MODEL] & OBJECT_MOVING) { // The object hasn't been repositioned in OnDynamicObjectMoved GLOBAL_OBJECT_ARRAY[objectid][OD_MODEL] &= ~(OBJECT_MOVING); } return 1; } else { remaining /= distance; // Calculate ratio GLOBAL_OBJECT_ARRAY[objectid][OD_POSITION][0] += (GLOBAL_OBJECT_ARRAY[objectid][OD_TARGET][0] - GLOBAL_OBJECT_ARRAY[objectid][OD_POSITION][0]) / remaining; GLOBAL_OBJECT_ARRAY[objectid][OD_POSITION][1] += (GLOBAL_OBJECT_ARRAY[objectid][OD_TARGET][1] - GLOBAL_OBJECT_ARRAY[objectid][OD_POSITION][1]) / remaining; GLOBAL_OBJECT_ARRAY[objectid][OD_POSITION][2] += (GLOBAL_OBJECT_ARRAY[objectid][OD_TARGET][2] - GLOBAL_OBJECT_ARRAY[objectid][OD_POSITION][2]) / remaining; } return 0; } /*OnDynamicObjectMoved(objectid) { #pragma unused objectid return 1; }*/#endifpublic ObjectsLoop(){ static sObjects[MAX_PLAYERS][MAX_OBJECTS]; static sLastModel[MAX_DYN_OBJECTS]; static firsttime = 0; #if defined OBJECTS_MOVE static sLastTickCount = 0; new TickCount = GetTickCount(); #endif if (firsttime) { #if defined OBJECTS_MOVE // Update moving object's locations new Float:fElapsedTime = float(TickCount - sLastTickCount) / 1000.0; for (new i = 0; i < MAX_DYN_OBJECTS; i++) { if (IsValidDynamicObject(i)) { if (GLOBAL_OBJECT_ARRAY[i][OD_MODEL] & (OBJECT_MOVING)) { // The object is moving according to either flag InternalMoveObject(i, fElapsedTime); } } } #endif new Float:X, Float:Y, Float:Z; for (new i = 0; i < MAX_PLAYERS; i++) { if (!IsPlayerConnected(i)) continue; GetPlayerPos(i, X, Y, Z); new activecount = 0; // Number of objects for this player new playeractive[OBJECTS_ARRAY_COUNT]; for (new j = 0; j < MAX_OBJECTS; j++) { // Check existing objects new obj = sObjects[i][j] & 0x00FFFFFF; // Strip flags if (obj != (NO_OBJECT & 0x00FFFFFF) && IsValidPlayerObject(i, j)) { if (IsValidDynamicObject(obj)) { new objdat[OBJECT_DATA]; objdat = GetObject(obj); if (sLastModel[obj] != objdat[OD_MODEL] & 0x00FFFFFF) goto mark_as_ignored; if (PlayerObject(objdat, i) && DISTANCE(objdat[OD_POSITION][0], objdat[OD_POSITION][1], objdat[OD_POSITION][2]) <= VIEW_DISTANCE) { // It's still active and OK activecount++; if (objdat[OD_MODEL] & OBJECT_JUMPED) { SetPlayerObjectPos(i, j, objdat[OD_POSITION][0], objdat[OD_POSITION][1], objdat[OD_POSITION][2]); //SetPlayerObjectRot(i, j, objdat[OD_POSITION][3], objdat[OD_POSITION][4], objdat[OD_POSITION][5]); } if (objdat[OD_MODEL] & OBJECT_ROTATED) { //SetPlayerObjectPos(i, j, objdat[OD_POSITION][0], objdat[OD_POSITION][1], objdat[OD_POSITION][2]); SetPlayerObjectRot(i, j, objdat[OD_POSITION][3], objdat[OD_POSITION][4], objdat[OD_POSITION][5]); } #if defined OBJECTS_MOVE if ((objdat[OD_MODEL] & OBJECT_MOVING) != (sObjects[i][j] & OBJECT_MOVING)) { // Object has changed motion SetPlayerObjectPos(i, j, objdat[OD_POSITION][0], objdat[OD_POSITION][1], objdat[OD_POSITION][2]); sObjects[i][j] &= ~(OBJECT_MOVING); if (objdat[OD_MODEL] & OBJECT_MOVING) { // Change of target // Mark as having got the new target sObjects[i][j] |= objdat[OD_MODEL] & OBJECT_MOVING; MovePlayerObject(i, j, objdat[OD_TARGET][0], objdat[OD_TARGET][1], objdat[OD_TARGET][2], objdat[OD_TARGET][3]); } else { // Stopped StopPlayerObject(i, j); } } #endif goto mark_as_done; } } mark_as_ignored: // Skipped if it's a good object DestroyPlayerObject(i, j); sObjects[i][j] = NO_OBJECT; mark_as_done: SET_ACTIVE(playeractive, obj); // Possibly not technically active but we know it can't be // so no point checking it againbelow } else { sObjects[i][j] = NO_OBJECT; } } for (new k = 0; k < MAX_DYN_OBJECTS && activecount < MAX_OBJECTS; k++) { // If activecount is filled subsequent itterations will // be ignored if (!IS_BIT(playeractive, k) && IsValidDynamicObject(k)) { new objdat[OBJECT_DATA]; objdat = GetObject(k); if (PlayerObject(objdat, i)) { // Go through the objects by priority: high-low //printf("found one: %d", k); if (DISTANCE(objdat[OD_POSITION][0], objdat[OD_POSITION][1], objdat[OD_POSITION][2]) <= VIEW_DISTANCE) { // Valid model new num = CreatePlayerObject(i, objdat[OD_MODEL] & 0x00FFFFFF, objdat[OD_POSITION][0], objdat[OD_POSITION][1], objdat[OD_POSITION][2], objdat[OD_POSITION][3], objdat[OD_POSITION][4], objdat[OD_POSITION][5]); if (IsValidPlayerObject(i, num)) { //printf("created: %d", num); sObjects[i][num] = k; // Store the obj activecount++; //sActive[i][k] = 1; SET_ACTIVE(playeractive, k); #if defined OBJECTS_MOVE if (objdat[OD_MODEL] & OBJECT_MOVING) { sObjects[i][num] |= objdat[OD_MODEL] & OBJECT_MOVING; MovePlayerObject(i, num, objdat[OD_TARGET][0], objdat[OD_TARGET][1], objdat[OD_TARGET][2], objdat[OD_TARGET][3]); } #endif } } } } } } for (new i = 0; i < MAX_DYN_OBJECTS; i++) { if (GLOBAL_OBJECT_ARRAY[i][OD_MODEL] != NO_OBJECT) { // Mark all objects as having been moved for all players GLOBAL_OBJECT_ARRAY[i][OD_MODEL] &= ~(OBJECT_JUMPED | OBJECT_ROTATED); } // Update the local settings so we know it's changed // Not in the loop as it could have been destroyed sLastModel[i] = GLOBAL_OBJECT_ARRAY[i][OD_MODEL] & 0x00FFFFFF; } } else { // Initial static setup for (new i = 0; i < MAX_PLAYERS; i++) { for (new j = 0; j < MAX_OBJECTS; j++) { sObjects[i][j] = NO_OBJECT; } } firsttime = 1; } #if defined OBJECTS_MOVE sLastTickCount = TickCount; #endif}stock IsValidModel(modelid){ static modeldat[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -128, -515899393, -134217729, -1, -1, 33554431, -1, -1, -1, -14337, -1, -33, 127, 0, 0, 0, 0, 0, -8388608, -1, -1, -1, -16385, -1, -1, -1, -1, -1, -1, -1, -33, -1, -771751937, -1, -9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 33554431, -25, -1, -1, -1, -1, -1, -1, -1073676289, -2147483648, 34079999, 2113536, -4825600, -5, -1, -3145729, -1, -16777217, -63, -1, -1, -1, -1, -201326593, -1, -1, -1, -1, -1, -257, -1, 1073741823, -133122, -1, -1, -65, -1, -1, -1, -1, -1, -1, -2146435073, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1073741823, -64, -1, -1, -1, -1, -2635777, 134086663, 0, -64, -1, -1, -1, -1, -1, -1, -1, -536870927, -131069, -1, -1, -1, -1, -1, -1, -1, -1, -16384, -1, -33554433, -1, -1, -1, -1, -1, -1610612737, 524285, -128, -1, 2080309247, -1, -1, -1114113, -1, -1, -1, 66977343, -524288, -1, -1, -1, -1, -2031617, -1, 114687, -256, -1, -4097, -1, -4097, -1, -1, 1010827263, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -32768, -1, -1, -1, -1, -1, 2147483647, -33554434, -1, -1, -49153, -1148191169, 2147483647, -100781080, -262145, -57, 134217727, -8388608, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1048577, -1, -449, -1017, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1835009, -2049, -1, -1, -1, -1, -1, -1, -8193, -1, -536870913, -1, -1, -1, -1, -1, -87041, -1, -1, -1, -1, -1, -1, -209860, -1023, -8388609, -2096897, -1, -1048577, -1, -1, -1, -1, -1, -1, -897, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1610612737, -3073, -28673, -1, -1, -1, -1537, -1, -1, -13, -1, -1, -1, -1, -1985, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1056964609, -1, -1, -1, -1, -1, -1, -1, -2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -236716037, -1, -1, -1, -1, -1, -1, -1, -536870913, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -2097153, -2109441, -1, 201326591, -4194304, -1, -1, -241, -1, -1, -1, -1, -1, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -32768, -1, -1, -1, -2, -671096835, -1, -8388609, -66323585, -13, -1793, -32257, -247809, -1, -1, -513, 16252911, 0, 0, 0, -131072, 33554383, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8356095, 0, 0, 0, 0, 0, 0, -256, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -268435449, -1, -1, -2049, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 92274627, -65536, -2097153, -268435457, 591191935, 1, 0, -16777216, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 127 }; if ((modelid >= 0) && (modelid < (sizeof (modeldat) * 32)) && IS_BIT(modeldat, modelid)) { return 1; } return 0;}