@ mitb

A few days ago i wrote a little tool which you might find use for. Since we all know writing an updater is by far the most time consuming and tedious thing to do when it comes to creating a bot, i made this thing that basically takes the list of accessors from RSBot, and dumps them into a couple of hashmaps for use with reflection.

I reckon it can be quite helpful for ensuring the bot works well whilst still not having an updater completed.

It will output something like this when ran:

rsbot-v2.ms Revision #640 Class 'RSNPCNode': eea Class 'RSNPC': fs Class 'RSNPCDef': pha Class 'RSPlayer': fha Class 'Model': ka Class 'RSPlayerComposite': uea Class 'RSCharacter': kn Class 'RSAnimable': fb Class 'Graphic': sj Class 'LDModel': ub Class 'RSInterface': vfa Class 'Signlink': kk Class 'Client': client Class 'NodeSub': dg Class 'Node': pb Class 'RSItemDef': th Class 'RSItem': ma Class 'NodeDeque': ro Class 'NodeListCache': gj Class 'RSInteractable': kf Class 'RSInteractableDef': ww Class 'StatusNodeList': vm Class 'StatusNode': va Class 'StatusNodeListLoader': bw Class 'RSObjectDef': qfa Class 'RSObject': kd Class 'RSObject': tu Class 'RSObject': ah Class 'RSObject': uba Class 'RSObject': sl Class 'RSObject': nq Class 'RSObject': et Class 'RSObject': eca Class 'RSObjectComposite': jh Class 'RSGround': ih Class 'RSAnimableNode': daa Class 'RSGroundEntity': jg Class 'RSGroundObject': em Class 'RSItemDefLoader': uq Class 'Cache': qr Class 'NodeSubQueue': dr Class 'HashTable': du Class 'RSObjectDefLoader': wb Class 'MenuGroupNode': fa Class 'MenuItemNode': li Class 'DetailInfoNode': up Class 'DetailInfo': qv Class 'TileData': s Class 'Render': ha Class 'RenderData': ofa Class 'RSGroundData': kb Class 'Reference': rk Class 'HardReference': dt Class 'SoftReference': kr Class 'ServerData': fi Class 'Settings': rl Class 'RSInterfaceNode': ff Class 'ChatLine': fk Field [Model] getModel: nq.mb Field [[Ljava/lang/String;] RSNPCDef.getActions: pha.U Field [Ljava/lang/String;] RSNPCDef.getName: pha.ob Field [I] RSNPCDef.getType: pha.nb Field [StatusNodeList] StatusNodeListLoader.getList: bw.a Field [RenderData] getRenderData: gf.P Field [I] getZNear: gf.Y Field [I] getZFar: gf.D Field [I] getXMultiplier: gf.G Field [I] getYMultiplier: gf.eb Field [I] getAbsoluteX1: gf.N Field [I] getAbsoluteX2: gf.db Field [I] getAbsoluteY1: gf.ab Field [I] getAbsoluteY2: gf.kb Field [Ljava/lang/String;] RSItemDef.getName: th.g Field [[Ljava/lang/String;] RSItemDef.getGroundActions: th.i Field [RSItemDefLoader] RSItemDef.getLoader: th.s Field [I] RSItemDef.getID: th.eb Field [I] RSItemDef.getCertTemplateID: th.ab Field [I] RSItemDef.getCertID: th.ab Field [Z] RSItemDef.isMembersObject: th.R Field [I] RSItemDef.getTeam: th.B Field [[Ljava/lang/String;] RSItemDef.getActions: th.f Field [Ljava/lang/String;] ChatLine.getName: fk.f Field [Ljava/lang/String;] ChatLine.getMessage: fk.j Field [RSInteractable] RSInteractableDef.getRSInteractable: ww.o Field [I] RSInteractable.getX: kf.m Field [I] RSInteractable.getY: kf.j Field [B] RSInteractable.getPlane: kf.p Field [I] RSInterfaceNode.getMainID: ff.o Field [I] ServerData.getWorldID: fi.h Field [Model] getModel: kd.model Field [RSNPCDef] RSNPC.getRSNPCDef: fs.sd Field [I] RSNPC.getLevel: fs.md Field [[[I] RSGroundData.getBlocks: kb.w Field [I] RSGroundData.getX: kb.h Field [I] RSGroundData.getY: kb.x Field [F] getZOff: fu.g Field [F] getZX: fu.z Field [F] getZY: fu.x Field [F] getZZ: fu.E Field [F] getXOff: fu.r Field [F] getXX: fu.t Field [F] getXY: fu.l Field [F] getXZ: fu.o Field [F] getYOff: fu.i Field [F] getYX: fu.H Field [F] getYY: fu.D Field [F] getYZ: fu.C Field [Model] getModel: sl.model Field [RSAnimable] RSAnimableNode.getRSAnimable: daa.d Field [RSAnimableNode] RSAnimableNode.getNext: daa.h Field [RSNPC] RSNPCNode.getRSNPC: eea.i Field [Ljava/lang/ref/SoftReference;] SoftReference.getReference: kr.B Field [Ljava/awt/EventQueue;] Signlink.getEventQueue: kk.g Field [I] Graphic.getID: sj.b Field [Ljava/lang/String;] RSCharacter.getMessage: kn.Mb Field [I] RSCharacter.getOrientation: kn.lb Field [I] RSCharacter.getAnimation: kn.Cb Field [I] RSCharacter.isMoving: kn.Jc Field [[Graphic] RSCharacter.getGraphicsData: kn.zb Field [[I] RSCharacter.getLocationY: kn.Pc Field [[I] RSCharacter.getLocationX: kn.Oc Field [I] RSCharacter.getLoopCycleStatus: kn.ab Field [I] RSCharacter.getHPRatio: kn.wb Field [I] RSCharacter.getHeight: kn.zc Field [I] RSCharacter.getInteracting: kn.gc Field [Model] RSCharacter.getModel: kn.model Field [Ljava/lang/String;] MenuItemNode.getAction: li.G Field [Ljava/lang/String;] MenuItemNode.getOption: li.M Field [NodeDeque] NodeListCache.getNodeList: gj.i Field [J] Node.getID: pb.g Field [Node] Node.getPrevious: pb.h Field [Node] Node.getNext: pb.d Field [Cache] RSObjectDefLoader.getCache: wb.g Field [Ljava/lang/Object;] HardReference.get: dt.B Field [StatusNode] StatusNodeList.getHead: vm.f Field [StatusNode] StatusNodeList.getNext: vm.k Field [[Node] HashTable.getBuckets: du.l Field [Node] NodeDeque.getTail: ro.k Field [Node] NodeDeque.getCurrent: ro.u Field [[I] Settings.getData: rl.l Field [I] Reference.getIndex: rk.x Field [[I] RSObjectDef.getChildrenIDs: qfa.J Field [Ljava/lang/String;] RSObjectDef.getName: qfa.b Field [[Ljava/lang/String;] RSObjectDef.getActions: qfa.jb Field [NodeSub] NodeSub.getPrevSub: dg.p Field [NodeSub] NodeSub.getNextSub: dg.t Field [RSAnimableNode] RSGround.getRSAnimableList: ih.n Field [RSInteractable] RSGround.getBoundary1: ih.a Field [RSInteractable] RSGround.getBoundary2: ih.k Field [RSInteractable] RSGround.getWallDecoration1: ih.g Field [RSInteractable] RSGround.getWallDecoration2: ih.i Field [RSInteractable] RSGround.getFloorDecoration: ih.j Field [RSGroundEntity] RSGround.getGroundObject: ih.l Field [I] RSItem.getID: ma.m Field [I] RSItem.getStackSize: ma.j Field [I] RSInterface.getMasterX: vfa.masterX Field [I] RSInterface.getMasterY: vfa.masterY Field [[RSInterface] RSInterface.getComponents: vfa.Db Field [I] RSInterface.getType: vfa.Cb Field [I] RSInterface.getSpecialType: vfa.b Field [[Ljava/lang/String;] RSInterface.getActions: vfa.pd Field [Z] RSInterface.isInventoryInterface: vfa.Ib Field [Ljava/lang/String;] RSInterface.getToolTip: vfa.Xb Field [I] RSInterface.getX: vfa.bb Field [I] RSInterface.getY: vfa.kd Field [I] RSInterface.getWidth2: vfa.yc Field [I] RSInterface.getHeight2: vfa.t Field [I] RSInterface.getBoundsArrayIndex: vfa.Fc Field [I] RSInterface.getBorderThickness: vfa.Rb Field [I] RSInterface.getXRotation: vfa.uc Field [I] RSInterface.getComponentIndex: vfa.oc Field [I] RSInterface.getHeight: vfa.o Field [I] RSInterface.getHorizontalScrollBarSize: vfa.od Field [I] RSInterface.getHorizontalScrollBarThumbPosition: vfa.fb Field [I] RSInterface.getHorizontalScrollBarThumbSize: vfa.yc Field [I] RSInterface.getID: vfa.P Field [Z] RSInterface.isHorizontallyFlipped: vfa.Dc Field [Z] RSInterface.isVerticallyFlipped: vfa.lc Field [I] RSInterface.getComponentStackSize: vfa.hb Field [I] RSInterface.getComponentID: vfa.dd Field [Ljava/lang/String;] RSInterface.getComponentName: vfa.g Field [I] RSInterface.getModelZoom: vfa.fd Field [I] RSInterface.getModelID: vfa.nb Field [I] RSInterface.getModelType: vfa.s Field [I] RSInterface.getParentID: vfa.Sb Field [Ljava/lang/String;] RSInterface.getSelectedActionName: vfa.Bb Field [I] RSInterface.getShadowColor: vfa.Gc Field [Ljava/lang/String;] RSInterface.getText: vfa.U Field [I] RSInterface.getTextColor: vfa.ac Field [I] RSInterface.getTextureID: vfa.Y Field [I] RSInterface.getVerticalScrollBarSize: vfa.Lc Field [I] RSInterface.getVerticalScrollBarPosition: vfa.pb Field [I] RSInterface.getVerticalScrollBarThumbSize: vfa.t Field [I] RSInterface.getWidth: vfa.Yb Field [I] RSInterface.getYRotation: vfa.f Field [I] RSInterface.getZRotation: vfa.Hb Field [Model] getModel: uba.model Field [I] DetailInfo.getDetailLevel: qv.c Field [StatusNode] StatusNode.getNext: va.b Field [StatusNode] StatusNode.getPrevious: va.f Field [NodeSub] NodeSubQueue.getTail: dr.a Field [NodeSub] NodeSubQueue.getCurrent: dr.r Field [NodeSubQueue] Cache.getList: qr.c Field [I] Cache.getInitialCount: qr.r Field [I] Cache.getSpaceLeft: qr.t Field [HashTable] Cache.getTable: qr.i Field [Cache] RSItemDefLoader.getCache: uq.i Field [Z] RSItemDefLoader.isMembers: uq.l Field [NodeSubQueue] MenuGroupNode.getItems: fa.F Field [Ljava/lang/String;] MenuGroupNode.getOption: fa.D Field [I] MenuGroupNode.size: fa.G Field [I] RSPlayer.getTeam: fha.ad Field [RSPlayerComposite] RSPlayer.getComposite: fha.hd Field [Ljava/lang/String;] RSPlayer.getName: fha.nd Field [I] RSPlayer.getLevel: fha.ed Field [Model] RSObject.getModel: eca.ob Field [S] RSAnimable.getX1: fb.O Field [S] RSAnimable.getY1: fb.B Field [S] RSAnimable.getY2: fb.H Field [S] RSAnimable.getX2: fb.I Field [DetailInfo] DetailInfoNode.getDetailInfo: up.s Field [[[I] TileData.getHeights: s.c Field [Model] getModel: tu.model Field [I] RSPlayerComposite.getNPCID: uea.o Field [[S] LDModel.getIndices1: ub.Jb Field [[S] LDModel.getIndices2: ub.bb Field [[S] LDModel.getIndices3: ub.U Field [[I] LDModel.getXPoints: ub.X Field [[I] LDModel.getYPoints: ub.Xb Field [[I] LDModel.getZPoints: ub.qb Field [Model] RSGroundObject.getModel: em.model Field [Model] getModel: et.eb Field [Model] getModel: ah.mb Static Field [HashTable] getRSNPCNC: bp.B Static Field [[I] getRSNPCIndexArray: go.Y Static Field [I] getRSNPCCount: caa.j Static Field [[RSPlayer] getRSPlayerArray: nj.k Static Field [[I] getRSPlayerIndexArray: qia.r Static Field [I] getRSPlayerCount: id.i Static Field [RSPlayer] getMyRSPlayer: vaa.x Static Field [I] getBaseX: eaa.f Static Field [I] getBaseY: wb.u Static Field [I] getPublicChatMode: dw.R Static Field [I] getLoopCycle: iha.J Static Field [I] getSelfInteracting: eaa.f Static Field [[[[B] getGroundByteArray: r.z Static Field [I] getPlane: ko.i Static Field [I] getCamPosX: cj.L Static Field [I] getCamPosY: wt.x Static Field [I] getCamPosZ: hm.b Static Field [I] getCameraPitch: hp.e Static Field [I] getCameraYaw: vk.H Static Field [[Ljava/awt/Rectangle;] getRSInterfaceBoundsArray: ei.L Static Field [[Z] getValidRSInterfaceArray: eia.d Static Field [Ljava/lang/String;] getCurrentUsername: mn.d Static Field [Ljava/lang/String;] getCurrentPassword: dg.k Static Field [Ljava/awt/Canvas;] getCanvas: gga.m Static Field [input/Keyboard] getKeyboard: vf.c Static Field [input/Mouse] getMouse: cv.x Static Field [Callback] getCallback: client.callback Static Field [[I] getSkillExperiencesMax: pha.rb Static Field [I] getMinimapScale: pd.g Static Field [[I] getCURVECOS: uf.Fb Static Field [[I] getCURVESIN: uf.Cb Static Field [I] getMinimapSetting: up.N Static Field [I] getMinimapAngle: og.F Static Field [F] getMinimapOffset: ea.m Static Field [Z] isSpellSelected: hc.d Static Field [I] isItemSelected: ew.o Static Field [Ljava/lang/String;] getSelectedItemName: rd.b Static Field [HashTable] getRSItemHashTable: og.G Static Field [StatusNodeListLoader] getRSInteractableDefListLoader: gia.B Static Field [RSObjectDefLoader] getRSObjectDefLoader: sl.M Static Field [[[[RSGround] getRSGroundArray: sv.k Static Field [[ChatLine] getChatLines: au.e Static Field [Z] isMenuCollapsed: uq.z Static Field [NodeSubQueue] getCollapsedMenuItems: vs.f Static Field [I] getMenuWidth: oga.c Static Field [MenuGroupNode] getCurrentMenuGroupNode: qo.K Static Field [I] getSubMenuWidth: rr.i Static Field [I] getSubMenuX: mda.l Static Field [I] getSubMenuY: ta.h Static Field [I] getMenuOptionsCount: wp.a Static Field [I] getMenuOptionsCountCollapsed: gw.j Static Field [Z] isMenuOpen: jba.q Static Field [I] getMenuX: oga.c Static Field [I] getMenuY: ww.n Static Field [NodeDeque] getMenuItems: vj.g Static Field [RSItemDefLoader] getRSItemDefLoader: qw.u Static Field [I] getDestX: jp.M Static Field [I] getDestY: eda.e Static Field [DetailInfoNode] getDetailInfoNode: we.T Static Field [[TileData] getTileData: ko.e Static Field [[RSGroundData] getRSGroundDataArray: la.o Static Field [ServerData] getWorldData: kd.rb Static Field [[I] getSkillLevels: in.K Static Field [[I] getSkillExperiences: al.Q Static Field [[I] getSkillLevelMaxes: hv.S Static Field [I] getLoginIndex: qk.f Static Field [Settings] getSettingArray: u.j Static Field [HashTable] getRSInterfaceNC: gha.f Static Field [I] getGUIRSInterfaceIndex: ks.c Static Field [[[RSInterface] getRSInterfaceCache: pn.F

Of course, this probably still has some flaws, and can be adjusted to parse the other information contained in the file as well, however i just pulled down the basics for this. Not too hard adjusting it to your own needs really.

Good luck!

EDIT: I forgot to include one class in package, redownload and it’ll be fine. Sorry about that!


This information will save me quite a bit of time since my updater is more than a little broken and _frank-ly looking at code I wrote last week sometimes makes me go !??WTF??!.. the code signature/fingerprinting I wrote a couple years ago is /really/ confusing after not looking at it for quite some time.

Thanks again Spelljohan

Hehe, nice. This is exactly what I did when writing the accessor method code for cherokee years ago, I just parsed ollie’s output into my format. :slight_smile:

in response to semaphore, in the past 2 years in which i’ve learned quite a lot under the “guidance” of frank_ (occasional conversations where i would just verify i was learning properly – no-doubt helpful, however), i’ve been trying to perfect bot, “updater”, and decompiler systems. when discussing how exactly an “updater” would function, i came up with a general theory of how the entire thing would work. i’ve thought about different means of “figuring-out” different aspects of code (from class purposes to code blocks) through logic-based decision learning trees, metric-based statistical classifiers, tree-based expression matching, etc. one thing i couldn’t quite fully think through was the fingerprint/signature/hash option (hash would probably not be the best term here). i was reminded of an article posted some time ago (you or byte or pplsuqbawlz i think) on automatic identification of java code through fingerprints when learning about how tools like shazam identify songs or grooveshark classifies music. unfortunately while i can think about the general process, it seemed to functionally reduce to an abstraction over classifiers as i’ve previously looked into. was that how you implemented it? is the conclusion a valid one?

the feature vector used in a classifier could be considered a signature of sorts

@frank_: that’s what i was saying
@semaphore: cough