Как сделать систему въезда в интерьер

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

Rr67

Новичок
Автор темы
21
2
Всем привет. Дайте пожалуйста тутор, как сделать систему въезда и выезда из интерьера на машине ( То бишь когда нажимаешь H - сигналишь )
Буду очень благодарен. Облазил все форумы, чего-то годного не нашёл. Заранее спасибо.
 
Решение
index.pwn:
// Константы для координат парковки и точки возврата
#define PARKING_X 100.0
#define PARKING_Y 200.0
#define PARKING_Z 10.0
#define RETURN_X 150.0
#define RETURN_Y 250.0
#define RETURN_Z 10.0

// Радиус действия
#define TRIGGER_RADIUS 5.0

// Переменные для сохранения состояния игроков
new bool:IsInParking[MAX_PLAYERS];

// Хук для клавиши H
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
    if ((newkeys & KEY_HORN) != 0) // Проверяем, нажата ли клавиша H
    {
        if (IsPlayerInAnyVehicle(playerid)) // Проверяем, в машине ли игрок
        {
            new vehicleid = GetPlayerVehicleID(playerid);
            if (GetPlayerVehicleSeat(playerid) == 0) // Проверяем, что игрок за рулем
            {
                new...

Andrey Markelov

Участник
7
19
index.pwn:
// Константы для координат парковки и точки возврата
#define PARKING_X 100.0
#define PARKING_Y 200.0
#define PARKING_Z 10.0
#define RETURN_X 150.0
#define RETURN_Y 250.0
#define RETURN_Z 10.0

// Радиус действия
#define TRIGGER_RADIUS 5.0

// Переменные для сохранения состояния игроков
new bool:IsInParking[MAX_PLAYERS];

// Хук для клавиши H
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
    if ((newkeys & KEY_HORN) != 0) // Проверяем, нажата ли клавиша H
    {
        if (IsPlayerInAnyVehicle(playerid)) // Проверяем, в машине ли игрок
        {
            new vehicleid = GetPlayerVehicleID(playerid);
            if (GetPlayerVehicleSeat(playerid) == 0) // Проверяем, что игрок за рулем
            {
                new Float:playerX, Float:playerY, Float:playerZ;
                GetPlayerPos(playerid, playerX, playerY, playerZ);

                if (!IsInParking[playerid] && IsNearPickup(playerX, playerY, playerZ))
                {
                    TeleportToParking(playerid, vehicleid);
                }
                else if (IsInParking[playerid])
                {
                    TeleportToReturn(playerid, vehicleid);
                }
            }
            else
            {
                SendClientMessage(playerid, 0xFF0000FF, "Вы должны быть за рулем, чтобы использовать эту функцию.");
            }
        }
        else
        {
            SendClientMessage(playerid, 0xFF0000FF, "Вы должны находиться в машине, чтобы использовать эту функцию.");
        }
    }
    return 1;
}

// Проверка на нахождение около пикапа
bool:IsNearPickup(Float:x, Float:y, Float:z)
{
    new Float:pickupX = 120.0, Float:pickupY = 220.0, Float:pickupZ = 10.0; // Координаты пикапа
    return (GetDistanceBetweenPoints3D(x, y, z, pickupX, pickupY, pickupZ) <= TRIGGER_RADIUS);
}

// Функция для телепортации в паркинг
TeleportToParking(playerid, vehicleid)
{
    SetVehiclePos(vehicleid, PARKING_X, PARKING_Y, PARKING_Z);
    SetPlayerPos(playerid, PARKING_X, PARKING_Y, PARKING_Z + 2.0);
    SendClientMessage(playerid, 0x00FF00FF, "Вы телепортированы в паркинг.");
    IsInParking[playerid] = true;
}

// Функция для телепортации обратно
TeleportToReturn(playerid, vehicleid)
{
    SetVehiclePos(vehicleid, RETURN_X, RETURN_Y, RETURN_Z);
    SetPlayerPos(playerid, RETURN_X, RETURN_Y, RETURN_Z + 2.0);
    SendClientMessage(playerid, 0x00FF00FF, "Вы покинули паркинг.");
    IsInParking[playerid] = false;
}

// Вызывается при выходе игрока
public OnPlayerDisconnect(playerid, reason)
{
    IsInParking[playerid] = false;
    return 1;
}

Функционал простой: вход в интерьер например, через пикап, вы телепортируетесь внутрь. Здесь реализован похожий принцип, только активация происходит по нажатию клавиши, например, H. Для примера можно воспользоваться любым слитым модом Arizona или кодом, приведённым выше
 
Последнее редактирование:
  • Нравится
Реакции: Rr67 и dsaf1

Rr67

Новичок
Автор темы
21
2
index.pwn:
// Константы для координат парковки и точки возврата
#define PARKING_X 100.0
#define PARKING_Y 200.0
#define PARKING_Z 10.0
#define RETURN_X 150.0
#define RETURN_Y 250.0
#define RETURN_Z 10.0

// Радиус действия
#define TRIGGER_RADIUS 5.0

// Переменные для сохранения состояния игроков
new bool:IsInParking[MAX_PLAYERS];

// Хук для клавиши H
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
    if ((newkeys & KEY_HORN) != 0) // Проверяем, нажата ли клавиша H
    {
        if (IsPlayerInAnyVehicle(playerid)) // Проверяем, в машине ли игрок
        {
            new vehicleid = GetPlayerVehicleID(playerid);
            if (GetPlayerVehicleSeat(playerid) == 0) // Проверяем, что игрок за рулем
            {
                new Float:playerX, Float:playerY, Float:playerZ;
                GetPlayerPos(playerid, playerX, playerY, playerZ);

                if (!IsInParking[playerid] && IsNearPickup(playerX, playerY, playerZ))
                {
                    TeleportToParking(playerid, vehicleid);
                }
                else if (IsInParking[playerid])
                {
                    TeleportToReturn(playerid, vehicleid);
                }
            }
            else
            {
                SendClientMessage(playerid, 0xFF0000FF, "Вы должны быть за рулем, чтобы использовать эту функцию.");
            }
        }
        else
        {
            SendClientMessage(playerid, 0xFF0000FF, "Вы должны находиться в машине, чтобы использовать эту функцию.");
        }
    }
    return 1;
}

// Проверка на нахождение около пикапа
bool:IsNearPickup(Float:x, Float:y, Float:z)
{
    new Float:pickupX = 120.0, Float:pickupY = 220.0, Float:pickupZ = 10.0; // Координаты пикапа
    return (GetDistanceBetweenPoints3D(x, y, z, pickupX, pickupY, pickupZ) <= TRIGGER_RADIUS);
}

// Функция для телепортации в паркинг
TeleportToParking(playerid, vehicleid)
{
    SetVehiclePos(vehicleid, PARKING_X, PARKING_Y, PARKING_Z);
    SetPlayerPos(playerid, PARKING_X, PARKING_Y, PARKING_Z + 2.0);
    SendClientMessage(playerid, 0x00FF00FF, "Вы телепортированы в паркинг.");
    IsInParking[playerid] = true;
}

// Функция для телепортации обратно
TeleportToReturn(playerid, vehicleid)
{
    SetVehiclePos(vehicleid, RETURN_X, RETURN_Y, RETURN_Z);
    SetPlayerPos(playerid, RETURN_X, RETURN_Y, RETURN_Z + 2.0);
    SendClientMessage(playerid, 0x00FF00FF, "Вы покинули паркинг.");
    IsInParking[playerid] = false;
}

// Вызывается при выходе игрока
public OnPlayerDisconnect(playerid, reason)
{
    IsInParking[playerid] = false;
    return 1;
}
Спасибо большое, но не подскажешь, как исправить Error при добавлении ? Код твой добавил.
C:\Users\Ростислав\Desktop\gucci crmp eroshin v1\gamemodes\gucciV1eroshin.pwn(112654) : error 021: symbol already defined: "OnPlayerKeyStateChange"
C:\Users\Ростислав\Desktop\gucci crmp eroshin v1\gamemodes\gucciV1eroshin.pwn(112655) : error 017: undefined symbol "KEY_HORN"
C:\Users\Ростислав\Desktop\gucci crmp eroshin v1\gamemodes\gucciV1eroshin.pwn(112690) : error 017: undefined symbol "GetDistanceBetweenPoints3D"
C:\Users\Ростислав\Desktop\gucci crmp eroshin v1\gamemodes\gucciV1eroshin.pwn(112694) : error 021: symbol already defined: "OnPlayerKeyStateChange"
C:\Users\Ростислав\Desktop\gucci crmp eroshin v1\gamemodes\gucciV1eroshin.pwn(112695) : error 017: undefined symbol "KEY_HORN"
C:\Users\Ростислав\Desktop\gucci crmp eroshin v1\gamemodes\gucciV1eroshin.pwn(112745) : error 021: symbol already defined: "Itter_OnPlayerDisconnect"
Pawn compiler 3.10.8 Copyright (c) 1997-2006, ITB CompuPhase


6 Errors.
 

Andrey Markelov

Участник
7
19
Спасибо большое, но не подскажешь, как исправить Error при добавлении ? Код твой добавил.
Вам нужно не просто скопировать мой код, а адаптировать его под ваш проект. Я лишь показал примерную логику работы. Исходя из ваших ошибок, могу предположить следующее:

  1. Ошибка: symbol already defined: "OnPlayerKeyStateChange"
    Эта ошибка возникает из-за того, что функция OnPlayerKeyStateChange уже определена в вашем коде. Чтобы исправить это, объедините её с вашим функционалом или переименуйте новую функцию, чтобы избежать конфликта имен.

  2. Ошибка: undefined symbol "KEY_HORN"
    Константа KEY_HORN отсутствует. Замените её на 2, точно не помню, вроде 2.

  3. Ошибка: undefined symbol "GetDistanceBetweenPoints3D"

    Функция GetDistanceBetweenPoints3D не определена. Чтобы решить эту проблему, замените на другое или добавьте пользовательскую реализацию этой функции. Вот пример:
    index.pwn:
    Float:GetDistanceBetweenPoints3D(Float:x1, Float:y1, Float:z1, Float:x2, Float:y2, Float:z2){
        return floatsqroot(
            floatpower(x2 - x1, 2.0) +
            floatpower(y2 - y1, 2.0) +
            floatpower(z2 - z1, 2.0)
        );
    }

  4. Ошибка: symbol already defined: "Itter_OnPlayerDisconnect"
    В вашем коде уже есть функция OnPlayerDisconnect. Здесь, как и в случае с OnPlayerKeyStateChange, нужно либо объединить функционал, добавив в существующую функцию нужный код, либо переименовать новую реализацию.

С pawn я уже давно не работал, подождите немного, возможно, более опытные ребята подскажут современные подходы к реализации.
 
  • Нравится
Реакции: Rr67
Статус
В этой теме нельзя размещать новые ответы.