安卓半条命吧 关注:14,702贴子:141,448

【硬核向】CSMoE加枪教程

只看楼主收藏回复

如果百度贴吧排版炸了请看附件里面的原稿


IP属地:浙江1楼2019-04-16 14:23回复
    现在开始分块讲解怎么填新加的数据
    1.Spawn


    m_iId =这相当于武器原型,因为我们之前把AK47都替换成M14EBR了,所以这回还得改回去,改成WEAPON_AK47
    m_iDefaultAmmo 这个是弹夹子弹量,我们创一个常变量const int M14EBR_MAXCLIP = 20;
    m_flAccuracy 参考weapon.iniM14EBR的AccuracyDefault 填0.2
    m_iShotsFired 这个与后面的开火有关
    改后


    IP属地:浙江4楼2019-04-16 14:28
    回复
      2.Precache

      缓存部分 请在相应位置加上PRECACHE_MODEL("models/w_m14ebr.mdl");
      把P模缓存
      缓存声音 ,至于要缓存哪些声音,到sound/weapons里面找和你要加的武器相关的声音注意
      声音要和模型的event所用的声音文件一样
      比如draw这个动作的声音是m14_draw.wav缓存的就该是m14_draw.wav而不是m14ebr_draw.wav
      由于开火声音是通过客户端代码写了播放的,所以不受模型查看器里面写的影响(缓存名字可以任意,总之event里用到的声音文件是根据这个缓存的来的)
      m_iShell 子弹弹壳 说实话这个哪些武器用哪些弹壳这我真不知道(坐等白白解释)
      m_usFireM14EBR 这个和开火事件有关,照猫画虎改就行
      改后


      IP属地:浙江5楼2019-04-16 14:30
      收起回复
        3. GetItemInfo

        Emmm结构啊指针啥的我一个半吊子也讲不明白,可以理解成p是一种属性,属性里面有很多参数
        就提一些iMaxAmmo1 最大子弹量,M14最大子弹量是90,和MAX_AMMO_762NATO这个是一样的,可以不变
        ImaxClip 弹夹子弹量 这里填前面的常变量M14EBR_MAXCLIP就行,不知道和前面的m_iDefaultAmmo有什么区别(坐等白白解释)
        iId 一样写武器原型WEAPON_AK47
        iWeight 不清楚,重量?(坐等白白解释)可是这个数值又不和地速相等,应该有个转换的函数吧,填AK47_WEIGHT即可
        改后


        IP属地:浙江6楼2019-04-16 14:31
        回复
          4.Deplay
          切枪,又看到m_flAccuracy和之前一样写法0.2,都是CBasePlayerWeapon类下的一个变量,不用深究为什么名字就是m_flAccuracy
          iShellOn不明(坐等白白解释)

          5. PrimaryAttack和M14EBRFire
          首先得知道M14EBRFire(float flSpread, floatflCycleTime, BOOL fUseAutoAim)这个函数里面的三个参数,因为函数在PrimaryAttack填对数据很重要
          flSpread这个计算由三个部分组成Spread+ AccuracyMul * m_flAccuracy
          而m_flAccuracy与m_iShotsFired(射出子弹量)有关
          看M14EBRFire这个函数可以知道m_flAccuracy显然是一个增加的量,而这需要一个上限
          即if (m_flAccuracy > MaxAccuracy)
          m_flAccuracy= MaxAccuracy;
          MaxAccuracy查看M14的weapons.ini可以知道是1.25所以MaxAccuracy处填1.25
          Vector vecDir =m_pPlayer->FireBullets3(vecSrc, gpGlobals->v_forward, flSpread, 8192, 2,BULLET_PLAYER_762MM, 36, 0.98, m_pPlayer->pev, FALSE,m_pPlayer->random_seed);
          太长了这个
          注意36和0.98
          36是伤害damage查weapon.ini可以知道M14是46
          0.98是RangeModifier什么意思我就不知道了。Weapon.ini里面没有就不动吧
          m_flTimeWeaponIdle = UTIL_WeaponTimeBase()+ 1.9;这个是什么意思我也不清楚,大概是恢复到idle动作的时间
          下个重要的数据KickBack
          四个KickBack分别对应weapons.ini的KickBackWalking
          KickBackNotOnGround
          KickBackDucking
          KickBack
          照着M14的把AK47的改了即可
          改后
          图太长见附件wpn_m14ebr.cpp
          倒回来看PrimaryAttack
          flSpread这个计算由三个部分组成(对应weapon.ini )Spread + AccuracyMul *m_flAccuracy
          参照M14的写法
          改后


          IP属地:浙江7楼2019-04-16 14:40
          回复
            6.Reload
            把M14EBR_MAX_CLIP改成之前写的常变量M14EBR_MAXCLIP
            注意DefaultReload(int iClipSize, int iAnim,float fDelay, int body)
            第三个参数是装弹时间把2.45改成3.2
            现在看wpn_m14ebr.h
            把那4个宏改了

            MAX_SPEED参考weapon.ini的MaxSpeed = 215
            其余的之前有提到过
            注意下面的GetKnockBackData()
            返回值对应weapon.ini的 KnockBack和VelocityModifier (最后一项)
            M14的即是return { 450.0f, 400.0f, 400.0f, 200.0f, 0.5f };
            并且在下行加上
            const char *GetCSModelName() override {return "models/w_m14ebr.mdl"; }
            否则拾起武器再丢出去就会变成原型武器的W模
            至此搞定cpp和h就完成一大半了


            IP属地:浙江8楼2019-04-16 14:46
            回复
              Part2我们到

              添加现有项那两个cpp
              Part3
              再到server/dlls/weapons.cpp下找到
              void W_Precache()
              在这个函数下你懂的位置添加
              UTIL_PrecacheOtherWeapon("weapon_m14ebr");
              Part4 客户端

              添加新建项

              同样模仿把ak47event抄过来
              把ak47都改成m14ebr
              把enum m14ebr_e里面
              SHOOT2 3 砍了
              以及这三处改成这样
              static const char *SOUNDS_NAME ="weapons/m14ebr-1.wav";
              gEngfuncs.pEventAPI->EV_WeaponAnimation(M14EBR_SHOOT1,2);
              PLAY_EVENT_SOUND(SOUNDS_NAME);
              里面有些数据我就不说了,因为我也不知道M14EBR 在cso里的枪火是从哪个坐标出来的,弹壳从哪里飞出来的
              所以其实里面没什么好改的,但是如果是以后加带特殊效果的武器,这个文件就可能需要自己写点东西了
              Part5 同part4的地方有个hl_events.cpp
              模仿在两个位置写上HOOK_EVENT(m14ebr, FireM14EBR);
              DECLARE_EVENT(FireM14EBR);
              然后就可生成文件了
              总结一下其实要大改的就是两个.cpp和一个.h
              其余的就是放mdl spr 改hud的事情这些不多说了


              IP属地:浙江9楼2019-04-16 14:48
              收起回复
                关于编译错误的后记
                1.

                把所有的小数都加上f
                2.

                补上SDL2文件夹


                IP属地:浙江10楼2019-04-16 14:49
                收起回复
                  控制台输入sv_cheats 1再输入sv_enttools_enable 1,最后输入ent_create weapon_m14ebr
                  碎碎念
                  MoE跟BTE比起来加枪是麻烦不少,但有一个好处就是可以修改的地方更多了,加这些皮肤武器并不困难。举一反三你可以加狙击枪、冲锋枪,我还希望能有人学会然后能帮助制作者添加更多的武器(特别是枪王决战的武器,这个模式因为缺少武器鸽了好久了)
                  顺便diss某个拿着所谓版权倒卖别人开发成果的孤儿,你真是一个CSOL单机掘墓人


                  IP属地:浙江12楼2019-04-16 15:13
                  回复
                    (●—●)好难(✪▽✪)过,这不是我想要的结果,结果


                    来自Android客户端13楼2019-04-16 15:40
                    回复
                      那如果是雞炮這種例子要怎麼處理


                      来自Android客户端14楼2019-04-16 15:40
                      回复
                        你怎么也来了


                        IP属地:湖北来自Android客户端15楼2019-04-16 16:05
                        回复
                          有一个问题,除开火之外的动作音效都是qc里就可以写的,在缓存音效的时候是不是就可以只缓存一个开火音效不用考虑其他的?


                          IP属地:湖北来自Android客户端16楼2019-04-16 16:16
                          收起回复


                            IP属地:广西来自Android客户端17楼2019-04-16 18:58
                            回复
                              看不懂


                              来自Android客户端19楼2019-04-17 05:04
                              回复