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

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

Сообщение s1lent » 06 авг 2014, 18:29

Обновлено 2.1

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

[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
[spoiler]
Код: Выделить всё
#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
[/spoiler]

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

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

  2. #include <amxmodx>

  3. #include <roundcontrol>

  4.  

  5. public plugin_init() {

  6.         RegisterControl(Round_WinCounterTerrorist,"fwdControl_CtWins");

  7. }

  8. public fwdControl_CtWins(numWins,RoundEvent:eventRound,bool:bHasExpired) {

  9.  

  10.         if(numWins > 10) {

  11.                 return ROUND_SUPERCEDE;

  12.         }

  13.         return ROUND_CONTINUE;

  14. }

  15.  
[/pawn]

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

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

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

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


[pawn]
  1. #include <amxmodx>

  2. #include <roundcontrol>

  3.  

  4. public plugin_init() {

  5.         RegisterControl(Round_HasRoundTimeExpired,"fwdControl_HasRoundTimeExpired");

  6. }

  7. public fwdControl_HasRoundTimeExpired(RoundControlWin:teamWins,numWins,RoundEvent:event

  8. Round) {

  9.  

  10.         if(teamWins == WINSTATUS_TERRORIST && numWins > 5) {

  11.                 return ROUND_SUPERCEDE;

  12.         }

  13.         return ROUND_CONTINUE;

  14. }
[/pawn]

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

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

Сообщение PRoSToTeM@ » 06 авг 2014, 18:43

Это по идее уже модуль для работы с GameRules.
Аватара пользователя
PRoSToTeM@
Скриптер
 
Сообщения: 2498
Зарегистрирован: 26 мар 2010, 00:12
Благодарил (а): 438 раз.
Поблагодарили: 1125 раз.

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

Сообщение s1lent » 06 авг 2014, 18:47

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

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

Сообщение draft » 21 авг 2014, 05:38

Тестировал 2.0 и 2.1, билд 6027 linux,
Код: Выделить всё
      description      stat pend  file              vers      src  load  unlod
 [ 1] dproto_EF        RUN   -    dproto_i386.so    v0.9.369  ini  Start Never
 [ 2] AMX Mod X        RUN   -    amxmodx_mm_i386.  v1.8.2-d  ini  Start ANY
 [ 3] RoundControl     RUN   -    roundcontrol_amx  v2.1      pl2  ANY   ANY
 [ 4] FakeMeta         RUN   -    fakemeta_amxx_i3  v1.8.2    pl2  ANY   ANY
4 plugins, 4 running
amx plugins
status
hostname:  Half-Life
version :  48/1.1.2.7/Stdio 6027 secure  (10)
tcp/ip  :  146.255.193.50:50001
map     :  de_dust2 at: 0 x, 0 y, 0 z
players :  2 active (16 max)

#      name userid uniqueid frag time ping loss adr
# 1 "Player" 1 VALVE_4:4:414513395   1 37:51   11    0 94.19.53.152:26769
# 2   "test" 5 BOT   0 38:00    0    0

Делал всё по мануалу блокировки раунда через Round_CheckWinConditions (там, кстати, ошибка в client_print \" \" - кавычки нужно убрать или исправить на ^", отсюда я сразу и понял, что код не тестил) - так вот, этот форвард не работает, соответственно, раунд полностью заблокировать невозможно, потому что остальные форварды не покрывают события "Game commencing", "Round Draw".
Но есть и хорошая новость - зато остальные форварды работают и не нужен Орфей для доступа к оффсетам, так что за работу спасибо :) Но очень нужен фикс форварда окончания раунда, по исходникам я ошибку не нашёл, но там и версия не свежая.
Аватара пользователя
draft
 
Сообщения: 10
Зарегистрирован: 05 фев 2010, 09:52
Благодарил (а): 2 раз.
Поблагодарили: 3 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6

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

Сообщение s1lent » 21 авг 2014, 09:30

draft писал(а):Делал всё по мануалу блокировки раунда через Round_CheckWinConditions (там, кстати, ошибка в client_print \" \" - кавычки нужно убрать или исправить на ^"

[pawn]
  1. #pragma ctrlchar '\'
[/pawn]
собственно в плагин пример не вошел этот кусок.

покажи плагин пример регистрации Round_CheckWinConditions, да и какую версию модуля использовал.

draft писал(а):раунд полностью заблокировать невозможно, потому что остальные форварды не покрывают события "Game commencing", "Round Draw"

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

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

Сообщение Dmitry Beast » 21 авг 2014, 14:45

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

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

Сообщение KORD_12.7 » 21 авг 2014, 16:41

И какая же взаимосвязь между данным модулем и ВК?

_http://aghl.ru/ - Half-Life и Adrenaline Gamer: за пределами возможного
Аватара пользователя
KORD_12.7
Скриптер
 
Сообщения: 298
Зарегистрирован: 28 сен 2009, 10:14
Откуда: Владивосток
Благодарил (а): 142 раз.
Поблагодарили: 257 раз.
Опыт программирования: Больше трех лет
Языки программирования: Half-Life
Opposing Force
Adrenaline Gamer
Counter-Strike

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

Сообщение Morning Rainbow » 21 авг 2014, 21:15

KORD_12.7, это он по моей теме не попал)

BeasT, можно, API позволяет, следующий пример посвящу этому вопросу)
Аватара пользователя
Morning Rainbow
 
Сообщения: 73
Зарегистрирован: 28 июл 2013, 00:35
Откуда: ??chan
Благодарил (а): 7 раз.
Поблагодарили: 50 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6

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

Сообщение Dmitry Beast » 22 авг 2014, 00:40

Morning Rainbow писал(а):KORD_12.7, это он по моей теме не попал)

BeasT, можно, API позволяет, следующий пример посвящу этому вопросу)

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

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

Сообщение draft » 22 авг 2014, 15:10

[pawn]
  1. #include <amxmodx>

  2. #include <roundcontrol>

  3.  

  4. #define PLUGIN "Round Control Test"

  5. #define VERSION "1.0"

  6. #define AUTHOR "AImpressor"

  7.  

  8.  

  9. public plugin_init() {

  10.         register_plugin(PLUGIN, VERSION, AUTHOR)

  11.        

  12.         RegisterControl(Round_CheckWinConditions,"fwdControl_CheckWin")

  13.         RegisterControl(Round_CheckWinConditions,"fwdControl_CheckWin", 1)

  14.         RegisterControl(Round_WinCounterTerrorist,"fwdControl_CheckWin", 0)    

  15.         RegisterControl(Round_WinCounterTerrorist,"fwdControl_CheckWin", 1)    

  16.         RegisterControl(Round_WinTerrorist,"fwdControl_CheckWin", 0)   

  17.         RegisterControl(Round_WinTerrorist,"fwdControl_CheckWin", 1)   

  18.  

  19. }

  20.  

  21.  

  22. public fwdControl_CheckWin(numWins, RoundEvent:eventRound, bool:bHasExpired) {  

  23.         client_print(0, print_chat, "* Event: %d: score: %d bytimer: %d",

  24.         eventRound, numWins, bHasExpired)

  25. }

  26.  
[/pawn]
Вот плагин, показывающий, что хук на событие Round_CheckWinConditions работает неправильно. Сам хук окончания раунда срабатывает, а вот значения Event, score, bytimer - неправильные, никак не связаны с параметрами окончания раунда, всегда показывает одно и тоже. А при смене карты эти значения меняются, вообще, на другие :-D
При этом Round_WinCounterTerrorist, Round_WinTerrorist - работают правильно, поэтому специально включил их в код для проверки.
Версии модуля 2.0 и 2.1 я пробовал, но отличие я увидел только в существенной разнице размера модуля для Windows (в 2.0 был намного меньше).

Добавлено спустя 7 минут 47 секунд:
И ещё хотел задать вопрос. В коде модуля я нашёл функцию StartFrame и в ней в начале HasRoundTimeExpired - я правильно понял, что этот плагин проверяет события окончания времени раунда в каждом фрейме? Разве это оптимальный метод? Особенно, если учесть, что в функции IsBombPlanted, которая проверяется внутри HasRoundTimeExpired после
Код: Выделить всё

   if(TimeRemaining() > 0 || *(int *)((char *)g_pGameRules + OFFSET_GAME_ROUND_WIN_INT))
      return FALSE;
         return IsBombPlanted() != true;

имеется следующее:
Код: Выделить всё

while((pGrenade = findEntityByClassname(pGrenade,"grenade")) != NULL) {
         if(*(bool *)((char *)pGrenade->pvPrivateData + OFFSET_IS_C4)) {
            return true;
         }
      }

То есть, если установлена бомба, то имеем прогон по всем entity со строковой проверкой classname и всё это внутри startframe, который вызывается ~1000 раз в секунду?!
Аватара пользователя
draft
 
Сообщения: 10
Зарегистрирован: 05 фев 2010, 09:52
Благодарил (а): 2 раз.
Поблагодарили: 3 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6

Пред.След.

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

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

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