Поймать ивент игрок пробует подобрать оружие

oleg_nelasy

Участник
Сообщения
674
Реакции
47
Пытаюсь поймать когда игрок подбирает оружие.
Пробовал так
C#:
public override void Load(bool hotReload)
{
    MemoryFunctionWithReturn<CCSPlayer_WeaponServices, CBasePlayerWeapon, bool>     CCSPlayer_WeaponServices_CanUseFunc = new(GameData.GetSignature("CCSPlayer_WeaponServices_CanUse"));
    CCSPlayer_WeaponServices_CanUseFunc.Hook(OnWeaponCanUse, HookMode.Pre);
}
или так
C#:
public MemoryFunctionWithReturn<CCSPlayer_WeaponServices, CBasePlayerWeapon, bool> CCSPlayer_WeaponServices_CanUseFunc = new(GameData.GetSignature("CCSPlayer_WeaponServices_CanUse"));

public override void Load(bool hotReload)
{
    CCSPlayer_WeaponServices_CanUseFunc.Hook(OnWeaponCanUse, HookMode.Pre);
}

public override void Unload(bool hotReload)
{
    CCSPlayer_WeaponServices_CanUseFunc.Unhook(OnWeaponCanUse, HookMode.Pre);
}

private HookResult OnWeaponCanUse(DynamicHook hook)
{
    Server.PrintToChatAll("test");

    var weaponServices = hook.GetParam<CCSPlayer_WeaponServices>(0);
    var weapon = hook.GetParam<CBasePlayerWeapon>(1);

    if (weaponServices == null || weapon == null || !weapon.IsValid)
        return HookResult.Continue;

    var pawn = weaponServices.Pawn.Value;
    if (pawn == null || !pawn.IsValid) return HookResult.Continue;

    var player = pawn.Controller.Value?.As<CCSPlayerController>();
    if (player == null || !player.IsValid || player.IsBot)
        return HookResult.Continue;

    player.PrintToChat($"[Дебаг] Вы коснулись пушки: {weapon.DesignerName}");

    return HookResult.Continue;
}
В обоих случаях не появляется даже тестового сообщения. Шарп обновил до последней версии также проверил в gamedata шарпа вроде есть CCSPlayer_WeaponServices_CanUse".
Компилятор говорит все хорошо на серевер в логе ошибок нет плагин запускается но событие не перехватывается подскажите может я что-то упускаю?
 
Последнее редактирование:

AzureLane

Участник
Сообщения
51
Реакции
32
Пытаюсь поймать когда игрок подбирает оружие.
Пробовал так
C#:
public override void Load(bool hotReload)
{
    MemoryFunctionWithReturn<CCSPlayer_WeaponServices, CBasePlayerWeapon, bool>     CCSPlayer_WeaponServices_CanUseFunc = new(GameData.GetSignature("CCSPlayer_WeaponServices_CanUse"));
    CCSPlayer_WeaponServices_CanUseFunc.Hook(OnWeaponCanUse, HookMode.Pre);
}
или так
C#:
public MemoryFunctionWithReturn<CCSPlayer_WeaponServices, CBasePlayerWeapon, bool> CCSPlayer_WeaponServices_CanUseFunc = new(GameData.GetSignature("CCSPlayer_WeaponServices_CanUse"));

public override void Load(bool hotReload)
{
    CCSPlayer_WeaponServices_CanUseFunc.Hook(OnWeaponCanUse, HookMode.Pre);
}

public override void Unload(bool hotReload)
{
    CCSPlayer_WeaponServices_CanUseFunc.Unhook(OnWeaponCanUse, HookMode.Pre);
}

private HookResult OnWeaponCanUse(DynamicHook hook)
{
    Server.PrintToChatAll("test");

    var weaponServices = hook.GetParam<CCSPlayer_WeaponServices>(0);
    var weapon = hook.GetParam<CBasePlayerWeapon>(1);

    if (weaponServices == null || weapon == null || !weapon.IsValid)
        return HookResult.Continue;

    var pawn = weaponServices.Pawn.Value;
    if (pawn == null || !pawn.IsValid) return HookResult.Continue;

    var player = pawn.Controller.Value?.As<CCSPlayerController>();
    if (player == null || !player.IsValid || player.IsBot)
        return HookResult.Continue;

    player.PrintToChat($"[Дебаг] Вы коснулись пушки: {weapon.DesignerName}");

    return HookResult.Continue;
}
В обоих случаях не появляется даже тестового сообщения. Шарп обновил до последней версии также проверил в gamedata шарпа вроде есть CCSPlayer_WeaponServices_CanUse".
Компилятор говорит все хорошо на серевер в логе ошибок нет плагин запускается но событие не перехватывается подскажите может я что-то упускаю?
А точно сигнатура правильная?
 
Последнее редактирование:

DarkerZ

Участник
Сообщения
466
Реакции
214
Ну я тебе в дискорде ответил... Сигнатура правильная, только на линукс сервера в кс# она не работает. Либо использовать аналог, либо обновить динохук и перекомпилировать ядро кс#
 

oleg_nelasy

Участник
Сообщения
674
Реакции
47
Ну я тебе в дискорде ответил... Сигнатура правильная, только на линукс сервера в кс# она не работает. Либо использовать аналог, либо обновить динохук и перекомпилировать ядро кс#
Можете сказать подробнее что сделать надо? Сервер на линукс я года 3 назад делал через CCSPlayer_WeaponServices_CanUse но уже не помню что и как.
Я до этого пробовал CCSPlayer_ItemServices_CanAcquireFunc но сервер как только игрок заходит за каманду крашится.


C#:
public MemoryFunctionWithReturn<CCSPlayer_ItemServices, CBasePlayerWeapon, int>? CCSPlayer_ItemServices_CanAcquireFunc;

    public override void Load(bool hotReload)
    {
        CCSPlayer_ItemServices_CanAcquireFunc = new(GameData.GetSignature("CCSPlayer_ItemServices_CanAcquire"));
        CCSPlayer_ItemServices_CanAcquireFunc.Hook(OnWeaponCanAcquire, HookMode.Pre);
    }

    public override void Unload(bool hotReload)
    {
        CCSPlayer_ItemServices_CanAcquireFunc?.Unhook(OnWeaponCanAcquire, HookMode.Pre);
    }

     private HookResult OnWeaponCanAcquire(DynamicHook hook)
 {
     Server.PrintToChatAll("Попытка подобрать оружие");
     return HookResult.Continue;
 }
Вопрос решон я дурак не правильно обьявлял.
Надо public MemoryFunctionWithReturn<CCSPlayer_ItemServices, CEconItemView, int, IntPtr, int>? CCSPlayer_ItemServices_CanAcquireFunc;
 
Последнее редактирование:

AzureLane

Участник
Сообщения
51
Реакции
32
Не по теме, а чем тебе отладка с точками останова не нравится, где сервак на паузу встает, и можно смотреть значения всех переменных?)
Как ты это собираешься сделать в КС2?
 

Ice_Sochi

Участник
Сообщения
738
Реакции
433
Как ты это собираешься сделать в КС2?
Если кратко, в visual studio подключаешься к процессу кс2, и все работает. Точки останова, переход к следующей строке кода и т.д.
Настраивал еще в первый осваивания cs sharp при помощи нейронки в гугл поиске, инструкцию не дам, не помню по шагам, но прям не сложно. Плагины, кстати, компилятся прямо в папку на сервере.
 

DarkerZ

Участник
Сообщения
466
Реакции
214
Конечно на cs# много разработчиков и соответственно плагинов, но много чего не работает/не хватает + к этому cs# очень медленный, по сравнению с metamod, swiftly, modsharp
 

Kewn

Участник
Сообщения
365
Реакции
74
Конечно на cs# много разработчиков и соответственно плагинов, но много чего не работает/не хватает + к этому cs# очень медленный, по сравнению с metamod, swiftly,
Извиняюсь за глупцы вопрос, sm по идеи тоже медленный? По сравнению с python и mani? Или как он назывался eventscript?
 

Nekro

Терра инкогнита
Сообщения
4,169
Реакции
2,500
Хммм, странно что он не прижился
Почему? Наоборот естественно. Главное же тут не скорость, а удобство. У СМ низкий порог входа, удобный язык SourcePawn взятый от Pawn с 1.6.
Удобная модульная структура, штампуй плагины да побольше. Есть опыт с 1.6? Дак тем более - проще и быстрее!
 

Kewn

Участник
Сообщения
365
Реакции
74
Почему? Наоборот естественно. Главное же тут не скорость, а удобство. У СМ низкий порог входа, удобный язык SourcePawn взятый от Pawn с 1.6.
Удобная модульная структура, штампуй плагины да побольше. Есть опыт с 1.6? Дак тем более - проще и быстрее!
Согласен, я все надеюсь, что все таки появится source2mod. Верю в чудо так сказать)
 

Nekro

Терра инкогнита
Сообщения
4,169
Реакции
2,500
Согласен, я все надеюсь, что все таки появится source2mod. Верю в чудо так сказать)
Боюсь это особо смысла не имеет. C# прекрасный язык, очень хорошо подходит к CS2, менять его? Если бы было рентабельно, то современный см переделали бы на C#. Тогда просто не было того уровня технологий
 

Kewn

Участник
Сообщения
365
Реакции
74
Боюсь это особо смысла не имеет. C# прекрасный язык, очень хорошо подходит к CS2, менять его? Если бы было рентабельно, то современный см переделали бы на C#. Тогда просто не было того уровня технологий
Ну как сказать, на тот момент была та же Java, а шарп много чего взял от туда.
 

DarkerZ

Участник
Сообщения
466
Реакции
214
Извиняюсь за глупцы вопрос, sm по идеи тоже медленный? По сравнению с python и mani? Или как он назывался eventscript?
Разницы в удобстве программирования на cs#, swiftly и modsharp не особо большая, но как и сказал ранее, если бы не большинство комьюнити и плагинов, то cs# проиграет другим модам. Вот пример 1764418385807.png GitHub - swiftly-solution/profiler
 
  • Мне нравится
Реакции: Kewn
Сверху Снизу