cs插件吧 关注:8,246贴子:88,478

【小白白】教程:实体的pdata属性(类成员变量)

只看楼主收藏回复


有图莫慌


IP属地:广东1楼2016-12-05 09:27回复
      在hl引擎里面, CBaseEntity类将每个实体的属性数据(成员变量)、操作方法(成员函数)封装在一起形成一个整体,并作为基类派生出多种派生类(如CBasePlayer)实现实体的多态。
      大部分类成员变量并没有公开,只能通过指针的方式读取或修改。实际上,提供类对象的指针+特定的offset即可对目标成员变量操作。然而在amxx中我们并没有简单办法根据实体id取得类对象指针,也没有办法对这个指针加offset后直接读写内存。幸亏fakemeta和hamsandwich模块给我们提供了操作成员变量的方法。
      楼下将会比较详细的介绍喔


    IP属地:广东2楼2016-12-05 09:28
    回复
        首先你需要知道为了实现目标要操作什么类的什么成员变量,还要知道目标成员变量的offset(如108)和类型(如float)。根据实体的classname可以大致判定类名。如:

        我们可以看到,很多类之间有很强的继承关系,实际上对于CAK47类的实体你也可以把它当做CBasePlayerWeapon甚至CBasePlayerItem看待,但你不能把它当做CBasePlayer看待。当然,所有的实体都可以当做CBaseEntity。


      IP属地:广东3楼2016-12-05 09:31
      收起回复
          我们可以通过以下native对成员变量操作。


        IP属地:广东4楼2016-12-05 09:32
        回复
          注意:
          1. bool类型在fakemeta和hamsandwich并没有提供native,你可以尝试使用stock。
          2. CBaseEntity *包含CBasePlayer *和CBasePlayerWeapon *等派生类可以混合使用,但是不能和edict混用,更不能直接获取int因为那个的结果是指针而不是实体id。
          3. 在使用pdata之前必须检查pev_valid(iEntity)==2,否则极易闪退崩溃且无任何错误信息。
          4. 请不要往pdata里面填乱七八糟的错误信息,比如不可以给m_iTeam设置类似于233之类不明数值否则会有严重后果。
          5. 在使用pdata前请想清楚目标实体的类名,防止出现给CBasePlayerWeapon设置m_flNextAttack之类的错误。
          6. 以上linux_offset表示在linux系统下会把这个值加上offset填进去,因为linux和windows版的cs服务端不同会导致offset值不同,但是只是大致差一点。不使用linux可以不填或者乱填,强迫症患者可以对照wiki内的填写。(大致是玩家填5武器填4其他自己找,如果你要问为什么会出现差异的话我只能回答是因为虚函数表内可能出现内联情况等等一切我自己都不知道在说什么的东西)
          7. 如果你一定要问怎么设置edict_t *的成员变量请使用orpheu
          8. CHalfLifeMultiplay和CGameRules等非实体类对象的成员变量操作请使用orpheu


          IP属地:广东5楼2016-12-05 09:33
          收起回复
            常见offset:
            // CBasePlayer
            stock m_flVelocityModifier = 108 // float 定身系数
            stock m_iKevlar = 112 // int 护甲类型
            stock m_iTeam = 114 // int 阵营
            stock m_iAccount = 115 // int 金钱(money)
            stock m_iMenu = 205 // int 当前菜单(在显示自定义菜单之前把这个设置为0)
            stock m_iFOV = 363 // int 视角(瞄准镜?)
            //CBasePlayerItem
            stock m_pPlayer= 41 // CBasePlayer * 装备主人(武器取玩家)
            stock m_pNext =42 // CBasePlayerItem *
            stock m_iId = 43 // int 装备id(如CSW_AK47)
            // CBasePlayerWeapon
            stock m_flNextPrimaryAttack= 46 // float 下次左键开火时间
            stockm_flNextSecondaryAttack = 47 // float 下次右键开火时间
            stock m_flTimeWeaponIdle = 48 // float 下次武器播放idle动作时间(如2.33)
            stock m_iClip = 51 // int 武器弹夹子弹数
            stock m_iWeaponState = 74 // int 武器状态?比如m4a1和usp的消音器之类的
            另外附上offset比较全的网址:
            https://wiki.alliedmods.net/CBasePlayer_(CS)
            https://wiki.alliedmods.net/CBasePlayerWeapon_(CS)
            还有个文件叫做offset.inc在BTE Source Code里面(Thanks to Nagist)
            如果不知道offset具体干嘛的去看CS16ND(同上)
            (完


            IP属地:广东6楼2016-12-05 09:33
            收起回复


              IP属地:河南来自Android客户端7楼2016-12-05 10:13
              回复


                IP属地:广东来自Android客户端8楼2016-12-05 10:29
                回复


                  IP属地:湖北9楼2016-12-05 12:06
                  回复


                    IP属地:日本来自Android客户端10楼2016-12-05 13:01
                    回复


                      IP属地:广东来自Android客户端11楼2016-12-05 14:25
                      回复
                        实体链接名参考
                        http://codepad.org/vTOeDGay


                        IP属地:广东16楼2016-12-05 15:29
                        收起回复
                          一直超想问 如果某个MOD没有发布源码还能不能用某种方法找出所有的offset


                          IP属地:日本17楼2016-12-05 17:10
                          回复
                            最近正好在补鲁鲁修


                            IP属地:上海来自Android客户端18楼2016-12-05 18:04
                            回复


                              IP属地:广东来自iPhone客户端20楼2016-12-06 08:34
                              回复