Автор Prolific
Я решил написать этот урок по одной теме, а именно полет камерой, этот ФС есть в стандартной сборке самп, но если вы хотите залить вс в мод, то этот урок для вас. Есть конечно и клео скрипт, но я считаю, что в моде лучше иметь такую камеру.
После инклудов вставляем
Code: Select all
#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 добавляем:
Code: Select all
enum noclipenum
{
cameramode,
flyobject,
mode,
lrold,
udold,
lastmove,
Float:accelmul
}
new noclipdata[MAX_PLAYERS][noclipenum];
Далее в public OnGameModeExit вставляем:
Code: Select all
for(new x; x<MAX_PLAYERS; x++)
{
if(noclipdata[x][cameramode] == CAMERA_MODE_FLY) CancelFlyMode(x);
}
Далее в public OnPlayerConnect вставляем:
Code: Select all
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 вставляем саму команду:
Code: Select all
if(!strcmp(cmdtext, "/flymode", true))// /flymode можете заменить на свою команду
{
if(Player[playerid][pAdmin] >= 6)// если не хотите что бы проверяло на админку уберите
{
if(GetPVarType(playerid, "FlyMode")) CancelFlyMode(playerid);
else FlyMode(playerid);
return 1;
}
}
Далее в public OnPlayerUpdate вставляем:
Code: Select all
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;
}
Далее в конец мода вставляете:
Code: Select all
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;
}