summaryrefslogtreecommitdiff
path: root/NET/worlds/scape/PosableShape.java
diff options
context:
space:
mode:
authorFuwn <[email protected]>2021-05-03 16:38:41 -0700
committerFuwn <[email protected]>2021-05-03 16:38:41 -0700
commite1e781bb2135ef78592226f1a3eaba4925702f1f (patch)
tree8a5b590463ed413e1c6eabb719130e701b95ca63 /NET/worlds/scape/PosableShape.java
downloadworlds.jar-e1e781bb2135ef78592226f1a3eaba4925702f1f.tar.xz
worlds.jar-e1e781bb2135ef78592226f1a3eaba4925702f1f.zip
:star:HEADmain
Diffstat (limited to 'NET/worlds/scape/PosableShape.java')
-rw-r--r--NET/worlds/scape/PosableShape.java2679
1 files changed, 2679 insertions, 0 deletions
diff --git a/NET/worlds/scape/PosableShape.java b/NET/worlds/scape/PosableShape.java
new file mode 100644
index 0000000..db036c9
--- /dev/null
+++ b/NET/worlds/scape/PosableShape.java
@@ -0,0 +1,2679 @@
+/* */ package NET.worlds.scape;
+/* */
+/* */ import NET.worlds.console.AvMenu;
+/* */ import NET.worlds.console.Console;
+/* */ import NET.worlds.console.DefaultConsole;
+/* */ import NET.worlds.core.IniFile;
+/* */ import NET.worlds.core.ServerTableManager;
+/* */ import NET.worlds.core.Std;
+/* */ import NET.worlds.core.Timer;
+/* */ import NET.worlds.core.TimerCallback;
+/* */ import NET.worlds.network.Cache;
+/* */ import NET.worlds.network.CacheFile;
+/* */ import NET.worlds.network.Galaxy;
+/* */ import NET.worlds.network.NetUpdate;
+/* */ import NET.worlds.network.URL;
+/* */ import NET.worlds.network.WorldServer;
+/* */ import java.awt.Color;
+/* */ import java.io.IOException;
+/* */ import java.io.PrintStream;
+/* */ import java.io.RandomAccessFile;
+/* */ import java.net.MalformedURLException;
+/* */ import java.util.Enumeration;
+/* */ import java.util.Hashtable;
+/* */ import java.util.StringTokenizer;
+/* */ import java.util.Vector;
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */ public class PosableShape
+/* */ extends Shape
+/* */ implements FrameHandler, Prerenderable, MouseDownHandler, ShapeLoaderListener, TimerCallback
+/* */ {
+/* 145 */ protected int figureType = -1;
+/* 146 */ private float closestView = 10000.0F;
+/* */
+/* */ private int farViewCount;
+/* */
+/* */ private Vector<String> animationList;
+/* */
+/* */ private boolean COG;
+/* */
+/* 154 */ private boolean setPrepFigure = true;
+/* */
+/* */
+/* 157 */ private boolean runPrepFigure = this.setPrepFigure;
+/* */
+/* */
+/* */ private static URL defaultURL;
+/* */
+/* */
+/* */ public static URL getDefaultURL()
+/* */ {
+/* 165 */ return defaultURL;
+/* */ }
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* 173 */ protected DroneAnimator animator = null;
+/* */
+/* */ public PosableShape(URL url) {
+/* 176 */ setURL(url);
+/* */ }
+/* */
+/* */ public PosableShape(URL url, boolean isAW)
+/* */ {
+/* 181 */ this.setPrepFigure = isAW;
+/* */
+/* */
+/* 184 */ this.runPrepFigure = this.setPrepFigure;
+/* */
+/* 186 */ setURL(url);
+/* */ }
+/* */
+/* */
+/* */
+/* */
+/* */ public void loadInit()
+/* */ {
+/* 194 */ setURL(defaultURL);
+/* */ }
+/* */
+/* */ public void markVoid()
+/* */ throws ClassCastException
+/* */ {
+/* 200 */ if (this.animator != null) {
+/* 201 */ this.animator.endanimations();
+/* 202 */ if (this.figureType != -1)
+/* 203 */ this.animator.delayedDeltype(this.figureType);
+/* */ }
+/* 205 */ this.animator = null;
+/* */
+/* 207 */ getRoom().removePrerenderHandler(this);
+/* */
+/* 209 */ super.markVoid();
+/* */ }
+/* */
+/* */ public synchronized void recursiveAddRwChildren(WObject parent)
+/* */ {
+/* 214 */ if (hasClump()) {
+/* 215 */ return;
+/* */ }
+/* 217 */ super.recursiveAddRwChildren(parent);
+/* */
+/* 219 */ getRoom().addPrerenderHandler(this);
+/* */
+/* */
+/* 222 */ if ((isFullyLoaded()) && (this.figureType != -1)) {
+/* 223 */ DroneAnimator.addtype(this.figureType);
+/* 224 */ if (this.runPrepFigure)
+/* 225 */ DroneAnimator.prepFigure(this, this.COG);
+/* 226 */ this.animator = new DroneAnimator();
+/* */ }
+/* */ }
+/* */
+/* 230 */ private boolean recomputeHeight = false;
+/* */ private Shape subparts;
+/* */ public static Color[] colorTable;
+/* */ private int scanPos;
+/* */ private static Material origMat;
+/* */
+/* 236 */ public void notifyShapeLoaded(Shape s) { this.recomputeHeight = true; }
+/* */
+/* */ public Transform getObjectToWorldMatrix()
+/* */ {
+/* 240 */ if (this.clumpID != 0) {
+/* 241 */ return getJointedObjectToWorldMatrix(Transform.make());
+/* */ }
+/* 243 */ return super.getObjectToWorldMatrix();
+/* */ }
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */ public static int getFigureType(URL url)
+/* */ {
+/* 253 */ String bodyType = getBodyType(url);
+/* 254 */ return bodyType == null ? -1 : DroneAnimator.getnameindex(bodyType);
+/* */ }
+/* */
+/* */ public static int getFigureType(String bodyType) {
+/* 258 */ bodyType = getBodyType(bodyType);
+/* 259 */ return bodyType == null ? -1 : DroneAnimator.getnameindex(bodyType);
+/* */ }
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */ protected void download(URL pUrl)
+/* */ {
+/* 270 */ PendingDrone pd = PosableDroneLoader.makePendingDrone(null, pUrl);
+/* */
+/* */
+/* */
+/* */
+/* 275 */ Enumeration<String> e = getComponentAvatars(pd.getUrl());
+/* 276 */ if (e != null) {
+/* 277 */ while (e.hasMoreElements()) {
+/* 278 */ String avURL = (String)e.nextElement();
+/* */
+/* */
+/* */
+/* */
+/* 283 */ pd.download(URL.make(avURL));
+/* */ }
+/* */ }
+/* */ }
+/* */
+/* */ public synchronized void setURL(URL newName)
+/* */ {
+/* 290 */ if ((newName == this.url) || ((newName != null) && (newName.equals(this.url)))) {
+/* 291 */ return;
+/* */ }
+/* */
+/* */
+/* */
+/* 296 */ if ((newName == null) || (!newName.toString().startsWith("avatar:lod"))) {
+/* 297 */ if (newName != null)
+/* */ {
+/* */
+/* */
+/* */
+/* */
+/* */
+/* 304 */ download(newName);
+/* */
+/* 306 */ int newType = getFigureType(newName);
+/* 307 */ if (newType != this.figureType) {
+/* 308 */ if (this.animator != null) {
+/* 309 */ this.animator.endanimations();
+/* 310 */ if (this.figureType != -1)
+/* 311 */ this.animator.delayedDeltype(this.figureType);
+/* */ }
+/* 313 */ this.animator = null;
+/* */
+/* 315 */ this.figureType = newType;
+/* */
+/* 317 */ this.animationList = null;
+/* */ }
+/* */ }
+/* */
+/* 321 */ setBaseLODURL(newName);
+/* 322 */ if ((forceLODLevel != -1) && (this.numDetailLevels > 0) && (this.doLOD)) {
+/* 323 */ setLOD(0.0F);
+/* 324 */ return;
+/* */ }
+/* */ }
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* 333 */ removeSubparts();
+/* */
+/* 335 */ if ((newName != null) && (newName.getAbsolute().startsWith("avatar:"))) {
+/* */ try {
+/* 337 */ createSubparts(newName);
+/* */ } catch (MalformedURLException e) {
+/* 339 */ System.out.println("Received bogus PosableShape URL: " +
+/* 340 */ newName);
+/* 341 */ return;
+/* */ }
+/* */ }
+/* */
+/* 345 */ super.setURL(newName);
+/* */ }
+/* */
+/* */
+/* */
+/* */
+/* */ public static String base64;
+/* */
+/* */
+/* */ private static String[] permittedList;
+/* */
+/* */
+/* */ private static String[] faceList;
+/* */
+/* */
+/* */ private static String[] humanList;
+/* */
+/* */
+/* */ private static String[] secretList;
+/* */
+/* */
+/* */ private static Hashtable<String, String> permittedHash;
+/* */
+/* */
+/* */ private static Vector<String> permittedNames;
+/* */
+/* */
+/* */ private static Vector<String> faceNames;
+/* */
+/* */
+/* */ private static Hashtable<String, String> humanHash;
+/* */
+/* */
+/* */ private static Hashtable<String, Vector<String>> worldHash;
+/* */
+/* */
+/* */ private static Hashtable<String, String> secretNames;
+/* */
+/* */
+/* */ private static Hashtable<String, String> faceTextures;
+/* */
+/* */
+/* */ private String scanName(String s)
+/* */ {
+/* 389 */ int start = this.scanPos;
+/* */ char c;
+/* 391 */ while ((((c = s.charAt(this.scanPos)) >= 'a') && (c <= 'z')) || (c == '_')) { char c;
+/* 392 */ this.scanPos += 1; }
+/* 393 */ return s.substring(start, this.scanPos);
+/* */ }
+/* */
+/* */
+/* */
+/* */
+/* */ public static String readName(String s, int pos)
+/* */ {
+/* 401 */ int start = pos;
+/* */ try {
+/* */ char c;
+/* */ do { do { char c;
+/* 405 */ pos++;
+/* 404 */ } while (((c = s.charAt(pos)) >= 'a') && (c <= 'z')); } while (c == '_');
+/* */ }
+/* */ catch (StringIndexOutOfBoundsException localStringIndexOutOfBoundsException) {}
+/* */
+/* 408 */ return s.substring(start, pos);
+/* */ }
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */ private int scanInt(String s)
+/* */ {
+/* 418 */ int val = 0;
+/* 419 */ char c; for (; ((c = s.charAt(this.scanPos)) >= '0') && (c <= '9'); this.scanPos += 1) { char c;
+/* 420 */ val = 10 * val + (c - '0'); }
+/* 421 */ return val;
+/* */ }
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */ private static Material scanTexture(String name, int frame)
+/* */ {
+/* 435 */ if (frame <= 0) {
+/* 436 */ name = "avatar:" + name + ".cmp";
+/* */ } else {
+/* 438 */ name = "avatar:" + name + frame + "s*.mov";
+/* */ }
+/* 440 */ Material m = new Material(0.32F, 0.55F, 0.0F, colorTable[3], null, 1.0F,
+/* 441 */ true, false);
+/* 442 */ m.loadTexture(URL.make(name));
+/* */
+/* 444 */ return m;
+/* */ }
+/* */
+/* */ public static Material readTexture(String s, int p)
+/* */ {
+/* 449 */ int frame = 0;
+/* 450 */ char c; for (; ((c = s.charAt(p)) >= '0') && (c <= '9'); p++) { char c;
+/* 451 */ frame = 10 * frame + (c - '0');
+/* */ }
+/* 453 */ return scanTexture(readName(s, p), frame);
+/* */ }
+/* */
+/* */
+/* */
+/* */
+/* */ public static boolean isValidTexture(String s)
+/* */ {
+/* 461 */ int len = s.length();
+/* */
+/* */
+/* */
+/* */
+/* 466 */ for (int i = 0; i < len; i++) { char c;
+/* 467 */ if (((c = s.charAt(i)) < '0') || (c > '9'))
+/* */ break;
+/* */ }
+/* 470 */ for (; i < len; i++) { char c;
+/* 471 */ if ((((c = s.charAt(i)) < 'a') || (c > 'z')) && (c != '_'))
+/* 472 */ return false;
+/* */ }
+/* 474 */ return true;
+/* */ }
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */ private static int scanBase64(char c)
+/* */ {
+/* 484 */ int i = base64.indexOf(c);
+/* 485 */ if (i < 0)
+/* 486 */ return 0;
+/* 487 */ return i;
+/* */ }
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */ public static Material readColor(String s, int p)
+/* */ {
+/* 504 */ char c = s.charAt(p++);
+/* 505 */ Material m = null;
+/* */
+/* 507 */ if (c == '_') {
+/* 508 */ int color = s.charAt(p++) - 'A';
+/* 509 */ if ((color < 0) || (color >= colorTable.length)) {
+/* 510 */ m = origMat;
+/* */ } else
+/* 512 */ m = new Material(0.32F, 0.55F, 0.0F, colorTable[color], null,
+/* 513 */ 1.0F, true, false);
+/* */ } else {
+/* 515 */ int r = 4 * scanBase64(c);
+/* 516 */ int g = 4 * scanBase64(s.charAt(p++));
+/* 517 */ int b = 4 * scanBase64(s.charAt(p++));
+/* 518 */ m = new Material(0.32F, 0.55F, 0.0F, new Color(r, g, b), null, 1.0F,
+/* 519 */ true, false);
+/* */ }
+/* */
+/* 522 */ return m;
+/* */ }
+/* */
+/* */ private Material scanColor(String s) {
+/* 526 */ Material m = readColor(s, this.scanPos);
+/* 527 */ if (s.charAt(this.scanPos) == '_') {
+/* 528 */ this.scanPos += 2;
+/* */ } else
+/* 530 */ this.scanPos += 3;
+/* 531 */ return m;
+/* */ }
+/* */
+/* */
+/* */
+/* */ private float getScale(char c)
+/* */ {
+/* 538 */ if ((c >= 'a') && (c <= 'z'))
+/* 539 */ return 1.0F - (c - 'a' + 1) * 0.025615385F;
+/* 540 */ if ((c >= 'A') && (c <= 'Z')) {
+/* 541 */ return 1.0F / (1.0F - (c - 'A' + 1) * 0.025615385F);
+/* */ }
+/* 543 */ return 1.0F;
+/* */ }
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */ private Material getMat(char c, Vector<Material> mats)
+/* */ {
+/* 553 */ int matNum = c - 'a';
+/* 554 */ if (matNum < mats.size()) {
+/* 555 */ Material m = (Material)mats.elementAt(matNum);
+/* 556 */ if (m == origMat) {
+/* 557 */ return origMat;
+/* */ }
+/* 559 */ return (Material)m.clone();
+/* */ }
+/* */
+/* 562 */ return null;
+/* */ }
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */ private Shape getLimb(String s, String bodyType, int pos, int partNum, Shape parent, Vector<Material> mats, boolean loadNow)
+/* */ {
+/* 578 */ int end = s.length() - 4;
+/* */
+/* 580 */ if (bodyType == null)
+/* */ {
+/* 582 */ if ((parent instanceof PosableShape)) {
+/* 583 */ bodyType = "";
+/* */ } else {
+/* 585 */ bodyType = Shape.getBodBase(parent.getURL());
+/* */
+/* 587 */ if (parent.getURL().toString().indexOf("lod/") != -1) {
+/* 588 */ bodyType = "lod/" + bodyType;
+/* */ }
+/* */ }
+/* */ }
+/* */
+/* 593 */ Shape shape = new Shape();
+/* 594 */ Shape subshape = shape;
+/* 595 */ shape.setURL(URL.make("avatar:" + bodyType + partNum / 10 + partNum %
+/* 596 */ 10 + ".bod"));
+/* */
+/* 598 */ int clumpsUsed = 0;
+/* 599 */ Material lastMat = null;
+/* 600 */ int delay = 0;
+/* 601 */ int lastTime = 0;
+/* 602 */ String actName = null;
+/* 603 */ boolean haveAddedChange = false;
+/* */
+/* 605 */ if (pos > 0) {
+/* 606 */ this.scanPos = (pos + 1);
+/* */ do {
+/* 608 */ char c = s.charAt(this.scanPos++);
+/* 609 */ if ((c >= 'A') && (c <= 'Z')) {
+/* 610 */ if (c == 'G') {
+/* 611 */ int num = scanInt(s);
+/* 612 */ if ((num <= 0) || (num > 99))
+/* 613 */ num = partNum;
+/* 614 */ bodyType = scanName(s);
+/* */
+/* */
+/* 617 */ if (bodyType.equals("")) {
+/* */ break;
+/* */ }
+/* 620 */ subshape.setURL(
+/* 621 */ URL.make("avatar:" + bodyType + num / 10 + num %
+/* 622 */ 10 + ".bod"));
+/* 623 */ } else if (c == 'S')
+/* */ {
+/* 625 */ char xScale = s.charAt(this.scanPos++);
+/* 626 */ char yScale = s.charAt(this.scanPos++);
+/* 627 */ char zScale = s.charAt(this.scanPos++);
+/* */
+/* 629 */ if ((xScale == 'Z') && (yScale == 'Z') &&
+/* 630 */ (zScale == 'Z')) {
+/* 631 */ this.runPrepFigure = false;
+/* */ }
+/* */
+/* 634 */ subshape.scale(getScale(xScale), getScale(yScale),
+/* 635 */ getScale(zScale));
+/* 636 */ } else if (c != 'Q')
+/* */ {
+/* 638 */ if (c == 'C') {
+/* 639 */ if (!$assertionsDisabled) throw new AssertionError();
+/* 640 */ } else if (c == 'D')
+/* */ {
+/* 642 */ delay += (int)(1000.0D * (Math.pow(1.0932D,
+/* 643 */ scanBase64(s.charAt(this.scanPos++))) - 0.8999999761581421D));
+/* 644 */ } else if (c == 'A') {
+/* 645 */ actName = scanName(s);
+/* */
+/* */
+/* 648 */ this.animationList = null;
+/* 649 */ } else if ((c == 'T') || (c == 'C'))
+/* */ {
+/* 651 */ System.out.println("Illegal av " + this.url);
+/* */ }
+/* */ else {
+/* 654 */ this.scanPos -= 1;
+/* 655 */ break;
+/* */ }
+/* 657 */ } } else if (c >= 'a')
+/* */ {
+/* 659 */ Material m = getMat(c, mats);
+/* 660 */ if (m != null) {
+/* 661 */ if (delay == 0)
+/* 662 */ delay = 50;
+/* 663 */ lastTime += delay;
+/* */
+/* */
+/* */
+/* */
+/* 668 */ if (lastMat != null) {
+/* 669 */ if (!haveAddedChange) {
+/* 670 */ haveAddedChange = true;
+/* 671 */ addChange(lastTime - delay, lastMat, subshape);
+/* */ }
+/* */
+/* 674 */ addChange(lastTime, m, subshape);
+/* */ }
+/* 676 */ if (m != origMat)
+/* 677 */ subshape.setMaterial(m);
+/* 678 */ lastMat = m;
+/* 679 */ delay = 0;
+/* */ }
+/* 681 */ } else { if ((c < '0') || (c > '9')) break;
+/* 682 */ this.scanPos -= 1;
+/* 683 */ int clumpNum = scanInt(s) - clumpsUsed;
+/* 684 */ clumpsUsed++;
+/* */
+/* 686 */ subshape = new SubclumpShape();
+/* 687 */ subshape.setURL(URL.make("system:subclump" + clumpNum));
+/* 688 */ shape.add(subshape);
+/* */
+/* 690 */ lastMat = null;
+/* 691 */ haveAddedChange = false;
+/* 692 */ lastTime = 0;
+/* 693 */ delay = 0;
+/* */
+/* */ }
+/* */
+/* */ }
+/* 698 */ while (this.scanPos <= end);
+/* 699 */ this.scanPos = end;
+/* 700 */ return parent;
+/* */ }
+/* */
+/* */
+/* */
+/* */
+/* 706 */ if (bodyType.equals("")) {
+/* 707 */ return parent;
+/* */ }
+/* 709 */ shape.addLoadListener(this);
+/* */
+/* 711 */ if ((ProgressiveAdder.get().enabled()) && (!loadNow)) {
+/* 712 */ ProgressiveAdder.get().scheduleForAdd(parent, shape);
+/* */ } else {
+/* 714 */ parent.add(shape);
+/* */ }
+/* 716 */ if (this.subparts == null) {
+/* 717 */ this.subparts = shape;
+/* */ }
+/* 719 */ return shape;
+/* */ }
+/* */
+/* */
+/* */
+/* */
+/* */ private void addChange(int when, Material mat, Shape s)
+/* */ {
+/* 727 */ TimedMatChange t = new TimedMatChange();
+/* 728 */ t.when = when;
+/* 729 */ t.mat = mat;
+/* 730 */ t.limb = s;
+/* 731 */ mat.setKeepLoaded(true);
+/* */
+/* */
+/* 734 */ int i = 0;
+/* 735 */ if (this.expressionChanges == null) {
+/* 736 */ this.expressionChanges = new Vector();
+/* 737 */ this.expressionStart = Std.getRealTime();
+/* 738 */ this.nextChange = 0;
+/* */ } else {
+/* 740 */ for (i = this.expressionChanges.size(); i > 0; i--) {
+/* 741 */ TimedMatChange o =
+/* 742 */ (TimedMatChange)this.expressionChanges.elementAt(i - 1);
+/* 743 */ if (when >= o.when) {
+/* */ break;
+/* */ }
+/* */ }
+/* */ }
+/* 748 */ this.expressionChanges.insertElementAt(t, i);
+/* */ }
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */ public static Enumeration<String> getComponentAvatars(URL pUrl)
+/* */ {
+/* 757 */ if (pUrl == null) {
+/* 758 */ return null;
+/* */ }
+/* 760 */ Vector<String> v = new Vector();
+/* */
+/* 762 */ String urlString = pUrl.getAbsolute();
+/* 763 */ if ((!urlString.startsWith("avatar:")) || (!urlString.endsWith(".rwg"))) {
+/* 764 */ return null;
+/* */ }
+/* 766 */ String baseAv = urlString.substring(7, urlString.indexOf('.'));
+/* 767 */ v.addElement("avatar:" + baseAv + ".rwg");
+/* */
+/* 769 */ int pos = urlString.indexOf('.');
+/* 770 */ int len = urlString.length() - 4;
+/* 771 */ while (pos < len) {
+/* 772 */ char c = urlString.charAt(pos++);
+/* 773 */ if ((c >= 'A') && (c <= 'Z')) {
+/* 774 */ switch (c) {
+/* */ case 'C':
+/* 776 */ c = urlString.charAt(pos++);
+/* 777 */ if (c == '_') {
+/* 778 */ pos++;
+/* */ } else
+/* 780 */ pos += 2;
+/* 781 */ break;
+/* */ case 'D':
+/* 783 */ pos++;
+/* 784 */ break;
+/* */ case 'S':
+/* 786 */ pos += 3;
+/* 787 */ break;
+/* */
+/* */ case 'A':
+/* */ case 'Q':
+/* */ case 'T':
+/* */ break;
+/* */
+/* */
+/* */ case 'G':
+/* 796 */ while (pos < len)
+/* */ {
+/* 798 */ c = urlString.charAt(pos);
+/* 799 */ if ((c < '0') || (c > '9'))
+/* */ break;
+/* 801 */ pos++;
+/* */ }
+/* */
+/* */
+/* 805 */ String bodyType = "";
+/* */
+/* 807 */ while (pos < len)
+/* */ {
+/* 809 */ c = urlString.charAt(pos);
+/* */
+/* 811 */ if ((c >= '0') && (c <= '9')) {
+/* */ break;
+/* */ }
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* 820 */ if ((c < 'a') || (c > 'z')) {
+/* */ break;
+/* */ }
+/* 823 */ bodyType = bodyType + c;
+/* 824 */ pos++;
+/* */ }
+/* */
+/* 827 */ if ((bodyType != "") && (bodyType.length() > 1))
+/* */ {
+/* */
+/* 830 */ v.addElement("avatar:" + bodyType + ".rwg");
+/* */ }
+/* */
+/* */ break;
+/* */ }
+/* */
+/* */ }
+/* */ }
+/* 838 */ return v.elements();
+/* */ }
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */ public static int skipLimb(String s, int pos)
+/* */ {
+/* 849 */ int len = s.length() - 4;
+/* 850 */ while (pos < len) {
+/* 851 */ char c = s.charAt(pos++);
+/* 852 */ if ((c >= 'A') && (c <= 'Z')) {}
+/* 853 */ switch (c) {
+/* */ case 'C':
+/* 855 */ c = s.charAt(pos++);
+/* 856 */ if (c == '_') {
+/* 857 */ pos++;
+/* */ } else
+/* 859 */ pos += 2;
+/* 860 */ break;
+/* */ case 'D':
+/* 862 */ pos++;
+/* 863 */ break;
+/* */ case 'S':
+/* 865 */ pos += 3;
+/* 866 */ break;
+/* */ case 'A':
+/* */ case 'G':
+/* */ case 'Q':
+/* */ case 'T':
+/* */ break;
+/* */ default:
+/* 873 */ return pos - 1;
+/* */
+/* 875 */ continue; if (((c < 'a') || (c > 'z')) && ((c < '0') || (c > '9'))) {
+/* */ break label178;
+/* */ }
+/* */ }
+/* */ }
+/* */ label178:
+/* 881 */ return -1;
+/* */ }
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */ private String findStarts(String s, int end, int[] offs, String bodyType, Vector<Material> mats)
+/* */ {
+/* 893 */ String lastTextureName = bodyType;
+/* */
+/* 895 */ while (this.scanPos < end) {
+/* 896 */ char section = s.charAt(this.scanPos);
+/* 897 */ if ((section < 'A') || (section > 'Z')) {
+/* 898 */ return s;
+/* */ }
+/* 900 */ offs[(section - 'A')] = (this.scanPos++);
+/* */
+/* */
+/* 903 */ while (this.scanPos < end) {
+/* 904 */ char c = s.charAt(this.scanPos++);
+/* 905 */ if ((c >= 'A') && (c <= 'Z')) {
+/* 906 */ if (c == 'G')
+/* */ {
+/* 908 */ scanInt(s);
+/* 909 */ scanName(s);
+/* 910 */ } else if (c == 'S')
+/* */ {
+/* 912 */ this.scanPos += 3;
+/* 913 */ } else if (c != 'Q')
+/* */ {
+/* 915 */ if ((c == 'C') || (c == 'T')) {
+/* 916 */ int start = this.scanPos - 1;
+/* */
+/* */
+/* */
+/* 920 */ char letter = (char)(97 + mats.size());
+/* */
+/* */ Material mat;
+/* */
+/* */ Material mat;
+/* 925 */ if (c == 'C') {
+/* 926 */ mat = scanColor(s);
+/* */ }
+/* */ else {
+/* 929 */ int num = scanInt(s);
+/* */
+/* */
+/* */
+/* 933 */ String name = scanName(s);
+/* 934 */ if (name.equals("")) {
+/* 935 */ name = lastTextureName;
+/* */ } else
+/* 937 */ lastTextureName = name;
+/* 938 */ mat = scanTexture(name, num);
+/* */ }
+/* 940 */ mats.addElement(mat);
+/* */
+/* 942 */ s = s.substring(0, start) + 'Q' + letter +
+/* 943 */ s.substring(this.scanPos);
+/* 944 */ int cutLen = this.scanPos - start - 2;
+/* 945 */ this.scanPos -= cutLen;
+/* 946 */ end -= cutLen;
+/* 947 */ } else if (c == 'D')
+/* */ {
+/* 949 */ this.scanPos += 1;
+/* 950 */ } else if (c == 'A') {
+/* 951 */ scanName(s);
+/* */ }
+/* */ else {
+/* 954 */ this.scanPos -= 1;
+/* 955 */ break;
+/* */ }
+/* 957 */ } } else if ((c < '0') || (c > '9'))
+/* */ {
+/* 959 */ if ((c < 'a') || (c > 'z'))
+/* */ {
+/* 961 */ return s.substring(0, this.scanPos - 1) + ".rwg";
+/* */ }
+/* */ }
+/* */ }
+/* */ }
+/* 966 */ return s;
+/* */ }
+/* */
+/* */ static
+/* */ {
+/* 162 */ defaultURL = URL.make("avatar:aura.0PG.rwg");
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* 350 */ colorTable = new Color[] { new Color(0, 0, 0),
+/* 351 */ new Color(51, 102, 204),
+/* 352 */ new Color(234, 162, 115),
+/* 353 */ new Color(255, 102, 51),
+/* 354 */ new Color(255, 153, 204),
+/* 355 */ new Color(139, 232, 0),
+/* 356 */ new Color(43, 131, 0),
+/* 357 */ new Color(51, 51, 153),
+/* 358 */ new Color(145, 51, 204),
+/* 359 */ new Color(153, 204, 255),
+/* 360 */ new Color(204, 51, 102),
+/* 361 */ new Color(0, 204, 102),
+/* 362 */ new Color(255, 204, 102),
+/* 363 */ new Color(102, 102, 102),
+/* 364 */ new Color(254, 123, 26),
+/* 365 */ new Color(255, 51, 153),
+/* 366 */ new Color(188, 51, 204),
+/* 367 */ new Color(204, 0, 38),
+/* 368 */ new Color(118, 0, 0),
+/* 369 */ new Color(153, 102, 51),
+/* 370 */ new Color(196, 196, 196),
+/* 371 */ new Color(204, 153, 255),
+/* 372 */ new Color(255, 255, 255),
+/* 373 */ new Color(255, 179, 2),
+/* 374 */ new Color(247, 227, 2),
+/* 375 */ new Color(255, 255, 153) };
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* 428 */ origMat = new Material(null);
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* 477 */ base64 = "-0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+";
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* 982 */ permittedList = ServerTableManager.instance()
+/* 983 */ .getTable("permittedList");
+/* */
+/* */
+/* */
+/* 987 */ faceList = ServerTableManager.instance().getTable(
+/* 988 */ "faceList");
+/* */
+/* 990 */ humanList = ServerTableManager.instance().getTable(
+/* 991 */ "humanList");
+/* */
+/* */
+/* 994 */ secretList = ServerTableManager.instance()
+/* 995 */ .getTable("secretList");
+/* */
+/* 997 */ permittedHash = new Hashtable();
+/* 998 */ permittedNames = new Vector();
+/* 999 */ faceNames = new Vector();
+/* 1000 */ humanHash = new Hashtable();
+/* 1001 */ worldHash = new Hashtable();
+/* 1002 */ secretNames = new Hashtable();
+/* 1003 */ faceTextures = new Hashtable();
+/* */
+/* */
+/* 1006 */ if (!NetUpdate.isInternalVersion()) {
+/* 1007 */ for (int i = 0; i < secretList.length; i++) {
+/* 1008 */ secretNames.put(secretList[i], secretList[i]);
+/* */ }
+/* */ }
+/* */
+/* 1012 */ for (int i = 0; i < permittedList.length; i += 2) {
+/* 1013 */ if (secretNames.get(permittedList[i]) == null) {
+/* 1014 */ permittedNames.addElement(permittedList[i]);
+/* 1015 */ if (permittedList[(i + 1)].indexOf("DgT") >= 0) {
+/* 1016 */ faceNames.addElement(permittedList[i]);
+/* */ }
+/* */ }
+/* 1019 */ if (permittedList[(i + 1)] != null) {
+/* 1020 */ permittedHash.put(permittedList[i], permittedList[(i + 1)]);
+/* */ }
+/* */ }
+/* 1023 */ for (int i = 1; i < humanList.length; i += 2) {
+/* 1024 */ humanHash.put(humanList[(i - 1)], humanList[i]);
+/* */ }
+/* 1026 */ for (int i = 0; i < faceList.length; i += 2) {
+/* 1027 */ faceTextures.put(faceList[i], faceList[(i + 1)]);
+/* */ }
+/* */ }
+/* */
+/* */
+/* */
+/* */ public static Vector<String> getPermittedNames()
+/* */ {
+/* 1035 */ return permittedNames;
+/* */ }
+/* */
+/* */
+/* */
+/* */ public static String[] getPermittedList()
+/* */ {
+/* 1042 */ return permittedList;
+/* */ }
+/* */
+/* 1045 */ static boolean gotServerAvatarList = false;
+/* 1046 */ static boolean serverAvatarListError = false;
+/* */
+/* */ private Enumeration<String> animations;
+/* */
+/* */ public static void downloadPermittedNames()
+/* */ {
+/* 1052 */ if (gotServerAvatarList) {
+/* 1053 */ return;
+/* */ }
+/* 1055 */ serverAvatarListError = false;
+/* */
+/* */
+/* 1058 */ WorldServer w = Pilot.getActive().getServer();
+/* 1059 */ if ((w != null) && (w.getGalaxy() != null)) {
+/* 1060 */ String avatarList = Console.getActive().getScriptServer() +
+/* 1061 */ "getavlist.pl?u=" + w.getGalaxy().getChatname();
+/* */
+/* 1063 */ if (w.getGalaxy().getSerialNum() != null) {
+/* 1064 */ avatarList = avatarList + "&s=" + w.getGalaxy().getSerialNum();
+/* */ }
+/* */
+/* 1067 */ URL avatarListURL = URL.make(avatarList);
+/* 1068 */ CacheFile cf = Cache.getFile(avatarListURL, true);
+/* 1069 */ cf.waitUntilLoaded();
+/* 1070 */ if (!cf.error())
+/* */ {
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* 1079 */ permittedNames.removeAllElements();
+/* 1080 */ humanHash.clear();
+/* 1081 */ worldHash.clear();
+/* */ try
+/* */ {
+/* 1084 */ RandomAccessFile f = new RandomAccessFile(
+/* 1085 */ cf.getLocalName(), "r");
+/* 1086 */ while (f.getFilePointer() < f.length()) {
+/* 1087 */ String line = f.readLine();
+/* */
+/* */
+/* 1090 */ if (!line.startsWith("//"))
+/* */ {
+/* 1092 */ StringTokenizer st = new StringTokenizer(line);
+/* 1093 */ if (st.countTokens() > 2) {
+/* 1094 */ String name = st.nextToken();
+/* 1095 */ permittedNames.addElement(name);
+/* 1096 */ String gender = st.nextToken();
+/* 1097 */ if ((gender.equals("m")) || (gender.equals("f")))
+/* 1098 */ humanHash.put(name, gender);
+/* 1099 */ Vector<String> worldList = new Vector();
+/* 1100 */ while (st.hasMoreTokens()) {
+/* 1101 */ worldList.addElement(st.nextToken());
+/* */ }
+/* 1103 */ worldHash.put(name, worldList);
+/* */ }
+/* */ }
+/* */ }
+/* 1107 */ f.close();
+/* */ } catch (Exception e) {
+/* 1109 */ System.out.println("Error parsing avatar list: " +
+/* 1110 */ e.toString());
+/* 1111 */ serverAvatarListError = true;
+/* 1112 */ return;
+/* */ }
+/* */
+/* 1115 */ gotServerAvatarList = true;
+/* */
+/* */
+/* */
+/* */
+/* 1120 */ Console c = Console.getActive();
+/* 1121 */ if ((c instanceof DefaultConsole)) {
+/* 1122 */ DefaultConsole dc = (DefaultConsole)c;
+/* 1123 */ dc.getAvatarMenu().rebuildVIPMenu();
+/* */ }
+/* */
+/* */
+/* */
+/* 1128 */ if (c.getPilot() != null) {
+/* 1129 */ c.getPilot().resetAvatarNow();
+/* */ }
+/* */
+/* */
+/* */
+/* 1134 */ AvMenu.rebuildHeadList();
+/* */ } else {
+/* 1136 */ serverAvatarListError = true;
+/* */ }
+/* */ }
+/* */ }
+/* */
+/* */
+/* */
+/* */
+/* */ public static URL getPermitted(URL in, World world)
+/* */ {
+/* 1146 */ if (in.endsWith(".mov")) {
+/* 1147 */ return in;
+/* */ }
+/* */
+/* 1150 */ if (NetUpdate.isInternalVersion()) {
+/* 1151 */ return in;
+/* */ }
+/* 1153 */ if ((!gotServerAvatarList) && (!serverAvatarListError))
+/* */ {
+/* 1155 */ return in;
+/* */ }
+/* */
+/* 1158 */ if (serverAvatarListError)
+/* */ {
+/* */
+/* */
+/* 1162 */ if (validateAvatar(in.getAbsolute())) {
+/* 1163 */ return in;
+/* */ }
+/* 1165 */ return getDefAv();
+/* */ }
+/* */
+/* */
+/* */
+/* 1170 */ Enumeration<String> e = getComponentAvatars(in);
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* 1183 */ while ((e != null) && (e.hasMoreElements())) {
+/* 1184 */ String baseAv = (String)e.nextElement();
+/* */
+/* 1186 */ String s = getBodyType(URL.make(baseAv));
+/* 1187 */ if (s == null)
+/* */ {
+/* */
+/* 1190 */ return getDefAv();
+/* */ }
+/* */
+/* 1193 */ Vector<String> allowedWorlds = (Vector)worldHash.get(s);
+/* 1194 */ if (allowedWorlds == null)
+/* */ {
+/* */
+/* 1197 */ return getDefAv();
+/* */ }
+/* */
+/* 1200 */ boolean worldOK = false;
+/* 1201 */ Enumeration<String> we = allowedWorlds.elements();
+/* 1202 */ while (we.hasMoreElements()) {
+/* 1203 */ String thisWorld = (String)we.nextElement();
+/* 1204 */ if (thisWorld == null) {
+/* 1205 */ return getDefAv();
+/* */ }
+/* 1207 */ if (thisWorld.equals("all")) {
+/* 1208 */ worldOK = true;
+/* 1209 */ break;
+/* */ }
+/* */
+/* */
+/* */
+/* 1214 */ thisWorld = thisWorld.replace('_', ' ').toLowerCase().trim();
+/* */
+/* 1216 */ if (world != null) {
+/* 1217 */ if (thisWorld.equals(world.toString().toLowerCase().trim())) {
+/* 1218 */ worldOK = true;
+/* 1219 */ break;
+/* */ }
+/* */ } else {
+/* 1222 */ worldOK = true;
+/* */ }
+/* */ }
+/* */
+/* 1226 */ if (!worldOK) {
+/* 1227 */ return getDefAv();
+/* */ }
+/* */ }
+/* 1230 */ return in;
+/* */ }
+/* */
+/* */
+/* */
+/* */ public static Vector<String> getFaceNames()
+/* */ {
+/* 1237 */ return faceNames;
+/* */ }
+/* */
+/* */
+/* */
+/* */
+/* */ public static URL getAvURL(String bodyType)
+/* */ {
+/* 1245 */ Object newName = permittedHash.get(bodyType);
+/* 1246 */ if ((newName instanceof String)) {
+/* 1247 */ return URL.make("avatar:" + (String)newName);
+/* */ }
+/* 1249 */ return null;
+/* */ }
+/* */
+/* */
+/* */
+/* */ public static boolean validateAvatar(String av)
+/* */ {
+/* 1256 */ System.out.println("Validating " + av);
+/* 1257 */ String baseAv = getBodyType(URL.make(av));
+/* 1258 */ if (baseAv == null)
+/* 1259 */ return false;
+/* 1260 */ if (permittedHash.get(baseAv) != null) {
+/* 1261 */ return true;
+/* */ }
+/* 1263 */ return false;
+/* */ }
+/* */
+/* */
+/* */
+/* */
+/* */ public static String convertLODToParent(String bodyType)
+/* */ {
+/* 1271 */ String result = bodyType;
+/* */
+/* 1273 */ if (result.startsWith("lod/"))
+/* */ {
+/* 1275 */ result = result.substring(4, result.length() - 1);
+/* */ }
+/* 1277 */ return result;
+/* */ }
+/* */
+/* */
+/* */
+/* */
+/* */ public static String getBodyType(URL url)
+/* */ {
+/* 1285 */ if (url == null) {
+/* 1286 */ return null;
+/* */ }
+/* */
+/* 1289 */ String str = url.getAbsolute();
+/* */
+/* 1291 */ if ((!str.startsWith("avatar:")) || ((!str.endsWith(".rwg")) &&
+/* 1292 */ (!str.endsWith(".RWG"))) || (str.charAt(7) == '.')) {
+/* 1293 */ return null;
+/* */ }
+/* 1295 */ int pos = str.indexOf(".", 7);
+/* 1296 */ String bodyType = str.substring(7, pos).toLowerCase();
+/* 1297 */ bodyType = convertLODToParent(bodyType);
+/* 1298 */ if (str.charAt(pos + 1) != '0')
+/* */ {
+/* 1300 */ bodyType = getBodyType(bodyType);
+/* */ }
+/* */
+/* 1303 */ return bodyType;
+/* */ }
+/* */
+/* */ static URL getDefAv()
+/* */ {
+/* 1308 */ return URL.make(IniFile.override().getIniString("DefaultArticAv",
+/* 1309 */ "avatar:willy.rwg"));
+/* */ }
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */ public static URL getHuman(URL url)
+/* */ {
+/* 1321 */ if (url.endsWith(".mov")) {
+/* 1322 */ return HoloDrone.getHuman(url);
+/* */ }
+/* 1324 */ String s = getBodyType(url);
+/* 1325 */ if (s == null) {
+/* 1326 */ return getDefAv();
+/* */ }
+/* 1328 */ String gender = (String)humanHash.get(s);
+/* 1329 */ if (gender == null) {
+/* 1330 */ return getDefAv();
+/* */ }
+/* 1332 */ URL def = URL.make("avatar:" + s + ".rwg");
+/* */
+/* */
+/* 1335 */ String str = url.getAbsolute();
+/* 1336 */ int pos = str.indexOf(".0EC_");
+/* 1337 */ if ((pos < 0) || (str.length() < pos + 7) ||
+/* 1338 */ ("_AC".indexOf(str.charAt(pos + 5)) < 0)) {
+/* 1339 */ return def;
+/* */ }
+/* */
+/* 1342 */ if ((gender.equals("m")) && (str.indexOf("yank") >= 0) && (
+/* 1343 */ (!str.regionMatches(pos + 6, "TyankshirtC_", 0, 12)) ||
+/* */
+/* 1345 */ (!str.regionMatches(pos + 19, "C-2bTyankstripe", 0, 15)))) {
+/* 1346 */ return def;
+/* */ }
+/* */
+/* */
+/* 1350 */ pos = str.lastIndexOf("HDgT2");
+/* 1351 */ if ((pos < 0) || (str.length() < pos + 7)) {
+/* 1352 */ return def;
+/* */ }
+/* 1354 */ String faceGender = (String)humanHash.get(readName(str, pos + 5));
+/* 1355 */ if ((faceGender == null) || (!faceGender.equals(gender))) {
+/* 1356 */ return def;
+/* */ }
+/* */
+/* 1359 */ pos = str.lastIndexOf("NS");
+/* 1360 */ if ((pos < 0) || (str.length() < pos + 3) ||
+/* 1361 */ ("0abcdABCD".indexOf(str.charAt(pos + 2)) < 0)) {
+/* 1362 */ return def;
+/* */ }
+/* */
+/* 1365 */ pos += 5;
+/* 1366 */ if (str.length() < pos + 2) {
+/* 1367 */ return def;
+/* */ }
+/* 1369 */ if (str.charAt(pos) == 'G') {
+/* 1370 */ String headGender = (String)humanHash.get(readName(str,
+/* 1371 */ pos + 1));
+/* 1372 */ if ((headGender == null) || (!headGender.equals(gender))) {
+/* 1373 */ return def;
+/* */ }
+/* */ }
+/* 1376 */ return url;
+/* */ }
+/* */
+/* */
+/* */
+/* */
+/* */ public URL getHuman()
+/* */ {
+/* 1384 */ return getHuman(getURL());
+/* */ }
+/* */
+/* */
+/* */
+/* */
+/* */ public static String getBodyType(String basename)
+/* */ {
+/* 1392 */ String str = (String)permittedHash.get(basename);
+/* 1393 */ if (str != null) {
+/* 1394 */ basename = str.substring(0, str.indexOf("."));
+/* */ }
+/* 1396 */ return basename;
+/* */ }
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */ public static int getMatPosition(String str, char type)
+/* */ {
+/* 1405 */ int index = "abcdef".indexOf(type);
+/* 1406 */ if (index >= 0) {
+/* 1407 */ int p = str.indexOf(".0E");
+/* 1408 */ if (p >= 0) {
+/* 1409 */ p += 3;
+/* */
+/* 1411 */ for (int i = 0; i < index; i++)
+/* 1412 */ p = skipMat(str, p);
+/* */ }
+/* 1414 */ return p;
+/* */ }
+/* 1416 */ int p = str.indexOf(".0E");
+/* 1417 */ if (p >= 0) {
+/* 1418 */ p += 2;
+/* 1419 */ while (p >= 0) {
+/* 1420 */ if (str.charAt(p++) == type) {
+/* 1421 */ return p;
+/* */ }
+/* 1423 */ p = skipLimb(str, p);
+/* */ }
+/* */ }
+/* 1426 */ return p;
+/* */ }
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */ public static String getCurrentAvCustomizable()
+/* */ {
+/* 1437 */ URL av = Pilot.getActive().getSourceURL();
+/* */
+/* 1439 */ String str = av.getAbsolute();
+/* */
+/* 1441 */ if ((!str.startsWith("avatar:")) || ((!str.endsWith(".rwg")) &&
+/* 1442 */ (!str.endsWith(".RWG"))) || (str.charAt(7) == '.')) {
+/* 1443 */ Console.println(Console.message("non-cust-av"));
+/* 1444 */ return null;
+/* */ }
+/* */
+/* 1447 */ int pos = str.indexOf(".", 7);
+/* */
+/* 1449 */ if (!str.regionMatches(pos, ".0E", 0, 3))
+/* */ {
+/* 1451 */ av = getAvURL(str.substring(7, pos).toLowerCase());
+/* 1452 */ if (av == null)
+/* */ {
+/* 1454 */ if (!str.substring(pos).equalsIgnoreCase(".rwg")) {
+/* 1455 */ Console.println(Console.message("cant-cust-av"));
+/* 1456 */ return null;
+/* */ }
+/* */
+/* 1459 */ str =
+/* */
+/* */
+/* 1462 */ "avatar:" + str.substring(7, pos) + ".0EC__C__C__C__C__C__" + "PeBbLcMcOaRcUcVaWeXeYIeJeK" + "NS000QaHDgT2tonyT3T2T1Q0f.rwg";
+/* */ } else {
+/* 1464 */ str = av.getAbsolute();
+/* */ }
+/* */ }
+/* 1467 */ return str;
+/* */ }
+/* */
+/* */
+/* */
+/* */
+/* */ public static int skipMat(String s, int i)
+/* */ {
+/* 1475 */ char c = s.charAt(i);
+/* 1476 */ int matEnd = i;
+/* 1477 */ if (c == 'C') {
+/* 1478 */ c = s.charAt(i + 1);
+/* 1479 */ if (c == '_') {
+/* 1480 */ matEnd = i + 3;
+/* */ } else
+/* 1482 */ matEnd = i + 4;
+/* 1483 */ } else if (c == 'T') {
+/* 1484 */ matEnd = i + 1;
+/* 1485 */ for (;;) { matEnd++; if ((c = s.charAt(matEnd)) >= '0') if (c > '9') break;
+/* */ }
+/* 1487 */ do { matEnd++; if ((c = s.charAt(matEnd)) < 'a') break; } while (c <= 'z');
+/* */ }
+/* 1489 */ else if ((c >= 'a') && (c <= 'z')) {
+/* 1490 */ matEnd = i + 1;
+/* */ }
+/* 1492 */ return matEnd;
+/* */ }
+/* */
+/* */ public static String getFace(String bodyType) {
+/* 1496 */ Object face = faceTextures.get(bodyType);
+/* 1497 */ if (face != null) {
+/* 1498 */ return (String)face;
+/* */ }
+/* */
+/* 1501 */ return "1" + bodyType;
+/* */ }
+/* */
+/* */
+/* */
+/* */
+/* */ private void createSubparts(URL url)
+/* */ throws MalformedURLException
+/* */ {
+/* 1510 */ String str = url.getAbsolute();
+/* 1511 */ int len = str.length();
+/* */
+/* 1513 */ String bodyType = null;
+/* */
+/* */
+/* 1516 */ this.runPrepFigure = this.setPrepFigure;
+/* */
+/* */
+/* 1519 */ if ((!str.startsWith("avatar:")) || ((!str.endsWith(".rwg")) &&
+/* 1520 */ (!str.endsWith(".RWG"))) || (str.charAt(7) == '.')) {
+/* 1521 */ this.scanPos = 0;
+/* 1522 */ str = ".rwg";
+/* 1523 */ bodyType = "aura";
+/* */ } else {
+/* 1525 */ this.scanPos = str.indexOf(".", 7);
+/* 1526 */ bodyType = str.substring(7, this.scanPos).toLowerCase();
+/* */
+/* 1528 */ if (str.charAt(this.scanPos + 1) != '0') {
+/* 1529 */ this.scanPos = (len - 4);
+/* */
+/* */
+/* 1532 */ Object newName = permittedHash.get(bodyType);
+/* 1533 */ if (newName != null) {
+/* 1534 */ str = (String)newName;
+/* 1535 */ this.scanPos = 0;
+/* 1536 */ bodyType = scanName(str);
+/* 1537 */ if (str.charAt(this.scanPos) != '.')
+/* 1538 */ throw new MalformedURLException();
+/* 1539 */ if (str.charAt(this.scanPos + 1) != '0')
+/* 1540 */ throw new MalformedURLException();
+/* 1541 */ this.scanPos += 2;
+/* */ }
+/* */ } else {
+/* 1544 */ this.scanPos += 2;
+/* */ }
+/* */ }
+/* */
+/* */
+/* */
+/* 1550 */ Vector<Material> mats = new Vector();
+/* */
+/* */
+/* 1553 */ int[] offsets = new int[26];
+/* 1554 */ str = findStarts(str, str.length() - 4, offsets, bodyType, mats);
+/* */
+/* 1556 */ if (this.subparts != null) {
+/* 1557 */ throw new MalformedURLException();
+/* */ }
+/* */
+/* */
+/* 1561 */ Shape groi = getLimb(str, bodyType, offsets[15], 1, this, mats, true);
+/* */
+/* 1563 */ Shape back = getLimb(str, null, offsets[1], 2, groi, mats, false);
+/* 1564 */ Shape neck = getLimb(str, null, offsets[13], 3, back, mats, false);
+/* 1565 */ Shape head = getLimb(str, null, offsets[7], 4, neck, mats, false);
+/* 1566 */ Shape lupa = getLimb(str, null, offsets[11], 11, back, mats, false);
+/* 1567 */ Shape lfor = getLimb(str, null, offsets[12], 12, lupa, mats, false);
+/* 1568 */ Shape lhan = getLimb(str, null, offsets[14], 13, lfor, mats, false);
+/* 1569 */ Shape rupa = getLimb(str, null, offsets[17], 6, back, mats, false);
+/* 1570 */ Shape rfor = getLimb(str, null, offsets[20], 7, rupa, mats, false);
+/* 1571 */ Shape rhan = getLimb(str, null, offsets[21], 8, rfor, mats, false);
+/* 1572 */ Shape lthi = getLimb(str, null, offsets[8], 19, groi, mats, false);
+/* 1573 */ Shape lcal = getLimb(str, null, offsets[9], 20, lthi, mats, false);
+/* 1574 */ Shape lfoo = getLimb(str, null, offsets[10], 21, lcal, mats, false);
+/* 1575 */ Shape rthi = getLimb(str, null, offsets[22], 15, groi, mats, false);
+/* 1576 */ Shape rcal = getLimb(str, null, offsets[23], 16, rthi, mats, false);
+/* 1577 */ Shape rfoo = getLimb(str, null, offsets[24], 17, rcal, mats, false);
+/* 1578 */ Shape tail = getLimb(str, null, offsets[25], 24, groi, mats, false);
+/* */ }
+/* */
+/* */ protected void removeSubparts()
+/* */ {
+/* 1583 */ if (this.subparts != null) {
+/* 1584 */ this.subparts.discard();
+/* 1585 */ this.subparts = null;
+/* 1586 */ this.actions = null;
+/* */ }
+/* */ }
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */ public void prerender(Camera cam)
+/* */ {
+/* 1598 */ if (!getVisible()) {
+/* 1599 */ return;
+/* */ }
+/* 1601 */ Point3Temp p = inCamSpace(cam);
+/* */
+/* */
+/* */
+/* 1605 */ boolean v = (p != null) && (p.z > 1.0F) && (p.x < p.z) && (-p.x < p.z);
+/* */
+/* */
+/* */
+/* */
+/* 1610 */ if (v) {
+/* 1611 */ if (this.closestView > p.z)
+/* 1612 */ this.closestView = p.z;
+/* 1613 */ if ((p.z > 700.0F) &&
+/* 1614 */ (++this.farViewCount > 10)) {
+/* 1615 */ if (this.closestView > 400.0F)
+/* 1616 */ this.closestView = 400.0F;
+/* 1617 */ this.farViewCount = 0;
+/* */ }
+/* */ }
+/* */ }
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */ public float animate(String action)
+/* */ {
+/* 1628 */ if (this.animator != null)
+/* */ {
+/* */
+/* 1631 */ if (action.length() == 1) {
+/* 1632 */ char lower = action.toLowerCase().charAt(0);
+/* 1633 */ char upper = action.toUpperCase().charAt(0);
+/* 1634 */ Vector<String> al = getAnimationList();
+/* 1635 */ int len = al.size();
+/* 1636 */ for (int i = 0; i < len; i++) {
+/* 1637 */ String[] actionAliases = ServerTableManager.instance()
+/* 1638 */ .getTable("actionAliases");
+/* */
+/* 1640 */ String displayName = (String)al.elementAt(i);
+/* */
+/* 1642 */ if (actionAliases != null) {
+/* 1643 */ for (int j = 0; j < actionAliases.length; j += 2)
+/* */ {
+/* 1645 */ if (displayName.toLowerCase().equals(actionAliases[j].toLowerCase())) {
+/* 1646 */ displayName = actionAliases[(j + 1)];
+/* 1647 */ break;
+/* */ }
+/* */ }
+/* */ }
+/* */
+/* 1652 */ char c = displayName.charAt(0);
+/* 1653 */ if ((c == lower) || (c == upper)) {
+/* 1654 */ action = (String)al.elementAt(i);
+/* 1655 */ break;
+/* */ }
+/* */ }
+/* */ }
+/* */
+/* 1660 */ return performAnimationSequence(action);
+/* */ }
+/* */
+/* */
+/* 1664 */ return 0.0F;
+/* */ }
+/* */
+/* */
+/* */ public void timerDone()
+/* */ {
+/* 1670 */ if (this.animations.hasMoreElements()) {
+/* 1671 */ String nextAnim = (String)this.animations.nextElement();
+/* 1672 */ float time = this.animator.getAnimationTime(this.figureType, nextAnim);
+/* 1673 */ this.animator.animate(this.figureType, nextAnim, Std.getRealTime());
+/* 1674 */ Timer tm = new Timer(time, this);
+/* 1675 */ tm.start();
+/* */ }
+/* */ }
+/* */
+/* */ private float performAnimationSequence(String action) {
+/* 1680 */ float totalTime = 0.0F;
+/* */
+/* 1682 */ Vector<String> vanimations = new Vector();
+/* */
+/* 1684 */ StringTokenizer tok = new StringTokenizer(action, "&\t\n\r");
+/* 1685 */ while (tok.hasMoreTokens()) {
+/* 1686 */ String subAction = tok.nextToken();
+/* 1687 */ totalTime += this.animator.getAnimationTime(this.figureType, subAction);
+/* 1688 */ vanimations.addElement(subAction);
+/* */ }
+/* */
+/* 1691 */ this.animations = vanimations.elements();
+/* */
+/* 1693 */ timerDone();
+/* */
+/* 1695 */ return totalTime;
+/* */ }
+/* */
+/* */ public Vector<String> getAnimationList() {
+/* 1699 */ if (this.animationList != null) {
+/* 1700 */ return this.animationList;
+/* */ }
+/* 1702 */ this.animationList = DroneAnimator.getActionList(this.figureType);
+/* 1703 */ return this.animationList;
+/* */ }
+/* */
+/* 1706 */ private boolean doLOD = false;
+/* */ protected int expressionStart;
+/* */
+/* 1709 */ public void enableLOD(boolean flag) { this.doLOD = flag; }
+/* */
+/* */
+/* */
+/* */ public boolean handle(MouseDownEvent e)
+/* */ {
+/* 1715 */ return false;
+/* */ }
+/* */
+/* */
+/* */ public boolean handle(FrameEvent fe)
+/* */ {
+/* 1721 */ float dist = this.closestView;
+/* 1722 */ this.closestView = 10000.0F;
+/* */
+/* 1724 */ if ((this.animator == null) || (dist > 900.0F) || (!hasClump())) {
+/* 1725 */ return true;
+/* */ }
+/* 1727 */ if (this.recomputeHeight) {
+/* 1728 */ if (this.runPrepFigure)
+/* 1729 */ DroneAnimator.prepFigure(this, this.COG);
+/* 1730 */ this.recomputeHeight = false;
+/* */ }
+/* */
+/* */
+/* 1734 */ if ((this.doLOD) &&
+/* 1735 */ (setLOD(dist))) {
+/* 1736 */ return true;
+/* */ }
+/* */
+/* 1739 */ int time = Std.getRealTime();
+/* */
+/* */
+/* */
+/* */
+/* 1744 */ Transform t = getObjectToWorldMatrix();
+/* */
+/* 1746 */ this.animator.moveto(this.figureType, (short)(int)t.getX(), (short)(int)t.getY(),
+/* 1747 */ (short)(int)t.getZ(), (short)(int)-t.getYaw(), time - 1);
+/* */
+/* */
+/* */
+/* 1751 */ this.animator.update(null, this, time, t.getScaleX(), dist > 700.0F);
+/* 1752 */ t.recycle();
+/* */
+/* */
+/* 1755 */ if (this.expressionStart > 0)
+/* */ {
+/* 1757 */ time -= this.expressionStart;
+/* */ do {
+/* 1759 */ TimedMatChange t =
+/* 1760 */ (TimedMatChange)this.expressionChanges.elementAt(this.nextChange);
+/* 1761 */ if (time < t.when) {
+/* */ break;
+/* */ }
+/* */
+/* 1765 */ if (t.mat != origMat) {
+/* 1766 */ t.limb.setMaterial(t.mat);
+/* */ }
+/* 1768 */ } while (++this.nextChange < this.expressionChanges.size());
+/* */
+/* 1770 */ this.nextChange = 0;
+/* */
+/* */
+/* */
+/* 1774 */ this.expressionStart += time;
+/* */ }
+/* */
+/* */
+/* */
+/* */
+/* 1780 */ return true;
+/* */ }
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */ protected int nextChange;
+/* */
+/* */
+/* */
+/* */
+/* */ protected Vector<TimedMatChange> expressionChanges;
+/* */
+/* */
+/* */
+/* */
+/* 1797 */ private static Object classCookie = new Object();
+/* */
+/* */ public Object properties(int index, int offset, int mode, Object value) throws NoSuchPropertyException
+/* */ {
+/* 1801 */ Object ret = null;
+/* 1802 */ switch (index - offset) {
+/* */ case 0:
+/* 1804 */ if (mode == 0) {
+/* 1805 */ ret = BooleanPropertyEditor.make(new Property(this, index,
+/* 1806 */ "Center of Gravity"), "No", "Yes");
+/* 1807 */ } else if (mode == 1) {
+/* 1808 */ ret = new Boolean(this.COG);
+/* 1809 */ } else if (mode == 2) {
+/* 1810 */ this.COG = ((Boolean)value).booleanValue();
+/* */
+/* 1812 */ URL u = getURL();
+/* 1813 */ setURL(defaultURL);
+/* 1814 */ setURL(u);
+/* */ }
+/* 1816 */ break;
+/* */ default:
+/* 1818 */ ret = super.properties(index, offset + 1, mode, value);
+/* */ }
+/* 1820 */ return ret;
+/* */ }
+/* */
+/* */ public void saveState(Saver s) throws IOException {
+/* 1824 */ s.saveVersion(1, classCookie);
+/* 1825 */ s.saveBoolean(this.COG);
+/* */
+/* 1827 */ if (this.subparts != null) {
+/* 1828 */ this.subparts.detach();
+/* 1829 */ super.saveState(s);
+/* 1830 */ add(this.subparts);
+/* */ } else {
+/* 1832 */ super.saveState(s);
+/* */ }
+/* */ }
+/* */
+/* 1836 */ public void restoreState(Restorer r) throws IOException, TooNewException { switch (r.restoreVersion(classCookie)) {
+/* */ case 1:
+/* 1838 */ this.COG = r.restoreBoolean();
+/* */ case 0:
+/* 1840 */ super.restoreState(r);
+/* 1841 */ break;
+/* */
+/* */ default:
+/* 1844 */ throw new TooNewException();
+/* */ }
+/* */ }
+/* */
+/* */ public String toString() {
+/* 1849 */ return getName();
+/* */ }
+/* */
+/* */ public PosableShape() {}
+/* */
+/* */ class TimedMatChange
+/* */ {
+/* */ Shape limb;
+/* */ Material mat;
+/* */ int when;
+/* */
+/* */ TimedMatChange() {}
+/* */ }
+/* */ }
+
+
+/* Location: C:\Program Files (x86)\Worlds Inc\WorldsPlayer - Win7\lib\worlds.jar!\NET\worlds\scape\PosableShape.class
+ * Java compiler version: 6 (50.0)
+ * JD-Core Version: 0.7.1
+ */ \ No newline at end of file