Правила форума Гаранты форума
Размещение рекламы AMX-X компилятор

Здравствуйте, гость Вход | Регистрация

Наши новости:

14-дек
24-апр
10-апр
11-апр

2 страниц V   1 2

[AMXX Module] RoundControl

, Управление раундами, форсация окончания раунда
Статус пользователя s1lent
сообщение 20.5.2014, 14:29
Сообщение #1
Стаж: 14 лет

Сообщений: 440
Благодарности: выкл.

RoundControl


Автор: s1lent
Весрия: 2.2

Описание: В основном модуль предназначен для разработчиков, как отдельный инструмент для работы с раундами. Модуль умеет - блокировать полностью раунд, принудительно завершать раунд (Победа CT, T, НИЧЬЯ), блокировать конец раунда по собственному желанию в нужный момент.
Также снимает ограничение с CVAR mp_roundtime, можно ставить 500 минут, выше не советую - собьется HUD.

Поддерживаемые версии HLDS:
- Windows 5758,6027,6132
- Linux 5787,6027,6132

Установка:
roundcontrol_amxx.dll | roundcontrol_amxx_i386.so положить в папку /cstrike/amxmodx/modules/
и прописать roundcontrol модуль в /cstrike/amxmodx/configs/modules.ini

API:

Блокировка окончания раунда
Возможность заблокировать окончание раунда только в нужный момент используя совместно с плагином.

Регистрируем форвард
Код:
public plugin_init()
{
RegisterControl(RC_CheckWinConditions,"fw_CheckWinConditions");
}


Уничтожение форварда
Код:
new RoundControlHook:g_pWinCondHook;

public plugin_init()
{
g_pWinCondHook = RegisterControl(Round_CheckWinConditions,"fw_CheckWinConditions");
}

public removeHook()
{
UnregisterControl(Round_CheckWinConditions,g_pWinCondHook);
}


Функция CheckWinConditions, вызывается когда заканчивается раунд, игрок заходит в игру или меняет команду.

ROUND_CONTINUE - Продолжает выполнение функции, в нашем случае произойдет конец раунда.
ROUND_SUPERCEDE - Блокирует дальнейшее выполнение функции, окончание раунда будет заблокирован.

Код:
public fw_CheckWinConditions()
{
client_print(0,print_chat,"* Forward \"CheckWinConditions\" called.");
if(g_pBlockEnd) // Предположим у нас свой мод и g_pBlockEnd == true, раунд не будет завершаться, пока g_pBlockEnd снова не станет false.
{
return ROUND_SUPERCEDE;
}
return ROUND_CONTINUE;
}


roundcontrol.inc

Код
#if defined _roundcontrol_included
    #endinput
#endif

#define _roundcontrol_included

#if AMXX_VERSION_NUM >= 175
    #pragma reqlib roundcontrol
    #if !defined AMXMODX_NOAUTOLOAD
        #pragma loadlib roundcontrol
    #endif
#else
    #pragma library roundcontrol
#endif

#define DONT_REG            -1
#define BLOCK_BOTH            0
#define BLOCK_ONLY_EXPIRED        1

#define FLAG_RETRACT_EXPIRED        (1<<0)                            /* Этот флаг убирает перехват функции HasRoundTimeExpired за ненадобностью. */

#define RC_NONE                0
#define RC_SOUND            (1<<0)                            /* Воспроизводить звук победы. */
#define RC_MESSAGE            (1<<1)                            /* Сообщение окончания раунда. ( Автоматически составляет сообщение по событии eventid ) */
#define RC_SCORE            (1<<2)                            /* Прибавлять команде победные очки. */

#define RC_ALL_AUTO            (RC_SOUND|RC_SCORE)
#define RC_ALL_CUSTOM            (RC_SOUND|RC_MESSAGE|RC_SCORE)

#define ROUND_CONTINUE            0                            /* Продолжает выполнение функции */
#define ROUND_SUPERCEDE            4                            /* Блокирует дальнейшее выполнение функции */

enum (+= 4)
{
    m_bFreezePeriod = 4,
    m_bBombDropped,

    m_flRestartRoundTime = 48,        // +4 float    | W.48 | L.40
    m_flCheckWinConditions,            // +4 float    | W.52 | L.44
    m_fRoundCount,                // +4 float    | W.56 | L.48
    m_iRoundTime,                // +4 int    | W.60 | L.52
    m_iRoundTimeSecs,            // +4 int    | W.64 | L.56
    m_iIntroRoundTime,            // +4 int    | W.68 | L.60
    m_fIntroRoundCount,            // +4 int    | W.72 | L.64
    m_iAccountTerrorist,            // +4 int    | W.76 | L.68
    m_iAccountCT,                // +4 int    | W.80 | L.68
    m_iNumTerrorist,            // +4 int    | W.84 | L.76
    m_iNumCT,                // +4 int    | W.88 | L.80
    m_iNumScodeableTerrorist,        // +4 int    | W.92 | L.84
    m_iNumScodeableCT,            // +4 int    | W.96 | L.88
    m_iScodePointCount_Terrorist,        // +4 int    | W.100 | L.92
    m_iScodePointCount_CT,            // +4 int    | W.104 | L.96
    m_iHostagesRescued,            // +4 int    | W.108 | L.100
    m_iHostagesTouched,            // +4 int    | W.112 | L.104
    m_iRoundWinStatus,            // +4 int    | W.116 | L.108
    m_iNumCTWins,                // +2 short    | W.120 | L.112
    m_iNumTerroristWins = 122,        // +2 short    | W.122 | L.114
    m_bTargetBombed = 124,            // +1 bool    | W.124 | L.116
    m_bBombDefused = 125,            // +1 bool    | W.125 | L.117
    m_bMapHasBombTarget = 126,        // +1 bool    | W.126 | L.118
    m_bMapHasBombZone = 127,        // +1 bool    | W.127 | L.119
    m_bMapHasBuyZone = 128,            // +1 bool    | W.128 | L.120
    m_bMapHasRescueZone = 129,        // +1 bool    | W.129 | L.121
    m_bMapHasEscapeZone = 130,        // +1 bool    | W.130 | L.122
    m_iMapHasVIPSafetyZone = 132,        // +4 int    | W.132 | L.124
    m_bMapHasCameras,            // +4 bool    | W.136 | L.128
    m_iC4Timer,                // +4 int    | W.140 | L.132
    m_iC4Guy,                // +4 int    | W.144 | L.136
    m_iLoserBonus,                // +4 int    | W.148 | L.140
    m_iNumConsecutiveCTLoses,        // +4 int    | W.152 | L.144
    m_iNumConsecutiveTerroristLoses,    // +4 int    | W.156 | L.148
    m_fMaxIdlePeriod,            // +4 int    | W.160 | L.152
    m_iLimitTeams,                // +4 int    | W.164 | L.156
    m_bLevelInitialized,            // +1 bool    | W.168 | L.160
    m_bRoundTerminating = 169,        // +1 bool    | W.169 | L.161
    m_bCompleteReset = 170,            // +1 bool    | W.170 | L.162
    m_flRequiredEscapeRatio = 172,        // +4 float    | W.172 | L.164
    m_iNumEscapers,                // +4 float    | W.176 | L.168
    m_iHaveEscaped,                // +4 float    | W.180 | L.172
    m_bCTCantBuy,                // +1 bool    | W.184 | L.176
    m_bTCantBuy = 185,            // +1 bool    | W.185 | L.177
    m_flBombRadius = 188,            // +4 float    | W.188 | L.180
    m_iConsecutiveVIP,            // +4 float    | W.192 | L.184
    m_iTotalGunCount,            // +4 int    | W.196 | L.188
    m_iTotalGrenadeCount,            // +4 int    | W.200 | L.192
    m_iTotalArmourCount,            // +4 int    | W.204 | L.196
    m_iUnBalancedRounds,            // +4 int    | W.208 | L.200
    m_iNumEscapeRounds,            // +4 int    | W.212 | L.204
    m_iMapVotes,                // +400 int    | W.216 | L.208
    m_iLastPick = 616,            // +4 int    | W.616 | L.608
    m_iMaxMapTime,                // +4 int    | W.620 | L.612
    m_iMaxRounds,                // +4 int    | W.624 | L.616
    m_iTotalRoundsPlayed,            // +4 int    | W.628 | L.620
    m_iMaxRoundsWon,            // +4 int    | W.632 | L.624
    m_iStoredSpectValue,            // +4 int    | W.636 | L.628
    m_flForceCameraValue,            // +4 float    | W.640 | L.632
    m_flForceChaseCamValue,            // +4 float    | W.644 | L.636
    m_flFadeToBlackValue,            // +4 float    | W.648 | L.640
    m_pVIP,                    // +4 pvdata    | W.652 | L.644
    VIPQueue,                // +20 pvdata    | W.656 | L.648
    m_flIntermissionEndTime = 676,        // +4 pvdata    | W.676 | L.668
    m_flIntermissionStartTime,        // +4 float    | W.680 | L.672
    m_iEndIntermissionButtonHit,        // +4 int    | W.684 | L.676
    m_tmNextPeriodicThink,            // +4 float    | W.688 | L.680
    m_bFirstConnected,            // +1 bool    | W.692 | L.684
    m_bInCareerGame = 693,            // +1 bool    | W.693 | L.685
    m_fCareerRoundMenuTime = 696,        // +4 float    | W.696 | L.688
    m_iCareerMatchWins,            // +4 int    | W.700 | L.692
    m_iRoundWinDifference,            // +4 int    | W.704 | L.696
    m_fCareerMatchMenuTime,            // +4 float    | W.708 | L.700
    m_bSkipScode                // +1 bool    | W.712 | L.704
};

enum RoundEvent
{
    EventDefault = 0,
    TargetBombed,
    VIPEscaped,
    VIPAssassinated,
    TerroristEscaped,
    CTsPreventEscape,
    EscapingTerroristNeutralized,
    BombDefused,
    CTsWin,
    TerroristWin,
    RoundDraw,
    AllHostagesRescued,
    TargetSaved,
    HostagesNotRescued,
    TerroristNotEscaped,
    VIPNotEscaped,
    GameCommencing
};

enum RoundControlWin
{
    WINSTATUS_CT = 1,
    WINSTATUS_TERRORIST,
    WINSTATUS_DRAW
};

enum RoundControlFunc
{
    /*
    * void
    */
    RC_CheckWinConditions = 0,            // (void);

    /*
     * teamWins - какая команда побеждает.
     * numWins - победные очки.
     * eventRound - событие окончание раунда.
     * bHasExpired - раунд закончился по истечению времени.
    */
    RC_RoundEnd                    // (RoundControlWin:teamWins,numWins,RoundEvent:eventRound,bool:bHasExpired)
};

/*
* Регистрация форварда
*
*/
native RoundControlHook:RegisterControl(RoundControlFunc:function,const callback[],Post = 0);

/*
* Удаление форварда
*
*/
native UnregisterControl(RoundControlFunc:function,RoundControlHook:hookid,Post = 0);

/*
* Позволяет составить условие для постоянной блокировки
*
*/
native RoundControlHook:SetBlockControl(RoundControlFunc:function,any:...);

/*
* Удаляет блокировку
*
*/
native RemoveBlockControl(RoundControlFunc:function,RoundControlHook:hookid);

/**
* Возобновляет вызов форварда
*
*/
native EnableControl(RoundControlHook:hookid,Post = 0);

/**
* Приостанавливает вызов форварда
*
*/
native DisableControl(RoundControlHook:hookid,Post = 0);

/*
* Вызов функции из gamedll, в частности функцию CheckWinConditions
* Вызов RoundEnd имитирует конце раунда
*
*/
native ExecuteControl(RoundControlFunc:function,any:...);

/*
* Действует только для RoundEnd и только в PRE
* Дает возможность изменить параметры, которые передается в функции.
*/
native SetReturnParamControl(RoundControlFunc:function,any:...);

/*
* Устанавливает особые флаги
*
*/
native SetFlagsControl(const flags = FLAG_RETRACT_EXPIRED);

/*
* Обновить табло счёта и установить/добавить очки команде.
*
*/
native RoundUpdateScoreWins(ctsWins = 0,tsWins = 0,bool:bAdd = true);

/*
* Принудительное окончание раунда.
*
* @param winStatus        Команда которая побеждает.
* @param fDelay        Время (задержка), через которое наступит следующий раунд.
* @param flags            Флаги RC_SOUND, RC_MESSAGE,RC_SCORE.
* @param sentence        Своё сообщение о победе. (По умолчанию сообщение определяется по eventid)
* @param eventid        Событие победы, "RoundEvent".
* @param numScore        Сколько очков получает побежденная команда (По умолчанию +1)
* @param bReset        Отбирать всю экипировку, фраги, смерти, победы в начале нового раунда. (Идентично sv_restart 1)
*
* @return            nothing
*/
native RoundEndForceControl(RoundControlWin:winStatus = WINSTATUS_CT,Float:fDelay = 5.0,flags = RC_ALL_CUSTOM,const sentence[] = "#Round_Draw",RoundEvent:eventid = EventDefault,numScore = 1,bool:bReset = false);

native set_pgame_int(_offset,_value,_linuxdiff = 8);

native get_pgame_int(_offset,_linuxdiff = 8);

native set_pgame_float(_offset,Float:_value,_linuxdiff = 8);

native Float:get_pgame_float(_offset,_linuxdiff = 8);

native set_pgame_short(_offset,Float:_value,_linuxdiff = 8);

native get_pgame_short(_offset,_linuxdiff = 8);

native set_pgame_bool(_offset,bool:_value,_linuxdiff = 8);

native bool:get_pgame_bool(_offset,_linuxdiff = 8);

native set_pgame_cbase(_Index_,_offset,_linuxdiff = 8);

native get_pgame_cbase(_offset,_linuxdiff = 8);

/*
* @return адрес указателя g_pGameRules
*/
native get_pgame_rules();


Принудительно завершить раунд
Код
/*
* Принудительное окончание раунда.
*
* @param winStatus        Команда которая побеждает.
* @param fDelay        Время (задержка), через которое наступит следующий раунд.
* @param flags            Флаги RC_SOUND, RC_MESSAGE,RC_SCORE.
* @param sentence        Своё сообщение о победе. (По умолчанию сообщение определяется по eventid)
* @param eventid        Событие победы, "RoundEvent".
* @param numScore        Сколько очков получает побежденная команда (По умолчанию +1)
* @param bReset        Отбирать всю экипировку, фраги, смерти, победы в начале нового раунда. (Идентично sv_restart 1)
*
* @return            nothing
*/
native RoundEndForceControl(RoundControlWin:winStatus = WINSTATUS_CT,Float:fDelay = 5.0,flags = RC_ALL_CUSTOM,const sentence[] = "#Round_Draw",RoundEvent:eventid = EventDefault,numScore = 1,bool:bReset = false);

Принудительно завершить победный раунд в пользу CT.
Код:
register_clcmd("say /ctwin","cmdCtwin");

public cmdCtwin(id)
{
RoundEndForceControl(WINSTATUS_CT);
}


Предыдущие версии:

- 1.0
Прикрепленный файл  RoundControl_1_0.zip ( 23,17 килобайт ) Кол-во скачиваний: 58

- 2.1
Прикрепленный файл  roundcontrol_2_1.zip ( 112,68 килобайт ) Кол-во скачиваний: 120



Примеры использование в других плагинах:
Плагин Force Round End от Safety1st

Исходники:
SVN Repository AGHL.RU

Текущая версия 2.2:
Прикрепленный файл  roundcontrol_2_2.zip ( 122,35 килобайт ) Кол-во скачиваний: 1486


Отредактировал: s1lent, - 31.10.2014, 22:29
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   Цитировать сообщение
Safety1st
сообщение 3.6.2014, 12:57
Сообщение #2
Стаж: 12 лет
Город: Moscow

Сообщений: 7228
Благодарностей: 8071
Полезность: 196

s1lent, чисто случайно заметил, что версия стала 1.0, а последняя на моей памяти была 0.2. Что изменилось в модуле за это 'время'? В плагине-примере увидел только добавку реакции на месседж SendAudio.

В инклуд добавьте код, с которым ему точно будет лучше:
Код
#pragma reqlib RoundControl
#if !defined AMXMODX_NOAUTOLOAD
    #pragma loadlib RoundControl
#endif

И советую в шапку внести один из рекомендуемых вариантов использования API:
Код
#tryinclude <roundcontrol>

#if !defined _roundcontrol_included
    #assert "Round Control AMXX module required for plugin!"
#endif
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя s1lent
сообщение 6.8.2014, 15:31
Сообщение #3
Стаж: 14 лет

Сообщений: 440
Благодарности: выкл.

Обновлено 2.1

- Добавлена возможность регистрировать/удалять форварды.
- Добавлены новые функции WinCounterTerrorist, WinTerrorist, HasRoundTimeExpired
- Добавлены нативы для работы с оффсетами.
- Добавлен вызов CheckWinCondition - ExecuteCheckWinCondition.
- Добавлен натив для обновление очков RoundUpdateScoreWins
- Удален натив RC_Commencing(), теперь это можно сделать оффсетом.
Код:
set_pgame_bool(m_bFirstConnected,true);


Цитата
[g/s]et_pgame_int
[g/s]et_pgame_bool
[g/s]et_pgame_float
[g/s]et_pgame_short
[g/s]et_pgame_cbase


Оффсеты CHalfLifeMultiplay

Код
#define m_bFreezePeriod            4
#define m_bBombDropped            8
                                 // for Linux -8
#define m_flRestartRoundTime        48    // +4 float    | L.40
#define m_flCheckWinConditions        52    // +4 float    | L.44
#define m_fRoundCount            56    // +4 float    | L.48
#define m_iRoundTime            60    // +4 int    | L.52
#define m_iRoundTimeSecs        64    // +4 int    | L.56
#define m_iIntroRoundTime        68    // +4 int    | L.60
#define m_fIntroRoundCount        72    // +4 int    | L.64
#define m_iAccountTerrorist        76    // +4 int    | L.68
#define m_iAccountCT            80    // +4 int    | L.72
#define m_iNumTerrorist            84    // +4 int    | L.76
#define m_iNumCT            88    // +4 int    | L.80
#define m_iNumSpawnableTerrorist    92    // +4 int    | L.84
#define m_iNumSpawnableCT        96    // +4 int    | L.88
#define m_iSpawnPointCount_Terrorist    100    // +4 int    | L.92
#define m_iSpawnPointCount_CT        104    // +4 int    | L.96
#define m_iHostagesRescued        108    // +4 int    | L.100
#define m_iHostagesTouched        112    // +4 int    | L.104
#define m_iRoundWinStatus        116    // +4 int    | L.108
#define m_iNumCTWins            120    // +2 short    | L.112
#define m_iNumTerroristWins        122    // +2 short    | L.114
#define m_bTargetBombed            124    // +1 bool    | L.116
#define m_bBombDefused            125    // +1 bool    | L.117
#define m_bMapHasBombTarget        126    // +1 bool    | L.118
#define m_bMapHasBombZone        127    // +1 bool    | L.119
#define m_bMapHasBuyZone        128    // +1 bool    | L.120
#define m_bMapHasRescueZone        129    // +1 bool    | L.121
#define m_bMapHasEscapeZone        130    // +1 bool    | L.122
#define m_iMapHasVIPSafetyZone        132    // +4 int    | L.124
#define m_bMapHasCameras        136    // +4 bool    | L.128
#define m_iC4Timer            140    // +4 int    | L.132
#define m_iC4Guy            144    // +4 int    | L.136
#define m_iLoserBonus            148    // +4 int    | L.140
#define m_iNumConsecutiveCTLoses    152    // +4 int    | L.144
#define m_iNumConsecutiveTerroristLoses    156    // +4 int    | L.148
#define m_fMaxIdlePeriod        160    // +4 int    | L.152
#define m_iLimitTeams            164    // +4 int    | L.156
#define m_bLevelInitialized        168    // +1 bool    | L.160
#define m_bRoundTerminating        169    // +1 bool    | L.161
#define m_bCompleteReset        170    // +1 bool    | L.162
#define m_flRequiredEscapeRatio        172    // +4 float    | L.164
#define m_iNumEscapers            176    // +4 float    | L.168
#define m_iHaveEscaped            180    // +4 float    | L.172
#define m_bCTCantBuy            184    // +1 bool    | L.176
#define m_bTCantBuy            185    // +1 bool    | L.177
#define m_flBombRadius            188    // +4 float    | L.180
#define m_iConsecutiveVIP        192    // +4 float    | L.184
#define m_iTotalGunCount        196    // +4 int    | L.188
#define m_iTotalGrenadeCount        200    // +4 int    | L.192
#define m_iTotalArmourCount        204    // +4 int    | L.196
#define m_iUnBalancedRounds        208    // +4 int    | L.200
#define m_iNumEscapeRounds        212    // +4 int    | L.204
#define m_iMapVotes[100]        216    // +400 int    | L.208
#define m_iLastPick            616    // +4 int    | L.608
#define m_iMaxMapTime            620    // +4 int    | L.612
#define m_iMaxRounds            624    // +4 int    | L.616
#define m_iTotalRoundsPlayed        628    // +4 int    | L.620
#define m_iMaxRoundsWon            632    // +4 int    | L.624
#define m_iStoredSpectValue        636    // +4 int    | L.628
#define m_flForceCameraValue        640    // +4 float    | L.632
#define m_flForceChaseCamValue        644    // +4 float    | L.636
#define m_flFadeToBlackValue        648    // +4 float    | L.640
#define m_pVIP                652    // +4 pvdata    | L.644
#define VIPQueue            656    // +20 pvdata    | L.648
#define m_flIntermissionEndTime        676    // +4 pvdata    | L.668
#define m_flIntermissionStartTime    680    // +4 float    | L.672
#define m_iEndIntermissionButtonHit    684    // +4 int    | L.676
#define m_tmNextPeriodicThink        688    // +4 float    | L.680
#define m_bFirstConnected        692    // +1 bool    | L.684
#define m_bInCareerGame            693    // +1 bool    | L.685
#define m_fCareerRoundMenuTime        696    // +4 float    | L.688
#define m_iCareerMatchWins        700    // +4 int    | L.692
#define m_iRoundWinDifference        704    // +4 int    | L.696
#define m_fCareerMatchMenuTime        708    // +4 float    | L.700
#define m_bSkipSpawn            712    // +1 bool    | L.704



Примеры работ с модулем:

1. Задача: Заблокировать окончание раунда на последующие раунды, если CT уже побеждали более 10 раз и т.п
Дальше раунд будет заканчиваться только в пользу T.
Код:

#include <amxmodx>
#include <roundcontrol>

public plugin_init() {
RegisterControl(Round_WinCounterTerrorist,"fwdControl_CtWins");
}
public fwdControl_CtWins(numWins,RoundEvent:eventRound,bool:bHasExpired) {

if(numWins > 10) {
return ROUND_SUPERCEDE;
}
return ROUND_CONTINUE;
}


2. Задача: Заблокировать окончание раунда по истечению времени раунда, если побеждают T и победных очков более 5.
Зарегистрировали форвард на событие, когда время раунда подошло к концу.
Если окончание раунда по времени пришло в пользу Т и если очки побед выше 5, то произойдет блокировка окончания раунда.

Существует всего 4 RoundEvent, когда раунд заканчивается по истечению времени в пользу некой команды.

Цитата
Если время раунда подошло к концу:
TargetSaved - Побеждают CT, бомба не взорвана.
TerroristNotEscaped - Побеждают CT, когда T не сбежали в точку спасения.

HostagesNotRescued - Побеждают T, когда заложники не были спасены.
VIPNotEscaped - Побеждают T, когда VIP не добежал до точки эвакуации.


Код:
#include <amxmodx>
#include <roundcontrol>

public plugin_init() {
RegisterControl(Round_HasRoundTimeExpired,"fwdControl_HasRoundTimeExpired");
}
public fwdControl_HasRoundTimeExpired(RoundControlWin:teamWins,numWins,RoundEvent:event
Round) {

if(teamWins == WINSTATUS_TERRORIST && numWins > 5) {
return ROUND_SUPERCEDE;
}
return ROUND_CONTINUE;
}



Примечание: Модуль предназначен для скриптеров, как отдельный инструмент для работы над раундами. Для работы с ним, требуется навыки и знания языка PAWN.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя s1lent
сообщение 26.10.2014, 16:10
Сообщение #4
Стаж: 14 лет

Сообщений: 440
Благодарности: выкл.

Обновлено 2.2

Добавлено новые нативы
-- SetBlockControl
-- RemoveBlockControl
-- EnableControl
-- DisableControl
-- ExecuteControl
-- SetReturnParamControl
-- SetFlagsControl
-- get_pgame_rules

Изменения
- 3 функции WinCounterTerrorist, WinTerrorist, HasRoundTimeExpired были объединены в одну функцию RC_RoundEnd

Описание
- SetBlockControl - Этот натив немного схож с нативом set_msg_block. Данный натив позволяет заблокировать событие с указанными условиями без надобности регистрировать форвард.
- RemoveBlockControl - Снимает блок от SetBlockControl

- EnableControl - Влкючает работу форварда зарегистрированный через RegisterControl
- DisableControl - Вылкючает работу форварда зарегистрированный через RegisterControl

- ExecuteControl - Вызывает функцию CheckWinCondition, если RC_RoundEnd, то заканчивает раунд с условиями.
- SetReturnParamControl - Этот натив применима внутри функции RC_RoundEnd в PRE, для изменения параметров.
- SetFlagsControl - Данный натив позволяет добавлять флаги, пока применимо добавлять флаг FLAG_RETRACT_EXPIRED, это нужно если вам не нужно в функции RC_RoundEnd параметр - bool:bExpired и для экономия ресура.
- get_pgame_rules - Возвращает указатель g_pGameRules, возможен для дальнейшей работы на орфее.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Type
сообщение 26.10.2014, 16:20
Сообщение #5
Стаж: 9 лет 5 месяцев

Сообщений: 378
Благодарностей: 130
Полезность: 284

s1lent, Спасибо,полезно для csdm.
оффтоп
С вашими знаниями,пора делать Aim Detector на мете)

Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя s1lent
сообщение 26.10.2014, 16:24
Сообщение #6
Стаж: 14 лет

Сообщений: 440
Благодарности: выкл.

Type, может быть)



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

Суть сценария такова, Террористы должны взорвать бомбу и после выжить 35 секунд.

Код:
#include <amxmodx>
#include <roundcontrol>

#define TIME_TO_ESCAPED_SECOND 35
#define TERRORIST_ESCAPED_WINS 2

new g_iRoundTime;
new gmsgidShowTimer,gmsgidRoundTime;

public plugin_init()
{
register_plugin("Scenario Bomb","1.0","s1lent");

RegisterControl(RC_RoundEnd,"fw_RoundEnd");

gmsgidShowTimer = get_user_msgid("ShowTimer");
gmsgidRoundTime = get_user_msgid("RoundTime");
}
public fw_RoundEnd(RoundControlWin:teamWins,numWins,RoundEvent:eventRound,bool:bHasExpi
red)
{
if(!get_pgame_int(m_iNumSpawnableTerrorist) || !get_pgame_int(m_iNumSpawnableCT))
{
return ROUND_CONTINUE;
}

if(eventRound != TargetBombed || bHasExpired)
{
if(bHasExpired)
SetReturnParamControl(RC_RoundEnd,WINSTATUS_TERRORIST,get_pgame_short(m_iNumTerr
oristWins) + TERRORIST_ESCAPED_WINS,TerroristEscaped,true);

set_pgame_int(m_iRoundTime,g_iRoundTime);
return ROUND_CONTINUE;
}

new Float:flCurrentTime = get_gametime();
g_iRoundTime = get_pgame_int(m_iRoundTime);

set_pgame_int(m_iRoundTime,TIME_TO_ESCAPED_SECOND);
set_pgame_float(m_fRoundCount,flCurrentTime);
set_pgame_bool(m_bTargetBombed,false);

message_begin(MSG_ALL,gmsgidShowTimer);
message_end();

message_begin(MSG_ALL,gmsgidRoundTime);
write_short(floatround(get_pgame_int(m_iRoundTime) - flCurrentTime + get_pgame_float(m_fRoundCount)));
message_end();

return ROUND_CONTINUE;
}
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Arkshine
сообщение 31.10.2014, 14:52
Сообщение #7
Стаж: 9 лет 4 месяца

Сообщений: 4
Благодарностей: 14
Полезность: 0

You did a good job s1lent. There are some good ideas. I'm here because I've seen your round_control.inc and since I'm redoing my own plugins, I got curious to see what you have done and maybe stealing being inspirated by your work. crazy.gif
It makes me think also all things related to CGameRules members/virtual functions should be supported by AMXX, probably in Ham. I guess I will give a try.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 7 раз
   + Цитировать сообщение
kritik
сообщение 31.10.2014, 15:11
Сообщение #8
Стаж: 10 лет

Сообщений: 511
Благодарностей: 708
Полезность: 0

Цитата(Arkshine @ 31.10.2014, 16:52) *
You did a good job s1lent. There are some good ideas. I'm here because I've seen your round_control.inc and since I'm redoing my own plugins, I got curious to see what you have done and maybe stealing being inspirated by your work. crazy.gif
It makes me think also all things related to CGameRules members/virtual functions should be supported by AMXX, probably in Ham. I guess I will give a try.

I think at first you must change your inadequate policies about modules without source code and no-steam. All your arguments against outdated and irrelevant.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Arkshine
сообщение 31.10.2014, 15:36
Сообщение #9
Стаж: 9 лет 4 месяца

Сообщений: 4
Благодарностей: 14
Полезность: 0

I'm not sure what you're saying that to me, this is completely unrelated to thread nor what I've said above. And I have no idea what you're talking about. sad.gif

Отредактировал: Arkshine, - 31.10.2014, 15:41
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
kritik
сообщение 31.10.2014, 15:51
Сообщение #10
Стаж: 10 лет

Сообщений: 511
Благодарностей: 708
Полезность: 0

Цитата(Arkshine @ 31.10.2014, 17:36) *
I'm not sure what you're saying that to me, this is completely unrelated to thread nor what I've said above. sad.gif

You want to use s1lent's code, but you don't want to take into account of his interests. He written whblocker module which can not be published on alliedmods because of the impossibility to open the source code for all. I think we can solve this problem.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя KORD_12.7
сообщение 31.10.2014, 15:55
Сообщение #11


Стаж: 13 лет

Сообщений: 39
Благодарностей: 57
Полезность: 753

kritik, ага, можно подумать это Аркшаин придумал все эти правила для AlliedModdders. Он сам юзает ноустим, пиратскую IDA и прочие добряки. Инфа 100%.

Отредактировал: KORD_12.7, - 31.10.2014, 15:58
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
kritik
сообщение 31.10.2014, 15:58
Сообщение #12
Стаж: 10 лет

Сообщений: 511
Благодарностей: 708
Полезность: 0

Цитата(KORD_12.7 @ 31.10.2014, 17:55) *
kritik, ага, можно подумать это Аркшаин придумал все эти правила для AlliedModdders. Он сам юзает ноустим, пиратскую иду и прочие добряки. Инфа 100%.

Опередил)) Весь аллиедмодс 6.1 иду юзает. И почти все там ноустимеры. Как текущий майнтайнер, он может что-то изменить.

Отредактировал: kritik, - 31.10.2014, 15:59
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Arkshine
сообщение 31.10.2014, 16:15
Сообщение #13
Стаж: 9 лет 4 месяца

Сообщений: 4
Благодарностей: 14
Полезность: 0

Ah, you misunderstand me. I don't intend to steal code, but maybe stealing some of ideas. I know how to code, I'm not some random beginner who copy-paste code.
Anyway, I understand your concern, but I can't do nothing. Each board has his own rules, and just because I'm the official maintainer doesn't mean I can magically change the GPL licence.
Personally, I would be okay in such situation, the author sends the source code to someone of the staff, to check its content and compiling it.Then author could use that. Fair comprise. Not sure what are the thoughts of admins (asherkin, BAILOPAN, etc) on this.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 3 раз
   + Цитировать сообщение
Статус пользователя csnet
сообщение 31.10.2014, 16:53
Сообщение #14
Стаж: 10 лет

Сообщений: 4755
Благодарностей: 3837
Полезность: 693

подлизы они такие ...



go v cs:go
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя Bloo
сообщение 31.10.2014, 16:54
Сообщение #15


Стаж: 10 лет

Сообщений: 15547
Благодарностей: 6971
Полезность: 1206

csnet, опять не поспал видимо) Это количество скачиваний нового архива)))

ps.gif что бы не плодить посты: наверняка перезалил)))
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя csnet
сообщение 31.10.2014, 16:55
Сообщение #16
Стаж: 10 лет

Сообщений: 4755
Благодарностей: 3837
Полезность: 693

я поспал. и тему читаю раз в 15 мин
ну я понимаю что он мог перезалить

Отредактировал: csnet, - 31.10.2014, 16:56


go v cs:go
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
kritik
сообщение 31.10.2014, 17:04
Сообщение #17
Стаж: 10 лет

Сообщений: 511
Благодарностей: 708
Полезность: 0

Цитата(Arkshine @ 31.10.2014, 18:15) *
Ah, you misunderstand me. I don't intend to steal code, but maybe stealing some of ideas. I know how to code, I'm not some random beginner who copy-paste code.
Anyway, I understand your concern, but I can't do nothing. Each board has his own rules, and just because I'm the official maintainer doesn't mean I can magically change the GPL licence.
Personally, I would be okay in such situation, the author sends the source code to someone of the staff, to check its content and compiling it.Then author could use that. Fair comprise. Not sure what are the thoughts of admins (asherkin, BAILOPAN, etc) on this.

I know who are you. Always be found a compromise solution. You can contact with the author of metamod to change its license, such as the LGPL. This would solve many problems. Especially now that project develops by alliedmods team. As far as I know, Jussi normally refers to the modules without source code. On her website, not all listed modules have sources.
As maintainer, your word has greater importance for alliedmods owners.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 2 раз
   + Цитировать сообщение
Статус пользователя Arkshine
сообщение 31.10.2014, 17:21
Сообщение #18
Стаж: 9 лет 4 месяца

Сообщений: 4
Благодарностей: 14
Полезность: 0

Цитата(kritik @ 31.10.2014, 17:04) *
I know who are you. Always be found a compromise solution. You can contact with the author of metamod to change its license, such as the LGPL. This would solve many problems. Especially now that project develops by alliedmods team. As far as I know, Jussi normally refers to the modules without source code. On her website, not all listed modules have sources.
As maintainer, your word has greater importance for alliedmods owners.

I honestly don't know much about GPL and such. I've asked asherkin about this and answered basically "na, lgpl would still require plugins to be under a compatible license. I also doubt the metamod license could ever change after all these years. Not like it required copyright assignment for contributions".
If metamod was part of AlliedMods project, an exception could have been granted. But he also answered me: "that said, we wouldn't - if it can't survive the source code being publicly available, it's not going to survive a cheat developer getting their hands on a binary. Decompilation is trivial". While it's a motherfucker answer, you can't deny he's right too.

Anyway, this looks like there is no immediate solution unfortunately. That's said I'm always open to suggestions.

Отредактировал: Arkshine, - 31.10.2014, 17:33
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 2 раз
   + Цитировать сообщение
kritik
сообщение 31.10.2014, 19:38
Сообщение #19
Стаж: 10 лет

Сообщений: 511
Благодарностей: 708
Полезность: 0

Цитата(Arkshine @ 31.10.2014, 19:21) *
I honestly don't know much about GPL and such. I've asked asherkin about this and answered basically "na, lgpl would still require plugins to be under a compatible license. I also doubt the metamod license could ever change after all these years. Not like it required copyright assignment for contributions".
If metamod was part of AlliedMods project, an exception could have been granted. But he also answered me: "that said, we wouldn't - if it can't survive the source code being publicly available, it's not going to survive a cheat developer getting their hands on a binary. Decompilation is trivial". While it's a motherfucker answer, you can't deny he's right too.

Anyway, this looks like there is no immediate solution unfortunately. That's said I'm always open to suggestions.

Example of changing license:
https://www.videolan.org/license/
Changing metamod license to LGPL will allow to legally support modules with any license.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
maga
сообщение 16.1.2015, 8:27
Сообщение #20
Стаж: 9 лет 7 месяцев

Сообщений: 36
Благодарностей: 23
Полезность: 0

парни поясните:
m_iNumCT
m_iAccountCT
m_iNumSpawnableCT
m_iSpawnPointCount_CT
в чем разница между ними ?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
2 страниц V   1 2
 
Ответить в данную темуНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: