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

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

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

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

Мануал Система лифта

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

LucasKing

Новичок
Привет всем пользователям, представляю вам вырезанную систему лифта, прошу заранее прощения, если как то не так оформил или чего то не дописал, но все должно быть отлично :) ​
Начнем:​

Ко всем forward;

PHP:
forward CallElevator(playerid, floorid);
forward ShowElevatorDialog(playerid);
forward Elevator_Initialize();
forward Elevator_Destroy();
forward Elevator_OpenDoors();
forward Elevator_CloseDoors();
forward Floor_OpenDoors(floorid);
forward Floor_CloseDoors(floorid);
forward Elevator_MoveToFloor(floorid);
forward Elevator_Boost(floorid);
forward Elevator_TurnToIdle();
forward ReadNextFloorInQueue();
forward RemoveFirstQueueFloor();
forward AddFloorToQueue(floorid);
forward IsFloorInQueue(floorid);
forward ResetElevatorQueue();
forward DidPlayerRequestElevator(playerid);
forward Float:GetElevatorZCoordForFloor(floorid);
forward Float:GetDoorsZCoordForFloor(floorid);
Ко всем #define

PHP:
#define ELEVATOR_SPEED         (5.0)     
#define DOORS_SPEED            (5.0)         
#define ELEVATOR_WAIT_TIME     (5000)       
#define X_DOOR_CLOSED          (1786.627685)
#define X_DOOR_R_OPENED        (1785.027685)
#define X_DOOR_L_OPENED        (1788.227685)
#define GROUND_Z_COORD         (14.511476)
#define ELEVATOR_OFFSET        (0.059523)
#define ELEVATOR_STATE_IDLE    (0)
#define ELEVATOR_STATE_WAITING (1)
#define ELEVATOR_STATE_MOVING  (2)
#define INVALID_FLOOR          (-1)
Ко всем new

PHP:
new Obj_Elevator;
new Obj_ElevatorDoors[2];
new Obj_FloorDoors[7][2];
new Text3D:Label_Elevator;
new Text3D:Label_Floors[7];
new ElevatorQueue[7];
new FloorRequestedBy[7];
new ElevatorBoostTimer;
new ElevatorState;
new ElevatorFloor;
Добавляем оператор static [Ко всем new]

PHP:
static FloorNames[7][] =
{
	"Улица",
	"Бар",
	"N класс",
	"D класс",
	"C класс",
	"B класс",
	"A класс"
};
static Float:FloorZOffsets[7] =
{
	0.0,		
	8.5479,	
	13.99945,   // 8.5479 + (5.45155 * 1.0),
	19.45100,   // 8.5479 + (5.45155 * 2.0),
	24.90255,   // 8.5479 + (5.45155 * 3.0),
	30.35410,   // 8.5479 + (5.45155 * 4.0),
	35.80565   // 8.5479 + (5.45155 * 5.0),
};
Создаем новые Стоки

PHP:
stock Elevator_Initialize()
{
	new string[128],Float:z;
	Obj_Elevator 		 = CreateObject(18755, 1786.678100, -1303.459472, GROUND_Z_COORD + ELEVATOR_OFFSET, 0.000000, 0.000000, 270.000000);
	Obj_ElevatorDoors[0] = CreateObject(18757, X_DOOR_CLOSED, -1303.459472, GROUND_Z_COORD, 0.000000, 0.000000, 270.000000);
	Obj_ElevatorDoors[1] = CreateObject(18756, X_DOOR_CLOSED, -1303.459472, GROUND_Z_COORD, 0.000000, 0.000000, 270.000000);
	Label_Elevator       = Create3DTextLabel("{FFFFFF}Нажмите '{33CCFF}F{FFFFFF}' для пуска", 0xCCCCCCAA, 1784.9822, -1302.0426, 13.6491, 4.0, 0, 1);
	for(new i; i < sizeof(Obj_FloorDoors); i ++)
	{
		Obj_FloorDoors[i][0] 	= CreateObject(18757, X_DOOR_CLOSED, -1303.171142, GetDoorsZCoordForFloor(i), 0.000000, 0.000000, 270.000000);
		Obj_FloorDoors[i][1] 	= CreateObject(18756, X_DOOR_CLOSED, -1303.171142, GetDoorsZCoordForFloor(i), 0.000000, 0.000000, 270.000000);
		format(string, sizeof(string), "{FFFFFF}[{33CCFF}%s{FFFFFF}]\nНажмите '{33CCFF}F{FFFFFF}' для вызова", FloorNames[i]);

		if(i == 0) z = 13.4713;
		else z = 13.4713 + 8.7396 + ((i-1) * 5.45155);
		Label_Floors[i] = Create3DTextLabel(string, 0xCCCCCCAA, 1783.9799, -1300.7660, z, 10.5, 0, 1);
	}
	Floor_OpenDoors(0);
	Elevator_OpenDoors();
	return true;
}
stock Elevator_Destroy()
{
	DestroyObject(Obj_Elevator);
	DestroyObject(Obj_ElevatorDoors[0]);
	DestroyObject(Obj_ElevatorDoors[1]);
	Delete3DTextLabel(Label_Elevator);
	for(new i; i < sizeof(Obj_FloorDoors); i ++)
	{
		DestroyObject(Obj_FloorDoors[i][0]);
		DestroyObject(Obj_FloorDoors[i][1]);
		Delete3DTextLabel(Label_Floors[i]);
	}
	return true;
}
stock Elevator_OpenDoors()
{
	new Float:x, Float:y, Float:z;
	GetObjectPos(Obj_ElevatorDoors[0], x, y, z);
	MoveObject(Obj_ElevatorDoors[0], X_DOOR_L_OPENED, y, z, DOORS_SPEED);
	MoveObject(Obj_ElevatorDoors[1], X_DOOR_R_OPENED, y, z, DOORS_SPEED);
	return true;
}
stock Elevator_CloseDoors()
{
	if(ElevatorState == ELEVATOR_STATE_MOVING) return false;
	new Float:x, Float:y, Float:z;
	GetObjectPos(Obj_ElevatorDoors[0], x, y, z);
	MoveObject(Obj_ElevatorDoors[0], X_DOOR_CLOSED, y, z, DOORS_SPEED);
	MoveObject(Obj_ElevatorDoors[1], X_DOOR_CLOSED, y, z, DOORS_SPEED);
	return true;
}
stock Floor_OpenDoors(floorid)
{
	MoveObject(Obj_FloorDoors[floorid][0], X_DOOR_L_OPENED, -1303.171142, GetDoorsZCoordForFloor(floorid), DOORS_SPEED);
	MoveObject(Obj_FloorDoors[floorid][1], X_DOOR_R_OPENED, -1303.171142, GetDoorsZCoordForFloor(floorid), DOORS_SPEED);
	return true;
}
stock Floor_CloseDoors(floorid)
{
	MoveObject(Obj_FloorDoors[floorid][0], X_DOOR_CLOSED, -1303.171142, GetDoorsZCoordForFloor(floorid), DOORS_SPEED);
	MoveObject(Obj_FloorDoors[floorid][1], X_DOOR_CLOSED, -1303.171142, GetDoorsZCoordForFloor(floorid), DOORS_SPEED);
	return true;
}
stock Elevator_MoveToFloor(floorid)
{
	ElevatorState = ELEVATOR_STATE_MOVING;
	ElevatorFloor = floorid;
	MoveObject(Obj_Elevator, 1786.678100, -1303.459472, GetElevatorZCoordForFloor(floorid), 0.25);
	MoveObject(Obj_ElevatorDoors[0], X_DOOR_CLOSED, -1303.459472, GetDoorsZCoordForFloor(floorid), 0.25);
	MoveObject(Obj_ElevatorDoors[1], X_DOOR_CLOSED, -1303.459472, GetDoorsZCoordForFloor(floorid), 0.25);
	Delete3DTextLabel(Label_Elevator);
	ElevatorBoostTimer = SetTimerEx("Elevator_Boost", 2000, 0, "i", floorid);
	return true;
}
stock RemoveFirstQueueFloor()
{
	for(new i; i < sizeof(ElevatorQueue) - 1; i ++)
	ElevatorQueue[i] = ElevatorQueue[i + 1];
	return	ElevatorQueue[sizeof(ElevatorQueue) - 1] = INVALID_FLOOR;
}
stock AddFloorToQueue(floorid)
{
	new slot = -1;
	for(new i; i < sizeof(ElevatorQueue); i ++)
	{
		if(ElevatorQueue[i] == INVALID_FLOOR)
		{
			slot = i;
			break;
		}
	}
	if(slot != -1)
	{
		ElevatorQueue[slot] = floorid;
		if(ElevatorState == ELEVATOR_STATE_IDLE)
		return	ReadNextFloorInQueue();
	}
	return false;
}
stock ResetElevatorQueue()
{
	for(new i; i < sizeof(ElevatorQueue); i ++)
	{
		ElevatorQueue[i] 	= INVALID_FLOOR;
		FloorRequestedBy[i] = INVALID_PLAYER_ID;
	}
	return true;
}
stock IsFloorInQueue(floorid)
{
	for(new i; i < sizeof(ElevatorQueue); i ++)
	{
		if(ElevatorQueue[i] == floorid) return true;
	}
	return false;
}
stock ReadNextFloorInQueue()
{
	if(ElevatorState != ELEVATOR_STATE_IDLE || ElevatorQueue[0] == INVALID_FLOOR) return false;
	Elevator_CloseDoors();
	return	Floor_CloseDoors(ElevatorFloor);
}
stock DidPlayerRequestElevator(playerid) {
for(new i; i < sizeof(FloorRequestedBy); i ++) if(FloorRequestedBy[i] == playerid) return true;
return false;
}
stock ShowElevatorDialog(playerid)
{
	new string[128];
	for(new i; i < sizeof(ElevatorQueue); i ++)
	{
		if(FloorRequestedBy[i] != INVALID_PLAYER_ID)
		strcat(string, "{FF0000}");
		strcat(string, FloorNames[i]);
		strcat(string, "\n");
	}
	return	ShowPlayerDialog(playerid, 58, DIALOG_STYLE_LIST, "{33CCFF}Лифт", string, "Принять", "Отменить");
}
stock CallElevator(playerid, floorid)
{
	if(FloorRequestedBy[floorid] != INVALID_PLAYER_ID || IsFloorInQueue(floorid)) return false;
	FloorRequestedBy[floorid] = playerid;
	AddFloorToQueue(floorid);
	return true;
}
stock Float:GetElevatorZCoordForFloor(floorid) return (GROUND_Z_COORD + FloorZOffsets[floorid] + ELEVATOR_OFFSET);
stock Float:GetDoorsZCoordForFloor(floorid) return (GROUND_Z_COORD + FloorZOffsets[floorid]);
Создаем новые паблики

PHP:
public Elevator_Boost(floorid)
{
	StopObject(Obj_Elevator);
	StopObject(Obj_ElevatorDoors[0]);
	StopObject(Obj_ElevatorDoors[1]);
	MoveObject(Obj_Elevator, 1786.678100, -1303.459472, GetElevatorZCoordForFloor(floorid), ELEVATOR_SPEED);
	MoveObject(Obj_ElevatorDoors[0], X_DOOR_CLOSED, -1303.459472, GetDoorsZCoordForFloor(floorid), ELEVATOR_SPEED);
	MoveObject(Obj_ElevatorDoors[1], X_DOOR_CLOSED, -1303.459472, GetDoorsZCoordForFloor(floorid), ELEVATOR_SPEED);
	return true;
}
public Elevator_TurnToIdle() return ElevatorState = ELEVATOR_STATE_IDLE,ReadNextFloorInQueue();
В public OnGameModeInit()

PHP:
Elevator_Destroy();
	ResetElevatorQueue();
	Elevator_Initialize();
В public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])

PHP:
case 58:
	{
		if(!response) return false;
		if(FloorRequestedBy[listitem] != INVALID_PLAYER_ID || IsFloorInQueue(listitem))
		{
			SendClientMessage(playerid,COLOR_WHITE,"Лифт уже едет!");
		}
		else if(DidPlayerRequestElevator(playerid))
		{
			SendClientMessage(playerid,COLOR_WHITE,"Лифт уже едет!");
		}
		else
		{
			CallElevator(playerid, listitem);
		}
		return true;
	}
В public OnObjectMoved(objectid)

PHP:
new Float:x, Float:y, Float:z;
	for(new i; i < sizeof(Obj_FloorDoors); i ++)
	{
		if(objectid == Obj_FloorDoors[i][0])
		{
			GetObjectPos(Obj_FloorDoors[i][0], x, y, z);

			if(x < X_DOOR_L_OPENED - 0.5)
			{
				Elevator_MoveToFloor(ElevatorQueue[0]);
				RemoveFirstQueueFloor();
			}
		}
	}
	if(objectid == Obj_Elevator)
	{
		KillTimer(ElevatorBoostTimer);
		FloorRequestedBy[ElevatorFloor] = INVALID_PLAYER_ID;
		Elevator_OpenDoors();
		Floor_OpenDoors(ElevatorFloor);
		GetObjectPos(Obj_Elevator, x, y, z);
		Label_Elevator	= Create3DTextLabel("{FFFFFF}Нажмите '{33CCFF}F{FFFFFF}' для пуска", 0xCCCCCCAA, 1784.9822, -1302.0426, z - 0.9, 4.0, 0, 1);
		ElevatorState 	= ELEVATOR_STATE_WAITING;
		SetTimer("Elevator_TurnToIdle", ELEVATOR_WAIT_TIME, 0);
	}
В public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)

PHP:
new Float:pos[3];
	GetPlayerPos(playerid, pos[0], pos[1], pos[2]);
	if(pos[1] < -1301.4 && pos[1] > -1303.2417 && pos[0] < 1786.2131 && pos[0] > 1784.1555)
	ShowElevatorDialog(playerid);
	else
	{
		if(pos[1] > -1301.4 && pos[1] < -1299.1447 && pos[0] < 1785.6147 && pos[0] > 1781.9902)
		{

			new i=6;
			while(pos[2] < GetDoorsZCoordForFloor(i) + 3.5 && i > 0)
			i --;
			if(i == 0 && pos[2] < GetDoorsZCoordForFloor(0) + 2.0)
			i = -1;
			if(i <= 5)
			{
				CallElevator(playerid, i + 1);
				SendClientMessage(playerid,COLOR_WHITE,"Лифт вызван, ждите..");
			}
		}
	}
Координаты для телепорта - 1787.1262,-1293.4292,13.5404






Автор данной системы не я, я всего лишь исправил небольшое количество маленьких багов и недоработок автора.
Кто обнаружит какие нибудь баги, пишите, исправлю :au:

Под данную систему можно много чего придумать, респавн новичков, кафе, отель, центр развлечений, и многое другое, нужна всего лишь ваша фантазия :)

Всем спасибо за внимание.
ps. Строго не судите

pss. Лифт можно установить в любой части карты.
 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу