[HL2DM] Схватить подствол - можно ли?

Тема в разделе "Программирование / Скриптинг", создана пользователем iamdss, 28 июн 2015.

  1. iamdss

    iamdss

    Сообщения:
    117
    Симпатии:
    0
    В HL2DM подствольные гранаты не хватаются гравиганом. Возник вопрос - можно ли в принципе это реализовать плагином?
     
  2. Reiko1231

    Reiko1231 AlexTheRegent

    Сообщения:
    237
    Симпатии:
    569
    Возможно. Вроде как плагин EntControl (есть две версии - одна на с++, другая на sourcepawn), в нем вроде как реализован Gravity Gun. Если подствольную гранату возможно идентифицировать сурсмодом (функцией GetClientAimTarget() или при помощи TR_GetEntityIndex() (для примера работы с TraceRay см. плагины взаимодействия с предметами, например, props плагины или возможно это есть в том же EntControl), то тогда это возможно.
    Хотя наверное можно сразу и через EntControl проверить, можно ли захватить, а затем просто аккуратно перенести код оттуда (ибо этот плагин большой) в свой плагин.
     
    iamdss нравится это.
  3. iamdss

    iamdss

    Сообщения:
    117
    Симпатии:
    0
    Спасибо, посмотрю плагин. Ответьте, пожалуйста, на маленький вопрос, если у плагина есть 2 версии и одна на С++, то не подскажете, где прочесть про написание плагинов на С++? А то я везде читал только о компиляции при помощи compile.exe, но нигде не видел руководства по компиляции в студии. На плюсах мне было бы в разы удобее...
     
  4. Reiko1231

    Reiko1231 AlexTheRegent

    Сообщения:
    237
    Симпатии:
    569
    Для плюсов очень мало статей и достаточно сложностей.
    https://wiki.alliedmods.net/Writing_extensions - это вершина айсберга. От неё начинайте спускаться вниз, к настройке метамода (исходные коды, т.к. sourcemod "использует" их), затем к настройке SDK (metamod "использует" код от sdk). Так же стоит поискать мануалы, как установить всё это для MVS, благо они есть где-то на WIKI у SourceMod'а и MetaMod'а, но для старых версий VS.
     
  5. iamdss

    iamdss

    Сообщения:
    117
    Симпатии:
    0
    Хорошо. Я написал такое:
    Код:
    new ent = GetClientAimTarget(client);
    if (ent > 0)
    {
    	decl String:clsName[128];
    	GetEntityClassname(ent, clsName, 128);
    	PrintToChatAll("Enityname: %s", clsName);
    }
    Это вызывается в OnPlayerRunCmd, но не столь важно. Главное, что ent всегда равен -1, то есть, я ни на что не нацелен. Очень странно. Почему так?

    Добавлено через 9 минут
    C TR_GetEntityIndex вообще странная ситуация - возвращает всегда ноль.
     
    Последнее редактирование: 4 июл 2015
  6. Reiko1231

    Reiko1231 AlexTheRegent

    Сообщения:
    237
    Симпатии:
    569
    Если указать только клиента, тогда будет искать только клиентов (параметр only_clients). Необходимо второй параметр задать как false.
    Во-вторых, я предупредил, что возможно и не получится таким образом захватить гранату.

    Одну эту функцию вызвать недостаточно, необходимо сначала провести трассировку, а затем уже получать то, с чем она столкнулась. См. так же TR_TraceRayFilter(), TR_DidHit() и плагины, которые это используют.
     
    iamdss нравится это.
  7. iamdss

    iamdss

    Сообщения:
    117
    Симпатии:
    0
    Спасибо за уточнение, буду искать возможности. Отпишу.