Отлов события открытия дверей

Сообщения
10
Реакции
0
Здравствуйте уважаемые люди! У меня такой вопрос..
Возможно ли отловить момент открытия дверей или подобного рода механизма?

Или же отключить функцию открытия дверей.
Думал может функцию func_door отключить открытия дверей с помощью EnableHamForward

Посоветуйте как это можно правильно сделать или же фрагмент небольшого кода для этого.
 
Сообщения
49
Реакции
32
Да всё очень просто. Данный плагин заблокирует открытие/касание дверей
Код:
#include <amxmodx>
#include <hamsandwich>

public plugin_init() {
    RegisterHam(Ham_Touch, "func_door", "Door_Touch_Pre", 0);
    RegisterHam(Ham_Touch, "func_door_rotating", "Door_Touch_Pre", 0);
}

public Door_Touch_Pre(ent, id){
    client_print(id, print_chat, "Door is blocked! id %d, ent %d", id, ent);
    return HAM_SUPERCEDE;
}
 
Сообщения
494
Реакции
340
Помог
11 раз(а)
Да всё очень просто. Данный плагин заблокирует открытие/касание дверей
Код:
#include <amxmodx>
#include <hamsandwich>

public plugin_init() {
    RegisterHam(Ham_Touch, "func_door", "Door_Touch_Pre", 0);
    RegisterHam(Ham_Touch, "func_door_rotating", "Door_Touch_Pre", 0);
}

public Door_Touch_Pre(ent, id){
    client_print(id, print_chat, "Door is blocked! id %d, ent %d", id, ent);
    return HAM_SUPERCEDE;
}
Заблокирует только касание двери, вследствие чего не будет открыта непосредственно сама дверь.
Но это будет работать только для дверей, которые открываются касанием.
Дверь также может быть открыта через кнопку/триггер. Твой вариант пропустит такой механизм открывания.

Код:
#include <amxmodx>
#include <hamsandwich>

public plugin_init()
{
    static const LIST_ENTITIES[][] =
    {
        "func_door",
        "func_door_rotating"
    };

    for(new i; i < sizeof(LIST_ENTITIES); i++)
    {
        RegisterHam(Ham_Use, LIST_ENTITIES[i], "HamHook_UseDoor_Pre");
        RegisterHam(Ham_Touch, LIST_ENTITIES[i], "HamHook_TouchDoor_Pre");
    }
}

public HamHook_UseDoor_Pre(this, idcaller, idactivator, use_type, Float:value)
{
    if(is_user_connected(idcaller))
        client_print_color(idcaller, print_team_default, "block use");

    return HAM_SUPERCEDE;
}

public HamHook_TouchDoor_Pre(eEnt, eToucher)
{
    if(is_user_connected(eToucher))
    {
        static
            Float: fGameTime,
            Float: fNextTime[MAX_PLAYERS+1];

        fGameTime = get_gametime();

        if(fNextTime[eToucher] < fGameTime)
        {
            client_print_color(eToucher, print_team_default, "block touch");
            fNextTime[eToucher] = fGameTime + 0.3;
        }
    }

    return HAM_SUPERCEDE;
}
14 Окт 2022
UrShade, еще один момент. Ham_Touch ловит касание объекта со всеми остальными, поэтому перед посылом мессаги в твоем случае нужно проверять на коннект. Простой пример: кинь в дверь гранату, получишь ошибку, так как мессага будет отсылаться гранате.
 
Сообщения
49
Реакции
32
bizon, скажем, у меня не стояла задача написать полноценный плагин. Автор просил пример или фрагмент небольшого кода. Я хотел показать момент, что дверь на условном ассаулте можно заблокировать через Ham_Touch, а сообщение в чат - это просто для примера, чтоб вывело айди игрока и двери. Понятно, что можно обвязать весь код, сделать задержку на сообщение, чтобы не флудило в чат, раскрасить его цветом, добавить условий и проверок, чтобы исключить баги и соприкосновения различных сущностей с дверьми, кроме игрока. Но все же, это уже ближе к разделу покупки, нежели к разделу с вопросами :) Но вот, кстати, про двери с кнопкой - да, ты абсолютно прав
 
Последнее редактирование:

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу