-
Notifications
You must be signed in to change notification settings - Fork 34
/
Copy pathCHANGES
3081 lines (2592 loc) · 153 KB
/
CHANGES
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
2011-01-11 GoldenKevin (revision 1)
Automatically created /trunk directory. We recommend you to put all your
code there
2011-01-22 GoldenKevin (revision 2)
* Initial import. Things currently working:
* Inter server communications between a central server and remote
servers.
* Loading of Item.wz, Map.wz, Mob.wz, Reactor.wz, Skill.wz, and
String.wz data files in KVJ format. MCDB support soon to come with XML
and WZ support planned in the long run.
* Game, login, and shop servers can listen and decode packets received
from MapleStory clients, but do not process anything yet. There has been
a little headway in login server packet handling.
* A code stub for a telnet acceptor on the center server. It accepts
connections but there are many things that need to be done before I can
even think about implementing commands on it.
Some more work has to be done on the actual client and server communications
frameworks, but once that is done, I will start working on implementing
packet handlers in the login server first. A lot of low level code was taken
from OdinMS-derived sources in order to speed up development. Thanks guys!
2011-01-22 GoldenKevin (revision 3)
* Added AGPLv3 license headers to all Java source files.
2011-01-23 GoldenKevin (revision 4)
* Removed "argonms.*.data.dir" for all client listening servers because it
is no longer used (Please specify the data directory with the System
property "argonms.data.dir")
* Added MCDB loading for maps data. Item data is soon to come followed by
the rest.
* Added error checking for KVJ loaders. When a piece of data doesn't exist,
the entry in the caches will be null and the load methods will no longer
throw FileNotFoundExceptions.
* String data now has to be preloaded on any server that uses it.
* Every data cache object now has a protected access modifier for all of
their mutator methods and for their constructor, while only their accessor
methods have public access. This way, the dynamically loaded data containing
these static cache objects cannot modify them for the other dynamic data
that use the same cache.
2011-01-23 GoldenKevin (revision 5)
* Finished MCDB data loader for items.
* Merged WzDatabaseConnection into DatabaseConnection.
* Refactored DatabaseConnection to be more efficient I suppose?
2011-01-25 GoldenKevin (revision 6)
* Added MCDB data loading for strings.
* Please note that a new version of KVJ compiler is released. Please
recompile all KVJ files!
* I think I forgot all about how ThreadLocal worked when I created those
MCDB data loading classes... anyway, the getWzConnection() is called at each
method call now instead of being stored as a single instance variable for
all threads.
* Made constructors of all data loaders to protected and added
(instance == null) check for every setInstance method just so nobody
"accidentally" creates more than one instance of those singleton classes. I
don't mistake you guys as idiots, it's just a safe programming practice.
* Added MCDB loading for mobs and skills and enabled loading for strings
(a whoops from the last revision).
* All data loaders have an canLoad() method now to check if the data for an
object exists (all except for String apparently). Note that this is not an
exists() method, i.e. MCDB skills will return true even if the skill does
not exist as long as there are other skills with the same 3 digit prefix. It
only determines whether a piece of data can be loaded.
* In Skill data loader, the player skill operations are now separated from
those of mob skills, as they rightfully should be.
* I'm really getting ahead of myself by adding a MapFactory instance
variable in argonms.game.WorldChannel.
2011-01-29 GoldenKevin (revision 7)
* Made some progress on the Telnet listener. Now special telnet chars
( > 0x7F) are handled properly and won't be in the ASCII string. Just a few
more tweaks to the way some ASCII chars are handled and it will be ready...
* Fixed NullPointerException in SkillDataLoader.
* Fixed MCDB loading of mobs and skills.
* Added classes for inventory (items, equips, pets, rings, etc.) and moved
Player class from argonms.game to argonms.character.
* Support for KvjCompiler r14. Changes include Character.wz compiling and
reduced size of Mob files.
* Character.wz is now processed in KvjItemDataLoader. Taming Mob IDs are now
read in McdbItemDataLoader as well. In McdbItemDataLoader, equips can now be
made tradeBlocked.
2011-02-04 GoldenKevin (revision 8)
* Fixed some inconsistencies when passing java.awt.Point/(x,y) parameters to
mutator methods in data loader objects. Now all parameters are passed as
x and y integers to reduce imports.
* Renamed IItem to InventorySlot. Equips don't have any bonuses for "hands"
so that was removed from the Equip class. Inventory class now implemented.
Pets now are implemented and Rings have been updated.
* Player class has been implemented enough for Login Server usage. Some code
was copied directly from OdinMS, so some stuff needed for the Game Server
do not work yet or are inefficient (ahem, MapleMap.nearestSpawnPoint).
* Login server now has matured to a point where the client can be
transferred to the game server! Characters can be created and loaded from
world charlists and global charlists. Fixed some
ArrayIndexOutOfBoundExceptions caused by off by one errors.
* Refactored Game Server accept in Login Server. Now the IP address of each
world is resolved upon their connection so we won't have to do it every time
a client selects a character in the Login Server.
* GameClient has been updated. There are small stubs of code for Game Server
loading of a player (copied directly from OdinMS), although there's still a
long way before the player can actually be placed in a map.
* Added a CheatTracker class that does... nothing! Yet.
2011-02-12 GoldenKevin (revision 9)
* Fixed logging of unhandled packets from clients.
* Moved argonms.net.client.ClientLoginPacketProcessor
to argonms.login.ClientLoginPacketProcessor
* Moved argonms.net.client.ClientGamePacketProcessor
to argonms.game.ClientGamePacketProcessor
* Moved argonms.net.client.ClientShopPacketProcessor
to argonms.shop.ClientShopPacketProcessor
* Moved several constants from KvjEffects to StatEffects because their use
wasn't limited to KVJ effects loading.
* Added accessor methods to MobSkillEffect and StatEffects. Lt and Rb
mutator methods for MobSkillEffects now accept two shorts instead of a Point
* Fixed negative array index size occurring when packet length was greater
than the maximum value (127) of a signed 8-bit integer (byte).
* Fixed finding the next free item position in inventory
(Inventory.getFreeSlots). First item is 1, not 0!
* Added Taming Mobs/Mounts as another inventory item type. Hopefully, this
should be the last one as the inheritance for InventorySlot is getting
complicated...
* Player can now enter a map in the GameServer. While they can move, they
can't see other players and other players can't see them. They cannot
interact with anything or change maps/channels and there are no spawns for
NPCs/Mobs. All of these additions will come gradually.
2011-02-19 GoldenKevin (revision 10)
* Fixed bug in LittleEndianByteArrayWriter. If a large enough byte array was
copied to a small buffer, there was an ArrayIndexOutOfBoundsException. Also,
a one byte long LittleEndianByteArrayWriter can now grow!
* Renamed MapleMap to GameMap.
* You can now see other players moving around in a map (you can't see them
attacking yet though). NPCs are visible (at least in map 0), but I think
mobs currently crash clients. Portals still don't work yet... A lot of
credit should go to OdinMS for this particular update!
* Made some progress on making a scripting interface for NPCs. I think I
might actually write my own language if I don't find ways to circumvent my
current issues with it. A sample 2100.js script is included.
* Added code stubs for NPC shops. It should be easy to implement later on.
* Refactored map object related code. Players now keep their charid in the
MapObject class (referred to as an "object id"). I think MapObjects are a
bit more modular/OO now...
* Fixed bug where an account was recorded as being logged in even if their
login attempt was not successful. Also fixed a client error reading bug.
* canLoad methods for the data loaders now check if the stats are in the
cache before delving into their IO routines.
* And a whole lot of other bug fixes/improvements on things that I was not
able to spot before.
Kvj structure updated - Update your KvjCompiler and recompile your data.
Consult the KvjBin changelog to see a list of changes in r15.
2011-02-21 GoldenKevin (revision 11)
* Improved "say" commands for NPC scripts. Now the "prev" button is handled
correctly, although you have to keep in mind special cases and limitations.
(read the comments in NpcConversationActions for more details).
* Mozilla's latest version of Rhino (1.72R2) is now used instead of Java 6's
modified version 1.6R2 in javax.script. 1.72R2 is much more flexible and
contains features that I needed for efficient stateless NPC scripts. Now
endChat hooks are supported and each NPC script doesn't require a dedicated
thread anymore. Updated Sera script to show a bit of it's capabilities.
(you don't have to have a endChat function and scripts don't need any
functions. Just be sure to call the function in the global scope if you do
want to invoke one). Be sure your classpath now includes Rhino's js.jar.
* A bunch of other code stubs for map/channel changing, and for channel
variables (e.g. exp, meso, and drop rates) that I will finish in the future.
Some routines that were previously LoginClient specific are now common.
2011-02-23 GoldenKevin (revision 12)
* Replaced isSealed() checks with our own boolean instance variable in
NpcConversationActions. I realized you can't seal it before throwing the
continuation, but I can't throw the continuation before sealing it. I didn't
catch this before because it's a very rare occurrence to have the script
forcefully halted while in the middle of evaluation (and not while waiting
for a response) - Rhino/JavaScript isn't THAT slow. I'm probably going to
have to also synchronize the terminated variable, but I will leave it the
way it is until I start get cases of it acting up.
* NpcConversationActions.askAvatar now returns the player's selection.
* Some InventorySlot changes. Unique IDs are now long. Corrected pet packet
structure - footholds are now short, and the other two bytes were actually
bools. Ring's partnerRingUid are now long (even though the current packet
structure for rings gives it as an int).
* Renamed GameHandler to GameEnterHandler to disambiguate it's purpose
somewhat (since it handles connections and map entering).
* Completely rewrote interserver communication to accommodate splitted
worlds, i.e. so that all channels of one world don't have to be running on
the same process (so that channels can be spread out across many servers).
Modified game0.properties, game1.properties, and added game2.properties to
demonstrate how to use the new features.
* Restructured classes for interserver communications. Classes only required
by the Center Server are now in the argonms.center package, and only the
classes required by the remote servers (e.g. abstract classes) or required
by both the Center Server and remote servers (e.g. packet header values) are
located in argonms.net.server. Many classes have been renamed and overall
there has been a huge refactoring in the structure.
2011-02-23 GoldenKevin (revision 13)
* Some code cleanup after that large revision I just previously committed.
* Channel changing is now supported. Portals can now be entered and you will
be properly warped (clients still crash when they encounter mobs though, I'm
working on that fix right now...)
* Renamed argonms.game.npcscript to argonms.game.script. Added a new class
for Portal scripts and updated NpcScriptManager with quest script stubs in
order to support quests in the future.
2011-02-27 GoldenKevin (revision 14)
* KvjCompiler has been updated to r16, which fixes Skill.wz compiling.
* Renamed MapObject (and related classes) to MapEntity to disambiguate any
confusion with Java objects. In a language where pretty much everything is
an object, Entity suggests something more real and existential.
* Fixed an oversight in Inventory.getFreeSlots. Added a canFitEntirely in
InventoryTools in case we want to check if an item fits completely before
calling InventoryTools.addToInventory (whose behavior is to fit as many as
possible). Changed the return type of addToInventory to accommodate another
usage for it. Fixed InventoryTools.equip, overloaded unequip to support
cases where we want to fetch the next available slot, added isEquip(int) to
replace usages of getCategory(int).equals("Equip"), added isTwoHanded and
getWeaponType for future updates, and getCategory now returns an
InventoryType (original method has been renamed to getCategoryName).
* Mobs don't crash the game anymore, and are animated. Other players still
cannot see when you attack them (or if you just swing your weapon), and you
still cannot hurt them. Attack parsing/processing is very complicated and
will take some time to be completed.
* Skill levels of players are now saved to the database.
SkillLevel accessor methods now return byte values.
* Fixed Player.isVisible() returning the opposite value.
* Items and mesos can now be dropped and picked up by players, and will
expire properly. Fixed some visual glitches in ItemDrop. It should work with
mob drops as well, but I still can't attack them so I can't test it (player
inventories don't show change in meso values unless they relog because I
still haven't coded stat updates, but they are modified internally).
* Got the real packet send opcode for removing NPCs from a map using a
little bit of educated guessing (I'm surprised that Vana and the more
popular flavors of OdinMS haven't figured this one out yet). Also, NPCs now
send their control packet to every player that joins the map (why do we have
to do that?)
* Only users with elevated privileges can use the /m command to change maps.
* Fixed the access modifier of LittleEndianReader.skip. It should be public!
2011-02-27 GoldenKevin (revision 15)
* Fixed bug with InventoryTools.equip when equipping shields or two handed
weapons.
* I realized how broken endConversation still is. I guess we can only hope
that there are no blocking operations in the scripts and that there we would
be a quick call to any one of the NpcConversationAction methods that throw
a ContinuationPending so that we can dispose of the script, because from
what I see, there is no way to interrupt an executing script.
* Replaced synchronized blocks in GameMap with a ReentrantReadWriteLock for
better performance with the read heavy Collections. Hopefully I know my
concurrency stuff and we won't have deadlocks arising from this update...
* Renamed MapEntity.getShowObjectMessage to getShowEntityMessage. Missed
that one when I went through the renaming sweep...
* Replaced PortalActions' Player instance variable with a GameClient one.
If the PortalActions object somehow survived and the Player would not be
garbage collected as a result of that one reference, it would be cheaper to
keep a GameClient instead of a Player object. I could have used a
WeakReference<Player>, but I think a GameClient instance is more useful
than a Player instance in the Portal's context anyway.
* WeakReference<Player> is now used for Mob controller references in case
a mob is still alive when the Player leaves the server. I'm not sure how I
will use highestDamageKiller, so that still is a regular Player reference.
* Fixed some instantiations of LittleEndianByteArrayWriter to use the
correct amount of bytes when using the constructor that specifies the array
size. Forgot to update some of them when I rewrote inter server comms.
* Fixed logging for RemoteServerListener and the problem with swallowing
exceptions. Forgot to update logging.properties when I rearranged classes
involving inter server communication.
2011-02-27 GoldenKevin (revision 16)
I played around with SVN special properties a bit, and made these changes
(Subversion/auto-props is awesome):
* Bash scripts for Linux now have the property "svn:executable" set.
* Added "svn:eol-style" properties that make sense for each text file -
e.g. CHANGES, LICENSE, *.properties, *.sql, *.java, and *.js files are set
to native; *.bat are set to CRLF; and *.sh are set to LF. Any new text files
will also have these eol-styles based on their file extension/file name
* Added svn:mime-type to most files (except .bat and .sh files, because they
have mime types beginning with "application/", and that wouldn't work out
too well with SVN's handling of diffs). *.jar files now have a mime-type of
application/java-archive instead of the generic application/octet-stream.
2011-03-04 GoldenKevin (revision 17)
* Fixed Player pets not showing to rest of map, and NPC control packets not
being sent to players. Packets had to be sent separately and could not be
combined, so now MapEntity.getShowEntityMessage() and getCreationMessage()
return an array of byte arrays (and their method names are now plural!) It
may have a performance penalty for any entity that didn't send multiple
packets when spawned, but it should increase performance of Player and NPC
spawns (no more copying arrays). NPCs are now animated.
* Fixed non-ranged entities not sending their creation packet to everyone in
the map, and ranged entities sending their creation packet to everyone in
the map (yep, I had them swapped).
* Added a convenience method for writing a 4-byte Point to a stream and for
reading such a Point from a stream. Refactored code accordingly.
* PlayerLog now uses two ConcurrentHashMaps instead of monitor synchronized
vanilla HashMaps to reduce complexity and hopefully improve performance.
* Updated GameMap to use a separate ReadWriteLock for each Collection to
improve performance (also fixes a deadlock when respawning monsters).
* Somewhat solved the Center server concurrency issues by only allowing
one server to connect at a time so that when servers that need to notify
each other connect at the exact same time, they will not potentially miss a
message. Also, added a disconnected variable in CenterRemoteInterface in
case a server disconnects while there is a read going on (and we have to
wait for a write lock before we are able to remove/null the server).
* Channels now send their actual load instead of just an increment/decrement
notification. This is in case a login server disconnects and reconnects and
they don't know the previous loads. Will decrease performance somewhat
because we have to call size() on a ConcurrentHashMap in PlayerLog instead
of being able to send a constant true or false...
* Renamed disconnect methods to disconnected to avoid possible confusion.
* Fixed error in Kvj Skill.wz loading caused by prop being read an int
instead of a short.
* Monsters can now die from regular melee attacks. Skills, magic attacks,
and arrow/star/bullet attacks still are still not handled yet. Respawning
seems to be bugged, so I'll have to fix that up. Players still do not take
damage from mobs, so I'll be working on that as well.
* Inventory mesos count is now updated when you drop/pick up mesos.
* Renamed argonms.loading.StatEffects to StatEffectsData and moved all of
its constants to the class argonms.StatEffect. Likewise renamed ItemEffect
and SkillEffect to ItemEffectsData and SkillEffectsData respectively.
* Cooldowns should be handled properly once implemented. Execute the updated
SQL so that you won't get database exceptions when loading/saving characters
2011-03-12 GoldenKevin (revision 18)
* Fixed items dropped by players not having the correct quantity.
* Mobs now spawn first at the SpawnPoint with the lowest amount of mobs
alive (or, whichever has the lowest nextPossibleSpawn if there are any that
have the same amount alive), not the first spawn that was added to the map.
* Improved some methods in LittleEndianReader and LittleEndianWriter. Bytes
are now buffered more so that for most methods, only one method is called
and is passed a byte array, instead of many methods being called that pass
individual bytes. Avoids invocation overhead, and there is only one bounds
check for ByteArrayWriter and faster performance for StreamWriter/Reader.
* Fixed query errors when saving/loading pets.
* Get slot max now returns 1 for pet items (if not loading from MCDB).
* Optimized HexTool a little bit.
* Added a stub for a command processor. Any chats that begin with an
exclamation point (!) or an at sign (@) will not be broadcast, and will be
sent to CommandProcessor.process(), which does nothing at the moment.
2011-03-21 GoldenKevin (revision 19)
* Fixed some bottlenecks in LittleEndianReader and LittleEndianWriter that
resulted from the last update. When reading strings, we assume it is ASCII,
so we can just assume a char is only one byte, avoiding the overhead of
CharSet for encoding. Reading and writing 16-bit and 32-bit integers by
copying an array is faster for Stream I/O, but the old methods worked faster
for byte arrays. Therefore, I overloaded the read/write int and
read/write short methods in the byte array reader/writer classes.
* Fixed issue where you couldn't do anything after you visited a scripted
portal that doesn't warp you anywhere (added PortalActions.abortWarp).
* Portals point to a null map if they do not have a tm property (previously,
they pointed to map 0, which is a perfectly valid map, but is probably
unintended).
* Added NPCs that will warp you from the Mushroom Town Training Camp to the
outside world.
* Updated KvjBin to r17. Major changes include the inclusion of mob summons
data needed for a mob skill, the lowering of the word size of several
integer properties, and custom mob drops. MCDB should also be able to load
mob summons data. KvjCompiler has been tweaked as well, and all crashes and
freezes should be fixed (I performed a full compile with no errors).
* Fixed loading of mobs. When I fixed player skill's prop reading, I forgot
about making the same change in mob skills.
* Preparing for the inclusion of mob player-diseases and mob self-buffs.
* Added preliminary take damage handler. All physical mob attacks should be
handled correctly. No mob skills should be handled correctly at all. Healing
through standing still now changes your hp/mp accordingly.
* Facial expressions should now broadcast to the map.
* MCDB now loads mob attacks. Also fixed several bugs in MCDB (mob) loading.
* Refactored MapEntity.getShowEntityMessage/getCreationMessage. Now only a
byte array is returned, and we send the extra data in the GameMap methods
in order to speed up sending data for map entities that do not have extra
packets that need to be sent.
2011-03-24 GoldenKevin (revision 20)
* Refactored player buffs and diseases. Combined them into a single
PlayerStatusEffect. MobSkillEffectsData is now related to SkillEffectsData
(which has been renamed to PlayerSkillEffectsData) and ItemEffectsData.
* Modified GameMap to take advantage of several new classes that I wrote so
I could remove all the lock instance data, which helps declutter it. I only
added documentation for Lockable(Hash)Map, but I'm sure you can infer what
the other similar classes do once you read through that.
* Fixed NullPointerException in login server when a game server is closed
after it has connected to the center server but before it is ready/online.
It was an issue in the center server code that I overlooked...
* Tidied up the encryption/decryption routines to conform more to my
standards.
* All creations of a Random instance and every call to Math.random has been
replaced with a call to a centralized Rng class. The class is ThreadLocal,
so it should perform a slight bit better than Math.random when there are
many concurrent calls, and should reduce the amount of instantiations of
Random as it is now one instance per thread.
2011-04-04 GoldenKevin (revision 21)
(argonms.jar WILL NO LONGER BE RECOMPILED IN EVERY REVISION. THIS BLOATS
THE SVN REPOSITORY, SO FROM NOW ON, YOU WILL HAVE TO BUILD IT YOURSELF FROM
NETBEANS OR EXPORT A .JAR FILE IN ECLIPSE). If your NetBeans project is not
named argonms, you may have to rename the .jar file when you compile it.
* Renamed all buff methods in Mob to effect to be consistent with Player
class and because not on effects placed on monsters are buffs, i.e. debuffs.
* Player disease cancels are now removed when a player logs off.
* All methods in PlayerScriptInteraction are to be in third person when
dealing with actions done to the player to be consistent with mobs and
other map life, as the script performs actions on the player. The script
should not be the player.
* Reorganized some code: moved mob drop routines from GameMap to Mob;
reordered and added gain/set methods of Player in a logical manner;
Added more PlayerJob and Skills constants; PlayerStatusEffectValues cleaned;
PlayerScriptInteraction is the ancestor of NpcConversationActions and
PortalActions (both of which are no longer static classes);
PortalScriptManager.runScript now returns a boolean, which is changed by
PortalActions.abortWarp (instead of sending CommonPackets.writeEnableActions
in abortWarp, the call to it is now handled by the caller of runScript);
split CommonPackets.writeShowItemGain into writeShowItemGainFromQuest and
removed inChat variable; Merging of header and body in ClientListener gone,
we just send the header and the body arrays to ChannelBuffers.copiedBuffer.
Although we still have to eventually merge the two arrays by copying, it
makes our own code tidier as the copying logic is done elsewhere; Reordered
CommonPackets methods; Added constants to ItemDrop to deal with magic nums.
* Added a writeStyledChat method in GameChatHandler. This will probably be
the only "fun" feature I add to this source in a long time.
* Added support to specify scripts directory from a command line option.
This was necessary for the proper functioning of the ArgonMS GUI Launcher.
* Fixed any glitches that would have occurred for account item storage/
account cash shop storage. An update to your SQL database is necessary.
* Implemented CommandProcessor with an implementation that isn't the most
efficient, but is better designed than alternatives. In order to create a
command definition, you must specify the help text with it.
* Item drop packet is more accurate.
* Mobs now give exp when they die, and I believe level up and the stat gains
that are associated with it work properly. Still gotta implement exp loss
when a player dies...
* Enabled GameRegistry. Properties are now loaded from game#.properties, and
so far getExpRate(), getDropRate(), getMesoRate(), and doMultiLevel() are
used somewhere on the game server.
* Fixed drop placement from mob deaths.
2011-04-06 GoldenKevin (revision 22)
* Added help message to !rate command.
* Fixed freakish positioning of drops when dropping on a rope or in the air.
* Show inventory full message when picking up a drop and inventory is full.
* Fixed deadlock when item drops expired.
* Random.nextDouble methods used in MobStats for chance calculations are now
replaced with nextInt. Should now be less biased and maybe faster (both of
which are results of having fewer floating point operations).
* Fixed issue with mob drops where the items don't appear to come from the
mob (they just rose and fell in the x coordinate that they rest in, not from
the mob's center).
2011-04-06 GoldenKevin (revision 23)
* Mobs now show HP bar when attacked (and boss HP bar should show up to the
whole map, but it's untested as of commit time).
* Reorganized mob drop routines to allow and take advantage of code reuse
when reactor drops are implemented. These functions are now in GameMap.
* Self destructing mobs will now show the correct animation and will die at
the proper HP impetus.
* Fixed bug when using the command /m 0. Incorrectly recognized as a death
warp. Also fixed unnecessary writeEnableActions that are sent to the client
no matter the result of a portal warp (forgot to return the value returned
by enterPortal(Player, PortalData) in enterPortal(Player, String) if the
search for a portal with a matching name was found). I think clients are
stuck waiting for a response when using the /m command, so if the client
does not have sufficient privileges or just does not warp, it is sent a
writeEnableActions.
* Players will be sent to their forced return map when they log in if their
map has one (it's better than sending them to the forced return map when
they log off because in the case the server crashes, they still will be
warped back the next time they log back on).
* Added decrease HP tasks that are present in several maps, as well as a
map time limit task. The implementations may leak memory, so I'm going to
profile them later (Stupid ScheduledFuture.cancel).
* Players going through the Mushroom Town Training Camp or the Showa Spa
will be given the appropriate costumes.
2011-04-10 GoldenKevin (revision 24)
* Don't explode Mob if one hit KO'ed.
* Fixed bug where a player was unable to warp if they picked up mesos.
* Players will not pick up meso drops if it makes them exceed the maximum
amount (2147483647).
* Added a meso option to the !stat command. Values greater than 2147483647
will no longer throw a NumberFormatException on the server, but instead will
send a syntax message to the client.
* Cleaned up time limit stuff in GameMap. The clock is automatically removed
by the client when the player changes maps, so we don't have to send the
clock close message.
* Tentative fix for visible ranged map entities disappearing when jumping
down. May need tweaking in the future.
* Renamed any remnants of variables/methods with names based on map entity's
previous name of map object in order to eliminate any confusion.
* Made Player.visibleEntities a LockableList as there is a possibility of
concurrent access from GameMap and from Player on different threads.
* Temporary fix for client freeze when multiple map item drops visibly
disappear at the exact same time. Will need further testing to get to the
root of the problem. The current fix suggests that the underlying problem is
a thread concurrency problem.
* Slightly optimized WorldlistHandler.loadCharacters so only one database
query is needed.
* Updated argon.sql again because I forgot to specify the constraint for
`inventoryitems`.`accountid`.
* Some refactoring in GameMap - drop(ItemDrop) is no longer public and must
be indirectly called by the public overloaded drop methods.
* No longer show "You have gained +-x mesos" when dropping mesos.
2011-04-13 GoldenKevin (revision 25)
* Added support for modifications of the key map.
* Renamed GamePlayerHandler to GamePlayerMiscHandler.
* Starting to code support for castable/usable/consumable skills/items.
Added support for:
* Magic Guard
* Hide (which was half coded in already anyway)
* And the parts of any skill that generically increases [m|w][atk|def],
speed, jump, etc.
* Fixed MCDB skill data loading adding every effect for any skill.
* Fixed a lot of StatusEffectsData problems. Please update to KvjBin r18 and
recompile your Skill.wz and Item.wz.
* You can cast and cancel buff skills and items (including Hide, which
should be applied to every GM when they log in). Whether the skill/item
actually buffs you is a whole 'nother story. Working on them at the moment
though...
* Potions that simply heal your HP or MP should work.
* Hide actually makes you appear like you're in Dark Sight, but you can
still cast skills and attack (credits to Vana for that one).
* There is now a distinction between a Player's base stats and his stats
adjusted with buffs. The current implementation works, but it's not perfect
yet (still looking for any alternatives that may be faster), so watk, wdef,
matk, mdef, acc, eva, hands, speed, and jump bonuses from skills and equips;
str, dex, int, luk, hp, and mp bonuses from equips; and hp and mp percentage
based increases from hyperbody are now recognized on the server. Str, dex,
int, and luk are under the assumption that all bonuses are by addition only,
(i.e. no percentages). If any percentage based bonuses are introduced for
those aforementioned stats, then they will have to use similar routines to
those of maxHp and maxMp (albeit without the remHp and remMp checks).
* Added support for pings being sent to idle connections.
* Enabled TCP_NO_DELAY (disabling Nagle's Algorithm) because it caused some
noticeable latency when connecting from anywhere besides localhost
(especially demonstrated by a monster dropping multiple items).
* Fixed a frequent source of NullPointerExceptions in TakeDamageHandler.
* Fixed ranged monsters not appearing when a player warps to a map and warps
back.
* Added !skill and !give commands for GMs. "!stat set exp 0" now works if
you are level 200.
2011-04-14 GoldenKevin (revision 26)
* Renamed package argonms.net.client to argonms.net.external and
argonms.net.server to argonms.net.internal. Thus, external refers to any
communications with a MapleStory client, while internal refers to inter-
server communications with other servers that use the ArgonMS protocol.
* Distributed all classes from argonms.net.external.handler into packages
specific for each type of server (i.e. argonms.game/login/shop.handler).
2011-04-20 GoldenKevin (revision 27)
* Moved argonms.tools.Pair to argonms.tools.collections.Pair, and got rid of
its accessor and mutator methods. left and right values of a Pair are now
immutable and can be directly accessed by the public members left and right.
* Updated logging.properties to refer to the new locations of some classes.
* Added a !spawn command.
* Added a !tp command to teleport one player to another, and an !info
command that gives the location of a player. Both require that any
referenced characters are on the same channel as the caller.
(PlayerLog.getPlayer(String) is now case insensitive).
* Fixed "!stat set exp 0" at level 200.
* Replaced usages of Pair<List<String>, List<String>> in InventoryTools with
the more semantical and succinct static nested class UpdatedSlots.
* Consume on pickup items should now function correctly.
* Standardized methods for getting the WZ identifier of certain entities, as
well as maps themselves (e.g. Mob.getMobId() is now Mob.getDataId()).
* Added a getDataId() method to Player even though it returns the same value
as getId() at the moment. Will make future refactoring easier if I choose to
differentiate between a Player's database character id and the Player's map
entity id.
* Renamed MapEntity.MapEntityType to EntityType.
* GameMap.entities is now split up into separate entity pools since the
client has separate pools for each entity type. Should solve some issues
with entity id exhaustion on busy maps (and remove the artificial limit of
30000 non-Player entities per map). The SQL has been updated to reflect
these changes on the Player's side.
* Readded foothold IDs to the data. KvjCompiler updated to r19. Please
recompile your Map.wz.
* Equips from monster drops now have randomized stats.
* Fixed some monster drop issues when dropping certain equips.
* Added Miniroom and PlayerShop map entity stub classes. HiredMerchant
extends PlayerShop now instead of Npc.
* Fixed mob deaths when using MCDB.
2011-04-22 GoldenKevin (revision 28)
* Moved !spawn command into a separate class.
* Added a !id command to look up the data ID of an object based on its name.
* Implemented player NPC packets. Still haven't worked on saving/loading and
the placement of them though (I provided a !playernpc command to create a
temporary one of yourself).
* Fixed up NPC packets. writeShowNpc is redundant if we send writeControlNpc
Renamed writeControlNpc to writeShowAndControlNpc. Fixed removing NPCs (we
have to call writeStopControlAndRemoveNpc instead of just plain
writeRemoveNpc, which only works if we wrote writeShowNpc to spawn the NPC).
* Player NPCs and regular NPCs share the same entity pool. Removed
EntityType.PLAYER_NPC.
* Mobs begin immediately animating when a player leaves hide. Although they
will still continue animating even after the player goes into hide until the
player changes maps.
* Spawned NPCs now are in the direction of the player when it was spawned.
* Fixed issues with mobs not animating when a player enters a map.
* No more unhandled packet messages when passing by a Maple TV.
* Combined several EntityTypes that I believe would be in the same entity
pool on the client. Now, the entity types that were combined have a more
specific sub entity type to identify each distinct map entity.
* Reorganized miniroom stuff in a more sensical manner.
* Modified the behavior of map entities, and made the usages of isAlive()
and isVisible() more standardized. Ranged entities are added to the Player's
visible map entities when spawned (instead of when the Player starts moving)
and moving mobs will be included in the Player's visible map entities if
they move toward the Player's view. Dead ranged entities are now removed
from a Player's visible map entities.
* Reactors are now visible, although you can't destroy them.
2011-04-25 GoldenKevin (revision 29)
* Locked some more things that needed locking in GameMap.
* StringDataLoader has been brought up to the standards of the rest of the
DataLoaders. Optimized McdbStringDataLoader.
* Started adding support for KvJ Quest.wz loading. Update to KvjBin r22.
MCDB Quest loading soon to come (so far, the names of quests are loaded in
MCDB so you can perform an ID lookup on them through the !id command).
Quests are preloaded unconditionally (like Strings) because Quest.wz
contains too few files (and each of which are relatively small) to justify
any checking to see if a piece of data has been loaded or not and any
synchronization overhead.
* Fixed hide expiring immediately when using MCDB.
* Made quite a lot of headway into implementing quests. Finished many code
stubs. There is still a lot to do (not all QuestRewards are done and not all
QuestChecks are performed) and quests that rely on the destruction of
reactors are not finishable at the moment.
* Fixed expiredate field in the inventoryitems table. It is now a 8-byte
integer instead of a 4-byte one. Added queststatuses and questmobprogress
tables for saving a player's quest progress. Please update your database.
* Added a PacketSubHeaders class. Read the class javadoc for more info.
* The assorted timestamps that are sent to clients are now adjusted
according to the server's time zone upon server start. Previously, each
timestamp was in UTC time.
* Added quest scripts for Roger's Apple.
2011-04-27 GoldenKevin (revision 30)
* Fixed McdbItemDataLoader so that it works when using a clean MCDB 3.0.
Sorry, I forgot that my MCDB schema was customized to include additional
information that is not present in the clean dump.
* Refactored mob req stuff for quest status. No need to keep a copy of the
mob reqs in each quest entry... Every quest completion requirement is now
checked, and if the Player satisfies all of them, he will receive the proper
"Quest completed" notification. Implementation-wise, I'm basically doing a
two way mapping between quests and their requirements in the Player class.
* Item quest actions now function properly. Items can be given or taken away
with the right quantity and the right notifications are sent to the client.
* Implemented as much of McdbQuestDataLoader that I can. The clean MCDB
quest data tables don't give me much to work with.
* Implemented reactors. I tested it on several simple ones (such as 2000 in
Amherst for Pio's quest) but I haven't tried any item triggered or touch
triggered reactors yet. Also added reactor scripts in case you want to
perform some kind of specific action when a reactor is destroyed (or
triggered to the end).
* Split writeInventoryAddSlot from CommonPackets.writeInventorySlotUpdate as
the two actions are relatively unrelated and there's no reason to have them
combined in one method.
2011-05-03 GoldenKevin (revision 31)
* Skills and buff items should now expire properly.
* Refactored StatusEffectTools and the Player class' interface for applying
effects. StatusEffectTools now only contains common methods that all types
of status effects (i.e. buff skills, buff items, debuffs from monsters).
The specific behaviors for the aforementioned status effects are now split
into their own classes.
* Mob skill IDs are now represented internally as 2-bytes (short) instead of
4-bytes (int). In order to simplify compiling of Skill.wz in KvjCompiler,
mob skill IDs are still 4-bytes on the KVJ files (and are just downcasted).
* Fixed unable to warp bug following a skill cast.
* Fixed reactor and player drops being dropped from the wrong place if a mob
with the same entity ID was visible on the map.
* Added more definitions to PlayerJob.
* Made some progress on ranged attacks (still nothing on magic attacks yet).
* Rechargeable ammo (stars, bullets) are now a special case in the inventory
manipulation functions in InventoryTools. Adding rechargeable items to the
inventory will not change the quantity of non-full items that share the same
item ID, and removing rechargeable items will not clear the slot if the new
quantity equals 0.
* Quest requirement watching in Player should perform a bit better now.
2011-05-05 GoldenKevin (revision 32)
* Messages are now sent to players on the same map when a player changes
their equipment.
* Added some sort of consistency to enum getValue/valueOf method names.
PlayerStatusEffect keys have been renamed for consistency and to match with
Java's standard naming convention for constants (i.e. underscores for names
with spaces), and some to match with the source skill's name.
* Every player on a map should be sent the buffs of a player that enters the
map once that player enters (CommonPackets.writeShowPlayer). This method,
like writeUseSkill, writeGiveDebuff, writeBuffMapEffect, and
writeDebuffMapEffect, is extremely buggy and will crash clients pretty
frequently. If you can reproduce any crashes resulting from buffs/debuffs,
just send me a report of what skills were being used.
* Fixed up attack skills A LOT. Meso explosion works perfectly fine, and I
perfected my procedures through Vana inspirations and extensive testing.
Note that this is only for ranged and melee attacks as of the moment, and
summons, magic, and energy charge are not yet handled properly.
* Fixed attacking when shadow stars is active.
* Fixed cooldown saving in Player giving errors.
2011-05-07 GoldenKevin (revision 33)
* Merged BuffsData file into StatusEffectsData, while preserving the
BuffsData class itself as an inner class for better organization.
* Made some progress with mob status effects (player skills that give mobs
debuffs, and mob skills that give the mob buffs). Still far from complete.
* Renamed SkillTools.useBuffSkill to useCastSkill and readded duration check
because not all skills that pass through GameBuffHandler.handleUseSkill is a
buff (e.g. heal).
* Cleaned up DealDamageHandler. Removed AmmoType enum and replaced it with a
WeaponClass enum to match with the packet. Had to remove some ammo checks,
but it is better designed and is less redundant (use info that client gave).
* Removed unnecessary things from mob skill stats.
2011-05-08 GoldenKevin (revision 34)
* Fixed Roger's Apple giving the completion message at the wrong time.
* Support for the various flavors of MP Eater.
* Support for magic attacks. Much easier than I anticipated.
* Support for !skill command to set a skill level to 0 (remove the skill).
* Support for energy charge. It works for all weapons and jobs, so if
somebody ever adds in a rebirth system, you better consider that.
* DealDamageHandler now reports the correct mastery level of a player when
sending attack packets to the map.
* Supposedly added support for summon attacks, but I have no idea if it
works since I didn't even implement summons yet. =P Nonetheless, that should
make DealDamageHandler *nearly* feature complete.
* Fixed stars/bullets being removed from inventory when exhausted. Stars
show properly to other players on map.
* Fixed MCDB loaded skills and quests.
2011-05-08 GoldenKevin (revision 35)
* Fixed quests not starting if they required the Player to have not started
a different quest, and that Player did not forfeit it.
* Fixed no mob respawns occurring in a map with few mob spawn points.
* Added a !town command for quick access to some maps without having to look
up the map id for it.
* Support for cooldowns. Moved cooldown stuff to SkillTools.skillCastCosts
as cooldowns are common for both attack skills and castable skills.
* Cleaned up DealDamageHandler. We are given attackCount in the packet, so
no need to recalculate that. Also, just store projectile item id in the
AttackInfo structure so we don't have to pass it to the packet methods. Cash
stars had precedence over the actual stars, so we should check the item IDs
for cash stars after we check the regular ones.
2011-05-15 GoldenKevin (revision 36)
* KvjBin updated to r24.
* Support for prepared skills, which include every keydown attack skills, as
well as non-attacking skills like monster magnet and Chakra, and non-keydown
attack skill like explosion (FP mage skill). All keydown skills are prepared
but not all prepared skills are keydown? I don't understand the difference
between them, but the game apparently does since only keydown skills give a
charge integer in the attack packet (DealDamageHandler).
* Some skill cast visual effects (like the eye that appears when a player
casts Focus) that previously did not show now show.
* Full support for Monster Magnet, Chakra, and Dash.
* Fixed players that just entered a map seeing full Energy Charge on players
with only a partial charge. Energy charge is not stored in Player's
activeEffects until it reaches full charge.
* Process summon types for summon skills in SkillDataLoader. Full support
for summons and puppets.
2011-06-05 GoldenKevin (revision 37)
* You may now allocate ability (stat) points and skill points.
* Code cleanup - removal of unused imports and variables/function calls.
2011-06-09 GoldenKevin (revision 38)
* Full support for minigames (i.e. omok and match cards).
* Added new database table for recording minigame scores - update your SQL.
* Full support for player trades.
* Progress on all sorts of minirooms. Player shops are partially functional
and hired merchants are still totally nonfunctional.
2011-06-14 GoldenKevin (revision 39)
* No more ranged map entities. Rationale:
* Bandwidth of repeated packets used to show and hide entities as they
went in and out of range for a player was costlier than sending each
player the spawn packet for every entity on the map only once
(especially the relatively huge spawn packet for mobs).
* Saves memory server side since it no longer has to keep track of every
mob/drop/etc. that is in range of a player.
* Spares precious server CPU cycles that are used to check if a ranged
entity is in range every time either a player moves or that ranged
entity moves. No more CPU cycles wasted on costly thread safe operations
with each player's "visibleEntities" pool.
* Fixes ranged entities disappearing when a player jumps down. Concept
of ranged entities became obsolete when players were able to jump down,
allowing them to move from one point to another much faster than through
any other kind of movement. The speed of the server and network latency
became responsible for whether the server could update a client with its
new set of visible ranged entities fast enough so that they were spawned
before the player could view that part of the map.
* Makes GameMap code cleaner, clearer, and concise with less redundancy.
* Renamed MapEntity.getCreationMessage to getShowNewSpawnMessage and
getShowEntityMessage to getShowExistingSpawnMessage.
* Dead monsters are now removed from a player's controlled mobs list
* When the entity id counter of a entity pool in a map overflows,
EntityPool.nextEntId() skips over entities that are still alive.
2011-06-14 GoldenKevin (revision 40)
* Fixed monsters being uncontrolled by a client immediately after the
controlling client is echoed back the monster's first move.
* Revised various other calls to sendToAll that used the ranged entity
no-echo overload pre-r39, so that a message isn't echoed back to the client
that sent the message when it is unnecessary and a waste of a bandwidth.
* Player's controlled mobs list is now thread safe (possibility of
concurrent access since the mob respawn thread and various packet handler
threads can access a player at the same time).
* GameMap.updateMonsterController() now will actually go through the entire
player entity pool to find the most suitable candidate for a mob controller
instead of just assigning the job to the first non-hidden player in the pool
* An inventory full message is now shown when a player tries to pick up more
mesos than technical limits would allow.
* Fixed some things regarding monster aggro.
2011-06-25 GoldenKevin (revision 41)
* Renamed Timer to Scheduler to avoid any ambiguity/confusion with
java.util.Timer (plus, makes auto import much less annoying).
* When a player changes channels, their buffs are sent to the receiving
channel so that buff expires are synced up and buff effects are recognized.
* Summons now are removed from the map when the owner player leaves, and
spawn when the owner player enters into a new map.
* Fixed integer overflow causing LittleEndianReader.readLong to return
incorrect values.
* Summons/puppets now removed from map when changing maps/channels, or when
logging off. Summons are respawned on the new map if changing maps/channels.
2011-06-27 GoldenKevin (revision 42)
* Fixed skill levels and reactor states being skipped when loading from MCDB
* Database access rehaul. Added in a connection pool model as a replacement
for the thread-local connection model when using the OIO network model
(thread per connection), so that the max amount of database connections is
not exceeded. All calls to DatabaseConnection.getConnection now have to call
DatabaseConnection.returnConnection, even when using thread-local.
* Safer database PreparedStatement/ResultSet closing if an exception is
thrown during database access.
* Redesigned DatabaseConnection now throws out dead connections for both
types of connection pooling, so that if a connection goes stale following a
time out period, or network paths to the database are momentarily out, then
it will try reconnecting by creating a new connection.
* DatabaseConnection renamed to DatabaseManager. It is now completely thread
safe.
* Moved the catching of some SQLExceptions further upstream for performance
and logging organization reasons (and to halt further initialization when a
database error is encountered at server initialization).
2011-06-29 GoldenKevin (revision 43)
* Fixed activated energy charge not showing to other players when changing
channels, and partial charge amount not transferring when changing channels.
* Added in stubs for inner portal hacking check.
2011-07-01 GoldenKevin (revision 44)
* More meaningful exit codes. 2 = properties loading error, 3 = database
error, 4 = center server connection error, 5 = server socket binding error.
* For the moment, all external-facing servers will die when they lose
connection with the center server since currently there is no (automatic)
reconnect interface, and thus the servers pretty much become useless.
* Packaged libraries have been updated. Rhino has been updated from version
1.7R2 to 1.7R3, MySQL Connector/J from 5.1.14 to 5.1.16, and Netty from
3.2.3 to 3.2.4. MySQL's .jar and Rhino's .jar files have been recompressed
to reduce their size by a few kilobytes, so they do not match the size of
the download you would get on their respective websites.
* Fixed a potential performance/thread-safety problem in the packet encoder.
The ClientSession is now retrieved only once instead of twice to reduce Map
lookup costs and to prevent a condition where another thread removes the
channel's ClientSession in between the two calls to ChannelLocal.get.
* Mini room "map boxes" are now referred to as balloons. Hint box renamed to
hint balloon in PortalActions.
* Added in support on the login server for updating rankings. Updated SQL.
2011-07-02 GoldenKevin (revision 45)
* Major refactoring done to split Player into three specific classes that
are each tailored to their server type in an effort to be more memory
efficient. No more unused fields in the Player class of any server.
* Logical reordering of packages:
* Everything from the argonms package is now in argonms.common. All
classes and packages from the argonms.character package have been moved
to argonms.game.character, and the Player class has been turned into an
interface that is now in argonms.common.
* Moved package argonms.loading to argonms.common.loading, and moved all
of its subpackages and classes with it.
* Moved package argonms.net to argonms.common.net, and moved all of its
subpackages and classes with it.
* Moved package argonms.tools to argonms.common.tools, and moved all of
its subpackages and classes with it.
* argonms.map and its subpackages and classes have been moved to
argonms.game.field (field is used to reduce confusion with the
java.util.Map collection). GameMap's class name remains unchanged.
* argonms.game.clientcommand renamed to argonms.game.command.
* argonms.center.recv.RemoteServerListener moved to argonms.center.
* Some refactoring done (including some ugly use of generics and the factory
pattern) to eliminate a substantial amount of casts between Clients and
Players of different server types in common classes, thus making the code
appear 100% type safe.
* May have fixed the mistaken auto-dc issue. We now start listening for the
ping response before sending the ping, in case the client responds faster
than we could set up the heartbeat listener.
* Improved wording of some low-level networking logged messages.
* Fixed match cards minigame not resetting completely.
2011-07-03 GoldenKevin (revision 46)
* Further refactoring done to remove references to argonms.game and its
subpackages from code in argonms.common, argonms.login, and argonms.shop.
argonms.game.character.inventory renamed argonms.common.character.inventory,
argonms.common.Player moved to argonms.common.character.Player, and
argonms.game.character.KeyBinding to argonms.common.character.KeyBinding.
* New abstract class inherited by LoginCharacter and ShopCharacter to reduce
repeated code. CharacterTools includes routines common to all three Player
implementations.
* Reorganized chaotically ordered imports following the large-scale
refactoring of the previous revision.
* Shop server now uses ShopWorld instead of LoginWorld for host/port state.
2011-07-03 GoldenKevin (revision 47)
* Even more common operations added to CharacterTools.
* Fixed NullPointerException when creating a character.
* Game server online messages now display the channel id and the world.
* argonms.common.inventory.ItemTools -> argonms.game.character.ItemTools
* argonms.game.character.skill.PlayerStatusEffectValues renamed to
argonms.game.character.PlayerStatusEffectValues.
* All packages in argonms.common.loading moved to argonms.game.loading
except item and string loading.
* Split MonsterStatusEffect enum from MonsterStatusEffectValues class and
moved it to argonms.common (dependency for StatusEffectsData, which is in
turn a dependency of ItemDataLoader).
* Split PlayerStatusEffect enum from PlayerStatusEffectValues class and
moved it to argonms.common.character (dependency of StatusEffectsData, which
is in turn a dependency of ItemDataLoader).
* argonms.game.character.skill.Cooldown
and argonms.game.character.skill.SkillEntry to argonms.common.character
as they are both needed by the shop server. The rest of the classes in their
old package have been moved to argonms.game.character.
* argonms.game.character.QuestEntry moved to argonms.common.character as it
is needed by the shop server.
2011-07-05 GoldenKevin (revision 48)
* Moved methods isFourthJob and isBeginnerSkill from
argonms.game.character.SkillTools to argonms.game.character.Skills.
* argonms.game.character.Skills renamed to argonms.common.character.Skills
as it is a dependency of CommonPackets (needed for shop server).
* CommonPackets split into GameCommonPackets, which provides routines that
are dependent on game server classes/packages.
* Each subpackage of the root argonms package can now be placed in its own
.jar file as the center, game, login, and shop subpackages are now all
independent of each other. argonms.center, argonms.game, argonms.login, and
argonms.shop all depend only on the argonms.common package.
* Removed world and channel arguments in the ClientSession constructor as
they are not needed.