Русское сообщество по скриптингу

[Модуль AMXX] Round Control

Файлы и модули, которые пригодятся при скриптинге для AMX Mod X или SourceMod.
Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено выкладывать файлы или модули для AMXX/SM, которые пригодятся при программировании.

[Модуль AMXX] Round Control

Сообщение s1lent » 04 май 2014, 11:59

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(RC_CheckWinConditions,"fw_CheckWinConditions");
}
 
public 
removeHook()
{
        
UnregisterControl(RC_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_iNumSpawnableTerrorist,      // +4 int   | W.92 | L.84
   m_iNumSpawnableCT,         // +4 int   | W.96 | L.88
   m_iSpawnPointCount_Terrorist,      // +4 int   | W.100 | L.92
   m_iSpawnPointCount_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_bSkipSpawn            // +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);


Исходники:
Вы должны зарегистрироваться, чтобы видеть ссылки.
Последний раз редактировалось s1lent 01 ноя 2014, 00:28, всего редактировалось 14 раз(а).
Аватара пользователя
s1lent
Скриптер
 
Сообщения: 123
Зарегистрирован: 11 июл 2011, 20:02
Откуда: Северск
Благодарил (а): 32 раз.
Поблагодарили: 110 раз.

Re: [Модуль AMXX] Round Control

Сообщение Subb98 » 26 окт 2014, 16:19

Хотелось бы уточнить пару моментов касаемо модуля.

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

Поддержки билда версии 6153 пока так и не предусмотрено?

s1lent писал(а):прописать roundcontrol модуль в /cstrike/amxmodx/configs/plugins.ini

Именно в plugins.ini? Не в modules.ini?
«Очень хорошо. Лучше вы, чем я» © Donald J. Trump
Аватара пользователя
Subb98
Модератор
 
Сообщения: 5485
Зарегистрирован: 24 мар 2011, 19:42
Откуда: г. Пермь
Благодарил (а): 1329 раз.
Поблагодарили: 2343 раз.
Опыт программирования: Больше трех лет
Языки программирования: PHP

Re: [Модуль AMXX] Round Control

Сообщение 9iky6 » 26 окт 2014, 16:21

Subb98, 6153 тянет, проверял
Аватара пользователя
9iky6
 
Сообщения: 2174
Зарегистрирован: 30 янв 2012, 19:07
Откуда: Россия
Благодарил (а): 375 раз.
Поблагодарили: 707 раз.

Re: [Модуль AMXX] Round Control

Сообщение Safety1st » 26 окт 2014, 16:22

Subb98, работал норм на тестовом сервере с 6153.

Прописывать данный AMXX-модуль в modules.ini не нужно: плагин, его использующий, сам 'запустит' благодаря
[pawn]
  1. #pragma loadlib roundcontrol
[/pawn]
GoldSrc Gaming Community
Аватара пользователя
Safety1st
 
Сообщения: 1958
Зарегистрирован: 08 окт 2011, 05:41
Откуда: Moscow
Благодарил (а): 1690 раз.
Поблагодарили: 933 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Half-Life

Re: [Модуль AMXX] Round Control

Сообщение Dmitry Beast » 26 окт 2014, 17:08

Люди добрые, кто-нибудь, кто знает как, перекомпильте пожалуйста его под винду :-[
Аватара пользователя
Dmitry Beast
 
Сообщения: 1560
Зарегистрирован: 24 дек 2010, 10:35
Откуда: Египет
Благодарил (а): 440 раз.
Поблагодарили: 207 раз.
Опыт программирования: Больше трех лет
Языки программирования: All Languages

Re: [Модуль AMXX] Round Control

Сообщение s1lent » 26 окт 2014, 18:10

Обновлено 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, возможен для дальнейшей работы на орфее.

Subb98, опечатка видимо)
Аватара пользователя
s1lent
Скриптер
 
Сообщения: 123
Зарегистрирован: 11 июл 2011, 20:02
Откуда: Северск
Благодарил (а): 32 раз.
Поблагодарили: 110 раз.

Пред.

Вернуться в Файлы и модули

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4