Доступ к готовым решениям

Переход в группу "Пользователь"

300.00 ₽
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Мануал Летать камерой.

Статус
В этой теме нельзя размещать новые ответы.

Prolific

Специалист
Я решил написать этот урок по одной теме, а именно полет камерой, этот ФС есть в стандартной сборке самп, но если вы хотите залить вс в мод, то этот урок для вас. Есть конечно и клео скрипт, но я считаю, что в моде лучше иметь такую камеру.
После инклудов вставляем
PHP:
#define MOVE_SPEED              100.0
#define ACCEL_RATE              0.03
#define CAMERA_MODE_NONE    	0
#define CAMERA_MODE_FLY     	1
#define MOVE_FORWARD    		1
#define MOVE_BACK       		2
#define MOVE_LEFT       		3
#define MOVE_RIGHT      		4
#define MOVE_FORWARD_LEFT       5
#define MOVE_FORWARD_RIGHT      6
#define MOVE_BACK_LEFT          7
#define MOVE_BACK_RIGHT         8
Далее ко всем new добавляем:
PHP:
enum noclipenum
{
	cameramode,
	flyobject,
	mode,
	lrold,
	udold,
	lastmove,
	Float:accelmul
}
new noclipdata[MAX_PLAYERS][noclipenum];
Далее в public OnGameModeExit вставляем:
PHP:
for(new x; x<MAX_PLAYERS; x++)
	{
		if(noclipdata[x][cameramode] == CAMERA_MODE_FLY) CancelFlyMode(x);
	}
Далее в public OnPlayerConnect вставляем:
PHP:
noclipdata[playerid][cameramode] 	= CAMERA_MODE_NONE;
	noclipdata[playerid][lrold]	   	 	= 0;
	noclipdata[playerid][udold]   		= 0;
	noclipdata[playerid][mode]   		= 0;
	noclipdata[playerid][lastmove]   	= 0;
	noclipdata[playerid][accelmul]   	= 0.0;
Далее в public OnPlayerCommandText вставляем саму команду:
PHP:
if(!strcmp(cmdtext, "/flymode", true))// /flymode можете заменить на свою команду
	{
                  if(Player[playerid][pAdmin] >= 6)// если не хотите что бы проверяло на админку уберите
                  {
		if(GetPVarType(playerid, "FlyMode")) CancelFlyMode(playerid);
		else FlyMode(playerid);
		return 1;
                   }
	}
Далее в public OnPlayerUpdate вставляем:
PHP:
if(noclipdata[playerid][cameramode] == CAMERA_MODE_FLY)
	{
		new keyss,ud,lr;
		GetPlayerKeys(playerid,keyss,ud,lr);

		if(noclipdata[playerid][mode] && (GetTickCount() - noclipdata[playerid][lastmove] > 100))
		{
		    // If the last move was > 100ms ago, process moving the object the players camera is attached to
		    MoveCamera(playerid);
		}

		// Is the players current key state different than their last keystate?
		if(noclipdata[playerid][udold] != ud || noclipdata[playerid][lrold] != lr)
		{
			if((noclipdata[playerid][udold] != 0 || noclipdata[playerid][lrold] != 0) && ud == 0 && lr == 0)
			{   // All keys have been released, stop the object the camera is attached to and reset the acceleration multiplier
				StopPlayerObject(playerid, noclipdata[playerid][flyobject]);
				noclipdata[playerid][mode]      = 0;
				noclipdata[playerid][accelmul]  = 0.0;
			}
			else
			{   // Indicates a new key has been pressed

			    // Get the direction the player wants to move as indicated by the keys
				noclipdata[playerid][mode] = GetMoveDirectionFromKeys(ud, lr);

				// Process moving the object the players camera is attached to
				MoveCamera(playerid);
			}
		}
		noclipdata[playerid][udold] = ud; noclipdata[playerid][lrold] = lr; // Store current keys pressed for comparison next update
		return 0;
	}
Далее в конец мода вставляете:
PHP:
stock GetMoveDirectionFromKeys(ud, lr)
{
	new direction = 0;

    if(lr < 0)
	{
		if(ud < 0) 		direction = MOVE_FORWARD_LEFT; 	// Up & Left key pressed
		else if(ud > 0) direction = MOVE_BACK_LEFT; 	// Back & Left key pressed
		else            direction = MOVE_LEFT;          // Left key pressed
	}
	else if(lr > 0) 	// Right pressed
	{
		if(ud < 0)      direction = MOVE_FORWARD_RIGHT;  // Up & Right key pressed
		else if(ud > 0) direction = MOVE_BACK_RIGHT;     // Back & Right key pressed
		else			direction = MOVE_RIGHT;          // Right key pressed
	}
	else if(ud < 0) 	direction = MOVE_FORWARD; 	// Up key pressed
	else if(ud > 0) 	direction = MOVE_BACK;		// Down key pressed

	return direction;
}
stock MoveCamera(playerid)
{
 	new Float:FV[3], Float:CPP[3];
	GetPlayerCameraPos(playerid, CPP[0], CPP[1], CPP[2]);          // 	Cameras position in space
    GetPlayerCameraFrontVector(playerid, FV[0], FV[1], FV[2]);  //  Where the camera is looking at

	// Increases the acceleration multiplier the longer the key is held
	if(noclipdata[playerid][accelmul] <= 1) noclipdata[playerid][accelmul] += ACCEL_RATE;

	// Determine the speed to move the camera based on the acceleration multiplier
	new Float:speed = MOVE_SPEED * noclipdata[playerid][accelmul];

	// Calculate the cameras next position based on their current position and the direction their camera is facing
	new Float:X, Float:Y, Float:Z;
	GetNextCameraPosition(noclipdata[playerid][mode], CPP, FV, X, Y, Z);
	MovePlayerObject(playerid, noclipdata[playerid][flyobject], X, Y, Z, speed);

	// Store the last time the camera was moved as now
	noclipdata[playerid][lastmove] = GetTickCount();
	return 1;
}
stock GetNextCameraPosition(move_mode, Float:CPP[3], Float:FV[3], &Float:X, &Float:Y, &Float:Z)
{
    // Calculate the cameras next position based on their current position and the direction their camera is facing
    #define OFFSET_X (FV[0]*6000.0)
	#define OFFSET_Y (FV[1]*6000.0)
	#define OFFSET_Z (FV[2]*6000.0)
	switch(move_mode)
	{
		case MOVE_FORWARD:
		{
			X = CPP[0]+OFFSET_X;
			Y = CPP[1]+OFFSET_Y;
			Z = CPP[2]+OFFSET_Z;
		}
		case MOVE_BACK:
		{
			X = CPP[0]-OFFSET_X;
			Y = CPP[1]-OFFSET_Y;
			Z = CPP[2]-OFFSET_Z;
		}
		case MOVE_LEFT:
		{
			X = CPP[0]-OFFSET_Y;
			Y = CPP[1]+OFFSET_X;
			Z = CPP[2];
		}
		case MOVE_RIGHT:
		{
			X = CPP[0]+OFFSET_Y;
			Y = CPP[1]-OFFSET_X;
			Z = CPP[2];
		}
		case MOVE_BACK_LEFT:
		{
			X = CPP[0]+(-OFFSET_X - OFFSET_Y);
 			Y = CPP[1]+(-OFFSET_Y + OFFSET_X);
		 	Z = CPP[2]-OFFSET_Z;
		}
		case MOVE_BACK_RIGHT:
		{
			X = CPP[0]+(-OFFSET_X + OFFSET_Y);
 			Y = CPP[1]+(-OFFSET_Y - OFFSET_X);
		 	Z = CPP[2]-OFFSET_Z;
		}
		case MOVE_FORWARD_LEFT:
		{
			X = CPP[0]+(OFFSET_X  - OFFSET_Y);
			Y = CPP[1]+(OFFSET_Y  + OFFSET_X);
			Z = CPP[2]+OFFSET_Z;
		}
		case MOVE_FORWARD_RIGHT:
		{
			X = CPP[0]+(OFFSET_X  + OFFSET_Y);
			Y = CPP[1]+(OFFSET_Y  - OFFSET_X);
			Z = CPP[2]+OFFSET_Z;
		}
	}
}
stock CancelFlyMode(playerid)
{
	DeletePVar(playerid, "FlyMode");
	CancelEdit(playerid);
	TogglePlayerSpectating(playerid, false);

	DestroyPlayerObject(playerid, noclipdata[playerid][flyobject]);
	noclipdata[playerid][cameramode] = CAMERA_MODE_NONE;
	return 1;
}
stock FlyMode(playerid)
{
	// Create an invisible object for the players camera to be attached to
	new Float:X, Float:Y, Float:Z;
	GetPlayerPos(playerid, X, Y, Z);
	noclipdata[playerid][flyobject] = CreatePlayerObject(playerid, 19300, X, Y, Z, 0.0, 0.0, 0.0);

	// Place the player in spectating mode so objects will be streamed based on camera location
	TogglePlayerSpectating(playerid, true);
	// Attach the players camera to the created object
	AttachCameraToPlayerObject(playerid, noclipdata[playerid][flyobject]);

	SetPVarInt(playerid, "FlyMode", 1);
	noclipdata[playerid][cameramode] = CAMERA_MODE_FLY;
	return 1;
}
Вот и все.
 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу