Crossfire JXClient, Trunk
DefaultCrossfireServerConnection.java
Go to the documentation of this file.
1 /*
2  * This file is part of JXClient, the Fullscreen Java Crossfire Client.
3  *
4  * JXClient is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * JXClient is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with JXClient; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17  *
18  * Copyright (C) 2005-2008 Yann Chachkoff
19  * Copyright (C) 2006-2017,2019-2023 Andreas Kirschbaum
20  * Copyright (C) 2010-2012,2014-2018,2020-2023 Nicolas Weeger
21  */
22 
23 package com.realtime.crossfire.jxclient.server.crossfire;
24 
44 import java.io.BufferedReader;
45 import java.io.ByteArrayInputStream;
46 import java.io.IOException;
47 import java.io.InputStreamReader;
48 import java.nio.Buffer;
49 import java.nio.BufferUnderflowException;
50 import java.nio.ByteBuffer;
51 import java.nio.ByteOrder;
52 import java.nio.charset.StandardCharsets;
53 import java.util.ArrayDeque;
54 import java.util.ArrayList;
55 import java.util.Arrays;
56 import java.util.Collection;
57 import java.util.Deque;
58 import java.util.LinkedHashMap;
59 import java.util.List;
60 import java.util.Map;
61 import java.util.regex.Pattern;
62 import org.jetbrains.annotations.NotNull;
63 import org.jetbrains.annotations.Nullable;
64 
70 
74  private static final int DEFAULT_MAP_WIDTH = 11;
75 
79  private static final int DEFAULT_MAP_HEIGHT = 11;
80 
85  private static final int CONCURRENT_REQUESTINFO_MESSAGES = 3;
86 
90  @NotNull
91  private static final Pattern PATTERN_DOT = Pattern.compile(":");
92 
96  @NotNull
97  private static final Pattern PATTERN_BAR = Pattern.compile("\\|+");
98 
102  @NotNull
103  private static final Pattern PATTERN_SPACE = Pattern.compile(" ");
104 
108  private static final int ACL_NAME = 1;
109 
113  private static final int ACL_CLASS = 2;
114 
118  private static final int ACL_RACE = 3;
119 
123  private static final int ACL_LEVEL = 4;
124 
128  private static final int ACL_FACE = 5;
129 
133  private static final int ACL_PARTY = 6;
134 
138  private static final int ACL_MAP = 7;
139 
143  private static final int ACL_FACE_NUM = 8;
144 
148  private static final int INFO_MAP_ARCH_NAME = 1;
149 
153  private static final int INFO_MAP_NAME = 2;
154 
158  private static final int INFO_MAP_DESCRIPTION = 3;
159 
163  @NotNull
164  private static final String @NotNull [] EMPTY_STRING_ARRAY = new String[0];
165 
169  @NotNull
170  private final Model model;
171 
175  @NotNull
177 
181  private int preferredMapWidth = 17;
182 
186  private int preferredMapHeight = 13;
187 
191  private boolean newmap;
192 
197  private int pendingMapWidth;
198 
203  private int pendingMapHeight;
204 
209 
214 
219  @NotNull
221 
226  private final byte @NotNull [] writeBuffer = new byte[65536];
227 
231  @NotNull
232  private final ByteBuffer byteBuffer = ByteBuffer.wrap(writeBuffer);
233 
237  private int packet = 1;
238 
242  private static final byte @NotNull [] ACCOUNT_LOGIN_PREFIX = "accountlogin ".getBytes(StandardCharsets.US_ASCII);
243 
247  private static final byte @NotNull [] ACCOUNT_PLAY_PREFIX = "accountplay ".getBytes(StandardCharsets.US_ASCII);
248 
252  private static final byte @NotNull [] ACCOUNT_ADD_PLAYER_PREFIX = "accountaddplayer ".getBytes(StandardCharsets.US_ASCII);
253 
257  private static final byte @NotNull [] ACCOUNT_NEW_PREFIX = "accountnew ".getBytes(StandardCharsets.US_ASCII);
258 
262  private static final byte @NotNull [] ACCOUNT_PASSWORD_PREFIX = "accountpw ".getBytes(StandardCharsets.US_ASCII);
263 
267  private static final byte @NotNull [] CREATE_PLAYER_PREFIX = "createplayer ".getBytes(StandardCharsets.US_ASCII);
268 
272  private static final byte @NotNull [] ADDME_PREFIX = "addme ".getBytes(StandardCharsets.US_ASCII);
273 
277  private static final byte @NotNull [] APPLY_PREFIX = "apply ".getBytes(StandardCharsets.US_ASCII);
278 
282  private static final byte @NotNull [] ASKFACE_PREFIX = "askface ".getBytes(StandardCharsets.US_ASCII);
283 
287  private static final byte @NotNull [] EXAMINE_PREFIX = "examine ".getBytes(StandardCharsets.US_ASCII);
288 
292  private static final byte @NotNull [] LOCK_PREFIX = "lock ".getBytes(StandardCharsets.US_ASCII);
293 
297  private static final byte @NotNull [] LOOKAT_PREFIX = "lookat ".getBytes(StandardCharsets.US_ASCII);
298 
302  private static final byte @NotNull [] MARK_PREFIX = "mark ".getBytes(StandardCharsets.US_ASCII);
303 
307  private static final byte @NotNull [] MOVE_PREFIX = "move ".getBytes(StandardCharsets.US_ASCII);
308 
312  private static final byte @NotNull [] NCOM_PREFIX = "ncom ".getBytes(StandardCharsets.US_ASCII);
313 
317  private static final byte @NotNull [] REPLY_PREFIX = "reply ".getBytes(StandardCharsets.US_ASCII);
318 
322  private static final byte @NotNull [] REQUESTINFO_PREFIX = "requestinfo ".getBytes(StandardCharsets.US_ASCII);
323 
327  private static final byte @NotNull [] SETUP_PREFIX = "setup".getBytes(StandardCharsets.US_ASCII); // note that this command does not have a trailing space
328 
332  private static final byte @NotNull [] TOGGLEEXTENDEDTEXT_PREFIX = "toggleextendedtext".getBytes(StandardCharsets.US_ASCII); // note that this command does not have a trailing space
333 
337  private static final byte @NotNull [] VERSION_PREFIX = "version ".getBytes(StandardCharsets.US_ASCII);
338 
342  @NotNull
343  private final String version;
344 
349  @Nullable
350  private final DebugWriter debugProtocol;
351 
355  @NotNull
357 
361  @Nullable
362  private String accountName;
363 
367  private int loginMethod;
368 
372  @NotNull
374 
375  @NotNull
376  private final Object sync = new Object();
377 
378  @Override
379  public void newMap(final int mapWidth, final int mapHeight) {
380  }
381 
382  @NotNull
383  @Override
384  public Object mapBegin() {
385  return sync;
386  }
387 
388  @Override
389  public void mapClear(final int x, final int y) {
390  }
391 
392  @Override
393  public void mapDarkness(final int x, final int y, final int darkness) {
394  }
395 
396  @Override
397  public void mapFace(@NotNull final Location location, final int faceNum) {
398  }
399 
400  @Override
401  public void mapAnimation(@NotNull final Location location, final int animationNum, final int animationType) {
402  }
403 
404  @Override
405  public void mapAnimationSpeed(@NotNull final Location location, final int animationSpeed) {
406  }
407 
408  @Override
409  public void mapSmooth(@NotNull final Location location, final int smooth) {
410  }
411 
412  @Override
413  public void mapScroll(final int dx, final int dy) {
414  }
415 
416  @Override
417  public void magicMap(final int x, final int y, final byte @NotNull [] @NotNull [] data) {
418  }
419 
420  @Override
421  public void mapEnd() {
422  }
423 
424  };
425 
430  @NotNull
432 
436  @NotNull
438 
444  @NotNull
445  private final Deque<String> sendingRequestInfo = new ArrayDeque<>();
446 
451  @NotNull
452  private final List<String> pendingRequestInfos = new ArrayList<>();
453 
457  @NotNull
458  @SuppressWarnings("FieldCanBeLocal")
460 
461  @Override
462  public void connecting() {
463  // ignore
464  }
465 
466  @Override
467  public void connected() {
469  }
470 
471  @Override
472  public void packetReceived(@NotNull final ByteBuffer packet) throws UnknownCommandException {
474  }
475 
476  @Override
477  public void packetSent(@NotNull final ClientSocketMonitorCommand monitor) {
478  // ignore
479  }
480 
481  @Override
482  public void disconnected(@NotNull final String reason) {
483  // ignore
484  }
485 
486  };
487 
497  public DefaultCrossfireServerConnection(@NotNull final Model model, @Nullable final DebugWriter debugProtocol, @NotNull final String version) throws IOException {
498  super(model);
499  this.model = model;
501  this.version = version;
502  byteBuffer.order(ByteOrder.BIG_ENDIAN);
503  this.debugProtocol = debugProtocol;
505  //noinspection ThisEscapedInObjectConstruction
507  }
508 
509  @Override
510  public void setCrossfireUpdateMapListener(@NotNull final CrossfireUpdateMapListener listener) {
511  crossfireUpdateMapListener = listener;
512  }
513 
514  @Override
515  public void start() {
517  }
518 
519  @Override
520  public void stop() throws InterruptedException {
522  }
523 
524  @Override
525  public void addCrossfireMapScrollListener(@NotNull final CrossfireMapScrollListener listener) {
526  crossfireMapScrollListeners.add(listener);
527  }
528 
532  private void connected() {
533  newmap = true;
534  pendingMapWidth = 0;
535  pendingMapHeight = 0;
538 
539  fireNewMap();
540 
542  sendVersion(1023, 1027, version);
543  }
544 
552  private void processPacket(@NotNull final ByteBuffer packet) throws UnknownCommandException {
553  try {
554  ((Buffer)packet).mark();
555  switch (packet.get()) {
556  case 'a':
557  switch (packet.get()) {
558  case 'c':
559  //accountplayers
560  if (packet.get() != 'c') {
561  break;
562  }
563  if (packet.get() != 'o') {
564  break;
565  }
566  if (packet.get() != 'u') {
567  break;
568  }
569  if (packet.get() != 'n') {
570  break;
571  }
572  if (packet.get() != 't') {
573  break;
574  }
575  if (packet.get() != 'p') {
576  break;
577  }
578  if (packet.get() != 'l') {
579  break;
580  }
581  if (packet.get() != 'a') {
582  break;
583  }
584  if (packet.get() != 'y') {
585  break;
586  }
587  if (packet.get() != 'e') {
588  break;
589  }
590  if (packet.get() != 'r') {
591  break;
592  }
593  if (packet.get() != 's') {
594  break;
595  }
596  if (packet.get() != ' ') {
597  break;
598  }
600  return;
601 
602  case 'd':
603  if (packet.get() != 'd') {
604  break;
605  }
606  switch (packet.get()) {
607  case 'k':
608  if (packet.get() != 'n') {
609  break;
610  }
611  if (packet.get() != 'o') {
612  break;
613  }
614  if (packet.get() != 'w') {
615  break;
616  }
617  if (packet.get() != 'l') {
618  break;
619  }
620  if (packet.get() != 'e') {
621  break;
622  }
623  if (packet.get() != 'd') {
624  break;
625  }
626  if (packet.get() != 'g') {
627  break;
628  }
629  if (packet.get() != 'e') {
630  break;
631  }
632  if (packet.get() != ' ') {
633  break;
634  }
636  return;
637 
638  case 'm':
639  if (packet.get() != 'e') {
640  break;
641  }
642  if (packet.get() != '_') {
643  break;
644  }
645  switch (packet.get()) {
646  case 'f':
647  if (packet.get() != 'a') {
648  break;
649  }
650  if (packet.get() != 'i') {
651  break;
652  }
653  if (packet.get() != 'l') {
654  break;
655  }
656  if (packet.get() != 'e') {
657  break;
658  }
659  if (packet.get() != 'd') {
660  break;
661  }
662  if (packet.hasRemaining()) {
663  break;
664  }
666  return;
667 
668  case 's':
669  if (packet.get() != 'u') {
670  break;
671  }
672  if (packet.get() != 'c') {
673  break;
674  }
675  if (packet.get() != 'c') {
676  break;
677  }
678  if (packet.get() != 'e') {
679  break;
680  }
681  if (packet.get() != 's') {
682  break;
683  }
684  if (packet.get() != 's') {
685  break;
686  }
687  if (packet.hasRemaining()) {
688  break;
689  }
691  return;
692  }
693  break;
694 
695  case 'q':
696  if (packet.get() != 'u') {
697  break;
698  }
699  if (packet.get() != 'e') {
700  break;
701  }
702  if (packet.get() != 's') {
703  break;
704  }
705  if (packet.get() != 't') {
706  break;
707  }
708  if (packet.get() != ' ') {
709  break;
710  }
712  return;
713 
714  case 's':
715  if (packet.get() != 'p') {
716  break;
717  }
718  if (packet.get() != 'e') {
719  break;
720  }
721  if (packet.get() != 'l') {
722  break;
723  }
724  if (packet.get() != 'l') {
725  break;
726  }
727  if (packet.get() != ' ') {
728  break;
729  }
731  return;
732  }
733  break;
734 
735  case 'n':
736  if (packet.get() != 'i') {
737  break;
738  }
739  if (packet.get() != 'm') {
740  break;
741  }
742  if (packet.get() != ' ') {
743  break;
744  }
746  return;
747  }
748  break;
749 
750  case 'c':
751  if (packet.get() != 'o') {
752  break;
753  }
754  if (packet.get() != 'm') {
755  break;
756  }
757  if (packet.get() != 'c') {
758  break;
759  }
760  if (packet.get() != ' ') {
761  break;
762  }
764  return;
765 
766  case 'd':
767  switch (packet.get()) {
768  case 'e':
769  if (packet.get() != 'l') {
770  break;
771  }
772  switch (packet.get()) {
773  case 'i':
774  switch (packet.get()) {
775  case 'n':
776  if (packet.get() != 'v') {
777  break;
778  }
779  if (packet.get() != ' ') {
780  break;
781  }
783  return;
784 
785  case 't':
786  if (packet.get() != 'e') {
787  break;
788  }
789  if (packet.get() != 'm') {
790  break;
791  }
792  if (packet.get() != ' ') {
793  break;
794  }
796  return;
797  }
798  break;
799 
800  case 's':
801  if (packet.get() != 'p') {
802  break;
803  }
804  if (packet.get() != 'e') {
805  break;
806  }
807  if (packet.get() != 'l') {
808  break;
809  }
810  if (packet.get() != 'l') {
811  break;
812  }
813  if (packet.get() != ' ') {
814  break;
815  }
817  return;
818  }
819  break;
820 
821  case 'r':
822  if (packet.get() != 'a') {
823  break;
824  }
825  if (packet.get() != 'w') {
826  break;
827  }
828  switch (packet.get()) {
829  case 'e':
830  if (packet.get() != 'x') {
831  break;
832  }
833  if (packet.get() != 't') {
834  break;
835  }
836  if (packet.get() != 'i') {
837  break;
838  }
839  if (packet.get() != 'n') {
840  break;
841  }
842  if (packet.get() != 'f') {
843  break;
844  }
845  if (packet.get() != 'o') {
846  break;
847  }
848  if (packet.get() != ' ') {
849  break;
850  }
852  return;
853 
854  case 'i':
855  if (packet.get() != 'n') {
856  break;
857  }
858  if (packet.get() != 'f') {
859  break;
860  }
861  if (packet.get() != 'o') {
862  break;
863  }
864  if (packet.get() != ' ') {
865  break;
866  }
868  return;
869  }
870  break;
871  }
872  break;
873 
874  case 'E':
875  if (packet.get() != 'x') {
876  break;
877  }
878  if (packet.get() != 't') {
879  break;
880  }
881  if (packet.get() != 'e') {
882  break;
883  }
884  if (packet.get() != 'n') {
885  break;
886  }
887  if (packet.get() != 'd') {
888  break;
889  }
890  if (packet.get() != 'e') {
891  break;
892  }
893  if (packet.get() != 'd') {
894  break;
895  }
896  switch (packet.get()) {
897  case 'I':
898  if (packet.get() != 'n') {
899  break;
900  }
901  if (packet.get() != 'f') {
902  break;
903  }
904  if (packet.get() != 'o') {
905  break;
906  }
907  if (packet.get() != 'S') {
908  break;
909  }
910  if (packet.get() != 'e') {
911  break;
912  }
913  if (packet.get() != 't') {
914  break;
915  }
916  if (packet.get() != ' ') {
917  break;
918  }
920  return;
921 
922  case 'T':
923  if (packet.get() != 'e') {
924  break;
925  }
926  if (packet.get() != 'x') {
927  break;
928  }
929  if (packet.get() != 't') {
930  break;
931  }
932  if (packet.get() != 'S') {
933  break;
934  }
935  if (packet.get() != 'e') {
936  break;
937  }
938  if (packet.get() != 't') {
939  break;
940  }
941  if (packet.get() != ' ') {
942  break;
943  }
945  return;
946  }
947  break;
948 
949  case 'f':
950  if (packet.get() != 'a') {
951  break;
952  }
953  switch (packet.get()) {
954  case 'c':
955  if (packet.get() != 'e') {
956  break;
957  }
958  if (packet.get() != '2') {
959  break;
960  }
961  if (packet.get() != ' ') {
962  break;
963  }
965  return;
966 
967  case 'i':
968  if (packet.get() != 'l') {
969  break;
970  }
971  if (packet.get() != 'u') {
972  break;
973  }
974  if (packet.get() != 'r') {
975  break;
976  }
977  if (packet.get() != 'e') {
978  break;
979  }
980  if (packet.get() != ' ') {
981  break;
982  }
984  return;
985  }
986  break;
987 
988  case 'g':
989  if (packet.get() != 'o') {
990  break;
991  }
992  if (packet.get() != 'o') {
993  break;
994  }
995  if (packet.get() != 'd') {
996  break;
997  }
998  if (packet.get() != 'b') {
999  break;
1000  }
1001  if (packet.get() != 'y') {
1002  break;
1003  }
1004  if (packet.get() != 'e') {
1005  break;
1006  }
1007  if (packet.get() != ' ') {
1008  break;
1009  }
1011  return;
1012 
1013  case 'i':
1014  switch (packet.get()) {
1015  case 'm':
1016  if (packet.get() != 'a') {
1017  break;
1018  }
1019  if (packet.get() != 'g') {
1020  break;
1021  }
1022  if (packet.get() != 'e') {
1023  break;
1024  }
1025  if (packet.get() != '2') {
1026  break;
1027  }
1028  if (packet.get() != ' ') {
1029  break;
1030  }
1032  return;
1033 
1034  case 't':
1035  if (packet.get() != 'e') {
1036  break;
1037  }
1038  if (packet.get() != 'm') {
1039  break;
1040  }
1041  if (packet.get() != '2') {
1042  break;
1043  }
1044  if (packet.get() != ' ') {
1045  break;
1046  }
1048  return;
1049  }
1050  break;
1051 
1052  case 'm':
1053  switch (packet.get()) {
1054  case 'a':
1055  switch (packet.get()) {
1056  case 'g':
1057  if (packet.get() != 'i') {
1058  break;
1059  }
1060  if (packet.get() != 'c') {
1061  break;
1062  }
1063  if (packet.get() != 'm') {
1064  break;
1065  }
1066  if (packet.get() != 'a') {
1067  break;
1068  }
1069  if (packet.get() != 'p') {
1070  break;
1071  }
1072  if (packet.get() != ' ') {
1073  break;
1074  }
1076  return;
1077 
1078  case 'p':
1079  switch (packet.get()) {
1080  case '2':
1081  if (packet.get() != ' ') {
1082  break;
1083  }
1085  return;
1086 
1087  case 'e':
1088  if (packet.get() != 'x') {
1089  break;
1090  }
1091  if (packet.get() != 't') {
1092  break;
1093  }
1094  if (packet.get() != 'e') {
1095  break;
1096  }
1097  if (packet.get() != 'n') {
1098  break;
1099  }
1100  if (packet.get() != 'd') {
1101  break;
1102  }
1103  if (packet.get() != 'e') {
1104  break;
1105  }
1106  if (packet.get() != 'd') {
1107  break;
1108  }
1109  if (packet.get() != ' ') {
1110  break;
1111  }
1113  return;
1114  }
1115  break;
1116  }
1117  break;
1118 
1119  case 'u':
1120  if (packet.get() != 's') {
1121  break;
1122  }
1123  if (packet.get() != 'i') {
1124  break;
1125  }
1126  if (packet.get() != 'c') {
1127  break;
1128  }
1129  if (packet.get() != ' ') {
1130  break;
1131  }
1133  return;
1134  }
1135  break;
1136 
1137  case 'n':
1138  if (packet.get() != 'e') {
1139  break;
1140  }
1141  if (packet.get() != 'w') {
1142  break;
1143  }
1144  if (packet.get() != 'm') {
1145  break;
1146  }
1147  if (packet.get() != 'a') {
1148  break;
1149  }
1150  if (packet.get() != 'p') {
1151  break;
1152  }
1154  return;
1155 
1156  case 'p':
1157  switch (packet.get()) {
1158  case 'i':
1159  if (packet.get() != 'c') {
1160  break;
1161  }
1162  if (packet.get() != 'k') {
1163  break;
1164  }
1165  if (packet.get() != 'u') {
1166  break;
1167  }
1168  if (packet.get() != 'p') {
1169  break;
1170  }
1171  if (packet.get() != ' ') {
1172  break;
1173  }
1175  return;
1176 
1177  case 'l':
1178  if (packet.get() != 'a') {
1179  break;
1180  }
1181  if (packet.get() != 'y') {
1182  break;
1183  }
1184  if (packet.get() != 'e') {
1185  break;
1186  }
1187  if (packet.get() != 'r') {
1188  break;
1189  }
1190  if (packet.get() != ' ') {
1191  break;
1192  }
1194  return;
1195  }
1196  break;
1197 
1198  case 'q':
1199  if (packet.get() != 'u') {
1200  break;
1201  }
1202  if (packet.get() != 'e') {
1203  break;
1204  }
1205  if (packet.get() != 'r') {
1206  break;
1207  }
1208  if (packet.get() != 'y') {
1209  break;
1210  }
1211  if (packet.get() != ' ') {
1212  break;
1213  }
1215  return;
1216 
1217  case 'r':
1218  if (packet.get() != 'e') {
1219  break;
1220  }
1221  if (packet.get() != 'p') {
1222  break;
1223  }
1224  if (packet.get() != 'l') {
1225  break;
1226  }
1227  if (packet.get() != 'y') {
1228  break;
1229  }
1230  if (packet.get() != 'i') {
1231  break;
1232  }
1233  if (packet.get() != 'n') {
1234  break;
1235  }
1236  if (packet.get() != 'f') {
1237  break;
1238  }
1239  if (packet.get() != 'o') {
1240  break;
1241  }
1242  if (packet.get() != ' ') {
1243  break;
1244  }
1246  return;
1247 
1248  case 's':
1249  switch (packet.get()) {
1250  case 'e':
1251  if (packet.get() != 't') {
1252  break;
1253  }
1254  if (packet.get() != 'u') {
1255  break;
1256  }
1257  if (packet.get() != 'p') {
1258  break;
1259  }
1260  if (packet.get() != ' ') {
1261  break;
1262  }
1264  return;
1265 
1266  case 'm':
1267  if (packet.get() != 'o') {
1268  break;
1269  }
1270  if (packet.get() != 'o') {
1271  break;
1272  }
1273  if (packet.get() != 't') {
1274  break;
1275  }
1276  if (packet.get() != 'h') {
1277  break;
1278  }
1279  if (packet.get() != ' ') {
1280  break;
1281  }
1283  return;
1284 
1285  case 'o':
1286  if (packet.get() != 'u') {
1287  break;
1288  }
1289  if (packet.get() != 'n') {
1290  break;
1291  }
1292  if (packet.get() != 'd') {
1293  break;
1294  }
1295  switch (packet.get()) {
1296  case ' ':
1298  return;
1299 
1300  case '2':
1301  if (packet.get() != ' ') {
1302  break;
1303  }
1305  return;
1306  }
1307  break;
1308 
1309  case 't':
1310  if (packet.get() != 'a') {
1311  break;
1312  }
1313  if (packet.get() != 't') {
1314  break;
1315  }
1316  if (packet.get() != 's') {
1317  break;
1318  }
1319  if (packet.get() != ' ') {
1320  break;
1321  }
1323  return;
1324  }
1325  break;
1326 
1327  case 't':
1328  if (packet.get() != 'i') {
1329  break;
1330  }
1331  if (packet.get() != 'c') {
1332  break;
1333  }
1334  if (packet.get() != 'k') {
1335  break;
1336  }
1337  if (packet.get() != ' ') {
1338  break;
1339  }
1341  return;
1342 
1343  case 'u':
1344  if (packet.get() != 'p') {
1345  break;
1346  }
1347  if (packet.get() != 'd') {
1348  break;
1349  }
1350  switch (packet.get()) {
1351  case 'i':
1352  if (packet.get() != 't') {
1353  break;
1354  }
1355  if (packet.get() != 'e') {
1356  break;
1357  }
1358  if (packet.get() != 'm') {
1359  break;
1360  }
1361  if (packet.get() != ' ') {
1362  break;
1363  }
1365  return;
1366 
1367  case 'q':
1368  if (packet.get() != 'u') {
1369  break;
1370  }
1371  if (packet.get() != 'e') {
1372  break;
1373  }
1374  if (packet.get() != 's') {
1375  break;
1376  }
1377  if (packet.get() != 't') {
1378  break;
1379  }
1380  if (packet.get() != ' ') {
1381  break;
1382  }
1384  return;
1385 
1386  case 's':
1387  if (packet.get() != 'p') {
1388  break;
1389  }
1390  if (packet.get() != 'e') {
1391  break;
1392  }
1393  if (packet.get() != 'l') {
1394  break;
1395  }
1396  if (packet.get() != 'l') {
1397  break;
1398  }
1399  if (packet.get() != ' ') {
1400  break;
1401  }
1403  return;
1404  }
1405  break;
1406 
1407  case 'v':
1408  if (packet.get() != 'e') {
1409  break;
1410  }
1411  if (packet.get() != 'r') {
1412  break;
1413  }
1414  if (packet.get() != 's') {
1415  break;
1416  }
1417  if (packet.get() != 'i') {
1418  break;
1419  }
1420  if (packet.get() != 'o') {
1421  break;
1422  }
1423  if (packet.get() != 'n') {
1424  break;
1425  }
1426  if (packet.get() != ' ') {
1427  break;
1428  }
1430  return;
1431  }
1432  } catch (final IllegalArgumentException ex) {
1433  if (debugProtocol != null) {
1434  debugProtocol.debugProtocolWrite("IllegalArgumentException while command parsing: "+ex+"\n"+hexDump(packet), ex);
1435  }
1436  } catch (final BufferUnderflowException ex) {
1437  if (debugProtocol != null) {
1438  debugProtocol.debugProtocolWrite("BufferUnderflowException while command parsing: "+ex+"\n"+hexDump(packet), ex);
1439  }
1440  } catch (final ArrayIndexOutOfBoundsException ex) {
1441  if (debugProtocol != null) {
1442  debugProtocol.debugProtocolWrite("ArrayIndexOutOfBoundsException while command parsing: "+ex+"\n"+hexDump(packet), ex);
1443  }
1444  } catch (final StringIndexOutOfBoundsException ex) {
1445  if (debugProtocol != null) {
1446  debugProtocol.debugProtocolWrite("StringIndexOutOfBoundsException while command parsing: "+ex+"\n"+hexDump(packet), ex);
1447  }
1448  } catch (final UnknownCommandException ex) {
1449  if (debugProtocol != null) {
1450  debugProtocol.debugProtocolWrite("UnknownCommandException while command parsing: "+ex+"\n"+hexDump(packet), ex);
1451  }
1452  throw ex;
1453  }
1454 
1455  ((Buffer)packet).position(0);
1456  int cmdLen;
1457  for (cmdLen = 0; cmdLen < packet.limit(); cmdLen++) {
1458  final byte ch = packet.get(cmdLen);
1459  if ((ch&0xFF) <= 0x20 || (ch&0xFF) >= 0x80) {
1460  break;
1461  }
1462  }
1463  final String command = newString(packet, 0, cmdLen);
1464  if (debugProtocol != null) {
1465  debugProtocol.debugProtocolWrite("recv invalid command: "+command+"\n"+hexDump(packet));
1466  }
1467  throw new UnknownCommandException("Cannot parse command: "+command);
1468  }
1469 
1477  private void cmdMap2Coordinate(@NotNull final ByteBuffer packet, final int x, final int y) throws UnknownCommandException {
1478  while (true) {
1479  final int lenType = getInt1(packet);
1480  if (lenType == 0xFF) {
1481  break;
1482  }
1483 
1484  final int len = (lenType>>5)&7;
1485  final int type = lenType&31;
1486  switch (type) {
1487  case Map2.COORD_CLEAR_SPACE:
1488  cmdMap2CoordinateClearSpace(x, y, len);
1489  break;
1490 
1491  case Map2.COORD_DARKNESS:
1492  cmdMap2CoordinateDarkness(packet, x, y, len);
1493  break;
1494 
1495  case Map2.COORD_LAYER0:
1496  case Map2.COORD_LAYER1:
1497  case Map2.COORD_LAYER2:
1498  case Map2.COORD_LAYER3:
1499  case Map2.COORD_LAYER4:
1500  case Map2.COORD_LAYER5:
1501  case Map2.COORD_LAYER6:
1502  case Map2.COORD_LAYER7:
1503  case Map2.COORD_LAYER8:
1504  case Map2.COORD_LAYER9:
1505  cmdMap2CoordinateLayer(packet, x, y, len, type-Map2.COORD_LAYER0);
1506  break;
1507  }
1508  }
1509  }
1510 
1519  private void cmdMap2CoordinateClearSpace(final int x, final int y, final int len) throws UnknownCommandException {
1520  if (len != 0) {
1521  throw new UnknownCommandException("map2 command contains clear command with length "+len);
1522  }
1523  if (debugProtocol != null) {
1524  debugProtocol.debugProtocolWrite("recv map2 "+x+"/"+y+" clear");
1525  }
1526  fireMapClear(x, y);
1527  }
1528 
1537  private void cmdMap2CoordinateDarkness(@NotNull final ByteBuffer packet, final int x, final int y, final int len) throws UnknownCommandException {
1538  if (len != 1) {
1539  throw new UnknownCommandException("map2 command contains darkness command with length "+len);
1540  }
1541  final int darkness = getInt1(packet);
1542  if (debugProtocol != null) {
1543  debugProtocol.debugProtocolWrite("recv map2 "+x+"/"+y+" darkness="+darkness);
1544  }
1545  fireMapDarkness(x, y, darkness);
1546  }
1547 
1557  private void cmdMap2CoordinateLayer(@NotNull final ByteBuffer packet, final int x, final int y, final int len, final int layer) throws UnknownCommandException {
1558  if (len < 2) {
1559  throw new UnknownCommandException("map2 command contains image command with length "+len);
1560  }
1561  final Location location = new Location(x, y, layer);
1562  final int face = getInt2(packet);
1563  if ((face&Map2.FACE_ANIMATION) == 0) {
1564  if (debugProtocol != null) {
1565  debugProtocol.debugProtocolWrite("recv map2 "+location+" face="+face);
1566  }
1567  /* Ensure the smoothing is reset. If it was 0 then this is a no-op, else this
1568  forces a redraw of adjacent tiles, which could be needed if the new face
1569  is the next of an animation (with the same smoothlevel). */
1570  fireMapSmooth(location, 0);
1571  fireMapFace(location, face);
1572  } else {
1573  if (debugProtocol != null) {
1574  debugProtocol.debugProtocolWrite("recv map2 "+location+" anim="+(face&Map2.ANIM_MASK)+" type="+((face>>Map2.ANIM_TYPE_SHIFT)&Map2.ANIM_TYPE_MASK));
1575  }
1577  }
1578  if (len == 3) {
1579  cmdMap2CoordinateLayer3(packet, location, face);
1580  } else if (len == 4) {
1581  cmdMap2CoordinateLayer4(packet, location, face);
1582  } else if (len != 2) {
1583  if (debugProtocol != null) {
1584  debugProtocol.debugProtocolWrite("recv map2 "+x+"/"+y+"/"+layer+" <invalid>");
1585  }
1586  throw new UnknownCommandException("map2 command contains image command with length "+len);
1587  }
1588  }
1589 
1598  private void cmdMap2CoordinateLayer3(@NotNull final ByteBuffer packet, @NotNull final Location location, final int face) throws UnknownCommandException {
1599  if (face == 0) {
1600  throw new UnknownCommandException("map2 command contains smoothing or animation information for empty face");
1601  }
1602 
1603  if ((face&Map2.FACE_ANIMATION) == 0) {
1604  final int smooth = getInt1(packet);
1605  if (debugProtocol != null) {
1606  debugProtocol.debugProtocolWrite("recv map2 "+location+" smooth="+smooth);
1607  }
1608  fireMapSmooth(location, smooth);
1609  } else {
1610  final int animSpeed = getInt1(packet);
1611  if (debugProtocol != null) {
1612  debugProtocol.debugProtocolWrite("recv map2 "+location+" anim_speed="+animSpeed);
1613  }
1614  fireMapAnimationSpeed(location, animSpeed);
1615  }
1616  }
1617 
1626  private void cmdMap2CoordinateLayer4(@NotNull final ByteBuffer packet, @NotNull final Location location, final int face) throws UnknownCommandException {
1627  if (face == 0) {
1628  throw new UnknownCommandException("map2 command contains smoothing or animation information for empty face");
1629  }
1630 
1631  final int animSpeed = getInt1(packet);
1632  if (debugProtocol != null) {
1633  debugProtocol.debugProtocolWrite("recv map2 "+location+" anim_speed="+animSpeed);
1634  }
1635  fireMapAnimationSpeed(location, animSpeed);
1636 
1637  final int smooth = getInt1(packet);
1638  if (debugProtocol != null) {
1639  debugProtocol.debugProtocolWrite("recv map2 "+location+" smooth="+smooth);
1640  }
1641  fireMapSmooth(location, smooth);
1642  }
1643 
1649  private void negotiateMapSize(final int mapWidth, final int mapHeight) {
1650  if (debugProtocol != null) {
1651  debugProtocol.debugProtocolWrite("negotiateMapSize: "+mapWidth+"x"+mapHeight);
1652  }
1653 
1655  if (debugProtocol != null) {
1656  debugProtocol.debugProtocolWrite("negotiateMapSize: clientSocketState="+clientSocketState+", ignoring");
1657  }
1658  return;
1659  }
1660  if (pendingMapWidth != 0 || pendingMapHeight != 0) {
1661  if (debugProtocol != null) {
1662  debugProtocol.debugProtocolWrite("negotiateMapSize: already negotiating, ignoring");
1663  }
1664  return;
1665  }
1666  if (currentMapWidth == mapWidth && currentMapHeight == mapHeight) {
1667  if (debugProtocol != null) {
1668  debugProtocol.debugProtocolWrite("negotiateMapSize: same as current map size, ignoring");
1669  }
1670  return;
1671  }
1672  pendingMapWidth = mapWidth;
1673  pendingMapHeight = mapHeight;
1674  sendSetup("mapsize "+pendingMapWidth+"x"+pendingMapHeight);
1675  }
1676 
1684  private void cmdReplyinfo(@NotNull final String infoType, final ByteBuffer packet) throws IOException, UnknownCommandException {
1685  final String param;
1686  synchronized (writeBuffer) {
1687  if (sendingRequestInfo.isEmpty()) {
1688  System.err.println("Server responded with replyinfo "+infoType+" when expecting no replyinfo");
1689  } else if (!PATTERN_SPACE.split(sendingRequestInfo.getFirst(), 2)[0].equals(infoType)) {
1690  System.err.println("Server responded with replyinfo "+infoType+" when expecting replyinfo "+sendingRequestInfo.getFirst());
1691  } else {
1692  sendingRequestInfo.removeFirst();
1693  }
1694 
1696  synchronized (writeBuffer) {
1697  param = sendingRequestInfo.isEmpty() ? "" : sendingRequestInfo.getFirst();
1698  }
1699  } else {
1700  param = "";
1701  }
1702  }
1705 
1706  switch (infoType) {
1707  case "image_info":
1709  break;
1710 
1711  case "skill_info":
1713  break;
1714 
1715  case "skill_extra":
1717  break;
1718 
1719  case "exp_table":
1721  break;
1722 
1723  case "knowledge_info":
1725  break;
1726 
1727  case "startingmap":
1729  break;
1730 
1731  case "race_list":
1733  break;
1734 
1735  case "class_list":
1737  break;
1738 
1739  case "race_info":
1741  break;
1742 
1743  case "class_info":
1745  break;
1746 
1747  case "newcharinfo":
1749  break;
1750 
1751  default:
1752  System.err.println("Ignoring unexpected replyinfo type '"+infoType+"'.");
1753  break;
1754  }
1755 
1757  if (loginMethod == 0) {
1759  sendAddme();
1760  } else {
1763  }
1764  }
1765  }
1766 
1772  private void processImageInfoReplyinfo(@NotNull final ByteBuffer packet) throws IOException {
1773  final byte[] data = new byte[packet.remaining()];
1774  packet.get(data);
1775  try (ByteArrayInputStream is = new ByteArrayInputStream(data)) {
1776  try (InputStreamReader isr = new InputStreamReader(is, UTF8)) {
1777  try (BufferedReader d = new BufferedReader(isr)) {
1778  final String info = d.readLine();
1779  if (info == null) {
1780  throw new IOException("Truncated parameter in image_info");
1781  }
1782  final int nrPics = Integer.parseInt(info);
1783  if (debugProtocol != null) {
1784  debugProtocol.debugProtocolWrite("recv replyinfo image_info nrPics="+nrPics);
1785  }
1786  // XXX: replyinfo image_info not implemented
1787  }
1788  }
1789  }
1790  }
1791 
1797  private void processSkillInfoReplyinfo(@NotNull final ByteBuffer packet) throws IOException {
1799  final byte[] data = new byte[packet.remaining()];
1800  packet.get(data);
1801  try (ByteArrayInputStream is = new ByteArrayInputStream(data)) {
1802  try (InputStreamReader isr = new InputStreamReader(is, UTF8)) {
1803  try (BufferedReader d = new BufferedReader(isr)) {
1804  while (true) {
1805  final CharSequence r = d.readLine();
1806  if (r == null) {
1807  break;
1808  }
1809 
1810  final String[] sk = PATTERN_DOT.split(r, 3);
1811  if (sk.length < 2 || sk.length > 3) {
1812  System.err.println("Ignoring skill definition for invalid skill: "+r+".");
1813  continue;
1814  }
1815 
1816  final int skillId;
1817  try {
1818  skillId = Integer.parseInt(sk[0]);
1819  } catch (final NumberFormatException ignored) {
1820  System.err.println("Ignoring skill definition for invalid skill: "+r+".");
1821  continue;
1822  }
1823 
1824  if (skillId < Stats.CS_STAT_SKILLINFO || skillId >= Stats.CS_STAT_SKILLINFO+Stats.CS_NUM_SKILLS) {
1825  System.err.println("Ignoring skill definition for invalid skill id "+skillId+": "+r+".");
1826  continue;
1827  }
1828 
1829  int face = -1;
1830  if (sk.length > 2) {
1831  try {
1832  face = Integer.parseInt(sk[2]);
1833  } catch (final NumberFormatException ignored) {
1834  System.err.println("Ignoring skill definition for invalid face: "+r+".");
1835  continue;
1836  }
1837  }
1838  if (debugProtocol != null) {
1839  debugProtocol.debugProtocolWrite("recv reply skill_info id="+skillId+" name="+sk[1]+" face="+face);
1840  }
1841  model.getSkillSet().addSkill(skillId, sk[1], face);
1842  }
1843  }
1844  }
1845  }
1846  }
1847 
1852  private void processSkillExtraReplyinfo(@NotNull final ByteBuffer packet) {
1853  while (packet.remaining() >= 2) {
1854  final short skillIndex = packet.getShort();
1855  if (skillIndex == 0) {
1856  if (packet.hasRemaining()) {
1857  System.err.println("Ignoring excess data at the of skill_extra");
1858  }
1859  break;
1860  }
1861  final short len = packet.getShort();
1862  final String message = getString(packet, len);
1863  if (debugProtocol != null) {
1864  debugProtocol.debugProtocolWrite("recv replyinfo skill_extra "+skillIndex);
1865  }
1866  model.getSkillSet().setSkillExtra(skillIndex, message);
1867  }
1868  }
1869 
1874  private void processExpTableReplyinfo(@NotNull final ByteBuffer packet) {
1875  final int numLevels = getInt2(packet);
1876  final long[] expTable = new long[numLevels];
1877  for (int level = 1; level < numLevels; level++) {
1878  expTable[level] = getInt8(packet);
1879  }
1880  if (packet.hasRemaining()) {
1881  System.err.println("Ignoring excess data at end of exp_table");
1882  }
1883 
1884  if (debugProtocol != null) {
1885  debugProtocol.debugProtocolWrite("recv replyinfo exp_table "+Arrays.toString(expTable));
1886  }
1887  model.getExperienceTable().setExpTable(expTable);
1888  }
1889 
1895  private void processKnowledgeInfoReplyinfo(@NotNull final ByteBuffer packet) throws IOException {
1897  final byte[] data = new byte[packet.remaining()];
1898  packet.get(data);
1899  try (ByteArrayInputStream is = new ByteArrayInputStream(data)) {
1900  try (InputStreamReader isr = new InputStreamReader(is, UTF8)) {
1901  try (BufferedReader d = new BufferedReader(isr)) {
1902  while (true) {
1903  final CharSequence r = d.readLine();
1904  if (r == null) {
1905  break;
1906  }
1907 
1908  final String[] sk = PATTERN_DOT.split(r);
1909  if (sk.length != 4) {
1910  System.err.println("Ignoring knowledge definition for invalid knowledge: "+r+".");
1911  continue;
1912  }
1913 
1914  final int face;
1915  try {
1916  face = Integer.parseInt(sk[2]);
1917  } catch (final NumberFormatException ignored) {
1918  System.err.println("Ignoring knowledge definition for invalid face: "+r+".");
1919  continue;
1920  }
1921 
1922  if (debugProtocol != null) {
1923  debugProtocol.debugProtocolWrite("recv replyinfo knowledge_info type="+sk[0]+" name="+sk[1]+" face="+face+" can_attempt="+sk[3]);
1924  }
1925  model.getKnowledgeManager().addKnowledgeType(sk[0], sk[1], face, sk[3].equals("1"));
1926  }
1927  }
1928  }
1929  }
1930  }
1931 
1936  private void processStartingMapReplyinfo(@NotNull final ByteBuffer packet) {
1937  final StartingMapBuilder sb = new StartingMapBuilder();
1938  while (packet.hasRemaining()) {
1939  final int type = getInt1(packet);
1940  final int length = getInt2(packet);
1941  switch (type) {
1942  case INFO_MAP_ARCH_NAME:
1943  final String archName = getString(packet, length);
1944  if (debugProtocol != null) {
1945  debugProtocol.debugProtocolWrite("recv replyinfo startingmap type=INFO_MAP_ARCH_NAME arch_name="+archName);
1946  }
1947  sb.setArchName(archName);
1948  break;
1949 
1950  case INFO_MAP_NAME:
1951  final String name = getString(packet, length);
1952  if (debugProtocol != null) {
1953  debugProtocol.debugProtocolWrite("recv replyinfo startingmap type=INFO_MAP_NAME name="+name);
1954  }
1955  sb.setName(name);
1956  break;
1957 
1958  case INFO_MAP_DESCRIPTION:
1959  final String description = getString(packet, length);
1960  if (debugProtocol != null) {
1961  debugProtocol.debugProtocolWrite("recv replyinfo startingmap type=INFO_MAP_DESCRIPTION description="+description);
1962  }
1963  sb.setDescription(description);
1964  break;
1965 
1966  default:
1967  if (debugProtocol != null) {
1968  debugProtocol.debugProtocolWrite("recv replyinfo startingmap type="+type);
1969  }
1970  System.err.println("Ignoring startingmap type "+type);
1971  break;
1972  }
1973  }
1975  }
1976 
1981  private void processRaceListReplyinfo(@NotNull final ByteBuffer packet) {
1982  while (packet.remaining() > 0 && packet.get(packet.position()) == '|') {
1983  packet.get();
1984  }
1985  final String raceList = getString(packet, packet.remaining());
1986  final String[] races = raceList.isEmpty() ? EMPTY_STRING_ARRAY : PATTERN_BAR.split(raceList);
1987  if (debugProtocol != null) {
1988  debugProtocol.debugProtocolWrite("recv replyinfo race_list races="+Arrays.toString(races));
1989  }
1991 
1992  if (loginMethod > 0) {
1993  for (String race : races) {
1994  sendQueuedRequestinfo("race_info "+race);
1995  }
1996  }
1997  }
1998 
2003  private void processClassListReplyinfo(@NotNull final ByteBuffer packet) {
2004  while (packet.remaining() > 0 && packet.get(packet.position()) == '|') {
2005  packet.get();
2006  }
2007  final String classList = getString(packet, packet.remaining());
2008  final String[] classes = classList.isEmpty() ? EMPTY_STRING_ARRAY : PATTERN_BAR.split(classList);
2009  if (debugProtocol != null) {
2010  debugProtocol.debugProtocolWrite("recv replyinfo class_list classes="+Arrays.toString(classes));
2011  }
2013 
2014  if (loginMethod > 0) {
2015  for (String class_ : classes) {
2016  sendQueuedRequestinfo("class_info "+class_);
2017  }
2018  }
2019  }
2020 
2028  private void processClassRaceInfoReplyinfo(@NotNull final ByteBuffer packet, final boolean raceInfo) throws UnknownCommandException {
2029  final String raceName = getStringDelimiter(packet, '\n');
2030  final ClassRaceInfoBuilder rb = new ClassRaceInfoBuilder(raceName);
2031  while (packet.hasRemaining()) {
2032  final String type = getStringDelimiter(packet, ' ');
2033  switch (type) {
2034  case "name":
2036  break;
2037 
2038  case "msg":
2040  break;
2041 
2042  case "stats":
2044  break;
2045 
2046  case "choice":
2048  break;
2049 
2050  default:
2051  System.err.println("Ignoring race_info type "+type);
2052  break;
2053  }
2054  }
2055  final ClassRaceInfo classRaceInfo = rb.finish();
2056  if (debugProtocol != null) {
2057  debugProtocol.debugProtocolWrite("recv replyinfo "+(raceInfo ? "race_info" : "class_info")+" "+classRaceInfo);
2058  }
2059  if (raceInfo) {
2060  model.getNewCharacterInformation().addRaceInfo(classRaceInfo);
2061  } else {
2063  }
2064  }
2065 
2071  private void processNewCharInfoReplyinfo(@NotNull final ByteBuffer packet) throws UnknownCommandException {
2072  final NewCharInfoBuilder newCharInfoBuilder = new NewCharInfoBuilder();
2073  while (packet.hasRemaining()) {
2074  final int len = getInt1(packet)-1;
2075  final String line = getString(packet, len);
2076  getInt1(packet); // skip trailing \0 byte
2077 
2078  final String[] tokens = PATTERN_SPACE.split(line, 3);
2079  if (tokens.length != 3) {
2080  throw new UnknownCommandException("syntax error in replyinfo newcharinfo: "+line);
2081  }
2082  final String typeString = tokens[0];
2083  final String variableName = tokens[1];
2084  final String values = tokens[2];
2085  switch (typeString) {
2086  case "R":
2087  parseNewCharInfoValue(newCharInfoBuilder, true, variableName, values);
2088  break;
2089 
2090  case "O":
2091  parseNewCharInfoValue(newCharInfoBuilder, false, variableName, values);
2092  break;
2093 
2094  case "V":
2095  parseNewCharInfoValues(newCharInfoBuilder, variableName, values);
2096  break;
2097 
2098  case "I":
2099  parseNewCharInfoInformational(variableName, values);
2100  break;
2101 
2102  default:
2103  throw new UnknownCommandException("unknown type '"+typeString+"' in replyinfo newcharinfo: "+line);
2104  }
2105  }
2106  final NewCharInfo newCharInfo = newCharInfoBuilder.finish();
2107  if (debugProtocol != null) {
2108  debugProtocol.debugProtocolWrite("recv replyinfo newcharinfo "+newCharInfo);
2109  }
2111  }
2112 
2121  private static void parseNewCharInfoValue(@NotNull final NewCharInfoBuilder newCharInfoBuilder, final boolean required, @NotNull final String variableName, @NotNull final String values) throws UnknownCommandException {
2122  if (variableName.equals("race")) {
2123  if (!values.equals("requestinfo")) {
2124  throw new UnknownCommandException(variableName+"="+values+" is not supported in replyinfo newcharinfo");
2125  }
2126  newCharInfoBuilder.setRaceChoice();
2127  } else if (variableName.equals("class")) {
2128  if (!values.equals("requestinfo")) {
2129  throw new UnknownCommandException(variableName+"="+values+" is not supported in replyinfo newcharinfo");
2130  }
2131  newCharInfoBuilder.setClassChoice();
2132  } else if (variableName.equals("startingmap")) {
2133  if (!values.equals("requestinfo")) {
2134  throw new UnknownCommandException(variableName+"="+values+" is not supported in replyinfo newcharinfo");
2135  }
2136  newCharInfoBuilder.setStartingMapChoice();
2137  } else if (!required) {
2138  System.err.println("unknown variable name '"+variableName+"' in replyinfo newcharinfo");
2139  } else {
2140  throw new UnknownCommandException("unknown variable name '"+variableName+"' in replyinfo newcharinfo");
2141  }
2142  }
2143 
2151  private static void parseNewCharInfoValues(@NotNull final NewCharInfoBuilder newCharInfoBuilder, @NotNull final String variableName, @NotNull final String values) throws UnknownCommandException {
2152  switch (variableName) {
2153  case "points":
2154  final int points;
2155  try {
2156  points = Integer.parseInt(values);
2157  } catch (final NumberFormatException ignored) {
2158  throw new UnknownCommandException("'"+variableName+"' variable in replyinfo newcharinfo has invalid value '"+values+"'.");
2159  }
2160  newCharInfoBuilder.setPoints(points);
2161  break;
2162 
2163  case "statrange":
2164  final String[] tmp = PATTERN_SPACE.split(values, 2);
2165  if (tmp.length != 2) {
2166  throw new UnknownCommandException("'"+variableName+"' variable in replyinfo newcharinfo has invalid value '"+values+"'.");
2167  }
2168  final int minValue;
2169  final int maxValue;
2170  try {
2171  minValue = Integer.parseInt(tmp[0]);
2172  maxValue = Integer.parseInt(tmp[1]);
2173  } catch (final NumberFormatException ignored) {
2174  throw new UnknownCommandException("'"+variableName+"' variable in replyinfo newcharinfo has invalid value '"+values+"'.");
2175  }
2176  newCharInfoBuilder.setStatRange(minValue, maxValue);
2177  break;
2178 
2179  case "statname":
2180  newCharInfoBuilder.setStatNames(PATTERN_SPACE.split(values));
2181  break;
2182 
2183  default:
2184  throw new UnknownCommandException("unknown variable name '"+variableName+"' in replyinfo newcharinfo");
2185  }
2186  }
2187 
2193  private static void parseNewCharInfoInformational(@NotNull final String variableName, @NotNull final String values) {
2194  System.err.println("ignoring informational "+variableName+"="+values+" in replyinfo newcharinfo");
2195  }
2196 
2204  private static void parseClassRaceInfoStats(@NotNull final ByteBuffer packet, @NotNull final ClassRaceInfoBuilder rb) throws UnknownCommandException {
2205  while (packet.hasRemaining()) {
2206  final int stat = getInt1(packet);
2207  switch (stat) {
2208  case 0:
2209  return;
2210 
2211  case Stats.CS_STAT_HP:
2212  case Stats.CS_STAT_MAXHP:
2213  case Stats.CS_STAT_SP:
2214  case Stats.CS_STAT_MAXSP:
2215  case Stats.CS_STAT_STR:
2216  case Stats.CS_STAT_INT:
2217  case Stats.CS_STAT_WIS:
2218  case Stats.CS_STAT_DEX:
2219  case Stats.CS_STAT_CON:
2220  case Stats.CS_STAT_CHA:
2221  case Stats.CS_STAT_LEVEL:
2222  case Stats.CS_STAT_WC:
2223  case Stats.CS_STAT_AC:
2224  case Stats.CS_STAT_DAM:
2225  case Stats.CS_STAT_ARMOUR:
2226  case Stats.CS_STAT_FOOD:
2227  case Stats.CS_STAT_POW:
2228  case Stats.CS_STAT_GRACE:
2229  case Stats.CS_STAT_MAXGRACE:
2230  case Stats.CS_STAT_FLAGS:
2231  case Stats.CS_STAT_RACE_STR:
2232  case Stats.CS_STAT_RACE_INT:
2233  case Stats.CS_STAT_RACE_WIS:
2234  case Stats.CS_STAT_RACE_DEX:
2235  case Stats.CS_STAT_RACE_CON:
2236  case Stats.CS_STAT_RACE_CHA:
2237  case Stats.CS_STAT_RACE_POW:
2238  case Stats.CS_STAT_BASE_STR:
2239  case Stats.CS_STAT_BASE_INT:
2240  case Stats.CS_STAT_BASE_WIS:
2241  case Stats.CS_STAT_BASE_DEX:
2242  case Stats.CS_STAT_BASE_CON:
2243  case Stats.CS_STAT_BASE_CHA:
2244  case Stats.CS_STAT_BASE_POW:
2252  case Stats.CS_STAT_GOLEM_HP:
2255  final short int2Param = (short)getInt2(packet);
2256  rb.setStatAdjustment(stat, int2Param);
2257  break;
2258 
2259  case Stats.CS_STAT_EXP:
2260  case Stats.CS_STAT_SPEED:
2261  case Stats.CS_STAT_WEAP_SP:
2267  case Stats.CS_STAT_OVERLOAD:
2268  final int int4Param = getInt4(packet);
2269  rb.setStatAdjustment(stat, int4Param);
2270  break;
2271 
2272  case Stats.CS_STAT_EXP64:
2273  final long int8Param = getInt8(packet);
2274  rb.setStatAdjustment(stat, int8Param);
2275  break;
2276 
2277  case Stats.CS_STAT_RANGE:
2278  case Stats.CS_STAT_TITLE:
2279  final int length = getInt1(packet);
2280  final String strParam = getString(packet, length);
2281  System.err.println("replyinfo race/class_info: string stat "+stat+" not implemented");
2282  break;
2283 
2284  default:
2286  final short int2Param2 = (short)getInt2(packet);
2287  rb.setStatAdjustment(stat, int2Param2);
2288  } else if (Stats.CS_STAT_SKILLINFO <= stat && stat < Stats.CS_STAT_SKILLINFO+Stats.CS_NUM_SKILLS) {
2289  final int level = getInt1(packet);
2290  final long experience = getInt8(packet);
2291  System.err.println("replyinfo race/class_info: skill stat "+stat+" not implemented");
2292  } else {
2293  throw new UnknownCommandException("unknown stat value: "+stat);
2294  }
2295  break;
2296  }
2297  }
2298 
2299  throw new UnknownCommandException("truncated stats entry in replyinfo race/class_info");
2300  }
2301 
2308  private static void parseClassRaceInfoChoice(@NotNull final ByteBuffer packet, @NotNull final ClassRaceInfoBuilder rb) {
2309  final String choiceName = getString(packet, getInt1(packet));
2310  final String choiceDescription = getString(packet, getInt1(packet));
2311  final String archName = getString(packet, getInt1(packet));
2312  final String archDesc = getString(packet, getInt1(packet));
2313  final Map<String, String> choices = new LinkedHashMap<>();
2314  choices.put(archName, archDesc);
2315  while (true) {
2316  final int archNameLength = getInt1(packet);
2317  if (archNameLength == 0) {
2318  break;
2319  }
2320  final String archName2 = getString(packet, archNameLength);
2321  final String archDesc2 = getString(packet, getInt1(packet));
2322  choices.put(archName2, archDesc2);
2323  }
2324  rb.addChoice(new Choice(choiceName, choiceDescription, choices));
2325  }
2326 
2332  private void processAccountPlayers(@NotNull final ByteBuffer packet) throws UnknownCommandException {
2333  if (accountName == null) {
2334  throw new UnknownCommandException("accountplayers without account");
2335  }
2337 
2338  // number of characters
2339  final int total = getInt1(packet);
2340  final AccountPlayerBuilder accountPlayerBuilder = new AccountPlayerBuilder();
2341  for (int count = 0; count < total; count++) {
2342  final CharacterInformation characterInformation = parseAccountPlayer(packet, accountPlayerBuilder);
2343  if (debugProtocol != null) {
2344  debugProtocol.debugProtocolWrite("recv accountplayers entry: "+characterInformation);
2345  }
2346  fireAddAccount(characterInformation);
2347  }
2348  if (packet.hasRemaining()) {
2349  throw new UnknownCommandException("invalid accountplayers reply, pos="+packet.position());
2350  }
2351 
2352  fireEndAccountList(total);
2353 
2354  notifyPacketWatcherListeners("accountplayers", () -> "");
2355  }
2356 
2364  @NotNull
2365  private CharacterInformation parseAccountPlayer(@NotNull final ByteBuffer packet, @NotNull final AccountPlayerBuilder accountPlayerBuilder) throws UnknownCommandException {
2366  while (true) {
2367  if (!packet.hasRemaining()) {
2368  throw new UnknownCommandException("truncated accountplayers reply");
2369  }
2370 
2371  final int len = getInt1(packet);
2372  if (len == 0) {
2373  break;
2374  }
2375 
2376  final int type = getInt1(packet);
2377  switch (type) {
2378  case ACL_NAME:
2379  accountPlayerBuilder.setName(getString(packet, len-1));
2380  break;
2381 
2382  case ACL_CLASS:
2383  accountPlayerBuilder.setClass(getString(packet, len-1));
2384  break;
2385 
2386  case ACL_RACE:
2387  accountPlayerBuilder.setRace(getString(packet, len-1));
2388  break;
2389 
2390  case ACL_LEVEL:
2391  accountPlayerBuilder.setLevel(getInt2(packet));
2392  break;
2393 
2394  case ACL_FACE:
2395  accountPlayerBuilder.setFace(getString(packet, len-1));
2396  break;
2397 
2398  case ACL_PARTY:
2399  accountPlayerBuilder.setParty(getString(packet, len-1));
2400  break;
2401 
2402  case ACL_MAP:
2403  accountPlayerBuilder.setMap(getString(packet, len-1));
2404  break;
2405 
2406  case ACL_FACE_NUM:
2407  accountPlayerBuilder.setFaceNumber(getInt2(packet));
2408  break;
2409 
2410  default:
2411  // ignore those values we don't understand
2412  if (debugProtocol != null) {
2413  debugProtocol.debugProtocolWrite("recv accountplayers unknown="+type);
2414  }
2415  ((Buffer)packet).position(packet.position()+len-1);
2416  break;
2417  }
2418  }
2419 
2420  return accountPlayerBuilder.finish();
2421  }
2422 
2426  private void processAddmeFailed() {
2427  if (debugProtocol != null) {
2428  debugProtocol.debugProtocolWrite("recv addme_failed");
2429  }
2430  // XXX: addme_failed command not implemented
2431  notifyPacketWatcherListeners("addme_failed", () -> "");
2432  }
2433 
2437  private void processAddmeSuccess() {
2438  if (debugProtocol != null) {
2439  debugProtocol.debugProtocolWrite("recv addme_success");
2440  }
2443  // servers without account support
2446  fireStartPlaying();
2448  }
2450  }
2451 
2452  notifyPacketWatcherListeners("addme_success", () -> "");
2453  }
2454 
2459  private void processAddQuest(@NotNull final ByteBuffer packet) {
2460  while (packet.hasRemaining()) {
2461  final int code = getInt4(packet);
2462  final int titleLength = getInt2(packet);
2463  final String title = getString(packet, titleLength);
2464  final int face = getInt4(packet);
2465  final int replay = getInt1(packet);
2466  final int parent = getInt4(packet);
2467  final int end = getInt1(packet);
2468  final int stepLength = getInt2(packet);
2469  final String step = stepLength > 0 ? getString(packet, stepLength) : "";
2470  if (debugProtocol != null) {
2471  debugProtocol.debugProtocolWrite("recv addquest code="+code+" title="+title+" face="+face+" replay="+replay+" end="+end+" desc="+step);
2472  }
2473  model.getQuestsManager().addQuest(code, title, face, replay == 1, parent, end == 1, step);
2474  }
2475  notifyPacketWatcherListeners("addquest", () -> "");
2476  }
2477 
2482  private void processAddKnowledge(@NotNull final ByteBuffer packet) {
2483  while (packet.hasRemaining()) {
2484  final int code = getInt4(packet);
2485  final int typeLength = getInt2(packet);
2486  final String type = getString(packet, typeLength);
2487  final int titleLength = getInt2(packet);
2488  final String title = getString(packet, titleLength);
2489  final int face = getInt4(packet);
2490  if (debugProtocol != null) {
2491  debugProtocol.debugProtocolWrite("recv addknowledge code="+code+" type="+type+" title="+title+" face="+face);
2492  }
2493  model.getKnowledgeManager().addKnowledge(code, type, title, face);
2494  }
2495  notifyPacketWatcherListeners("addknowledge", () -> "");
2496  }
2497 
2502  private void processAddSpell(@NotNull final ByteBuffer packet) {
2503  while (packet.hasRemaining()) {
2504  final int tag = getInt4(packet);
2505  final int level = getInt2(packet);
2506  final int castingTime = getInt2(packet);
2507  final int mana = getInt2(packet);
2508  final int grace = getInt2(packet);
2509  final int damage = getInt2(packet);
2510  final int skill = getInt1(packet);
2511  final int path = getInt4(packet);
2512  final int face = getInt4(packet);
2513  final int nameLength = getInt1(packet);
2514  final String name = getString(packet, nameLength);
2515  final int messageLength = getInt2(packet);
2516  final String message = getString(packet, messageLength);
2517  if (debugProtocol != null) {
2518  debugProtocol.debugProtocolWrite("recv addspell tag="+tag+" lvl="+level+" time="+castingTime+" sp="+mana+" gr="+grace+" dam="+damage+" skill="+skill+" path="+path+" face="+face+" name="+name+" msg="+message);
2519  }
2520  model.getSpellsManager().addSpell(tag, level, castingTime, mana, grace, damage, skill, path, face, name, message);
2521  }
2522  notifyPacketWatcherListeners("addspell", () -> "");
2523  }
2524 
2530  private void processAnim(@NotNull final ByteBuffer packet) throws UnknownCommandException {
2531  final int num = getInt2(packet);
2532  final int flags = getInt2(packet);
2533  final int[] faces = new int[packet.remaining()/2];
2534  if (faces.length <= 0) {
2535  throw new UnknownCommandException("no faces in anim command");
2536  }
2537  Arrays.setAll(faces, i -> getInt2(packet));
2538  if (packet.hasRemaining()) {
2539  throw new UnknownCommandException("excess data at end of anim command");
2540  }
2541  if (debugProtocol != null) {
2542  debugProtocol.debugProtocolWrite("recv anim num="+num+" flags="+flags+" faces="+Arrays.toString(faces));
2543  }
2544  if ((num&~0x1FFF) != 0) {
2545  throw new UnknownCommandException("invalid animation id "+num);
2546  }
2547  model.getAnimations().addAnimation(num&0x1FFF, faces);
2548  notifyPacketWatcherListeners("anim", () -> {
2549  final StringBuilder sb = new StringBuilder();
2550  sb.append(num);
2551  sb.append(' ');
2552  sb.append(flags);
2553  for (final int face : faces) {
2554  sb.append(' ');
2555  sb.append(face);
2556  }
2557  return sb.toString();
2558  });
2559  }
2560 
2566  private void processComc(@NotNull final ByteBuffer packet) throws UnknownCommandException {
2567  final int packetNo = getInt2(packet);
2568  final int time = getInt4(packet);
2569  if (packet.hasRemaining()) {
2570  throw new UnknownCommandException("excess data at end of comc command");
2571  }
2572  if (debugProtocol != null) {
2573  debugProtocol.debugProtocolWrite("recv comc no="+packetNo+" time="+time);
2574  }
2575  fireCommandComcReceived(packetNo, time);
2576  notifyPacketWatcherListeners("comc", () -> packetNo+" "+time);
2577  }
2578 
2584  private void processDelInv(@NotNull final ByteBuffer packet) throws UnknownCommandException {
2585  int tag = 0;
2586  do {
2587  tag = tag*10+parseDigit(packet.get());
2588  } while (packet.hasRemaining());
2589  if (packet.hasRemaining()) {
2590  throw new UnknownCommandException("excess data at end of delinv command");
2591  }
2592  if (debugProtocol != null) {
2593  debugProtocol.debugProtocolWrite("recv delinv tag="+tag);
2594  }
2595  fireDelinvReceived(tag);
2596  final int tag0 = tag;
2597  notifyPacketWatcherListeners("delinv", () -> Integer.toString(tag0));
2598  }
2599 
2605  private void processDelItem(@NotNull final ByteBuffer packet) throws UnknownCommandException {
2606  final int[] tags = new int[packet.remaining()/4];
2607  Arrays.setAll(tags, i -> getInt4(packet));
2608  if (packet.hasRemaining()) {
2609  throw new UnknownCommandException("excess data at end of delitem command");
2610  }
2611  if (debugProtocol != null) {
2612  debugProtocol.debugProtocolWrite("recv delitem tags="+Arrays.toString(tags));
2613  }
2614  fireDelitemReceived(tags);
2615  notifyPacketWatcherListeners("delitem", () -> {
2616  final StringBuilder sb = new StringBuilder();
2617  for (final int tag : tags) {
2618  sb.append(' ');
2619  sb.append(tag);
2620  }
2621  return sb.length() == 0 ? "" : sb.substring(1);
2622  });
2623  }
2624 
2630  private void processDelSpell(@NotNull final ByteBuffer packet) throws UnknownCommandException {
2631  final int tag = getInt4(packet);
2632  if (packet.hasRemaining()) {
2633  throw new UnknownCommandException("excess data at end of delspell command");
2634  }
2635  if (debugProtocol != null) {
2636  debugProtocol.debugProtocolWrite("recv delspell tag="+tag);
2637  }
2639  notifyPacketWatcherListeners("delspell", () -> Integer.toString(tag));
2640  }
2641 
2647  private void processDrawExtInfo(@NotNull final ByteBuffer packet) throws UnknownCommandException {
2648  int color = 0;
2649  do {
2650  color = color*10+parseDigit(packet.get());
2651  } while (packet.get(packet.position()) != ' ');
2652  packet.get();
2653 
2654  int type = 0;
2655  do {
2656  type = type*10+parseDigit(packet.get());
2657  } while (packet.get(packet.position()) != ' ');
2658  packet.get();
2659 
2660  int subtype = 0;
2661  do {
2662  subtype = subtype*10+parseDigit(packet.get());
2663  } while (packet.get(packet.position()) != ' ');
2664  packet.get();
2665 
2666  final String message = getString(packet, packet.remaining());
2667  if (debugProtocol != null) {
2668  debugProtocol.debugProtocolWrite("recv drawextinfo color="+color+" type="+type+"/"+subtype+" msg="+message);
2669  }
2670  drawextinfo(color, type, subtype, message);
2671  final int color0 = color;
2672  final int type0 = type;
2673  final int subtype0 = subtype;
2674  notifyPacketWatcherListeners("drawextinfo", () -> color0+" "+type0+" "+subtype0+" "+message);
2675  }
2676 
2682  private void processDrawInfo(@NotNull final ByteBuffer packet) throws UnknownCommandException {
2683  int color = 0;
2684  do {
2685  color = color*10+parseDigit(packet.get());
2686  } while (packet.get(packet.position()) != ' ');
2687  packet.get();
2688 
2689  final String message = getString(packet, packet.remaining());
2690  if (debugProtocol != null) {
2691  debugProtocol.debugProtocolWrite("recv drawinfo color="+color+" msg="+message);
2692  }
2693  drawInfo(message, color);
2694  final int color0 = color;
2695  notifyPacketWatcherListeners("drawinfo", () -> color0+" "+message);
2696  }
2697 
2702  private void processExtendedInfoSet(@NotNull final ByteBuffer packet) {
2703  do {
2704  final int startPos = packet.position();
2705  while (packet.hasRemaining() && packet.get(packet.position()) != ' ') {
2706  packet.get();
2707  }
2708  final String string = newString(packet, startPos, packet.position()-startPos);
2709  packet.get();
2710  if (debugProtocol != null) {
2711  debugProtocol.debugProtocolWrite("recv ExtendedInfoSet "+string);
2712  }
2713  // XXX: ExtendedInfoSet command not implemented
2714  } while (packet.hasRemaining());
2715  notifyPacketWatcherListeners("ExtendedInfoSet", () -> "");
2716  }
2717 
2722  private void processExtendedTextSet(@NotNull final ByteBuffer packet) {
2723  while (true) {
2724  final int startPos = packet.position();
2725  while (packet.hasRemaining() && packet.get(packet.position()) != ' ') {
2726  packet.get();
2727  }
2728  final String type = newString(packet, startPos, packet.position()-startPos);
2729  if (debugProtocol != null) {
2730  debugProtocol.debugProtocolWrite("recv ExtendedTextSet "+type);
2731  }
2732  // XXX: ExtendedTextSet command not implemented
2733  if (!packet.hasRemaining()) {
2734  break;
2735  }
2736  packet.get();
2737  }
2738  notifyPacketWatcherListeners("ExtendedTextSet", () -> "");
2739  }
2740 
2745  private void processFace2(@NotNull final ByteBuffer packet) {
2746  final int faceNum = getInt2(packet);
2747  final int faceSetNum = getInt1(packet);
2748  final int faceChecksum = getInt4(packet);
2749  final String faceName = getString(packet, packet.remaining()).intern();
2750  if (debugProtocol != null) {
2751  debugProtocol.debugProtocolWrite("recv face2 num="+faceNum+" set="+faceSetNum+" checksum="+faceChecksum+" name="+faceName);
2752  }
2753  fireFaceReceived(faceNum, faceSetNum, faceChecksum, faceName);
2754  notifyPacketWatcherListeners("face2", () -> faceNum+" "+faceSetNum+" "+faceChecksum+" "+faceName);
2755  }
2756 
2761  private void processFailure(@NotNull final ByteBuffer packet) {
2762  final String full = getString(packet, packet.remaining());
2763  final String command;
2764  final String message;
2765  final int idx = full.indexOf(' ');
2766  if (idx == -1) {
2767  command = full;
2768  message = "";
2769  } else {
2770  command = full.substring(0, idx);
2771  message = full.substring(idx+1);
2772  }
2773  if (debugProtocol != null) {
2774  debugProtocol.debugProtocolWrite("recv failure command="+command+" message="+message);
2775  }
2776  fireFailure(command, message);
2777  }
2778 
2784  private void processGoodbye(@NotNull final ByteBuffer packet) throws UnknownCommandException {
2785  if (packet.hasRemaining()) {
2786  throw new UnknownCommandException("excess data at end of goodbye command");
2787  }
2788  if (debugProtocol != null) {
2789  debugProtocol.debugProtocolWrite("recv goodbye");
2790  }
2791  // XXX: goodbye command not implemented
2792  notifyPacketWatcherListeners("goodbye", () -> "");
2793  }
2794 
2800  private void processImage2(@NotNull final ByteBuffer packet) throws UnknownCommandException {
2801  final int faceNum = getInt4(packet);
2802  final int faceSetNum = getInt1(packet);
2803  final int len = getInt4(packet);
2804  if (packet.remaining() != len) {
2805  throw new UnknownCommandException("excess data at end of image2 command");
2806  }
2807  final int faceDataPosition = packet.position();
2808  if (debugProtocol != null) {
2809  debugProtocol.debugProtocolWrite("recv image2 face="+faceNum+" set="+faceSetNum+" len="+len);
2810  }
2811  ((Buffer)packet).position(faceDataPosition);
2812  final byte[] data = new byte[packet.remaining()];
2813  packet.get(data);
2815  listener.faceReceived(faceNum, faceSetNum, data);
2816  }
2817  notifyPacketWatcherListeners("image2", () -> faceNum+" "+faceSetNum);
2818  }
2819 
2825  private void processItem2(@NotNull final ByteBuffer packet) throws UnknownCommandException {
2826  final int location = getInt4(packet);
2827  while (packet.hasRemaining()) {
2828  final int tag = getInt4(packet);
2829  final int flags = getInt4(packet);
2830  final int weight = getInt4(packet);
2831  final int faceNum = getInt4(packet);
2832  final int nameLength = getInt1(packet);
2833  final String[] names = getString(packet, nameLength).split("\0", 2);
2834  final String name = names[0].intern();
2835  final String namePl = names.length < 2 ? name : names[1].intern();
2836  final int anim = getInt2(packet);
2837  final int animSpeed = getInt1(packet);
2838  final int nrof = getInt4(packet);
2839  final int type = getInt2(packet);
2840  if (debugProtocol != null) {
2841  debugProtocol.debugProtocolWrite("recv item2 location="+location+" tag="+tag+" flags="+flags+" weight="+weight+" face="+faceNum+" name="+name+" name_pl="+namePl+" anim="+anim+" anim_speed="+animSpeed+" nrof="+nrof+" type="+type);
2842  }
2843  fireAddItemReceived(location, tag, flags, weight, faceNum, name, namePl, anim, animSpeed, nrof, type);
2844  }
2845  if (packet.hasRemaining()) {
2846  throw new UnknownCommandException("excess data at end of item2 command");
2847  }
2848  notifyPacketWatcherListeners("item2", () -> "");
2849  }
2850 
2856  private void processMagicMap(@NotNull final ByteBuffer packet) throws UnknownCommandException {
2857  final boolean widthSign = packet.get(packet.position()) == '-';
2858  if (widthSign) {
2859  packet.get();
2860  }
2861  int width = 0;
2862  do {
2863  width = width*10+parseDigit(packet.get());
2864  } while (packet.get(packet.position()) != ' ');
2865  packet.get();
2866  if (widthSign) {
2867  width = -width;
2868  }
2869 
2870  final boolean heightSign = packet.get(packet.position()) == '-';
2871  if (heightSign) {
2872  packet.get();
2873  }
2874  int height = 0;
2875  do {
2876  height = height*10+parseDigit(packet.get());
2877  } while (packet.get(packet.position()) != ' ');
2878  packet.get();
2879  if (heightSign) {
2880  height = -height;
2881  }
2882 
2883  final boolean pxSign = packet.get(packet.position()) == '-';
2884  if (pxSign) {
2885  packet.get();
2886  }
2887  int px = 0;
2888  do {
2889  px = px*10+parseDigit(packet.get());
2890  } while (packet.get(packet.position()) != ' ');
2891  packet.get();
2892  if (pxSign) {
2893  px = -px;
2894  }
2895 
2896  final boolean pySign = packet.get(packet.position()) == '-';
2897  if (pySign) {
2898  packet.get();
2899  }
2900  int py = 0;
2901  do {
2902  py = py*10+parseDigit(packet.get());
2903  } while (packet.get(packet.position()) != ' ');
2904  packet.get();
2905  if (pySign) {
2906  py = -py;
2907  }
2908 
2909  if (debugProtocol != null) {
2910  debugProtocol.debugProtocolWrite("recv magicmap size="+width+"x"+height+" player="+px+"/"+py+" len="+packet.remaining());
2911  }
2912  if (packet.remaining() != width*height) {
2913  throw new UnknownCommandException("invalid magicmap command");
2914  }
2915 
2916  final byte[][] data = new byte[height][width];
2917  for (int y = 0; y < height; y++) {
2918  packet.get(data[y]);
2919  }
2920  fireMagicMap(-px+(currentMapWidth-1)/2, -py+(currentMapHeight-1)/2, data);
2921  notifyPacketWatcherListeners("magicmap", () -> "");
2922  }
2923 
2929  private void processMap2(@NotNull final ByteBuffer packet) throws UnknownCommandException {
2930  if (debugProtocol != null) {
2931  debugProtocol.debugProtocolWrite("recv map2 begin");
2932  }
2933  int dx = 0;
2934  int dy = 0;
2935  synchronized (crossfireUpdateMapListener.mapBegin()) {
2936  if (newmap) {
2938  }
2939  while (packet.hasRemaining()) {
2940  final int coord = getInt2(packet);
2941  final int x = ((coord>>10)&0x3F)-Map2.COORD_OFFSET;
2942  final int y = ((coord>>4)&0x3F)-Map2.COORD_OFFSET;
2943  final int coordType = coord&0xF;
2944 
2945  switch (coordType) {
2946  case Map2.TYPE_COORDINATE:
2947  cmdMap2Coordinate(packet, x, y);
2948  break;
2949 
2950  case Map2.TYPE_SCROLL:
2951  if (debugProtocol != null) {
2952  debugProtocol.debugProtocolWrite("recv map2 "+x+"/"+y+" scroll");
2953  }
2954  assert crossfireUpdateMapListener != null;
2955  if (!newmap) {
2957  dx += x;
2958  dy += y;
2959  }
2960  break;
2961 
2962  default:
2963  if (debugProtocol != null) {
2964  debugProtocol.debugProtocolWrite("recv map2 "+x+"/"+y+" <invalid>");
2965  }
2966  throw new UnknownCommandException("map2 command contains unexpected coordinate type "+coordType);
2967  }
2968  }
2969  newmap = false;
2970  assert crossfireUpdateMapListener != null;
2972  }
2973  if (debugProtocol != null) {
2974  debugProtocol.debugProtocolWrite("recv map2 end");
2975  }
2977  listener.mapScroll(dx, dy);
2978  }
2979  notifyPacketWatcherListeners("map2", () -> "");
2980  }
2981 
2986  private void processMapExtended(@NotNull final ByteBuffer packet) {
2987  if (debugProtocol != null) {
2988  debugProtocol.debugProtocolWrite("recv mapextended");
2989  }
2990  // XXX: "MapExtended" command not yet implemented
2991  notifyPacketWatcherListeners("mapextended", () -> "");
2992  }
2993 
2998  private void processMusic(@NotNull final ByteBuffer packet) {
2999  final String music = getString(packet, packet.remaining());
3000  if (debugProtocol != null) {
3001  debugProtocol.debugProtocolWrite("recv music "+music);
3002  }
3003  fireMusicReceived(music);
3004  notifyPacketWatcherListeners("music", () -> music);
3005  }
3006 
3012  private void processNewMap(@NotNull final ByteBuffer packet) throws UnknownCommandException {
3013  if (packet.hasRemaining()) {
3014  throw new UnknownCommandException("excess data at end of newmap command");
3015  }
3016  if (debugProtocol != null) {
3017  debugProtocol.debugProtocolWrite("recv newmap");
3018  }
3019  newmap = true;
3020  fireNewMap();
3021  notifyPacketWatcherListeners("newmap", () -> "");
3022  }
3023 
3029  private void processPickup(@NotNull final ByteBuffer packet) throws UnknownCommandException {
3030  final int pickupOptions = getInt4(packet);
3031  if (packet.hasRemaining()) {
3032  throw new UnknownCommandException("excess data at end of pickup command");
3033  }
3034  if (debugProtocol != null) {
3035  debugProtocol.debugProtocolWrite("recv pickup options="+pickupOptions);
3036  }
3037  firePickupChanged(pickupOptions);
3038  notifyPacketWatcherListeners("pickup", () -> Integer.toString(pickupOptions));
3039  }
3040 
3046  private void processPlayer(@NotNull final ByteBuffer packet) throws UnknownCommandException {
3047  final int tag = getInt4(packet);
3048  final int weight = getInt4(packet);
3049  final int faceNum = getInt4(packet);
3050  final int nameLength = getInt1(packet);
3051  final String name = getString(packet, nameLength);
3052  if (packet.hasRemaining()) {
3053  throw new UnknownCommandException("excess data at end of player command");
3054  }
3055  if (debugProtocol != null) {
3056  debugProtocol.debugProtocolWrite("recv player tag="+tag+" weight="+weight+" face="+faceNum+" name="+name);
3057  }
3058  firePlayerReceived(tag, weight, faceNum, name);
3059  notifyPacketWatcherListeners("player", () -> tag+" "+weight+" "+faceNum+" "+name);
3060  }
3061 
3067  private void processQuery(@NotNull final ByteBuffer packet) throws UnknownCommandException {
3068  int flags = 0;
3069  do {
3070  flags = flags*10+parseDigit(packet.get());
3071  } while (packet.get(packet.position()) != ' ');
3072  packet.get();
3073 
3074  final String text = getString(packet, packet.remaining());
3075  if (debugProtocol != null) {
3076  debugProtocol.debugProtocolWrite("recv query flags="+flags+" text="+text);
3077  }
3078  // XXX: hack to process "What is your name?" prompt even before addme_success is received
3082  }
3083  fireCommandQueryReceived(text, flags);
3084  final int flags0 = flags;
3085  notifyPacketWatcherListeners("query", () -> flags0+" "+text);
3086  }
3087 
3093  private void processReplyInfo(@NotNull final ByteBuffer packet) throws UnknownCommandException {
3094  final int startPos = packet.position();
3095  while (packet.hasRemaining() && packet.get(packet.position()) != '\n' && packet.get(packet.position()) != ' ') {
3096  packet.get();
3097  }
3098  final String infoType = newString(packet, startPos, packet.position()-startPos);
3099  if (packet.hasRemaining()) {
3100  packet.get();
3101  }
3102  if (debugProtocol != null) {
3103  debugProtocol.debugProtocolWrite("recv replyinfo type="+infoType+" len="+packet.remaining());
3104  }
3105  try {
3106  cmdReplyinfo(infoType, packet);
3107  } catch (final IOException ex) {
3108  throw new UnknownCommandException("invalid replyinfo command: "+ex.getMessage(), ex);
3109  }
3110  notifyPacketWatcherListeners("replyinfo", () -> infoType); // XXX: misses arguments
3111  }
3112 
3118  private void processSetup(@NotNull final ByteBuffer packet) throws UnknownCommandException {
3119  final List<String> options = new ArrayList<>();
3120  while (packet.hasRemaining()) {
3121  while (packet.get(packet.position()) == ' ') {
3122  packet.get();
3123  }
3124  final int startPos = packet.position();
3125  while (packet.hasRemaining() && packet.get(packet.position()) != ' ') {
3126  packet.get();
3127  }
3128  options.add(newString(packet, startPos, packet.position()-startPos));
3129  if (packet.hasRemaining()) {
3130  packet.get();
3131  }
3132  }
3133  if (debugProtocol != null) {
3134  debugProtocol.debugProtocolWrite("recv setup "+options);
3135  }
3136  if (options.size()%2 != 0) {
3137  throw new UnknownCommandException("odd number of arguments in setup command");
3138  }
3139  for (int i = 0; i+1 < options.size(); i += 2) {
3140  final String option = options.get(i);
3141  final String value = options.get(i+1);
3142  switch (option) {
3143  case "spellmon":
3144  if (!value.equals("1")) {
3145  throw new UnknownCommandException("Error: the server is too old for this client since it does not support the spellmon=1 setup option.");
3146  }
3147  break;
3148 
3149  case "sound2":
3150  // ignore: if the server sends sound info it is processed
3151  break;
3152 
3153  case "exp64":
3154  // Ignored since it only enables additional/improved stat
3155  // commands but the old version is also supported.
3156  break;
3157 
3158  case "newmapcmd":
3159  if (!value.equals("1")) {
3160  throw new UnknownCommandException("Error: the server is too old for this client since it does not support the newmapcmd=1 setup option.");
3161  }
3162  break;
3163 
3164  case "facecache":
3165  if (!value.equals("1")) {
3166  throw new UnknownCommandException("the server is too old for this client since it does not support the facecache=1 setup option.");
3167  }
3168  break;
3169 
3170  case "extendedTextInfos":
3171  if (!value.equals("1")) {
3172  throw new UnknownCommandException("the server is too old for this client since it does not support the extendedTextInfos=1 setup option.");
3173  }
3174  break;
3175 
3176  case "itemcmd":
3177  if (!value.equals("2")) {
3178  throw new UnknownCommandException("the server is too old for this client since it does not support the itemcmd=2 setup option.");
3179  }
3180  break;
3181 
3182  case "mapsize":
3183  final String[] tmp = value.split("x", 2);
3184  if (tmp.length != 2) {
3185  throw new UnknownCommandException("the server returned 'setup mapsize "+value+"'.");
3186  }
3187  final int thisMapWidth;
3188  final int thisMapHeight;
3189  try {
3190  thisMapWidth = Integer.parseInt(tmp[0]);
3191  thisMapHeight = Integer.parseInt(tmp[1]);
3192  } catch (final NumberFormatException ignored) {
3193  throw new UnknownCommandException("the server returned 'setup mapsize "+value+"'.");
3194  }
3195  if (pendingMapWidth == 0 || pendingMapHeight == 0) {
3196  System.err.println("the server sent an unexpected 'setup mapsize "+value+"'.");
3197  } else if (pendingMapWidth == thisMapWidth && pendingMapHeight == thisMapHeight) {
3198  pendingMapWidth = 0;
3199  pendingMapHeight = 0;
3200  setCurrentMapSize(thisMapWidth, thisMapHeight);
3201  if (thisMapWidth != preferredMapWidth && thisMapHeight != preferredMapHeight) {
3203  }
3204  } else if (pendingMapWidth > thisMapWidth && pendingMapHeight > thisMapHeight) {
3205  pendingMapWidth = 0;
3206  pendingMapHeight = 0;
3207  negotiateMapSize(thisMapWidth, thisMapHeight);
3208  } else if (pendingMapWidth > thisMapWidth) {
3209  final int tmpMapHeight = pendingMapHeight;
3210  pendingMapWidth = 0;
3211  pendingMapHeight = 0;
3212  negotiateMapSize(thisMapWidth, tmpMapHeight);
3213  } else if (pendingMapHeight > thisMapHeight) {
3214  final int tmpMapWidth = pendingMapWidth;
3215  pendingMapWidth = 0;
3216  pendingMapHeight = 0;
3217  negotiateMapSize(tmpMapWidth, thisMapHeight);
3218  } else if (pendingMapWidth == thisMapWidth) {
3219  final int tmpMapHeight = pendingMapHeight+2;
3220  pendingMapWidth = 0;
3221  pendingMapHeight = 0;
3222  negotiateMapSize(thisMapWidth, tmpMapHeight);
3223  } else if (pendingMapHeight == thisMapHeight) {
3224  final int tmpMapWidth = pendingMapWidth+2;
3225  pendingMapWidth = 0;
3226  pendingMapHeight = 0;
3227  negotiateMapSize(tmpMapWidth, thisMapHeight);
3228  } else if (pendingMapWidth <= pendingMapHeight) {
3229  final int tmpMapWidth = pendingMapWidth+2;
3230  final int tmpMapHeight = pendingMapHeight;
3231  pendingMapWidth = 0;
3232  pendingMapHeight = 0;
3233  negotiateMapSize(tmpMapWidth, tmpMapHeight);
3234  } else {
3235  final int tmpMapWidth = pendingMapWidth;
3236  final int tmpMapHeight = pendingMapHeight+2;
3237  pendingMapWidth = 0;
3238  pendingMapHeight = 0;
3239  negotiateMapSize(tmpMapWidth, tmpMapHeight);
3240  }
3241  break;
3242 
3243  case "map2cmd":
3244  if (!value.equals("1")) {
3245  throw new UnknownCommandException("the server is too old for this client since it does not support the map2cmd=1 setup option.");
3246  }
3247  break;
3248 
3249  case "darkness":
3250  // do not care
3251  break;
3252 
3253  case "tick":
3254  if (!value.equals("1")) {
3255  throw new UnknownCommandException("the server is too old for this client since it does not support the tick=1 setup option.");
3256  }
3257  break;
3258 
3259  case "num_look_objects":
3261  break;
3262 
3263  case "faceset":
3264  // ignore: we do not care about the face set
3265  break;
3266 
3267  case "want_pickup":
3268  // ignore: we do not care whether this option has been ignored
3269  break;
3270 
3271  case "extended_stats":
3272  // ignore: we do not care whether this option has been ignored
3273  break;
3274 
3275  case "loginmethod":
3276  if (value.equals("FALSE")) {
3277  loginMethod = 0;
3278  continue;
3279  }
3280 
3281  final int method;
3282  try {
3283  method = Integer.parseInt(value);
3284  } catch (final NumberFormatException ignored) {
3285  throw new UnknownCommandException("the server returned 'setup loginmethod "+value+"'.");
3286  }
3287  if (method < 0 || method > 2) {
3288  throw new UnknownCommandException("the server returned 'setup loginmethod "+value+"'.");
3289  }
3290  loginMethod = method;
3291  break;
3292 
3293  case "notifications":
3294  // ignore: we do not care whether this option has been ignored
3295  break;
3296 
3297  default:
3298  System.err.println("Warning: ignoring unknown setup option from server: "+option+"="+value);
3299  break;
3300  }
3301  }
3302 
3303  if (options.size() != 2 || !options.get(0).equals("mapsize") && !options.get(0).equals("num_look_objects")) {
3306  sendQueuedRequestinfo("skill_info 1");
3307  sendQueuedRequestinfo("skill_extra 1");
3308  sendQueuedRequestinfo("exp_table");
3309  sendQueuedRequestinfo("knowledge_info");
3310  sendQueuedRequestinfo("image_info");
3311  sendQueuedRequestinfo("startingmap");
3312  sendQueuedRequestinfo("race_list");
3313  sendQueuedRequestinfo("class_list");
3314  sendQueuedRequestinfo("newcharinfo");
3315  }
3316  notifyPacketWatcherListeners("setup", () -> {
3317  final StringBuilder sb = new StringBuilder();
3318  for (final String option : options) {
3319  sb.append(' ');
3320  sb.append(option);
3321  }
3322  return sb.length() == 0 ? "" : sb.substring(1);
3323  });
3324  }
3325 
3331  private void processSmooth(@NotNull final ByteBuffer packet) throws UnknownCommandException {
3332  final int faceNo = getInt2(packet);
3333  final int smoothPic = getInt2(packet);
3334  if (packet.hasRemaining()) {
3335  throw new UnknownCommandException("excess data at end of smooth command");
3336  }
3337  if (debugProtocol != null) {
3338  debugProtocol.debugProtocolWrite("recv smooth face="+faceNo+" smooth_pic="+smoothPic);
3339  }
3340  model.getSmoothFaces().updateSmoothFace(faceNo, smoothPic);
3341  notifyPacketWatcherListeners("smooth", () -> faceNo+" "+smoothPic);
3342  }
3343 
3349  private void processSound(@NotNull final ByteBuffer packet) throws UnknownCommandException {
3350  final int x = packet.get();
3351  final int y = packet.get();
3352  final int num = getInt2(packet);
3353  final int type = getInt1(packet);
3354  if (packet.hasRemaining()) {
3355  throw new UnknownCommandException("excess data at end of sound command");
3356  }
3357  if (debugProtocol != null) {
3358  debugProtocol.debugProtocolWrite("recv sound pos="+x+"/"+y+" num="+num+" type="+type);
3359  }
3360  fireCommandSoundReceived(x, y, num, type);
3361  notifyPacketWatcherListeners("sound", () -> x+" "+y+" "+num+" "+type);
3362  }
3363 
3369  private void processSound2(@NotNull final ByteBuffer packet) throws UnknownCommandException {
3370  final int x = packet.get();
3371  final int y = packet.get();
3372  final int dir = packet.get();
3373  final int volume = getInt1(packet);
3374  final int type = getInt1(packet);
3375  final int actionLength = getInt1(packet);
3376  final String action = getString(packet, actionLength);
3377  final int nameLength = getInt1(packet);
3378  final String name = getString(packet, nameLength);
3379  if (packet.hasRemaining()) {
3380  throw new UnknownCommandException("excess data at end of sound2 command");
3381  }
3382  if (debugProtocol != null) {
3383  debugProtocol.debugProtocolWrite("recv sound2 pos="+x+"/"+y+" dir="+dir+" volume="+volume+" type="+type+" action="+action+" name="+name);
3384  }
3385  fireCommandSound2Received(x, y, dir, volume, type, action, name);
3386  notifyPacketWatcherListeners("sound2", () -> x+" "+y+" "+dir+" "+volume+" "+type+" "+action+" "+name);
3387  }
3388 
3394  private void processStats(@NotNull final ByteBuffer packet) throws UnknownCommandException {
3395  while (packet.hasRemaining()) {
3396  final int stat = getInt1(packet);
3397  switch (stat) {
3398  case Stats.CS_STAT_HP:
3399  case Stats.CS_STAT_MAXHP:
3400  case Stats.CS_STAT_SP:
3401  case Stats.CS_STAT_MAXSP:
3402  case Stats.CS_STAT_STR:
3403  case Stats.CS_STAT_INT:
3404  case Stats.CS_STAT_WIS:
3405  case Stats.CS_STAT_DEX:
3406  case Stats.CS_STAT_CON:
3407  case Stats.CS_STAT_CHA:
3408  case Stats.CS_STAT_LEVEL:
3409  case Stats.CS_STAT_WC:
3410  case Stats.CS_STAT_AC:
3411  case Stats.CS_STAT_DAM:
3412  case Stats.CS_STAT_ARMOUR:
3413  case Stats.CS_STAT_FOOD:
3414  case Stats.CS_STAT_POW:
3415  case Stats.CS_STAT_GRACE:
3416  case Stats.CS_STAT_MAXGRACE:
3417  case Stats.CS_STAT_FLAGS:
3418  case Stats.CS_STAT_RACE_STR:
3419  case Stats.CS_STAT_RACE_INT:
3420  case Stats.CS_STAT_RACE_WIS:
3421  case Stats.CS_STAT_RACE_DEX:
3422  case Stats.CS_STAT_RACE_CON:
3423  case Stats.CS_STAT_RACE_CHA:
3424  case Stats.CS_STAT_RACE_POW:
3425  case Stats.CS_STAT_BASE_STR:
3426  case Stats.CS_STAT_BASE_INT:
3427  case Stats.CS_STAT_BASE_WIS:
3428  case Stats.CS_STAT_BASE_DEX:
3429  case Stats.CS_STAT_BASE_CON:
3430  case Stats.CS_STAT_BASE_CHA:
3431  case Stats.CS_STAT_BASE_POW:
3439  case Stats.CS_STAT_GOLEM_HP:
3442  final short int2Param = (short)getInt2(packet);
3443  if (debugProtocol != null) {
3444  debugProtocol.debugProtocolWrite("recv stats stat="+stat+" int2="+int2Param+"="+(int2Param&0xFFFF));
3445  }
3446  model.getStats().setStatInt2(stat, int2Param);
3447  notifyPacketWatcherListeners("stats", () -> StatUtils.getStatNames(stat)+" "+int2Param);
3448  break;
3449 
3450  case Stats.CS_STAT_EXP:
3451  case Stats.CS_STAT_SPEED:
3452  case Stats.CS_STAT_WEAP_SP:
3458  case Stats.CS_STAT_OVERLOAD:
3459  final int int4Param = getInt4(packet);
3460  if (debugProtocol != null) {
3461  debugProtocol.debugProtocolWrite("recv stats stat="+stat+" int4="+int4Param);
3462  }
3463  model.getStats().setStatInt4(stat, int4Param);
3464  notifyPacketWatcherListeners("stats", () -> StatUtils.getStatNames(stat)+" "+int4Param);
3465  break;
3466 
3467  case Stats.CS_STAT_EXP64:
3468  final long int8Param = getInt8(packet);
3469  if (debugProtocol != null) {
3470  debugProtocol.debugProtocolWrite("recv stats stat="+stat+" int8="+int8Param);
3471  }
3472  model.getStats().setStatInt8(stat, int8Param);
3473  notifyPacketWatcherListeners("stats", () -> StatUtils.getStatNames(stat)+" "+int8Param);
3474  break;
3475 
3476  case Stats.CS_STAT_RANGE:
3477  case Stats.CS_STAT_TITLE:
3478  case Stats.CS_STAT_GOD_NAME:
3479  final int length = getInt1(packet);
3480  final String strParam = getString(packet, length);
3481  if (debugProtocol != null) {
3482  debugProtocol.debugProtocolWrite("recv stats stat="+stat+" str="+strParam);
3483  }
3484  model.getStats().setStatString(stat, strParam);
3485  notifyPacketWatcherListeners("stats", () -> StatUtils.getStatNames(stat)+" "+strParam);
3486  break;
3487 
3488  default:
3490  final short int2Param2 = (short)getInt2(packet);
3491  if (debugProtocol != null) {
3492  debugProtocol.debugProtocolWrite("recv stats stat="+stat+" int2="+int2Param2);
3493  }
3494  model.getStats().setStatInt2(stat, int2Param2);
3495  notifyPacketWatcherListeners("stats", () -> StatUtils.getStatNames(stat)+" "+int2Param2);
3496  } else if (Stats.CS_STAT_SKILLINFO <= stat && stat < Stats.CS_STAT_SKILLINFO+Stats.CS_NUM_SKILLS) {
3497  final int level = getInt1(packet);
3498  final long experience = getInt8(packet);
3499  if (debugProtocol != null) {
3500  debugProtocol.debugProtocolWrite("recv stats stat="+stat+" level="+level+" experience="+experience);
3501  }
3502  model.getStats().setStatSkill(stat, level, experience);
3503  notifyPacketWatcherListeners("stats", () -> StatUtils.getStatNames(stat)+" "+level+" "+experience);
3504  } else {
3505  if (debugProtocol != null) {
3506  debugProtocol.debugProtocolWrite("recv stats stat="+stat+" <unknown parameter>");
3507  }
3508  throw new UnknownCommandException("unknown stat value: "+stat);
3509  }
3510  break;
3511  }
3512  }
3513  }
3514 
3520  private void processTick(@NotNull final ByteBuffer packet) throws UnknownCommandException {
3521  final int tickNo = getInt4(packet);
3522  if (packet.hasRemaining()) {
3523  throw new UnknownCommandException("excess data at end of tick command");
3524  }
3525  if (debugProtocol != null) {
3526  debugProtocol.debugProtocolWrite("recv tick "+tickNo);
3527  }
3528  fireTick(tickNo);
3529  notifyPacketWatcherListeners("tick", () -> Integer.toString(tickNo));
3530  }
3531 
3537  private void processUpdItem(@NotNull final ByteBuffer packet) throws UnknownCommandException {
3538  final int flags = getInt1(packet);
3539  final int tag = getInt4(packet);
3540  final int valLocation = (flags&UpdItem.UPD_LOCATION) == 0 ? 0 : getInt4(packet);
3541  final int valFlags = (flags&UpdItem.UPD_FLAGS) == 0 ? 0 : getInt4(packet);
3542  final int valWeight = (flags&UpdItem.UPD_WEIGHT) == 0 ? 0 : getInt4(packet);
3543  final int valFaceNum = (flags&UpdItem.UPD_FACE) == 0 ? 0 : getInt4(packet);
3544  final String valName;
3545  final String valNamePl;
3546  if ((flags&UpdItem.UPD_NAME) == 0) {
3547  valName = "";
3548  valNamePl = "";
3549  } else {
3550  final int nameLength = getInt1(packet);
3551  int namePlIndex = 0;
3552  while (namePlIndex < nameLength && packet.get(packet.position()+namePlIndex) != 0) {
3553  namePlIndex++;
3554  }
3555  valName = newString(packet, packet.position(), namePlIndex);
3556  valNamePl = namePlIndex+1 < nameLength ? newString(packet, packet.position()+namePlIndex+1, nameLength-(namePlIndex+1)) : valName;
3557  ((Buffer)packet).position(packet.position()+nameLength);
3558  }
3559  final int valAnim = (flags&UpdItem.UPD_ANIM) == 0 ? 0 : getInt2(packet);
3560  final int valAnimSpeed = (flags&UpdItem.UPD_ANIMSPEED) == 0 ? 0 : getInt1(packet);
3561  final int valNrof = (flags&UpdItem.UPD_NROF) == 0 ? 0 : getInt4(packet);
3562  if (packet.hasRemaining()) {
3563  throw new UnknownCommandException("excess data at end of upditem command");
3564  }
3565  if (debugProtocol != null) {
3566  debugProtocol.debugProtocolWrite("recv upditem flags="+flags+" tag="+tag+" loc="+valLocation+" flags="+valFlags+" weight="+valWeight+" face="+valFaceNum+" name="+valName+" name_pl="+valNamePl+" anim="+valAnim+" anim_speed="+valAnimSpeed+" nrof="+valNrof);
3567  }
3568  fireUpditemReceived(flags, tag, valLocation, valFlags, valWeight, valFaceNum, valName, valNamePl, valAnim, valAnimSpeed, valNrof);
3569  notifyPacketWatcherListeners("upditem", () -> flags+" "+tag+" "+valLocation+" "+valFlags+" "+valWeight+" "+valFaceNum+" "+valName+" "+valNamePl+" "+valAnim+" "+valAnimSpeed+" "+valNrof);
3570  }
3571 
3576  private void processUpdQuest(@NotNull final ByteBuffer packet) {
3577  final int code = getInt4(packet);
3578  final int end = getInt1(packet);
3579  final int stepLength = getInt2(packet);
3580  final String step = stepLength > 0 ? getString(packet, stepLength) : "";
3581 
3582  if (debugProtocol != null) {
3583  debugProtocol.debugProtocolWrite("recv updquest code="+code+" end="+end+" description="+step);
3584  }
3585  model.getQuestsManager().updateQuest(code, end == 1, step);
3586  notifyPacketWatcherListeners("updquest", () -> code+" "+end+" "+step);
3587  }
3588 
3594  private void processUpdSpell(@NotNull final ByteBuffer packet) throws UnknownCommandException {
3595  final int flags = getInt1(packet);
3596  final int tag = getInt4(packet);
3597  final int mana = (flags&SpellsManager.UPD_SP_MANA) == 0 ? 0 : getInt2(packet);
3598  final int grace = (flags&SpellsManager.UPD_SP_GRACE) == 0 ? 0 : getInt2(packet);
3599  final int damage = (flags&SpellsManager.UPD_SP_DAMAGE) == 0 ? 0 : getInt2(packet);
3600  if (packet.hasRemaining()) {
3601  throw new UnknownCommandException("excess data at end of updspell command");
3602  }
3603  if (debugProtocol != null) {
3604  debugProtocol.debugProtocolWrite("recv updspell flags="+flags+" tag="+tag+" sp="+mana+" gr="+grace+" dam="+damage);
3605  }
3606  model.getSpellsManager().updateSpell(flags, tag, mana, grace, damage);
3607  notifyPacketWatcherListeners("updspell", () -> flags+" "+tag+" "+mana+" "+grace+" "+damage);
3608  }
3609 
3615  private void processVersion(@NotNull final ByteBuffer packet) throws UnknownCommandException {
3616  int csval = 0;
3617  do {
3618  csval = csval*10+parseDigit(packet.get());
3619  } while (packet.get(packet.position()) != ' ');
3620  packet.get();
3621 
3622  int scval = 0;
3623  do {
3624  scval = scval*10+parseDigit(packet.get());
3625  } while (packet.get(packet.position()) != ' ');
3626  packet.get();
3627 
3628  final String vinfo = getString(packet, packet.remaining());
3629  if (debugProtocol != null) {
3630  debugProtocol.debugProtocolWrite("recv version cs="+csval+" sc="+scval+" info="+vinfo);
3631  }
3633  sendSetup("want_pickup 1", "faceset 0", "sound2 3", "exp64 1", "map2cmd 1", "darkness 1", "newmapcmd 1", "facecache 1", "extendedTextInfos 1", "itemcmd 2", "spellmon 1", "tick 1", "extended_stats 1", "loginmethod 2", "notifications 3");
3634  model.getStats().setSimpleWeaponSpeed(scval >= 1029);
3635 
3636  final int csval0 = csval;
3637  final int scval0 = scval;
3638  notifyPacketWatcherListeners("version", () -> csval0+" "+scval0);
3639  }
3640 
3641  @Override
3642  public void sendAccountLogin(@NotNull final String login, @NotNull final String password) {
3643  clearFailure();
3644  if (debugProtocol != null) {
3645  debugProtocol.debugProtocolWrite("send accountlogin "+login);
3646  }
3647  accountName = login;
3648  synchronized (writeBuffer) {
3649  ((Buffer)byteBuffer).clear();
3650  //noinspection AccessToStaticFieldLockedOnInstance
3652  final byte[] loginBytes = login.getBytes(UTF8);
3653  byteBuffer.put((byte)loginBytes.length);
3654  byteBuffer.put(loginBytes);
3655  final byte[] passwordBytes = password.getBytes(UTF8);
3656  byteBuffer.put((byte)passwordBytes.length);
3657  byteBuffer.put(passwordBytes);
3658  defaultServerConnection.writePacket(writeBuffer, byteBuffer.position(), () -> "accountlogin "+login);
3659  }
3660 
3661  }
3662 
3663  @Override
3664  public void sendAddme() {
3665  if (debugProtocol != null) {
3666  debugProtocol.debugProtocolWrite("send addme");
3667  }
3669  }
3670 
3671  @Override
3672  public void sendApply(final int tag) {
3673  if (debugProtocol != null) {
3674  debugProtocol.debugProtocolWrite("send apply tag="+tag);
3675  }
3676  synchronized (writeBuffer) {
3677  ((Buffer)byteBuffer).clear();
3678  //noinspection AccessToStaticFieldLockedOnInstance
3679  byteBuffer.put(APPLY_PREFIX);
3680  putDecimal(tag);
3681  defaultServerConnection.writePacket(writeBuffer, byteBuffer.position(), () -> "apply "+tag);
3682  }
3683  }
3684 
3685  @Override
3686  public void sendAskface(final int faceNum) {
3687  if (debugProtocol != null) {
3688  debugProtocol.debugProtocolWrite("send askface face="+faceNum);
3689  }
3690  synchronized (writeBuffer) {
3691  ((Buffer)byteBuffer).clear();
3692  //noinspection AccessToStaticFieldLockedOnInstance
3694  putDecimal(faceNum);
3695  defaultServerConnection.writePacket(writeBuffer, byteBuffer.position(), () -> "askface "+faceNum);
3696  }
3697  }
3698 
3699  @Override
3700  public void addFaceReceivedListener(@NotNull final AskfaceFaceQueueListener listener) {
3701  askfaceFaceQueueListeners.add(listener);
3702  }
3703 
3704  @Override
3705  public void sendExamine(final int tag) {
3706  if (debugProtocol != null) {
3707  debugProtocol.debugProtocolWrite("send examine tag="+tag);
3708  }
3709  synchronized (writeBuffer) {
3710  ((Buffer)byteBuffer).clear();
3711  //noinspection AccessToStaticFieldLockedOnInstance
3713  putDecimal(tag);
3714  defaultServerConnection.writePacket(writeBuffer, byteBuffer.position(), () -> "examine "+tag);
3715  }
3716  }
3717 
3718  @Override
3719  public void sendLock(final boolean val, final int tag) {
3720  if (debugProtocol != null) {
3721  debugProtocol.debugProtocolWrite("send lock tag="+tag+" val="+val);
3722  }
3723  synchronized (writeBuffer) {
3724  ((Buffer)byteBuffer).clear();
3725  //noinspection AccessToStaticFieldLockedOnInstance
3726  byteBuffer.put(LOCK_PREFIX);
3727  byteBuffer.put((byte)(val ? 1 : 0));
3728  byteBuffer.putInt(tag);
3729  defaultServerConnection.writePacket(writeBuffer, byteBuffer.position(), () -> "lock "+(val ? 1 : 0)+" "+tag);
3730  }
3731  }
3732 
3733  @Override
3734  public void sendLookat(final int dx, final int dy) {
3735  if (debugProtocol != null) {
3736  debugProtocol.debugProtocolWrite("send lookat pos="+dx+"/"+dy);
3737  }
3738  synchronized (writeBuffer) {
3739  ((Buffer)byteBuffer).clear();
3740  //noinspection AccessToStaticFieldLockedOnInstance
3742  putDecimal(dx);
3743  byteBuffer.put((byte)' ');
3744  putDecimal(dy);
3745  defaultServerConnection.writePacket(writeBuffer, byteBuffer.position(), () -> "lookat "+dx+" "+dy);
3746  }
3747  }
3748 
3749  @Override
3750  public void sendMark(final int tag) {
3751  if (debugProtocol != null) {
3752  debugProtocol.debugProtocolWrite("send mark tag="+tag);
3753  }
3754  synchronized (writeBuffer) {
3755  ((Buffer)byteBuffer).clear();
3756  //noinspection AccessToStaticFieldLockedOnInstance
3757  byteBuffer.put(MARK_PREFIX);
3758  byteBuffer.putInt(tag);
3759  defaultServerConnection.writePacket(writeBuffer, byteBuffer.position(), () -> "mark "+tag);
3760  }
3761  fireMarkSent(tag);
3762  }
3763 
3764  @Override
3765  public void sendMove(final int to, final int tag, final int nrof) {
3766  if (debugProtocol != null) {
3767  debugProtocol.debugProtocolWrite("send move tag="+tag+" to="+to+" nrof="+nrof);
3768  }
3769  synchronized (writeBuffer) {
3770  ((Buffer)byteBuffer).clear();
3771  //noinspection AccessToStaticFieldLockedOnInstance
3772  byteBuffer.put(MOVE_PREFIX);
3773  putDecimal(to);
3774  byteBuffer.put((byte)' ');
3775  putDecimal(tag);
3776  byteBuffer.put((byte)' ');
3777  putDecimal(nrof);
3778  defaultServerConnection.writePacket(writeBuffer, byteBuffer.position(), () -> "move "+to+" "+tag+" "+nrof);
3779  }
3780  }
3781 
3782  @Override
3783  public int sendNcom(final int repeat, @NotNull final String command) {
3784  if (debugProtocol != null) {
3785  debugProtocol.debugProtocolWrite("send ncom no="+packet+" repeat="+repeat+" cmd="+command);
3786  }
3787  final int thisPacket;
3788  synchronized (writeBuffer) {
3789  thisPacket = packet++&0x00FF;
3790  ((Buffer)byteBuffer).clear();
3791  //noinspection AccessToStaticFieldLockedOnInstance
3792  byteBuffer.put(NCOM_PREFIX);
3793  byteBuffer.putShort((short)thisPacket);
3794  byteBuffer.putInt(repeat);
3795  byteBuffer.put(command.getBytes(UTF8));
3796  defaultServerConnection.writePacket(writeBuffer, byteBuffer.position(), () -> "monitor "+repeat+" 0 "+command);
3797  }
3798  return thisPacket;
3799  }
3800 
3801  @Override
3802  public void sendRawString(@NotNull final String command) {
3803  if (debugProtocol != null) {
3804  debugProtocol.debugProtocolWrite("send raw string="+command);
3805  }
3806  synchronized (writeBuffer) {
3807  ((Buffer)byteBuffer).clear();
3808  //noinspection AccessToStaticFieldLockedOnInstance
3809  byteBuffer.put(command.getBytes(UTF8));
3810  defaultServerConnection.writePacket(writeBuffer, byteBuffer.position(), () -> "raw "+command);
3811  }
3812  }
3813 
3814  @Override
3815  public void sendReply(@NotNull final String text) {
3816  if (debugProtocol != null) {
3817  debugProtocol.debugProtocolWrite("send reply text="+text);
3818  }
3819  synchronized (writeBuffer) {
3820  ((Buffer)byteBuffer).clear();
3821  //noinspection AccessToStaticFieldLockedOnInstance
3822  byteBuffer.put(REPLY_PREFIX);
3823  byteBuffer.put(text.getBytes(UTF8));
3824  defaultServerConnection.writePacket(writeBuffer, byteBuffer.position(), () -> "reply "+text);
3825  }
3826  fireReplySent();
3827  }
3828 
3829  @Override
3830  public void sendRequestinfo(@NotNull final String infoType) {
3831  if (debugProtocol != null) {
3832  debugProtocol.debugProtocolWrite("send requestinfo type="+infoType);
3833  }
3834  synchronized (writeBuffer) {
3835  ((Buffer)byteBuffer).clear();
3836  //noinspection AccessToStaticFieldLockedOnInstance
3838  byteBuffer.put(infoType.getBytes(UTF8));
3839  defaultServerConnection.writePacket(writeBuffer, byteBuffer.position(), () -> "requestinfo "+infoType);
3840  sendingRequestInfo.addLast(infoType);
3841  }
3842  }
3843 
3844  @Override
3845  public void sendSetup(@NotNull final String... options) {
3846  if (debugProtocol != null) {
3847  debugProtocol.debugProtocolWrite("send setup options="+Arrays.toString(options));
3848  }
3849  synchronized (writeBuffer) {
3850  ((Buffer)byteBuffer).clear();
3851  //noinspection AccessToStaticFieldLockedOnInstance
3852  byteBuffer.put(SETUP_PREFIX);
3853  if (options.length <= 0) {
3854  byteBuffer.put((byte)' ');
3855  } else {
3856  for (String option : options) {
3857  byteBuffer.put((byte)' ');
3858  byteBuffer.put(option.getBytes(UTF8));
3859  }
3860  }
3862  final StringBuilder sb = new StringBuilder("setup");
3863  for (String option : options) {
3864  sb.append(" ").append(option);
3865  }
3866  return sb.toString();
3867  });
3868  }
3869  }
3870 
3871  @Override
3872  public void sendToggleextendedtext(@NotNull final int... types) {
3873  if (types.length <= 0) {
3874  return;
3875  }
3876 
3877  if (debugProtocol != null) {
3878  debugProtocol.debugProtocolWrite("send toggleextendedtext types="+Arrays.toString(types));
3879  }
3880  synchronized (writeBuffer) {
3881  ((Buffer)byteBuffer).clear();
3882  //noinspection AccessToStaticFieldLockedOnInstance
3884  for (int type : types) {
3885  byteBuffer.put((byte)' ');
3886  putDecimal(type);
3887  }
3889  final StringBuilder sb = new StringBuilder("toggleextendedtext");
3890  for (int type : types) {
3891  sb.append(" ").append(type);
3892  }
3893  return sb.toString();
3894  });
3895  }
3896  }
3897 
3898  @Override
3899  public void sendVersion(final int csval, final int scval, @NotNull final String vinfo) {
3900  if (debugProtocol != null) {
3901  debugProtocol.debugProtocolWrite("send version cs="+csval+" sc="+scval+" info="+vinfo);
3902  }
3903  synchronized (writeBuffer) {
3904  ((Buffer)byteBuffer).clear();
3905  //noinspection AccessToStaticFieldLockedOnInstance
3906  byteBuffer.put(VERSION_PREFIX);
3907  putDecimal(csval);
3908  byteBuffer.put((byte)' ');
3909  putDecimal(scval);
3910  byteBuffer.put((byte)' ');
3911  byteBuffer.put(vinfo.getBytes(UTF8));
3912  defaultServerConnection.writePacket(writeBuffer, byteBuffer.position(), () -> "version "+csval+" "+scval+" "+vinfo);
3913  }
3914  }
3915 
3921  private void putDecimal(final int value) {
3922  if (value == 0) {
3923  byteBuffer.put((byte)'0');
3924  } else {
3925  byteBuffer.put(Integer.toString(value).getBytes(StandardCharsets.ISO_8859_1));
3926  }
3927  }
3928 
3935  private static int parseDigit(final byte ch) throws UnknownCommandException {
3936  final int digit = ch-'0';
3937  if (digit < 0 || digit > 9) {
3938  throw new UnknownCommandException("not a digit: "+ch);
3939  }
3940  return digit;
3941  }
3942 
3943  @Override
3944  public void setPreferredMapSize(final int preferredMapWidth, final int preferredMapHeight) {
3945  final int preferredMapWidth2 = Math.max(1, preferredMapWidth|1);
3946  final int preferredMapHeight2 = Math.max(1, preferredMapHeight|1);
3947  if (this.preferredMapWidth == preferredMapWidth2 && this.preferredMapHeight == preferredMapHeight2) {
3948  return;
3949  }
3950 
3951  this.preferredMapWidth = preferredMapWidth2;
3952  this.preferredMapHeight = preferredMapHeight2;
3953 
3954  negotiateMapSize(this.preferredMapWidth, this.preferredMapHeight);
3955  }
3956 
3962  private void setCurrentMapSize(final int currentMapWidth, final int currentMapHeight) {
3963  if (this.currentMapWidth == currentMapWidth && this.currentMapHeight == currentMapHeight) {
3964  return;
3965  }
3966 
3967  this.currentMapWidth = currentMapWidth;
3968  this.currentMapHeight = currentMapHeight;
3969  fireNewMap();
3970  }
3971 
3975  private void fireNewMap() {
3976  crossfireUpdateMapListener.newMap(currentMapWidth, currentMapHeight);
3977  }
3978 
3979  @Override
3980  public void setPreferredNumLookObjects(final int preferredNumLookObjects) {
3981  numLookObjects.setPreferredNumLookObjects(preferredNumLookObjects);
3982  }
3983 
3984  @Nullable
3985  @Override
3986  public String getAccountName() {
3987  return accountName;
3988  }
3989 
3990  @Override
3991  public void connect(@NotNull final String hostname, final int port) {
3992  accountName = null;
3993  clearFailure();
3994  clientSocketState = ClientSocketState.CONNECTING;
3996  defaultServerConnection.connect(hostname, port);
3997  }
3998 
3999  @Override
4000  public void disconnect(@NotNull final String reason) {
4001  defaultServerConnection.disconnect(reason);
4002  }
4003 
4004  @Override
4005  public void addClientSocketListener(@NotNull final ClientSocketListener clientSocketListener) {
4006  defaultServerConnection.addClientSocketListener(clientSocketListener);
4007  }
4008 
4009  @Override
4010  public void removeClientSocketListener(@NotNull final ClientSocketListener clientSocketListener) {
4011  defaultServerConnection.removeClientSocketListener(clientSocketListener);
4012  }
4013 
4019  private void setClientSocketState(@NotNull final ClientSocketState prevState, @NotNull final ClientSocketState nextState) {
4020  if (debugProtocol != null) {
4021  debugProtocol.debugProtocolWrite("connection state: "+nextState);
4022  }
4023  if (clientSocketState != prevState) {
4024  System.err.println("Warning: connection state is "+clientSocketState+" when switching to state "+nextState+", expecting state "+prevState);
4025  }
4026  clientSocketState = nextState;
4027  final String param;
4028  if (nextState == ClientSocketState.REQUESTINFO) {
4029  synchronized (writeBuffer) {
4030  param = sendingRequestInfo.isEmpty() ? "" : sendingRequestInfo.getFirst();
4031  }
4032  } else {
4033  param = "";
4034  }
4035  model.getGuiStateManager().setClientSocketState(clientSocketState, param);
4036  numLookObjects.setClientSocketState(clientSocketState);
4037  }
4038 
4039  @Override
4040  public void sendAccountPlay(@NotNull final String name) {
4041  clearFailure();
4042  if (debugProtocol != null) {
4043  debugProtocol.debugProtocolWrite("send accountplay "+name);
4044  }
4045  synchronized (writeBuffer) {
4046  ((Buffer)byteBuffer).clear();
4047  //noinspection AccessToStaticFieldLockedOnInstance
4048  byteBuffer.put(ACCOUNT_PLAY_PREFIX);
4049  byteBuffer.put(name.getBytes(UTF8));
4050  defaultServerConnection.writePacket(writeBuffer, byteBuffer.position(), () -> "accountplay "+name);
4051  }
4052 
4053  final String tmpAccountName = accountName;
4054  if (tmpAccountName != null) {
4055  fireSelectCharacter(tmpAccountName, name);
4056  }
4057  }
4058 
4059  @Override
4060  public void sendAccountLink(final int force, @NotNull final String login, @NotNull final String password) {
4061  clearFailure();
4062  if (debugProtocol != null) {
4063  debugProtocol.debugProtocolWrite("send accountaddplayer "+login);
4064  }
4065  synchronized (writeBuffer) {
4066  ((Buffer)byteBuffer).clear();
4067  //noinspection AccessToStaticFieldLockedOnInstance
4068  byteBuffer.put(ACCOUNT_ADD_PLAYER_PREFIX);
4069  byteBuffer.put((byte)force);
4070  final byte[] loginBytes = login.getBytes(UTF8);
4071  byteBuffer.put((byte)loginBytes.length);
4072  byteBuffer.put(loginBytes);
4073  final byte[] passwordBytes = password.getBytes(UTF8);
4074  byteBuffer.put((byte)passwordBytes.length);
4075  byteBuffer.put(passwordBytes);
4076  defaultServerConnection.writePacket(writeBuffer, byteBuffer.position(), () -> "accountaddplayer "+login);
4077  }
4078  }
4079 
4080  @Override
4081  public void sendAccountCreate(@NotNull final String login, @NotNull final String password) {
4082  clearFailure();
4083  if (debugProtocol != null) {
4084  debugProtocol.debugProtocolWrite("send accountnew "+login);
4085  }
4086  accountName = login;
4087  synchronized (writeBuffer) {
4088  ((Buffer)byteBuffer).clear();
4089  //noinspection AccessToStaticFieldLockedOnInstance
4090  byteBuffer.put(ACCOUNT_NEW_PREFIX);
4091  final byte[] loginBytes = login.getBytes(UTF8);
4092  byteBuffer.put((byte)loginBytes.length);
4093  byteBuffer.put(loginBytes);
4094  final byte[] passwordBytes = password.getBytes(UTF8);
4095  byteBuffer.put((byte)passwordBytes.length);
4096  byteBuffer.put(passwordBytes);
4097  defaultServerConnection.writePacket(writeBuffer, byteBuffer.position(), () -> "accountnew "+login);
4098  }
4099  }
4100 
4101  @Override
4102  public void sendAccountCharacterCreate(@NotNull final String login, @NotNull final String password, @NotNull final Collection<String> attributes) {
4103  clearFailure();
4104  if (debugProtocol != null) {
4105  debugProtocol.debugProtocolWrite("send createplayer "+login+" "+attributes);
4106  }
4107  synchronized (writeBuffer) {
4108  ((Buffer)byteBuffer).clear();
4109  //noinspection AccessToStaticFieldLockedOnInstance
4110  byteBuffer.put(CREATE_PLAYER_PREFIX);
4111  final byte[] loginBytes = login.getBytes(UTF8);
4112  byteBuffer.put((byte)loginBytes.length);
4113  byteBuffer.put(loginBytes);
4114  final byte[] passwordBytes = password.getBytes(UTF8);
4115  byteBuffer.put((byte)passwordBytes.length);
4116  byteBuffer.put(passwordBytes);
4117  if (loginMethod >= 2) {
4118  for (final String attribute : attributes) {
4119  final byte[] attributeBytes = attribute.getBytes(UTF8);
4120  byteBuffer.put((byte)(attributeBytes.length+1));
4121  byteBuffer.put(attributeBytes);
4122  byteBuffer.put((byte)0);
4123  }
4124  }
4125  defaultServerConnection.writePacket(writeBuffer, byteBuffer.position(), () -> {
4126  final StringBuilder sb = new StringBuilder("createplayer ");
4127  sb.append(login);
4128  if (loginMethod >= 2) {
4129  for (final String attribute : attributes) {
4130  sb.append(" ").append(attribute);
4131  }
4132  }
4133  return sb.toString();
4134  });
4135  }
4136  }
4137 
4138  @Override
4139  public void sendAccountPassword(@NotNull final String currentPassword, @NotNull final String newPassword) {
4140  clearFailure();
4141  if (debugProtocol != null) {
4142  debugProtocol.debugProtocolWrite("send accountpw");
4143  }
4144  synchronized (writeBuffer) {
4145  ((Buffer)byteBuffer).clear();
4146  //noinspection AccessToStaticFieldLockedOnInstance
4147  byteBuffer.put(ACCOUNT_PASSWORD_PREFIX);
4148  final byte[] currentPasswordBytes = currentPassword.getBytes(UTF8);
4149  byteBuffer.put((byte)currentPasswordBytes.length);
4150  byteBuffer.put(currentPasswordBytes);
4151  final byte[] newPasswordBytes = newPassword.getBytes(UTF8);
4152  byteBuffer.put((byte)newPasswordBytes.length);
4153  byteBuffer.put(newPasswordBytes);
4154  defaultServerConnection.writePacket(writeBuffer, byteBuffer.position(), () -> "accountpw");
4155  }
4156  }
4157 
4164  private static int getInt1(@NotNull final ByteBuffer byteBuffer) {
4165  return byteBuffer.get()&0xFF;
4166  }
4167 
4174  private static int getInt2(@NotNull final ByteBuffer byteBuffer) {
4175  return byteBuffer.getShort()&0xFFFF;
4176  }
4177 
4184  private static int getInt4(@NotNull final ByteBuffer byteBuffer) {
4185  return byteBuffer.getInt();
4186  }
4187 
4194  private static long getInt8(@NotNull final ByteBuffer byteBuffer) {
4195  return byteBuffer.getLong();
4196  }
4197 
4205  @NotNull
4206  private static String getString(@NotNull final ByteBuffer byteBuffer, final int len) {
4207  final byte[] tmp = new byte[len];
4208  byteBuffer.get(tmp);
4209  return new String(tmp, UTF8);
4210  }
4211 
4219  @NotNull
4220  private static String getStringDelimiter(@NotNull final ByteBuffer byteBuffer, final char delimiter) {
4221  final int position = byteBuffer.position();
4222  final int remaining = byteBuffer.remaining();
4223  int len;
4224  for (len = 0; len < remaining; len++) {
4225  if (byteBuffer.get(position+len) == delimiter) {
4226  break;
4227  }
4228  }
4229  final byte[] tmp = new byte[len];
4230  byteBuffer.get(tmp);
4231  if (len < remaining) {
4232  byteBuffer.get(); // skip delimiter
4233  }
4234  return new String(tmp, UTF8);
4235  }
4236 
4242  @NotNull
4243  private static String hexDump(@NotNull final ByteBuffer byteBuffer) {
4244  final int len = byteBuffer.limit();
4245  final byte[] data = new byte[len];
4246  for (int i = 0; i < len; i++) {
4247  data[i] = byteBuffer.get(i);
4248  }
4249  return HexCodec.hexDump(data, 0, len);
4250  }
4251 
4257  return numLookObjects.getCurrentNumLookObjects();
4258  }
4259 
4266  public void waitForCurrentNumLookObjectsValid() throws InterruptedException {
4267  numLookObjects.waitForCurrentNumLookObjectsValid();
4268  }
4269 
4270  private void fireMapClear(final int x, final int y) {
4271  crossfireUpdateMapListener.mapClear(x, y);
4272  }
4273 
4274  private void fireMapDarkness(final int x, final int y, final int darkness) {
4275  crossfireUpdateMapListener.mapDarkness(x, y, darkness);
4276  }
4277 
4278  private void fireMapFace(@NotNull final Location location, final int face) {
4279  crossfireUpdateMapListener.mapFace(location, face);
4280  }
4281 
4282  private void fireMapAnimation(@NotNull final Location location, final int animationNum, final int animationType) {
4283  crossfireUpdateMapListener.mapAnimation(location, animationNum, animationType);
4284  }
4285 
4286  private void fireMapSmooth(@NotNull final Location location, final int smooth) {
4287  crossfireUpdateMapListener.mapSmooth(location, smooth);
4288  }
4289 
4290  private void fireMapAnimationSpeed(@NotNull final Location location, final int animSpeed) {
4291  crossfireUpdateMapListener.mapAnimationSpeed(location, animSpeed);
4292  }
4293 
4294  private void fireMagicMap(final int x, final int y, final byte @NotNull [] @NotNull [] data) {
4295  synchronized (crossfireUpdateMapListener.mapBegin()) {
4296  assert crossfireUpdateMapListener != null;
4297  crossfireUpdateMapListener.magicMap(x, y, data);
4298  assert crossfireUpdateMapListener != null;
4299  crossfireUpdateMapListener.mapEnd();
4300  }
4301  fireMagicMap();
4302  }
4303 
4308  private void sendQueuedRequestinfo(@NotNull final String infoType) {
4309  synchronized (writeBuffer) {
4310  pendingRequestInfos.add(infoType);
4311  }
4312  sendPendingRequestInfo();
4313  }
4314 
4318  private void sendPendingRequestInfo() {
4319  while (true) {
4320  final String infoType;
4321  synchronized (writeBuffer) {
4322  if (sendingRequestInfo.size() >= CONCURRENT_REQUESTINFO_MESSAGES || pendingRequestInfos.isEmpty()) {
4323  return;
4324  }
4325  infoType = pendingRequestInfos.remove(0);
4326  }
4327  sendRequestinfo(infoType);
4328  }
4329  }
4330 
4335  private boolean hasPendingReplyinfo() {
4336  synchronized (writeBuffer) {
4337  return !sendingRequestInfo.isEmpty() || !pendingRequestInfos.isEmpty();
4338  }
4339  }
4340 
4341 }
com.realtime.crossfire.jxclient.character.NewCharacterInformation.setRaceList
void setRaceList(@NotNull final String @NotNull[] raceList)
Definition: NewCharacterInformation.java:159
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.accountName
String accountName
Definition: DefaultCrossfireServerConnection.java:362
com.realtime.crossfire.jxclient.server.crossfire.CrossfireUpdateMapListener.mapScroll
void mapScroll(int dx, int dy)
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.fireMapAnimation
void fireMapAnimation(@NotNull final Location location, final int animationNum, final int animationType)
Definition: DefaultCrossfireServerConnection.java:4282
com.realtime.crossfire.jxclient.stats.Stats.CS_STAT_OVERLOAD
static final int CS_STAT_OVERLOAD
Definition: Stats.java:341
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.sendMove
void sendMove(final int to, final int tag, final int nrof)
Definition: DefaultCrossfireServerConnection.java:3765
com.realtime.crossfire.jxclient
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.processMusic
void processMusic(@NotNull final ByteBuffer packet)
Definition: DefaultCrossfireServerConnection.java:2998
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.defaultServerConnection
final DefaultServerConnection defaultServerConnection
Definition: DefaultCrossfireServerConnection.java:176
com.realtime.crossfire.jxclient.stats.Stats.setStatInt2
void setStatInt2(final int stat, final short param)
Definition: Stats.java:997
com.realtime.crossfire.jxclient.protocol.Map2.COORD_LAYER0
int COORD_LAYER0
Definition: Map2.java:64
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.DEFAULT_MAP_HEIGHT
static final int DEFAULT_MAP_HEIGHT
Definition: DefaultCrossfireServerConnection.java:79
com.realtime.crossfire.jxclient.server.crossfire.Model.getStats
Stats getStats()
Definition: Model.java:107
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.pendingMapWidth
int pendingMapWidth
Definition: DefaultCrossfireServerConnection.java:197
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.sendMark
void sendMark(final int tag)
Definition: DefaultCrossfireServerConnection.java:3750
com.realtime.crossfire.jxclient.server.crossfire.StartingMapBuilder.setArchName
void setArchName(@NotNull final String archName)
Definition: StartingMapBuilder.java:70
com.realtime.crossfire.jxclient.protocol.Map2.COORD_LAYER4
int COORD_LAYER4
Definition: Map2.java:84
com.realtime.crossfire.jxclient.protocol.Map2.COORD_LAYER3
int COORD_LAYER3
Definition: Map2.java:79
com.realtime.crossfire.jxclient.protocol.Map2.COORD_LAYER9
int COORD_LAYER9
Definition: Map2.java:109
com.realtime.crossfire.jxclient.stats.Stats.setStatInt8
void setStatInt8(final int stat, final long param)
Definition: Stats.java:1095
com.realtime.crossfire.jxclient.skills.SkillSet.clearSkills
void clearSkills()
Definition: SkillSet.java:110
com.realtime.crossfire.jxclient.protocol.Map2.COORD_LAYER7
int COORD_LAYER7
Definition: Map2.java:99
com.realtime.crossfire.jxclient.character.NewCharacterInformation.addRaceInfo
void addRaceInfo(@NotNull final ClassRaceInfo classRaceInfo)
Definition: NewCharacterInformation.java:180
com.realtime.crossfire.jxclient.server.crossfire.Model.getNewCharacterInformation
NewCharacterInformation getNewCharacterInformation()
Definition: Model.java:156
com.realtime.crossfire.jxclient.spells.SpellsManager.addSpell
void addSpell(final int tag, final int level, final int castingTime, final int mana, final int grace, final int damage, final int skill, final int path, final int faceNum, @NotNull final String spellName, @NotNull final String message)
Definition: SpellsManager.java:216
com.realtime.crossfire.jxclient.protocol.UpdItem.UPD_ANIM
int UPD_ANIM
Definition: UpdItem.java:59
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.cmdMap2CoordinateLayer
void cmdMap2CoordinateLayer(@NotNull final ByteBuffer packet, final int x, final int y, final int len, final int layer)
Definition: DefaultCrossfireServerConnection.java:1557
com.realtime.crossfire.jxclient.server
com.realtime.crossfire.jxclient.server.crossfire.AbstractCrossfireServerConnection.fireFaceReceived
void fireFaceReceived(final int faceNum, final int faceSetNum, final int faceChecksum, @NotNull final String faceName)
Definition: AbstractCrossfireServerConnection.java:326
com.realtime.crossfire.jxclient.server.crossfire.AbstractCrossfireServerConnection.clearFailure
void clearFailure()
Definition: AbstractCrossfireServerConnection.java:340
com.realtime.crossfire.jxclient.stats.Stats.CS_STAT_LEVEL
static final int CS_STAT_LEVEL
Definition: Stats.java:109
com.realtime.crossfire.jxclient.stats.Stats.CS_NUM_SKILLS
static final int CS_NUM_SKILLS
Definition: Stats.java:475
com.realtime.crossfire.jxclient.server.crossfire.NewCharInfoBuilder
Definition: NewCharInfoBuilder.java:36
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.pendingRequestInfos
final List< String > pendingRequestInfos
Definition: DefaultCrossfireServerConnection.java:452
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.processDelSpell
void processDelSpell(@NotNull final ByteBuffer packet)
Definition: DefaultCrossfireServerConnection.java:2630
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.REQUESTINFO_PREFIX
static final byte[] REQUESTINFO_PREFIX
Definition: DefaultCrossfireServerConnection.java:322
com.realtime.crossfire.jxclient.server.crossfire.StartingMapBuilder.setDescription
void setDescription(@NotNull final String description)
Definition: StartingMapBuilder.java:97
com.realtime.crossfire.jxclient.server.crossfire.NumLookObjects.processSetupNumLookObjects
void processSetupNumLookObjects(@NotNull final String value)
Definition: NumLookObjects.java:164
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.parseAccountPlayer
CharacterInformation parseAccountPlayer(@NotNull final ByteBuffer packet, @NotNull final AccountPlayerBuilder accountPlayerBuilder)
Definition: DefaultCrossfireServerConnection.java:2365
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.processPacket
void processPacket(@NotNull final ByteBuffer packet)
Definition: DefaultCrossfireServerConnection.java:552
com.realtime.crossfire.jxclient.stats.Stats.CS_STAT_BASE_POW
static final int CS_STAT_BASE_POW
Definition: Stats.java:280
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.writeBuffer
final byte[] writeBuffer
Definition: DefaultCrossfireServerConnection.java:226
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.processAddmeFailed
void processAddmeFailed()
Definition: DefaultCrossfireServerConnection.java:2426
com.realtime.crossfire.jxclient.stats.Stats.CS_STAT_RANGE
static final int CS_STAT_RANGE
Definition: Stats.java:155
com.realtime.crossfire.jxclient.guistate.ClientSocketState
Definition: ClientSocketState.java:30
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.processKnowledgeInfoReplyinfo
void processKnowledgeInfoReplyinfo(@NotNull final ByteBuffer packet)
Definition: DefaultCrossfireServerConnection.java:1895
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.processClassRaceInfoReplyinfo
void processClassRaceInfoReplyinfo(@NotNull final ByteBuffer packet, final boolean raceInfo)
Definition: DefaultCrossfireServerConnection.java:2028
com.realtime.crossfire.jxclient.stats.Stats.CS_STAT_RACE_WIS
static final int CS_STAT_RACE_WIS
Definition: Stats.java:225
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.currentMapWidth
int currentMapWidth
Definition: DefaultCrossfireServerConnection.java:208
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.start
void start()
Definition: DefaultCrossfireServerConnection.java:515
com.realtime.crossfire.jxclient.map
Definition: CfMap.java:23
com.realtime.crossfire.jxclient.server.crossfire.Model.getSpellsManager
SpellsManager getSpellsManager()
Definition: Model.java:122
com.realtime.crossfire.jxclient.protocol.UpdItem.UPD_WEIGHT
int UPD_WEIGHT
Definition: UpdItem.java:44
com.realtime.crossfire.jxclient.stats.Stats.CS_STAT_WEIGHT_LIM
static final int CS_STAT_WEIGHT_LIM
Definition: Stats.java:185
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.processNewCharInfoReplyinfo
void processNewCharInfoReplyinfo(@NotNull final ByteBuffer packet)
Definition: DefaultCrossfireServerConnection.java:2071
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.processVersion
void processVersion(@NotNull final ByteBuffer packet)
Definition: DefaultCrossfireServerConnection.java:3615
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.PATTERN_SPACE
static final Pattern PATTERN_SPACE
Definition: DefaultCrossfireServerConnection.java:103
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.sendAskface
void sendAskface(final int faceNum)
Definition: DefaultCrossfireServerConnection.java:3686
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.clientSocketState
ClientSocketState clientSocketState
Definition: DefaultCrossfireServerConnection.java:356
com.realtime.crossfire.jxclient.character.NewCharacterInformation.setNewCharInfo
void setNewCharInfo(@NotNull final NewCharInfo newCharInfo)
Definition: NewCharacterInformation.java:244
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.processPickup
void processPickup(@NotNull final ByteBuffer packet)
Definition: DefaultCrossfireServerConnection.java:3029
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.processAddQuest
void processAddQuest(@NotNull final ByteBuffer packet)
Definition: DefaultCrossfireServerConnection.java:2459
com.realtime.crossfire.jxclient.character.Choice
Definition: Choice.java:34
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.processDelInv
void processDelInv(@NotNull final ByteBuffer packet)
Definition: DefaultCrossfireServerConnection.java:2584
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.fireMapAnimationSpeed
void fireMapAnimationSpeed(@NotNull final Location location, final int animSpeed)
Definition: DefaultCrossfireServerConnection.java:4290
com.realtime.crossfire.jxclient.protocol.Map2.COORD_OFFSET
int COORD_OFFSET
Definition: Map2.java:39
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.processExpTableReplyinfo
void processExpTableReplyinfo(@NotNull final ByteBuffer packet)
Definition: DefaultCrossfireServerConnection.java:1874
com.realtime.crossfire.jxclient.stats.Stats.CS_STAT_TITLE
static final int CS_STAT_TITLE
Definition: Stats.java:160
com.realtime.crossfire.jxclient.stats.Stats.CS_STAT_RESIST_START
static final int CS_STAT_RESIST_START
Definition: Stats.java:351
com.realtime.crossfire.jxclient.stats.Stats.CS_STAT_APPLIED_STR
static final int CS_STAT_APPLIED_STR
Definition: Stats.java:285
com.realtime.crossfire.jxclient.server.server.DefaultServerConnection.addClientSocketListener
void addClientSocketListener(@NotNull final ClientSocketListener clientSocketListener)
Definition: DefaultServerConnection.java:75
com.realtime.crossfire.jxclient.server.crossfire.Model.getQuestsManager
QuestsManager getQuestsManager()
Definition: Model.java:127
com.realtime.crossfire.jxclient.stats.Stats.CS_STAT_BASE_DEX
static final int CS_STAT_BASE_DEX
Definition: Stats.java:265
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.parseDigit
static int parseDigit(final byte ch)
Definition: DefaultCrossfireServerConnection.java:3935
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.crossfireMapScrollListeners
final EventListenerList2< CrossfireMapScrollListener > crossfireMapScrollListeners
Definition: DefaultCrossfireServerConnection.java:431
com.realtime.crossfire.jxclient.stats.Stats.CS_STAT_CHA
static final int CS_STAT_CHA
Definition: Stats.java:94
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.askfaceFaceQueueListeners
final EventListenerList2< AskfaceFaceQueueListener > askfaceFaceQueueListeners
Definition: DefaultCrossfireServerConnection.java:437
com.realtime.crossfire.jxclient.server.crossfire.AbstractCrossfireServerConnection.fireAddItemReceived
void fireAddItemReceived(final int location, final int tag, final int flags, final int weight, final int faceNum, final String name, final String namePl, final int anim, final int animSpeed, final int nrof, final int type)
Definition: AbstractCrossfireServerConnection.java:346
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.DefaultCrossfireServerConnection
DefaultCrossfireServerConnection(@NotNull final Model model, @Nullable final DebugWriter debugProtocol, @NotNull final String version)
Definition: DefaultCrossfireServerConnection.java:497
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.processSetup
void processSetup(@NotNull final ByteBuffer packet)
Definition: DefaultCrossfireServerConnection.java:3118
com.realtime.crossfire.jxclient.server.crossfire.AbstractCrossfireServerConnection.fireMagicMap
void fireMagicMap()
Definition: AbstractCrossfireServerConnection.java:352
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.parseClassRaceInfoChoice
static void parseClassRaceInfoChoice(@NotNull final ByteBuffer packet, @NotNull final ClassRaceInfoBuilder rb)
Definition: DefaultCrossfireServerConnection.java:2308
com.realtime.crossfire.jxclient.server.crossfire.AbstractCrossfireServerConnection.notifyPacketWatcherListeners
void notifyPacketWatcherListeners(@NotNull final String command, @NotNull final ClientSocketMonitorCommand args)
Definition: AbstractCrossfireServerConnection.java:454
com.realtime.crossfire.jxclient.stats.Stats.CS_STAT_BASE_WIS
static final int CS_STAT_BASE_WIS
Definition: Stats.java:260
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.getAccountName
String getAccountName()
Definition: DefaultCrossfireServerConnection.java:3986
com.realtime.crossfire.jxclient.server.crossfire.CrossfireUpdateMapListener.mapEnd
void mapEnd()
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.hexDump
static String hexDump(@NotNull final ByteBuffer byteBuffer)
Definition: DefaultCrossfireServerConnection.java:4243
com.realtime.crossfire.jxclient.server.crossfire.AbstractCrossfireServerConnection.firePlayerReceived
void firePlayerReceived(final int tag, final int weight, final int faceNum, @NotNull final String name)
Definition: AbstractCrossfireServerConnection.java:370
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.connected
void connected()
Definition: DefaultCrossfireServerConnection.java:532
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.waitForCurrentNumLookObjectsValid
void waitForCurrentNumLookObjectsValid()
Definition: DefaultCrossfireServerConnection.java:4266
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.processExtendedInfoSet
void processExtendedInfoSet(@NotNull final ByteBuffer packet)
Definition: DefaultCrossfireServerConnection.java:2702
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.addCrossfireMapScrollListener
void addCrossfireMapScrollListener(@NotNull final CrossfireMapScrollListener listener)
Definition: DefaultCrossfireServerConnection.java:525
com.realtime.crossfire.jxclient.server.crossfire.AbstractCrossfireServerConnection.fireCommandComcReceived
void fireCommandComcReceived(final int packetNo, final int time)
Definition: AbstractCrossfireServerConnection.java:308
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.processAddKnowledge
void processAddKnowledge(@NotNull final ByteBuffer packet)
Definition: DefaultCrossfireServerConnection.java:2482
com.realtime.crossfire.jxclient.server.socket.ClientSocketListener
Definition: ClientSocketListener.java:33
com.realtime.crossfire.jxclient.util.EventListenerList2
Definition: EventListenerList2.java:37
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.processExtendedTextSet
void processExtendedTextSet(@NotNull final ByteBuffer packet)
Definition: DefaultCrossfireServerConnection.java:2722
com.realtime.crossfire.jxclient.stats.Stats.CS_STAT_ARMOUR
static final int CS_STAT_ARMOUR
Definition: Stats.java:129
com.realtime.crossfire.jxclient.stats.Stats.RESIST_TYPES
static final int RESIST_TYPES
Definition: Stats.java:456
com.realtime.crossfire.jxclient.server.server.DefaultServerConnection.connect
void connect(@NotNull final String hostname, final int port)
Definition: DefaultServerConnection.java:97
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.sendAccountCharacterCreate
void sendAccountCharacterCreate(@NotNull final String login, @NotNull final String password, @NotNull final Collection< String > attributes)
Definition: DefaultCrossfireServerConnection.java:4102
com.realtime.crossfire.jxclient.stats.Stats.CS_STAT_EXP64
static final int CS_STAT_EXP64
Definition: Stats.java:195
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.packet
int packet
Definition: DefaultCrossfireServerConnection.java:237
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.loginMethod
int loginMethod
Definition: DefaultCrossfireServerConnection.java:367
com.realtime.crossfire.jxclient.protocol.Map2.COORD_LAYER2
int COORD_LAYER2
Definition: Map2.java:74
com.realtime.crossfire.jxclient.server.crossfire.StatUtils
Definition: StatUtils.java:34
com.realtime.crossfire.jxclient.guistate.ClientSocketState.ADDME
ADDME
Definition: ClientSocketState.java:55
com.realtime.crossfire.jxclient.stats.Stats
Definition: Stats.java:44
com.realtime.crossfire.jxclient.stats.Stats.setStatSkill
void setStatSkill(final int stat, final int level, final long experience)
Definition: Stats.java:1139
com.realtime.crossfire.jxclient.stats.Stats.CS_STAT_FOOD
static final int CS_STAT_FOOD
Definition: Stats.java:139
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.debugProtocol
final DebugWriter debugProtocol
Definition: DefaultCrossfireServerConnection.java:350
com.realtime.crossfire.jxclient.spells.SpellsManager.updateSpell
void updateSpell(final int flags, final int tag, final int mana, final int grace, final int damage)
Definition: SpellsManager.java:256
com.realtime.crossfire.jxclient.account.CharacterInformation
Definition: CharacterInformation.java:32
com.realtime.crossfire.jxclient.stats.Stats.CS_STAT_GOLEM_MAXHP
static final int CS_STAT_GOLEM_MAXHP
Definition: Stats.java:325
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.processRaceListReplyinfo
void processRaceListReplyinfo(@NotNull final ByteBuffer packet)
Definition: DefaultCrossfireServerConnection.java:1981
com.realtime.crossfire.jxclient.protocol.Map2.COORD_LAYER8
int COORD_LAYER8
Definition: Map2.java:104
com.realtime.crossfire.jxclient.faces
Definition: AbstractFaceQueue.java:23
com.realtime.crossfire.jxclient.stats.Stats.CS_STAT_APPLIED_DEX
static final int CS_STAT_APPLIED_DEX
Definition: Stats.java:300
com.realtime.crossfire.jxclient.guistate.ClientSocketState.ACCOUNT_INFO
ACCOUNT_INFO
Definition: ClientSocketState.java:60
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.stop
void stop()
Definition: DefaultCrossfireServerConnection.java:520
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.processSmooth
void processSmooth(@NotNull final ByteBuffer packet)
Definition: DefaultCrossfireServerConnection.java:3331
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.parseNewCharInfoValues
static void parseNewCharInfoValues(@NotNull final NewCharInfoBuilder newCharInfoBuilder, @NotNull final String variableName, @NotNull final String values)
Definition: DefaultCrossfireServerConnection.java:2151
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.processImageInfoReplyinfo
void processImageInfoReplyinfo(@NotNull final ByteBuffer packet)
Definition: DefaultCrossfireServerConnection.java:1772
com.realtime.crossfire.jxclient.server.crossfire.Model.getExperienceTable
ExperienceTable getExperienceTable()
Definition: Model.java:112
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.currentMapHeight
int currentMapHeight
Definition: DefaultCrossfireServerConnection.java:213
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.processMagicMap
void processMagicMap(@NotNull final ByteBuffer packet)
Definition: DefaultCrossfireServerConnection.java:2856
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.processUpdItem
void processUpdItem(@NotNull final ByteBuffer packet)
Definition: DefaultCrossfireServerConnection.java:3537
com.realtime.crossfire.jxclient.stats.ExperienceTable.setExpTable
void setExpTable(final long @NotNull[] expTable)
Definition: ExperienceTable.java:152
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.LOOKAT_PREFIX
static final byte[] LOOKAT_PREFIX
Definition: DefaultCrossfireServerConnection.java:297
com.realtime.crossfire.jxclient.protocol.Map2.TYPE_SCROLL
int TYPE_SCROLL
Definition: Map2.java:49
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.processSound2
void processSound2(@NotNull final ByteBuffer packet)
Definition: DefaultCrossfireServerConnection.java:3369
com.realtime.crossfire.jxclient.server.crossfire.AbstractCrossfireServerConnection.fireCommandQueryReceived
void fireCommandQueryReceived(@NotNull final String prompt, final int queryType)
Definition: AbstractCrossfireServerConnection.java:376
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.parseNewCharInfoValue
static void parseNewCharInfoValue(@NotNull final NewCharInfoBuilder newCharInfoBuilder, final boolean required, @NotNull final String variableName, @NotNull final String values)
Definition: DefaultCrossfireServerConnection.java:2121
com.realtime.crossfire.jxclient.stats.Stats.setSimpleWeaponSpeed
void setSimpleWeaponSpeed(final boolean simpleWeaponSpeed)
Definition: Stats.java:736
com.realtime.crossfire.jxclient.stats.Stats.CS_STAT_MAXGRACE
static final int CS_STAT_MAXGRACE
Definition: Stats.java:175
com.realtime.crossfire.jxclient.server.crossfire.AbstractCrossfireServerConnection.fireStartPlaying
void fireStartPlaying()
Definition: AbstractCrossfireServerConnection.java:302
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.sendAccountPassword
void sendAccountPassword(@NotNull final String currentPassword, @NotNull final String newPassword)
Definition: DefaultCrossfireServerConnection.java:4139
com.realtime.crossfire.jxclient.server.crossfire.AbstractCrossfireServerConnection.fireUpditemReceived
void fireUpditemReceived(final int flags, final int tag, final int valLocation, final int valFlags, final int valWeight, final int valFaceNum, @NotNull final String valName, @NotNull final String valNamePl, final int valAnim, final int valAnimSpeed, final int valNrof)
Definition: AbstractCrossfireServerConnection.java:400
com.realtime.crossfire.jxclient.server.server.DefaultServerConnection.disconnect
void disconnect(@NotNull final String reason)
Definition: DefaultServerConnection.java:102
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.setPreferredMapSize
void setPreferredMapSize(final int preferredMapWidth, final int preferredMapHeight)
Definition: DefaultCrossfireServerConnection.java:3944
com.realtime.crossfire.jxclient.server.crossfire.AbstractCrossfireServerConnection.fireStartAccountList
void fireStartAccountList(@NotNull final String accountName)
Definition: AbstractCrossfireServerConnection.java:284
com.realtime.crossfire.jxclient.stats.Stats.CS_STAT_SPELL_DENY
static final int CS_STAT_SPELL_DENY
Definition: Stats.java:210
com.realtime.crossfire.jxclient.stats.Stats.CS_STAT_STR
static final int CS_STAT_STR
Definition: Stats.java:69
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.cmdMap2CoordinateLayer4
void cmdMap2CoordinateLayer4(@NotNull final ByteBuffer packet, @NotNull final Location location, final int face)
Definition: DefaultCrossfireServerConnection.java:1626
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.processUpdSpell
void processUpdSpell(@NotNull final ByteBuffer packet)
Definition: DefaultCrossfireServerConnection.java:3594
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.SETUP_PREFIX
static final byte[] SETUP_PREFIX
Definition: DefaultCrossfireServerConnection.java:327
com.realtime.crossfire.jxclient.stats.Stats.CS_STAT_RACE_INT
static final int CS_STAT_RACE_INT
Definition: Stats.java:220
com.realtime.crossfire.jxclient.stats.Stats.CS_STAT_MAXHP
static final int CS_STAT_MAXHP
Definition: Stats.java:54
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.clientSocketListener
final ClientSocketListener clientSocketListener
Definition: DefaultCrossfireServerConnection.java:459
com.realtime.crossfire.jxclient.server.crossfire.Model.getSmoothFaces
SmoothFaces getSmoothFaces()
Definition: Model.java:142
com.realtime.crossfire.jxclient.protocol.Map2.ANIM_MASK
int ANIM_MASK
Definition: Map2.java:135
com.realtime.crossfire.jxclient.stats.Stats.CS_STAT_SPELL_REPEL
static final int CS_STAT_SPELL_REPEL
Definition: Stats.java:205
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.preferredMapHeight
int preferredMapHeight
Definition: DefaultCrossfireServerConnection.java:186
com.realtime.crossfire.jxclient.character.NewCharacterInformation.setStartingMapList
void setStartingMapList(@NotNull final Iterable< StartingMap > startingMaps)
Definition: NewCharacterInformation.java:111
com.realtime.crossfire.jxclient.character.NewCharacterInformation.setClassList
void setClassList(@NotNull final String @NotNull[] classList)
Definition: NewCharacterInformation.java:201
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.sendAccountLogin
void sendAccountLogin(@NotNull final String login, @NotNull final String password)
Definition: DefaultCrossfireServerConnection.java:3642
com.realtime.crossfire.jxclient.protocol.UpdItem.UPD_ANIMSPEED
int UPD_ANIMSPEED
Definition: UpdItem.java:64
com.realtime.crossfire.jxclient.protocol
Definition: MagicMap.java:23
com.realtime.crossfire.jxclient.map.Location
Definition: Location.java:32
com.realtime.crossfire.jxclient.server.crossfire.Model.getKnowledgeManager
KnowledgeManager getKnowledgeManager()
Definition: Model.java:132
com.realtime.crossfire.jxclient.knowledge.KnowledgeManager.addKnowledgeType
void addKnowledgeType(@NotNull final String type, @NotNull final String name, final int face, final boolean canAttempt)
Definition: KnowledgeManager.java:125
com.realtime.crossfire.jxclient.server.crossfire.AbstractCrossfireServerConnection.fireManageAccount
void fireManageAccount()
Definition: AbstractCrossfireServerConnection.java:278
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.INFO_MAP_DESCRIPTION
static final int INFO_MAP_DESCRIPTION
Definition: DefaultCrossfireServerConnection.java:158
com.realtime.crossfire.jxclient.server.crossfire.AbstractCrossfireServerConnection.drawInfo
void drawInfo(@NotNull final String message, final int color)
Definition: AbstractCrossfireServerConnection.java:407
com.realtime.crossfire.jxclient.server.crossfire.NumLookObjects.setPreferredNumLookObjects
void setPreferredNumLookObjects(final int preferredNumLookObjects)
Definition: NumLookObjects.java:217
com.realtime.crossfire.jxclient.server.crossfire.ClassRaceInfoBuilder
Definition: ClassRaceInfoBuilder.java:38
com.realtime.crossfire.jxclient.server.crossfire.ClassRaceInfoBuilder.setName
void setName(@NotNull final String name)
Definition: ClassRaceInfoBuilder.java:92
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.CONCURRENT_REQUESTINFO_MESSAGES
static final int CONCURRENT_REQUESTINFO_MESSAGES
Definition: DefaultCrossfireServerConnection.java:85
com.realtime.crossfire.jxclient.guistate
Definition: ClientSocketState.java:23
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.ACCOUNT_PLAY_PREFIX
static final byte[] ACCOUNT_PLAY_PREFIX
Definition: DefaultCrossfireServerConnection.java:247
com.realtime.crossfire.jxclient.server.crossfire.NumLookObjects
Definition: NumLookObjects.java:35
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.getInt8
static long getInt8(@NotNull final ByteBuffer byteBuffer)
Definition: DefaultCrossfireServerConnection.java:4194
com.realtime.crossfire.jxclient.server.crossfire.CrossfireUpdateMapListener
Definition: CrossfireUpdateMapListener.java:33
com.realtime.crossfire.jxclient.util.HexCodec.hexDump
static String hexDump(final byte @NotNull[] data, final int start, final int end)
Definition: HexCodec.java:72
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.REPLY_PREFIX
static final byte[] REPLY_PREFIX
Definition: DefaultCrossfireServerConnection.java:317
com.realtime.crossfire.jxclient.stats.Stats.CS_STAT_APPLIED_CHA
static final int CS_STAT_APPLIED_CHA
Definition: Stats.java:310
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.processAddmeSuccess
void processAddmeSuccess()
Definition: DefaultCrossfireServerConnection.java:2437
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.setClientSocketState
void setClientSocketState(@NotNull final ClientSocketState prevState, @NotNull final ClientSocketState nextState)
Definition: DefaultCrossfireServerConnection.java:4019
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.ACCOUNT_NEW_PREFIX
static final byte[] ACCOUNT_NEW_PREFIX
Definition: DefaultCrossfireServerConnection.java:257
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.disconnect
void disconnect(@NotNull final String reason)
Definition: DefaultCrossfireServerConnection.java:4000
com.realtime.crossfire.jxclient.server.crossfire.StartingMapBuilder
Definition: StartingMapBuilder.java:37
com.realtime.crossfire.jxclient.protocol.Map2.COORD_DARKNESS
int COORD_DARKNESS
Definition: Map2.java:59
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.processImage2
void processImage2(@NotNull final ByteBuffer packet)
Definition: DefaultCrossfireServerConnection.java:2800
com.realtime.crossfire.jxclient.protocol.Map2.COORD_LAYER1
int COORD_LAYER1
Definition: Map2.java:69
com.realtime.crossfire.jxclient.stats.Stats.CS_STAT_WC
static final int CS_STAT_WC
Definition: Stats.java:114
com.realtime.crossfire.jxclient.protocol.MessageType
Definition: MessageType.java:33
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.setCrossfireUpdateMapListener
void setCrossfireUpdateMapListener(@NotNull final CrossfireUpdateMapListener listener)
Definition: DefaultCrossfireServerConnection.java:510
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.cmdMap2Coordinate
void cmdMap2Coordinate(@NotNull final ByteBuffer packet, final int x, final int y)
Definition: DefaultCrossfireServerConnection.java:1477
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.processNewMap
void processNewMap(@NotNull final ByteBuffer packet)
Definition: DefaultCrossfireServerConnection.java:3012
com.realtime.crossfire.jxclient.server.crossfire.AbstractCrossfireServerConnection.drawextinfo
void drawextinfo(final int color, final int type, final int subtype, @NotNull final String message)
Definition: AbstractCrossfireServerConnection.java:414
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.processUpdQuest
void processUpdQuest(@NotNull final ByteBuffer packet)
Definition: DefaultCrossfireServerConnection.java:3576
com.realtime.crossfire.jxclient.server.crossfire.NewCharInfoBuilder.finish
NewCharInfo finish()
Definition: NewCharInfoBuilder.java:80
com.realtime.crossfire.jxclient.stats.Stats.CS_STAT_FLAGS
static final int CS_STAT_FLAGS
Definition: Stats.java:180
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.processItem2
void processItem2(@NotNull final ByteBuffer packet)
Definition: DefaultCrossfireServerConnection.java:2825
com.realtime.crossfire.jxclient.server.crossfire.AbstractCrossfireServerConnection.fireCommandSound2Received
void fireCommandSound2Received(final int x, final int y, final int dir, final int volume, final int type, @NotNull final String action, @NotNull final String name)
Definition: AbstractCrossfireServerConnection.java:388
com.realtime.crossfire.jxclient.server.crossfire.AbstractCrossfireServerConnection.fireFailure
void fireFailure(@NotNull final String command, @NotNull final String arguments)
Definition: AbstractCrossfireServerConnection.java:330
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.INFO_MAP_ARCH_NAME
static final int INFO_MAP_ARCH_NAME
Definition: DefaultCrossfireServerConnection.java:148
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.ACL_NAME
static final int ACL_NAME
Definition: DefaultCrossfireServerConnection.java:108
com.realtime.crossfire.jxclient.protocol.Map2.TYPE_COORDINATE
int TYPE_COORDINATE
Definition: Map2.java:44
com.realtime.crossfire.jxclient.server.crossfire.StartingMapBuilder.setName
void setName(@NotNull final String name)
Definition: StartingMapBuilder.java:81
com.realtime.crossfire.jxclient.server.crossfire.ClassRaceInfoBuilder.setMsg
void setMsg(@NotNull final String msg)
Definition: ClassRaceInfoBuilder.java:100
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.fireMagicMap
void fireMagicMap(final int x, final int y, final byte @NotNull[] @NotNull[] data)
Definition: DefaultCrossfireServerConnection.java:4294
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.sendSetup
void sendSetup(@NotNull final String... options)
Definition: DefaultCrossfireServerConnection.java:3845
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.LOCK_PREFIX
static final byte[] LOCK_PREFIX
Definition: DefaultCrossfireServerConnection.java:292
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.processGoodbye
void processGoodbye(@NotNull final ByteBuffer packet)
Definition: DefaultCrossfireServerConnection.java:2784
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.fireMapFace
void fireMapFace(@NotNull final Location location, final int face)
Definition: DefaultCrossfireServerConnection.java:4278
com.realtime.crossfire.jxclient.server.server.DefaultServerConnection.writePacket
void writePacket(final byte @NotNull[] packet, final int length, @NotNull final ClientSocketMonitorCommand monitor)
Definition: DefaultServerConnection.java:92
com.realtime.crossfire.jxclient.server.crossfire.StatUtils.getStatNames
static String getStatNames(final int stat)
Definition: StatUtils.java:121
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.ACCOUNT_PASSWORD_PREFIX
static final byte[] ACCOUNT_PASSWORD_PREFIX
Definition: DefaultCrossfireServerConnection.java:262
com.realtime.crossfire.jxclient.util.HexCodec
Definition: HexCodec.java:31
com.realtime.crossfire.jxclient.stats.Stats.CS_STAT_APPLIED_POW
static final int CS_STAT_APPLIED_POW
Definition: Stats.java:315
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.sendRequestinfo
void sendRequestinfo(@NotNull final String infoType)
Definition: DefaultCrossfireServerConnection.java:3830
com.realtime.crossfire.jxclient.character.ClassRaceInfo
Definition: ClassRaceInfo.java:37
com.realtime.crossfire.jxclient.protocol.MessageType.getAllTypes
static int[] getAllTypes(final boolean includeJXClientType)
Definition: MessageType.java:744
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.sendVersion
void sendVersion(final int csval, final int scval, @NotNull final String vinfo)
Definition: DefaultCrossfireServerConnection.java:3899
com.realtime.crossfire.jxclient.quests.QuestsManager.addQuest
void addQuest(final int code, @NotNull final String title, final int face, final boolean replay, final int parent, final boolean end, @NotNull final String description)
Definition: QuestsManager.java:143
com.realtime.crossfire.jxclient.server.crossfire.AbstractCrossfireServerConnection.fireDelinvReceived
void fireDelinvReceived(final int tag)
Definition: AbstractCrossfireServerConnection.java:314
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.addClientSocketListener
void addClientSocketListener(@NotNull final ClientSocketListener clientSocketListener)
Definition: DefaultCrossfireServerConnection.java:4005
com.realtime.crossfire.jxclient.guistate.ClientSocketState.REQUESTINFO
REQUESTINFO
Definition: ClientSocketState.java:50
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.sendRawString
void sendRawString(@NotNull final String command)
Definition: DefaultCrossfireServerConnection.java:3802
com.realtime.crossfire.jxclient.stats.Stats.CS_STAT_AC
static final int CS_STAT_AC
Definition: Stats.java:119
com.realtime.crossfire.jxclient.guistate.ClientSocketState.SETUP
SETUP
Definition: ClientSocketState.java:45
com.realtime.crossfire.jxclient.server.server.DefaultServerConnection.stop
void stop()
Definition: DefaultServerConnection.java:70
com.realtime.crossfire.jxclient.server.crossfire.Model
Definition: Model.java:43
com.realtime.crossfire.jxclient.spells.SpellsManager.UPD_SP_GRACE
static final int UPD_SP_GRACE
Definition: SpellsManager.java:60
com.realtime.crossfire.jxclient.animations.Animations.addAnimation
void addAnimation(final int animationId, final int @NotNull[] faces)
Definition: Animations.java:107
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.fireMapDarkness
void fireMapDarkness(final int x, final int y, final int darkness)
Definition: DefaultCrossfireServerConnection.java:4274
com.realtime.crossfire.jxclient.server.crossfire.ClassRaceInfoBuilder.finish
ClassRaceInfo finish()
Definition: ClassRaceInfoBuilder.java:84
com.realtime.crossfire.jxclient.stats.Stats.CS_STAT_RACE_DEX
static final int CS_STAT_RACE_DEX
Definition: Stats.java:230
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.processMap2
void processMap2(@NotNull final ByteBuffer packet)
Definition: DefaultCrossfireServerConnection.java:2929
com.realtime.crossfire.jxclient.server.crossfire.Model.getSkillSet
SkillSet getSkillSet()
Definition: Model.java:102
com.realtime.crossfire.jxclient.spells.SpellsManager
Definition: SpellsManager.java:50
com.realtime.crossfire.jxclient.protocol.Map2.COORD_LAYER5
int COORD_LAYER5
Definition: Map2.java:89
com.realtime.crossfire.jxclient.guistate.ClientSocketState.CONNECT_FAILED
CONNECT_FAILED
Definition: ClientSocketState.java:70
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.removeClientSocketListener
void removeClientSocketListener(@NotNull final ClientSocketListener clientSocketListener)
Definition: DefaultCrossfireServerConnection.java:4010
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.cmdMap2CoordinateDarkness
void cmdMap2CoordinateDarkness(@NotNull final ByteBuffer packet, final int x, final int y, final int len)
Definition: DefaultCrossfireServerConnection.java:1537
com.realtime.crossfire.jxclient.protocol.Map2
Definition: Map2.java:29
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.version
final String version
Definition: DefaultCrossfireServerConnection.java:343
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.processFailure
void processFailure(@NotNull final ByteBuffer packet)
Definition: DefaultCrossfireServerConnection.java:2761
com.realtime.crossfire.jxclient.server.crossfire.StartingMapBuilder.finish
Collection< StartingMap > finish()
Definition: StartingMapBuilder.java:114
com.realtime.crossfire.jxclient.stats.Stats.CS_STAT_APPLIED_INT
static final int CS_STAT_APPLIED_INT
Definition: Stats.java:290
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.processQuery
void processQuery(@NotNull final ByteBuffer packet)
Definition: DefaultCrossfireServerConnection.java:3067
com.realtime.crossfire.jxclient.faces.AskfaceFaceQueueListener
Definition: AskfaceFaceQueueListener.java:10
com.realtime.crossfire.jxclient.server.crossfire.AccountPlayerBuilder
Definition: AccountPlayerBuilder.java:34
com.realtime.crossfire.jxclient.server.server.DefaultServerConnection.start
void start()
Definition: DefaultServerConnection.java:62
com.realtime.crossfire.jxclient.server.crossfire.AbstractCrossfireServerConnection.fireMusicReceived
void fireMusicReceived(@NotNull final String music)
Definition: AbstractCrossfireServerConnection.java:358
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.ASKFACE_PREFIX
static final byte[] ASKFACE_PREFIX
Definition: DefaultCrossfireServerConnection.java:282
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.cmdMap2CoordinateLayer3
void cmdMap2CoordinateLayer3(@NotNull final ByteBuffer packet, @NotNull final Location location, final int face)
Definition: DefaultCrossfireServerConnection.java:1598
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.processDrawExtInfo
void processDrawExtInfo(@NotNull final ByteBuffer packet)
Definition: DefaultCrossfireServerConnection.java:2647
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.setCurrentMapSize
void setCurrentMapSize(final int currentMapWidth, final int currentMapHeight)
Definition: DefaultCrossfireServerConnection.java:3962
com.realtime.crossfire.jxclient.stats.Stats.CS_STAT_SPELL_ATTUNE
static final int CS_STAT_SPELL_ATTUNE
Definition: Stats.java:200
com.realtime.crossfire.jxclient.server.crossfire.AbstractCrossfireServerConnection.fireDelitemReceived
void fireDelitemReceived(final int @NotNull[] tags)
Definition: AbstractCrossfireServerConnection.java:320
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.ACL_LEVEL
static final int ACL_LEVEL
Definition: DefaultCrossfireServerConnection.java:123
com.realtime.crossfire.jxclient.guistate.ClientSocketState.CONNECTING
CONNECTING
Definition: ClientSocketState.java:35
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.hasPendingReplyinfo
boolean hasPendingReplyinfo()
Definition: DefaultCrossfireServerConnection.java:4335
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.addFaceReceivedListener
void addFaceReceivedListener(@NotNull final AskfaceFaceQueueListener listener)
Definition: DefaultCrossfireServerConnection.java:3700
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.cmdReplyinfo
void cmdReplyinfo(@NotNull final String infoType, final ByteBuffer packet)
Definition: DefaultCrossfireServerConnection.java:1684
com.realtime.crossfire.jxclient.server.crossfire.AbstractCrossfireServerConnection.UTF8
static final Charset UTF8
Definition: AbstractCrossfireServerConnection.java:47
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.NCOM_PREFIX
static final byte[] NCOM_PREFIX
Definition: DefaultCrossfireServerConnection.java:312
com.realtime.crossfire.jxclient.stats.Stats.CS_STAT_BASE_CHA
static final int CS_STAT_BASE_CHA
Definition: Stats.java:275
com.realtime.crossfire.jxclient.character.NewCharInfo
Definition: NewCharInfo.java:35
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.preferredMapWidth
int preferredMapWidth
Definition: DefaultCrossfireServerConnection.java:181
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.sendingRequestInfo
final Deque< String > sendingRequestInfo
Definition: DefaultCrossfireServerConnection.java:445
com.realtime.crossfire.jxclient.util
Definition: Codec.java:23
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.sendNcom
int sendNcom(final int repeat, @NotNull final String command)
Definition: DefaultCrossfireServerConnection.java:3783
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.sendLookat
void sendLookat(final int dx, final int dy)
Definition: DefaultCrossfireServerConnection.java:3734
com.realtime.crossfire.jxclient.protocol.UpdItem.UPD_FLAGS
int UPD_FLAGS
Definition: UpdItem.java:39
com.realtime.crossfire.jxclient.server.crossfire.CrossfireMapScrollListener
Definition: CrossfireMapScrollListener.java:31
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.sendAccountPlay
void sendAccountPlay(@NotNull final String name)
Definition: DefaultCrossfireServerConnection.java:4040
com.realtime.crossfire.jxclient.protocol.UpdItem.UPD_LOCATION
int UPD_LOCATION
Definition: UpdItem.java:34
com.realtime.crossfire.jxclient.stats.Stats.CS_STAT_DEX
static final int CS_STAT_DEX
Definition: Stats.java:84
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.processFace2
void processFace2(@NotNull final ByteBuffer packet)
Definition: DefaultCrossfireServerConnection.java:2745
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.fireMapSmooth
void fireMapSmooth(@NotNull final Location location, final int smooth)
Definition: DefaultCrossfireServerConnection.java:4286
com.realtime.crossfire.jxclient.stats.Stats.CS_STAT_CON
static final int CS_STAT_CON
Definition: Stats.java:89
com.realtime.crossfire.jxclient.account
Definition: CharacterInformation.java:23
com.realtime.crossfire.jxclient.stats.Stats.CS_STAT_BASE_CON
static final int CS_STAT_BASE_CON
Definition: Stats.java:270
com.realtime.crossfire.jxclient.spells.SpellsManager.UPD_SP_MANA
static final int UPD_SP_MANA
Definition: SpellsManager.java:55
com.realtime.crossfire.jxclient.protocol.UpdItem.UPD_NROF
int UPD_NROF
Definition: UpdItem.java:69
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.cmdMap2CoordinateClearSpace
void cmdMap2CoordinateClearSpace(final int x, final int y, final int len)
Definition: DefaultCrossfireServerConnection.java:1519
com.realtime.crossfire.jxclient.protocol.UpdItem.UPD_FACE
int UPD_FACE
Definition: UpdItem.java:49
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.ACL_FACE
static final int ACL_FACE
Definition: DefaultCrossfireServerConnection.java:128
com.realtime.crossfire.jxclient.stats.Stats.setStatString
void setStatString(final int stat, @NotNull final String param)
Definition: Stats.java:1113
com.realtime.crossfire.jxclient.server.crossfire.AbstractCrossfireServerConnection
Definition: AbstractCrossfireServerConnection.java:40
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.sendQueuedRequestinfo
void sendQueuedRequestinfo(@NotNull final String infoType)
Definition: DefaultCrossfireServerConnection.java:4308
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.PATTERN_BAR
static final Pattern PATTERN_BAR
Definition: DefaultCrossfireServerConnection.java:97
com.realtime.crossfire.jxclient.server.server.DefaultServerConnection
Definition: DefaultServerConnection.java:40
com.realtime.crossfire.jxclient.server.crossfire.NumLookObjects.setClientSocketState
void setClientSocketState(@NotNull final ClientSocketState clientSocketState)
Definition: NumLookObjects.java:258
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.sendAccountLink
void sendAccountLink(final int force, @NotNull final String login, @NotNull final String password)
Definition: DefaultCrossfireServerConnection.java:4060
com.realtime.crossfire.jxclient.stats.Stats.CS_STAT_BASE_STR
static final int CS_STAT_BASE_STR
Definition: Stats.java:250
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.EMPTY_STRING_ARRAY
static final String[] EMPTY_STRING_ARRAY
Definition: DefaultCrossfireServerConnection.java:164
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.fireNewMap
void fireNewMap()
Definition: DefaultCrossfireServerConnection.java:3975
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.processAddSpell
void processAddSpell(@NotNull final ByteBuffer packet)
Definition: DefaultCrossfireServerConnection.java:2502
com.realtime.crossfire.jxclient.server.crossfire.AbstractCrossfireServerConnection.newString
static String newString(@NotNull final ByteBuffer byteBuffer, final int start, final int len)
Definition: AbstractCrossfireServerConnection.java:471
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.sendAddme
void sendAddme()
Definition: DefaultCrossfireServerConnection.java:3664
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.processDrawInfo
void processDrawInfo(@NotNull final ByteBuffer packet)
Definition: DefaultCrossfireServerConnection.java:2682
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.byteBuffer
final ByteBuffer byteBuffer
Definition: DefaultCrossfireServerConnection.java:232
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.sendApply
void sendApply(final int tag)
Definition: DefaultCrossfireServerConnection.java:3672
com.realtime.crossfire.jxclient.faces.SmoothFaces.updateSmoothFace
void updateSmoothFace(final int face, final int smoothFace)
Definition: SmoothFaces.java:59
com.realtime.crossfire.jxclient.server.server
Definition: DefaultServerConnection.java:23
com.realtime.crossfire.jxclient.spells.SpellsManager.deleteSpell
void deleteSpell(final int tag)
Definition: SpellsManager.java:269
com.realtime.crossfire.jxclient.server.crossfire.NumLookObjects.waitForCurrentNumLookObjectsValid
void waitForCurrentNumLookObjectsValid()
Definition: NumLookObjects.java:246
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.ADDME_PREFIX
static final byte[] ADDME_PREFIX
Definition: DefaultCrossfireServerConnection.java:272
com.realtime.crossfire.jxclient.server.crossfire.Model.getGuiStateManager
GuiStateManager getGuiStateManager()
Definition: Model.java:117
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.APPLY_PREFIX
static final byte[] APPLY_PREFIX
Definition: DefaultCrossfireServerConnection.java:277
com.realtime.crossfire.jxclient.knowledge.KnowledgeManager.addKnowledge
void addKnowledge(final int index, @NotNull final String type, @NotNull final String title, final int face)
Definition: KnowledgeManager.java:175
com.realtime.crossfire.jxclient.stats.Stats.CS_STAT_APPLIED_WIS
static final int CS_STAT_APPLIED_WIS
Definition: Stats.java:295
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.ACL_CLASS
static final int ACL_CLASS
Definition: DefaultCrossfireServerConnection.java:113
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.processDelItem
void processDelItem(@NotNull final ByteBuffer packet)
Definition: DefaultCrossfireServerConnection.java:2605
com.realtime.crossfire
com.realtime.crossfire.jxclient.stats.Stats.CS_STAT_RACE_STR
static final int CS_STAT_RACE_STR
Definition: Stats.java:215
com.realtime.crossfire.jxclient.stats.Stats.CS_STAT_HP
static final int CS_STAT_HP
Definition: Stats.java:49
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.getString
static String getString(@NotNull final ByteBuffer byteBuffer, final int len)
Definition: DefaultCrossfireServerConnection.java:4206
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.processStartingMapReplyinfo
void processStartingMapReplyinfo(@NotNull final ByteBuffer packet)
Definition: DefaultCrossfireServerConnection.java:1936
com.realtime.crossfire.jxclient.server.crossfire.AbstractCrossfireServerConnection.fireEndAccountList
void fireEndAccountList(final int count)
Definition: AbstractCrossfireServerConnection.java:296
com.realtime.crossfire.jxclient.spells.SpellsManager.UPD_SP_DAMAGE
static final int UPD_SP_DAMAGE
Definition: SpellsManager.java:65
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.getInt1
static int getInt1(@NotNull final ByteBuffer byteBuffer)
Definition: DefaultCrossfireServerConnection.java:4164
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.parseClassRaceInfoStats
static void parseClassRaceInfoStats(@NotNull final ByteBuffer packet, @NotNull final ClassRaceInfoBuilder rb)
Definition: DefaultCrossfireServerConnection.java:2204
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.sendAccountCreate
void sendAccountCreate(@NotNull final String login, @NotNull final String password)
Definition: DefaultCrossfireServerConnection.java:4081
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.getCurrentNumLookObjects
int getCurrentNumLookObjects()
Definition: DefaultCrossfireServerConnection.java:4256
com.realtime.crossfire.jxclient.knowledge.KnowledgeManager.clearTypes
void clearTypes()
Definition: KnowledgeManager.java:139
com.realtime
com.realtime.crossfire.jxclient.stats.Stats.CS_STAT_DAM
static final int CS_STAT_DAM
Definition: Stats.java:124
com.realtime.crossfire.jxclient.stats.Stats.CS_STAT_POW
static final int CS_STAT_POW
Definition: Stats.java:165
com.realtime.crossfire.jxclient.server.socket
Definition: ClientSocket.java:23
com.realtime.crossfire.jxclient.guistate.ClientSocketState.VERSION
VERSION
Definition: ClientSocketState.java:40
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.MOVE_PREFIX
static final byte[] MOVE_PREFIX
Definition: DefaultCrossfireServerConnection.java:307
com.realtime.crossfire.jxclient.stats.Stats.CS_STAT_INT
static final int CS_STAT_INT
Definition: Stats.java:74
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.processReplyInfo
void processReplyInfo(@NotNull final ByteBuffer packet)
Definition: DefaultCrossfireServerConnection.java:3093
com
com.realtime.crossfire.jxclient.stats.Stats.CS_STAT_CHARACTER_FLAGS
static final int CS_STAT_CHARACTER_FLAGS
Definition: Stats.java:330
com.realtime.crossfire.jxclient.server.crossfire.AbstractCrossfireServerConnection.fireTick
void fireTick(final int tickNo)
Definition: AbstractCrossfireServerConnection.java:394
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.putDecimal
void putDecimal(final int value)
Definition: DefaultCrossfireServerConnection.java:3921
com.realtime.crossfire.jxclient.skills.SkillSet.setSkillExtra
void setSkillExtra(final int id, @NotNull final String message)
Definition: SkillSet.java:146
com.realtime.crossfire.jxclient.guistate.ClientSocketState.CONNECTED
CONNECTED
Definition: ClientSocketState.java:65
com.realtime.crossfire.jxclient.server.crossfire.AbstractCrossfireServerConnection.fireMarkSent
void fireMarkSent(final int tag)
Definition: AbstractCrossfireServerConnection.java:432
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.processTick
void processTick(@NotNull final ByteBuffer packet)
Definition: DefaultCrossfireServerConnection.java:3520
com.realtime.crossfire.jxclient.stats.Stats.CS_STAT_RACE_CHA
static final int CS_STAT_RACE_CHA
Definition: Stats.java:240
com.realtime.crossfire.jxclient.server.server.DefaultServerConnection.removeClientSocketListener
void removeClientSocketListener(@NotNull final ClientSocketListener clientSocketListener)
Definition: DefaultServerConnection.java:80
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.VERSION_PREFIX
static final byte[] VERSION_PREFIX
Definition: DefaultCrossfireServerConnection.java:337
com.realtime.crossfire.jxclient.character.NewCharacterInformation.addClassInfo
void addClassInfo(@NotNull final ClassRaceInfo classInfo)
Definition: NewCharacterInformation.java:222
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.processAccountPlayers
void processAccountPlayers(@NotNull final ByteBuffer packet)
Definition: DefaultCrossfireServerConnection.java:2332
com.realtime.crossfire.jxclient.server.crossfire.CrossfireUpdateMapListener.mapBegin
Object mapBegin()
com.realtime.crossfire.jxclient.stats.Stats.CS_STAT_WIS
static final int CS_STAT_WIS
Definition: Stats.java:79
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.setPreferredNumLookObjects
void setPreferredNumLookObjects(final int preferredNumLookObjects)
Definition: DefaultCrossfireServerConnection.java:3980
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.processSound
void processSound(@NotNull final ByteBuffer packet)
Definition: DefaultCrossfireServerConnection.java:3349
com.realtime.crossfire.jxclient.protocol.Map2.ANIM_TYPE_MASK
int ANIM_TYPE_MASK
Definition: Map2.java:146
com.realtime.crossfire.jxclient.stats.Stats.CS_STAT_GRACE
static final int CS_STAT_GRACE
Definition: Stats.java:170
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.negotiateMapSize
void negotiateMapSize(final int mapWidth, final int mapHeight)
Definition: DefaultCrossfireServerConnection.java:1649
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.ACL_RACE
static final int ACL_RACE
Definition: DefaultCrossfireServerConnection.java:118
com.realtime.crossfire.jxclient.stats.Stats.CS_STAT_GOD_NAME
static final int CS_STAT_GOD_NAME
Definition: Stats.java:335
com.realtime.crossfire.jxclient.stats.Stats.CS_STAT_SPEED
static final int CS_STAT_SPEED
Definition: Stats.java:134
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.newmap
boolean newmap
Definition: DefaultCrossfireServerConnection.java:191
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.ACL_PARTY
static final int ACL_PARTY
Definition: DefaultCrossfireServerConnection.java:133
com.realtime.crossfire.jxclient.stats.Stats.setStatInt4
void setStatInt4(final int stat, final int param)
Definition: Stats.java:1067
com.realtime.crossfire.jxclient.protocol.Map2.COORD_LAYER6
int COORD_LAYER6
Definition: Map2.java:94
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.ACL_MAP
static final int ACL_MAP
Definition: DefaultCrossfireServerConnection.java:138
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.parseNewCharInfoInformational
static void parseNewCharInfoInformational(@NotNull final String variableName, @NotNull final String values)
Definition: DefaultCrossfireServerConnection.java:2193
com.realtime.crossfire.jxclient.character
Definition: Choice.java:23
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.processComc
void processComc(@NotNull final ByteBuffer packet)
Definition: DefaultCrossfireServerConnection.java:2566
com.realtime.crossfire.jxclient.server.crossfire.AbstractCrossfireServerConnection.fireAddAccount
void fireAddAccount(@NotNull final CharacterInformation characterInformation)
Definition: AbstractCrossfireServerConnection.java:290
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.sendExamine
void sendExamine(final int tag)
Definition: DefaultCrossfireServerConnection.java:3705
com.realtime.crossfire.jxclient.protocol.UpdItem
Definition: UpdItem.java:29
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.pendingMapHeight
int pendingMapHeight
Definition: DefaultCrossfireServerConnection.java:203
com.realtime.crossfire.jxclient.stats.Stats.CS_STAT_ITEM_POWER
static final int CS_STAT_ITEM_POWER
Definition: Stats.java:346
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.processSkillInfoReplyinfo
void processSkillInfoReplyinfo(@NotNull final ByteBuffer packet)
Definition: DefaultCrossfireServerConnection.java:1797
com.realtime.crossfire.jxclient.server.socket.UnknownCommandException
Definition: UnknownCommandException.java:34
com.realtime.crossfire.jxclient.util.DebugWriter
Definition: DebugWriter.java:36
com.realtime.crossfire.jxclient.quests.QuestsManager.updateQuest
void updateQuest(final int code, final boolean end, @NotNull final String step)
Definition: QuestsManager.java:166
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.processAnim
void processAnim(@NotNull final ByteBuffer packet)
Definition: DefaultCrossfireServerConnection.java:2530
com.realtime.crossfire.jxclient.protocol.Map2.FACE_ANIMATION
int FACE_ANIMATION
Definition: Map2.java:114
com.realtime.crossfire.jxclient.guistate.GuiStateManager.setClientSocketState
void setClientSocketState(@NotNull final ClientSocketState clientSocketState, @NotNull final String param)
Definition: GuiStateManager.java:197
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.connect
void connect(@NotNull final String hostname, final int port)
Definition: DefaultCrossfireServerConnection.java:3991
com.realtime.crossfire.jxclient.protocol.Map2.ANIM_TYPE_SHIFT
int ANIM_TYPE_SHIFT
Definition: Map2.java:140
com.realtime.crossfire.jxclient.stats.Stats.CS_STAT_RACE_CON
static final int CS_STAT_RACE_CON
Definition: Stats.java:235
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.sendPendingRequestInfo
void sendPendingRequestInfo()
Definition: DefaultCrossfireServerConnection.java:4318
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.processStats
void processStats(@NotNull final ByteBuffer packet)
Definition: DefaultCrossfireServerConnection.java:3394
com.realtime.crossfire.jxclient.stats.Stats.CS_STAT_GOLEM_HP
static final int CS_STAT_GOLEM_HP
Definition: Stats.java:320
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.DEFAULT_MAP_WIDTH
static final int DEFAULT_MAP_WIDTH
Definition: DefaultCrossfireServerConnection.java:74
com.realtime.crossfire.jxclient.server.crossfire.AbstractCrossfireServerConnection.fireCommandSoundReceived
void fireCommandSoundReceived(final int x, final int y, final int num, final int type)
Definition: AbstractCrossfireServerConnection.java:382
com.realtime.crossfire.jxclient.server.crossfire.AbstractCrossfireServerConnection.firePickupChanged
void firePickupChanged(final int pickupOptions)
Definition: AbstractCrossfireServerConnection.java:364
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.getInt2
static int getInt2(@NotNull final ByteBuffer byteBuffer)
Definition: DefaultCrossfireServerConnection.java:4174
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.ACCOUNT_ADD_PLAYER_PREFIX
static final byte[] ACCOUNT_ADD_PLAYER_PREFIX
Definition: DefaultCrossfireServerConnection.java:252
com.realtime.crossfire.jxclient.stats.Stats.CS_STAT_BASE_INT
static final int CS_STAT_BASE_INT
Definition: Stats.java:255
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.model
final Model model
Definition: DefaultCrossfireServerConnection.java:170
com.realtime.crossfire.jxclient.server.socket.ClientSocketMonitorCommand
Definition: ClientSocketMonitorCommand.java:8
com.realtime.crossfire.jxclient.stats.Stats.CS_STAT_SP
static final int CS_STAT_SP
Definition: Stats.java:59
com.realtime.crossfire.jxclient.stats.Stats.CS_STAT_RACE_POW
static final int CS_STAT_RACE_POW
Definition: Stats.java:245
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.CREATE_PLAYER_PREFIX
static final byte[] CREATE_PLAYER_PREFIX
Definition: DefaultCrossfireServerConnection.java:267
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.processSkillExtraReplyinfo
void processSkillExtraReplyinfo(@NotNull final ByteBuffer packet)
Definition: DefaultCrossfireServerConnection.java:1852
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.sendReply
void sendReply(@NotNull final String text)
Definition: DefaultCrossfireServerConnection.java:3815
com.realtime.crossfire.jxclient.stats.Stats.CS_STAT_APPLIED_CON
static final int CS_STAT_APPLIED_CON
Definition: Stats.java:305
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.ACL_FACE_NUM
static final int ACL_FACE_NUM
Definition: DefaultCrossfireServerConnection.java:143
com.realtime.crossfire.jxclient.server.crossfire.NumLookObjects.getCurrentNumLookObjects
int getCurrentNumLookObjects()
Definition: NumLookObjects.java:234
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.fireMapClear
void fireMapClear(final int x, final int y)
Definition: DefaultCrossfireServerConnection.java:4270
com.realtime.crossfire.jxclient.server.crossfire.AbstractCrossfireServerConnection.fireReplySent
void fireReplySent()
Definition: AbstractCrossfireServerConnection.java:442
com.realtime.crossfire.jxclient.protocol.Map2.COORD_CLEAR_SPACE
int COORD_CLEAR_SPACE
Definition: Map2.java:54
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.EXAMINE_PREFIX
static final byte[] EXAMINE_PREFIX
Definition: DefaultCrossfireServerConnection.java:287
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.sendToggleextendedtext
void sendToggleextendedtext(@NotNull final int... types)
Definition: DefaultCrossfireServerConnection.java:3872
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.getStringDelimiter
static String getStringDelimiter(@NotNull final ByteBuffer byteBuffer, final char delimiter)
Definition: DefaultCrossfireServerConnection.java:4220
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.ACCOUNT_LOGIN_PREFIX
static final byte[] ACCOUNT_LOGIN_PREFIX
Definition: DefaultCrossfireServerConnection.java:242
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.TOGGLEEXTENDEDTEXT_PREFIX
static final byte[] TOGGLEEXTENDEDTEXT_PREFIX
Definition: DefaultCrossfireServerConnection.java:332
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.PATTERN_DOT
static final Pattern PATTERN_DOT
Definition: DefaultCrossfireServerConnection.java:91
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.numLookObjects
final NumLookObjects numLookObjects
Definition: DefaultCrossfireServerConnection.java:220
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.crossfireUpdateMapListener
CrossfireUpdateMapListener crossfireUpdateMapListener
Definition: DefaultCrossfireServerConnection.java:373
com.realtime.crossfire.jxclient.skills.SkillSet.addSkill
void addSkill(final int id, @NotNull final String skillName, final int face)
Definition: SkillSet.java:126
com.realtime.crossfire.jxclient.stats.Stats.CS_STAT_SKILLINFO
static final int CS_STAT_SKILLINFO
Definition: Stats.java:539
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.processClassListReplyinfo
void processClassListReplyinfo(@NotNull final ByteBuffer packet)
Definition: DefaultCrossfireServerConnection.java:2003
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.sendLock
void sendLock(final boolean val, final int tag)
Definition: DefaultCrossfireServerConnection.java:3719
com.realtime.crossfire.jxclient.protocol.UpdItem.UPD_NAME
int UPD_NAME
Definition: UpdItem.java:54
com.realtime.crossfire.jxclient.server.crossfire.NumLookObjects.connected
boolean connected
Definition: NumLookObjects.java:66
com.realtime.crossfire.jxclient.server.crossfire.Model.getAnimations
Animations getAnimations()
Definition: Model.java:165
com.realtime.crossfire.jxclient.stats.Stats.CS_STAT_WEAP_SP
static final int CS_STAT_WEAP_SP
Definition: Stats.java:149
com.realtime.crossfire.jxclient.stats.Stats.CS_STAT_EXP
static final int CS_STAT_EXP
Definition: Stats.java:99
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.MARK_PREFIX
static final byte[] MARK_PREFIX
Definition: DefaultCrossfireServerConnection.java:302
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection
Definition: DefaultCrossfireServerConnection.java:69
com.realtime.crossfire.jxclient.util.DebugWriter.debugProtocolWrite
void debugProtocolWrite(@NotNull final CharSequence str)
Definition: DebugWriter.java:68
com.realtime.crossfire.jxclient.stats
Definition: ActiveSkillWatcher.java:23
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.getInt4
static int getInt4(@NotNull final ByteBuffer byteBuffer)
Definition: DefaultCrossfireServerConnection.java:4184
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.INFO_MAP_NAME
static final int INFO_MAP_NAME
Definition: DefaultCrossfireServerConnection.java:153
com.realtime.crossfire.jxclient.spells
Definition: Spell.java:23
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.processPlayer
void processPlayer(@NotNull final ByteBuffer packet)
Definition: DefaultCrossfireServerConnection.java:3046
com.realtime.crossfire.jxclient.server.crossfire.DefaultCrossfireServerConnection.processMapExtended
void processMapExtended(@NotNull final ByteBuffer packet)
Definition: DefaultCrossfireServerConnection.java:2986
com.realtime.crossfire.jxclient.stats.Stats.CS_STAT_MAXSP
static final int CS_STAT_MAXSP
Definition: Stats.java:64