Мгновенный Респаун [ HLDS ]

Сообщения
1,480
Реакции
1,476
Помог
2 раз(а)
Данный метод подойдёт тем людям,у которых сервер HLDS
Привожу пример на основе сервера GunGame

Игрок подключается в игру,когда уже идёт игра к примеру 2-3 минуты ( время может быть и в меньше / больше )
Он не будет возрождатся и ему прейдётся ждать когда закончится раунд
Это если на сервере имеются карты по сценарию cs_ | de_
Здесь ситуация куда ещё нормальная

Если же есть карты по типу gg_ - то тут всё - приехали
Никакого сценария здесь нет,и Вы просто ждёте будучи мёртвым,когда закончится текущая карта - до следующей...

Бывают случаи,когда люди ставят Simple DeathMatch на обычный классик с ночи к примеру
Ну там ситуация таже,что и с cs_ | de_ - ждём окончания раунда

Да и вцелом не только здесь,где нужно поставить мгновенный респаун игрока - на других подобных Модах

Теперь перейдём к тому,что нам нужно зделать

1. Берём модуль CSDM последней версии csdm_amxx.dll - Windows | csdm_amxx_i386.so - Linux
2. Ложим его в папку для модулей addons/amxmodx/modules
3. Прописываем название csdm в файле modules.ini ниже в списке модулей
4. Всё )

Примечание:

Вцелом, как работать будет возрождение.?
Игрок заходит за команду - он сначала в Наблюдателях и потом через 3 секунды возрождается
Как видим - всёравно приходится подождать )))

Есть в Модуле квар csdm_active 0/1 - выкл./вкл.

Вы можете к примеру ставить его на тот же Simple DeathMatch ночью,а утром выключать его в заданное время,когда уже не будет Дезматч работать,а будет Классика
Да,модуль будет загружен - но он не будет работать

Есть ещё старый метод от Коннора,который заверял,что должен работать
Проверял с разным промежутком времени - не работает

Ну мало ли - тоже сюда
Код:
#include < amxmodx >
#include < fakemeta >
#include < hamsandwich >

#pragma semicolon 1

#define VERSION "0.1.0"
#define PLUGIN "Respawn on First Join"

const m_iJoiningState = 121;
const m_iMenu = 205;
const MENU_CHOOSEAPPEARANCE = 3;
const JOIN_CHOOSEAPPEARANCE = 4;

new HamHook:g_iHhCBasePlayerPreThink;

#define MaskEnt(%0)    ( 1<<(%0 & 31) )

new g_iBitHookPlayerPreThink;
#define MarkPlayerPreThink(%0)    g_iBitHookPlayerPreThink |= MaskEnt(%0)
#define ClearPlayerPreThink(%0)    g_iBitHookPlayerPreThink &= ~MaskEnt(%0)
#define HookPlayerPreThink(%0)    ( g_iBitHookPlayerPreThink & MaskEnt(%0) )

public plugin_init()
{
    register_plugin(PLUGIN, VERSION, "ConnorMcLeod");

    register_clcmd("menuselect", "ClCmd_MenuSelect_JoinClass"); // old style menu
    register_clcmd("joinclass", "ClCmd_MenuSelect_JoinClass"); // VGUI menu

    DisableHamForward( g_iHhCBasePlayerPreThink = RegisterHam(Ham_Player_PreThink, "player", "OnCBasePlayer_PreThink_Post", true) ); // register it for later
}

// player is pressing a key in an old style menu
// or player is sending joinclass command, either by typing it in console, either selecting a option from VGUI skins selection menu
public ClCmd_MenuSelect_JoinClass(id)
{
    // Don't need to check args here, because (assuming player is in the skin select menu,
    // we gonna check this) if there is no arg, or if arg is bad, game gonna act as if player was choosing auto-select.
    // So first check if player is in the correct menu, pdata m_iMenu can just tell us
    // Then check if player has just joined the server, m_iJoiningState is used by the game for this
    if( get_pdata_int(id, m_iMenu) == MENU_CHOOSEAPPEARANCE && get_pdata_int(id, m_iJoiningState) == JOIN_CHOOSEAPPEARANCE )
    {
        // Enable PreThink for 1 frame if not already
        if( !g_iBitHookPlayerPreThink )
        {
            EnableHamForward( g_iHhCBasePlayerPreThink );
        }
        MarkPlayerPreThink(id);
    }
}

// Little explanation on what should happen after player has chosen a skin :
// In CBasePlayer::PreThink, if player pdata m_iJoiningState is different from 0, function CBasePlayer::JoinThink gonna be called
// In JoinThink function, if m_iJoiningState 5 it means that player has just chosen a skin, we had checked if pdata was 4 because player has not chosen a team yet
// Then game checks if that player can be respawn with function CGameRules::FPlayerCanRespawn (if no objective or no player in 1 team player can respawn,
// else if we are less that 20sec after round start player can respawn, else player won't spawn)

// So now that PreThink and JoinThink have been called, let's check if player has been respawned or not.
public OnCBasePlayer_PreThink_Post( id )
{
    if( !HookPlayerPreThink(id) )
    {
        return HAM_IGNORED;
    }

    ClearPlayerPreThink(id);
    if( !g_iBitHookPlayerPreThink )
    {
        DisableHamForward( g_iHhCBasePlayerPreThink );
    }

    if( !is_user_alive(id) )
    {
        // if player has not been respawned by the game, let's force it.
        ExecuteHam(Ham_Spawn, id);
        return HAM_HANDLED;
    }
    return HAM_IGNORED;
}
Вроде всё

На всякий случай скину модули для Винды и Линукса
На Виндовсе в модуле я убрал рекламку - на Линуксе - не убирал ( знаю как убрать,но не знаю как пересобрать файл .so )))
На ReHLDS данный метод неактуален,т.к. там есть квар для этого возрождения ( насколько мне известно )
 

Вложения

Последнее редактирование:

RockTheStreet

Саппорт года
Сообщения
1,744
Реакции
349
Помог
40 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
Почему бы просто не ловить плагином момент смерти и сразу респавнить игрока? Это пару строк кода, но не придётся извращаться с каким-то модулем.
 
  • Не нравится
Реакции: Ruby
Сообщения
1,480
Реакции
1,476
Помог
2 раз(а)
Почему бы просто не ловить плагином момент смерти и сразу респавнить игрока?
Было бы это так на HLDS, и этот метод был бы действительно рабочий - этой статьи бы не было
 

RockTheStreet

Саппорт года
Сообщения
1,744
Реакции
349
Помог
40 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
Этот - это какой?
Код:
#include <amxmodx>
#include <amxmisc>
#include <hamsandwich>

public plugin_init ()
{
    register_plugin("death and respawn", "0", "gay-cs");
    RegisterHam(Ham_Killed,"player","death");
}

public death()
{
    set_task(1.0, "death2", 1,_,_)
}

public death2(victim)
{
    ExecuteHam(Ham_CS_RoundRespawn, victim);
}
Накидал на скорую руку, проверил на тестовом сервере. Итог: работает без проблем.
Так в чём у тебя заключалась трудность, раз пришлось использовать такие свистоперделки с модулем?
 

Ayk

Сообщения
763
Реакции
476
Помог
19 раз(а)
Почему бы просто не ловить плагином момент смерти и сразу респавнить игрока? Это пару строк кода, но не придётся извращаться с каким-то модулем.
А тут не про смерть идет речь. Тут про респавн после выбора команды. Две разные вещи.
 
Сообщения
2,291
Реакции
1,737
Помог
31 раз(а)
Ayk,
человек просто читает настолько быстро, что пропускает слова и не улавливает суть. Наверно торопится задизморалить или заминусовать
 
  • Нравится
Реакции: Ayk

RockTheStreet

Саппорт года
Сообщения
1,744
Реакции
349
Помог
40 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
Тут про респавн после выбора команды
Пусть и так. Но откуда информацию у ТС'а, что 'метод' нерабочий?
Знакомому делал для JailBreak, что после выбора команды игрока воскрешало в определённом режиме(там у мода свои свистоперделки). Проблем с этим никаких не возникало.

Теперь вопрос в том, нужна-ли данная тема вообще, или же лучше воспользоваться головой?

человек просто читает настолько быстро
Хотя бы читать умею.
Да и не мне судить вас, Модераторов(обязательно в большой буквы). Вам же законы не писаны.
 
Сообщения
1,480
Реакции
1,476
Помог
2 раз(а)
Но откуда информацию у ТС'а, что 'метод' нерабочий?
Тот код я проверял множество раз - он не работает ( Коннора )

Если ты о тех словах,что я писал
Было бы это так на HLDS, и этот метод был бы действительно рабочий - этой статьи бы не было
Поэтому я и сказал,что плагином без всяких там модульных костылей это сделать наверное очень трудно или попросту невозможно
Ну и я незнаю,что ты там делал знакомому на Джаил )
 

RockTheStreet

Саппорт года
Сообщения
1,744
Реакции
349
Помог
40 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
Сообщения
1,480
Реакции
1,476
Помог
2 раз(а)
RockTheStreet,
Я думаю,что Bailopan не просто так сделал эту реализацию респауна модулем,а не плагином... раз уж сколько времени прошло с 2008 года и никто этого не увидел отдельным плагином в свободном доступе для HLDS ?
 
Сообщения
327
Реакции
289
Помог
9 раз(а)
Если же есть карты по типу gg_ - то тут всё - приехали
Никакого сценария здесь нет,и Вы просто ждёте будучи мёртвым,когда закончится текущая карта - до следующей...
Ничего подобного.
 
Сообщения
2,291
Реакции
1,737
Помог
31 раз(а)
MayroN, Играл часто на ГГ серверах и никаких проблем при заходе не было, сразу включался в игру
10 Авг 2021
MayroN, и вообще зачем инвалидную коляску пинать? Пользуйтесь современными инструментами
 

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

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