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;
 | 
						|
} |