* * * Форумы на Наша-Life THREAD * * * -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- THREAD : Альтернативный режим стрельбы пистолета. Started at 21-04-2007 21:05 by Web-Monster Visit at https://bbs.nashalife.ru/showthread.php?threadid=36438 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Post 1] Author : Web-Monster Date : 21-04-2007 21:05 Title : Альтернативный режим стрельбы пистолета. Давайте кодеры пишите туторы, я начну, вот сейчас перевёл и оформил тутор с одного забугорного сайта. Можите добавлять свои туторы на мой сайт о коддинге и маппинге уже довольно известный!!! [url]WWW.STAV-MaPPinG.INFO[/url] В этом туторе я покажу как добавить к пистолету альтернативный режимы стрельбы, а точнее на левую кнопку стреляет как обычно, а на правую 3 патрона. Итак приступим: зайдём в [b]weapon_pistol.cpp[/b]. [color=#0000ff]Синий цвет:[/color] Код Valve [color=#ff0000]Красный цвет:[/color] Новый код Шаг 1 Инициализация: [u]Перейдите к этой части кода:[/u] [color=#0000ff]private: float m_flSoonestPrimaryAttack; float m_flLastAttackTime; float m_flAccuracyPenalty; int m_nNumShotsFired;[/color] [u]Ниже этого кода вставляем следующее:[/u] [color=#ff0000]float m_flNextFireModeChange; int nFireCount; bool bFiring; bool bFireMode; void checkCount(); void FireMode(); [/color] [u]Затем идите к описанию данных initializations:[/u] [color=#0000ff]BEGIN_DATADESC( CWeaponPistol ) DEFINE_FIELD( m_flSoonestPrimaryAttack, FIELD_TIME ), DEFINE_FIELD( m_flLastAttackTime, FIELD_TIME ), DEFINE_FIELD( m_flAccuracyPenalty, FIELD_FLOAT ), DEFINE_FIELD( m_nNumShotsFired, FIELD_INTEGER ),[/color] [u]Надо добавить следующий код:[/u] [color=#ff0000]DEFINE_FIELD( m_flNextFireModeChange, FIELD_TIME ), DEFINE_FIELD( nFireCount, FIELD_INTEGER ), DEFINE_FIELD( bFiring, FIELD_BOOLEAN ), DEFINE_FIELD( bFireMode, FIELD_BOOLEAN ),[/color] [u]Найдите это:[/u] [color=#0000ff]CWeaponPistol::CWeaponPistol( void ) { m_flSoonestPrimaryAttack = gpGlobals->curtime; m_flAccuracyPenalty = 0.0f; m_fMinRange1 = 24; m_fMaxRange1 = 1500; m_fMinRange2 = 24; m_fMaxRange2 = 200; m_bFiresUnderwater = true;[/color] [u]И добавьте это:[/u] [color=#ff0000]nFireCount = 3; bFiring = false; bFireMode = false; m_flNextFireModeChange = gpGlobals->curtime; [/color] Шаг 2 Запрос к checkCount(): [u]Добавить: checkCount(); в CWeaponPistol::ItemPostFrame Показываю как это нужно сделать:[/u] [color=#0000ff]void CWeaponPistol::ItemPostFrame( void ) { ... ...[/color] [color=#ff0000]checkCount();[/color] [color=#0000ff]}[/color] Шаг 3 Введение функций: [u]Создайте где нибудь ниже функцию:[/u] [color=#ff0000]void CWeaponPistol::FireMode( void ) { if ( m_flNextFireModeChange < gpGlobals->curtime ) { nFireCount = 3; bFireMode = !bFireMode; m_flNextFireModeChange = gpGlobals->curtime + 0.5f; } }[/color] [u]И ещё ниже создайте вот эту:[/u] [color=#ff0000]void CWeaponPistol::checkCount( void ) { CBasePlayer *pPlayer = ToBasePlayer( GetOwner() ); if (pPlayer == NULL) return; if (pPlayer->m_afButtonPressed & IN_ATTACK2) { if(bFireMode) bFiring = true; nFireCount = 0; }else if (pPlayer->m_afButtonReleased & IN_ATTACK2) { bFiring = false; } if((bFireMode==false)&&(gpGlobals->curtime - m_flLastAttackTime >= 0.1f)){ if(nFireCount < 3){ PrimaryAttack(); nFireCount++; } } if((bFiring)&&(gpGlobals->curtime - m_flLastAttackTime >= 0.1f)) PrimaryAttack(); }[/color] Шаг 4: [u]Найдите функцию перезарядки и добавьте: 'bFiring = false': [/u] [color=#0000ff]bool CWeaponPistol::Reload( void ) { bool fRet = DefaultReload( GetMaxClip1(), GetMaxClip2(), ACT_VM_RELOAD ); if ( fRet ) {[/color] [color=#ff0000] bFiring = false; [/color] [color=#0000ff]WeaponSound( RELOAD ); m_flAccuracyPenalty = 0.0f; } return fRet; } [/color] Так вроде всё. [u]Перевод:[/u] [b]WeB-Monster[/b] -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Post 2] Author : Lolmen Date : 22-04-2007 01:57 Ну во первых красный код не твой а код из тутора :D Во вторых не bind "x" "+firemode", а достаточно нажать RMB так как +attack2 будет использоваться в данном случае... На тутор это не похоже, похоже на простой копи паст без обьяснения что и где будет происходить и как работать, ведь цель тутора, не просто научить делать фиремоды, но и понять как они организовываются с User Input, и прочими вещами... Так что садись и фикси... Советую делать коммент почти на каждую строчку с обьяснением что каждая функция делает, и какие аргументы а главное какого типа туда передавать, мне то понятно, а вот простой маппер скажем захочет вставить эту возможность в свой мод... И что? Ладно он кода не знает, можно какой-то смысл понять если знаешь английский, а если человек английского не знает... Вот для того и нужны комменты :D маппер прочитал, маппер понял... А понял он например смысловую нагрузку какого-то куска кода, для того чтобы он смог использовать полученные знания совершенно в других местах, например он узнал, что тот-же кусок кода : [QUOTE] bFireMode = !bFireMode; m_flNextFireModeChange = gpGlobals->curtime + 0.5f; [/QUOTE] Несёт в себе великий смысл, а не просто две глупые строки английских букв :D, например он означал что при обращении к функции её врутренняя переменнная bool bFireMode т.е булевого типа меняет своё значение на противоположное... хотя сам по себе знак "!" не означает факториал числа просто в высшей матемке есть такой загон что перед числом или переменной ставиться знак ! он означает факториал числа, а в булевой алгебре это записывается по другому, непонятно зачем авторы C сделали восклицательный знак как приставку "НЕ" :D Так вот : если записать например [QUOTE] if ( bFireMode ){ "делаем так" }else { "денлаем нита" } [/QUOTE] что будет значиь если ( мы в режиме стрельбы ) { "делаем так" }иначе { "делаем нитак" } равно как и обратное [QUOTE] if ( !bFireMode ){ "делаем нитак" }else{ "делаем так" } [/QUOTE] порусски если ( мы НЕ в режиме стрельбы } { ... } иначе { ... } Фигурные скобки лутше ставить чтобы разграничивать условия... m_flNextFireModeChange переменная которая будет приравниваться к текущему игровому времени + запас в пол секунды, так как здеся секунда не означает 60 долей сеунд, здесь секунда плавающее значение от 0.00000 до 1.000000, может возникнуть вопрос почему 6 нулей после точки? потому что эато 32 битное значение с плавающей запятой записывается как float, иначе говоря дробное число простой точности... есть также числа двойной точности напрмиер с 8-12-16 нолями, но это зависит от компилятора и cоответственно поддерживаемой разрядностью у процессора и записывается как double и long double. Вот такие батенька детали могут заинтересовать народ :D -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- The messages has been download from Форумы на Наша-Life at https://bbs.nashalife.ru at 02.07.2024 04:31:13