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

Orpheu: Работа с объектом GameRules

Статьи или фрагменты кода для новичков и уже опытных скриптеров по AMXX.

Модератор: Chuvi

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

В данном разделе форума разрешено создавать темы, касающие только обучающему материалу по AMX Mod X.

Orpheu: Работа с объектом GameRules

Сообщение DJ_WEST » 13 апр 2010, 14:43

Авторы: joaquimandrade, DJ_WEST

Данная статья использует возможности модуля Вы должны зарегистрироваться, чтобы видеть ссылки., поэтому для правильной работы описанных вещей необходима его установка на ваш сервер.
В играх, базирующихся на движке Half-Life, часть событий и правил сгруппированы в объекте GameRules. joaquimandrade собрал коллекцию виртуальных функций этого объекта для различных модов, что позволяет использовать их при скриптинге в своих плагинах.

1. Получение указателя на объект.
Прежде всего для начала работы с нужными нами функциями необходимо получить объект CGameRules:
Код: Выделить всё
#include <amxmodx>
#include <orpheu>
#include <orpheu_stocks>

// Создаем переменную для хранения указателя на объект GameRules
new g_pGameRules

// Регистрируем хук установки объекта в игре на функцию OnInstallGameRules
public plugin_precache()
    OrpheuRegisterHook(OrpheuGetFunction("InstallGameRules"), "OnInstallGameRules", OrpheuHookPost)

// Получаем указатель на объект GameRules и сохраняем в переменной g_pGameRules
public OnInstallGameRules()
    g_pGameRules = OrpheuGetReturn() 

Данный код перехватывает вызов функции движка InstallGameRules, которая создает нужный нам объект GameRules. Данная функция существует в каждом моде. После срабатывания перехвата функции, переменная g_pGameRules будет хранить указатель на объект, что позволит нам перехватывать и вызывать функции объекта GameRules. В TFC моде функция создания объекта немного отличается, поэтому она называется InstallGameRules_tfc (данная информация пригодится для тех, кто делает плагины для TFC).

2. Перехват вызова функций.
Рассмотрим пример перехвата вызова функции:
[pawn]GetNextBestWeapon(CBasePlayer *, CBasePlayerItem *) [/pawn]
Напишем данный код:
Код: Выделить всё
public plugin_init()
{
/* 
    g_pGameRules - указатель на объект GameRules (код получения указан выше).
    GetNextBestWeapon - название функции. Вы можете узнать названия функций из директории [i]..\configs\orpheu\virtualFunctions\CGameRules[/i]  
    CGameRules - базовый объект, который будет использоваться.
    OnGetNextBestWeapon - название нашей функции, которая будет вызываться после вызова функции движка GetNextBestWeapon.
*/
  OrpheuRegisterHookFromObject(g_pGameRules, "GetNextBestWeapon", "CGameRules", "OnGetNextBestWeapon")
}

public OnGetNextBestWeapon(i_GameRules, id, weapon_id)
{
    // i_GameRules - объект, который будет всегда передаваться в первом аргументе, но он нам не нужен, потому что у нас уже есть g_pGameRules
}

Функция GetNextBestWeapon срабатывает, к примеру, при выбросе оружия и в других определенных случаях, где id - будет игрок, который выбросил оружие, а weapon_id - выбрасываемое оружие.

3. Вызов функций.
Рассмотрим примера вызова функции:
Код: Выделить всё
GoToIntermission(void)

Напишем данный код:
Код: Выделить всё

    new OrpheuFunction
:GoToIntermission = OrpheuGetFunctionFromObject(g_pGameRules, "GoToIntermission", "CGameRules")
    // При вызове функции первым аргументом необходимо передавать g_pGameRules
    // Так как данная фунция GoToIntermission не имеет аргументов, то больше ничего передавать не нужно
    new i_Result = OrpheuCall(GoToIntermission, g_pGameRules) 

Функция GoToIntermission используется при смене карты, когда высвечивается таблица результатов и игроки не могут ничего делать.

4. Список функций.
После установки необходимого пакета с функциями, вы можете узнать аргументы каждой функции из директории ..\configs\orpheu\virtualFunctions\CGameRules. Просто откройте необходимый файл с функцией и найдите поле "arguments". Также там можно узнать, какими модами данная функция поддерживается из поля "mod".

Список поддерживаемых модов:
  • cstrike
  • czero
  • dod
  • tfc
  • ns
  • ts
  • SvenCoop
  • valve

Список функций:
Код: Выделить всё

AddToTeamScores
AllowAutoTargetCrosshair
AmmoShouldRespawn
BloodSprite
BloodStream
bodyDamage
Bubbles
BubbleTrails
BuildableBuilt
BuildableKilled
BuildMiniMap
BulletTracers
Camera
CanEntityDoDamageTo
CanHaveAmmo
CanHaveItem
CanHavePlayerItem
ChangeLevel
ChangePlayerTeam
ChangePlayerTeam_dod
CheckMapConditions
CheckWinConditions
CleanUpMap
ClientCommand
ClientCommandDeadOrAlive
ClientCommand_dod
ClientConnected
ClientDisconnected
ClientUserInfoChanged
DeadPlayerAmmo
DeadPlayerWeapons
DeathNotice
DeathNotice_dod
EndMultiplayerGame
Explosion
FAllowFlashlight
FAllowMonsters
FlAmmoRespawnTime
FlHealthChargerRechargeTime
FlHEVChargerRechargeTime
FlItemRespawnTime
FlPlayerFallDamage
FlPlayerSpawnTime
FlWeaponRespawnTime
FlWeaponTryRespawn
FPlayerCanRespawn
FPlayerCanTakeDamage
FShouldSwitchWeapon
gerVoice
GetArePlayersAllowedToJoinImmediately
GetCombatAttackingTeamNumber
GetCountdownStarted
GetGameDescription
GetGameStarted
GetGameTime
GetIndexedTeamName
GetIsClientAuthorizedToPlay
GetIsCombatMode
GetIsHamboneMode
GetIsIronMan
GetIsNSMode
GetIsTournamentMode
GetIsTrainingMode
getMapTime
GetMaxWaveTime
GetNextBestWeapon
GetPlayerSpawnSpot
GetTeamID
GetTeamIndex
getWaveTime
GiveC4
GoToIntermission
Init
InitHUD
IPointsForKill
IsAllowedToSpawn
IsClanMatch
IsClanMatchActive
IsCoOp
IsDeathmatch
IsFreezePeriod
IsMultiplayer
IsRoundFrozen
IsTeamplay
IsValidTeam
ItemShouldRespawn
Pain
PerformHardAuthorization
PlayerGotAmmo
PlayerGotItem
PlayerGotWeapon
PlayerKilled
PlayerKilled_dod
PlayerRelationship
PlayerSpawn
PlayerThink
PlayFootstepSounds
PlayTextureSounds
PopHelmet
ProcessRespawnCostForPlayer
Prone
RecalculateHandicap
RecalculateMapMode
RefreshSkillData
RemoveGuns
RestartRound
ReturnGameRules
RewardPlayerForKill
RoundReset
roundRestartSound
RoundState
ScreenFades
SelectSpawnPoint
SendMOTDToClient
SendTeamScores
ServerDeactivate
SetBloodSprite
SetBloodStream
SetbodyDamage
SetBubbles
SetBubbleTrails
SetBulletTracers
SetCamera
SetClanMatch
SetDefaultPlayerTeam
SetExplosion
SetGameStarted
SetgerVoice
SetMapChangeFromTime
setMapTime
SetPain
SetPopHelmet
SetProne
SetRestartTime
SetRocketTrail
SetRoundReset
SetroundRestartSound
SetRoundState
SetScreenFades
SetShards
SetSmoke
SetSparkShower
SetTeamScores
SetusVoice
setWaveTime
Shards
ShouldAutoAim
Smoke
SparkShower
StartTrail
TeamScores
Think
UpdateGameMode
usVoice
VoteKick
WeaponShouldRespawn


Кому интересно, то прикладываю также файл multiplay_gamerules.cpp из HL SDK, где можно найти исходники некоторых функций движка.
Не пишите мне в ЛС: если вам нужна помощь на бесплатной основе. Любые вопросы на форум.
Аватара пользователя
DJ_WEST
Администратор
 
Сообщения: 3641
Зарегистрирован: 22 авг 2009, 00:38
Благодарил (а): 48 раз.
Поблагодарили: 2209 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source
Left 4 Dead
Left 4 Dead 2

Re: Orpheu: Работа с объектом GameRules

Сообщение qpAHToMAS » 13 апр 2010, 15:03

А данная "GoToIntermission" срабатывает только когда карта меняется сама (после mp_timelimit), или же так же когда карту меняют принудительно?
Аватара пользователя
qpAHToMAS
 
Сообщения: 707
Зарегистрирован: 02 ноя 2009, 18:45
Благодарил (а): 79 раз.
Поблагодарили: 204 раз.
Языки программирования: CStrike

Re: Orpheu: Работа с объектом GameRules

Сообщение Lt.RAT » 13 апр 2010, 15:31

qpAHToMAS писал(а):А данная "GoToIntermission" срабатывает только когда карта меняется сама (после mp_timelimit), или же так же когда карту меняют принудительно?

Сейчас многие плагины сами выполняют завершение мапы, как бы эмулируя стандартный код, после чего "GoToIntermission" срабатывать не будет... Все зависит от конкретных плагинов и сразу точно ответить на этот вопрос нельзя.
Аватара пользователя
Lt.RAT
 
Сообщения: 301
Зарегистрирован: 30 сен 2009, 01:44
Благодарил (а): 4 раз.
Поблагодарили: 151 раз.
Языки программирования: Counter-Strike 1.6

Re: Orpheu: Работа с объектом GameRules

Сообщение DJ_WEST » 13 апр 2010, 15:33

А данная "GoToIntermission" срабатывает только когда карта меняется сама (после mp_timelimit), или же так же когда карту меняют принудительно?

Когда она вызывается через движок игры, то есть, когда заканчивается mp_timelimit. Если меняешь сам, то данная функция не вызывается.
Не пишите мне в ЛС: если вам нужна помощь на бесплатной основе. Любые вопросы на форум.
Аватара пользователя
DJ_WEST
Администратор
 
Сообщения: 3641
Зарегистрирован: 22 авг 2009, 00:38
Благодарил (а): 48 раз.
Поблагодарили: 2209 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source
Left 4 Dead
Left 4 Dead 2

Re: Orpheu: Работа с объектом GameRules

Сообщение KORD_12.7 » 14 апр 2010, 08:55

А можно ли с помощью орфея менять значение, которое функция возвращаяет?

Например чтобы эта функция возвращала GR_PLR_DROP_GUN_ALL (7) а не GR_PLR_DROP_GUN_ACTIVE (8):
[pawn]int CHalfLifeMultiplay::DeadPlayerWeapons( CBasePlayer *pPlayer )
{
    return GR_PLR_DROP_GUN_ACTIVE;
}
 [/pawn]

UPD
Разобрался:
[pawn]#include <amxmodx>
#include <orpheu>
#include <orpheu_stocks>

new g_pGameRules

// weapon respawning return codes
enum
{    
    GR_PLR_DROP_GUN_ALL 
= 7,
    GR_PLR_DROP_GUN_ACTIVE,
    GR_PLR_DROP_GUN_NO,

    GR_PLR_DROP_AMMO_ALL,
    GR_PLR_DROP_AMMO_ACTIVE,
    GR_PLR_DROP_AMMO_NO
}

public plugin_precache()
    OrpheuRegisterHook(OrpheuGetFunction("InstallGameRules"), "OnInstallGameRules", OrpheuHookPost)
    
public OnInstallGameRules
()
{
    g_pGameRules = OrpheuGetReturn() 
    
    OrpheuRegisterHookFromObject
(g_pGameRules, "DeadPlayerWeapons", "CGameRules", "OnDeadPlayerWeapons")
    OrpheuRegisterHookFromObject(g_pGameRules, "DeadPlayerAmmo", "CGameRules", "OnDeadPlayerAmmo")
}
 
public OrpheuHookReturn
:OnDeadPlayerWeapons(i_GameRules, id)
{
    OrpheuSetReturn(GR_PLR_DROP_GUN_ALL)
    
    return OrpheuSupercede
} 

public OrpheuHookReturn
:OnDeadPlayerAmmo(i_GameRules, id)
{
    OrpheuSetReturn(GR_PLR_DROP_AMMO_ALL)
    
    return OrpheuSupercede
} [/pawn]
В weaponbox складывается все оружие и аммо, которое было у игрока

_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: Orpheu: Работа с объектом GameRules

Сообщение DJ_WEST » 14 апр 2010, 13:50

В weaponbox складывается все оружие и аммо, которое было у игрока

Неплохая идея =)
Не пишите мне в ЛС: если вам нужна помощь на бесплатной основе. Любые вопросы на форум.
Аватара пользователя
DJ_WEST
Администратор
 
Сообщения: 3641
Зарегистрирован: 22 авг 2009, 00:38
Благодарил (а): 48 раз.
Поблагодарили: 2209 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source
Left 4 Dead
Left 4 Dead 2


Вернуться в Статьи / фрагменты кода

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

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