HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Half-Life SDK (https://hlfx.ru/forum/forumdisplay.php?forumid=8)
-- Нубские вопросы от <censored> и других нубов (https://hlfx.ru/forum/showthread.php?threadid=4535)
Отправлено Ku2zoff 27-04-2020 в 14:43:
Цитата:
Дядя Миша писал:
там где-то этот буффер будет задан как 500-600 милисекунд. Меньше ста ставить не рекомендую.
C++ Source Code:
pFMOD->FSOUND_SetBufferSize(100); |
Ориентировался на спирит 1.9. Тут 100 мс, как видно. Всё равно лаг есть. Конечно, я не тестировал это дело под WON-версией халфы. МБ там быстрее срабатывает, ХЗ. А теперь вопросик к линуксоидам:
C++ Source Code:
pFMOD->FSOUND_SetOutput(FSOUND_OUTPUT_ALSA); |
Альса будет выводить звук в любом случае? Стим требует установку OSS. И, судя по моим наблюдениям, стим-халфа под линуксом выводит свой звук именно через OSS. Откуда ещё появился бы даунсемплинг? Пока не исправишь conf-файл OSS на свежеустановленном дебиане, звуки в стим халфе как через подушку, приглушённые.
Отправлено Дядя Миша 27-04-2020 в 15:03:
Я этот фмод давно уже дропнул и не жалею.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено FreeSlave 27-04-2020 в 17:55:
Безопасно ли удалять энтитю, которая получает DeathNotice'ы? Например, monstermaker. Возможна ли ситуация, что DeathNotice получит энтитя, созданная позже и занявшая тот же эдикт?
__________________
I'm on github
I'm on opendesktop.org
Отправлено Дядя Миша 27-04-2020 в 19:45:
FreeSlave вот для того и существует EHANDLE. Чтобы гарантировать, что это та самая энтитя, а не какая-то другая в том же слоте.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено FreeSlave 27-04-2020 в 22:21:
Так-то да. Просто смутило, что в коде именно owner юзается. Хотя вряд ли монстрмэйкеры кто-то удаляет. Да и помимо них DeathNotice разве что Big Momma использует.
__________________
I'm on github
I'm on opendesktop.org
Отправлено BALISTA 28-04-2020 в 19:59:
Приветствую всех! Такой вопрос, с помощью местного туториала удалил клиентские оружия, и заодно перенёс код фомки полностью на сервер.
Вот собственно проблема: декаль на стенке ставится ровно один раз, при первом ударе, больше они не появляются. Может кто сталкивался с таким, посоветуйте навскидку что это может быть или может я чего сломал)
Отправлено Ku2zoff 29-04-2020 в 05:35:
C++ Source Code:
SetThink( &CCrowbar::Smack ); |
pev->nextthink = UTIL_WeaponTimeBase() + 0.2; |
UTIL_WeaponTimeBase ты поправил? При удалении клиентских пушек это нужно обязательно делать. Потому что оно всегда возвращает 0.0 для клиентских пушек и gpGlobals->time для серверных.
Отправлено BALISTA 29-04-2020 в 11:54:
Цитата:
Ku2zoff писал:
UTIL_WeaponTimeBase ты поправил?
В каком смысле? Немного не понял.
Я думаю нагляднее будет предоставить код
C++ Source Code:
3 | * Copyright © 1996-2002, Valve LLC. All rights reserved. |
5 | * This product contains software technology licensed from Id |
6 | * Software, Inc. ("Id Technology"). Id Technology © 1996 Id Software, Inc. |
9 | * Use, distribution, and modification of this source code and/or resulting |
10 | * object code is restricted to non-commercial enhancements to products from |
11 | * Valve LLC. All other use, distribution, or modification is prohibited |
12 | * without written permission from Valve LLC. |
25 | #define CROWBAR_BODYHIT_VOLUME 128 |
26 | #define CROWBAR_WALLHIT_VOLUME 512 |
28 | class CCrowbar : public CBasePlayerWeapon |
33 | int GetItemInfo(ItemInfo *p); |
36 | void SecondaryAttack(); |
44 | LINK_ENTITY_TO_CLASS(weapon_crowbar, CCrowbar); |
64 | m_iId = WEAPON_CROWBAR; |
65 | SET_MODEL(ENT(pev), "models/w_crowbar.mdl"); |
68 | FallInit(); // Get ready to fall down. |
71 | void CCrowbar::Precache() |
73 | PRECACHE_MODEL("models/v_crowbar.mdl"); |
74 | PRECACHE_MODEL("models/w_crowbar.mdl"); |
75 | PRECACHE_MODEL("models/p_crowbar.mdl"); |
77 | PRECACHE_SOUND("weapons/cbar_hit1.wav"); |
78 | PRECACHE_SOUND("weapons/cbar_hit2.wav"); |
79 | PRECACHE_SOUND("weapons/cbar_hitbod1.wav"); |
80 | PRECACHE_SOUND("weapons/cbar_hitbod2.wav"); |
81 | PRECACHE_SOUND("weapons/cbar_hitbod3.wav"); |
82 | PRECACHE_SOUND("weapons/cbar_miss1.wav"); |
85 | int CCrowbar::GetItemInfo(ItemInfo *p) |
87 | p->pszName = STRING(pev->classname); |
92 | p->iMaxClip = CROWBAR_MAX_CLIP; |
95 | p->iId = WEAPON_CROWBAR; |
96 | p->iWeight = CROWBAR_WEIGHT; |
100 | BOOL CCrowbar::Deploy() |
102 | return DefaultDeploy("models/v_crowbar.mdl", "models/p_crowbar.mdl", CROWBAR_DRAW, "crowbar"); |
105 | void CCrowbar::Holster() |
107 | m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 0.5; |
108 | SendWeaponAnim(CROWBAR_HOLSTER); |
111 | void CCrowbar::Smack() |
113 | DecalGunshot(&m_trHit, BULLET_PLAYER_CROWBAR); |
116 | void CCrowbar::PrimaryAttack() |
120 | UTIL_MakeVectors(m_pPlayer->pev->v_angle); |
121 | Vector vecSrc = m_pPlayer->GetGunPosition(); |
122 | Vector vecEnd = vecSrc + gpGlobals->v_forward * 32; |
124 | UTIL_TraceLine(vecSrc, vecEnd, dont_ignore_monsters, ENT(m_pPlayer->pev), &tr); |
126 | // Player "shoot" animation. |
127 | m_pPlayer->SetAnimation(PLAYER_ATTACK1); |
129 | // Always play swing sound. |
130 | EMIT_SOUND_DYN(ENT(m_pPlayer->pev), CHAN_WEAPON, "weapons/cbar_miss1.wav", 1, ATTN_NORM, 0, 98 + RANDOM_LONG(0,3)); |
132 | if (tr.flFraction >= 1.0) |
134 | UTIL_TraceHull(vecSrc, vecEnd, dont_ignore_monsters, head_hull, ENT(m_pPlayer->pev), &tr); |
135 | if (tr.flFraction < 1.0) |
137 | // Calculate the point of intersection of the line (or hull) and the object we hit. |
138 | // This is and approximation of the "best" intersection. |
139 | CBaseEntity *pHit = CBaseEntity::Instance(tr.pHit); |
140 | if (!pHit || pHit->IsBSPModel()) |
141 | FindHullIntersection(vecSrc, tr, VEC_DUCK_HULL_MIN, VEC_DUCK_HULL_MAX, m_pPlayer->edict()); |
142 | vecEnd = tr.vecEndPos; // This is the point on the actual surface (the hull could have hit space). |
146 | if (tr.flFraction >= 1.0) |
149 | switch((m_iSwing++) % 3) |
152 | SendWeaponAnim(CROWBAR_MISS1); |
155 | SendWeaponAnim(CROWBAR_MISS2); |
158 | SendWeaponAnim(CROWBAR_MISS3); |
162 | m_flNextPrimaryAttack = m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 0.5; |
167 | switch((m_iSwing++) % 3) |
170 | SendWeaponAnim(CROWBAR_HIT1); |
173 | SendWeaponAnim(CROWBAR_HIT2); |
176 | SendWeaponAnim(CROWBAR_HIT3); |
180 | CBaseEntity *pEntity = CBaseEntity::Instance(tr.pHit); |
184 | pEntity->TraceAttack(m_pPlayer->pev, gSkillData.plrDmgCrowbar, gpGlobals->v_forward, &tr, DMG_CLUB | DMG_NEVERGIB); |
186 | ApplyMultiDamage(m_pPlayer->pev, m_pPlayer->pev); |
188 | m_flNextPrimaryAttack = m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 0.25; |
190 | // Play thwack, smack, or dong sound. |
192 | int fHitWorld = TRUE; |
196 | if (pEntity->Classify() != CLASS_NONE && pEntity->Classify() != CLASS_MACHINE) |
198 | // Play thwack or smack sound. |
199 | switch(RANDOM_LONG(0,2)) |
202 | EMIT_SOUND(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/cbar_hitbod1.wav", 1, ATTN_NORM); |
205 | EMIT_SOUND(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/cbar_hitbod2.wav", 1, ATTN_NORM); |
208 | EMIT_SOUND(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/cbar_hitbod3.wav", 1, ATTN_NORM); |
211 | m_pPlayer->m_iWeaponVolume = CROWBAR_BODYHIT_VOLUME; |
213 | if (!pEntity->IsAlive()) |
214 | m_flNextPrimaryAttack = m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 0.25; |
222 | // Play texture hit sound. |
223 | // UNDONE: Calculate the correct point of intersection when we hit with the hull instead of the line. |
226 | float fvolbar = TEXTURETYPE_PlaySound(&tr, vecSrc, vecSrc + (vecEnd-vecSrc) * 2, BULLET_PLAYER_CROWBAR); |
228 | if (g_pGameRules->IsMultiplayer()) |
230 | // Override the volume here, cause we don't play texture sounds in multiplayer, |
231 | // and fvolbar is going to be 0 from the above call. |
235 | // Also play crowbar strike. |
236 | switch(RANDOM_LONG(0,1)) |
239 | EMIT_SOUND_DYN(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/cbar_hit1.wav", fvolbar, ATTN_NORM, 0, 98 + RANDOM_LONG(0,3)); |
242 | EMIT_SOUND_DYN(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/cbar_hit2.wav", fvolbar, ATTN_NORM, 0, 98 + RANDOM_LONG(0,3)); |
246 | m_flNextPrimaryAttack = m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 0.25; |
248 | // Delay the decal a bit. |
250 | SetThink(&CCrowbar::Smack); |
251 | m_pPlayer->m_iWeaponVolume = flVol * CROWBAR_WALLHIT_VOLUME; |
253 | m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat(m_pPlayer->random_seed, 10, 15); |
256 | void CCrowbar::SecondaryAttack() |
261 | void CCrowbar::WeaponIdle() |
263 | if(m_flTimeWeaponIdle < UTIL_WeaponTimeBase()) |
266 | float flRand = UTIL_SharedRandomFloat(m_pPlayer->random_seed, 0, 1); |
269 | iAnim = CROWBAR_IDLE2; |
270 | m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 160.0 / 30.0; |
276 | iAnim = CROWBAR_IDLE1; |
277 | m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 70.0 / 25.0; |
281 | iAnim = CROWBAR_IDLE3; |
282 | m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 160.0 / 30.0; |
285 | SendWeaponAnim(iAnim); |
P.S Здесь не хватает куска кода с FindHullIntersection, я перенёс его в weapons.cpp
Отправлено Ku2zoff 29-04-2020 в 13:58:
C++ Source Code:
1 | // Delay the decal a bit. |
3 | SetThink(&CCrowbar::Smack); |
4 | m_pPlayer->m_iWeaponVolume = flVol * CROWBAR_WALLHIT_VOLUME; |
6 | m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat(m_pPlayer->random_seed, 10, 15); |
Где у тебя pev->nextthink? У тебя вызывается SetThink. А интервал до следующего тчинка не указан. Вот монтировка и тчинкает только один раз. Конечно, код с тчинком сам по себе странный. Не знаю, зачем вэлв написали именно так. Можно ведь просто вызывать рисование декалей из кода атаки.
Добавлено 29-04-2020 в 20:58:
Правильнее будет вот так:
C++ Source Code:
2 | m_flNextPrimaryAttack = m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 0.25; |
4 | // Delay the decal a bit. |
6 | DecalGunshot(&m_trHit, BULLET_PLAYER_CROWBAR); |
7 | m_pPlayer->m_iWeaponVolume = flVol * CROWBAR_WALLHIT_VOLUME; |
9 | m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat(m_pPlayer->random_seed, 10, 15); |
Выкинь функцию Smack, она не нужна, раз ты от всех других тчинков избавился.
Отправлено Дядя Миша 29-04-2020 в 14:06:
Smack это типа маленькая задержка появления декали, чтобы анимация успела проиграться.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено Vadiman 29-04-2020 в 14:36:
Всем привет! Подскажите кто знает, как сделать так, чтобы npc "хуже" слышали топот игрока? Например при приближении приходится не только шифт зажимать, но еще и приседать, дабы подкрасться поближе. А хотелось бы обходиться только шифтом, да и в целом бег игрока сделать тише для врагов.
Отправлено BALISTA 29-04-2020 в 14:51:
Цитата:
Ku2zoff писал:
Конечно, код с тчинком сам по себе странный.
Спасибо за разъяснения, теперь больше понимаю как это должно работать)
Отправлено Ku2zoff 29-04-2020 в 15:09:
Цитата:
Vadiman писал:
как сделать так, чтобы npc "хуже" слышали топот игрока?
C++ Source Code:
float CBaseMonster::HearingSensitivity( void ); |
Функция виртуальная, у всех монстров по дефолту 1.0, только у тентакля 2.0.
Добавлено 29-04-2020 в 22:09:
Вообще, гляди функцию void CBaseMonster :: Listen ( void ). Там все условия, как слышит монстр. И ещё void CBasePlayer :: UpdatePlayerSound ( void ), если тебя интересует именно игрок.
Отправлено BALISTA 29-04-2020 в 15:40:
Цитата:
Vadiman писал:
npc "хуже" слышали топот игрока
Вот кстати тоже прикольная не реализованая фича, при приседании костюм переключается в стелс режим, и шаги либо слышно очень тихо либо их нет совсем, что позволяет немного разнообразить геймплей: например кинуть сатчел в толпу, использовать арбалет или глок с глушителем.
Отправлено Vadiman 30-04-2020 в 10:53:
Цитата:
Ku2zoff писал:
C++ Source Code:
float CBaseMonster::HearingSensitivity( void ); |
Функция виртуальная, у всех монстров по дефолту 1.0, только у тентакля 2.0.
Добавлено 29-04-2020 в 22:09:
Вообще, гляди функцию void CBaseMonster :: Listen ( void ). Там все условия, как слышит монстр. И ещё void CBasePlayer :: UpdatePlayerSound ( void ), если тебя интересует именно игрок.
Спасибо! Посмотрю.
И еще давно хотел спросить:
У меня у глока на альтернативную атаку достается второй пистолет (меняется точность и скорость стрельбы). Можно ли при этом как-то менять количество патронов в обойме? Сам я не догнал как это сделать, таким образом, по идее, со вторым стволом количество патронов должно в 2 раза увеличиться и уменьшиться обратно, если снова нажать вторую атаку.