//==============================================================================
#include <a_samp>
#include <a_objects>
//==============================================================================
#define MOVE_SPEED              100.0
#define ACCEL_RATE              0.03
//==============================================================================
#define CAMERA_MODE_NONE    	0
#define CAMERA_MODE_FLY     	1
//==============================================================================
#define MAX_STRING 255
//==============================================================================
#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
//==============================================================================
#define DIALOG_MENU 11411
#define DIALOG_MOVE_SPEED 14411
#define DIALOG_ROT_SPEED 1112
#define DIALOG_EXPORTNAME 11233
#define DIALOG_CLOSE_NEW 4424
//==============================================================================
forward ShowPlayerMenu(playerid);
forward PreviewMovement(playerid);
forward ExportMovement(playerid, inputtext[]);
//==============================================================================
const Float:fScale = 5.0;
new MenuTimer;
new string[MAX_STRING];
new Float:fPX, Float:fPY, Float:fPZ, Float:fVX, Float:fVY, Float:fVZ,
Float:object_x, Float:object_y, Float:object_z;
//==============================================================================
new bool:IsCreating[MAX_PLAYERS] 		= false;
new bool:IsReSettingStart[MAX_PLAYERS] 	= false;
new bool:IsReSettingEnd[MAX_PLAYERS] 	= false;
new bool:SettingFirstLoc[MAX_PLAYERS] 	= false;
new bool:SettingLastLoc[MAX_PLAYERS] 	= false;
new bool:IsCamMoving[MAX_PLAYERS] 		= false;
//==============================================================================
enum noclipenum
{
	cameramode,
	flyobject,
	mode,
	lrold,
	udold,
	lastmove,
	Float:accelmul
}
new noclipdata[MAX_PLAYERS][noclipenum];
//==============================================================================
enum pInfo
{
	pDush
};
new PlayerInfo[MAX_PLAYERS][pInfo];
enum Coordinates
{
	Float:StartX,
	Float:StartY,
	Float:StartZ,
	Float:EndX,
	Float:EndY,
	Float:EndZ,
	Float:StartLookX,
	Float:StartLookY,
	Float:StartLookZ,
	Float:EndLookX,
	Float:EndLookY,
	Float:EndLookZ,
	MoveSpeed,
	RotSpeed
}
new coordInfo[MAX_PLAYERS][Coordinates];
//==============================================================================
public OnFilterScriptInit() return true;

public OnFilterScriptExit()
{
    for(new x; x<MAX_PLAYERS; x++)
	{
		if(noclipdata[x][cameramode] == CAMERA_MODE_FLY) CancelFlyMode(x);
	}
	return true;
}

public OnPlayerConnect(playerid)
{
    noclipdata[playerid][cameramode] 	= CAMERA_MODE_NONE;
	noclipdata[playerid][lrold]	   	 	= false;
	noclipdata[playerid][udold]   		= false;
	noclipdata[playerid][mode]   		= false;
	noclipdata[playerid][lastmove]   	= false;
	noclipdata[playerid][accelmul]   	= 0.0;
	IsCreating[playerid] 				= false;
	IsReSettingStart[playerid] 			= false;
	IsReSettingEnd[playerid] 			= false;
	SettingFirstLoc[playerid] 			= false;
	SettingLastLoc[playerid] 			= false;
	IsCamMoving[playerid] 				= false;
	coordInfo[playerid][MoveSpeed] 		= 1000;
	coordInfo[playerid][RotSpeed] 		= 1000;
	return true;
}

public OnPlayerSpawn(playerid)
{
	if(IsCreating[playerid] == false) SendClientMessage(playerid, -1, "Используй команду /cam, чтобы открыть редактор движения камеры");
}

public OnPlayerCommandText(playerid, cmdtext[])
{
    if(!strcmp(cmdtext, "/dush", true)){
	new playername[MAX_PLAYER_NAME];
	GetPlayerName(playerid, playername, sizeof(playername));
	if(PlayerToPoint(30,playerid,2324.4729,-1145.0638,1050.7101) || PlayerToPoint(30,playerid,745.4300,1437.6600,1102.7031) || PlayerToPoint(30,playerid,2467.7944,-1698.2947,1013.5078)
	|| PlayerToPoint(30,playerid,2496.0601,-1693.8800,1014.7422) || PlayerToPoint(30,playerid,1523.4200,-46.7900,1002.1310) || PlayerToPoint(30,playerid,446.5611,509.6059,1001.4195)
	|| PlayerToPoint(30,playerid,-261.9759,1456.8844,1084.3672) || PlayerToPoint(30,playerid,234.1571,1064.9569,1084.2104) || PlayerToPoint(30,playerid,140.9131,1367.9713,1083.8621)
	|| PlayerToPoint(30,playerid,22.7783,1404.9600,1084.4297) || PlayerToPoint(30,playerid,25.5456,1341.0530,1084.3750) || PlayerToPoint(30,playerid,261.0654,1284.2991,1080.2578)
	|| PlayerToPoint(30,playerid,491.0190,1399.0691,1080.2578) || PlayerToPoint(30,playerid,225.9761,1239.9126,1082.1406) || PlayerToPoint(30,playerid,489.9747,1401.2568,1080.2645)
	|| PlayerToPoint(30,playerid,2261.3103,-1136.4467,1050.6328)){
	format(string,100,"{FFFFFF}- Принять душ");
	ShowPlayerDialog(playerid, 1446, DIALOG_STYLE_LIST, "{ffcc00}Выберите действие", string, "Выбрать", "Закрыть");
	return true;}}
	if(!strcmp(cmdtext, "/exit", true))
	{
			SetCameraBehindPlayer(playerid);
			TogglePlayerControllable(playerid, 1);
			SendClientMessage(playerid, 0x33AA33FF, "Вы приняли душ.Вы выглядите лучше");
			return true;
	}
	if(!strcmp(cmdtext, "/cam", true))
	{
	    if(IsCamMoving[playerid] == false)
	    {
			if(GetPVarType(playerid, "FlyMode"))
			{
				CancelFlyMode(playerid);
				IsCreating[playerid] = false;
			}
			else FlyMode(playerid);
		}
		return true;
	}
	if(!strcmp(cmdtext, "/close", true))
	{
	    if(IsCreating[playerid])
	    {
	        CancelFlyMode(playerid);
         	IsCreating[playerid] = false;
         	noclipdata[playerid][cameramode] 	= CAMERA_MODE_NONE;
			noclipdata[playerid][lrold]	   	 	= false;
			noclipdata[playerid][udold]   		= false;
			noclipdata[playerid][mode]   		= false;
			noclipdata[playerid][lastmove]   	= false;
			noclipdata[playerid][accelmul]   	= 0.0;
			IsCreating[playerid] 				= false;
			IsReSettingStart[playerid] 			= false;
			IsReSettingEnd[playerid] 			= false;
			SettingFirstLoc[playerid] 			= false;
			SettingLastLoc[playerid] 			= false;
			IsCamMoving[playerid] 				= false;
			coordInfo[playerid][MoveSpeed] 		= 1000;
			coordInfo[playerid][RotSpeed] 		= 1000;
			SendClientMessage(playerid, -1, "Вы вышли из редактора движения камеры");
	    }
	    else SendClientMessage(playerid, -1, "В настоящее время вы не используете редактор движения камеры");
	    return true;
	}
	return false;
}

public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
    if ((newkeys & KEY_FIRE) && !(oldkeys & KEY_FIRE))
    {
        if(IsCreating[playerid] == true)
        {
            if(SettingFirstLoc[playerid] == true)
			{
		        const Float:fScale = 5.0;
				GetPlayerCameraPos(playerid, fPX, fPY, fPZ);
				GetPlayerCameraFrontVector(playerid, fVX, fVY, fVZ);
				object_x = fPX + floatmul(fVX, fScale);
				object_y = fPY + floatmul(fVY, fScale);
				object_z = fPZ + floatmul(fVZ, fScale);
				coordInfo[playerid][StartX] 		= fPX;
				coordInfo[playerid][StartY] 		= fPY;
				coordInfo[playerid][StartZ] 		= fPZ;
				coordInfo[playerid][StartLookX] 	= object_x;
				coordInfo[playerid][StartLookY] 	= object_y;
				coordInfo[playerid][StartLookZ] 	= object_z;
		        if(IsReSettingStart[playerid] == true)
		        {
					SendClientMessage(playerid, -1, "Начальная позиция сброшена");
					ShowPlayerDialog(playerid, DIALOG_MENU, DIALOG_STYLE_LIST,"Редактор","Просмотр\nИзменить начальную позицию\nИзменить конечную позицию\nИзменить скорость\nСохранить","Готово","Закрыть");
					IsReSettingStart[playerid] 		= false;
					IsReSettingEnd[playerid] 		= false;
					SettingFirstLoc[playerid] 		= false;
					SettingLastLoc[playerid] 		= false;
				}
				else
				{
				    SendClientMessage(playerid, -1, "Начальная позиция установлена");
				    SendClientMessage(playerid, -1, "С помощью кнопки {F58282}\"огонь\" {FFFFFF}сохраните положение камеры в конечном положении");
				    SettingLastLoc[playerid] = true;
				    SettingFirstLoc[playerid] = false;
				}
			}
			else if(SettingLastLoc[playerid] == true)
			{
			    const Float:fScale = 5.0;
			    format(string, sizeof(string), "Пожалуйста, введите время {F58282}движения {a9c4e4}в миллисекундах\n\nТекущая скорость движения: \t{F58282}%i миллисекунд\n{a9c4e4}Текущая скорость вращения: \t{F58282}%i миллисекунд\n\n\n{F58282}Примечание: {a9c4e4}1 секунда = 1000 миллисекунд", coordInfo[playerid][MoveSpeed], coordInfo[playerid][RotSpeed]);
			    ShowPlayerDialog(playerid, DIALOG_MOVE_SPEED, DIALOG_STYLE_INPUT, "Скорость передвижения", string,"Готово","Отмена");
				GetPlayerCameraPos(playerid, fPX, fPY, fPZ);
				GetPlayerCameraFrontVector(playerid, fVX, fVY, fVZ);
				object_x = fPX + floatmul(fVX, fScale);
				object_y = fPY + floatmul(fVY, fScale);
				object_z = fPZ + floatmul(fVZ, fScale);
				coordInfo[playerid][EndX] 			= fPX;
				coordInfo[playerid][EndY] 			= fPY;
				coordInfo[playerid][EndZ] 			= fPZ;
				coordInfo[playerid][EndLookX] 		= object_x;
				coordInfo[playerid][EndLookY] 		= object_y;
				coordInfo[playerid][EndLookZ] 		= object_z;
				if(IsReSettingEnd[playerid] == true)
				{
				    SendClientMessage(playerid, -1, "Конечная позиция сброшена");
				    ShowPlayerDialog(playerid, DIALOG_MENU, DIALOG_STYLE_LIST,"Редактор","Просмотр\nИзменить начальную позицию\nИзменить конечную позицию\nИзменить скорость\nСохранить","Готово","Закрыть");
		            IsReSettingStart[playerid] 		= false;
					IsReSettingEnd[playerid] 		= false;
					SettingFirstLoc[playerid] 		= false;
					SettingLastLoc[playerid] 		= false;
				}
				else
				{
				    SendClientMessage(playerid, -1, "Конечная позиция установлена");
				    SettingLastLoc[playerid] = false;
				}
			}
		}
    }
	return true;
}

public OnPlayerUpdate(playerid)
{
	if(noclipdata[playerid][cameramode] == CAMERA_MODE_FLY)
	{
		new keys,ud,lr;
		GetPlayerKeys(playerid,keys,ud,lr);
		if(noclipdata[playerid][mode] && (GetTickCount() - noclipdata[playerid][lastmove] > 100)) MoveCamera(playerid);
		if(noclipdata[playerid][udold] != ud || noclipdata[playerid][lrold] != lr)
		{
			if((noclipdata[playerid][udold] != 0 || noclipdata[playerid][lrold] != 0) && ud == 0 && lr == 0)
			{
				StopPlayerObject(playerid, noclipdata[playerid][flyobject]);
				noclipdata[playerid][mode]      = 0;
				noclipdata[playerid][accelmul]  = 0.0;
			}
			else
			{
				noclipdata[playerid][mode] = GetMoveDirectionFromKeys(ud, lr);
				MoveCamera(playerid);
			}
		}
		noclipdata[playerid][udold] = ud; noclipdata[playerid][lrold] = lr;
		return false;
	}
	return true;
}

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
	switch(dialogid)
	{
	    case 1446:{
		if(response){
		switch(listitem){
		case 0:{
		PlayerInfo[playerid][pDush] += 100;
		SetPlayerHealth(playerid, 100.0);
		SetPlayerFacingAngle(playerid, 0.0000);SetPlayerInterior(playerid,14);TogglePlayerControllable(playerid, 0);
		SetPlayerPos(playerid,  742.9797, -33.0379, 1000.5661);
		SetPlayerCameraPos(playerid,  738.3986, -31.2869, 1000.8687);
		SetPlayerCameraLookAt(playerid, 742.9797, -33.0379, 1000.5661);
		SendClientMessage(playerid, 0xFFFFFFFF, "{408080}Вы начинали принимать душ {FFFFFF}(чтобы завершить используйте /exit)");}}}}
	    case DIALOG_MENU:
	    {
	        if(response)
	        {
		        switch(listitem)
		        {
					case 0: PreviewMovement(playerid);
					case 1:
					{
					    DestroyPlayerObject(playerid, noclipdata[playerid][flyobject]);
						IsReSettingEnd[playerid] 	= false;
						SettingLastLoc[playerid] 	= false;
					    IsReSettingStart[playerid]  = true;
					    SettingFirstLoc[playerid]   = true;
					    noclipdata[playerid][flyobject] = CreatePlayerObject(playerid, 19300, coordInfo[playerid][StartX], coordInfo[playerid][StartY], coordInfo[playerid][StartZ], 0.0, 0.0, 0.0);
                        TogglePlayerSpectating(playerid, true);
						AttachCameraToPlayerObject(playerid, noclipdata[playerid][flyobject]);
						SetPVarInt(playerid, "FlyMode", 1);
						noclipdata[playerid][cameramode] = CAMERA_MODE_FLY;
						SendClientMessage(playerid, -1, "Используй кнопку {F58282}\"огонь\"{FFFFFF}, чтобы установить новую {F58282}стартовую {FFFFFF}позицию");
					}
					case 2:
					{
					    DestroyPlayerObject(playerid, noclipdata[playerid][flyobject]);
						IsReSettingStart[playerid] 	= false;
						SettingFirstLoc[playerid] 	= false;
					    IsReSettingEnd[playerid]    = true;
					    SettingLastLoc[playerid]    = true;
					    IsCreating[playerid] 	    = true;
					    SetCameraBehindPlayer(playerid);
					    noclipdata[playerid][flyobject] = CreatePlayerObject(playerid, 19300, coordInfo[playerid][EndX], coordInfo[playerid][EndY], coordInfo[playerid][EndZ], 0.0, 0.0, 0.0);
                        TogglePlayerSpectating(playerid, true);
						AttachCameraToPlayerObject(playerid, noclipdata[playerid][flyobject]);
						SetPVarInt(playerid, "FlyMode", 1);
						noclipdata[playerid][cameramode] = CAMERA_MODE_FLY;
						SendClientMessage(playerid, -1, "Используй кнопку {F58282}\"огонь\"{FFFFFF}, чтобы установить новую {F58282}конечную {FFFFFF}позицию");
					}
					case 3:
					{
					    format(string, sizeof(string), "Пожалуйста, введите время {F58282}движения {a9c4e4}в миллисекундах\n\nТекущая скорость движения: \t{F58282}%i миллисекунд\n{a9c4e4}Текущая скорость вращения: \t{F58282}%i миллисекунд\n\n\n{F58282}Примечание: {a9c4e4}1 секунда = 1000 миллисекунд", coordInfo[playerid][MoveSpeed], coordInfo[playerid][RotSpeed]);
					    ShowPlayerDialog(playerid, DIALOG_MOVE_SPEED, DIALOG_STYLE_INPUT, "Скорость передвижения", string,"Готово","Отмена");
					}
					case 4: ShowPlayerDialog(playerid, DIALOG_EXPORTNAME, DIALOG_STYLE_INPUT, "Сохранение","Введите имя для данной камеры","Готово","Отмена");
		        }
			}
			else
			{
				CancelFlyMode(playerid);
    			SendClientMessage(playerid, -1, "Вы вышли из редактора движения камеры");
   				IsCreating[playerid] = false;
			}
	    }
		case DIALOG_MOVE_SPEED:
		{
			if(response)
			{
				if(strlen(inputtext))
				{
					if(IsNumeric(inputtext))
					{
						coordInfo[playerid][MoveSpeed] = strval(inputtext);
		    			format(string, sizeof(string), "Пожалуйста, введите нужное время {F58282}вращения{a9c4e4} в миллисекундах\n\nТекущая скорость движения: \t{F58282}%i миллисекунд\n{a9c4e4}Текущая скорость вращения: \t{F58282}%i миллисекунд\n\n\n{F58282}Примечание: {a9c4e4}1 секунда = 1000 миллисекунд", coordInfo[playerid][MoveSpeed], coordInfo[playerid][RotSpeed]);
	                    ShowPlayerDialog(playerid, DIALOG_ROT_SPEED, DIALOG_STYLE_INPUT, "Скорость вращения", string,"Готово","Отмена");
	                    IsReSettingStart[playerid] = false;
						IsReSettingEnd[playerid]   = false;
					}
		            else
		            {
	    				format(string, sizeof(string), "Пожалуйста, введите нужное время {F58282}движения{a9c4e4} в миллисекундах\n\nТекущая скорость движения: \t{F58282}%i миллисекунд\n{a9c4e4}Текущая скорость вращения: \t{F58282}%i миллисекунд\n{FF0000}ВВОДИТЬ ТОЛЬКО ЦИФРЫ!\n\n{F58282}Примечание: {a9c4e4}1 секунда = 1000 миллисекунд", coordInfo[playerid][MoveSpeed], coordInfo[playerid][RotSpeed]);
		                ShowPlayerDialog(playerid, DIALOG_MOVE_SPEED, DIALOG_STYLE_INPUT, "Скорость передвижения", string,"Готово","Отмена");
		            }
				}
				else
				{
    				format(string, sizeof(string), "Пожалуйста, введите нужное время {F58282}движения{a9c4e4} в миллисекундах\n\nТекущая скорость движения: \t{F58282}%i миллисекунд\n{a9c4e4}Текущая скорость вращения: \t{F58282}%i миллисекунд\n{FF0000}Вы должны ввести значение\n\n{F58282}Примечание: {a9c4e4}1 секунда = 1000 миллисекунд", coordInfo[playerid][MoveSpeed], coordInfo[playerid][RotSpeed]);
        			ShowPlayerDialog(playerid, DIALOG_MOVE_SPEED, DIALOG_STYLE_INPUT, "Скорость передвижения", string,"Готово","Отмена");
				}
	        }
	        else
	        {
                ShowPlayerDialog(playerid, DIALOG_MENU, DIALOG_STYLE_LIST,"Редактор","Просмотр\nИзменить начальную позицию\nИзменить конечную позицию\nИзменить скорость\nСохранить","Готово","Закрыть");
	        }
	    }
	    case DIALOG_ROT_SPEED:
	    {
	        if(response)
	        {
	            if(strlen(inputtext))
	            {
		            if(IsNumeric(inputtext))
		            {
		                coordInfo[playerid][RotSpeed] = strval(inputtext);
		                ShowPlayerDialog(playerid, DIALOG_MENU, DIALOG_STYLE_LIST,"Редактор","Просмотр\nИзменить начальную позицию\nИзменить конечную позицию\nИзменить скорость\nСохранить","Готово","Закрыть");
	                    IsReSettingStart[playerid] = false;
						IsReSettingEnd[playerid]   = false;
					}
		            else
		            {
	    				format(string, sizeof(string), "Пожалуйста, введите нужное время {F58282}движения{a9c4e4} в миллисекундах\n\nТекущая скорость движения: \t{F58282}%i миллисекунд\n{a9c4e4}Текущая скорость вращения: \t{F58282}%i миллисекунд\n{FF0000}ВВОДИТЬ ТОЛЬКО ЦИФРЫ!\n\n{F58282}Примечание: {a9c4e4}1 секунда = 1000 миллисекунд", coordInfo[playerid][MoveSpeed], coordInfo[playerid][RotSpeed]);
		                ShowPlayerDialog(playerid, DIALOG_ROT_SPEED, DIALOG_STYLE_INPUT, "Скорость вращения", string,"Готово","Отмена");
		            }
				}
				else
				{
    				format(string, sizeof(string), "Пожалуйста, введите нужное время {F58282}вращения{a9c4e4} в миллисекундах\n\nТекущая скорость движения: \t{F58282}%i миллисекунд\n{a9c4e4}Текущая скорость вращения: \t{F58282}%i миллисекунд\n{FF0000}Вы должны ввести значение\n\n{F58282}Примечание: {a9c4e4}1 секунда = 1000 миллисекунд", coordInfo[playerid][MoveSpeed], coordInfo[playerid][RotSpeed]);
        			ShowPlayerDialog(playerid, DIALOG_ROT_SPEED, DIALOG_STYLE_INPUT, "Скорость вращения", string,"Готово","Отмена");
				}
	        }
	        else
	        {
    			format(string, sizeof(string), "Пожалуйста, введите время {F58282}движения {a9c4e4}в миллисекундах\n\nТекущая скорость движения: \t{F58282}%i миллисекунд\n{a9c4e4}Текущая скорость вращения: \t{F58282}%i миллисекунд\n\n\n{F58282}Примечание: {a9c4e4}1 секунда = 1000 миллисекунд", coordInfo[playerid][MoveSpeed], coordInfo[playerid][RotSpeed]);
                ShowPlayerDialog(playerid, DIALOG_MOVE_SPEED, DIALOG_STYLE_INPUT, "Скорость движения",string,"Готово","Отмена");
	        }
	    }
	    case DIALOG_EXPORTNAME:
	    {
	        if(response)
	        {
                if(strlen(inputtext)) ExportMovement(playerid, inputtext);
				else ShowPlayerDialog(playerid, DIALOG_EXPORTNAME, DIALOG_STYLE_INPUT, "Сохранение","Введите имя для данной камеры","Готово","Отмена");
			}
	        else ShowPlayerDialog(playerid, DIALOG_MENU, DIALOG_STYLE_LIST,"Редактор","Просмотр\nИзменить начальную позицию\nИзменить конечную позицию\nИзменить скорость\nСохранить","Готово","Закрыть");
	    }
	    case DIALOG_CLOSE_NEW:
	    {
	        if(response)
	        {
	            IsCreating[playerid]      = true;
				SettingFirstLoc[playerid] = true;
				FlyMode(playerid);
	        }
	        else
	        {
	            SendClientMessage(playerid, -1, "Вы вышли из редактора движения камеры");
				CancelFlyMode(playerid);
	            IsCreating[playerid] = false;
	        }
	    }
	}
	return true;
}
public OnGameModeInit()
{
    CreateObject(19377, 738.72400, -29.72410, 1003.07373,   0.00000, -90.00000, 0.00000);
	CreateObject(19459, 743.51904, -29.81976, 1001.33734,   0.00000, 0.00000, 0.09900);
	CreateObject(19459, 743.42047, -29.84123, 998.06775,   0.00000, 0.00000, 0.00000);
	CreateObject(19459, 741.71118, -33.81347, 1001.33734,   0.00000, 0.00000, 269.75519);
	CreateObject(19459, 741.52625, -33.73080, 998.06775,   0.00000, 0.00000, 269.93460);
	CreateObject(2522, 742.84399, -31.90420, 999.58130,   0.00000, 0.00000, 269.54282);
	CreateObject(2524, 742.94574, -30.32589, 999.61200,   0.00000, 0.00000, 270.11752);
	CreateObject(2528, 741.02509, -33.15638, 999.82007,   0.00000, 0.00000, 179.29230);
	CreateObject(22, 742.97968, -33.03790, 1000.56610,   90.00000, 0.00000, 0.00000);
	CreateObject(19378, 738.72400, -29.72410, 999.57788,   0.00000, -90.00000, 0.00000);
	CreateObject(3515, 742.81274, -33.06403, 994.94165,   0.00000, 0.00000, 0.00000);
	return true;
}
public ShowPlayerMenu(playerid)
{
	KillTimer(MenuTimer);
	IsCamMoving[playerid] = false;
	ShowPlayerDialog(playerid, DIALOG_MENU, DIALOG_STYLE_LIST,"Редактор","Просмотр\nИзменить начальную позицию\nИзменить конечную позицию\nИзменить скорость\nСохранить","Готово","Закрыть");
	return true;
}

public PreviewMovement(playerid)
{
    IsCamMoving[playerid] = true;
    DestroyObject(noclipdata[playerid][flyobject]);
    SetCameraBehindPlayer(playerid);
    if(coordInfo[playerid][MoveSpeed] > coordInfo[playerid][RotSpeed]) MenuTimer = SetTimer("ShowPlayerMenu", coordInfo[playerid][MoveSpeed], 0);
	else MenuTimer = SetTimer("ShowPlayerMenu", coordInfo[playerid][RotSpeed], 0);
	InterpolateCameraPos(playerid, coordInfo[playerid][StartX], coordInfo[playerid][StartY], coordInfo[playerid][StartZ], coordInfo[playerid][EndX], coordInfo[playerid][EndY], coordInfo[playerid][EndZ],coordInfo[playerid][MoveSpeed]);
	InterpolateCameraLookAt(playerid, coordInfo[playerid][StartLookX],coordInfo[playerid][StartLookY],coordInfo[playerid][StartLookZ],coordInfo[playerid][EndLookX],coordInfo[playerid][EndLookY],coordInfo[playerid][EndLookZ],coordInfo[playerid][RotSpeed]);
	return true;
}

public ExportMovement(playerid, inputtext[])
{
    new tagstring[64],movestring[MAX_STRING],rotstring[MAX_STRING],filename[50];
	format(filename, 128, "%s.txt", inputtext);
	format(tagstring, sizeof(tagstring), "|----------%s----------|\r\n", inputtext);
	format(movestring, sizeof(movestring),"InterpolateCameraPos(playerid, %f, %f, %f, %f, %f, %f, %i);\r\n",coordInfo[playerid][StartX], coordInfo[playerid][StartY], coordInfo[playerid][StartZ], coordInfo[playerid][EndX], coordInfo[playerid][EndY], coordInfo[playerid][EndZ],coordInfo[playerid][MoveSpeed]);
	format(rotstring,sizeof(rotstring),"InterpolateCameraLookAt(playerid, %f, %f, %f, %f, %f, %f, %i);",coordInfo[playerid][StartLookX],coordInfo[playerid][StartLookY],coordInfo[playerid][StartLookZ],coordInfo[playerid][EndLookX],coordInfo[playerid][EndLookY],coordInfo[playerid][EndLookZ],coordInfo[playerid][RotSpeed]);
	new File:File = fopen(filename, io_write);
	fwrite(File, tagstring);
	fwrite(File, movestring);
	fwrite(File, rotstring);
	fclose(File);
	new myOutpString[256];
	format(myOutpString, sizeof(myOutpString), "Движение камеры с названием {F58282}%s {a9c4e4}будет сохранено в папку scriptfiles\n\nЧто вы хотите дальше?", filename);
	ShowPlayerDialog(playerid, DIALOG_CLOSE_NEW, DIALOG_STYLE_MSGBOX,"Что дальше?",myOutpString,"Создать","Выход");
}

stock GetMoveDirectionFromKeys(ud, lr)
{
	new direction = 0;

    if(lr < 0)
	{
		if(ud < 0) 		direction = MOVE_FORWARD_LEFT;
		else if(ud > 0) direction = MOVE_BACK_LEFT;
		else            direction = MOVE_LEFT;
	}
	else if(lr > 0)
	{
		if(ud < 0)      direction = MOVE_FORWARD_RIGHT;
		else if(ud > 0) direction = MOVE_BACK_RIGHT;
		else			direction = MOVE_RIGHT;
	}
	else if(ud < 0) 	direction = MOVE_FORWARD;
	else if(ud > 0) 	direction = MOVE_BACK;

	return direction;
}

stock MoveCamera(playerid)
{
	new Float:FV[3], Float:CP[3];
	GetPlayerCameraPos(playerid, CP[0], CP[1], CP[2]);
    GetPlayerCameraFrontVector(playerid, FV[0], FV[1], FV[2]);
	if(noclipdata[playerid][accelmul] <= 1) noclipdata[playerid][accelmul] += ACCEL_RATE;
	new Float:speed = MOVE_SPEED * noclipdata[playerid][accelmul];
	new Float:X, Float:Y, Float:Z;
	GetNextCameraPosition(noclipdata[playerid][mode], CP, FV, X, Y, Z);
	MovePlayerObject(playerid, noclipdata[playerid][flyobject], X, Y, Z, speed);
	noclipdata[playerid][lastmove] = GetTickCount();
	return true;
}

stock GetNextCameraPosition(move_mode, Float:CP[3], Float:FV[3], &Float:X, &Float:Y, &Float:Z)
{
    #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 = CP[0]+OFFSET_X;
			Y = CP[1]+OFFSET_Y;
			Z = CP[2]+OFFSET_Z;
		}
		case MOVE_BACK:
		{
			X = CP[0]-OFFSET_X;
			Y = CP[1]-OFFSET_Y;
			Z = CP[2]-OFFSET_Z;
		}
		case MOVE_LEFT:
		{
			X = CP[0]-OFFSET_Y;
			Y = CP[1]+OFFSET_X;
			Z = CP[2];
		}
		case MOVE_RIGHT:
		{
			X = CP[0]+OFFSET_Y;
			Y = CP[1]-OFFSET_X;
			Z = CP[2];
		}
		case MOVE_BACK_LEFT:
		{
			X = CP[0]+(-OFFSET_X - OFFSET_Y);
 			Y = CP[1]+(-OFFSET_Y + OFFSET_X);
		 	Z = CP[2]-OFFSET_Z;
		}
		case MOVE_BACK_RIGHT:
		{
			X = CP[0]+(-OFFSET_X + OFFSET_Y);
 			Y = CP[1]+(-OFFSET_Y - OFFSET_X);
		 	Z = CP[2]-OFFSET_Z;
		}
		case MOVE_FORWARD_LEFT:
		{
			X = CP[0]+(OFFSET_X  - OFFSET_Y);
			Y = CP[1]+(OFFSET_Y  + OFFSET_X);
			Z = CP[2]+OFFSET_Z;
		}
		case MOVE_FORWARD_RIGHT:
		{
			X = CP[0]+(OFFSET_X  + OFFSET_Y);
			Y = CP[1]+(OFFSET_Y  - OFFSET_X);
			Z = CP[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;
	IsReSettingStart[playerid] 	= false;
	IsReSettingEnd[playerid] 	= false;
	SettingFirstLoc[playerid] 	= false;
	SettingLastLoc[playerid] 	= false;
	return true;
}

stock FlyMode(playerid)
{
	new Float:X, Float:Y, Float:Z;
	IsCreating[playerid] = true;
	SettingFirstLoc[playerid] = true;
	GetPlayerPos(playerid, X, Y, Z);
	noclipdata[playerid][flyobject] = CreatePlayerObject(playerid, 19300, X, Y, Z, 0.0, 0.0, 0.0);
	TogglePlayerSpectating(playerid, true);
	AttachCameraToPlayerObject(playerid, noclipdata[playerid][flyobject]);
	SetPVarInt(playerid, "FlyMode", 1);
	noclipdata[playerid][cameramode] = CAMERA_MODE_FLY;
	SendClientMessage(playerid, -1, "Вы вошли в редактор движения камеры");
	SendClientMessage(playerid, -1, "Используйте команду /close чтобы закрыть его");
	SendClientMessage(playerid, -1, "С кнопками {F58282}\"вверх, вниз, влево и вправо\"{FFFFFF} вы можете перемещать камеру");
	SendClientMessage(playerid, -1, "Используй кнопку {F58282}\"огонь\"{FFFFFF}, чтобы сохранить положение камеры в кач-ве {F58282}стартовой {FFFFFF}позиции");
	return true;
}
forward Gigen(playerid,id);
public Gigen(playerid,id){
PlayerInfo[playerid][pDush] -=1;
if(PlayerInfo[playerid][pDush] <= 20){
SetPlayerSkin(playerid, 78);
SendClientMessage(playerid,0xFFFFFFFF,"Вы давно не принимали душ");
TogglePlayerControllable(playerid, 1);}
return 1;}
PlayerToPoint(Float:radi, playerid, Float:x, Float:y, Float:z)
{
	if(IsPlayerConnected(playerid))
	{
		new Float:oldposx, Float:oldposy, Float:oldposz;
		new Float:tempposx, Float:tempposy, Float:tempposz;
		GetPlayerPos(playerid, oldposx, oldposy, oldposz);
		tempposx = (oldposx -x);
		tempposy = (oldposy -y);
		tempposz = (oldposz -z);
		if (((tempposx < radi) && (tempposx > -radi)) && ((tempposy < radi) && (tempposy > -radi)) && ((tempposz < radi) && (tempposz > -radi)))
		{
			return true;
		}
	}
	return false;
}
IsNumeric(szInput[])
{
	new iChar, i = 0;
	while ((iChar = szInput[i++])) if (!('0' <= iChar <= '9')) return false;
	return true;
}
//==============================================================================
