Advertisement
Chiddix

ActorDefinitionParser

Mar 16th, 2013
193
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.74 KB | None | 0 0
  1. package com.runescape.cache.parser;
  2.  
  3. import java.io.IOException;
  4. import java.nio.ByteBuffer;
  5.  
  6. import com.runescape.cache.IndexedFileSystem;
  7. import com.runescape.cache.archive.Archive;
  8. import com.runescape.cache.util.ByteBufferUtil;
  9.  
  10. /**
  11.  * A class which parses actor definitions.
  12.  */
  13. public final class ActorDefinitionParser {
  14.  
  15.     /**
  16.      * The indexed file system.
  17.      */
  18.     private final IndexedFileSystem fs;
  19.  
  20.     /**
  21.      * Creates the actor definition parser.
  22.      * @param fs The indexed file system.
  23.      */
  24.     public ActorDefinitionParser(IndexedFileSystem fs) {
  25.         this.fs = fs;
  26.     }
  27.    
  28.     /**
  29.      * Parses the actor definitions.
  30.      * @return The actor definitions.
  31.      * @throws IOException if an I/O error occurs.
  32.      */
  33.     public ActorDefinition[] parse() throws IOException {
  34.         Archive config = Archive.decode(fs.getFile(0, 2));
  35.         ByteBuffer dat = config.getEntry("npc.dat").getBuffer();
  36.         ByteBuffer idx = config.getEntry("npc.idx").getBuffer();
  37.        
  38.         int count = idx.getShort();
  39.         int[] indices = new int[count];
  40.         int index = 2;
  41.         for (int i = 0; i < count; i++) {
  42.             indices[i] = index;
  43.             index += idx.getShort();
  44.         }
  45.        
  46.         ActorDefinition[] defs = new ActorDefinition[count];
  47.         for (int i = 0; i < count; i++) {
  48.             dat.position(indices[i]);
  49.             defs[i] = parseDefinition(i, dat);
  50.         }
  51.  
  52.         return defs;
  53.     }
  54.    
  55.     /**
  56.      * Parses a single definition.
  57.      * @param id The actor's id.
  58.      * @param buffer The buffer.
  59.      * @return The definition.
  60.      */
  61.     private ActorDefinition parseDefinition(int id, ByteBuffer buffer) {
  62.         ActorDefinition def = new ActorDefinition(id);
  63.  
  64.         while (true) {
  65.             int code = buffer.get() & 0xFF;
  66.  
  67.             if (code == 0) {
  68.                 return def;
  69.             } else if (code == 1) {
  70.                 int modelCount = buffer.get() & 0xFF;
  71.                 def.setModelIdSize(modelCount);
  72.                 for (int index = 0; index < modelCount; index++) {
  73.                     def.setModelId(index, buffer.getShort() & 0xFFFF);
  74.                 }
  75.             } else if (code == 2) {
  76.                 def.setName(ByteBufferUtil.readString(buffer));
  77.             } else if (code == 3) {
  78.                 def.setDescription(ByteBufferUtil.readString(buffer));
  79.             } else if (code == 12) {
  80.                 def.setSize(buffer.get());
  81.             } else if (code == 13) {
  82.                 def.setStandAnimationId(buffer.getShort() & 0xFFFF);
  83.             } else if (code == 14) {
  84.                 def.setWalkAnimationId(buffer.getShort() & 0xFFFF);
  85.             } else if (code == 17) {
  86.                 def.setWalkAnimationId(buffer.getShort() & 0xFFFF);
  87.                 def.setTurnAroundAnimationId(buffer.getShort() & 0xFFFF);
  88.                 def.setTurnRightAnimationId(buffer.getShort() & 0xFFFF);
  89.                 def.setTurnLeftAnimationId(buffer.getShort() & 0xFFFF);
  90.             } else if (code >= 30 && code < 40) {
  91.                 System.out.println("code:"+code);
  92.                 String str = ByteBufferUtil.readString(buffer);
  93.                 System.out.println("str:"+str);
  94.                 if (str.equalsIgnoreCase("hidden")) {
  95.                     str = null;
  96.                 }
  97.                 def.setAction(code - 30, str);
  98.             } else if (code == 40) {
  99.                 int modelColorCount = buffer.get() & 0xFF;
  100.                 def.setOriginalModelColorSize(modelColorCount);
  101.                 def.setModifiedModelColorSize(modelColorCount);
  102.                 for (int index = 0; index < modelColorCount; index++) {
  103.                     def.setOriginalModelColor(index, buffer.getShort() & 0xFFFF);
  104.                     def.setModifiedModelColor(index, buffer.getShort() & 0xFFFF);
  105.                 }
  106.             } else if (code == 60) {
  107.                 int headModelCount = buffer.get() & 0xFF;
  108.                 def.setHeadModelIdSize(headModelCount);
  109.                 for (int index = 0; index < headModelCount; index++) {
  110.                     def.setHeadModelId(index, buffer.getShort() & 0xFFFF);
  111.                 }
  112.             } else if (code == 93) {
  113.                 def.setVisibleOnMinimap(false);
  114.             } else if (code == 95) {
  115.                 def.setCombatLevel(buffer.getShort() & 0xFFFF);
  116.             } else if (code == 97) {
  117.                 def.setSizeX(buffer.getShort() & 0xFFFF);
  118.             } else if (code == 98) {
  119.                 def.setSizeY(buffer.getShort() & 0xFFFF);
  120.             } else if (code == 99) {
  121.                 def.setVisible(true);
  122.             } else if (code == 100) {
  123.                 def.setBrightness(buffer.get());
  124.             } else if (code == 101) {
  125.                 def.setContrast(buffer.get() * 5);
  126.             } else if (code == 102) {
  127.                 def.setHeadIcon(buffer.getShort() & 0xFFFF);
  128.             } else if (code == 103) {
  129.                 def.setDegreesToTurn(buffer.getShort() & 0xFFFF);
  130.             } else if (code == 106) {
  131.                 int varBitId = buffer.getShort() & 0xFFFF;
  132.                 if (varBitId == 65535) {
  133.                     varBitId = -1;
  134.                 }
  135.                 def.setVarBitId(varBitId);
  136.                 int settingId = buffer.getShort() & 0xFFFF;
  137.                 if (settingId == 65535) {
  138.                     settingId = -1;
  139.                 }
  140.                 def.setSettingId(settingId);
  141.                
  142.                 int childrenCount = buffer.get();
  143.                 def.setChildrenIdSize(childrenCount + 1);
  144.                 for (int index = 0; index < childrenCount; index++) {
  145.                     int childId = buffer.getShort() & 0xFFFF;
  146.                     if (childId == 65535) {
  147.                         childId = -1;
  148.                     }
  149.                     def.setChildId(index, childId);
  150.                 }
  151.             } else if (code == 107) {
  152.                 def.setClickable(false);
  153.             }
  154.         }
  155.     }
  156. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement