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

[Модуль 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

Сообщение trollface » 05 май 2014, 18:47

plamont,
не завелся модуль ...
version
Protocol version 48
Exe version 1.1.2.7 (cstrike)
Exe build: 11:17:24 Aug 8 2013 (6132)
meta list
Currently loaded plugins:
description stat pend file vers src load unlod
[ 1] AMX Mod X RUN - amxmodx_mm.dll v1.8.3-d ini Start ANY
[ 2] dproto_EF RUN - dproto.dll v0.9.383 ini Start Never
[ 3] POD-Bot mm RUN - podbot_mm.dll vV3B22 ini Chlvl ANY
[ 4] Ham Sandwich RUN - hamsandwich_amxx v1.8.3-d pl1 ANY ANY
[ 5] FakeMeta RUN - fakemeta_amxx.dl v1.8.3-d pl1 ANY ANY
[ 6] CStrike RUN - cstrike_amxx.dll v1.8.3-d pl1 ANY ANY
6 plugins, 6 running
amxx modules
Currently loaded modules:
name version author status
[ 1] unknown unknown unknown bad load
[ 2] Ham Sandwich 1.8.3-dev+ AMX Mod X Dev Team running
[ 3] FakeMeta 1.8.3-dev+ AMX Mod X Dev Team running
[ 4] CStrike 1.8.3-dev AMX Mod X Dev Team running
4 modules, 3 correct
Аватара пользователя
trollface
 
Сообщения: 13
Зарегистрирован: 04 апр 2014, 15:53
Откуда: Moscow
Благодарил (а): 6 раз.
Поблагодарили: 1 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6

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

Сообщение s1lent » 05 май 2014, 18:50

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

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

Сообщение trollface » 05 май 2014, 19:05

plamont, win 8
Аватара пользователя
trollface
 
Сообщения: 13
Зарегистрирован: 04 апр 2014, 15:53
Откуда: Moscow
Благодарил (а): 6 раз.
Поблагодарили: 1 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6

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

Сообщение Safety1st » 05 май 2014, 19:25

plamont, мб у него просто C++ Runtime нужного не хватает...
GoldSrc Gaming Community
Аватара пользователя
Safety1st
 
Сообщения: 1958
Зарегистрирован: 08 окт 2011, 05:41
Откуда: Moscow
Благодарил (а): 1690 раз.
Поблагодарили: 931 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6
Half-Life

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

Сообщение s1lent » 05 май 2014, 19:30

Developer писал(а):plamont, мб у него просто C++ Runtime нужного не хватает...


#define PSAPI_VERSION 1

студио старое)

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

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

Сообщение Safety1st » 05 май 2014, 20:39

Вообще запретили редактировать свои посты спустя некоторое время ((

Об изменениях в новой версии расскажете?

И раз уж пишу - спрошу заранее.
Код: Выделить всё
/**
 * Подтвердить, что событие "#Game_Commencing" уже было.
 * Для предотвращения следующих "Game_Commencing"
 */
native RC_Commencing();

О каких последующих "Game_Commencing" речь? Где такой функционал может пригодиться на ваш взгляд?

В ближайшее время собираюсь переделать 'Force Round End' на использование вашего модуля для красивого завершения затянувшихся раундов. Будет ещё 1 пример применения ;)
GoldSrc Gaming Community
Аватара пользователя
Safety1st
 
Сообщения: 1958
Зарегистрирован: 08 окт 2011, 05:41
Откуда: Moscow
Благодарил (а): 1690 раз.
Поблагодарили: 931 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6
Half-Life

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

Сообщение s1lent » 05 май 2014, 20:57

Developer писал(а):Об изменениях в новой версии расскажете?

ну я и написал что именно изменил)
только дефайн
#define PSAPI_VERSION 1


Developer писал(а):И раз уж пишу - спрошу заранее.
Код: Выделить всё
/**
 * Подтвердить, что событие "#Game_Commencing" уже было.
 * Для предотвращения следующих "Game_Commencing"
 */
native RC_Commencing();

О каких последующих "Game_Commencing" речь? Где такой функционал может пригодиться на ваш взгляд?


точно знаю что применимо для дезрана, когда заходят игроки кт и при этом нет террориста.
по умолчанию идет отсчет и выбирается террорист из кт игроков, произошел рестарт.
движок мода не знает, что игра начата, т.к коннект, захода за тера не происходило, а тупо перевод кт за тера и рестарт.
И поэтому когда кто-то погибает или заходит в игру, в этот момент в игре происходит тот самый GameCommencing,
а так если выполнить RC_GameCommencing(), предотвратили бы в этот момент GameCommencing.
Два-три рестарта происходит именно из-за GameCommencing, а может только два.
В других случаях я не знаю для чего может быть полезен = )
да думаю для любых модах, режимах и прочее.
Аватара пользователя
s1lent
Скриптер
 
Сообщения: 123
Зарегистрирован: 11 июл 2011, 20:02
Откуда: Северск
Благодарил (а): 32 раз.
Поблагодарили: 110 раз.

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

Сообщение Safety1st » 05 май 2014, 21:18

Что я могу добавить к этому:

'Game_Commencing' как logevent идёт пачкой из 2-х:
Код: Выделить всё
World triggered "Game_Commencing"
World triggered "Game_Commencing" (CT "0") (T "24")

и после него всегда logevent
Код: Выделить всё
World triggered "Round_End"


--

Т.е. RC_GameCommencing() - для разового применения, когда есть необходимость заблокировать "Game_Commencing" 'на ближайшие секунды' или блокировка перманентная?
GoldSrc Gaming Community
Аватара пользователя
Safety1st
 
Сообщения: 1958
Зарегистрирован: 08 окт 2011, 05:41
Откуда: Moscow
Благодарил (а): 1690 раз.
Поблагодарили: 931 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6
Half-Life

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

Сообщение s1lent » 05 май 2014, 21:34

Developer писал(а):RC_GameCommencing() - для разового применения, когда есть необходимость заблокировать "Game_Commencing" 'на ближайшие секунды'


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

След.

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

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

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