Ru/Authoring a weapon entity: Difference between revisions

From Valve Developer Community
< Ru
Jump to navigation Jump to search
m (WisdomBot moved page Authoring a weapon entity:ru to Authoring a weapon entity/ru: Moved to {{Multipage}} compliant page name. This action was perfomed by a bot under supervision.)
m (Multipage removal)
 
(2 intermediate revisions by the same user not shown)
Line 1: Line 1:
{{langsp}}
{{LanguageBar}}
 


{{Translating|suf=:ru}}
{{Translating|suf=:ru}}
Line 5: Line 6:
{{toc-right}}
{{toc-right}}


Как не удивительно Source имеет надёжные оружейные системы. Эта статья описывает шаги необходимые для создания [[hitscan|пулевых]] и снарядных оружий и как правильно настроить их для использования в мультиплеере.
Как не удивительно Source имеет надёжные оружейные системы. Эта статья описывает шаги необходимые для создания {{L|hitscan|пулевых}} и снарядных оружий и как правильно настроить их для использования в мультиплеере.


== Общие сведения ==
== Общие сведения ==


; Большинство свойств оружия может быть сконфигурировано с помощью [[Weapon script|оружейных скриптов]]
; Большинство свойств оружия может быть сконфигурировано с помощью {{L|Weapon script|оружейных скриптов}}
: Если всё что тебе требуется - это выстреливать пули с постоянной скоростью, тебе необходимы какие-никакие навыки в программировании.
: Если всё что тебе требуется - это выстреливать пули с постоянной скоростью, тебе необходимы какие-никакие навыки в программировании.
; Оружейный огонь может быть [[Prediction|прогнозирован]] игроком и [[Lag compensation|запозданием]] сервера
; Оружейный огонь может быть {{L|Prediction|прогнозирован}} игроком и {{L|Lag compensation|запозданием}} сервера
: Обычно это выглядит как снаряды в виде ракет, гранат, и других снарядов материализующихся из воздуха на компьютерах наблюдателей.
: Обычно это выглядит как снаряды в виде ракет, гранат, и других снарядов материализующихся из воздуха на компьютерах наблюдателей.
; [[viewmodel|Моделька от первого лица]] - это отдельная сущность
; {{L|viewmodel|Моделька от первого лица}} - это отдельная сущность
: Она создается игроком и делится между всеми видами оружия.
: Она создается игроком и делится между всеми видами оружия.
; В SDK есть широкий выбор оружия для изучения
; В SDK есть широкий выбор оружия для изучения
Line 20: Line 21:
== Оружейные скрипты ==
== Оружейные скрипты ==


От [[weapon script|оружейных скриптов]] зависит много свойств оружия , включая её [[model|модель]], амуницию , звуки , размер обоймы , и имя в пользовательском интерфейсе. Использование, расширение и шифрование оружейных скриптов описано в [[Weapon script|их статье]].
От {{L|weapon script|оружейных скриптов}} зависит много свойств оружия , включая её {{L|model|модель}}, амуницию , звуки , размер обоймы , и имя в пользовательском интерфейсе. Использование, расширение и шифрование оружейных скриптов описано в {{L|Weapon script|их статье}}.


Скрипт оружия будет автоматически загружен для любого оружия с [[LINK_ENTITY_TO_CLASS()|назначенным именем класса]]. Для более лёгкого [[precache|кэширования]] ресурсов, определяемых скриптами вызовите <code>PRECACHE_WEAPON_REGISTER(имя)</code> и никаких кавычек вокруг имени класса.
Скрипт оружия будет автоматически загружен для любого оружия с {{L|LINK_ENTITY_TO_CLASS()|назначенным именем класса}}. Для более лёгкого {{L|precache|кэширования}} ресурсов, определяемых скриптами вызовите <code>PRECACHE_WEAPON_REGISTER(имя)</code> и никаких кавычек вокруг имени класса.


== Точки входа ==
== Точки входа ==
Line 29: Line 30:


; <code>ItemPreFrame()</code>
; <code>ItemPreFrame()</code>
: Вызывается перед началом движения игрока. В [[Episode Two]], решает , подходящее ли сейчас время чтобы отобразить подсказку по использованию оружия в HUD.
: Вызывается перед началом движения игрока. В {{L|Episode Two}}, решает , подходящее ли сейчас время чтобы отобразить подсказку по использованию оружия в HUD.
; <code>ItemHolsterFrame()</code>
; <code>ItemHolsterFrame()</code>
: Вызывается перед началом движения игрока, если игрок ничего не делает. В основном ничего не делает.
: Вызывается перед началом движения игрока, если игрок ничего не делает. В основном ничего не делает.
Line 44: Line 45:
== Стрельба ==
== Стрельба ==


Оружие обычно стреляет если кнопка отвечающая за +attack активна и <code>(m_flNextPrimaryAttack <= [[gpGlobals]]->curtime)</code>. Для дополнительного режима стрельбы, +attack2 и <code>m_flNext''Secondary''Attack</code> проверяются вместо предыдущей функции (?).
Оружие обычно стреляет если кнопка отвечающая за +attack активна и <code>(m_flNextPrimaryAttack <= {{L|gpGlobals}}->curtime)</code>. Для дополнительного режима стрельбы, +attack2 и <code>m_flNext''Secondary''Attack</code> проверяются вместо предыдущей функции (?).


{{todo|Как заставить NPC атаковать?}}
{{todo|Как заставить NPC атаковать?}}
Line 50: Line 51:
=== Пули ===
=== Пули ===


[[Hitscan|Пули]] выстреливаются при соответствии , где <code>[[FireBulletsInfo_t]]</code> противоречит <code>GetOwner()->FireBullets()</code>.
{{L|Hitscan|Пули}} выстреливаются при соответствии , где <code>{{L|FireBulletsInfo_t}}</code> противоречит <code>GetOwner()->FireBullets()</code>.


Если всё что вам нужно это основная атака , которая выстреливает постоянный поток пуль (Не важно отделяют их 2 или 0.2 секунды) <code>CBaseCombatWeapon</code> уже выполняет нужную работу и вам надо только написать две функции:
Если всё что вам нужно это основная атака , которая выстреливает постоянный поток пуль (Не важно отделяют их 2 или 0.2 секунды) <code>CBaseCombatWeapon</code> уже выполняет нужную работу и вам надо только написать две функции:
Line 59: Line 60:
: Конус , внутри которого пули будут иметь случайный разброс. Для него используйте <code>VECTOR_CONE_*</code> #определяет, как избежать самостоятельной работы с математикой.
: Конус , внутри которого пули будут иметь случайный разброс. Для него используйте <code>VECTOR_CONE_*</code> #определяет, как избежать самостоятельной работы с математикой.


Переходим к секции с [[#Networking|нетворкингом]] если это соответствует вашим требованиям; [[#Effects|Эффекты]] будут сделаны за вас. Иначе смотрите <code>[[FireBulletsInfo_t]]</code> за подробностями , чтобы настроить вашу собственную hitscan атаку.
Переходим к секции с [[#Networking|нетворкингом]] если это соответствует вашим требованиям; [[#Effects|Эффекты]] будут сделаны за вас. Иначе смотрите <code>{{L|FireBulletsInfo_t}}</code> за подробностями , чтобы настроить вашу собственную hitscan атаку.


=== Снаряды ===
=== Снаряды ===


Ракеты, гранаты, и другие снаряды это самостоятельные энтити которые существуют независимо (почти) от оружия из которого они вылетели. Оружие должно создать их с помощью <code>[[Create()]]</code>:
Ракеты, гранаты, и другие снаряды это самостоятельные энтити которые существуют независимо (почти) от оружия из которого они вылетели. Оружие должно создать их с помощью <code>{{L|Create()}}</code>:


<source lang=cpp>CBaseEntity::Create( "my_projectile", GetOwner()->Weapon_ShootPosition(), GetOwner()->EyeAngles(), GetOwnerEntity() );</source>
<source lang=cpp>CBaseEntity::Create( "my_projectile", GetOwner()->Weapon_ShootPosition(), GetOwner()->EyeAngles(), GetOwnerEntity() );</source>
Line 69: Line 70:
Обратите внимание , что их владелец тот же , что и владеет оружием (<code>GetOwnerEntity()</code>), а само не оружие как таковое.
Обратите внимание , что их владелец тот же , что и владеет оружием (<code>GetOwnerEntity()</code>), а само не оружие как таковое.


{{tip|Не [[Lag compensation|компенсируйте лаги]] или [[Prediction|прогнозируйте]] этот вызов - ''делай'' прогнозируемую анимацию отсутствия патронов и перезарядки для [[viewmodel]].}}
{{tip|Не {{L|Lag compensation|компенсируйте лаги}} или {{L|Prediction|прогнозируйте}} этот вызов - ''делай'' прогнозируемую анимацию отсутствия патронов и перезарядки для {{L|viewmodel}}.}}


Читайте следующее:
Читайте следующее:


* [[Projectiles|Снаряды]] (для проблем с дизайном модели снарядов)
* {{L|Projectiles|Снаряды}} (для проблем с дизайном модели снарядов)
* [[Authoring a Model Entity|Создание энтити-модели]] (для создания [[QPhysics]] энтити)
* {{L|Authoring a Model Entity|Создание энтити-модели}} (для создания {{L|QPhysics}} энтити)
* <code>[[CPhysicsProp]]</code> (для создания [[VPhysics]] энтити)
* <code>{{L|CPhysicsProp}}</code> (для создания {{L|VPhysics}} энтити)


=== Эффекты ===
=== Эффекты ===


Здесь предполагается , что вы используете [[:Category:Particle System|систему партиклов]], которая создаётся художниками. Старая технология  "закодирования партиклов намертво" никогда не документировалась.
Здесь предполагается , что вы используете {{LCategory|Particle System|систему партиклов}}, которая создаётся художниками. Старая технология  "закодирования партиклов намертво" никогда не документировалась.


==== Следы от пуль ====
==== Следы от пуль ====
Line 111: Line 112:
</source>
</source>


Код сверху позволяет создать новую [[particle system|систему частиц]] , которая подходит для эффектов одиночной стрельбы для каждой пули . Если ваше оружие стреляет быстро рассмотрите вместо этого возможность создания эффекта который создаёт поток партиклов когда игрок начинает стрелять , и используйте <code>StopParticleEffects(this)</code> чтобы завершить работу эффекта, когда он закончит стрелять. Попробуйте <code>(CBasePlayer::m_nButtons & IN_ATTACK)</code> чтобы достичь данного эффекта.
Код сверху позволяет создать новую {{L|particle system|систему частиц}} , которая подходит для эффектов одиночной стрельбы для каждой пули . Если ваше оружие стреляет быстро рассмотрите вместо этого возможность создания эффекта который создаёт поток партиклов когда игрок начинает стрелять , и используйте <code>StopParticleEffects(this)</code> чтобы завершить работу эффекта, когда он закончит стрелять. Попробуйте <code>(CBasePlayer::m_nButtons & IN_ATTACK)</code> чтобы достичь данного эффекта.


{{note|Если ваше оружие имеет другие партикл-эффекты вам понадобиться остановить след <code>ParticleProp()->StopEmission(CNewParticleEffect* pEffect)</code> вместо того , который находится на стороне игрока.}}
{{note|Если ваше оружие имеет другие партикл-эффекты вам понадобиться остановить след <code>ParticleProp()->StopEmission(CNewParticleEffect* pEffect)</code> вместо того , который находится на стороне игрока.}}


Смотрите также <code>[[UTIL_ParticleTracer]]</code>.
Смотрите также <code>{{L|UTIL_ParticleTracer}}</code>.


==== Эффект попадания ====
==== Эффект попадания ====
Line 127: Line 128:
== Оружие-пример ==
== Оружие-пример ==


Смотрите [[AK47 weapon|Добавление нового оружия в ваш мод]].
Смотрите {{L|AK47 weapon|Добавление нового оружия в ваш мод}}.
 
{{ACategory|Weapons programming}}

Latest revision as of 04:49, 12 July 2024

English (en)Русский (ru)Translate (Translate)


Info content.png
This page is being translated.
You can help by finishing the translation.
If this page cannot be translated for some reason, or is left untranslated for an extended period of time after this notice is posted, the page should be requested to be deleted.
Also, please make sure the article complies with the alternate languages guide.(en)
Note.pngПримечание:Есть неточности перевода , помеченные (?)

Как не удивительно Source имеет надёжные оружейные системы. Эта статья описывает шаги необходимые для создания пулевых(en) и снарядных оружий и как правильно настроить их для использования в мультиплеере.

Общие сведения

Большинство свойств оружия может быть сконфигурировано с помощью оружейных скриптов(en)
Если всё что тебе требуется - это выстреливать пули с постоянной скоростью, тебе необходимы какие-никакие навыки в программировании.
Оружейный огонь может быть прогнозирован(en) игроком и запозданием(en) сервера
Обычно это выглядит как снаряды в виде ракет, гранат, и других снарядов материализующихся из воздуха на компьютерах наблюдателей.
Моделька от первого лица(en) - это отдельная сущность
Она создается игроком и делится между всеми видами оружия.
В SDK есть широкий выбор оружия для изучения
Valve предоставляет исходный код как однопользовательских, так и многопользовательских игр.

Оружейные скрипты

От оружейных скриптов(en) зависит много свойств оружия , включая её модель(en), амуницию , звуки , размер обоймы , и имя в пользовательском интерфейсе. Использование, расширение и шифрование оружейных скриптов описано в их статье(en).

Скрипт оружия будет автоматически загружен для любого оружия с назначенным именем класса(en). Для более лёгкого кэширования(en) ресурсов, определяемых скриптами вызовите PRECACHE_WEAPON_REGISTER(имя) и никаких кавычек вокруг имени класса.

Точки входа

У оружия есть четыре функции, которые вызываются каждый кадр объектом которым владеет игрок:

ItemPreFrame()
Вызывается перед началом движения игрока. В Episode Two(en), решает , подходящее ли сейчас время чтобы отобразить подсказку по использованию оружия в HUD.
ItemHolsterFrame()
Вызывается перед началом движения игрока, если игрок ничего не делает. В основном ничего не делает.
ItemBusyFrame()
Вызывается перед началом движения игрока, если игрок не стреляет. В основном ничего не делает.
ItemPostFrame()
Вызывается после движения игрока. Это самая важная функция , ведь она ведёт к следующим:
  • PrimaryAttack()
  • SecondaryAttack()
  • HandleFireOnEmpty()
  • Reload()
  • WeaponIdle()

Стрельба

Оружие обычно стреляет если кнопка отвечающая за +attack активна и (m_flNextPrimaryAttack <= gpGlobals(en)->curtime). Для дополнительного режима стрельбы, +attack2 и m_flNextSecondaryAttack проверяются вместо предыдущей функции (?).

Нужно сделать: Как заставить NPC атаковать?

Пули

Пули(en) выстреливаются при соответствии , где FireBulletsInfo_t(en) противоречит GetOwner()->FireBullets().

Если всё что вам нужно это основная атака , которая выстреливает постоянный поток пуль (Не важно отделяют их 2 или 0.2 секунды) CBaseCombatWeapon уже выполняет нужную работу и вам надо только написать две функции:

float GetFireRate()
Время в секундах между каждым выстрелом.
const Vector& GetBulletSpread()
Конус , внутри которого пули будут иметь случайный разброс. Для него используйте VECTOR_CONE_* #определяет, как избежать самостоятельной работы с математикой.

Переходим к секции с нетворкингом если это соответствует вашим требованиям; Эффекты будут сделаны за вас. Иначе смотрите FireBulletsInfo_t(en) за подробностями , чтобы настроить вашу собственную hitscan атаку.

Снаряды

Ракеты, гранаты, и другие снаряды это самостоятельные энтити которые существуют независимо (почти) от оружия из которого они вылетели. Оружие должно создать их с помощью Create()(en):

CBaseEntity::Create( "my_projectile", GetOwner()->Weapon_ShootPosition(), GetOwner()->EyeAngles(), GetOwnerEntity() );

Обратите внимание , что их владелец тот же , что и владеет оружием (GetOwnerEntity()), а само не оружие как таковое.

Tip.pngСовет:Не компенсируйте лаги(en) или прогнозируйте(en) этот вызов - делай прогнозируемую анимацию отсутствия патронов и перезарядки для viewmodel(en).

Читайте следующее:

Эффекты

Здесь предполагается , что вы используете систему партиклов(en), которая создаётся художниками. Старая технология "закодирования партиклов намертво" никогда не документировалась.

Следы от пуль

Следы должны быть отправлены CBaseEntity::MakeTracer(). CBasePlayer который настроен на излучение "намертво закодированных" эффектов; если вы хотите внести изменения, лучше всего осуществить партиклы(?). Это делается несложно:

// ВСЁ В ОБЩЕМ КОДЕ

// всегда излучать следы; пусть система партиклов сама определяет объём
// (если вы не собираетесь редактировать CBasePlayer, просто измените m_iTracerFreq )
void CMyPlayer::FireBullets( const FireBulletsInfo_t &info )
{
	FireBulletsInfo_t new_info(info);
	new_info.m_iTracerFreq = 1;
	BaseClass::FireBullets(new_info);
}

// перейдите к оружию, если есть необходимость
void CMyPlayer::MakeTracer( const Vector &vecTracerSrc, const trace_t &tr, int iTracerType )
{
	GetActiveWeapon()->MakeTracer(vecTracerSrc,tr,iTracerType);
}

// излучает эффект этого оружия
void CMyWeapon::MakeTracer( const Vector &vecTracerSrc, const trace_t &tr, int iTracerType )
{
	// 1 это аттачмент #1, который является дулом
	UTIL_ParticleTracer("my_tracer",vecTracerSrc,tr.endpos,entindex(),1);
}

Код сверху позволяет создать новую систему частиц(en) , которая подходит для эффектов одиночной стрельбы для каждой пули . Если ваше оружие стреляет быстро рассмотрите вместо этого возможность создания эффекта который создаёт поток партиклов когда игрок начинает стрелять , и используйте StopParticleEffects(this) чтобы завершить работу эффекта, когда он закончит стрелять. Попробуйте (CBasePlayer::m_nButtons & IN_ATTACK) чтобы достичь данного эффекта.

Note.pngПримечание:Если ваше оружие имеет другие партикл-эффекты вам понадобиться остановить след ParticleProp()->StopEmission(CNewParticleEffect* pEffect) вместо того , который находится на стороне игрока.

Смотрите также UTIL_ParticleTracer(en).

Эффект попадания

Нужно сделать: CBaseEntity::DoImpactEffect()

Networking

Нужно сделать: Shared code, prediction, predicted viewmodels, compensation...

Оружие-пример

Смотрите Добавление нового оружия в ваш мод(en).