mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			246 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			246 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| // 	Checkpoint Manager
 | |
| // 	(c) João Pedro Lopes, All right's reserved
 | |
| // 	
 | |
| // 	Feel free to change any line above, as long as you post the 'fix' / 'patch' at the forum
 | |
| // 	and send a copy to jplopes@live.com.pt
 | |
| 
 | |
| /* natives
 | |
| 	native CreateCheckpoint(ownerid, chpid, Float:posX, Float:posY, Float:posZ, Float:size); // Creates a checkpoint
 | |
| 	native SetCheckpointInterior(chpid, interiorid); // Changes the checkpoint interior
 | |
| 	native SetCheckpointVirtualWorld(chpid, VirtualWorldID); // Changes the Checkpoint vWorld
 | |
| 	native ToggleCheckpointActive(chpid, bool:active); // Deactivates / Activates the checkpoint
 | |
| 	native ChangeCheckpointOwner(chpid, owner);	// Change the checkpoint owner
 | |
| 	native RemoveCheckpoint(chpid); // Removes the specified checkpoint
 | |
| 	native StartCheckpointSeeking(); // Starts seeking for each individual
 | |
| 	native StopCheckpointSeeking(); // Stops the system
 | |
| 	native VerifyCheckpoint(playerid); // Place this at OnPlayerEnterCheckpoint
 | |
| */
 | |
| 
 | |
| // Function Forwards
 | |
| forward public OnCheckpointEnter(playerid, checkpointid);
 | |
| 
 | |
| #if defined _CHECKPOINT_MANAGER_INCLUDED
 | |
| 	#endinput
 | |
| #endif
 | |
| 
 | |
| #define _CHECKPOINT_MANAGER_INCLUDED
 | |
| #pragma library CheckpointManager
 | |
| 
 | |
| #include <a_samp>
 | |
| 
 | |
| #define MAX_CHECKPOINTS 200
 | |
| #define CHECKPOINT_SEEKER_DELAY 300
 | |
| 
 | |
| #define GLOBAL_OWNER_ID -1
 | |
| 
 | |
| 
 | |
| // CHECKPOINT ENUMERATION
 | |
| enum _checkpointEnum{
 | |
| 	_chp_populated,			// Is this slot of the memory populated?
 | |
| 	
 | |
| 	_chp_id,				// The ID of the checkpoint
 | |
| 	_chp_owner,				// The ID of the player who this checkpoint is visible too
 | |
| 	
 | |
| 	Float:_chp_posX,		// The X position of this checkpoint
 | |
| 	Float:_chp_posY,		// The Y position of this checkpoint
 | |
| 	Float:_chp_posZ,		// The Z position of this checkpoint
 | |
| 	Float:_chp_size,		// The checkpoint size
 | |
| 	Float:_chp_viewDistance,	// The checkpoint view distance
 | |
| 	
 | |
| 	bool:_chp_active,		// Is this checkpoint active?
 | |
| 	
 | |
| 	_chp_interior_id,		// The interior id of this checkpoint
 | |
| 	_chp_world_id			// The world id of this checkpoint
 | |
| };
 | |
| 
 | |
| // DATA ARRAYS
 | |
| new _checkpoints[MAX_CHECKPOINTS][_checkpointEnum];
 | |
| new _p_VisibleCheckpoint[MAX_PLAYERS];
 | |
| new _chp_manager_timer_id;
 | |
| 
 | |
| // DATA VARIABLES
 | |
| new _totalCheckpoints;
 | |
| 
 | |
| // --------------------------------------------------------------------------------------------------------
 | |
| // Creates a new checkpoint with some initial data
 | |
| stock CreateCheckpoint(__ownerid, __chpid, Float:__posX, Float:__posY, Float:__posZ, Float:__size){
 | |
| 	// Max checkpoint reached?
 | |
| 	if(_totalCheckpoints == MAX_CHECKPOINTS) return 0;
 | |
| 	
 | |
| 	// First checkpoint? Setting everything to unpopulated
 | |
| 	if(!_totalCheckpoints){
 | |
| 		for(new i; i < MAX_PLAYERS; i++) _p_VisibleCheckpoint[i] = -1;
 | |
| 		for(new i; i < MAX_CHECKPOINTS; i++){
 | |
| 			_checkpoints[i][_chp_populated] = false;
 | |
| 		}
 | |
| 		
 | |
| 		// Sending the Initialization Info
 | |
| 		printf("[Checkpoint Manager : Version 0.1.1b] System Initialized...", __chpid);
 | |
| 	}
 | |
| 	
 | |
| 	// Getting the first open slot
 | |
| 	new _slot;
 | |
| 	for(new i = 0; i < MAX_CHECKPOINTS; i++){
 | |
| 		if(!_checkpoints[i][_chp_populated]){
 | |
| 			_slot = i;
 | |
| 			break;
 | |
| 		}
 | |
| 	}
 | |
| 	
 | |
| 	// Adding the new checkpoint
 | |
| 	_checkpoints[_slot][_chp_populated] = true;
 | |
| 	_checkpoints[_slot][_chp_id] = __chpid;
 | |
| 	_checkpoints[_slot][_chp_owner] = __ownerid;
 | |
| 	_checkpoints[_slot][_chp_posX] = __posX;
 | |
| 	_checkpoints[_slot][_chp_posY] = __posY;
 | |
| 	_checkpoints[_slot][_chp_posZ] = __posZ;
 | |
| 	_checkpoints[_slot][_chp_size] = __size;
 | |
| 	_checkpoints[_slot][_chp_viewDistance] = 50.0;
 | |
| 	_checkpoints[_slot][_chp_active] = true;
 | |
| 	_checkpoints[_slot][_chp_interior_id] = 0;
 | |
| 	_checkpoints[_slot][_chp_world_id] = 0;
 | |
| 	
 | |
| 	printf("[Checkpoint Manager] Checkpoint created (%d) at slot %d", __chpid, _slot);
 | |
| 	printf("Checkpoint Position: { %f, %f, %f }", _checkpoints[_slot][_chp_posX], _checkpoints[_slot][_chp_posY], _checkpoints[_slot][_chp_posZ]);
 | |
| 	
 | |
| 	_totalCheckpoints++;
 | |
| 	return 1;
 | |
| }
 | |
| 
 | |
| //---------------------------------------------------------------------------------------------
 | |
| stock SetCheckpointInterior(__chpid, __interiorid){
 | |
| 	new _slot = __ChpSlotByID(__chpid);
 | |
| 	if(_slot > -1){
 | |
| 		// Valid slot?
 | |
| 		_checkpoints[_slot][_chp_interior_id] = __interiorid;
 | |
| 		return 1;
 | |
| 	}
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| //---------------------------------------------------------------------------------------------
 | |
| stock SetCheckpointVirtualWorld(__chpid, __virtual_world_id){
 | |
| 	new _slot = __ChpSlotByID(__chpid);
 | |
| 	if(_slot > -1){
 | |
| 		_checkpoints[_slot][_chp_world_id] = __virtual_world_id;
 | |
| 		return 1;
 | |
| 	}
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| stock ToggleCheckpointActive(__chpid, bool:__active){
 | |
| 	new _slot = __ChpSlotByID(__chpid);
 | |
| 	if(_slot > -1){
 | |
| 		_checkpoints[_slot][_chp_active] = __active;
 | |
| 		return 1;
 | |
| 	}
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| stock ChangeCheckpointOwner(__chpid, __owner){
 | |
| 	new _slot = __ChpSlotByID(__chpid);
 | |
| 	if(_slot > -1){
 | |
| 		_checkpoints[_slot][_chp_owner] = __owner;
 | |
| 		return 1;
 | |
| 	}
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| stock RemoveCheckpoint(__chpid){
 | |
| 	new _slot = __ChpSlotByID(__chpid);
 | |
| 	if(_slot > -1){
 | |
| 		// Deleting the checkpoint
 | |
| 		_checkpoints[_slot][_chp_populated] = false;
 | |
| 		_checkpoints[_slot][_chp_id] = -1;
 | |
| 		_checkpoints[_slot][_chp_owner] = 255;
 | |
| 		_checkpoints[_slot][_chp_posX] = -1;
 | |
| 		_checkpoints[_slot][_chp_posY] = -1;
 | |
| 		_checkpoints[_slot][_chp_posZ] = -1;
 | |
| 		_checkpoints[_slot][_chp_size] = -1;
 | |
| 		_checkpoints[_slot][_chp_viewDistance] = -1;
 | |
| 		_checkpoints[_slot][_chp_active] = false;
 | |
| 		_checkpoints[_slot][_chp_interior_id] = -1;
 | |
| 		_checkpoints[_slot][_chp_world_id] = -1;
 | |
| 		_totalCheckpoints--;
 | |
| 		printf("\n[Checkpoint Manager] Checkpoint removed (ID: %d)", __chpid);
 | |
| 		return 1;
 | |
| 	}
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| //---------------------------------------------------------------------------------------------
 | |
| // Gets the checkpoint slot by id
 | |
| stock __ChpSlotByID(__chpid){
 | |
| 	for(new i; i < MAX_CHECKPOINTS; i++){
 | |
| 		if(_checkpoints[i][_chp_id] == __chpid) return i;
 | |
| 	}
 | |
| 	return -1;
 | |
| }
 | |
| 
 | |
| 
 | |
| forward CheckpointSeeker();
 | |
| stock StartCheckpointSeeking(){
 | |
| 	_chp_manager_timer_id = SetTimer("CheckpointSeeker", CHECKPOINT_SEEKER_DELAY, 1);
 | |
| 	return 1;
 | |
| }
 | |
| 
 | |
| stock StopCheckpointSeeking(){
 | |
| 	KillTimer(_chp_manager_timer_id);
 | |
| 	return 1;
 | |
| }
 | |
| 
 | |
| public CheckpointSeeker(){
 | |
| 	new Float:__posX, Float:__posY, Float:__posZ;
 | |
| 	new __interior;
 | |
| 	new __virtualWorld;
 | |
| 	for(new i; i < MAX_PLAYERS; i++)
 | |
| 	{
 | |
| 		if(!IsPlayerConnected(i)) continue;
 | |
| 		
 | |
| 		GetPlayerPos(i, Float:__posX, Float:__posY, Float:__posZ);
 | |
| 		// Is the player near a checkpoint?
 | |
| 		if(_p_VisibleCheckpoint[i] > -1)
 | |
| 		{
 | |
| 			// If the player is no longer near that point
 | |
| 			if(__posX < (_checkpoints[_p_VisibleCheckpoint[i]][_chp_posX] - _checkpoints[_p_VisibleCheckpoint[i]][_chp_viewDistance])
 | |
| 			|| __posX > (_checkpoints[_p_VisibleCheckpoint[i]][_chp_posX] + _checkpoints[_p_VisibleCheckpoint[i]][_chp_viewDistance])
 | |
| 			|| __posY < (_checkpoints[_p_VisibleCheckpoint[i]][_chp_posY] - _checkpoints[_p_VisibleCheckpoint[i]][_chp_viewDistance])
 | |
| 			|| __posY > (_checkpoints[_p_VisibleCheckpoint[i]][_chp_posY] + _checkpoints[_p_VisibleCheckpoint[i]][_chp_viewDistance])){
 | |
| 				DisablePlayerCheckpoint(i);
 | |
| 				_p_VisibleCheckpoint[i] = -1;
 | |
| 			}
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			// Getting the player Interior and virtual world
 | |
| 			__interior = GetPlayerInterior(i);
 | |
| 			__virtualWorld = GetPlayerVirtualWorld(i);
 | |
| 			
 | |
| 			// Looking for a new checkpoint
 | |
| 			for(new j = 0; j < MAX_CHECKPOINTS; j++){
 | |
| 				if(!_checkpoints[j][_chp_populated]) continue;
 | |
| 				if((_checkpoints[j][_chp_owner] != i) && (_checkpoints[j][_chp_owner] != -1)) continue;
 | |
| 				if(_checkpoints[j][_chp_interior_id] != __interior) continue;
 | |
| 				if(_checkpoints[j][_chp_world_id] != __virtualWorld) continue;
 | |
| 				
 | |
| 				if(__posX > (_checkpoints[j][_chp_posX] - _checkpoints[j][_chp_viewDistance])
 | |
| 				&& __posX < (_checkpoints[j][_chp_posX] + _checkpoints[j][_chp_viewDistance])
 | |
| 				&& __posY > (_checkpoints[j][_chp_posY] - _checkpoints[j][_chp_viewDistance])
 | |
| 				&& __posY < (_checkpoints[j][_chp_posY] + _checkpoints[j][_chp_viewDistance])){
 | |
| 					SetPlayerCheckpoint(i, _checkpoints[j][_chp_posX], _checkpoints[j][_chp_posY], _checkpoints[j][_chp_posZ], _checkpoints[j][_chp_size]);
 | |
| 					_p_VisibleCheckpoint[i] = j;
 | |
| 					break;
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 	return 1;
 | |
| }
 | |
| 
 | |
| stock VerifyCheckpoint(__playerid){
 | |
| 	if(_p_VisibleCheckpoint[__playerid] >= 0){
 | |
| 		OnCheckpointEnter(__playerid, _checkpoints[_p_VisibleCheckpoint[__playerid]][_chp_id]);
 | |
| 		return 1;
 | |
| 	}
 | |
| 	return 0;
 | |
| } |