Alexandr_Karat
◄Репутация► : 42 Ник на сервере: : Alexandr_Karat Фракция/Банда: : Репортёры Дата регистрации : 2011-10-25 Возраст : 29 Сообщения : 33 Зодиак :
| Тема: Пример как должна выглядеть работа Вт 12 Ноя - 15:38 | |
| Я решил написать этот урок по одной теме, а именно полет камерой, этот ФС есть в стандартной сборке самп, но если вы хотите залить вс в мод, то этот урок для вас. Есть конечно и клео скрипт, но я считаю, что в моде лучше иметь такую камеру. После инклудов вставляем ко всем #define - Код:
-
#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 добавляем: - Код:
-
enum noclipenum { cameramode, flyobject, mode, lrold, udold, lastmove, Float:accelmul } new noclipdata[MAX_PLAYERS][noclipenum]; Далее в public OnGameModeExit вставляем: - Код:
-
for(new x; x<MAX_PLAYERS; x++) { if(noclipdata[x][cameramode] == CAMERA_MODE_FLY) CancelFlyMode(x); } Далее в public OnPlayerConnect вставляем: - Код:
-
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 вставляем саму команду: - Код:
-
if(!strcmp(cmdtext, "/flymode", true))// /flymode можете заменить на свою команду { if(Player[playerid][pAdmin] >= 6)// если не хотите что бы проверяло на админку уберите { if(GetPVarType(playerid, "FlyMode")) CancelFlyMode(playerid); else FlyMode(playerid); return 1; } } Далее в public OnPlayerUpdate вставляем: - Код:
-
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; } Далее в конец мода вставляете: - Код:
-
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; } |
|
Гость Гость
| Тема: Re: Пример как должна выглядеть работа Ср 13 Ноя - 9:29 | |
| |
|
Alexandr_Karat
◄Репутация► : 42 Ник на сервере: : Alexandr_Karat Фракция/Банда: : Репортёры Дата регистрации : 2011-10-25 Возраст : 29 Сообщения : 33 Зодиак :
| Тема: Re: Пример как должна выглядеть работа Ср 13 Ноя - 13:56 | |
| - Boris_Petrov пишет:
- клипап рассмотрел?
Какой? |
|