Revival

DanZa

Участник
Сообщения
82
Реакции
11
Делай делай, не забывай только, что нейронка пишет с багами)
А так да, функционал у тебя шире, удачи)
Для этого и есть форум, обнаружатся баги, они исправятся, и будет всё хорошо!
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,519
Реакции
4,979
открыл код, почитал его и понял, что код - полная фигня

  • Нафига прописывать в плагине forward void Revival_OnPlayerReviving(int reviver, int target, int &frags, int &diff_hp, int &health);, когда это уже прописано в подключеном инклюде revival?
  • Нафига менять значения кваров, если для изменения значений существует сам форвард?
  • Нафига его хукать, если он срабатывает уже когда игрок вот-вот возродиться, когда тебе нужно изменить время возрождения? Т.е. когда это будет уже поздно для изменения значения скорости возрождения випом (потому как меняет её и количество попыток вообще всем, но меняет уже после первого возрождения випом).
Сообщения автоматически склеены:

Для реализации такого функционала нужно либо переписывать сам Revival добавляя интерграцию с випкой, либо, как я писал выше, просить меня добавить нативы/форварды для возможности делать такое модулями.
 

DanZa

Участник
Сообщения
82
Реакции
11
открыл код, почитал его и понял, что код - полная фигня

  • Нафига прописывать в плагине forward void Revival_OnPlayerReviving(int reviver, int target, int &frags, int &diff_hp, int &health);, когда это уже прописано в подключеном инклюде revival?
  • Нафига менять значения кваров, если для изменения значений существует сам форвард?
  • Нафига его хукать, если он срабатывает уже когда игрок вот-вот возродиться, когда тебе нужно изменить время возрождения? Т.е. когда это будет уже поздно для изменения значения скорости возрождения випом (потому как меняет её и количество попыток вообще всем, но меняет уже после первого возрождения випом).
Сообщения автоматически склеены:

Для реализации такого функционала нужно либо переписывать сам Revival добавляя интерграцию с випкой, либо, как я писал выше, просить меня добавить нативы/форварды для возможности делать такое модулями.
Прошу Вас добавить нативы и форварды для возможности создавать модули для вашего плагина
Сообщения автоматически склеены:

Для реализации такого функционала нужно либо переписывать сам Revival добавляя интерграцию с випкой, либо, как я писал выше, просить меня добавить нативы/форварды для возможности делать такое модулями.
Такой вот вопрос интересный, то что да, действительно без натива для персонального тайм-аута это невозможно, но, как человек выше смог это обойти🤔
 
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,519
Реакции
4,979
Прошу Вас добавить нативы и форварды для возможности создавать модули для вашего плагина
Добавил ещё одно поле RI_CD в нативы Revival_GetPlayerInfo и Revival_SetPlayerInfo, с помощью которого можно узнать или задать время, необходимое этому игроку, чтобы поднять другого.

Чтобы задавать это время нужно хукать изменение значения переменной sm_revival_countdown, потому как при изменении её значения будет меняться соответственно значение всем игрокам. Т.е. хукаем изменение значения этого квара, делаем таймер или лучше даже RequestFrame() и проходимся циклом по игрокам, которым нужно задать отличающееся значение.
Ну и после каждого коннекта игрока, изменения его статуса VIP или ещё в каком случае тоже меняем ему значение этого параметра через Revival_SetPlayerInfo(client, RI_CD, значение);. Потому как после дисконнекта значение будет сбрасываться на дефолтное.
Сообщения автоматически склеены:

SM1.13, режим ядра:
//// sm_revival 1.1.10_22.05.2025.sp
//
// Code size:         79420 bytes
// Data size:         180700 bytes
// Stack/heap size:      16728 bytes
// Total requirements:  276848 bytes
//
// Compilation Time: 0,17 sec
// ----------------------------------------
SM1.13, простой режим:
//// sm_revival 1.1.10_22.05.2025.sp
//
// Code size:         75916 bytes
// Data size:         179696 bytes
// Stack/heap size:      16728 bytes
// Total requirements:  272340 bytes
//
// Compilation Time: 0,16 sec
// ----------------------------------------
 

Вложения

  • revival.inc
    1.6 КБ · Просмотры: 18
  • sm_revival 1.1.10_22.05.2025.sp
    64 КБ · Просмотры: 29

Grey83

не пишу плагины с весны 2022
Сообщения
8,519
Реакции
4,979
@z1pro2012, этот пункт появляется после первого запуска плагина (нужен ещё перезапуск сервера, насколько я понимаю), начиная с определённой его версии.
Можно просто дописать в конфиг плагина, если используемая версия плагина этот квар содержит. Если версия слишком старая, то без разницы писать или нет.
Ну и этот квар отключает возрождение только в одном случае: если осталось по одному живому игроку в каждой из команд.

Если что, к плагину дуэлей это никак не относится. Для такого случая нужно либо модуль писать, либо отдельный плагин, отключающий Revival, как некоторые делают.

В случае с версией 1.1.10 и плагином дуэлей можно в момент запуска дуэли с помощью модуля пройтись циклом по игрокам, получить оставшиеся попытки, выставить глобальное значение поднятий с бесконечного на любое другое (если оно включено), выставить игрокам значение 0 оставшихся попыток и по завершению дуэли вернуть как было до этого.
 

Synd1qate

Участник
Сообщения
744
Реакции
259
не относится - но помагает, раньше ставил этот квар, чтобы при 1х1 не могли поднимать и работало. (плагин дуелей Weapon Fight)
Так он и будет работать, он выключает возрождения при 1на1, но именно к плагину дуэлей не имеет отношения
 

Endless Moon.

Что-то да умею..
Сообщения
368
Реакции
69
помогите как сделать что бы во время дуэли 1 на 1 нельзя было воскрещать игроков
C-подобный:
#pragma semicolon 1

#include <weaponfight>

char
    sPluginName[92] = "здесь_название_плагина.smx";

public int WeaponFight_DuelStart()
{
    ServerCommand("sm plugins unload %s", sPluginName);
}

public int WeaponFight_DuelEnd()
{
    ServerCommand("sm plugins load %s", sPluginName);
}
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,519
Реакции
4,979
Для WeaponFight (хз что за плагин с таким инклюдом, не нашёл) код должен выглядеть примерно так:
SM1.13:
#pragma semicolon 1
#pragma newdecls required

#include <revival>
#include <weaponfight>

enum
{
    RI_Revives,    // How many times during this round the player reviveded others
    RI_Revived,    // How many times during this round the player was reviveded by others
    RI_Target,    // Player's current target for revive
    RI_Percents,// Progress in reviving the target
    RI_CD        // Time reviving in seconds
};

ConVar
    sm_revival_times;
bool
    bRevival;
int
    iUses[MAXPLAYERS+1] = {-1, ...};

public void OnAllPluginsLoaded()
{
    if(!LibraryExists("revival"))
        return;

    bRevival = true;
    sm_revival_times = FindConVar("sm_revival_times");
}

public void OnLibraryRemoved(const char[] name)
{
    if(!strcmp(name, "revival")) bRevival = false;
}

public void OnClientDisconnect(int client)
{
    iUses[client] = -1;    // помечаем счётчик неиспользуемым для вышедшего игрока
}

public int WeaponFight_DuelStart()
{
    if(!bRevival || (!sm_revival_times && !(sm_revival_times = FindConVar("sm_revival_times"))))
        return 0;

    iUses[0] = sm_revival_times.IntValue;    // сохраняем текущее значение квара
    sm_revival_times.IntValue = 1;            // ставим ему минимальное значение

    for(int i; ++i <= MaxClients;) if(IsClientInGame(i) && IsPlayerAlive(i))
    {
        iUses[i] = Revival_GetPlayerInfo(i, RI_Revives);    // сохраняем счётчик игрока
        Revival_SetPlayerInfo(i, RI_Revives, 0x7FFFFFFF);    // устанавливаем максимальное знаковое 32-битное значение =)
    }
}

public int WeaponFight_DuelEnd()
{
    if(!bRevival || !sm_revival_times)
        return 0;

    sm_revival_times.IntValue = iUses[0];    // возвращаем значение квару

    for(int i; ++i <= MaxClients;) if(iUses[i] != -1 && IsClientInGame(i))
        Revival_SetPlayerInfo(i, RI_Revives, IsPlayerAlive(i) ? iUses[i] : 0);    // возвращаем счётчик игрока к предыдущему значению
}
Должно работать, кстати, с плагином Revival начиная с версии 1.1.5_16.10.2021, где я добавил натив Revival_SetPlayerInfo().
 

Synd1qate

Участник
Сообщения
744
Реакции
259
Для WeaponFight (хз что за плагин с таким инклюдом, не нашёл) код должен выглядеть примерно так:
SM1.13:
#pragma semicolon 1
#pragma newdecls required

#include <revival>
#include <weaponfight>

enum
{
    RI_Revives,    // How many times during this round the player reviveded others
    RI_Revived,    // How many times during this round the player was reviveded by others
    RI_Target,    // Player's current target for revive
    RI_Percents,// Progress in reviving the target
    RI_CD        // Time reviving in seconds
};

ConVar
    sm_revival_times;
bool
    bRevival;
int
    iUses[MAXPLAYERS+1] = {-1, ...};

public void OnAllPluginsLoaded()
{
    if(!LibraryExists("revival"))
        return;

    bRevival = true;
    sm_revival_times = FindConVar("sm_revival_times");
}

public void OnLibraryRemoved(const char[] name)
{
    if(!strcmp(name, "revival")) bRevival = false;
}

public void OnClientDisconnect(int client)
{
    iUses[client] = -1;    // помечаем счётчик неиспользуемым для вышедшего игрока
}

public int WeaponFight_DuelStart()
{
    if(!bRevival || (!sm_revival_times && !(sm_revival_times = FindConVar("sm_revival_times"))))
        return 0;

    iUses[0] = sm_revival_times.IntValue;    // сохраняем текущее значение квара
    sm_revival_times.IntValue = 1;            // ставим ему минимальное значение

    for(int i; ++i <= MaxClients;) if(IsClientInGame(i) && IsPlayerAlive(i))
    {
        iUses[i] = Revival_GetPlayerInfo(i, RI_Revives);    // сохраняем счётчик игрока
        Revival_SetPlayerInfo(i, RI_Revives, 0x7FFFFFFF);    // устанавливаем максимальное знаковое 32-битное значение =)
    }
}

public int WeaponFight_DuelEnd()
{
    if(!bRevival || !sm_revival_times)
        return 0;

    sm_revival_times.IntValue = iUses[0];    // возвращаем значение квару

    for(int i; ++i <= MaxClients;) if(iUses[i] != -1 && IsClientInGame(i))
        Revival_SetPlayerInfo(i, RI_Revives, IsPlayerAlive(i) ? iUses[i] : 0);    // возвращаем счётчик игрока к предыдущему значению
}
Должно работать, кстати, с плагином Revival начиная с версии 1.1.5_16.10.2021, где я добавил натив Revival_SetPlayerInfo().
 

Вложения

  • weaponfight.inc
    882 байт · Просмотры: 6

Endless Moon.

Что-то да умею..
Сообщения
368
Реакции
69
Для WeaponFight (хз что за плагин с таким инклюдом, не нашёл) код должен выглядеть примерно так:
SM1.13:
#pragma semicolon 1
#pragma newdecls required

#include <revival>
#include <weaponfight>

enum
{
    RI_Revives,    // How many times during this round the player reviveded others
    RI_Revived,    // How many times during this round the player was reviveded by others
    RI_Target,    // Player's current target for revive
    RI_Percents,// Progress in reviving the target
    RI_CD        // Time reviving in seconds
};

ConVar
    sm_revival_times;
bool
    bRevival;
int
    iUses[MAXPLAYERS+1] = {-1, ...};

public void OnAllPluginsLoaded()
{
    if(!LibraryExists("revival"))
        return;

    bRevival = true;
    sm_revival_times = FindConVar("sm_revival_times");
}

public void OnLibraryRemoved(const char[] name)
{
    if(!strcmp(name, "revival")) bRevival = false;
}

public void OnClientDisconnect(int client)
{
    iUses[client] = -1;    // помечаем счётчик неиспользуемым для вышедшего игрока
}

public int WeaponFight_DuelStart()
{
    if(!bRevival || (!sm_revival_times && !(sm_revival_times = FindConVar("sm_revival_times"))))
        return 0;

    iUses[0] = sm_revival_times.IntValue;    // сохраняем текущее значение квара
    sm_revival_times.IntValue = 1;            // ставим ему минимальное значение

    for(int i; ++i <= MaxClients;) if(IsClientInGame(i) && IsPlayerAlive(i))
    {
        iUses[i] = Revival_GetPlayerInfo(i, RI_Revives);    // сохраняем счётчик игрока
        Revival_SetPlayerInfo(i, RI_Revives, 0x7FFFFFFF);    // устанавливаем максимальное знаковое 32-битное значение =)
    }
}

public int WeaponFight_DuelEnd()
{
    if(!bRevival || !sm_revival_times)
        return 0;

    sm_revival_times.IntValue = iUses[0];    // возвращаем значение квару

    for(int i; ++i <= MaxClients;) if(iUses[i] != -1 && IsClientInGame(i))
        Revival_SetPlayerInfo(i, RI_Revives, IsPlayerAlive(i) ? iUses[i] : 0);    // возвращаем счётчик игрока к предыдущему значению
}
Должно работать, кстати, с плагином Revival начиная с версии 1.1.5_16.10.2021, где я добавил натив Revival_SetPlayerInfo().
Это стандартный плагин дуэли из ПУ Арены.
Я забыл уточнить, каким плагином для дуэли человек пользуется. Почему-то предположил, что таким же, как и я)

У меня выгружает и загружает плагины, которые мне нужно без проблем. В начале дуэли и в конце. Проблем не наблюдал)
Сообщения автоматически склеены:

У тебя прям само совершенство. У меня быстрокорявоужасно, а у тебя всё прекрасно и красиво. Как всегда 😊👍
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,519
Реакции
4,979
Проблем не наблюдал)
Если установлено количество поднятий за раунд и не выключается подъём по окончанию раунда, то после выгрузки/загрузки плагина уже должны начинаться проблемы. Т.к. счётчики будут сбиваться.
 

Endless Moon.

Что-то да умею..
Сообщения
368
Реакции
69
Если установлено количество поднятий за раунд и не выключается подъём по окончанию раунда, то после выгрузки/загрузки плагина уже должны начинаться проблемы. Т.к. счётчики будут сбиваться.
У меня стоит 3 поднятия за раунд, выгружаю и загружаю обратно, вроде точно так же 3 остаётся в след. раунде. На днях проверю даже, может внимание не обращал просто.
 

Endless Moon.

Что-то да умею..
Сообщения
368
Реакции
69
я не про следующий
Сейчас вот обнаружил, что да, есть небольшая проблемка. После завершения дуэли, плагин загружается обратно, но поднимать нельзя игроков и иконки исчезают. Только в след. раунде всё работает как должно. Ты об этом писал, я правильно понимаю?)
 

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
Как можно исправить проблему?
Если перезагрузить плагин через консоль сервера, то для всех игроков которые были на сервер настройки в clientprefs меняются, например поднимать вместо автоматического режима можно только сидя, прогресс бар тоже выключается. Юзаю ласт версию ядра
 
Сверху Снизу