Отлов вхождение в обьект и выход из него

Сообщения
74
Реакции
61
Помог
1 раз(а)
Всем привет. Знает ли кто как лучше всего реализовать такую вещь?

У меня реализовано так:
Код:
sdm_create_mario(Float:vecOrigin[3]) {
    new iEntity = rg_create_entity("info_target");
    if(is_nullent(iEntity))
        return 0;

    set_entvar(iEntity, var_origin, vecOrigin);
    set_entvar(iEntity, var_classname, "sdm_mario");
    set_entvar(iEntity, var_solid, SOLID_TRIGGER);
    set_entvar(iEntity, var_movetype, MOVETYPE_NONE);
    set_entvar(iEntity, var_iuser1, 1);
   
    engfunc(EngFunc_SetSize, iEntity, Float:{ -200.0, -200.0, -200.0 }, Float: {200.0, 200.0, 200.0});
    SetTouch(iEntity, "@RG_MarioTouch");
    return iEntity;
}

@RG_MarioTouch(iMarioId, pId) {
    if(!FClassnameIs(iMarioId, "sdm_mario") || !is_user_alive(pId) || g_iBitUserFinishMario & (1<<pId))
        return;
   
    g_iBitUserFinishMario |= (1<<pId);
    new iFirst = get_entvar(iMarioId, var_iuser1), iReturn;
    ExecuteForward(g_fwdMario, iReturn, pId, iMarioId, iFirst);
    if(!iReturn && iFirst) {
        sdm_print_chat(0, "Игрок ^3%n ^1первый зашёл в марио и получил: ^4%d ^1опыта и ^4$%d", pId, g_iRewardExp, g_iRewardMoney);
        sdm_give_user_exp(pId, g_iRewardExp);
        sdm_give_user_money(pId, g_iRewardMoney);
    } else {
        sdm_print_chat(pId, "Вы попали в марио. Ваше здоровье ^4восстановлено");
        new Float:fHealth = Float:get_entvar(pId, var_health);
        if(fHealth < 100.0) set_entvar(pId, var_health, 100.0);
    }
    set_entvar(iMarioId, var_iuser1, 0);
    new szData[4];
    szData[0] = iMarioId;
    szData[1] = pId;
    if(!task_exists(pId + 512512))set_task(1.0, "@TK_MarioReset", pId + 512512, szData, 3, "b");
}

@TK_MarioReset(szData[], iTaskId) {
    new iPlayer = szData[1], iMarioId = szData[0];
    if(is_nullent(iMarioId) || !FClassnameIs(iMarioId, "sdm_mario") || !is_user_alive(iPlayer)) {
        g_iBitUserFinishMario |= (1<<iPlayer);
        return;
    }
    new Float:vecUserOrigin[3], Float:vecMarioOrigin[3];
    get_entvar(iPlayer, var_origin, vecUserOrigin);
    get_entvar(iMarioId, var_origin, vecMarioOrigin);
    if(get_distance_f(vecUserOrigin, vecMarioOrigin) > 900.0)
        g_iBitUserFinishMario &= ~(1<<iPlayer);
}
В этом коде чуть другая структура реализована, так как нужно отловить чтоб игрок подальше ушёл от марио (ТПШнулся)

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

Если естькосяки или моменты где можно реализовать лучше, буду благодарен за коррективы.

Ещё если не сложно, и знаете, скажите класснейм который отвечает за ускорение или класснеймы в которых в основном вставляют ускорение
 
Сообщения
78
Реакции
65
Возможно будет без задержки определяться конец касания, если сделать так:
1. При выполнении touch сохраняем инфу о прикосновениях в глобальную переменную, то есть какие игроки трогают энтити.
2. Потом в player_prethink проверяем эту переменную. Если записано что игрок касается энтити, то проверяем так ли это (например с помощью Float:fm_distance_to_boxent(ent, boxent)), если нет, то обновляем переменную и вызываем свой touch_end
 
Сообщения
74
Реакции
61
Помог
1 раз(а)
@Lopol2010,спасибо, попробую
 
Сообщения
673
Реакции
242
Помог
11 раз(а)
Box System от Next21, отличное решение под ваш критерии, боксы создаются по прицелу
 
Сообщения
74
Реакции
61
Помог
1 раз(а)
@Limbooc,видел, но не хотелось бы кучу модулей пихать
 

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

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