All pastes #352502 Raw Edit

YObjects.inc

public cpp v1 · immutable
·published 2007-02-12 21:24 UTC
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;}