Автор | Сообщение |
BL@CK DE@TH = Warrant Officer =
 | 1274 |
 Doom Rate: 1.13
|
Отправлено: 12.04.09 14:51:56 | | | | Посмотри Хеллспавн кибера. |
С этим разобрался, спасибо.
Вот ещё один вопрос:
Мой игрок стреляет выпускает три снаряда за один раз, естественно, три раза проигрывается анимация атаки, но если во время этой атаки он получает повреждения и проигрывается анимация боли, то его снаряды всё-равно продолжают вылетать. Как сделать, чтобы во время причинения вреда игроку его атака мгновенно прекращалась, например, как у монстров? | |
|
| |
nprotect = Captain =
 | 2413 |
 Doom Rate: 2.45
|
Отправлено: 12.04.09 16:14:17 | | | BL@CK DE@TH : | Мой игрок стреляет выпускает три снаряда за один раз, естественно, три раза проигрывается анимация атаки, но если во время этой атаки он получает повреждения и проигрывается анимация боли, то его снаряды всё-равно продолжают вылетать |
ну хоть код бы привел, для начала | |
|
1 |
2 |
1 |
 |
|
| |
BL@CK DE@TH = Warrant Officer =
 | 1274 |
 Doom Rate: 1.13
|
Отправлено: 12.04.09 17:15:36 | | | На примере игрока-Cyberdemon-а.
Полный код:
| //CyberDemon//
ACTOR iCyberdemon : PlayerPawn
{
Health 4000
Speed 0.7
Radius 22
Height 75
Mass 1000
painchance 20
Player.StartItem "cyberlauncher"
Player.StartItem "Cyberdoomsday"
Player.DisplayName Cyberdemon
Player.ForwardMove .5 .5
Player.SideMove .5 .5
Player.MaxHealth 4000
Player.SoundClass cyberdemon
Player.ViewHeight 89
+BOSS
+NOSKIN
+FLOORCLIP
+NORADIUSDMG
+BOSSDEATH
states
{
Spawn:
CYBR AB 10
CYBR B 5 A_GiveInventory ("MonsterSuit",1)
Loop
See:
CYBR A 6 A_PlaySound ("spider/walk")
CYBR B 6 A_PlaySound ("Cyber/Hoof")
CYBR CD 6
Loop
Missile:
CYBR F 12 A_CyberAttack // See Rocket
CYBR F 12 A_CyberAttack
CYBR F 12 A_CyberAttack
goto See
Melee:
CYBR E 6
CYBR F 12 BRIGHT
CYBR E 12
CYBR F 12 BRIGHT
CYBR E 12
CYBR F 12 BRIGHT
CYBR E 12
Goto Spawn
Pain:
CYBR G 10 A_PlaySound ("Cyber/pain")
Goto Spawn
Death:
CYBR H 7
CYBR I 7 A_PlayerScream
CYBR J 7 A_NoBlocking
CYBR K 7
CYBR L 7
CYBR MNO 7
CYBR P -1
Stop
XDeath:
CYBR H 7
CYBR I 7 A_PlayerScream
CYBR J 7 A_NoBlocking
CYBR K 7
CYBR L 7
CYBR MNO 7
CYBR P -1
Stop
}
}
ACTOR CyberLauncher : Weapon
{
OBITUARY "%o was splattered by Cyber%k."
Weapon.AmmoUse 0
Weapon.AmmoType "cyberball"
+WEAPON.NOAUTOFIRE
Inventory.PickupMessage "$GOTLAUNCHER"
States
{
Ready:
CYBL A 1 A_WeaponReady
Loop
Deselect:
NULL A 0 SetPlayerProperty (0, 0, 0)
CYBL A 1 A_Lower
Loop
Select:
CYBL A 1 A_Raise
Loop
Fire:
NULL A 0 SetPlayerProperty (0, 1, 0)
CYBL A 6 A_Gunflash
CYBL B 12 Bright
CYBL A 12
CYBL B 12 Bright
CYBL A 12
CYBL B 12 Bright
NULL A 0 SetPlayerProperty (0, 0, 0)
CYBL A 35
CYBL A 0 A_ReFire
Goto Ready
Spawn:
LAUN A -1
Stop
}
}
ACTOR Rocket2
{
Radius 11
Height 8
Speed 20
Damage 26
DamageType Fire
Projectile
+RANDOMIZE
+DEHEXPLOSION
+ROCKETTRAIL
+EXPLODEONDEATH
SeeSound "weapons/rocklf"
DeathSound "weapons/rocklx"
States
{
Spawn:
MISL A 1 Bright
Loop
Death:
MISL B 8 Bright A_Explode
MISL C 6 Bright
MISL D 4 Bright
Stop
}
} |
| |
|
| |
M@@@H!aK - Sergeant -
 | 325 |
 Doom Rate: 2.83
|
Отправлено: 12.04.09 17:34:45 | | | BL@CK DE@TH
Насколько я помню, игрок, попадая в Pain State, никогда не прерывает текущего действия - Pain State игрока только меняет его внешний вид. В общем-то это даже логично - в Pain State попадает актор изображающий игрока (iCyberdemon), а стейты стрельбы в это время контролируются совсем другим актором - CyberLauncher'ом. | |
|
| |
BL@CK DE@TH = Warrant Officer =
 | 1274 |
 Doom Rate: 1.13
|
Отправлено: 12.04.09 17:51:34 | | | | BL@CK DE@TH
Насколько я помню, игрок, попадая в Pain State, никогда не прерывает текущего действия - Pain State игрока только меняет его внешний вид. В общем-то это даже логично - в Pain State попадает актор изображающий игрока (iCyberdemon), а стейты стрельбы в это время контролируются совсем другим актором - CyberLauncher'ом. |
Т.е. получается, что эту проблему решить или есть какие-то способы? Можно-ли в самом Cyberlauncher-е прописать Pain или триггер который будет прерывать стрельбу во время получения игроком повреждения? | |
|
| |
Часовщик UAC Sergeant Major
 | 727 |
Doom Rate: 3.41
|
Отправлено: 12.04.09 18:30:23 | | | насколько я знаю у оружия нету пейн стейта. можно сделать так:
рокетланчер спонит невидимый и неосязаемый актор который вылетает из него на какоето микроскопическое расстояние, тутже моментально стреляет рокетой и умирает. сделать этому актору стейт пэйн, попадая в который он будет переходить в стейт смерти. получится может не вточности также как у кибердемона, но похоже | |
|
| |
Archi]ASTS[ UAC General
 | 12719 |
 Doom Rate: 1.87
|
Отправлено: 12.04.09 19:41:34 | | | BL@CK DE@TH
А не проще ли сделать по одному выстрелу?  | |
|
2 |
1 |
1 |
 |
|
| |
BL@CK DE@TH = Warrant Officer =
 | 1274 |
 Doom Rate: 1.13
|
Отправлено: 12.04.09 21:17:17 | | | | BL@CK DE@TH
А не проще ли сделать по одному выстрелу? |
Проще, но хочется сделать как в оригинале. | |
|
| |
M@@@H!aK - Sergeant -
 | 325 |
 Doom Rate: 2.83
|
Отправлено: 13.04.09 10:27:43 | | | BL@CK DE@TH
Если очень хочется, попробуй давать игроку в пейн-стейте некий предмет инвентори, а через некоторое время забирай его обратно. Перед каждым выстелом проверяй с помощью A_JumpIfInventory наличие этого айтема и выпрыгивай из стейта стрельбы, если он есть. Должно работать, хотя может потребоваться некоторая возня с параметрами, чтобы все это работало прилично. | |
|
| |
Archi]ASTS[ UAC General
 | 12719 |
 Doom Rate: 1.87
|
Отправлено: 13.04.09 12:24:48 | | | BL@CK DE@TH : | хочется сделать как в оригинале. |
Мне до последнего казалось что кибер стреляет по одному выстрелу.
Мне кажется так сделано для увеличения мощности кибердемона. Я бы не хотел стрелять выстрела подряд. | |
|
2 |
1 |
1 |
 |
|
| |
nprotect = Captain =
 | 2413 |
 Doom Rate: 2.45
|
Отправлено: 13.04.09 17:01:13 | | | M@@@H!aK : | попробуй давать игроку в пейн-стейте некий предмет инвентори |
не факт, что такое будет работать. как я понял, действие CyberAttack выполняется даже в стейте Pain, так что какие бы там условные переходы с инвентори не стояли, он все равно будет выполнять это действие | |
|
1 |
2 |
1 |
 |
|
| |
M@@@H!aK - Sergeant -
 | 325 |
 Doom Rate: 2.83
|
Отправлено: 13.04.09 17:09:36 | | | nprotect : | не факт, что такое будет работать |
Сейчас посмотрю еще раз, что там написано...
Прочитал приведенный выше текст Decorate внимательнее... Хм, так там, оказывается, вообще как-то странно все сделано. Зачем такой огород городить? Зачем A_CyberAttack и прочее? Можно написать обычный PlayerPawn, в котором нет никаких экшнов, а всю стрельбу вынести в код собственно оружия. И стрелять не A_CyberAttack'ом, а нормальным A_FireCustomMissile. Точно также можно реализовать и торможение игрока во время стрельбы (при желании можно сделать, чтобы он даже прицел сдвинуть не мог, пока все три ракеты не выплюнет - все в коде собственно вепона) | |
|
| |
Alex3005 - Master Corporal -
 | 200 |
Doom Rate: 1.02
|
Отправлено: 14.04.09 01:26:21 | | | Народ помогите с thing_hate в декорейте | |
|
| |
M@@@H!aK - Sergeant -
 | 325 |
 Doom Rate: 2.83
|
Отправлено: 14.04.09 05:09:09 | | | alex3005
Пишешь у одного типа монстров что-то вроде вроде:
Spawn:
POSS A 0
POSS A 0 Thing_ChangeTID(0,1) // Первый тип монстров, все имеют TID 1
POSS A 0 Thing_Hate(0,2,4) // ... и люто, бешено ненавидят монстров с TID 2
POSS AB 10 A_Look
Goto Spawn+3
А у второго типа монстров аналогично:
Spawn:
TROO A 0
TROO A 0 Thing_ChangeTID(0,2) // Второй тип монстров, все имеют TID 2
TROO A 0 Thing_Hate(0,1,4) // ... и люто, бешено ненавидят монстров с TID 1
TROO AB 10 A_Look
Goto Spawn+3
Недостатки: каждый монстр первого или второго типа обязан иметь определенный tid.
Посмотри в Wiki про типы ненависти в Thing_Hate - я поставил 4, но, может быть, тебе нужен какой-то другой вариант. | |
|
| |
NoMaD - Corporal -
 | 98 |
Doom Rate: 1.63
|
Отправлено: 14.04.09 15:38:56 | | | Как я могу сделать эффект, чтоб игрок мог перешагнуть один раз линию,
а обратно через нее не мог вернуться? | |
|
| |
nprotect = Captain =
 | 2413 |
 Doom Rate: 2.45
|
Отправлено: 14.04.09 15:46:16 | | | Nomad : | Как я могу сделать эффект, чтоб игрок мог перешагнуть один раз линию, а обратно через нее не мог вернуться? |
скриптом. один раз перешагнул - значение переменной изменилось, а потом делаешь в скрипте:
SetLineBlocking(lineid ,BLOCK_EVERYTHING); | |
|
1 |
2 |
1 |
 |
|
| |
BL@CK DE@TH = Warrant Officer =
 | 1274 |
 Doom Rate: 1.13
|
Отправлено: 14.04.09 17:16:46 | | | | Сейчас посмотрю еще раз, что там написано...
Прочитал приведенный выше текст Decorate внимательнее... Хм, так там, оказывается, вообще как-то странно все сделано. Зачем такой огород городить? Зачем A_CyberAttack и прочее? Можно написать обычный PlayerPawn, в котором нет никаких экшнов, а всю стрельбу вынести в код собственно оружия. И стрелять не A_CyberAttack'ом, а нормальным A_FireCustomMissile. Точно также можно реализовать и торможение игрока во время стрельбы (при желании можно сделать, чтобы он даже прицел сдвинуть не мог, пока все три ракеты не выплюнет - все в коде собственно вепона) |
Вот с этого момента поподробнее, пожалуйста. Я сам только недавно взялся за скрипты, поэтому много чего не понимаю. | |
|
| |
M@@@H!aK - Sergeant -
 | 325 |
 Doom Rate: 2.83
|
Отправлено: 14.04.09 21:14:28 | | | BL@CK DE@TH : | Вот с этого момента поподробнее, пожалуйста. |
Чего ты хочешь добиться? Сделать игру за кибердемона?
Тогда вот список того, что тебе нужно:
1) Поставить камеру выше (кибердемон высокий)
2) Сделать игроку больше здоровья
3) Сделать одно, неизменяемое оружие, которое стреляет пачками по три ракеты, не дает игроку двигаться во время стрельбы и прерывает огонь при получении боли, так?
Первые два пункта делаются элементарно с помощью соответствующего класса игрока. Изучай, как сделан стандартный класс в думе: DoomPlayer и не городи огород. Никакой стрельбы из стейтов плееркласса.
Чтобы сделать оружие, можно начать с переделки обычного рокет ланчера: RocketLauncher. Повтори первые три строчки стейта Fire еще два раза и получишь тройной выстрел. Поиграйся с задержкой, чтобы получилась нужная частота выстрела. Плюс добавить торможение игрока во время выстрела с помощью SetPlayerProperty
Выглядеть это будет примерно так:
Fire:
MISG B 0 SetPlayerProperty(0, 1, 0) // "Тормозим" игрока
MISG B 8 A_GunFlash
MISG B 12 A_FireMissile
MISG B 0 A_ReFire
MISG B 8 A_GunFlash
MISG B 12 A_FireMissile
MISG B 0 A_ReFire
MISG B 8 A_GunFlash
MISG B 12 A_FireMissile
MISG B 0 A_ReFire
MISG B 0 SetPlayerProperty(0, 0, 0) // Обратно разрешаем двигаться
Goto Ready
Как сделать, чтобы при получении боли игрок переставал стрелять, я уже описал. Возможно, это не будет работать, а тестить это сейчас мне лень. Но SetPlayerProperty работает, это я сейчас проверил. Разберись, как работают джампы, в частности, A_JumpIfInventory. Идея - выпрыгнуть из стейта стрельбы (не забыв вернуть игроку возможность двигаться) при наличии у игрока некого инвентори:
Actor Flag_PlayerIsInPainState : Inventory
{
Inventory.MaxAmount 1
}
Инвентори этот давать в пейн стейте playerpawn'а, забирать по выходу из него. Перед каждым выстрелом проверять с помощью джампа наличие этого предмета. Короче, как-то так:
Pain:
PLAY G 0 A_GiveInventory("Flag_PlayerIsInPainState",1)
PLAY G 4
PLAY G 4 A_Pain
PLAY G 0 A_TakeInventory("Flag_PlayerIsInPainState",1)
Goto Spawn
Fire:
MISG B 0 SetPlayerProperty(0, 1, 0)
MISG B 0 A_JumpIfInventory("Flag_PlayerIsInPainState",1,12) // Проверяем, находимся ли мы в Pain State
MISG B 8 A_GunFlash
MISG B 12 A_FireMissile
MISG B 0 A_ReFire
MISG B 0 A_JumpIfInventory("Flag_PlayerIsInPainState",1,8) // Проверяем, находимся ли мы в Pain State
MISG B 8 A_GunFlash
MISG B 12 A_FireMissile
MISG B 0 A_ReFire
MISG B 0 A_JumpIfInventory("Flag_PlayerIsInPainState",1,4) // Проверяем, находимся ли мы в Pain State
MISG B 8 A_GunFlash
MISG B 12 A_FireMissile
MISG B 0 A_ReFire
MISG B 0 SetPlayerProperty(0, 0, 0)
Goto Ready
Я это не проверял, и мог ошибиться где-то в смещениях при джампах. Короче, идею я тебе подал.  | |
|
| |
BL@CK DE@TH = Warrant Officer =
 | 1274 |
 Doom Rate: 1.13
|
Отправлено: 14.04.09 21:47:34 | | | | Я это не проверял, и мог ошибиться где-то в смещениях при джампах. Короче, идею я тебе подал. |
Спасибо, товарищ! Буду потихоньку разбираться. | |
|
| |
NoMaD - Corporal -
 | 98 |
Doom Rate: 1.63
|
Отправлено: 15.04.09 06:59:00 | | | nprotect
Block_everything ни черта не работает, но мне нужен только плаер,
тогда я ввел плаеру таг и написал в скрипте без всяких переменных
тот код: работает.
Но за SetLineBlocking спасибо  | |
|
| |