Compare commits
2259
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a7c3662463 | ||
|
|
909e04b8d1 | ||
|
|
a7d1dc5fd0 | ||
|
|
2f87fd9812 | ||
|
|
c696bd368e | ||
|
|
7716d82adb | ||
|
|
66804d5704 | ||
|
|
02aafc9274 | ||
|
|
2ef0d4305c | ||
|
|
972c99a146 | ||
|
|
ad9d27c6ee | ||
|
|
e1d11d5d94 | ||
|
|
ca78a3b581 | ||
|
|
bcaa5d42ff | ||
|
|
6dad14ae57 | ||
|
|
6e465248b1 | ||
|
|
7c106d5d34 | ||
|
|
8135ef8e9c | ||
|
|
db2d6a4bf3 | ||
|
|
bb0a3b8b5b | ||
|
|
0145a7264d | ||
|
|
6eec56adb4 | ||
|
|
01662aae07 | ||
|
|
72d73883a4 | ||
|
|
9c64dbb70c | ||
|
|
9408602c9c | ||
|
|
58cf778ce4 | ||
|
|
885b612bd6 | ||
|
|
bf69045b0b | ||
|
|
8b03fbc15b | ||
|
|
3c23a070df | ||
|
|
c14cc98ca2 | ||
|
|
c326008112 | ||
|
|
90facabc7b | ||
|
|
6e26a8cfcf | ||
|
|
4b1ab35a36 | ||
|
|
d733afef58 | ||
|
|
f30a02a6d5 | ||
|
|
b255b1c9f4 | ||
|
|
6151a9e650 | ||
|
|
0f7ef9f56b | ||
|
|
6d68d048b0 | ||
|
|
8ccdbf8cc9 | ||
|
|
1798a8f170 | ||
|
|
737da1bf14 | ||
|
|
45eb0776d6 | ||
|
|
f4346b97f7 | ||
|
|
cf6f684f5e | ||
|
|
a8e3cfa8f7 | ||
|
|
0028b7be69 | ||
|
|
3f11996b40 | ||
|
|
779f5bbb5b | ||
|
|
37c89e6073 | ||
|
|
83499816eb | ||
|
|
0eb8da855d | ||
|
|
36fb3f12b1 | ||
|
|
ba642e049e | ||
|
|
98835cad90 | ||
|
|
4d9600a8bf | ||
|
|
4089f72d8f | ||
|
|
ead86efcf6 | ||
|
|
ae01a421de | ||
|
|
469662f732 | ||
|
|
8b9bc474b4 | ||
|
|
3815f9df8e | ||
|
|
6313182c4f | ||
|
|
40bff54838 | ||
|
|
2b1299ec4a | ||
|
|
0955dff7aa | ||
|
|
2b18765781 | ||
|
|
c55f67a977 | ||
|
|
730467828c | ||
|
|
ad05f0d7bc | ||
|
|
c922d9c532 | ||
|
|
ed4d186b10 | ||
|
|
de1bc375ca | ||
|
|
1c48b28d4e | ||
|
|
0318459ff1 | ||
|
|
4bdc207c37 | ||
|
|
ba537d7b00 | ||
|
|
a0164d5abb | ||
|
|
eec5861944 | ||
|
|
094a7a9498 | ||
|
|
d93892df6c | ||
|
|
81150642f0 | ||
|
|
7fb5ccf4f1 | ||
|
|
ab1e69a6ef | ||
|
|
2d2832caf9 | ||
|
|
5dee08d3ce | ||
|
|
75b68c0a8c | ||
|
|
a9f006936b | ||
|
|
917fddceeb | ||
|
|
a2da8f3861 | ||
|
|
b1b2912092 | ||
|
|
3bcda38bb7 | ||
|
|
918a797f34 | ||
|
|
ba9238a49a | ||
|
|
bd5061a7e8 | ||
|
|
270301c35b | ||
|
|
ffcaf0e063 | ||
|
|
6e7633828f | ||
|
|
3aac2410b0 | ||
|
|
c90378e3f0 | ||
|
|
4734f23805 | ||
|
|
47503de748 | ||
|
|
8ab2805e39 | ||
|
|
1d703b08a2 | ||
|
|
a660457883 | ||
|
|
4ca81b019b | ||
|
|
5f16b40092 | ||
|
|
0d7beb5a5a | ||
|
|
b66e1c1f93 | ||
|
|
f1e8384af0 | ||
|
|
c9dcb82c45 | ||
|
|
c2c946165c | ||
|
|
ffd65b3641 | ||
|
|
ba2084ceb0 | ||
|
|
34ec123702 | ||
|
|
7c36325905 | ||
|
|
915f182d79 | ||
|
|
fb1d6a3248 | ||
|
|
6d16eccc24 | ||
|
|
fa5cdae17e | ||
|
|
b46eb8639d | ||
|
|
58916c35c7 | ||
|
|
f80d50f95e | ||
|
|
77f2e413c9 | ||
|
|
5e84ee8b11 | ||
|
|
b6a9a0c813 | ||
|
|
f7e6307d66 | ||
|
|
1359417b40 | ||
|
|
85077a5e56 | ||
|
|
366815f1f9 | ||
|
|
2ca51d6a83 | ||
|
|
b7ebb728e2 | ||
|
|
023057668a | ||
|
|
a11b590573 | ||
|
|
353d211a04 | ||
|
|
c792e49fdc | ||
|
|
f8e99a84b1 | ||
|
|
b28c157a5c | ||
|
|
85717a1880 | ||
|
|
0ac7a1a7fa | ||
|
|
7745ef6949 | ||
|
|
40078df067 | ||
|
|
bb28d38735 | ||
|
|
7bd6e3a149 | ||
|
|
72faafedfe | ||
|
|
e560c07aba | ||
|
|
742232166e | ||
|
|
910a5d9e3c | ||
|
|
a943a5a51d | ||
|
|
e3a278e090 | ||
|
|
5959209081 | ||
|
|
e222cb3543 | ||
|
|
a4efe199c6 | ||
|
|
fa5ac4fea3 | ||
|
|
f28c887b92 | ||
|
|
c1331efe38 | ||
|
|
b113b55703 | ||
|
|
560466e3ef | ||
|
|
0457287905 | ||
|
|
db7e9276b1 | ||
|
|
a14057b9df | ||
|
|
0a3624e503 | ||
|
|
45048b2b4e | ||
|
|
27550293d6 | ||
|
|
422cf10eea | ||
|
|
c412336257 | ||
|
|
c8bea0d1ce | ||
|
|
e66a8459c0 | ||
|
|
817067d242 | ||
|
|
942288cee2 | ||
|
|
8d633adbb3 | ||
|
|
a821f7f7e4 | ||
|
|
0581cab5cb | ||
|
|
6ee1c02e08 | ||
|
|
8379b48332 | ||
|
|
e2ae758e36 | ||
|
|
8f1855fb3f | ||
|
|
e15164bcb2 | ||
|
|
836fa4f8dc | ||
|
|
fe7f4dc3ca | ||
|
|
19402bf06f | ||
|
|
bed49c0230 | ||
|
|
9c79dca2c5 | ||
|
|
3820d179c6 | ||
|
|
6e1db9489a | ||
|
|
8227db92c8 | ||
|
|
06309daae6 | ||
|
|
49e5be959f | ||
|
|
74a22d4cf5 | ||
|
|
3f827cebd8 | ||
|
|
ae734cbb0a | ||
|
|
bde3e54fd4 | ||
|
|
fa5144c932 | ||
|
|
de08d0d210 | ||
|
|
79a9bfd606 | ||
|
|
491519216c | ||
|
|
048c4dfb1b | ||
|
|
d14144cdf3 | ||
|
|
d610bccdee | ||
|
|
39f7be99b0 | ||
|
|
01aa226c62 | ||
|
|
87bd67b0f5 | ||
|
|
70edd4c19c | ||
|
|
6c86da0719 | ||
|
|
84cc435a2b | ||
|
|
5e61ef26e1 | ||
|
|
9e85c1e361 | ||
|
|
3d80a03e1e | ||
|
|
15136518a3 | ||
|
|
b8abe94a8c | ||
|
|
f2e4e8062e | ||
|
|
feaa38ee98 | ||
|
|
6f453ab5c4 | ||
|
|
af839c108c | ||
|
|
8bac27f0fc | ||
|
|
bfb257c410 | ||
|
|
3be694275d | ||
|
|
f885560e52 | ||
|
|
a8a9cdb0f1 | ||
|
|
210cc94dac | ||
|
|
bf503c0be0 | ||
|
|
24c16e6cf1 | ||
|
|
a6fb7ec0a0 | ||
|
|
cb9197013e | ||
|
|
e1584161c9 | ||
|
|
0c85c1d289 | ||
|
|
ead9683b98 | ||
|
|
c29d6f548e | ||
|
|
5822cb1ab4 | ||
|
|
371d077320 | ||
|
|
984c4d205a | ||
|
|
8cc92e9792 | ||
|
|
c1ea68aa41 | ||
|
|
324851a8ab | ||
|
|
cd512100a2 | ||
|
|
a0e78d8add | ||
|
|
f02d79c65e | ||
|
|
cfffb0c16a | ||
|
|
8804a3ecd4 | ||
|
|
16c84f2b30 | ||
|
|
5858aabc83 | ||
|
|
4b81a5c435 | ||
|
|
c1107ae98d | ||
|
|
c5f2464d55 | ||
|
|
e0beab2dc5 | ||
|
|
bcbeacd60e | ||
|
|
e39c7bebb5 | ||
|
|
4e6e56350c | ||
|
|
a33d650738 | ||
|
|
12b44e216c | ||
|
|
a202a0544e | ||
|
|
8156f261fc | ||
|
|
283ae37919 | ||
|
|
3e30c7a01e | ||
|
|
a5570e4bb5 | ||
|
|
290aec79ba | ||
|
|
1378bc8030 | ||
|
|
bd536961e2 | ||
|
|
17aee68575 | ||
|
|
a97f4e6da6 | ||
|
|
2274a9e16e | ||
|
|
1caa704b6a | ||
|
|
1bb4e17ead | ||
|
|
d84b214fd3 | ||
|
|
4440ed1f0d | ||
|
|
f0ad1b730c | ||
|
|
d968c4eca4 | ||
|
|
38816f25bb | ||
|
|
58f5bf05e0 | ||
|
|
78d9e3d6fc | ||
|
|
d1c07e88fc | ||
|
|
dcd108e3ac | ||
|
|
2c2a2464ee | ||
|
|
ee5c254de4 | ||
|
|
efa4ce91fa | ||
|
|
cd45f49b07 | ||
|
|
116c9bfdfb | ||
|
|
4ec7c3c4bd | ||
|
|
281dde533a | ||
|
|
55b6f95696 | ||
|
|
e120ae6e18 | ||
|
|
9e44c9475a | ||
|
|
4d8cb339c3 | ||
|
|
b1dfd9a40d | ||
|
|
cff6714160 | ||
|
|
16a9d4e5c9 | ||
|
|
3189d64031 | ||
|
|
5cd94234e9 | ||
|
|
b45b325cad | ||
|
|
b731291e6c | ||
|
|
c207bd14b6 | ||
|
|
4924133416 | ||
|
|
6769286c4a | ||
|
|
d21bf0185b | ||
|
|
3312ea292f | ||
|
|
c7604d0f2c | ||
|
|
1206441ab3 | ||
|
|
679346383a | ||
|
|
e8df9ef0ea | ||
|
|
3d683fc9a3 | ||
|
|
fbeda13a48 | ||
|
|
d598887f61 | ||
|
|
40372e1b35 | ||
|
|
4476c3863d | ||
|
|
08f94226ba | ||
|
|
7eb9eca7d0 | ||
|
|
c43c3de18a | ||
|
|
9e0fa541a2 | ||
|
|
58035d0f93 | ||
|
|
92460d455b | ||
|
|
3c5f510969 | ||
|
|
e3c8be6102 | ||
|
|
5f0eb266c2 | ||
|
|
c721d6d4a8 | ||
|
|
d0b716eb41 | ||
|
|
a4a375e13b | ||
|
|
c56702bd75 | ||
|
|
5c023b4c4d | ||
|
|
4b67cbef38 | ||
|
|
6cf2705013 | ||
|
|
66bc73a2b6 | ||
|
|
77cfa02bea | ||
|
|
93773a7784 | ||
|
|
42dd2b4e68 | ||
|
|
2aed3ef922 | ||
|
|
fb6a3706cd | ||
|
|
48e126823f | ||
|
|
b3de192f0b | ||
|
|
58d5c1969c | ||
|
|
950108be87 | ||
|
|
a9746b9a2b | ||
|
|
eaa287e176 | ||
|
|
67cdf0e98a | ||
|
|
83e2b29635 | ||
|
|
c99a361ca7 | ||
|
|
f53c2c5cb0 | ||
|
|
6680651801 | ||
|
|
66fbbada48 | ||
|
|
ba1cb22662 | ||
|
|
bf9be1f7f9 | ||
|
|
bb4c1d48a4 | ||
|
|
b33f451285 | ||
|
|
f865f94806 | ||
|
|
baf28519c2 | ||
|
|
4a2ef92d33 | ||
|
|
c16ea8f3dd | ||
|
|
882ed17b3a | ||
|
|
d06c298b09 | ||
|
|
e4bad5f418 | ||
|
|
54c0b3d7ce | ||
|
|
9d59bde22e | ||
|
|
47243dd48d | ||
|
|
bb6828ec8e | ||
|
|
5d0973c2bc | ||
|
|
4f216364a9 | ||
|
|
c1d193ee45 | ||
|
|
9879c1b18f | ||
|
|
928845a220 | ||
|
|
3378272a19 | ||
|
|
e4c4643678 | ||
|
|
3c1a217ac6 | ||
|
|
1567b22fe4 | ||
|
|
2067bbc6e1 | ||
|
|
9790423139 | ||
|
|
d8a8c1a9a0 | ||
|
|
60ab4a846e | ||
|
|
58f250fa64 | ||
|
|
a160df02c4 | ||
|
|
1fa7cbed12 | ||
|
|
d16a56a582 | ||
|
|
69aca2c728 | ||
|
|
159960d521 | ||
|
|
b9871a2729 | ||
|
|
18f6822cb4 | ||
|
|
18731839f7 | ||
|
|
1d2e4d5608 | ||
|
|
ef49d0cbe0 | ||
|
|
9604ee4399 | ||
|
|
e708bb02f5 | ||
|
|
73c1f97051 | ||
|
|
7a445db673 | ||
|
|
b3d65ef700 | ||
|
|
7a7559dee5 | ||
|
|
a902ff720a | ||
|
|
98cb307e09 | ||
|
|
0dca6c4662 | ||
|
|
c8310ec5ba | ||
|
|
961258f67a | ||
|
|
2854472ae0 | ||
|
|
b81f088a3a | ||
|
|
be4cbd3f6f | ||
|
|
7eb6deb1e9 | ||
|
|
d04cad0484 | ||
|
|
a8a21e9e40 | ||
|
|
0d5ff59cb7 | ||
|
|
cdeebda6f8 | ||
|
|
3065f9f7eb | ||
|
|
e2cca6201f | ||
|
|
1f7ea89d66 | ||
|
|
ce3eacda48 | ||
|
|
8a3a4645af | ||
|
|
f074fe1825 | ||
|
|
e47430e61b | ||
|
|
b2718779f8 | ||
|
|
189d0624e7 | ||
|
|
a6cfe2fb76 | ||
|
|
fa37e1bcca | ||
|
|
7497526bd9 | ||
|
|
b9c38d9d2b | ||
|
|
c8ec0fe191 | ||
|
|
1378ddcaef | ||
|
|
78f8331582 | ||
|
|
c197a385c5 | ||
|
|
2c0899982c | ||
|
|
72bc753724 | ||
|
|
c43f70128a | ||
|
|
95b23a35fc | ||
|
|
86d0254c2f | ||
|
|
d09240d11a | ||
|
|
5da4b66f81 | ||
|
|
5247bf77fe | ||
|
|
f8a584d000 | ||
|
|
7c2915928d | ||
|
|
8308ac97e3 | ||
|
|
75ea9092e2 | ||
|
|
d60532c23f | ||
|
|
d8f1cf2087 | ||
|
|
379dbe668c | ||
|
|
52a0c95002 | ||
|
|
360a393a0f | ||
|
|
345f4e799b | ||
|
|
ef70d7b8ed | ||
|
|
f98f54139a | ||
|
|
7e3e337de0 | ||
|
|
74f8f0640f | ||
|
|
13babb630d | ||
|
|
cd87927241 | ||
|
|
e3377d26b1 | ||
|
|
e02dbd3632 | ||
|
|
0d7c2cd288 | ||
|
|
60ba6d5b28 | ||
|
|
52c3f563a2 | ||
|
|
5655aef57a | ||
|
|
487e557ef9 | ||
|
|
f95dd7f6f2 | ||
|
|
4f56cacaea | ||
|
|
36f42770c8 | ||
|
|
1dfac59b8c | ||
|
|
d22b10e9ef | ||
|
|
5cdab459bc | ||
|
|
f62d44d631 | ||
|
|
5ee3438e42 | ||
|
|
6b07058dd4 | ||
|
|
1f700cda4c | ||
|
|
c5f5c33329 | ||
|
|
f3b00a6249 | ||
|
|
9da4b85dd1 | ||
|
|
76da1d0cbf | ||
|
|
dc5b05e5b5 | ||
|
|
8414fb0039 | ||
|
|
8cdd4910ca | ||
|
|
ed7e7be3e8 | ||
|
|
642103b5a2 | ||
|
|
1f95abf0b2 | ||
|
|
434e64d7ba | ||
|
|
665bc25126 | ||
|
|
8b01f80231 | ||
|
|
7fee52c861 | ||
|
|
f8cf531136 | ||
|
|
936f151a72 | ||
|
|
4707bb11f0 | ||
|
|
4de40d054b | ||
|
|
af3eb1d85f | ||
|
|
2990396778 | ||
|
|
7f8652b477 | ||
|
|
afae0e63ba | ||
|
|
850d2dfea0 | ||
|
|
dcc92fd89d | ||
|
|
1346f490c9 | ||
|
|
0c1b3d1460 | ||
|
|
d96f10b41e | ||
|
|
595d0ba9ba | ||
|
|
505f8fdd90 | ||
|
|
bd098fcb24 | ||
|
|
dae20d5591 | ||
|
|
d33de60869 | ||
|
|
38c9612eb6 | ||
|
|
4035f45c4f | ||
|
|
39b235963a | ||
|
|
b142cded72 | ||
|
|
0e7281fe6a | ||
|
|
fe39454113 | ||
|
|
74cf9d16c5 | ||
|
|
4b2563e4a1 | ||
|
|
1e19e10755 | ||
|
|
0c3e072e0e | ||
|
|
aa10a4c9ac | ||
|
|
75947db6e5 | ||
|
|
9d28601761 | ||
|
|
e8ca4863d5 | ||
|
|
a8bfcd08cc | ||
|
|
8ae4ded83b | ||
|
|
5023d6bb73 | ||
|
|
ca47022d88 | ||
|
|
c304a59d95 | ||
|
|
7dfc1dea0f | ||
|
|
77fda6a18c | ||
|
|
b343f4d6d7 | ||
|
|
77e9a4d9bf | ||
|
|
512aba5cd9 | ||
|
|
2d93e408c3 | ||
|
|
edd7be8734 | ||
|
|
8c6637663d | ||
|
|
4cb0f28e57 | ||
|
|
4d21fc0353 | ||
|
|
4d28cd2b25 | ||
|
|
1be6884ab0 | ||
|
|
74eff825b0 | ||
|
|
1ae1deabdc | ||
|
|
54b7bcf907 | ||
|
|
a8c768931e | ||
|
|
71687e39c8 | ||
|
|
678e45ce6b | ||
|
|
5bfeafe8bf | ||
|
|
a492e833e8 | ||
|
|
92436be3f9 | ||
|
|
8890e02981 | ||
|
|
6fe8b80c87 | ||
|
|
c2e0979dc3 | ||
|
|
6023022077 | ||
|
|
9a570de54c | ||
|
|
d58d8ee67c | ||
|
|
132addc0a9 | ||
|
|
8bfba1b3a5 | ||
|
|
0d45bb5bc1 | ||
|
|
6ea4717263 | ||
|
|
7153216f09 | ||
|
|
114ccfee9d | ||
|
|
23e0a0dcc7 | ||
|
|
b2a3eb3e6e | ||
|
|
13a4ba6e0e | ||
|
|
eaa8828a24 | ||
|
|
6bbe9317ac | ||
|
|
0c56631b92 | ||
|
|
a81810d751 | ||
|
|
9c75e7defe | ||
|
|
6aba5be67a | ||
|
|
9c867ee281 | ||
|
|
afc91e22e5 | ||
|
|
6dac5c7ec8 | ||
|
|
c6c4a128a2 | ||
|
|
28fa81962d | ||
|
|
0759c56b14 | ||
|
|
64e6e035c1 | ||
|
|
31bf62a678 | ||
|
|
a924e4c876 | ||
|
|
38e6bdf92d | ||
|
|
69dd7bcc37 | ||
|
|
f26e8e4559 | ||
|
|
16e8df3daf | ||
|
|
c98c64262b | ||
|
|
a6cf68ef07 | ||
|
|
3b179a5703 | ||
|
|
0638028a59 | ||
|
|
912ebd4742 | ||
|
|
c1440f8f9e | ||
|
|
8d32927241 | ||
|
|
d058e7506a | ||
|
|
dd548acfe1 | ||
|
|
acc0c1dc46 | ||
|
|
d0c74e0641 | ||
|
|
095a26e1d9 | ||
|
|
1cb0848690 | ||
|
|
60a7b395e5 | ||
|
|
09e57852f4 | ||
|
|
c2fe156680 | ||
|
|
b9545dbf76 | ||
|
|
8ce7c09000 | ||
|
|
9107540212 | ||
|
|
24bc0097be | ||
|
|
7175f79bfe | ||
|
|
230a7460cd | ||
|
|
e172d3f2d0 | ||
|
|
2e78f44640 | ||
|
|
5c46af3c52 | ||
|
|
b9ec8fd540 | ||
|
|
d3bf19426c | ||
|
|
734b46d816 | ||
|
|
11310a5b64 | ||
|
|
067f8f8d89 | ||
|
|
afa9ddf89e | ||
|
|
a6cee850a6 | ||
|
|
5f5616fd2d | ||
|
|
dcd37bce13 | ||
|
|
d438440556 | ||
|
|
9f58e211a8 | ||
|
|
f52e67e80c | ||
|
|
c520263179 | ||
|
|
c9f246afec | ||
|
|
cdf7fcc54d | ||
|
|
3553291d1d | ||
|
|
67ce60124f | ||
|
|
0e6ee13926 | ||
|
|
5b0ba790b3 | ||
|
|
b53f2c2824 | ||
|
|
b9a87ba407 | ||
|
|
e3ed34a04b | ||
|
|
6915e30eb2 | ||
|
|
e9c7cc8e04 | ||
|
|
90feaea89e | ||
|
|
174bceb49e | ||
|
|
e3ec8d7737 | ||
|
|
c44a7eafab | ||
|
|
879b52c7c7 | ||
|
|
1fe3f7dfb1 | ||
|
|
2c8517a1e4 | ||
|
|
4eff71f288 | ||
|
|
349b88f142 | ||
|
|
6b8d1e6f71 | ||
|
|
79022f0e3e | ||
|
|
523eb8529f | ||
|
|
5684fb6ce1 | ||
|
|
feb23e63fe | ||
|
|
ab5943e4b2 | ||
|
|
02d22f0881 | ||
|
|
9b555c0259 | ||
|
|
6a4e0e32cc | ||
|
|
5713dab8cf | ||
|
|
71b7fd5c1b | ||
|
|
39e6917ae8 | ||
|
|
86c33c195c | ||
|
|
ad6fca61ed | ||
|
|
f2b91f875f | ||
|
|
ab2b7092fd | ||
|
|
d39137d900 | ||
|
|
d906d49e51 | ||
|
|
54c48d398b | ||
|
|
98fe77b148 | ||
|
|
9ee3b9d7bb | ||
|
|
d6dd61e9c5 | ||
|
|
d92e5d4a45 | ||
|
|
d065e9ffc8 | ||
|
|
2b63ed08b8 | ||
|
|
50fb0d39c5 | ||
|
|
bb91502cb4 | ||
|
|
8f6e13102d | ||
|
|
0679ffcaec | ||
|
|
9ab286166e | ||
|
|
0d4e8f3c9a | ||
|
|
02a78d538c | ||
|
|
9e74954422 | ||
|
|
a267382481 | ||
|
|
0910b7184c | ||
|
|
297fe8c7a2 | ||
|
|
76405cb968 | ||
|
|
a38e5b478a | ||
|
|
4540e5c770 | ||
|
|
aef12b2bb4 | ||
|
|
a562af57e9 | ||
|
|
03470c699d | ||
|
|
f777f480ad | ||
|
|
ce542ce319 | ||
|
|
7ff879ea64 | ||
|
|
e4274994ff | ||
|
|
547d222a2d | ||
|
|
5159afc704 | ||
|
|
3a771ac585 | ||
|
|
97fcbd8608 | ||
|
|
39aec46220 | ||
|
|
1db30e3c6b | ||
|
|
34cb943595 | ||
|
|
bef49fc720 | ||
|
|
2bbdeb89ff | ||
|
|
2f4287783e | ||
|
|
802d46d66e | ||
|
|
de3f1cf004 | ||
|
|
90e85d3e46 | ||
|
|
2e104741ba | ||
|
|
6461efa1a2 | ||
|
|
320ea7e81c | ||
|
|
05eb8cd961 | ||
|
|
9909216e27 | ||
|
|
33a369821a | ||
|
|
6e93e40454 | ||
|
|
c14fd84d96 | ||
|
|
56c16fc06e | ||
|
|
71274d25d0 | ||
|
|
9d75116790 | ||
|
|
629fce8cff | ||
|
|
7fefd53be2 | ||
|
|
8aab20caf4 | ||
|
|
14ad0b7599 | ||
|
|
267549ce15 | ||
|
|
6e14f723da | ||
|
|
46a9dad407 | ||
|
|
e89e2f51b7 | ||
|
|
40290bdf97 | ||
|
|
a37e30c550 | ||
|
|
0440aabd1e | ||
|
|
fbc408f617 | ||
|
|
0f7410f55f | ||
|
|
f82a19f243 | ||
|
|
c9428d2b56 | ||
|
|
c4bd766156 | ||
|
|
44cd8d0013 | ||
|
|
84a75f6b83 | ||
|
|
be902cf09c | ||
|
|
0289b5087d | ||
|
|
b5f36b60f7 | ||
|
|
43409d2e4b | ||
|
|
547de5033b | ||
|
|
2c7baaf2ac | ||
|
|
351437b46b | ||
|
|
1e9f1685da | ||
|
|
d9a03ebf93 | ||
|
|
666e3d5479 | ||
|
|
7efd276d52 | ||
|
|
46826163be | ||
|
|
e70b52d88c | ||
|
|
106dd87216 | ||
|
|
c964115c1e | ||
|
|
8c022596a7 | ||
|
|
2de240dd60 | ||
|
|
8e8876587c | ||
|
|
8f0e19a10c | ||
|
|
2222a335a1 | ||
|
|
a7bc1d5a6a | ||
|
|
0e61f0e7b8 | ||
|
|
0d256c17b5 | ||
|
|
571ad4b466 | ||
|
|
9e7a8bef4a | ||
|
|
669db7f021 | ||
|
|
13513bcf2a | ||
|
|
149630ef5a | ||
|
|
257d864132 | ||
|
|
6247332f83 | ||
|
|
e5d606fe8a | ||
|
|
dc1720b38b | ||
|
|
7b5de5f3f5 | ||
|
|
7de9bdbbe4 | ||
|
|
88123ad99a | ||
|
|
0437f10bf9 | ||
|
|
e93f09c184 | ||
|
|
ee60f88e62 | ||
|
|
2d4d0f79f8 | ||
|
|
664eb04658 | ||
|
|
1fc9e6251e | ||
|
|
7eba9501a6 | ||
|
|
0eb67c83a3 | ||
|
|
6668c01185 | ||
|
|
76b89d898a | ||
|
|
6a28574471 | ||
|
|
11faa98503 | ||
|
|
a32ba5e262 | ||
|
|
558b645274 | ||
|
|
a1115e728c | ||
|
|
409f8aa847 | ||
|
|
78cf95d290 | ||
|
|
2c78e0728a | ||
|
|
31e56b4da6 | ||
|
|
ba3fd7215b | ||
|
|
c08a93e85d | ||
|
|
b63a5fa1c1 | ||
|
|
c7494e8a9d | ||
|
|
f69fde8a3a | ||
|
|
05dace9194 | ||
|
|
ae975b7591 | ||
|
|
02f376f418 | ||
|
|
3c2d3782c2 | ||
|
|
daaa1d9ece | ||
|
|
747056bc8c | ||
|
|
b6760d0775 | ||
|
|
ba4ab458a0 | ||
|
|
c04fd62e71 | ||
|
|
97c063661a | ||
|
|
62205150a7 | ||
|
|
9f5bdce571 | ||
|
|
22a0cb2474 | ||
|
|
96c1e34a08 | ||
|
|
3dc7f7c9ed | ||
|
|
cd1b15834a | ||
|
|
8a0303e0f5 | ||
|
|
aa0e993038 | ||
|
|
3ef3a0c37c | ||
|
|
a6a2629fd5 | ||
|
|
e414304e94 | ||
|
|
f5b08c1868 | ||
|
|
0bdcfe7b51 | ||
|
|
c640caeb54 | ||
|
|
3d33a16d06 | ||
|
|
f4778d4f48 | ||
|
|
c8246ff317 | ||
|
|
7a3a9c6254 | ||
|
|
545796e297 | ||
|
|
6b4eff4d4c | ||
|
|
457ed4f4e6 | ||
|
|
8f2847a527 | ||
|
|
7f5df22a14 | ||
|
|
4fd737e3ec | ||
|
|
e891d353ba | ||
|
|
c5376d24a5 | ||
|
|
85bf30cbdd | ||
|
|
775410b00a | ||
|
|
a8275c7cc7 | ||
|
|
03025e7f00 | ||
|
|
1b7be0365a | ||
|
|
de772237c9 | ||
|
|
e60c635c39 | ||
|
|
6db9f115b1 | ||
|
|
3f303e1c9e | ||
|
|
c0ec747e43 | ||
|
|
b583034b4e | ||
|
|
3360a034b2 | ||
|
|
668df83e33 | ||
|
|
fa3234d0f5 | ||
|
|
e8973ecb6d | ||
|
|
134aecf4d7 | ||
|
|
08cb49f641 | ||
|
|
2a06015a0e | ||
|
|
4559519512 | ||
|
|
42b2f886d5 | ||
|
|
0ce7f64d94 | ||
|
|
5fbd5ebb5c | ||
|
|
8fed2d3506 | ||
|
|
e119f62049 | ||
|
|
228b0c74a9 | ||
|
|
c73688de4d | ||
|
|
71288d0203 | ||
|
|
db229dcf74 | ||
|
|
2e4bf0823c | ||
|
|
d70f9f6dc3 | ||
|
|
a9ecf76585 | ||
|
|
ea3c571485 | ||
|
|
5840de216d | ||
|
|
c7d26f9dcc | ||
|
|
5287b993fa | ||
|
|
33bd1a0906 | ||
|
|
5cd86bc033 | ||
|
|
bff41967db | ||
|
|
d3692d0fb7 | ||
|
|
6641651f3c | ||
|
|
dbf164bfb2 | ||
|
|
8a617c3008 | ||
|
|
a50a2430ba | ||
|
|
5c3c552288 | ||
|
|
69fdddfc71 | ||
|
|
db5b988275 | ||
|
|
4284757035 | ||
|
|
b93a47acc0 | ||
|
|
d59f9857ce | ||
|
|
8ce212b74b | ||
|
|
e78aea5735 | ||
|
|
9a3c5c3f40 | ||
|
|
60ca3f9c34 | ||
|
|
e7e740dff1 | ||
|
|
8343a98d77 | ||
|
|
5862039a00 | ||
|
|
8af989b75f | ||
|
|
08d0e5ff75 | ||
|
|
5196d10e5c | ||
|
|
3392ec463d | ||
|
|
33529404cf | ||
|
|
00e7a36013 | ||
|
|
3060b394ab | ||
|
|
a43d9022fe | ||
|
|
6abdc68ca5 | ||
|
|
61c66b0e96 | ||
|
|
36cc23457a | ||
|
|
d573b238de | ||
|
|
8afe25fe85 | ||
|
|
f80647ff0d | ||
|
|
7e64cbabf8 | ||
|
|
14a06410ae | ||
|
|
85c2a4f4f0 | ||
|
|
da9e211ec7 | ||
|
|
a81070c471 | ||
|
|
e3ad7efa4f | ||
|
|
a4dafd7155 | ||
|
|
645aec853e | ||
|
|
d8d5e4a3c4 | ||
|
|
7a48c04057 | ||
|
|
64aaaa707e | ||
|
|
445d40dc5f | ||
|
|
ebdcb531f2 | ||
|
|
c9cdb891d6 | ||
|
|
f5c6c002a8 | ||
|
|
d171c6bb9a | ||
|
|
1c81a4faed | ||
|
|
e7d1d5cb71 | ||
|
|
060d831d50 | ||
|
|
316bd6dd01 | ||
|
|
34081e5903 | ||
|
|
e2d843b65e | ||
|
|
a796f5fe4b | ||
|
|
51ee41c773 | ||
|
|
7e5ed3efe5 | ||
|
|
8dd25ac315 | ||
|
|
1cdaa58e7a | ||
|
|
fa3aa24a3d | ||
|
|
091431d95b | ||
|
|
1ecf0122ab | ||
|
|
79980a1725 | ||
|
|
8badcc3f6e | ||
|
|
4d6e57257c | ||
|
|
a7a93b8500 | ||
|
|
85cc34fb4c | ||
|
|
772a996b6e | ||
|
|
e67eff822d | ||
|
|
c39ed6120f | ||
|
|
c38f4e6543 | ||
|
|
098433b697 | ||
|
|
c8e20c905b | ||
|
|
bd2446ba0a | ||
|
|
c179e4aaf3 | ||
|
|
2f8de2a919 | ||
|
|
338110973d | ||
|
|
3c9c4495bc | ||
|
|
93476f782c | ||
|
|
3aec6ee578 | ||
|
|
3bca76d4c8 | ||
|
|
b9d6f35aac | ||
|
|
9b6959414a | ||
|
|
400dd6aa5e | ||
|
|
14af2f6efd | ||
|
|
0a2de9e0d5 | ||
|
|
89bfad78a6 | ||
|
|
52486fa278 | ||
|
|
dc0e14eb21 | ||
|
|
70278374e7 | ||
|
|
ac3588c76a | ||
|
|
ab335aef2a | ||
|
|
719c855bdb | ||
|
|
f283e50018 | ||
|
|
99b952ee28 | ||
|
|
24639b62c0 | ||
|
|
573cc531bf | ||
|
|
29e24bae93 | ||
|
|
22e4cc07c0 | ||
|
|
9264347698 | ||
|
|
579c26ac59 | ||
|
|
ef577dd313 | ||
|
|
62c7e52487 | ||
|
|
3534ac6477 | ||
|
|
1738f7b311 | ||
|
|
eb25caec81 | ||
|
|
074a799d01 | ||
|
|
36ffd08a72 | ||
|
|
58f828b3cd | ||
|
|
a6c60e2c04 | ||
|
|
e5fba340fb | ||
|
|
ea2241732a | ||
|
|
2b83db7bba | ||
|
|
f636f4d2ec | ||
|
|
8fb6c43c66 | ||
|
|
adafbdf6d3 | ||
|
|
7eab14938d | ||
|
|
039e55673b | ||
|
|
ec3a9b6cb4 | ||
|
|
17a6494b2b | ||
|
|
0b05c7074f | ||
|
|
876ccc7cbf | ||
|
|
bdf14b8f24 | ||
|
|
43375a6f5b | ||
|
|
e00328ae13 | ||
|
|
07c553294b | ||
|
|
e331f7e2ff | ||
|
|
b8217a8858 | ||
|
|
50f81396c7 | ||
|
|
0bca57686d | ||
|
|
df6b9e48d3 | ||
|
|
291cb97a22 | ||
|
|
740e75f8e4 | ||
|
|
b7bbf8d369 | ||
|
|
abf450d6ea | ||
|
|
9072fc2788 | ||
|
|
14968dbb3b | ||
|
|
c79d9ae891 | ||
|
|
dbca131a0f | ||
|
|
621d78172d | ||
|
|
50e962b77e | ||
|
|
07aeb6e58d | ||
|
|
f6e2c6c618 | ||
|
|
44b5b98597 | ||
|
|
ca21c3d266 | ||
|
|
c1f613a1a5 | ||
|
|
6923251a88 | ||
|
|
8222cb8530 | ||
|
|
0eae76180b | ||
|
|
f0cfb69752 | ||
|
|
2e7d2b5bcf | ||
|
|
09b346dcb2 | ||
|
|
46d07b386b | ||
|
|
b21e9dc59e | ||
|
|
2c9fc405e9 | ||
|
|
a0a3d34578 | ||
|
|
8ba4ed20c8 | ||
|
|
5e474851a8 | ||
|
|
c69e68cb27 | ||
|
|
2d0116a9d9 | ||
|
|
bed99dce62 | ||
|
|
e4283c2444 | ||
|
|
407f5d1f71 | ||
|
|
86e4ee4aa9 | ||
|
|
0d7e69f772 | ||
|
|
4d0980d13e | ||
|
|
9239bc1400 | ||
|
|
f1958453c1 | ||
|
|
9adb03a845 | ||
|
|
4d48712470 | ||
|
|
f1d31948e8 | ||
|
|
c79b304eeb | ||
|
|
c1a14a22e8 | ||
|
|
2f6e334eea | ||
|
|
105d8135f7 | ||
|
|
d7c3f2a6ce | ||
|
|
68f2bcef0e | ||
|
|
3883963225 | ||
|
|
b3bed58a4b | ||
|
|
c4cc6bb92d | ||
|
|
62a6cd4430 | ||
|
|
3e7b4cf30c | ||
|
|
bf24573e88 | ||
|
|
0d72798680 | ||
|
|
04fd91ff7d | ||
|
|
0acd8cd939 | ||
|
|
03f17adecf | ||
|
|
5ccf833981 | ||
|
|
5084b3e453 | ||
|
|
c95e6a2ac0 | ||
|
|
d3ffe9140a | ||
|
|
13fb532902 | ||
|
|
7a5dde7100 | ||
|
|
e3f468681a | ||
|
|
27defa21c2 | ||
|
|
f4e9896dbc | ||
|
|
b8a5521430 | ||
|
|
ca39ebb9d4 | ||
|
|
010988d0c1 | ||
|
|
e09a6ccd88 | ||
|
|
c913618dc3 | ||
|
|
6d3050f08a | ||
|
|
b53c1b20d9 | ||
|
|
f67444a9ea | ||
|
|
36be6f3620 | ||
|
|
cf78e6c2a4 | ||
|
|
bcf789030e | ||
|
|
1eaec16ca3 | ||
|
|
6e3dd55804 | ||
|
|
41297e5a21 | ||
|
|
cb215b536c | ||
|
|
d82c157ae4 | ||
|
|
602fc77ff9 | ||
|
|
de71e250e8 | ||
|
|
cacceba502 | ||
|
|
054f9ea08a | ||
|
|
7aa63a65b6 | ||
|
|
82ad774093 | ||
|
|
4342fe9819 | ||
|
|
68feae4111 | ||
|
|
231d8810c8 | ||
|
|
e2add187fd | ||
|
|
fd9fe8967c | ||
|
|
cbba05687d | ||
|
|
480e0c69da | ||
|
|
490a1bd8e5 | ||
|
|
1ecf1d4bc2 | ||
|
|
d21921cb6d | ||
|
|
04534e2ca6 | ||
|
|
4cd180141c | ||
|
|
895b87ae05 | ||
|
|
1c9b7594d3 | ||
|
|
58fe2d93b7 | ||
|
|
a278f8bc79 | ||
|
|
8c287154c8 | ||
|
|
962ad4277a | ||
|
|
a7495bf942 | ||
|
|
1ee80f9697 | ||
|
|
9f541813ef | ||
|
|
9a12c9b044 | ||
|
|
049562af5c | ||
|
|
89681cbe3e | ||
|
|
bafb48fe14 | ||
|
|
015e6301fb | ||
|
|
1efb9daff8 | ||
|
|
8747890e5e | ||
|
|
41c56c150a | ||
|
|
7c931e87a4 | ||
|
|
39e0059f28 | ||
|
|
1b77eeabc0 | ||
|
|
7ce664458f | ||
|
|
db2e9a282a | ||
|
|
32b5dd3f66 | ||
|
|
d53bf0f66e | ||
|
|
04fcdd2545 | ||
|
|
5702810108 | ||
|
|
47eb4cd536 | ||
|
|
626c17f100 | ||
|
|
64ca876920 | ||
|
|
b96b222327 | ||
|
|
d04ee197d9 | ||
|
|
9805ee8044 | ||
|
|
0e78902ff6 | ||
|
|
923447e983 | ||
|
|
e88e8b56c6 | ||
|
|
6e255d9c75 | ||
|
|
59c976c073 | ||
|
|
49c403bacc | ||
|
|
f852037a61 | ||
|
|
9f0fb26e1f | ||
|
|
564968a1e3 | ||
|
|
c8b91fc264 | ||
|
|
ec43c54aff | ||
|
|
2ce13ac463 | ||
|
|
1cc8d2919a | ||
|
|
35dc1239f8 | ||
|
|
31122cf6d3 | ||
|
|
434078cebf | ||
|
|
1fb2d8cadf | ||
|
|
fbf865e865 | ||
|
|
0b1df09f3a | ||
|
|
2e6ebbb9c3 | ||
|
|
071eb26e48 | ||
|
|
2a75ab4581 | ||
|
|
6c255323fb | ||
|
|
a392c5213c | ||
|
|
e382ba2b9a | ||
|
|
557292a56d | ||
|
|
339b6c5025 | ||
|
|
b05c4a91e5 | ||
|
|
a5ab912ffa | ||
|
|
b84be6eea8 | ||
|
|
71875059b6 | ||
|
|
6e814c1dcd | ||
|
|
985b327b69 | ||
|
|
8a5924eeee | ||
|
|
2e59f7f01c | ||
|
|
f7fd544a00 | ||
|
|
8c4d9b66ef | ||
|
|
32d71df837 | ||
|
|
efe7784a3f | ||
|
|
a5af696806 | ||
|
|
23783ec7cd | ||
|
|
0d2ea32dbd | ||
|
|
915f93dc2d | ||
|
|
8f71c8af01 | ||
|
|
6acc422345 | ||
|
|
dde98c7c58 | ||
|
|
dd756d4c00 | ||
|
|
0013020bfa | ||
|
|
14e7b0395c | ||
|
|
f8b09b5f33 | ||
|
|
a3a2b01ec4 | ||
|
|
f0503aa63b | ||
|
|
ff7e1ae8c1 | ||
|
|
e424441380 | ||
|
|
67bcb9aeea | ||
|
|
345a866f50 | ||
|
|
5d1ccc437c | ||
|
|
d221daa864 | ||
|
|
a79562de01 | ||
|
|
c4af45b9e5 | ||
|
|
2aabafdab8 | ||
|
|
2b4b79e339 | ||
|
|
0337ac7758 | ||
|
|
e1f96a009b | ||
|
|
81fe6c4e2a | ||
|
|
cc9b5a93ee | ||
|
|
51dfc3a56b | ||
|
|
98b9567302 | ||
|
|
820eeaee72 | ||
|
|
258bda22da | ||
|
|
15a167905c | ||
|
|
a2c6b919d4 | ||
|
|
42069fe170 | ||
|
|
a7abe6c4c5 | ||
|
|
0568dc0771 | ||
|
|
1c5d1cef70 | ||
|
|
5970d6d716 | ||
|
|
0d9ab6c6fd | ||
|
|
516fa59068 | ||
|
|
64aef11c56 | ||
|
|
17f099386a | ||
|
|
91842add6d | ||
|
|
4a0a00ed95 | ||
|
|
068d9cd719 | ||
|
|
ae8eef640b | ||
|
|
8fad2780c1 | ||
|
|
8b1fb98b09 | ||
|
|
2cbb112f09 | ||
|
|
c5c323a316 | ||
|
|
7ac78df913 | ||
|
|
5e01fe97ac | ||
|
|
bf29e5868e | ||
|
|
31e32cfcf4 | ||
|
|
ef7d75ba9b | ||
|
|
c514cad1d9 | ||
|
|
f79ac6f836 | ||
|
|
b9f939c8b2 | ||
|
|
060e9f330c | ||
|
|
d903bc767c | ||
|
|
42967693d0 | ||
|
|
92cb741822 | ||
|
|
32653216e9 | ||
|
|
9a03dc36c6 | ||
|
|
0e35eea036 | ||
|
|
a09ce6b4fc | ||
|
|
765b837df0 | ||
|
|
fda3386e7b | ||
|
|
0bb756521b | ||
|
|
95a9e45391 | ||
|
|
4e01c8e794 | ||
|
|
1df78ec1fc | ||
|
|
7cdcc3d23d | ||
|
|
66b047d091 | ||
|
|
75f54ae562 | ||
|
|
500763fd11 | ||
|
|
ae8ead825d | ||
|
|
86e8fe19d4 | ||
|
|
a9af791d02 | ||
|
|
5ad9112448 | ||
|
|
090d3b4372 | ||
|
|
c3bcdd544e | ||
|
|
dea9d93e5b | ||
|
|
a299493bd7 | ||
|
|
350a1208f5 | ||
|
|
b8cb90cdd0 | ||
|
|
b47848d63d | ||
|
|
140a9bd084 | ||
|
|
5e0b4ad763 | ||
|
|
370efe1092 | ||
|
|
50cd9b32db | ||
|
|
7f1e537975 | ||
|
|
cdd074c0ae | ||
|
|
bab033be2d | ||
|
|
1b6dcd4da0 | ||
|
|
7cc5e0cf5c | ||
|
|
685dd948e2 | ||
|
|
93359ae147 | ||
|
|
48817d7ecb | ||
|
|
38339eae3f | ||
|
|
140ec1b08d | ||
|
|
be7156e6f6 | ||
|
|
be84b85b69 | ||
|
|
0a36d2786c | ||
|
|
e0f62c0a9b | ||
|
|
f5375bca26 | ||
|
|
f03d6da6b2 | ||
|
|
46bb1cd8e8 | ||
|
|
c104d9fa00 | ||
|
|
23af1d252e | ||
|
|
1e5752736a | ||
|
|
707fc9f756 | ||
|
|
4932ee36ea | ||
|
|
99fc4b8671 | ||
|
|
e9913a66a7 | ||
|
|
57a38303f8 | ||
|
|
b28d31ec44 | ||
|
|
6e1ed24b30 | ||
|
|
adb3436bd7 | ||
|
|
c0bac56761 | ||
|
|
ff281cc20b | ||
|
|
6a4ae0af31 | ||
|
|
4ccfd0adce | ||
|
|
6d4566b94a | ||
|
|
1fa5019ddb | ||
|
|
a5fe5ece50 | ||
|
|
62cc334c66 | ||
|
|
a9fb7969c7 | ||
|
|
9f90159ca2 | ||
|
|
055b3d3d66 | ||
|
|
6761ec7361 | ||
|
|
763971acc6 | ||
|
|
74d92aa671 | ||
|
|
43090a9bd1 | ||
|
|
e57ce5b36e | ||
|
|
6eecf28a64 | ||
|
|
c9f1fcbf51 | ||
|
|
303ccd05b5 | ||
|
|
d9d905e34a | ||
|
|
9f906128c4 | ||
|
|
fca9b7dccb | ||
|
|
48bcf1bd1f | ||
|
|
3f274b1bf8 | ||
|
|
8a8bf8d2f9 | ||
|
|
53bae6e34f | ||
|
|
7f5d5dbad2 | ||
|
|
c06bc97640 | ||
|
|
5899bb535b | ||
|
|
bf1271c840 | ||
|
|
8b2a07e860 | ||
|
|
7e25875fa2 | ||
|
|
a34386ae51 | ||
|
|
413e782af1 | ||
|
|
ccc9908e1e | ||
|
|
90c324b363 | ||
|
|
1260d7cfa3 | ||
|
|
e15075f57f | ||
|
|
2cf02ba102 | ||
|
|
25c02c9960 | ||
|
|
7f2c6a24b6 | ||
|
|
e2272f49d4 | ||
|
|
aa0067c117 | ||
|
|
07c64f9b46 | ||
|
|
4adf0a89fb | ||
|
|
4bd158cc78 | ||
|
|
39ceef99ea | ||
|
|
69d8424cb6 | ||
|
|
3869b3b218 | ||
|
|
4fd9a358a6 | ||
|
|
c9995f3d62 | ||
|
|
1c7c0ee13e | ||
|
|
bd48198a51 | ||
|
|
170312fef8 | ||
|
|
60f02ae34e | ||
|
|
72a0fc458e | ||
|
|
727ccf3b12 | ||
|
|
0cde9de388 | ||
|
|
ea0370ac51 | ||
|
|
45fa191ef6 | ||
|
|
68e87dabbc | ||
|
|
428ded8728 | ||
|
|
c04a342890 | ||
|
|
c72cda1b73 | ||
|
|
9db568206d | ||
|
|
9ea02c888f | ||
|
|
8720f8f335 | ||
|
|
06c4b7ca3c | ||
|
|
8c1b237720 | ||
|
|
7dc6fece7d | ||
|
|
e0929a4cbd | ||
|
|
18bcd79733 | ||
|
|
525facf7b5 | ||
|
|
38317a4ee5 | ||
|
|
eb9a214ba3 | ||
|
|
f9870d45fc | ||
|
|
9bbdef224d | ||
|
|
134b651df8 | ||
|
|
0a15e3e75b | ||
|
|
9a68509847 | ||
|
|
9f162e9ed0 | ||
|
|
003916d393 | ||
|
|
46d50d315a | ||
|
|
f73aed9d48 | ||
|
|
761adca2ef | ||
|
|
b32705ce56 | ||
|
|
4dc40f4df4 | ||
|
|
4b49777eb2 | ||
|
|
cb25333dc3 | ||
|
|
34e4aa1963 | ||
|
|
7810ea6baf | ||
|
|
89399e9f93 | ||
|
|
d08316d6f3 | ||
|
|
b383aab556 | ||
|
|
9cd3cdf3a3 | ||
|
|
7f05cc87c4 | ||
|
|
92004bf43e | ||
|
|
ef0e277f46 | ||
|
|
2ffd2e37e6 | ||
|
|
7d1d1e19d2 | ||
|
|
bea82d80f2 | ||
|
|
cb344d57b2 | ||
|
|
99a4d87982 | ||
|
|
1b94f3f71d | ||
|
|
b2ce937b3f | ||
|
|
5653776cb2 | ||
|
|
413df09ddf | ||
|
|
fc3ca3b814 | ||
|
|
7b43440fae | ||
|
|
01b8b67ffd | ||
|
|
8fbbde6d69 | ||
|
|
da51be1bef | ||
|
|
764beb33bd | ||
|
|
f8c8d7244e | ||
|
|
b6ce3b7ee9 | ||
|
|
48aef2ef01 | ||
|
|
61e4a4aed4 | ||
|
|
b9db6e8dc6 | ||
|
|
d695d3db26 | ||
|
|
ca11651be6 | ||
|
|
2cfe527389 | ||
|
|
f94e66bf74 | ||
|
|
ff3442d9ad | ||
|
|
33c6f1c74d | ||
|
|
da378bf490 | ||
|
|
b3b7a78cec | ||
|
|
545163f60b | ||
|
|
bfcdd3bf4b | ||
|
|
67808b69a6 | ||
|
|
59a4da0c3f | ||
|
|
fd9c5d06af | ||
|
|
19beb3d5cb | ||
|
|
863aa4c4a9 | ||
|
|
90ae798bb8 | ||
|
|
c47d1b7823 | ||
|
|
4e5c77ec47 | ||
|
|
d673c329b6 | ||
|
|
7dfd8148d5 | ||
|
|
a2a70484ed | ||
|
|
36eef1942b | ||
|
|
b154f7ee7f | ||
|
|
ea919b4ecf | ||
|
|
b42a378ca8 | ||
|
|
3b3e89c98f | ||
|
|
708d2e9fb3 | ||
|
|
bee3a9b376 | ||
|
|
566522befb | ||
|
|
a1f8fedefe | ||
|
|
0de09ee9f5 | ||
|
|
0d2af7c011 | ||
|
|
11e373db6f | ||
|
|
2e219916a0 | ||
|
|
a07ee7903b | ||
|
|
abb2521f58 | ||
|
|
d0287ba94e | ||
|
|
56d6efc4e4 | ||
|
|
b6c9eed229 | ||
|
|
eb9a1143e4 | ||
|
|
3e659d981a | ||
|
|
d999d60e9a | ||
|
|
cb0a89cb03 | ||
|
|
ee137c0146 | ||
|
|
9edc32de13 | ||
|
|
c46615f1d2 | ||
|
|
d7d22dbb11 | ||
|
|
bcc1ac115d | ||
|
|
adcf7ca927 | ||
|
|
f78c18abec | ||
|
|
4f7bb6de0b | ||
|
|
45d26a82f2 | ||
|
|
ad99415679 | ||
|
|
568b0291a2 | ||
|
|
89192c7ea0 | ||
|
|
38ed65054e | ||
|
|
391e2d2a17 | ||
|
|
c6b8d27d53 | ||
|
|
3761384dfb | ||
|
|
6dd7315786 | ||
|
|
a2d62ec221 | ||
|
|
4d4d83d15a | ||
|
|
1e3aab1623 | ||
|
|
f7da137e0f | ||
|
|
3dd27976fe | ||
|
|
a92ac8671b | ||
|
|
7c57dcc73d | ||
|
|
55756472c6 | ||
|
|
98237cd53e | ||
|
|
e9cb8112de | ||
|
|
fce67a6bae | ||
|
|
478e472dc4 | ||
|
|
9bdbeeaf70 | ||
|
|
3e604b53fa | ||
|
|
4b0a3627d4 | ||
|
|
3a95cc9b58 | ||
|
|
f6aa71e9fb | ||
|
|
d67026edba | ||
|
|
75dfc638e1 | ||
|
|
07b337f3f1 | ||
|
|
271fc8a35f | ||
|
|
c7bd2123e8 | ||
|
|
5721638cd6 | ||
|
|
20bbf85082 | ||
|
|
3a2f087381 | ||
|
|
b8c9d4faf2 | ||
|
|
860f7b7b49 | ||
|
|
b7dd4a845a | ||
|
|
1bf9fde684 | ||
|
|
608a286428 | ||
|
|
4145124762 | ||
|
|
9f7da9a57a | ||
|
|
2cdb2fce42 | ||
|
|
dc9a6fc825 | ||
|
|
6ae6c91a71 | ||
|
|
ba76de7226 | ||
|
|
609ee4621e | ||
|
|
3c9b624ca0 | ||
|
|
135f66e46f | ||
|
|
1cd4617c69 | ||
|
|
8cb0e66bff | ||
|
|
6ce964ef18 | ||
|
|
db3f97eccf | ||
|
|
df1b0e3f0f | ||
|
|
4749186d86 | ||
|
|
82d80ebc4d | ||
|
|
ea5cbf3f0c | ||
|
|
4d08857de1 | ||
|
|
e203945ea3 | ||
|
|
ca5cfed82f | ||
|
|
0924fa2bdb | ||
|
|
f299fcaffc | ||
|
|
6be3ca41f8 | ||
|
|
a70c981b47 | ||
|
|
ea2140559b | ||
|
|
e4ef0021e8 | ||
|
|
7b9788bfa9 | ||
|
|
daa5764bfb | ||
|
|
2e42cbed06 | ||
|
|
5b3dfbcc21 | ||
|
|
962649c0f2 | ||
|
|
a683eb6290 | ||
|
|
4daee03f0d | ||
|
|
7e511f590d | ||
|
|
bffe953c3f | ||
|
|
c86ad3f2f6 | ||
|
|
563b54de14 | ||
|
|
82498e8e5a | ||
|
|
e7fa9cc494 | ||
|
|
c04bd92c23 | ||
|
|
0a31043bc9 | ||
|
|
27ac58518c | ||
|
|
8bafb32e95 | ||
|
|
55d9a3516c | ||
|
|
b4b7b08d47 | ||
|
|
553ac01e93 | ||
|
|
0e4490576a | ||
|
|
3c5ffed352 | ||
|
|
8b81743cb1 | ||
|
|
9b5573c210 | ||
|
|
932daa730a | ||
|
|
0b029a5f79 | ||
|
|
ac42a9cd8f | ||
|
|
4e863811a1 | ||
|
|
90fe93d3f0 | ||
|
|
4c4a909798 | ||
|
|
ba0a7d35cb | ||
|
|
86539771e2 | ||
|
|
8a8136b8e8 | ||
|
|
8916d9b4f0 | ||
|
|
92015c1a13 | ||
|
|
80d45f364a | ||
|
|
3a59df6ac6 | ||
|
|
c3f059c7fc | ||
|
|
b3ba8f5c9f | ||
|
|
cd9b8536cb | ||
|
|
3a2695703b | ||
|
|
e4ddcdeeca | ||
|
|
69f3c9af71 | ||
|
|
6a41c5391d | ||
|
|
d9c05fa622 | ||
|
|
ee1fc0d55c | ||
|
|
7f086fb850 | ||
|
|
fafd77c661 | ||
|
|
d99fc602d5 | ||
|
|
99a82a6b84 | ||
|
|
60c2405cad | ||
|
|
27a6a1f4d0 | ||
|
|
584ad46b75 | ||
|
|
f99698feda | ||
|
|
b3c7db9214 | ||
|
|
7168813ba5 | ||
|
|
8068082768 | ||
|
|
322b88a1f4 | ||
|
|
f85fb8f224 | ||
|
|
76f3d2599b | ||
|
|
92a0af8dbb | ||
|
|
fb2205d700 | ||
|
|
526fe799f6 | ||
|
|
0c9bb0d948 | ||
|
|
d6a35a577b | ||
|
|
508fac6168 | ||
|
|
7c47ef0550 | ||
|
|
e838bb641b | ||
|
|
e73f4cbe63 | ||
|
|
ffafd44fa7 | ||
|
|
c54aa5f9fc | ||
|
|
b899708cd5 | ||
|
|
14f98493c7 | ||
|
|
c7e470166d | ||
|
|
db218139b3 | ||
|
|
b73eae787c | ||
|
|
df842a2209 | ||
|
|
64bde9c197 | ||
|
|
6cf599f6bc | ||
|
|
d9adef611d | ||
|
|
9ffc09ac02 | ||
|
|
a113295058 | ||
|
|
7e5cef2842 | ||
|
|
969aeec1c7 | ||
|
|
e66b25f803 | ||
|
|
7f9cc6e010 | ||
|
|
964e7a4363 | ||
|
|
aec0115d9b | ||
|
|
3191c20a8c | ||
|
|
2a52f9adef | ||
|
|
c44cddfb92 | ||
|
|
9649538a56 | ||
|
|
d5ca5993aa | ||
|
|
ce7b203b9c | ||
|
|
294f8fe02b | ||
|
|
21c6695a05 | ||
|
|
6fb30928a1 | ||
|
|
033c008263 | ||
|
|
7dcefdf5d7 | ||
|
|
f526bda748 | ||
|
|
7a3e3b394b | ||
|
|
e488627fcc | ||
|
|
82aeba3a05 | ||
|
|
c56d5567f2 | ||
|
|
52160d48c4 | ||
|
|
ce516f24c0 | ||
|
|
a3c8241b8d | ||
|
|
10a6eec3da | ||
|
|
715abf1444 | ||
|
|
e745c260f0 | ||
|
|
b7c2e09b81 | ||
|
|
48172fb220 | ||
|
|
0aabc9a923 | ||
|
|
44b99a8781 | ||
|
|
5d6e43313b | ||
|
|
c1c660fd53 | ||
|
|
1582d36222 | ||
|
|
11bcd26027 | ||
|
|
b8eb198b09 | ||
|
|
c0521ba2b7 | ||
|
|
59cd2b0dc1 | ||
|
|
611e34add2 | ||
|
|
16adeb88ca | ||
|
|
566bb8144a | ||
|
|
0b932119b0 | ||
|
|
9fefebd4a3 | ||
|
|
d4e7a6691c | ||
|
|
ad4f9d3540 | ||
|
|
6868c9de24 | ||
|
|
56a6b9d204 | ||
|
|
e52b8e894b | ||
|
|
0bc41323b1 | ||
|
|
3a7ad74ab6 | ||
|
|
7ed0b8a052 | ||
|
|
718fe56cda | ||
|
|
eee949de93 | ||
|
|
b5e2848091 | ||
|
|
1ab8540f73 | ||
|
|
c029a881e9 | ||
|
|
334a706af3 | ||
|
|
1e208c0881 | ||
|
|
61b87cbba7 | ||
|
|
d1d6972930 | ||
|
|
72e823744c | ||
|
|
4985005b3e | ||
|
|
ce8d5f0129 | ||
|
|
9c83e6f9d9 | ||
|
|
21241aa5df | ||
|
|
54e4f08ea2 | ||
|
|
e18c046ee7 | ||
|
|
4365fafb77 | ||
|
|
a3217f44be | ||
|
|
da62046ce0 | ||
|
|
b9722ec292 | ||
|
|
cfb4f38d15 | ||
|
|
48d66a0d42 | ||
|
|
d454878245 | ||
|
|
cace195e18 | ||
|
|
129aff909c | ||
|
|
6cfd078469 | ||
|
|
4acc4192af | ||
|
|
e554171e22 | ||
|
|
de38c8727a | ||
|
|
0a78958e44 | ||
|
|
353cd0ab23 | ||
|
|
b73c8e9045 | ||
|
|
5729492c6a | ||
|
|
0c45e6d36f | ||
|
|
677988ea44 | ||
|
|
c30ca2fb1f | ||
|
|
cd9d7f7652 | ||
|
|
84e24b4951 | ||
|
|
ef367c2981 | ||
|
|
ec10ac7ba5 | ||
|
|
4bbe1db54a | ||
|
|
3494ae1e6b | ||
|
|
123f9eb588 | ||
|
|
40e4770425 | ||
|
|
ed0f9daef3 | ||
|
|
beb9d5927e | ||
|
|
225e55d956 | ||
|
|
2114d9832f | ||
|
|
b6b1485841 | ||
|
|
c4f939278a | ||
|
|
195a7e2cea | ||
|
|
dc868305f0 | ||
|
|
c60a4d8d39 | ||
|
|
de7e3ba73d | ||
|
|
4d76014633 | ||
|
|
320d95ae2f | ||
|
|
6d73e12c5c | ||
|
|
0513cc978e | ||
|
|
7c079c3998 | ||
|
|
d729fbb287 | ||
|
|
14c98d9376 | ||
|
|
888fa25e9a | ||
|
|
5a0136cd3d | ||
|
|
3419c1ceea | ||
|
|
4ae55b9bd8 | ||
|
|
6b146bfdc4 | ||
|
|
620fad57fe | ||
|
|
f24605735e | ||
|
|
7e9e0d2c5b | ||
|
|
1487efc46b | ||
|
|
2df4f658c9 | ||
|
|
4462e34ca4 | ||
|
|
4adfbc0723 | ||
|
|
c0e92bddc2 | ||
|
|
40b7546946 | ||
|
|
59e3938a72 | ||
|
|
513c254479 | ||
|
|
df7b23c0de | ||
|
|
edd1c0e9a6 | ||
|
|
0a783f7561 | ||
|
|
235ea84dcd | ||
|
|
3e005c3a51 | ||
|
|
88e09c479f | ||
|
|
83eab27a90 | ||
|
|
c02c5750c6 | ||
|
|
09d7ff0740 | ||
|
|
ed1a6192c7 | ||
|
|
ae968211ab | ||
|
|
a3170bfb4b | ||
|
|
344c5900b8 | ||
|
|
1d74643fe3 | ||
|
|
38e5081b0e | ||
|
|
8fa20c6f93 | ||
|
|
45ab68caa4 | ||
|
|
3329d61636 | ||
|
|
5299da784a | ||
|
|
e5b7bd1fa6 | ||
|
|
881907c53a | ||
|
|
6a03b58aa6 | ||
|
|
e38be1e18f | ||
|
|
1ff42b775c | ||
|
|
cfe8d20d2b | ||
|
|
aa8f59f6f7 | ||
|
|
f3b6f5595b | ||
|
|
0448448263 | ||
|
|
0914580bea | ||
|
|
914575a360 | ||
|
|
259025d572 | ||
|
|
aa3c70ae31 | ||
|
|
2f4b675a2c | ||
|
|
662d1d2b85 | ||
|
|
6e92836deb | ||
|
|
b1bd09bfc4 | ||
|
|
7e08a3d8ab | ||
|
|
cb5c2c668a | ||
|
|
c93f932caa | ||
|
|
f855ec9a19 | ||
|
|
6817c3dffe | ||
|
|
c17f745461 | ||
|
|
664b5fea73 | ||
|
|
3c118ed88b | ||
|
|
1d965c0785 | ||
|
|
37ccfaa509 | ||
|
|
eb20d926e3 | ||
|
|
0ee7507467 | ||
|
|
c1bba30dec | ||
|
|
db0e9d1847 | ||
|
|
ef74d1ae8c | ||
|
|
0779fbab87 | ||
|
|
028135f859 | ||
|
|
cfa59d8012 | ||
|
|
ca40d7a71d | ||
|
|
ccd6032c15 | ||
|
|
ecec3833c4 | ||
|
|
98eb557c58 | ||
|
|
f75323e7e2 | ||
|
|
c8c275bcd5 | ||
|
|
ca9a72e338 | ||
|
|
aaff8e7d6b | ||
|
|
f9205eb4e2 | ||
|
|
de3818aef6 | ||
|
|
5d0166a29a | ||
|
|
98f0928a4b | ||
|
|
23a07175e5 | ||
|
|
beff5c3e06 | ||
|
|
6b62c90bc8 | ||
|
|
ef6bb65e73 | ||
|
|
6f82ee24d9 | ||
|
|
97165bbdfe | ||
|
|
30175be56a | ||
|
|
4fe6040707 | ||
|
|
aaa67ec635 | ||
|
|
93f6d0be0b | ||
|
|
fe953aa8c4 | ||
|
|
902376b517 | ||
|
|
e56c534d2b | ||
|
|
74fe401ff1 | ||
|
|
862230008e | ||
|
|
93cd329f20 | ||
|
|
c550360a43 | ||
|
|
2e3c9e703b | ||
|
|
dffc16f5ce | ||
|
|
f47eb63057 | ||
|
|
9d6b3ab3ff | ||
|
|
b18994a7c0 | ||
|
|
e483280a3c | ||
|
|
0bb3c84fed | ||
|
|
2eb9705c3a | ||
|
|
ec37e1f9f9 | ||
|
|
b4002fa1a5 | ||
|
|
a7dccb6301 | ||
|
|
2827db5db5 | ||
|
|
460a2152c8 | ||
|
|
5edbc81934 | ||
|
|
335484944f | ||
|
|
8b6bc38082 | ||
|
|
b51843942b | ||
|
|
a0310b6767 | ||
|
|
2b90679087 | ||
|
|
d951eb4b38 | ||
|
|
847c8bc08f | ||
|
|
5efb5d0d4b | ||
|
|
0d7620900b | ||
|
|
dfd0d7e668 | ||
|
|
1be669aa66 | ||
|
|
95352e778d | ||
|
|
88bf38b858 | ||
|
|
16fb40e104 | ||
|
|
d0279599f6 | ||
|
|
bfb6b0f5eb | ||
|
|
3f8d772f8f | ||
|
|
07e993b0ba | ||
|
|
1169f44041 | ||
|
|
563fe8684a | ||
|
|
a85391e5a4 | ||
|
|
fc6f400e09 | ||
|
|
55fc6a68e1 | ||
|
|
e1811c7bfc | ||
|
|
bccbb1d8b7 | ||
|
|
2b214f8934 | ||
|
|
6a5f0596e0 | ||
|
|
8f87bc5ca0 | ||
|
|
a0e63cde8f | ||
|
|
94e3a594ec | ||
|
|
bbf0709643 | ||
|
|
4492a93df4 | ||
|
|
65e7566d0f | ||
|
|
1c496b3c98 | ||
|
|
ee115a473d | ||
|
|
5a4559d7b2 | ||
|
|
3b69c8c267 | ||
|
|
14c4443f20 | ||
|
|
a01a342fd8 | ||
|
|
1cb103c156 | ||
|
|
84bae3141c | ||
|
|
307f52866d | ||
|
|
7ef338be1d | ||
|
|
385b89e6ba | ||
|
|
41a53d1205 | ||
|
|
a85bbde9d2 | ||
|
|
13d83c0003 | ||
|
|
f21e51f74a | ||
|
|
045840ec54 | ||
|
|
4e1455be7f | ||
|
|
3881c2b1d0 | ||
|
|
bbdbead1ff | ||
|
|
24b6820a1b | ||
|
|
2b307daeb2 | ||
|
|
fb15ee912b | ||
|
|
3b7c516975 | ||
|
|
33603958b1 | ||
|
|
f669be18b3 | ||
|
|
dcae131b67 | ||
|
|
f5d5dce791 | ||
|
|
5a0910eb5c | ||
|
|
2befa063ef | ||
|
|
f4da8544d3 | ||
|
|
60a9f14aa3 | ||
|
|
39b07df2e2 | ||
|
|
5f6883059f | ||
|
|
6b2790f9c1 | ||
|
|
73d2129394 | ||
|
|
8e236d0780 | ||
|
|
00d0048fd0 | ||
|
|
f744c64737 | ||
|
|
33334ed13c | ||
|
|
2e64164251 | ||
|
|
03060478ee | ||
|
|
94b863a835 | ||
|
|
ab14173aaa | ||
|
|
eb5e09c3f4 | ||
|
|
1142676c87 | ||
|
|
76af946b5f | ||
|
|
b6b9d7635f | ||
|
|
68ae4604b0 | ||
|
|
c06da74eec | ||
|
|
a4029fb6e2 | ||
|
|
3dbdad2580 | ||
|
|
626967cd86 | ||
|
|
113d74cffe | ||
|
|
db71635f16 | ||
|
|
177175cc1d | ||
|
|
5ddc40db3b | ||
|
|
0039785a5a | ||
|
|
867fdee328 | ||
|
|
f8d499f314 | ||
|
|
1945412f5a | ||
|
|
16db4d15bc | ||
|
|
f97d9844f9 | ||
|
|
7473067329 | ||
|
|
6fe690d592 | ||
|
|
ce381f612c | ||
|
|
8c919bcd2a | ||
|
|
531cd52664 | ||
|
|
dcac0634a8 | ||
|
|
e7ceeac7b8 | ||
|
|
bbbf0c4160 | ||
|
|
584fde5579 | ||
|
|
66f0c12790 | ||
|
|
b310a3eb63 | ||
|
|
03a2ead922 | ||
|
|
4f60811f6b | ||
|
|
ec19f18d73 | ||
|
|
f0eb19c255 | ||
|
|
604a86feb0 | ||
|
|
3e2fbb700b | ||
|
|
863c782f72 | ||
|
|
83eb1a3370 | ||
|
|
4a06f18d55 | ||
|
|
e38a04bf23 | ||
|
|
095aee57bc | ||
|
|
b000c9b60f | ||
|
|
e3f675a42b | ||
|
|
93a91f9d41 | ||
|
|
6da0df7eb7 | ||
|
|
0ce94360f7 | ||
|
|
110a05d5a4 | ||
|
|
cfd93f2ca0 | ||
|
|
5830a9ef82 | ||
|
|
ea4862f76e | ||
|
|
7d655bc44b | ||
|
|
bfa15ddee0 | ||
|
|
028c49ac84 | ||
|
|
396e3dda28 | ||
|
|
e640a5064c | ||
|
|
f0f91325ba | ||
|
|
d5c219897d | ||
|
|
c51f6b73af | ||
|
|
cacf67a81c | ||
|
|
72a610fd0c | ||
|
|
bbbd5f8996 | ||
|
|
994db1e131 | ||
|
|
4422182eae | ||
|
|
7a2c0d3456 | ||
|
|
8fde121570 | ||
|
|
3260582e37 | ||
|
|
52e46380a9 | ||
|
|
a572a5fbf9 | ||
|
|
176fdb51da | ||
|
|
6a948fbe2e | ||
|
|
2ef60933b2 | ||
|
|
85798822cc | ||
|
|
0dad677bc0 | ||
|
|
4c625cdfbf | ||
|
|
6912a06351 | ||
|
|
2e576b3065 | ||
|
|
dc23755081 | ||
|
|
8ae973f5f4 | ||
|
|
6ac1911770 | ||
|
|
f723e35785 | ||
|
|
4db45a9cbf | ||
|
|
d9125566f7 | ||
|
|
70ca0a1df3 | ||
|
|
3fd2f519eb | ||
|
|
5af1687f19 | ||
|
|
10cd3636f7 | ||
|
|
38e25bf132 | ||
|
|
ffe0ecd488 | ||
|
|
61df76c80a | ||
|
|
82249a6d6d | ||
|
|
ecaf56f647 | ||
|
|
8dc647fb4f | ||
|
|
7b16c55dc6 | ||
|
|
f1a652122c | ||
|
|
1e0738594a | ||
|
|
eac2e3f42b | ||
|
|
2c0a46e652 | ||
|
|
9fa83fc359 | ||
|
|
97948caa48 | ||
|
|
9ff4d7c6dc | ||
|
|
cbe82bb95a | ||
|
|
6ad4d87487 | ||
|
|
6c138a1515 | ||
|
|
b8be399df7 | ||
|
|
2462cc13dd | ||
|
|
eddedbee5b | ||
|
|
58c4ece887 | ||
|
|
f64c059f26 | ||
|
|
5cfb451041 | ||
|
|
8e457abe6d | ||
|
|
d837af7c33 | ||
|
|
abd8697d56 | ||
|
|
77b3213e79 | ||
|
|
7817b4cd49 | ||
|
|
ce02a1ea65 | ||
|
|
15580f478f | ||
|
|
b2ad7e0478 | ||
|
|
642cb3fdcf | ||
|
|
a0b805698e | ||
|
|
879516632b | ||
|
|
8e692ea21e | ||
|
|
727309a706 | ||
|
|
c0e3fcffd1 | ||
|
|
61bdda7886 | ||
|
|
50c2972f99 | ||
|
|
f98eaa4d6b | ||
|
|
cf801ed7f6 | ||
|
|
b2fd5990af | ||
|
|
ab8ee542c6 | ||
|
|
3cf6f28d83 | ||
|
|
e31f320b45 | ||
|
|
fa0cfa5191 | ||
|
|
d425050387 | ||
|
|
39f3e4ed2c | ||
|
|
1ed51c8e02 | ||
|
|
663aafb4c8 | ||
|
|
b90b8ca422 | ||
|
|
0e3fdcd8c2 | ||
|
|
36cb532b20 | ||
|
|
3cec1b4466 | ||
|
|
825f41e469 | ||
|
|
2fac480117 | ||
|
|
2c3aa6e7e5 | ||
|
|
78f7503558 | ||
|
|
6a1b461735 | ||
|
|
de41702914 | ||
|
|
21cf22f4cf | ||
|
|
7539505956 | ||
|
|
c6e0680583 | ||
|
|
4a946b6b3a | ||
|
|
0719fa9953 | ||
|
|
14adea8b2e | ||
|
|
3ec16d04d6 | ||
|
|
1c228df4a8 | ||
|
|
592caa40ea | ||
|
|
20dba75602 | ||
|
|
c82a414567 | ||
|
|
1c9e22d964 | ||
|
|
f7f71ef7cf | ||
|
|
1a7003ce59 | ||
|
|
889e969c44 | ||
|
|
f51bfc6d2b | ||
|
|
715fdeec9e | ||
|
|
c57ae6d916 | ||
|
|
bc1fc5748c | ||
|
|
ad9908fda1 | ||
|
|
cbd9021cfa | ||
|
|
49af4b8920 | ||
|
|
9442bb1d39 | ||
|
|
efa504a714 | ||
|
|
ea34418f2d | ||
|
|
8ff0216243 | ||
|
|
332c860def | ||
|
|
038cac8aed | ||
|
|
00877279bc | ||
|
|
da073feb08 | ||
|
|
adae9a9ce1 | ||
|
|
53a6b09099 | ||
|
|
e78d1f4ac4 | ||
|
|
11e5439e1d | ||
|
|
78cdb6967a | ||
|
|
79d05f1fb2 | ||
|
|
2a140a6ce1 | ||
|
|
a2bdfcc031 | ||
|
|
0f2ca3e62e | ||
|
|
55e6ca2d41 | ||
|
|
837c2fa1f9 | ||
|
|
c596aa5a01 | ||
|
|
af38dd8fb9 | ||
|
|
dab9097680 | ||
|
|
04fc0d6815 | ||
|
|
4eb1350c3b | ||
|
|
9e7cbdc2d3 | ||
|
|
c89b60221e | ||
|
|
b88a10d509 | ||
|
|
6672f750d9 | ||
|
|
5ff4703b14 | ||
|
|
87dfc968aa | ||
|
|
fba041db5e | ||
|
|
cad78c55bd | ||
|
|
0c4187faeb | ||
|
|
c2a84ed31b | ||
|
|
b6506ac3f1 | ||
|
|
920fcd4b8e | ||
|
|
c59c0629a7 | ||
|
|
8fbd408fb4 | ||
|
|
4e6411e555 | ||
|
|
d70305b0b6 | ||
|
|
0469754d5d | ||
|
|
7cb0e5f6b2 | ||
|
|
cec70b3b64 | ||
|
|
21ff024bf8 | ||
|
|
3f700f57a7 | ||
|
|
68294baae6 | ||
|
|
526c078978 | ||
|
|
f3fee3140a | ||
|
|
e0af139b24 | ||
|
|
313c13c588 | ||
|
|
8ef5cb4e22 | ||
|
|
2643be456e | ||
|
|
29c6d6cd8e | ||
|
|
c84fb60177 | ||
|
|
d8dad9f087 | ||
|
|
45f94c736a | ||
|
|
7a670ffdbf | ||
|
|
325c8b8254 | ||
|
|
90335355b7 | ||
|
|
4c10e01539 | ||
|
|
a76534f0af | ||
|
|
a06420eae3 | ||
|
|
48d435f2c1 | ||
|
|
43380962cc | ||
|
|
14247715fd | ||
|
|
7282868eac | ||
|
|
b30e35f465 | ||
|
|
d9352b6d34 | ||
|
|
26dcccad81 | ||
|
|
d0cf94dbf9 | ||
|
|
f61bb925f8 | ||
|
|
5929d5dd56 | ||
|
|
5a19507f53 | ||
|
|
5c3ea2c4c3 | ||
|
|
1fef5e7c05 | ||
|
|
743e1f150d | ||
|
|
7c983d04a3 | ||
|
|
73edd8d932 | ||
|
|
cd0e31f39d | ||
|
|
9e6c96a487 | ||
|
|
523e83a49c | ||
|
|
c9972962d1 | ||
|
|
4b8e0cb041 | ||
|
|
3ec985e3d9 | ||
|
|
af7d801388 | ||
|
|
98470d4b1a | ||
|
|
81b7259423 | ||
|
|
d6a505fd00 | ||
|
|
a71bf4330b | ||
|
|
72cbcb13fc | ||
|
|
8904fb8828 | ||
|
|
93b33ce37e | ||
|
|
9ce06da271 | ||
|
|
a460a201e1 | ||
|
|
1493d3ad45 | ||
|
|
ee676a08ea | ||
|
|
0c87410018 | ||
|
|
9268fa8b01 | ||
|
|
eea13b22a0 | ||
|
|
fe87253a86 | ||
|
|
701bf85c8b | ||
|
|
d4d24c9443 | ||
|
|
23f44f1fb8 | ||
|
|
9a2503b9c3 | ||
|
|
825d1897cb | ||
|
|
c002eec8bd | ||
|
|
0fd5d09e3e | ||
|
|
e9850a51bc | ||
|
|
df09b6e38b | ||
|
|
52d3d8ee3a | ||
|
|
7bc09d86bd | ||
|
|
860d4d9b31 | ||
|
|
4b5ce5bdb1 | ||
|
|
302358e31c | ||
|
|
83b514a05f | ||
|
|
2f22b3b91b | ||
|
|
f979a7b694 | ||
|
|
78be9bfd4f | ||
|
|
5f0803eec4 | ||
|
|
6cf7b88025 | ||
|
|
d3e05ec247 | ||
|
|
5853dc802d | ||
|
|
a35c5ef3cc | ||
|
|
dfd6beb988 | ||
|
|
ebeda7d7ba | ||
|
|
5fe518f8a1 | ||
|
|
ab82529a4b | ||
|
|
9988863a85 | ||
|
|
8a3c3d7571 | ||
|
|
3ae1c2ebb2 | ||
|
|
5ab4eb5b32 | ||
|
|
09d0046baf | ||
|
|
865c50f984 | ||
|
|
f0b80f8eb3 | ||
|
|
77aa14b7da | ||
|
|
e6af752c6d | ||
|
|
2436579752 | ||
|
|
aef34d434a | ||
|
|
2922fdf623 | ||
|
|
3f35df3916 | ||
|
|
e79a907f3b | ||
|
|
45ab56e98d | ||
|
|
246bfe59cb | ||
|
|
afa74ba6fe | ||
|
|
02ed3ff778 | ||
|
|
14d1c7ccbb | ||
|
|
0f5b0493b9 | ||
|
|
efab188ebd | ||
|
|
eaaa5bf717 | ||
|
|
4812068982 | ||
|
|
3189ac0d56 | ||
|
|
f8a9262fc5 | ||
|
|
9ce7e1c5ca | ||
|
|
2e5c05d932 | ||
|
|
56ad9d7907 | ||
|
|
65840e89b6 | ||
|
|
69c78fa5a6 | ||
|
|
3c610a8564 | ||
|
|
4f2954041d | ||
|
|
24d96f24b2 | ||
|
|
ad4678ab3c | ||
|
|
d5d957a910 | ||
|
|
d89cd97eb6 | ||
|
|
16e4f3fa7a | ||
|
|
657cc0cf9e | ||
|
|
45234d24ca | ||
|
|
cd55105b28 | ||
|
|
d9b5544894 | ||
|
|
a62617324d | ||
|
|
8665011457 | ||
|
|
18bf19502f | ||
|
|
168a4f2a17 | ||
|
|
d3f77d10c5 | ||
|
|
bf87894f8c | ||
|
|
59cebf9e9b | ||
|
|
87e18351be | ||
|
|
94bc41ab9d | ||
|
|
c795238231 | ||
|
|
43c32ce329 | ||
|
|
4f60640ddf | ||
|
|
f87d39b51c | ||
|
|
0475cc1e66 | ||
|
|
79702eab1a | ||
|
|
261e3a6c49 | ||
|
|
e8b7d63a59 | ||
|
|
638985d332 | ||
|
|
894427af72 | ||
|
|
e6bbb53ac8 | ||
|
|
cb279a5d5a | ||
|
|
2af224c90f | ||
|
|
8faec41487 | ||
|
|
93a8274b7b | ||
|
|
d8fd03b287 | ||
|
|
3c7e1827f2 | ||
|
|
24057e6412 | ||
|
|
a59dbdc4e1 | ||
|
|
8105544894 | ||
|
|
3456e14d04 | ||
|
|
c45491a3d2 | ||
|
|
4205ebe384 | ||
|
|
890f9ad49d | ||
|
|
bf3517ebb3 | ||
|
|
459d61b20a | ||
|
|
0beb75c9fb | ||
|
|
2997e5bda2 | ||
|
|
a6d5240a66 | ||
|
|
e1b3fa0438 | ||
|
|
bb2bdce93b | ||
|
|
bbfdde57a3 | ||
|
|
d4eef9097a | ||
|
|
d8a90902b5 |
-8203
File diff suppressed because one or more lines are too long
+46
-14
@@ -139,8 +139,8 @@ public class Enum {
|
|||||||
HALFGIANTMALE(2010, MonsterType.HalfGiant, RunSpeed.STANDARD, CharacterSex.MALE, 1.15f),
|
HALFGIANTMALE(2010, MonsterType.HalfGiant, RunSpeed.STANDARD, CharacterSex.MALE, 1.15f),
|
||||||
HUMANMALE(2011, MonsterType.Human, RunSpeed.STANDARD, CharacterSex.MALE, 1),
|
HUMANMALE(2011, MonsterType.Human, RunSpeed.STANDARD, CharacterSex.MALE, 1),
|
||||||
HUMANFEMALE(2012, MonsterType.Human, RunSpeed.STANDARD, CharacterSex.FEMALE, 1),
|
HUMANFEMALE(2012, MonsterType.Human, RunSpeed.STANDARD, CharacterSex.FEMALE, 1),
|
||||||
IREKEIMALE(2013, MonsterType.Irekei, RunSpeed.STANDARD, CharacterSex.MALE, 1.1f),
|
IREKEIMALE(2013, MonsterType.Irekei, RunSpeed.IREKEI, CharacterSex.MALE, 1.1f),
|
||||||
IREKEIFEMALE(2014, MonsterType.Irekei, RunSpeed.STANDARD, CharacterSex.FEMALE, 1.1f),
|
IREKEIFEMALE(2014, MonsterType.Irekei, RunSpeed.IREKEI, CharacterSex.FEMALE, 1.1f),
|
||||||
SHADEMALE(2015, MonsterType.Shade, RunSpeed.STANDARD, CharacterSex.MALE, 1),
|
SHADEMALE(2015, MonsterType.Shade, RunSpeed.STANDARD, CharacterSex.MALE, 1),
|
||||||
SHADEFEMALE(2016, MonsterType.Shade, RunSpeed.STANDARD, CharacterSex.FEMALE, 1),
|
SHADEFEMALE(2016, MonsterType.Shade, RunSpeed.STANDARD, CharacterSex.FEMALE, 1),
|
||||||
MINOMALE(2017, MonsterType.Minotaur, RunSpeed.MINOTAUR, CharacterSex.MALE, 1.3f),
|
MINOMALE(2017, MonsterType.Minotaur, RunSpeed.MINOTAUR, CharacterSex.MALE, 1.3f),
|
||||||
@@ -152,7 +152,9 @@ public class Enum {
|
|||||||
NEPHFEMALE(2026, MonsterType.Nephilim, RunSpeed.STANDARD, CharacterSex.FEMALE, 1.1f),
|
NEPHFEMALE(2026, MonsterType.Nephilim, RunSpeed.STANDARD, CharacterSex.FEMALE, 1.1f),
|
||||||
HALFGIANTFEMALE(2027, MonsterType.HalfGiant, RunSpeed.STANDARD, CharacterSex.FEMALE, 1.15f),
|
HALFGIANTFEMALE(2027, MonsterType.HalfGiant, RunSpeed.STANDARD, CharacterSex.FEMALE, 1.15f),
|
||||||
VAMPMALE(2028, MonsterType.Vampire, RunSpeed.STANDARD, CharacterSex.MALE, 1),
|
VAMPMALE(2028, MonsterType.Vampire, RunSpeed.STANDARD, CharacterSex.MALE, 1),
|
||||||
VAMPFEMALE(2029, MonsterType.Vampire, RunSpeed.STANDARD, CharacterSex.FEMALE, 1);
|
VAMPFEMALE(2029, MonsterType.Vampire, RunSpeed.STANDARD, CharacterSex.FEMALE, 1),
|
||||||
|
SAETOR(1999, MonsterType.Minotaur, RunSpeed.MINOTAUR, CharacterSex.MALE, 0.80000001f),
|
||||||
|
LIZARDMAN(1998, MonsterType.Reptile, RunSpeed.STANDARD, CharacterSex.MALE, 1.05f);
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
private static HashMap<Integer, RaceType> _raceTypeByID = new HashMap<>();
|
private static HashMap<Integer, RaceType> _raceTypeByID = new HashMap<>();
|
||||||
@@ -208,6 +210,7 @@ public class Enum {
|
|||||||
SENTINEL(0, 0, 0, 0, 0, 0, 0),
|
SENTINEL(0, 0, 0, 0, 0, 0, 0),
|
||||||
STANDARD(6.1900001f, 13.97f, 4.2199998f, 13.97f, 6.3299999f, 18.379999f, 6.5f),
|
STANDARD(6.1900001f, 13.97f, 4.2199998f, 13.97f, 6.3299999f, 18.379999f, 6.5f),
|
||||||
CENTAUR(6.1900001f, 16.940001f, 5.5500002f, 16.940001f, 6.3299999f, 18.379999f, 6.5f),
|
CENTAUR(6.1900001f, 16.940001f, 5.5500002f, 16.940001f, 6.3299999f, 18.379999f, 6.5f),
|
||||||
|
IREKEI(6.35f, 15.25f, 4.2199998f, 14.5f, 6.3299999f, 18.379999f, 6.5f),
|
||||||
MINOTAUR(6.6300001f, 15.95f, 4.2199998f, 15.95f, 6.3299999f, 18.379999f, 6.5f);
|
MINOTAUR(6.6300001f, 15.95f, 4.2199998f, 15.95f, 6.3299999f, 18.379999f, 6.5f);
|
||||||
|
|
||||||
private float walkStandard;
|
private float walkStandard;
|
||||||
@@ -960,7 +963,17 @@ public class Enum {
|
|||||||
SourceType returnMod;
|
SourceType returnMod;
|
||||||
if (modName.isEmpty())
|
if (modName.isEmpty())
|
||||||
return SourceType.None;
|
return SourceType.None;
|
||||||
|
switch(modName) {
|
||||||
|
case "Piercing":
|
||||||
|
modName = "Pierce";
|
||||||
|
break;
|
||||||
|
case "Crushing":
|
||||||
|
modName = "Crush";
|
||||||
|
break;
|
||||||
|
case "Slashing":
|
||||||
|
modName = "Slash";
|
||||||
|
break;
|
||||||
|
}
|
||||||
try {
|
try {
|
||||||
returnMod = SourceType.valueOf(modName.replace(",", ""));
|
returnMod = SourceType.valueOf(modName.replace(",", ""));
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
@@ -1652,6 +1665,24 @@ public class Enum {
|
|||||||
return extents;
|
return extents;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isTrainerBuilding(){
|
||||||
|
switch(this){
|
||||||
|
case AMAZONHALL:
|
||||||
|
case CATHEDRAL:
|
||||||
|
case GREATHALL:
|
||||||
|
case KEEP:
|
||||||
|
case THIEFHALL:
|
||||||
|
case TEMPLEHALL:
|
||||||
|
case WIZARDHALL:
|
||||||
|
case ELVENHALL:
|
||||||
|
case ELVENSANCTUM:
|
||||||
|
case IREKEIHALL:
|
||||||
|
case FORESTHALL:
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum UpdateType {
|
public enum UpdateType {
|
||||||
@@ -2307,8 +2338,8 @@ public class Enum {
|
|||||||
public enum CityBoundsType {
|
public enum CityBoundsType {
|
||||||
|
|
||||||
GRID(640),
|
GRID(640),
|
||||||
ZONE(875),
|
ZONE(680),
|
||||||
PLACEMENT(876);
|
PLACEMENT(681);
|
||||||
|
|
||||||
public final float extents;
|
public final float extents;
|
||||||
|
|
||||||
@@ -2822,7 +2853,6 @@ public class Enum {
|
|||||||
|
|
||||||
public enum MobBehaviourType {
|
public enum MobBehaviourType {
|
||||||
None(null, false, false, false, false, false),
|
None(null, false, false, false, false, false),
|
||||||
//Power
|
|
||||||
Power(null, false, true, true, true, false),
|
Power(null, false, true, true, true, false),
|
||||||
PowerHelpee(Power, false, true, true, false, true),
|
PowerHelpee(Power, false, true, true, false, true),
|
||||||
PowerHelpeeWimpy(Power, true, false, true, false, false),
|
PowerHelpeeWimpy(Power, true, false, true, false, false),
|
||||||
@@ -2847,6 +2877,7 @@ public class Enum {
|
|||||||
//Independent Types
|
//Independent Types
|
||||||
SimpleStandingGuard(null, false, false, false, false, false),
|
SimpleStandingGuard(null, false, false, false, false, false),
|
||||||
Pet1(null, false, false, true, false, false),
|
Pet1(null, false, false, true, false, false),
|
||||||
|
SiegeEngine(null, false, false, false, false, false),
|
||||||
Simple(null, false, false, true, false, false),
|
Simple(null, false, false, true, false, false),
|
||||||
Helpee(null, false, true, true, false, true),
|
Helpee(null, false, true, true, false, true),
|
||||||
HelpeeWimpy(null, true, false, true, false, false),
|
HelpeeWimpy(null, true, false, true, false, false),
|
||||||
@@ -2857,13 +2888,12 @@ public class Enum {
|
|||||||
HamletGuard(null, false, true, false, false, false),
|
HamletGuard(null, false, true, false, false, false),
|
||||||
AggroWanderer(null, false, false, true, false, false);
|
AggroWanderer(null, false, false, true, false, false);
|
||||||
|
|
||||||
private static HashMap<Integer, MobBehaviourType> _behaviourTypes = new HashMap<>();
|
public final MobBehaviourType BehaviourHelperType;
|
||||||
public MobBehaviourType BehaviourHelperType;
|
public final boolean isWimpy;
|
||||||
public boolean isWimpy;
|
public final boolean isAgressive;
|
||||||
public boolean isAgressive;
|
public final boolean canRoam;
|
||||||
public boolean canRoam;
|
public final boolean callsForHelp;
|
||||||
public boolean callsForHelp;
|
public final boolean respondsToCallForHelp;
|
||||||
public boolean respondsToCallForHelp;
|
|
||||||
|
|
||||||
MobBehaviourType(MobBehaviourType helpeebehaviourType, boolean wimpy, boolean agressive, boolean canroam, boolean callsforhelp, boolean respondstocallforhelp) {
|
MobBehaviourType(MobBehaviourType helpeebehaviourType, boolean wimpy, boolean agressive, boolean canroam, boolean callsforhelp, boolean respondstocallforhelp) {
|
||||||
this.BehaviourHelperType = helpeebehaviourType;
|
this.BehaviourHelperType = helpeebehaviourType;
|
||||||
@@ -2880,6 +2910,8 @@ public class Enum {
|
|||||||
MOBILE,
|
MOBILE,
|
||||||
PET,
|
PET,
|
||||||
CHARMED,
|
CHARMED,
|
||||||
|
|
||||||
|
SIEGEENGINE,
|
||||||
GUARD;
|
GUARD;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ import engine.net.client.msg.MoveToPointMsg;
|
|||||||
import engine.net.client.msg.UnloadObjectsMsg;
|
import engine.net.client.msg.UnloadObjectsMsg;
|
||||||
import engine.objects.*;
|
import engine.objects.*;
|
||||||
import engine.server.MBServerStatics;
|
import engine.server.MBServerStatics;
|
||||||
|
import engine.util.BoxTracker;
|
||||||
import org.pmw.tinylog.Logger;
|
import org.pmw.tinylog.Logger;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -109,7 +110,7 @@ public enum InterestManager implements Runnable {
|
|||||||
origin.sendMsg(moveMsg);
|
origin.sendMsg(moveMsg);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void reloadCharacter(AbstractCharacter absChar) {
|
public static void reloadCharacter(AbstractCharacter absChar, boolean sendToSelf) {
|
||||||
|
|
||||||
UnloadObjectsMsg uom = new UnloadObjectsMsg();
|
UnloadObjectsMsg uom = new UnloadObjectsMsg();
|
||||||
uom.addObject(absChar);
|
uom.addObject(absChar);
|
||||||
@@ -210,7 +211,7 @@ public enum InterestManager implements Runnable {
|
|||||||
if (origin == null)
|
if (origin == null)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!playerCharacter.isEnteredWorld())
|
if (!playerCharacter.enteredWorld)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (playerCharacter.getTeleportLock().readLock().tryLock()) {
|
if (playerCharacter.getTeleportLock().readLock().tryLock()) {
|
||||||
@@ -467,7 +468,7 @@ public enum InterestManager implements Runnable {
|
|||||||
if (awonpc.despawned == true)
|
if (awonpc.despawned == true)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
awonpc.playerAgroMap.put(player.getObjectUUID(), false);
|
awonpc.playerAgroMap.put(player.getObjectUUID(), 0f);
|
||||||
((Mob) awonpc).setCombatTarget(null);
|
((Mob) awonpc).setCombatTarget(null);
|
||||||
lcm = new LoadCharacterMsg(awonpc, PlayerCharacter.hideNonAscii());
|
lcm = new LoadCharacterMsg(awonpc, PlayerCharacter.hideNonAscii());
|
||||||
|
|
||||||
@@ -480,7 +481,7 @@ public enum InterestManager implements Runnable {
|
|||||||
if (!awonpc.isAlive())
|
if (!awonpc.isAlive())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
awonpc.playerAgroMap.put(player.getObjectUUID(), false);
|
awonpc.playerAgroMap.put(player.getObjectUUID(), 0f);
|
||||||
|
|
||||||
if ((awonpc.agentType.equals(Enum.AIAgentType.MOBILE)))
|
if ((awonpc.agentType.equals(Enum.AIAgentType.MOBILE)))
|
||||||
((Mob) awonpc).setCombatTarget(null);
|
((Mob) awonpc).setCombatTarget(null);
|
||||||
@@ -524,6 +525,7 @@ public enum InterestManager implements Runnable {
|
|||||||
player.setDirtyLoad(true);
|
player.setDirtyLoad(true);
|
||||||
updateStaticList(player, origin);
|
updateStaticList(player, origin);
|
||||||
updateMobileList(player, origin);
|
updateMobileList(player, origin);
|
||||||
|
BoxTracker.addPlayer(origin.machineID,player);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -73,6 +73,14 @@ public class dbBlueprintHandler extends dbHandlerBase {
|
|||||||
Blueprint._meshLookup.putIfAbsent(thisBlueprint.getMeshForRank(3), thisBlueprint);
|
Blueprint._meshLookup.putIfAbsent(thisBlueprint.getMeshForRank(3), thisBlueprint);
|
||||||
Blueprint._meshLookup.putIfAbsent(thisBlueprint.getMeshForRank(7), thisBlueprint);
|
Blueprint._meshLookup.putIfAbsent(thisBlueprint.getMeshForRank(7), thisBlueprint);
|
||||||
|
|
||||||
|
if(thisBlueprint.getName().contains("Vampire Shrine")){
|
||||||
|
Blueprint saetorShrine = new Blueprint(rs);
|
||||||
|
saetorShrine.setBlueprintUUID(1720000);
|
||||||
|
saetorShrine.rank1UUID = 1720000;
|
||||||
|
saetorShrine.rank3UUID = 1720000;
|
||||||
|
saetorShrine.rank7UUID = 1720000;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ import engine.gameManager.DbManager;
|
|||||||
import engine.objects.AbstractCharacter;
|
import engine.objects.AbstractCharacter;
|
||||||
import engine.objects.CharacterSkill;
|
import engine.objects.CharacterSkill;
|
||||||
import engine.objects.PlayerCharacter;
|
import engine.objects.PlayerCharacter;
|
||||||
|
import engine.objects.SkillsBase;
|
||||||
import engine.server.MBServerStatics;
|
import engine.server.MBServerStatics;
|
||||||
import org.pmw.tinylog.Logger;
|
import org.pmw.tinylog.Logger;
|
||||||
|
|
||||||
|
|||||||
@@ -63,6 +63,9 @@ public abstract class dbHandlerBase {
|
|||||||
} else {
|
} else {
|
||||||
AbstractGameObject toAdd = localClass.getConstructor(ResultSet.class).newInstance(rs);
|
AbstractGameObject toAdd = localClass.getConstructor(ResultSet.class).newInstance(rs);
|
||||||
DbManager.addToCache(toAdd);
|
DbManager.addToCache(toAdd);
|
||||||
|
if(toAdd.getObjectType().equals(GameObjectType.Zone) && rs.getInt("canLoad") == 0){
|
||||||
|
continue;
|
||||||
|
}
|
||||||
objectList.add((T) toAdd);
|
objectList.add((T) toAdd);
|
||||||
|
|
||||||
if (toAdd != null && toAdd instanceof AbstractWorldObject)
|
if (toAdd != null && toAdd instanceof AbstractWorldObject)
|
||||||
|
|||||||
@@ -28,10 +28,67 @@ public class dbItemBaseHandler extends dbHandlerBase {
|
|||||||
|
|
||||||
public void LOAD_BAKEDINSTATS(ItemBase itemBase) {
|
public void LOAD_BAKEDINSTATS(ItemBase itemBase) {
|
||||||
|
|
||||||
|
int itemBaseID = itemBase.getUUID();
|
||||||
|
switch(itemBaseID){
|
||||||
|
case 27550://bow
|
||||||
|
case 27560://dagger
|
||||||
|
case 27570://hammer
|
||||||
|
case 27580://axe
|
||||||
|
case 27590://sword
|
||||||
|
//return new String[]{"PRE-010","SUF-260"};
|
||||||
|
itemBaseID = 8000000;
|
||||||
|
break;
|
||||||
|
case 27600://staff
|
||||||
|
//return new String[]{"PRE-334","PRE-315"};
|
||||||
|
itemBaseID = 8000010;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 188500://HA chest
|
||||||
|
case 188510://HA arms
|
||||||
|
case 188520://HA legs
|
||||||
|
case 188530://HA gloves
|
||||||
|
case 188550://HA helm
|
||||||
|
case 188720://CC hood
|
||||||
|
case 188900://MA chest
|
||||||
|
case 188910://MA Sleeves
|
||||||
|
case 188920://MA Legs
|
||||||
|
case 188930://MA gloves
|
||||||
|
case 188950://MA helm
|
||||||
|
case 189100://la chest
|
||||||
|
case 189110://la arms
|
||||||
|
case 189120://la legs
|
||||||
|
case 189130://la gloves
|
||||||
|
case 189150://la helm
|
||||||
|
case 189550://CC gloves
|
||||||
|
//return new String[]{"PRE-130", "PRE-232", "PRE-212", "PRE-222", "SUF-007"};
|
||||||
|
itemBaseID = 8000020;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 188540://HA boots
|
||||||
|
case 188940://MA boots
|
||||||
|
case 189140://LA boots
|
||||||
|
case 189560://CC boots
|
||||||
|
//return new String[]{"PRE-133", "PRE-230", "PRE-210", "PRE-220", "SUF-003","SUF-150"};
|
||||||
|
itemBaseID = 8000030;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 188700://CC robe
|
||||||
|
//return new String[]{"PRE-130", "PRE-232", "PRE-212", "PRE-222","SUF-317","SUF-317","SUF-317"};
|
||||||
|
itemBaseID = 8000040;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 189500://MA shield
|
||||||
|
case 189510://HA shield
|
||||||
|
//return new String[]{"PRE-125","PRE-125","PRE-125", "PRE-230", "PRE-210", "PRE-220"};
|
||||||
|
itemBaseID = 8000050;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
try (Connection connection = DbManager.getConnection();
|
try (Connection connection = DbManager.getConnection();
|
||||||
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_item_bakedinstat` WHERE `itemID` = ?")) {
|
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_item_bakedinstat` WHERE `itemID` = ?")) {
|
||||||
|
|
||||||
preparedStatement.setInt(1, itemBase.getUUID());
|
preparedStatement.setInt(1, itemBaseID);
|
||||||
ResultSet rs = preparedStatement.executeQuery();
|
ResultSet rs = preparedStatement.executeQuery();
|
||||||
|
|
||||||
while (rs.next()) {
|
while (rs.next()) {
|
||||||
@@ -87,12 +144,19 @@ public class dbItemBaseHandler extends dbHandlerBase {
|
|||||||
recordsRead++;
|
recordsRead++;
|
||||||
itemBase = new ItemBase(rs);
|
itemBase = new ItemBase(rs);
|
||||||
ItemBase.addToCache(itemBase);
|
ItemBase.addToCache(itemBase);
|
||||||
|
|
||||||
|
//copy the vampire shrine for saetor and change uuid and name
|
||||||
|
if(itemBase.getName().contains("Vampire Shrine")){
|
||||||
|
ItemBase saetorShrine = new ItemBase(rs);
|
||||||
|
saetorShrine.setUUID(1035);
|
||||||
|
saetorShrine.setName(saetorShrine.getName().replace("Vampire","Saetor"));
|
||||||
|
ItemBase.addToCache(saetorShrine);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
Logger.error(e);
|
Logger.error(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
Logger.info("read: " + recordsRead + " cached: " + ItemBase.getUUIDCache().size());
|
Logger.info("read: " + recordsRead + " cached: " + ItemBase.getUUIDCache().size());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -135,7 +135,11 @@ public class dbItemHandler extends dbHandlerBase {
|
|||||||
ResultSet rs = preparedStatement.executeQuery();
|
ResultSet rs = preparedStatement.executeQuery();
|
||||||
|
|
||||||
if (rs.next())
|
if (rs.next())
|
||||||
worked = rs.getBoolean("result");
|
try {
|
||||||
|
worked = rs.getBoolean("result");
|
||||||
|
}catch(Exception e){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
Logger.error(e);
|
Logger.error(e);
|
||||||
@@ -350,7 +354,11 @@ public class dbItemHandler extends dbHandlerBase {
|
|||||||
ResultSet rs = preparedStatement.executeQuery();
|
ResultSet rs = preparedStatement.executeQuery();
|
||||||
|
|
||||||
if (rs.next())
|
if (rs.next())
|
||||||
worked = rs.getBoolean("result");
|
try {
|
||||||
|
worked = rs.getBoolean("result");
|
||||||
|
} catch(Exception e){
|
||||||
|
worked = true;
|
||||||
|
}
|
||||||
|
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
Logger.error(e);
|
Logger.error(e);
|
||||||
@@ -496,4 +504,18 @@ public class dbItemHandler extends dbHandlerBase {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean UPDATE_NUM_ITEMS(final Item item, int newValue) {
|
||||||
|
if (item.getItemBase().getType().equals(ItemType.GOLD))
|
||||||
|
return false;
|
||||||
|
try (Connection connection = DbManager.getConnection();
|
||||||
|
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_item` SET `item_numberOfItems`=? WHERE `UID`=?")) {
|
||||||
|
preparedStatement.setInt(1, newValue);
|
||||||
|
preparedStatement.setLong(2, item.getObjectUUID());
|
||||||
|
return (preparedStatement.executeUpdate() > 0);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
Logger.error(e);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,12 +9,14 @@
|
|||||||
package engine.db.handlers;
|
package engine.db.handlers;
|
||||||
|
|
||||||
import engine.Enum;
|
import engine.Enum;
|
||||||
|
import engine.gameManager.BuildingManager;
|
||||||
import engine.gameManager.DbManager;
|
import engine.gameManager.DbManager;
|
||||||
import engine.objects.Mine;
|
import engine.objects.Mine;
|
||||||
import engine.objects.MineProduction;
|
import engine.objects.MineProduction;
|
||||||
import engine.objects.Resource;
|
import engine.objects.Resource;
|
||||||
import org.pmw.tinylog.Logger;
|
import org.pmw.tinylog.Logger;
|
||||||
|
|
||||||
|
import java.net.UnknownHostException;
|
||||||
import java.sql.Connection;
|
import java.sql.Connection;
|
||||||
import java.sql.PreparedStatement;
|
import java.sql.PreparedStatement;
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
@@ -32,8 +34,24 @@ public class dbMineHandler extends dbHandlerBase {
|
|||||||
|
|
||||||
if (id == 0)
|
if (id == 0)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
Mine mine = (Mine) DbManager.getFromCache(Enum.GameObjectType.Mine, id);
|
Mine mine = (Mine) DbManager.getFromCache(Enum.GameObjectType.Mine, id);
|
||||||
|
try (Connection connection = DbManager.getConnection();
|
||||||
|
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM obj_mine;")) {
|
||||||
|
|
||||||
|
//preparedStatement.setInt(1, id);
|
||||||
|
|
||||||
|
ResultSet rs = preparedStatement.executeQuery();
|
||||||
|
while(rs.next()){
|
||||||
|
if(rs.getInt("UID") == id){
|
||||||
|
int towerUID = rs.getInt("mine_buildingUID");
|
||||||
|
mine = Mine.getMineFromTower(towerUID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} catch (SQLException e) {
|
||||||
|
Logger.error(e);
|
||||||
|
}
|
||||||
|
|
||||||
if (mine != null)
|
if (mine != null)
|
||||||
return mine;
|
return mine;
|
||||||
@@ -56,13 +74,27 @@ public class dbMineHandler extends dbHandlerBase {
|
|||||||
|
|
||||||
ArrayList<Mine> mines = new ArrayList<>();
|
ArrayList<Mine> mines = new ArrayList<>();
|
||||||
|
|
||||||
|
//try (Connection connection = DbManager.getConnection();
|
||||||
|
// PreparedStatement preparedStatement = connection.prepareStatement("SELECT `obj_mine`.*, `object`.`parent` FROM `object` INNER JOIN `obj_mine` ON `obj_mine`.`UID` = `object`.`UID`")) {
|
||||||
|
|
||||||
|
// ResultSet rs = preparedStatement.executeQuery();
|
||||||
|
// mines = getObjectsFromRs(rs, 1000);
|
||||||
|
|
||||||
|
// } catch (SQLException e) {
|
||||||
|
// Logger.error(e);
|
||||||
|
//}
|
||||||
try (Connection connection = DbManager.getConnection();
|
try (Connection connection = DbManager.getConnection();
|
||||||
PreparedStatement preparedStatement = connection.prepareStatement("SELECT `obj_mine`.*, `object`.`parent` FROM `object` INNER JOIN `obj_mine` ON `obj_mine`.`UID` = `object`.`UID`")) {
|
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM obj_mine;")) {
|
||||||
|
|
||||||
ResultSet rs = preparedStatement.executeQuery();
|
ResultSet rs = preparedStatement.executeQuery();
|
||||||
mines = getObjectsFromRs(rs, 1000);
|
while(rs.next()){
|
||||||
|
if(BuildingManager.getBuildingFromCache(rs.getInt("mine_buildingUID")) == null)
|
||||||
|
continue;
|
||||||
|
|
||||||
} catch (SQLException e) {
|
mines.add(new Mine(rs));
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (SQLException | UnknownHostException e) {
|
||||||
Logger.error(e);
|
Logger.error(e);
|
||||||
}
|
}
|
||||||
return mines;
|
return mines;
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import java.sql.PreparedStatement;
|
|||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
public class dbMobBaseHandler extends dbHandlerBase {
|
public class dbMobBaseHandler extends dbHandlerBase {
|
||||||
|
|
||||||
@@ -112,6 +113,25 @@ public class dbMobBaseHandler extends dbHandlerBase {
|
|||||||
return mobBaseStats;
|
return mobBaseStats;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void LOAD_ALL_MOBBASE_RACES() {
|
||||||
|
MobBase.mobbase_race_types = new HashMap<>();
|
||||||
|
try (Connection connection = DbManager.getConnection();
|
||||||
|
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_npc_mobbase`;")) {
|
||||||
|
|
||||||
|
ResultSet rs = preparedStatement.executeQuery();
|
||||||
|
|
||||||
|
while (rs.next()) {
|
||||||
|
int id = rs.getInt("loadID");
|
||||||
|
if(MobBase.mobbase_race_types.containsKey(id) == false){
|
||||||
|
MobBase.mobbase_race_types.put(id,rs.getString("raceType"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (SQLException e) {
|
||||||
|
Logger.error(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void LOAD_ALL_MOBBASE_SPEEDS(MobBase mobBase) {
|
public void LOAD_ALL_MOBBASE_SPEEDS(MobBase mobBase) {
|
||||||
|
|
||||||
if (mobBase.getLoadID() == 0)
|
if (mobBase.getLoadID() == 0)
|
||||||
|
|||||||
@@ -28,31 +28,26 @@ public class dbMobHandler extends dbHandlerBase {
|
|||||||
this.localObjectType = engine.Enum.GameObjectType.valueOf(this.localClass.getSimpleName());
|
this.localObjectType = engine.Enum.GameObjectType.valueOf(this.localClass.getSimpleName());
|
||||||
}
|
}
|
||||||
|
|
||||||
public Mob ADD_MOB(Mob toAdd) {
|
public Mob PERSIST(Mob toAdd) {
|
||||||
|
|
||||||
Mob mobile = null;
|
Mob mobile = null;
|
||||||
|
|
||||||
try (Connection connection = DbManager.getConnection();
|
try (Connection connection = DbManager.getConnection();
|
||||||
PreparedStatement preparedStatement = connection.prepareStatement("CALL `mob_CREATE`(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);")) {
|
PreparedStatement preparedStatement = connection.prepareStatement("CALL `mob_CREATE`(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);")) {
|
||||||
|
|
||||||
preparedStatement.setLong(1, toAdd.getParentZoneID());
|
preparedStatement.setLong(1, toAdd.parentZoneUUID);
|
||||||
preparedStatement.setInt(2, toAdd.getMobBaseID());
|
preparedStatement.setInt(2, toAdd.loadID);
|
||||||
preparedStatement.setInt(3, toAdd.getGuildUUID());
|
preparedStatement.setInt(3, toAdd.guildUUID);
|
||||||
preparedStatement.setFloat(4, toAdd.getSpawnX());
|
preparedStatement.setFloat(4, toAdd.bindLoc.x);
|
||||||
preparedStatement.setFloat(5, toAdd.getSpawnY());
|
preparedStatement.setFloat(5, toAdd.bindLoc.y);
|
||||||
preparedStatement.setFloat(6, toAdd.getSpawnZ());
|
preparedStatement.setFloat(6, toAdd.bindLoc.z);
|
||||||
preparedStatement.setInt(7, 0);
|
preparedStatement.setInt(7, 0);
|
||||||
preparedStatement.setFloat(8, toAdd.getSpawnRadius());
|
preparedStatement.setFloat(8, toAdd.spawnRadius);
|
||||||
preparedStatement.setInt(9, toAdd.getTrueSpawnTime());
|
preparedStatement.setInt(9, toAdd.spawnTime);
|
||||||
|
preparedStatement.setInt(10, toAdd.contractUUID);
|
||||||
if (toAdd.getContract() != null)
|
preparedStatement.setInt(11, toAdd.buildingUUID);
|
||||||
preparedStatement.setInt(10, toAdd.getContract().getContractID());
|
preparedStatement.setInt(12, toAdd.level);
|
||||||
else
|
preparedStatement.setString(13, toAdd.firstName);
|
||||||
preparedStatement.setInt(10, 0);
|
|
||||||
|
|
||||||
preparedStatement.setInt(11, toAdd.getBuildingID());
|
|
||||||
preparedStatement.setInt(12, toAdd.getLevel());
|
|
||||||
preparedStatement.setString(13, toAdd.getFirstName());
|
|
||||||
|
|
||||||
ResultSet rs = preparedStatement.executeQuery();
|
ResultSet rs = preparedStatement.executeQuery();
|
||||||
|
|
||||||
@@ -106,17 +101,17 @@ public class dbMobHandler extends dbHandlerBase {
|
|||||||
return row_count;
|
return row_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void LOAD_PATROL_POINTS(Mob captain) {
|
public void LOAD_GUARD_MINIONS(Mob guardCaptain) {
|
||||||
|
|
||||||
try (Connection connection = DbManager.getConnection();
|
try (Connection connection = DbManager.getConnection();
|
||||||
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `dyn_guards` WHERE `captainUID` = ?")) {
|
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `dyn_guards` WHERE `captainUID` = ?")) {
|
||||||
|
|
||||||
preparedStatement.setInt(1, captain.getObjectUUID());
|
preparedStatement.setInt(1, guardCaptain.getObjectUUID());
|
||||||
ResultSet rs = preparedStatement.executeQuery();
|
ResultSet rs = preparedStatement.executeQuery();
|
||||||
|
|
||||||
while (rs.next()) {
|
while (rs.next()) {
|
||||||
String name = rs.getString("name");
|
String minionName = rs.getString("name");
|
||||||
Mob toCreate = Mob.createGuardMob(captain, captain.getGuild(), captain.getParentZone(), captain.building.getLoc(), captain.getLevel(), name);
|
Mob toCreate = Mob.createGuardMinion(guardCaptain, guardCaptain.getLevel(), minionName);
|
||||||
|
|
||||||
if (toCreate == null)
|
if (toCreate == null)
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -23,7 +23,25 @@ public class dbResistHandler extends dbHandlerBase {
|
|||||||
public dbResistHandler() {
|
public dbResistHandler() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
public void LOAD_RESISTS_FOR_MOBS() {
|
||||||
|
|
||||||
|
Resists resists = null;
|
||||||
|
|
||||||
|
try (Connection connection = DbManager.getConnection();
|
||||||
|
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_npc_mob_resists`;")) {
|
||||||
|
|
||||||
|
ResultSet rs = preparedStatement.executeQuery();
|
||||||
|
|
||||||
|
while(rs.next()){
|
||||||
|
resists = new Resists(rs);
|
||||||
|
if(!Resists.mobResists.containsKey(rs.getInt("ID")))
|
||||||
|
Resists.mobResists.put(rs.getInt("ID"),resists);
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (SQLException e) {
|
||||||
|
Logger.error(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
public Resists GET_RESISTS_FOR_MOB(int resistID) {
|
public Resists GET_RESISTS_FOR_MOB(int resistID) {
|
||||||
|
|
||||||
Resists resists = null;
|
Resists resists = null;
|
||||||
|
|||||||
@@ -59,6 +59,43 @@ public class dbRuneBaseHandler extends dbHandlerBase {
|
|||||||
rb.setLevelRequired(rs.getInt("requiredRuneID"));
|
rb.setLevelRequired(rs.getInt("requiredRuneID"));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
int id = rs.getInt("runeID");
|
||||||
|
switch(id) {
|
||||||
|
case 3001:
|
||||||
|
case 3002:
|
||||||
|
case 3003:
|
||||||
|
case 3004:
|
||||||
|
case 3007:
|
||||||
|
case 3008:
|
||||||
|
case 3009:
|
||||||
|
case 3013:
|
||||||
|
case 3014:
|
||||||
|
case 3016:
|
||||||
|
case 3017:
|
||||||
|
case 3018:
|
||||||
|
case 3019:
|
||||||
|
case 3020:
|
||||||
|
case 3021:
|
||||||
|
case 3026:
|
||||||
|
case 3030:
|
||||||
|
case 3031:
|
||||||
|
case 3033:
|
||||||
|
case 3037:
|
||||||
|
case 3040:
|
||||||
|
case 3045:
|
||||||
|
case 3046:
|
||||||
|
case 3047:
|
||||||
|
case 3048:
|
||||||
|
case 2514:
|
||||||
|
rb.getRace().put(1999, true);
|
||||||
|
break;
|
||||||
|
case 3035:
|
||||||
|
rb.getBaseClass().put(2501,true);
|
||||||
|
break;
|
||||||
|
case 3049:
|
||||||
|
rb.getRace().clear();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
|
|||||||
@@ -143,6 +143,13 @@ public class dbSkillBaseHandler extends dbHandlerBase {
|
|||||||
|
|
||||||
SkillsBase.runeSkillsCache.get(runeID).put(token, amount);
|
SkillsBase.runeSkillsCache.get(runeID).put(token, amount);
|
||||||
}
|
}
|
||||||
|
//add saetor skills
|
||||||
|
HashMap<Integer, Integer> skills = new HashMap<>();
|
||||||
|
skills.put(71438003,15); // staff
|
||||||
|
skills.put(-61022283,10); // staff mastery
|
||||||
|
skills.put(95961104,10); // parry
|
||||||
|
SkillsBase.runeSkillsCache.put(1999,skills);
|
||||||
|
|
||||||
|
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
Logger.error(e);
|
Logger.error(e);
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ public class AddMobCmd extends AbstractDevCmd {
|
|||||||
MobBase mb = (MobBase) mobbaseAGO;
|
MobBase mb = (MobBase) mobbaseAGO;
|
||||||
int loadID = mb.getObjectUUID();
|
int loadID = mb.getObjectUUID();
|
||||||
Mob mob = Mob.createMob(loadID, Vector3fImmutable.getRandomPointInCircle(pc.getLoc(), 100),
|
Mob mob = Mob.createMob(loadID, Vector3fImmutable.getRandomPointInCircle(pc.getLoc(), 100),
|
||||||
null, true, zone, null, 0, "", 1);
|
null, zone, null, null, "", 1);
|
||||||
if (mob != null) {
|
if (mob != null) {
|
||||||
mob.updateDatabase();
|
mob.updateDatabase();
|
||||||
this.setResult(String.valueOf(mob.getDBID()));
|
this.setResult(String.valueOf(mob.getDBID()));
|
||||||
@@ -84,7 +84,7 @@ public class AddMobCmd extends AbstractDevCmd {
|
|||||||
|
|
||||||
|
|
||||||
Mob mob = Mob.createMob(loadID, pc.getLoc(),
|
Mob mob = Mob.createMob(loadID, pc.getLoc(),
|
||||||
null, true, zone, null, 0, "", 1);
|
null, zone, null, null, "", 1);
|
||||||
if (mob != null) {
|
if (mob != null) {
|
||||||
mob.updateDatabase();
|
mob.updateDatabase();
|
||||||
ChatManager.chatSayInfo(pc,
|
ChatManager.chatSayInfo(pc,
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import engine.Enum.GameObjectType;
|
|||||||
import engine.InterestManagement.WorldGrid;
|
import engine.InterestManagement.WorldGrid;
|
||||||
import engine.devcmd.AbstractDevCmd;
|
import engine.devcmd.AbstractDevCmd;
|
||||||
import engine.gameManager.*;
|
import engine.gameManager.*;
|
||||||
|
import engine.math.Vector3fImmutable;
|
||||||
import engine.objects.*;
|
import engine.objects.*;
|
||||||
import org.pmw.tinylog.Logger;
|
import org.pmw.tinylog.Logger;
|
||||||
|
|
||||||
@@ -70,28 +71,30 @@ public class AddNPCCmd extends AbstractDevCmd {
|
|||||||
throwbackError(pc, "Failed to find zone to place npc in.");
|
throwbackError(pc, "Failed to find zone to place npc in.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
Building building = null;
|
||||||
if (target != null)
|
if (target != null)
|
||||||
if (target.getObjectType() == GameObjectType.Building) {
|
if (target.getObjectType() == GameObjectType.Building) {
|
||||||
Building parentBuilding = (Building) target;
|
building = (Building)target;
|
||||||
BuildingManager.addHirelingForWorld(parentBuilding, pc, parentBuilding.getLoc(), parentBuilding.getParentZone(), contract, level);
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
NPC created;
|
||||||
NPC npc = NPC.createNPC(name, contractID,
|
Guild guild = null;
|
||||||
pc.getLoc(), null, zone, (short) level, null);
|
Vector3fImmutable loc;
|
||||||
|
if(building != null){
|
||||||
if (npc != null) {
|
guild = building.getGuild();
|
||||||
WorldGrid.addObject(npc, pc);
|
loc = building.loc;
|
||||||
ChatManager.chatSayInfo(pc,
|
} else{
|
||||||
"NPC with ID " + npc.getDBID() + " added");
|
loc = pc.loc;
|
||||||
this.setResult(String.valueOf(npc.getDBID()));
|
}
|
||||||
} else {
|
created = NPC.createNPC(name, contractID, loc, guild, zone, (short)level, building);
|
||||||
throwbackError(pc, "Failed to create npc of contract type "
|
created.bindLoc = loc;
|
||||||
+ contractID);
|
if(building != null) {
|
||||||
Logger.error(
|
created.buildingUUID = building.getObjectUUID();
|
||||||
"Failed to create npc of contract type " + contractID);
|
created.building = building;
|
||||||
|
NPCManager.slotCharacterInBuilding(created);
|
||||||
}
|
}
|
||||||
|
created.setLoc(created.bindLoc);
|
||||||
|
created.updateDatabase();
|
||||||
|
throwbackInfo(pc, "Created NPC with UUID: " + created.getObjectUUID());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ package engine.devcmd.cmds;
|
|||||||
|
|
||||||
import engine.devcmd.AbstractDevCmd;
|
import engine.devcmd.AbstractDevCmd;
|
||||||
import engine.objects.*;
|
import engine.objects.*;
|
||||||
|
import engine.powers.EffectsBase;
|
||||||
|
|
||||||
public class EnchantCmd extends AbstractDevCmd {
|
public class EnchantCmd extends AbstractDevCmd {
|
||||||
|
|
||||||
@@ -55,21 +56,9 @@ public class EnchantCmd extends AbstractDevCmd {
|
|||||||
this.setResult(String.valueOf(item.getObjectUUID()));
|
this.setResult(String.valueOf(item.getObjectUUID()));
|
||||||
} else {
|
} else {
|
||||||
int cnt = words.length;
|
int cnt = words.length;
|
||||||
for (int i = 1; i < cnt; i++) {
|
String enchant = words[1];
|
||||||
String enchant = words[i];
|
enchant = EffectsBase.getItemEffectsByName(enchant.toLowerCase());
|
||||||
boolean valid = true;
|
item.addPermanentEnchantmentForDev(enchant, 0);
|
||||||
for (Effect eff : item.getEffects().values()) {
|
|
||||||
if (eff.getEffectsBase().getIDString().equals(enchant)) {
|
|
||||||
throwbackError(pc, "This item already has that enchantment");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (valid) {
|
|
||||||
item.addPermanentEnchantmentForDev(enchant, rank);
|
|
||||||
this.setResult(String.valueOf(item.getObjectUUID()));
|
|
||||||
} else
|
|
||||||
throwbackError(pc, "Invalid Enchantment. Enchantment must consist of SUF-001 to SUF-328 or PRE-001 to PRE-334. Sent " + enchant + '.');
|
|
||||||
}
|
|
||||||
cim.updateInventory();
|
cim.updateInventory();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ public class FlashMsgCmd extends AbstractDevCmd {
|
|||||||
this.sendUsage(pcSender);
|
this.sendUsage(pcSender);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ChatManager.chatSystemFlash(args[0]);
|
ChatManager.chatSystemFlash(String.join(" ", args));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -280,7 +280,7 @@ public class InfoCmd extends AbstractDevCmd {
|
|||||||
output += newline;
|
output += newline;
|
||||||
output += "Inventory Weight:" + (targetPC.getCharItemManager().getInventoryWeight() + targetPC.getCharItemManager().getEquipWeight());
|
output += "Inventory Weight:" + (targetPC.getCharItemManager().getInventoryWeight() + targetPC.getCharItemManager().getEquipWeight());
|
||||||
output += newline;
|
output += newline;
|
||||||
output += "Max Inventory Weight:" + ((int) targetPC.statStrBase * 3);
|
output += "Max Inventory Weight:" + targetPC.getInventoryCapacity();
|
||||||
output += newline;
|
output += newline;
|
||||||
output += "ALTITUDE :" + targetPC.getAltitude();
|
output += "ALTITUDE :" + targetPC.getAltitude();
|
||||||
output += newline;
|
output += newline;
|
||||||
@@ -336,8 +336,9 @@ public class InfoCmd extends AbstractDevCmd {
|
|||||||
|
|
||||||
output += "Swimming : " + targetPC.isSwimming();
|
output += "Swimming : " + targetPC.isSwimming();
|
||||||
output += newline;
|
output += newline;
|
||||||
output += "isMoving : " + targetPC.isMoving();
|
output += "isMoving : " + targetPC.isMoving() + newline;
|
||||||
|
output += "Zerg Multiplier: " + targetPC.ZergMultiplier + newline;
|
||||||
|
output += "isBoxed: " + targetPC.isBoxed + newline;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case NPC:
|
case NPC:
|
||||||
@@ -440,7 +441,9 @@ public class InfoCmd extends AbstractDevCmd {
|
|||||||
output += "isSummonedPet: true";
|
output += "isSummonedPet: true";
|
||||||
else
|
else
|
||||||
output += "isSummonedPet: false";
|
output += "isSummonedPet: false";
|
||||||
PlayerCharacter owner = targetMob.getOwner();
|
|
||||||
|
|
||||||
|
PlayerCharacter owner = (PlayerCharacter) targetMob.guardCaptain;
|
||||||
if (owner != null)
|
if (owner != null)
|
||||||
output += " owner: " + owner.getObjectUUID();
|
output += " owner: " + owner.getObjectUUID();
|
||||||
output += newline;
|
output += newline;
|
||||||
@@ -523,7 +526,7 @@ public class InfoCmd extends AbstractDevCmd {
|
|||||||
ConcurrentHashMap<String, Effect> effects = item.getEffects();
|
ConcurrentHashMap<String, Effect> effects = item.getEffects();
|
||||||
for (String name : effects.keySet()) {
|
for (String name : effects.keySet()) {
|
||||||
Effect eff = effects.get(name);
|
Effect eff = effects.get(name);
|
||||||
output += eff.getEffectsBase().getIDString();
|
output += eff.getEffectsBase().getIDString() + " Static:" + eff.isStatic();
|
||||||
output += newline;
|
output += newline;
|
||||||
// output += eff.getEffectToken() + (eff.bakedInStat() ? " (baked in)" : "") + newline;
|
// output += eff.getEffectToken() + (eff.bakedInStat() ? " (baked in)" : "") + newline;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -65,6 +65,10 @@ public class MakeItemCmd extends AbstractDevCmd {
|
|||||||
|
|
||||||
if (item == null || !worked) {
|
if (item == null || !worked) {
|
||||||
throwbackError(pc, "DB error 2: Unable to create item.");
|
throwbackError(pc, "DB error 2: Unable to create item.");
|
||||||
|
if(item == null)
|
||||||
|
throwbackError(pc, "Item Null");
|
||||||
|
else
|
||||||
|
throwbackError(pc, "Worked = false");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -222,6 +226,10 @@ public class MakeItemCmd extends AbstractDevCmd {
|
|||||||
|
|
||||||
if (item == null || !worked) {
|
if (item == null || !worked) {
|
||||||
throwbackError(pc, "DB error 2: Unable to create item.");
|
throwbackError(pc, "DB error 2: Unable to create item.");
|
||||||
|
if(item == null)
|
||||||
|
throwbackError(pc, "Item Null");
|
||||||
|
else
|
||||||
|
throwbackError(pc, "Worked = false");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,6 @@ import engine.objects.AbstractGameObject;
|
|||||||
import engine.objects.Building;
|
import engine.objects.Building;
|
||||||
import engine.objects.Mine;
|
import engine.objects.Mine;
|
||||||
import engine.objects.PlayerCharacter;
|
import engine.objects.PlayerCharacter;
|
||||||
import engine.workthreads.HourlyJobThread;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
@@ -41,10 +40,10 @@ public class MineActiveCmd extends AbstractDevCmd {
|
|||||||
String trigger = args[0];
|
String trigger = args[0];
|
||||||
switch (trigger) {
|
switch (trigger) {
|
||||||
case "true":
|
case "true":
|
||||||
HourlyJobThread.mineWindowOpen(mine);
|
Mine.mineWindowOpen(mine);
|
||||||
break;
|
break;
|
||||||
case "false":
|
case "false":
|
||||||
HourlyJobThread.mineWindowClose(mine);
|
Mine.mineWindowClose(mine);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
this.sendUsage(pcSender);
|
this.sendUsage(pcSender);
|
||||||
|
|||||||
@@ -39,6 +39,9 @@ public class PrintResistsCmd extends AbstractDevCmd {
|
|||||||
if (mb != null)
|
if (mb != null)
|
||||||
name = mb.getFirstName();
|
name = mb.getFirstName();
|
||||||
type = "Mob";
|
type = "Mob";
|
||||||
|
throwbackInfo(pc, "Server resists for " + type + ' ' + name);
|
||||||
|
tar.getResists().printResistsToClient(pc);
|
||||||
|
return;
|
||||||
} else if (tar instanceof NPC) {
|
} else if (tar instanceof NPC) {
|
||||||
NPC npc = (NPC) tar;
|
NPC npc = (NPC) tar;
|
||||||
Contract contract = npc.getContract();
|
Contract contract = npc.getContract();
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
|
|
||||||
package engine.devcmd.cmds;
|
package engine.devcmd.cmds;
|
||||||
|
|
||||||
|
import engine.Enum;
|
||||||
import engine.devcmd.AbstractDevCmd;
|
import engine.devcmd.AbstractDevCmd;
|
||||||
import engine.objects.*;
|
import engine.objects.*;
|
||||||
|
|
||||||
@@ -55,6 +56,7 @@ public class PrintStatsCmd extends AbstractDevCmd {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void printStatsPlayer(PlayerCharacter pc, PlayerCharacter tar) {
|
public void printStatsPlayer(PlayerCharacter pc, PlayerCharacter tar) {
|
||||||
|
tar.calculateMaxHealthManaStamina();
|
||||||
String newline = "\r\n ";
|
String newline = "\r\n ";
|
||||||
String out = "Server stats for Player " + tar.getFirstName() + newline;
|
String out = "Server stats for Player " + tar.getFirstName() + newline;
|
||||||
out += "Unused Stats: " + tar.getUnusedStatPoints() + newline;
|
out += "Unused Stats: " + tar.getUnusedStatPoints() + newline;
|
||||||
@@ -72,6 +74,11 @@ public class PrintStatsCmd extends AbstractDevCmd {
|
|||||||
out += "Main Hand: atr: " + tar.getAtrHandOne() + ", damage: " + tar.getMinDamageHandOne() + " to " + tar.getMaxDamageHandOne() + ", speed: " + tar.getSpeedHandOne() + newline;
|
out += "Main Hand: atr: " + tar.getAtrHandOne() + ", damage: " + tar.getMinDamageHandOne() + " to " + tar.getMaxDamageHandOne() + ", speed: " + tar.getSpeedHandOne() + newline;
|
||||||
out += "Off Hand: atr: " + tar.getAtrHandTwo() + ", damage: " + tar.getMinDamageHandTwo() + " to " + tar.getMaxDamageHandTwo() + ", speed: " + tar.getSpeedHandTwo() + newline;
|
out += "Off Hand: atr: " + tar.getAtrHandTwo() + ", damage: " + tar.getMinDamageHandTwo() + " to " + tar.getMaxDamageHandTwo() + ", speed: " + tar.getSpeedHandTwo() + newline;
|
||||||
out += "isAlive: " + tar.isAlive() + ", Combat: " + tar.isCombat() + newline;
|
out += "isAlive: " + tar.isAlive() + ", Combat: " + tar.isCombat() + newline;
|
||||||
|
out += "Health Regen: " + tar.getRegenModifier(Enum.ModType.HealthRecoverRate) + newline;
|
||||||
|
out += "Stamina Regen: " + tar.getRegenModifier(Enum.ModType.StaminaRecoverRate) + newline;
|
||||||
|
out += "Mana Regen: " + tar.getRegenModifier(Enum.ModType.ManaRecoverRate) + newline;
|
||||||
|
out += "Zerg Multiplier: " + tar.ZergMultiplier + newline;
|
||||||
|
|
||||||
throwbackInfo(pc, out);
|
throwbackInfo(pc, out);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ public class PurgeObjectsCmd extends AbstractDevCmd {
|
|||||||
|
|
||||||
|
|
||||||
if (npc != null) {
|
if (npc != null) {
|
||||||
for (Mob mob : npc.getSiegeMinionMap().keySet()) {
|
for (Mob mob : npc.siegeMinionMap.keySet()) {
|
||||||
WorldGrid.RemoveWorldObject(mob);
|
WorldGrid.RemoveWorldObject(mob);
|
||||||
WorldGrid.removeObject(mob, pc);
|
WorldGrid.removeObject(mob, pc);
|
||||||
//Mob.getRespawnMap().remove(mob);
|
//Mob.getRespawnMap().remove(mob);
|
||||||
@@ -151,7 +151,7 @@ public class PurgeObjectsCmd extends AbstractDevCmd {
|
|||||||
|
|
||||||
|
|
||||||
if (npc != null) {
|
if (npc != null) {
|
||||||
for (Mob mob : npc.getSiegeMinionMap().keySet()) {
|
for (Mob mob : npc.siegeMinionMap.keySet()) {
|
||||||
WorldGrid.RemoveWorldObject(mob);
|
WorldGrid.RemoveWorldObject(mob);
|
||||||
WorldGrid.removeObject(mob, pc);
|
WorldGrid.removeObject(mob, pc);
|
||||||
//Mob.getRespawnMap().remove(mob);
|
//Mob.getRespawnMap().remove(mob);
|
||||||
|
|||||||
@@ -154,7 +154,7 @@ public class RemoveObjectCmd extends AbstractDevCmd {
|
|||||||
mobA = (Mob) ac;
|
mobA = (Mob) ac;
|
||||||
|
|
||||||
if (npc != null) {
|
if (npc != null) {
|
||||||
for (Mob mob : npc.getSiegeMinionMap().keySet()) {
|
for (Mob mob : npc.siegeMinionMap.keySet()) {
|
||||||
WorldGrid.RemoveWorldObject(mob);
|
WorldGrid.RemoveWorldObject(mob);
|
||||||
WorldGrid.removeObject(mob, pc);
|
WorldGrid.removeObject(mob, pc);
|
||||||
//Mob.getRespawnMap().remove(mob);
|
//Mob.getRespawnMap().remove(mob);
|
||||||
@@ -209,7 +209,7 @@ public class RemoveObjectCmd extends AbstractDevCmd {
|
|||||||
if (npc.building != null)
|
if (npc.building != null)
|
||||||
npc.building.getHirelings().remove(npc);
|
npc.building.getHirelings().remove(npc);
|
||||||
|
|
||||||
for (Mob mob : npc.getSiegeMinionMap().keySet()) {
|
for (Mob mob : npc.siegeMinionMap.keySet()) {
|
||||||
WorldGrid.RemoveWorldObject(mob);
|
WorldGrid.RemoveWorldObject(mob);
|
||||||
WorldGrid.removeObject(mob, pc);
|
WorldGrid.removeObject(mob, pc);
|
||||||
if (mob.getParentZone() != null)
|
if (mob.getParentZone() != null)
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ public class SetAdminRuneCmd extends AbstractDevCmd {
|
|||||||
if (worked) {
|
if (worked) {
|
||||||
ChatManager.chatSayInfo(pcSender,
|
ChatManager.chatSayInfo(pcSender,
|
||||||
"rune of ID " + runeID + " removed");
|
"rune of ID " + runeID + " removed");
|
||||||
InterestManager.reloadCharacter(pcSender);
|
InterestManager.reloadCharacter(pcSender,false);
|
||||||
} else
|
} else
|
||||||
throwbackError(pcSender, "Failed to remove the rune of type "
|
throwbackError(pcSender, "Failed to remove the rune of type "
|
||||||
+ runeID);
|
+ runeID);
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ public class SetBaseClassCmd extends AbstractDevCmd {
|
|||||||
this.setTarget(pc); //for logging
|
this.setTarget(pc); //for logging
|
||||||
ChatManager.chatSayInfo(pc,
|
ChatManager.chatSayInfo(pc,
|
||||||
"BaseClass changed to " + classID);
|
"BaseClass changed to " + classID);
|
||||||
InterestManager.reloadCharacter(pc);
|
InterestManager.reloadCharacter(pc,false);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ import engine.devcmd.AbstractDevCmd;
|
|||||||
import engine.gameManager.ChatManager;
|
import engine.gameManager.ChatManager;
|
||||||
import engine.objects.AbstractGameObject;
|
import engine.objects.AbstractGameObject;
|
||||||
import engine.objects.PlayerCharacter;
|
import engine.objects.PlayerCharacter;
|
||||||
|
import engine.server.MBServerStatics;
|
||||||
|
|
||||||
public class SetLevelCmd extends AbstractDevCmd {
|
public class SetLevelCmd extends AbstractDevCmd {
|
||||||
|
|
||||||
@@ -46,7 +47,7 @@ public class SetLevelCmd extends AbstractDevCmd {
|
|||||||
this.sendUsage(pc);
|
this.sendUsage(pc);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (level < 1 || level > 75) {
|
if (level < 1 || level > MBServerStatics.LEVELCAP) {
|
||||||
this.sendHelp(pc);
|
this.sendHelp(pc);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -57,12 +58,12 @@ public class SetLevelCmd extends AbstractDevCmd {
|
|||||||
tar.setLevel((short) level);
|
tar.setLevel((short) level);
|
||||||
this.setTarget(tar); //for logging
|
this.setTarget(tar); //for logging
|
||||||
ChatManager.chatSayInfo(pc, tar.getFirstName() + " level changed to " + level);
|
ChatManager.chatSayInfo(pc, tar.getFirstName() + " level changed to " + level);
|
||||||
InterestManager.reloadCharacter(tar);
|
InterestManager.reloadCharacter(tar,false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected String _getHelpString() {
|
protected String _getHelpString() {
|
||||||
return "Sets your character's level to 'amount'. 'amount' must be between 1-75";
|
return "Sets your character's level to 'amount'. 'amount' must be between 1-" + MBServerStatics.LEVELCAP;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ public class SetPromotionClassCmd extends AbstractDevCmd {
|
|||||||
pc.setPromotionClass(classID);
|
pc.setPromotionClass(classID);
|
||||||
ChatManager.chatSayInfo(pc,
|
ChatManager.chatSayInfo(pc,
|
||||||
"PromotionClass changed to " + classID);
|
"PromotionClass changed to " + classID);
|
||||||
InterestManager.reloadCharacter(pc);
|
InterestManager.reloadCharacter(pc,false);
|
||||||
this.setTarget(pc); //for logging
|
this.setTarget(pc); //for logging
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ public class SetRuneCmd extends AbstractDevCmd {
|
|||||||
if (worked) {
|
if (worked) {
|
||||||
ChatManager.chatSayInfo(pcSender,
|
ChatManager.chatSayInfo(pcSender,
|
||||||
"rune of ID " + runeID + " removed");
|
"rune of ID " + runeID + " removed");
|
||||||
InterestManager.reloadCharacter(pcSender);
|
InterestManager.reloadCharacter(pcSender,false);
|
||||||
} else
|
} else
|
||||||
throwbackError(pcSender, "Failed to remove the rune of type "
|
throwbackError(pcSender, "Failed to remove the rune of type "
|
||||||
+ runeID);
|
+ runeID);
|
||||||
|
|||||||
@@ -1,10 +1,12 @@
|
|||||||
package engine.devcmd.cmds;
|
package engine.devcmd.cmds;
|
||||||
|
|
||||||
|
import engine.Enum;
|
||||||
import engine.devcmd.AbstractDevCmd;
|
import engine.devcmd.AbstractDevCmd;
|
||||||
import engine.gameManager.LootManager;
|
import engine.gameManager.LootManager;
|
||||||
import engine.gameManager.ZoneManager;
|
import engine.gameManager.ZoneManager;
|
||||||
import engine.loot.BootySetEntry;
|
import engine.loot.BootySetEntry;
|
||||||
import engine.objects.*;
|
import engine.objects.*;
|
||||||
|
import org.pmw.tinylog.Logger;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.concurrent.ThreadLocalRandom;
|
import java.util.concurrent.ThreadLocalRandom;
|
||||||
@@ -26,7 +28,9 @@ public class SimulateBootyCmd extends AbstractDevCmd {
|
|||||||
String output;
|
String output;
|
||||||
|
|
||||||
output = "Booty Simulation:" + newline;
|
output = "Booty Simulation:" + newline;
|
||||||
|
if(target.getObjectType().equals(Enum.GameObjectType.Mob) == false){
|
||||||
|
return;//ugh what?
|
||||||
|
}
|
||||||
Mob mob = (Mob) target;
|
Mob mob = (Mob) target;
|
||||||
output += "Name: " + mob.getName() + newline;
|
output += "Name: " + mob.getName() + newline;
|
||||||
output += "Special Loot:" + newline;
|
output += "Special Loot:" + newline;
|
||||||
@@ -51,7 +55,7 @@ public class SimulateBootyCmd extends AbstractDevCmd {
|
|||||||
int failures = 0;
|
int failures = 0;
|
||||||
int goldAmount = 0;
|
int goldAmount = 0;
|
||||||
|
|
||||||
for (int i = 0; i < 100; ++i) {
|
for (int i = 0; i < 10000; ++i) {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
mob.loadInventory();
|
mob.loadInventory();
|
||||||
@@ -79,12 +83,19 @@ public class SimulateBootyCmd extends AbstractDevCmd {
|
|||||||
goldAmount += lootItem.getNumOfItems();
|
goldAmount += lootItem.getNumOfItems();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
OtherDrops.add(lootItem);
|
if(Warehouse.maxResources.containsKey(lootItem.getItemBaseID())){
|
||||||
|
Resources.add(lootItem);
|
||||||
|
} else {
|
||||||
|
OtherDrops.add(lootItem);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
failures++;
|
failures++;
|
||||||
|
//throwbackError(playerCharacter,ex.getLocalizedMessage());
|
||||||
|
//Logger.error(ex.fillInStackTrace());
|
||||||
|
//return;
|
||||||
}
|
}
|
||||||
if (mob.getEquip() != null) {
|
if (mob.getEquip() != null) {
|
||||||
for (MobEquipment me : mob.getEquip().values()) {
|
for (MobEquipment me : mob.getEquip().values()) {
|
||||||
@@ -131,8 +142,17 @@ public class SimulateBootyCmd extends AbstractDevCmd {
|
|||||||
}
|
}
|
||||||
|
|
||||||
output += "GLASS DROPS: " + GlassItems.size() + newline;
|
output += "GLASS DROPS: " + GlassItems.size() + newline;
|
||||||
|
for(Item glass : GlassItems){
|
||||||
|
output += " " + glass.getName() + newline;
|
||||||
|
}
|
||||||
output += "RUNE DROPS: " + Runes.size() + newline;
|
output += "RUNE DROPS: " + Runes.size() + newline;
|
||||||
|
for(Item rune : Runes){
|
||||||
|
output += " " + rune.getName() + newline;
|
||||||
|
}
|
||||||
output += "CONTRACTS DROPS: " + Contracts.size() + newline;
|
output += "CONTRACTS DROPS: " + Contracts.size() + newline;
|
||||||
|
for(Item contract : Contracts){
|
||||||
|
output += " " + contract.getName() + newline;
|
||||||
|
}
|
||||||
output += "RESOURCE DROPS: " + Resources.size() + newline;
|
output += "RESOURCE DROPS: " + Resources.size() + newline;
|
||||||
output += "OFFERINGS DROPPED: " + Offerings.size() + newline;
|
output += "OFFERINGS DROPPED: " + Offerings.size() + newline;
|
||||||
output += "ENCHANTED ITEMS DROPPED: " + OtherDrops.size() + newline;
|
output += "ENCHANTED ITEMS DROPPED: " + OtherDrops.size() + newline;
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ public class SlotTestCmd extends AbstractDevCmd {
|
|||||||
outString += "Hirelings List:";
|
outString += "Hirelings List:";
|
||||||
|
|
||||||
for (AbstractCharacter hireling : building.getHirelings().keySet())
|
for (AbstractCharacter hireling : building.getHirelings().keySet())
|
||||||
outString += "\r\n" + hireling.getName() + " slot : " + building.getHirelings().get(hireling);
|
outString += "\r\n" + hireling.getName() + "(" + hireling.getObjectUUID() + ") slot : " + building.getHirelings().get(hireling);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -110,7 +110,7 @@ public class SplatMobCmd extends AbstractDevCmd {
|
|||||||
|
|
||||||
mobile = Mob.createMob(_mobileUUID,
|
mobile = Mob.createMob(_mobileUUID,
|
||||||
Vector3fImmutable.getRandomPointInCircle(_currentLocation, _targetRange),
|
Vector3fImmutable.getRandomPointInCircle(_currentLocation, _targetRange),
|
||||||
null, true, serverZone, null, 0, "", 1);
|
null, serverZone, null, null, "", 1);
|
||||||
|
|
||||||
if (mobile != null) {
|
if (mobile != null) {
|
||||||
mobile.updateDatabase();
|
mobile.updateDatabase();
|
||||||
|
|||||||
@@ -11,8 +11,10 @@ package engine.devcmd.cmds;
|
|||||||
|
|
||||||
import engine.Enum.GameObjectType;
|
import engine.Enum.GameObjectType;
|
||||||
import engine.devcmd.AbstractDevCmd;
|
import engine.devcmd.AbstractDevCmd;
|
||||||
|
import engine.gameManager.PowersManager;
|
||||||
import engine.objects.AbstractGameObject;
|
import engine.objects.AbstractGameObject;
|
||||||
import engine.objects.Mob;
|
import engine.objects.Mob;
|
||||||
|
import engine.objects.MobBase;
|
||||||
import engine.objects.PlayerCharacter;
|
import engine.objects.PlayerCharacter;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@@ -56,38 +58,47 @@ public class aiInfoCmd extends AbstractDevCmd {
|
|||||||
Mob mob = (Mob) target;
|
Mob mob = (Mob) target;
|
||||||
output = "Mob AI Information:" + newline;
|
output = "Mob AI Information:" + newline;
|
||||||
output += mob.getName() + newline;
|
output += mob.getName() + newline;
|
||||||
if (mob.BehaviourType != null) {
|
if (mob.behaviourType != null) {
|
||||||
output += "BehaviourType: " + mob.BehaviourType.toString() + newline;
|
output += "BehaviourType: " + mob.behaviourType.toString() + newline;
|
||||||
if (mob.BehaviourType.BehaviourHelperType != null) {
|
if (mob.behaviourType.BehaviourHelperType != null) {
|
||||||
output += "Behaviour Helper Type: " + mob.BehaviourType.BehaviourHelperType.toString() + newline;
|
output += "Behaviour Helper Type: " + mob.behaviourType.BehaviourHelperType.toString() + newline;
|
||||||
} else {
|
} else {
|
||||||
output += "Behaviour Helper Type: NULL" + newline;
|
output += "Behaviour Helper Type: NULL" + newline;
|
||||||
}
|
}
|
||||||
output += "Wimpy: " + mob.BehaviourType.isWimpy + newline;
|
output += "Wimpy: " + mob.behaviourType.isWimpy + newline;
|
||||||
output += "Agressive: " + mob.BehaviourType.isAgressive + newline;
|
output += "Agressive: " + mob.behaviourType.isAgressive + newline;
|
||||||
output += "Can Roam: " + mob.BehaviourType.canRoam + newline;
|
output += "Can Roam: " + mob.behaviourType.canRoam + newline;
|
||||||
output += "Calls For Help: " + mob.BehaviourType.callsForHelp + newline;
|
output += "Calls For Help: " + mob.behaviourType.callsForHelp + newline;
|
||||||
output += "Responds To Call For Help: " + mob.BehaviourType.respondsToCallForHelp + newline;
|
output += "Responds To Call For Help: " + mob.behaviourType.respondsToCallForHelp + newline;
|
||||||
} else {
|
} else {
|
||||||
output += "BehaviourType: NULL" + newline;
|
output += "BehaviourType: NULL" + newline;
|
||||||
}
|
}
|
||||||
output += "Aggro Range: " + mob.getAggroRange() + newline;
|
output += "Aggro Range: " + mob.getAggroRange() + newline;
|
||||||
output += "Player Aggro Map Size: " + mob.playerAgroMap.size() + newline;
|
output += "Player Aggro Map Size: " + mob.playerAgroMap.size() + newline;
|
||||||
if (mob.playerAgroMap.size() > 0) {
|
if (mob.playerAgroMap.size() > 0) {
|
||||||
output += "Players Loaded:" + newline;
|
output += "Players Loaded:" + newline;
|
||||||
}
|
}
|
||||||
for (Map.Entry<Integer, Boolean> entry : mob.playerAgroMap.entrySet()) {
|
for (Map.Entry<Integer, Float> entry : mob.playerAgroMap.entrySet()) {
|
||||||
output += "Player ID: " + entry.getKey() + " Hate Value: " + (PlayerCharacter.getPlayerCharacter(entry.getKey())).getHateValue() + newline;
|
output += "Player ID: " + entry.getKey() + " Hate Value: " + entry.getValue() + newline;
|
||||||
}
|
}
|
||||||
if (mob.getCombatTarget() != null)
|
if (mob.getCombatTarget() != null)
|
||||||
output += "Current Target: " + mob.getCombatTarget().getName() + newline;
|
output += "Current Target: " + mob.getCombatTarget().getName() + newline;
|
||||||
else
|
else
|
||||||
output += "Current Target: NULL" + newline;
|
output += "Current Target: NULL" + newline;
|
||||||
|
|
||||||
|
if (mob.guardedCity != null)
|
||||||
|
output += "Patrolling: " + mob.guardedCity.getCityName() + newline;
|
||||||
|
|
||||||
|
output += "Powers:" + newline;
|
||||||
|
|
||||||
for (int token : mob.mobPowers.keySet())
|
for (int token : mob.mobPowers.keySet())
|
||||||
output += token + newline;
|
output += PowersManager.getPowerByToken(token).getName() + newline;
|
||||||
|
|
||||||
|
output += "Race type: " + MobBase.mobbase_race_types.get(mob.getMobBaseID());
|
||||||
throwbackInfo(playerCharacter, output);
|
throwbackInfo(playerCharacter, output);
|
||||||
|
|
||||||
|
throwbackInfo(playerCharacter, "Race Types: " + MobBase.mobbase_race_types.size());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -0,0 +1,72 @@
|
|||||||
|
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
||||||
|
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
||||||
|
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
||||||
|
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
||||||
|
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
||||||
|
// Magicbane Emulator Project © 2013 - 2022
|
||||||
|
// www.magicbane.com
|
||||||
|
|
||||||
|
|
||||||
|
package engine.devcmd.cmds;
|
||||||
|
|
||||||
|
import engine.Enum.GameObjectType;
|
||||||
|
import engine.InterestManagement.WorldGrid;
|
||||||
|
import engine.devcmd.AbstractDevCmd;
|
||||||
|
import engine.gameManager.*;
|
||||||
|
import engine.objects.*;
|
||||||
|
import org.pmw.tinylog.Logger;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Eighty
|
||||||
|
*/
|
||||||
|
public class setProfit extends AbstractDevCmd {
|
||||||
|
|
||||||
|
public setProfit() {
|
||||||
|
super("setprofit");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void _doCmd(PlayerCharacter pc, String[] words,
|
||||||
|
AbstractGameObject target) {
|
||||||
|
|
||||||
|
if (words.length < 2) {
|
||||||
|
this.sendUsage(pc);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
float updateValue;
|
||||||
|
try {
|
||||||
|
updateValue = Float.parseFloat(words[1]);
|
||||||
|
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
throwbackError(pc,
|
||||||
|
"Failed to parse supplied contractID or level to an Integer.");
|
||||||
|
return; // NaN
|
||||||
|
}
|
||||||
|
if(target.getObjectType().equals(GameObjectType.NPC) == false){
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
NPC npc = (NPC)target;
|
||||||
|
if(words[0].toLowerCase().equals("buy")){
|
||||||
|
npc.buyPercent = updateValue;
|
||||||
|
npc.updateDatabase();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if(words[0].toLowerCase().equals("sell")){
|
||||||
|
npc.sellPercent = updateValue;
|
||||||
|
npc.updateDatabase();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String _getHelpString() {
|
||||||
|
return "Sets profit margin of targeted NPC";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String _getUsageString() {
|
||||||
|
return "' /setprofit buy/sell VALUE(1.0)'";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
-87
@@ -1,87 +0,0 @@
|
|||||||
# Account Handler Documentation
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
This document describes the database relationships and interactions for the `dbAccountHandler` class. The account handler manages user authentication and account-related data in the Magicbane emulator system.
|
|
||||||
|
|
||||||
## Handler Class
|
|
||||||
**File:** `src/engine/db/handlers/dbAccountHandler.java`
|
|
||||||
**Class:** `dbAccountHandler`
|
|
||||||
**Extends:** `dbHandlerBase`
|
|
||||||
|
|
||||||
## Database Tables
|
|
||||||
|
|
||||||
### Main Account Table
|
|
||||||
- **Table Name:** `obj_account`
|
|
||||||
- **Description:** Core account information including login credentials, status, and account details
|
|
||||||
- **Columns:**
|
|
||||||
- UID (Primary Key)
|
|
||||||
- username
|
|
||||||
- password
|
|
||||||
- email
|
|
||||||
- accountStatus
|
|
||||||
- lastLogin
|
|
||||||
- creationDate
|
|
||||||
- isBanned
|
|
||||||
- banReason
|
|
||||||
- isDeleted
|
|
||||||
- deletedDate
|
|
||||||
|
|
||||||
### Related Tables
|
|
||||||
|
|
||||||
| Table Name | Description | Relationship |
|
|
||||||
|------------|-------------|--------------|
|
|
||||||
| `obj_account_wipe` | Account wipe history records | AccountID → obj_account.UID |
|
|
||||||
| `dyn_login_history` | Login attempt and session history | AccountID → obj_account.UID |
|
|
||||||
|
|
||||||
## Key Queries
|
|
||||||
|
|
||||||
### Get Account by ID
|
|
||||||
```sql
|
|
||||||
SELECT * FROM `obj_account` WHERE `UID`=?
|
|
||||||
```
|
|
||||||
**File:** `dbAccountHandler.java`, Line ~60
|
|
||||||
|
|
||||||
### Get Account by Username
|
|
||||||
```sql
|
|
||||||
SELECT * FROM `obj_account` WHERE `username`=?
|
|
||||||
```
|
|
||||||
**File:** `dbAccountHandler.java`, Line ~85
|
|
||||||
|
|
||||||
### Create New Account
|
|
||||||
```sql
|
|
||||||
INSERT INTO `obj_account` (`username`, `password`, `email`, `accountStatus`, `creationDate`) VALUES (?, ?, ?, ?, ?)
|
|
||||||
```
|
|
||||||
**File:** `dbAccountHandler.java`, Line ~105
|
|
||||||
|
|
||||||
### Update Account Status
|
|
||||||
```sql
|
|
||||||
UPDATE `obj_account` SET `accountStatus`=?, `lastLogin`=? WHERE `UID`=?
|
|
||||||
```
|
|
||||||
**File:** `dbAccountHandler.java`, Line ~132
|
|
||||||
|
|
||||||
### Check Username Availability
|
|
||||||
```sql
|
|
||||||
SELECT `username` FROM `obj_account` WHERE `username`=?
|
|
||||||
```
|
|
||||||
**File:** `dbAccountHandler.java`, Line ~158
|
|
||||||
|
|
||||||
## Relationships
|
|
||||||
|
|
||||||
1. **Account to Character:** One-to-many (via `obj_character.accountID` field)
|
|
||||||
2. **Account to Account Wipe History:** One-to-many (via `obj_account_wipe.AccountID`)
|
|
||||||
3. **Account to Login History:** One-to-many (via `dyn_login_history.AccountID`)
|
|
||||||
|
|
||||||
## Java Field to Database Column Mappings
|
|
||||||
|
|
||||||
| Java Field | Database Column | Notes |
|
|
||||||
|------------|-----------------|-------|
|
|
||||||
| `username` | `obj_account.username` | Unique account username |
|
|
||||||
| `password` | `obj_account.password` | Encrypted password |
|
|
||||||
| `email` | `obj_account.email` | Account email address |
|
|
||||||
| `accountStatus` | `obj_account.accountStatus` | Current account status |
|
|
||||||
| `lastLogin` | `obj_account.lastLogin` | Timestamp of last login |
|
|
||||||
| `creationDate` | `obj_account.creationDate` | Account creation date |
|
|
||||||
| `isBanned` | `obj_account.isBanned` | Boolean flag for banned status |
|
|
||||||
| `banReason` | `obj_account.banReason` | Reason for ban |
|
|
||||||
| `isDeleted` | `obj_account.isDeleted` | Boolean flag for deleted status |
|
|
||||||
| `deletedDate` | `obj_account.deletedDate` | Timestamp of deletion |
|
|
||||||
-63
@@ -1,63 +0,0 @@
|
|||||||
# dbBaneHandler Documentation
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
This document describes the database relationships and interactions for the `dbBaneHandler` class. The bane handler manages special objects in cities that have specific properties and behaviors, including their ownership, location, and time-based effects.
|
|
||||||
|
|
||||||
## Handler Class
|
|
||||||
**File:** `src/engine/db/handlers/dbBaneHandler.java`
|
|
||||||
**Class:** `dbBaneHandler`
|
|
||||||
**Extends:** `dbHandlerBase`
|
|
||||||
|
|
||||||
## Database Tables
|
|
||||||
|
|
||||||
### Main Bane Table
|
|
||||||
- **Table Name:** `dyn_banes`
|
|
||||||
- **Description:** Stores information about bane objects placed in cities, including their owner, location, and time-based properties
|
|
||||||
- **Columns:**
|
|
||||||
- cityUUID (Primary Key)
|
|
||||||
- ownerUUID
|
|
||||||
- stoneUUID
|
|
||||||
- placementDate
|
|
||||||
- liveDate
|
|
||||||
|
|
||||||
## Key Queries
|
|
||||||
|
|
||||||
### CREATE_BANE
|
|
||||||
```sql
|
|
||||||
INSERT INTO `dyn_banes` (`cityUUID`, `ownerUUID`, `stoneUUID`, `placementDate`) VALUES(?,?,?,?)
|
|
||||||
```
|
|
||||||
**File:** `dbBaneHandler.java`, Line ~17
|
|
||||||
|
|
||||||
### LOAD_BANE
|
|
||||||
```sql
|
|
||||||
SELECT * FROM `dyn_banes` WHERE `dyn_banes`.`cityUUID` = ?
|
|
||||||
```
|
|
||||||
**File:** `dbBaneHandler.java`, Line ~30
|
|
||||||
|
|
||||||
### SET_BANE_TIME
|
|
||||||
```sql
|
|
||||||
UPDATE `dyn_banes` SET `liveDate`=? WHERE `cityUUID`=?
|
|
||||||
```
|
|
||||||
**File:** `dbBaneHandler.java`, Line ~45
|
|
||||||
|
|
||||||
### REMOVE_BANE
|
|
||||||
```sql
|
|
||||||
DELETE FROM `dyn_banes` WHERE `cityUUID` = ?
|
|
||||||
```
|
|
||||||
**File:** `dbBaneHandler.java`, Line ~57
|
|
||||||
|
|
||||||
## Relationships
|
|
||||||
|
|
||||||
1. **Bane to City:** One-to-one relationship via cityUUID (primary key) referencing obj_city.UID
|
|
||||||
2. **Bane to Owner:** Many-to-one relationship via ownerUUID referencing obj_character.UID
|
|
||||||
3. **Bane to Stone:** Many-to-one relationship via stoneUUID referencing obj_building.UID
|
|
||||||
|
|
||||||
## Java Field to Database Column Mappings
|
|
||||||
|
|
||||||
| Java Field | Database Column | Notes |
|
|
||||||
|------------|-----------------|-------|
|
|
||||||
| `cityUUID` | `dyn_banes.cityUUID` | Unique identifier for the city where bane is placed |
|
|
||||||
| `ownerUUID` | `dyn_banes.ownerUUID` | Character UID of the owner of this bane |
|
|
||||||
| `stoneUUID` | `dyn_banes.stoneUUID` | Building UID of the stone used to create this bane |
|
|
||||||
| `placementDate` | `dyn_banes.placementDate` | Timestamp when bane was placed |
|
|
||||||
| `liveDate` | `dyn_banes.liveDate` | Timestamp for when bane becomes active |
|
|
||||||
-73
@@ -1,73 +0,0 @@
|
|||||||
# dbBaseClassHandler Documentation
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
The `dbBaseClassHandler` is responsible for managing base class data in the Magicbane database. Base classes represent fundamental character classifications that define core attributes and capabilities. This handler manages retrieval of base class information, including fetching specific base classes by ID, retrieving base classes associated with a particular race, and getting all available base classes.
|
|
||||||
|
|
||||||
## Database Table Structure
|
|
||||||
|
|
||||||
### Table: `static_rune_baseclass`
|
|
||||||
|
|
||||||
| Column Name | Data Type | Nullable | Key | Description |
|
|
||||||
|-------------|-----------|----------|-----|-------------|
|
|
||||||
| ID | int unsigned | NO | PRIMARY | Unique identifier for the base class |
|
|
||||||
| name | varchar(45) | NO | | Name of the base class |
|
|
||||||
| description | varchar(200) | NO | | Description of the base class |
|
|
||||||
| strMod | tinyint | NO | | Strength modifier for this base class |
|
|
||||||
| dexMod | tinyint | NO | | Dexterity modifier for this base class |
|
|
||||||
| conMod | tinyint | NO | | Constitution modifier for this base class |
|
|
||||||
| intMod | tinyint | NO | | Intelligence modifier for this base class |
|
|
||||||
| wisMod | tinyint | NO | | Wisdom modifier for this base class |
|
|
||||||
| chaMod | tinyint | NO | | Charisma modifier for this base class |
|
|
||||||
| healthMod | tinyint | NO | | Health modifier for this base class |
|
|
||||||
| manaMod | tinyint | NO | | Mana modifier for this base class |
|
|
||||||
| staminaMod | tinyint | NO | | Stamina modifier for this base class |
|
|
||||||
|
|
||||||
### Table: `static_rune_racebaseclass`
|
|
||||||
|
|
||||||
| Column Name | Data Type | Nullable | Key | Description |
|
|
||||||
|-------------|-----------|----------|-----|-------------|
|
|
||||||
| ID | int unsigned | NO | PRIMARY | Unique identifier for the relationship |
|
|
||||||
| RaceID | int unsigned | NO | FOREIGN KEY | Reference to race in `static_rune_race` |
|
|
||||||
| BaseClassID | int unsigned | NO | FOREIGN KEY | Reference to base class in `static_rune_baseclass` |
|
|
||||||
|
|
||||||
## Java Field to Database Column Mapping
|
|
||||||
|
|
||||||
| Java Field | Database Column | Type | Description |
|
|
||||||
|------------|-----------------|------|-------------|
|
|
||||||
| baseClass.getId() | ID | int unsigned | Base class unique identifier |
|
|
||||||
| baseClass.getName() | name | varchar(45) | Base class name |
|
|
||||||
| baseClass.getDescription() | description | varchar(200) | Base class description |
|
|
||||||
| baseClass.getStrMod() | strMod | tinyint | Strength modifier |
|
|
||||||
| baseClass.getDexMod() | dexMod | tinyint | Dexterity modifier |
|
|
||||||
| baseClass.getConMod() | conMod | tinyint | Constitution modifier |
|
|
||||||
| baseClass.getIntMod() | intMod | tinyint | Intelligence modifier |
|
|
||||||
| baseClass.getWisMod() | wisMod | tinyint | Wisdom modifier |
|
|
||||||
| baseClass.getChaMod() | chaMod | tinyint | Charisma modifier |
|
|
||||||
| baseClass.getHealthMod() | healthMod | tinyint | Health modifier |
|
|
||||||
| baseClass.getManaMod() | manaMod | tinyint | Mana modifier |
|
|
||||||
| baseClass.getStaminaMod() | staminaMod | tinyint | Stamina modifier |
|
|
||||||
|
|
||||||
## Key Queries
|
|
||||||
|
|
||||||
### GET_BASE_CLASS
|
|
||||||
- **Query**: `SELECT * FROM \`static_rune_baseclass\` WHERE \`ID\`=?`
|
|
||||||
- **Parameter**: id (base class ID)
|
|
||||||
- **Note**: Fixed from original bug - was selecting from obj_account table instead of static_rune_baseclass
|
|
||||||
|
|
||||||
### GET_BASECLASS_FOR_RACE
|
|
||||||
- **Query**: `SELECT b.* FROM \`static_rune_baseclass\` b, \`static_rune_racebaseclass\` r WHERE b.\`ID\` = r.\`BaseClassID\` && r.\`RaceID\` = ?`
|
|
||||||
- **Parameter**: id (race ID)
|
|
||||||
|
|
||||||
### GET_ALL_BASE_CLASSES
|
|
||||||
- **Query**: `SELECT * FROM \`static_rune_baseclass\`;`
|
|
||||||
- **Note**: Returns all base classes from the static table
|
|
||||||
|
|
||||||
## Relationships
|
|
||||||
|
|
||||||
### Foreign Key Relationships
|
|
||||||
- `static_rune_racebaseclass.BaseClassID` references `static_rune_baseclass.ID`
|
|
||||||
- `static_rune_racebaseclass.RaceID` references `static_rune_race.ID`
|
|
||||||
|
|
||||||
### Associated Objects
|
|
||||||
- **BaseClass**: Core character classification data
|
|
||||||
- **Race**: Associated races that can use specific base classes (via `static_rune_racebaseclass`)
|
|
||||||
-119
@@ -1,119 +0,0 @@
|
|||||||
# dbBlueprintHandler Documentation
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
The `dbBlueprintHandler` is responsible for managing building blueprint data and door number mappings in the Magicbane database. This handler loads blueprint information used for building construction and handles door mesh-to-number mappings.
|
|
||||||
|
|
||||||
## Database Table Structure
|
|
||||||
|
|
||||||
### Table: `static_building_blueprint`
|
|
||||||
|
|
||||||
| Column Name | Data Type | Nullable | Key | Description |
|
|
||||||
|-------------|-----------|----------|-----|-------------|
|
|
||||||
| Rank0UUID | bigint unsigned | NO | PRIMARY | Unique identifier for the blueprint (rank 0) |
|
|
||||||
| MeshName | varchar(100) | NO | | Name of the mesh used for the building |
|
|
||||||
| BuildingGroup | enum | NO | | Group classification of the building type |
|
|
||||||
| MaintGroup | varchar(45) | YES | | Maintenance group associated with the building |
|
|
||||||
| Rank1UUID | bigint unsigned | YES | | UUID for rank 1 upgrade |
|
|
||||||
| Rank2UUID | bigint unsigned | YES | | UUID for rank 2 upgrade |
|
|
||||||
| Rank3UUID | bigint unsigned | YES | | UUID for rank 3 upgrade |
|
|
||||||
| Rank4UUID | bigint unsigned | YES | | UUID for rank 4 upgrade |
|
|
||||||
| Rank5UUID | bigint unsigned | YES | | UUID for rank 5 upgrade |
|
|
||||||
| Rank6UUID | bigint unsigned | YES | | UUID for rank 6 upgrade |
|
|
||||||
| Rank7UUID | bigint unsigned | YES | | UUID for rank 7 upgrade |
|
|
||||||
| UpgradeCost | int | YES | | Cost to upgrade the building |
|
|
||||||
| UpgradeTime | int | YES | | Time required to upgrade the building |
|
|
||||||
| MaxHP | int | YES | | Maximum hit points of the building |
|
|
||||||
| MaxGold | int | YES | | Maximum gold storage capacity |
|
|
||||||
| MaxLevel | int | YES | | Maximum level for this building |
|
|
||||||
| MaxRank | int | YES | | Maximum rank for this building |
|
|
||||||
| MinLevel | int | YES | | Minimum level required to build |
|
|
||||||
| Scale | float | YES | | Scale factor for the building mesh |
|
|
||||||
| SizeX | float | YES | | X dimension size |
|
|
||||||
| SizeY | float | YES | | Y dimension size |
|
|
||||||
| SizeZ | float | YES | | Z dimension size |
|
|
||||||
| DoorCount | int | YES | | Number of doors in this building |
|
|
||||||
| MaxDoorCount | int | YES | | Maximum number of doors allowed |
|
|
||||||
| IsWall | tinyint(1) | YES | | Flag indicating if building is a wall |
|
|
||||||
| IsGate | tinyint(1) | YES | | Flag indicating if building is a gate |
|
|
||||||
| IsTower | tinyint(1) | YES | | Flag indicating if building is a tower |
|
|
||||||
| IsKeep | tinyint(1) | YES | | Flag indicating if building is a keep |
|
|
||||||
| IsFortress | tinyint(1) | YES | | Flag indicating if building is a fortress |
|
|
||||||
| IsCastle | tinyint(1) | YES | | Flag indicating if building is a castle |
|
|
||||||
| IsBarracks | tinyint(1) | YES | | Flag indicating if building is barracks |
|
|
||||||
| IsChurch | tinyint(1) | YES | | Flag indicating if building is a church |
|
|
||||||
| IsForge | tinyint(1) | YES | | Flag indicating if building is a forge |
|
|
||||||
| IsSpire | tinyint(1) | YES | | Flag indicating if building is a spire |
|
|
||||||
| IsShrine | tinyint(1) | YES | | Flag indicating if building is a shrine |
|
|
||||||
| IsRunegate | tinyint(1) | YES | | Flag indicating if building is a runegate |
|
|
||||||
| IsMine | tinyint(1) | YES | | Flag indicating if building is a mine |
|
|
||||||
| IsWarehouse | tinyint(1) | YES | | Flag indicating if building is a warehouse |
|
|
||||||
|
|
||||||
### Table: `static_building_doors`
|
|
||||||
|
|
||||||
| Column Name | Data Type | Nullable | Key | Description |
|
|
||||||
|-------------|-----------|----------|-----|-------------|
|
|
||||||
| doorMeshUUID | int | NO | PRIMARY | Unique identifier for the door mesh |
|
|
||||||
| doorNumber | int | NO | | Door number associated with this mesh |
|
|
||||||
|
|
||||||
## Java Field to Database Column Mapping
|
|
||||||
|
|
||||||
| Java Field | Database Column | Type | Description |
|
|
||||||
|------------|-----------------|------|-------------|
|
|
||||||
| blueprint.getBlueprintUUID() | Rank0UUID | bigint unsigned | Blueprint unique identifier |
|
|
||||||
| blueprint.getMeshName() | MeshName | varchar(100) | Name of the building mesh |
|
|
||||||
| blueprint.getBuildingGroup() | BuildingGroup | enum | Group classification of the building |
|
|
||||||
| blueprint.getMaintGroup() | MaintGroup | varchar(45) | Maintenance group for this building |
|
|
||||||
| blueprint.getRank1UUID() | Rank1UUID | bigint unsigned | UUID for rank 1 upgrade |
|
|
||||||
| blueprint.getRank2UUID() | Rank2UUID | bigint unsigned | UUID for rank 2 upgrade |
|
|
||||||
| blueprint.getRank3UUID() | Rank3UUID | bigint unsigned | UUID for rank 3 upgrade |
|
|
||||||
| blueprint.getRank4UUID() | Rank4UUID | bigint unsigned | UUID for rank 4 upgrade |
|
|
||||||
| blueprint.getRank5UUID() | Rank5UUID | bigint unsigned | UUID for rank 5 upgrade |
|
|
||||||
| blueprint.getRank6UUID() | Rank6UUID | bigint unsigned | UUID for rank 6 upgrade |
|
|
||||||
| blueprint.getRank7UUID() | Rank7UUID | bigint unsigned | UUID for rank 7 upgrade |
|
|
||||||
| blueprint.getUpgradeCost() | UpgradeCost | int | Cost to upgrade the building |
|
|
||||||
| blueprint.getUpgradeTime() | UpgradeTime | int | Time required to upgrade |
|
|
||||||
| blueprint.getMaxHP() | MaxHP | int | Maximum hit points |
|
|
||||||
| blueprint.getMaxGold() | MaxGold | int | Maximum gold storage |
|
|
||||||
| blueprint.getMaxLevel() | MaxLevel | int | Maximum level for this building |
|
|
||||||
| blueprint.getMaxRank() | MaxRank | int | Maximum rank |
|
|
||||||
| blueprint.getMinLevel() | MinLevel | int | Minimum level required |
|
|
||||||
| blueprint.getScale() | Scale | float | Scale factor for mesh |
|
|
||||||
| blueprint.getSizeX() | SizeX | float | X dimension size |
|
|
||||||
| blueprint.getSizeY() | SizeY | float | Y dimension size |
|
|
||||||
| blueprint.getSizeZ() | SizeZ | float | Z dimension size |
|
|
||||||
| blueprint.getDoorCount() | DoorCount | int | Number of doors |
|
|
||||||
| blueprint.getMaxDoorCount() | MaxDoorCount | int | Maximum number of doors |
|
|
||||||
| blueprint.getIsWall() | IsWall | tinyint(1) | Wall flag |
|
|
||||||
| blueprint.getIsGate() | IsGate | tinyint(1) | Gate flag |
|
|
||||||
| blueprint.getIsTower() | IsTower | tinyint(1) | Tower flag |
|
|
||||||
| blueprint.getIsKeep() | IsKeep | tinyint(1) | Keep flag |
|
|
||||||
| blueprint.getIsFortress() | IsFortress | tinyint(1) | Fortress flag |
|
|
||||||
| blueprint.getIsCastle() | IsCastle | tinyint(1) | Castle flag |
|
|
||||||
| blueprint.getIsBarracks() | IsBarracks | tinyint(1) | Barracks flag |
|
|
||||||
| blueprint.getIsChurch() | IsChurch | tinyint(1) | Church flag |
|
|
||||||
| blueprint.getIsForge() | IsForge | tinyint(1) | Forge flag |
|
|
||||||
| blueprint.getIsSpire() | IsSpire | tinyint(1) | Spire flag |
|
|
||||||
| blueprint.getIsShrine() | IsShrine | tinyint(1) | Shrine flag |
|
|
||||||
| blueprint.getIsRunegate() | IsRunegate | tinyint(1) | Runegate flag |
|
|
||||||
| blueprint.getIsMine() | IsMine | tinyint(1) | Mine flag |
|
|
||||||
| blueprint.getIsWarehouse() | IsWarehouse | tinyint(1) | Warehouse flag |
|
|
||||||
|
|
||||||
## Key Queries
|
|
||||||
|
|
||||||
### LOAD_ALL_DOOR_NUMBERS
|
|
||||||
- **Query**: `SELECT * FROM static_building_doors ORDER BY doorMeshUUID ASC`
|
|
||||||
- **Note**: Loads all door mesh-to-number mappings for building doors
|
|
||||||
|
|
||||||
### LOAD_ALL_BLUEPRINTS
|
|
||||||
- **Query**: `SELECT * FROM static_building_blueprint`
|
|
||||||
- **Note**: Loads all blueprint definitions for buildings
|
|
||||||
|
|
||||||
## Relationships
|
|
||||||
|
|
||||||
### Foreign Key Relationships
|
|
||||||
- None explicitly defined in the handler code (these are likely static lookup tables)
|
|
||||||
|
|
||||||
### Associated Objects
|
|
||||||
- **Blueprint**: Building construction data with mesh information and upgrade paths
|
|
||||||
- **Door**: Door mesh mappings used for building construction
|
|
||||||
|
|
||||||
-43
@@ -1,43 +0,0 @@
|
|||||||
# Boon Handler Documentation
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
This document describes the database relationships and interactions for the `dbBoonHandler` class. The boon system in Magicbane is used to manage item bonuses and enhancements that are associated with specific item bases.
|
|
||||||
|
|
||||||
## Handler Class
|
|
||||||
**File:** `src/engine/db/handlers/dbBoonHandler.java`
|
|
||||||
**Class:** `dbBoonHandler`
|
|
||||||
**Extends:** `dbHandlerBase`
|
|
||||||
|
|
||||||
## Database Tables
|
|
||||||
|
|
||||||
### Main Boon Table
|
|
||||||
- **Table Name:** `static_item_boons`
|
|
||||||
- **Description:** Contains information about boons (bonuses/enhancements) that can be applied to item bases
|
|
||||||
- **Columns:**
|
|
||||||
- UID (Primary Key)
|
|
||||||
- itemBaseID (Foreign Key to obj_itembase)
|
|
||||||
- boonType
|
|
||||||
- boonValue
|
|
||||||
- boonLevel
|
|
||||||
|
|
||||||
## Key Queries
|
|
||||||
|
|
||||||
### Get Boon Amounts for Item Base
|
|
||||||
```sql
|
|
||||||
SELECT * FROM `static_item_boons` WHERE `itemBaseID` = ?
|
|
||||||
```
|
|
||||||
**File:** `dbBoonHandler.java`, Line ~28
|
|
||||||
|
|
||||||
## Relationships
|
|
||||||
|
|
||||||
1. **Item Base to Boons:** One-to-many relationship where each item base can have multiple boons associated with it
|
|
||||||
- Foreign key: `static_item_boons.itemBaseID` references `obj_itembase.UID`
|
|
||||||
|
|
||||||
## Java Field to Database Column Mappings
|
|
||||||
|
|
||||||
| Java Field | Database Column | Notes |
|
|
||||||
|------------|-----------------|-------|
|
|
||||||
| `itemBaseID` | `static_item_boons.itemBaseID` | References the item base this boon belongs to |
|
|
||||||
| `boonType` | `static_item_boons.boonType` | Type of boon (e.g., damage, defense) |
|
|
||||||
| `boonValue` | `static_item_boons.boonValue` | Value of the boon |
|
|
||||||
| `boonLevel` | `static_item_boons.boonLevel` | Level of the boon |
|
|
||||||
-98
@@ -1,98 +0,0 @@
|
|||||||
# Building Handler Documentation
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
This document describes the database relationships and interactions for the `dbBuildingHandler` class. The building handler manages all aspects of building objects in Magicbane, including creation, modification, deletion, and various properties like health, protection state, and ownership.
|
|
||||||
|
|
||||||
## Handler Class
|
|
||||||
**File:** `src/engine/db/handlers/dbBuildingHandler.java`
|
|
||||||
**Class:** `dbBuildingHandler`
|
|
||||||
**Extends:** `dbHandlerBase`
|
|
||||||
|
|
||||||
## Database Tables
|
|
||||||
|
|
||||||
### Main Building Table
|
|
||||||
- **Table Name:** `obj_building`
|
|
||||||
- **Description:** Core building information including location, mesh, health, and ownership details
|
|
||||||
- **Columns:**
|
|
||||||
- UID (Primary Key)
|
|
||||||
- parent (Foreign Key to obj_zone)
|
|
||||||
- ownerUUID (Foreign Key to obj_character)
|
|
||||||
- name
|
|
||||||
- meshUUID (Foreign Key to static_building_mesh)
|
|
||||||
- locX, locY, locZ (Location coordinates)
|
|
||||||
- meshScale
|
|
||||||
- currentHP
|
|
||||||
- protectionState
|
|
||||||
- currentGold
|
|
||||||
- rank
|
|
||||||
- upgradeDate
|
|
||||||
- blueprintUUID (Foreign Key to static_building_blueprint)
|
|
||||||
- w, rotY (Rotation data)
|
|
||||||
- isDeleted
|
|
||||||
|
|
||||||
### Related Tables
|
|
||||||
|
|
||||||
| Table Name | Description | Relationship |
|
|
||||||
|------------|-------------|--------------|
|
|
||||||
| `dyn_building_friendslist` | Stores friends that can access this building | BuildingID → obj_building.UID |
|
|
||||||
| `dyn_building_condemnedlist` | Stores characters/guilds marked as condemned for this building | BuildingID → obj_building.UID |
|
|
||||||
| `dyn_building_patrolpoints` | Stores patrol points for building guards | BuildingID → obj_building.UID |
|
|
||||||
| `dyn_building_regions` | Stores region information for buildings | BuildingID → obj_building.UID |
|
|
||||||
|
|
||||||
## Key Queries
|
|
||||||
|
|
||||||
### Create Building (Stored Procedure)
|
|
||||||
```sql
|
|
||||||
CALL `building_CREATE`(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
||||||
```
|
|
||||||
**File:** `dbBuildingHandler.java`, Line ~38
|
|
||||||
|
|
||||||
### Get All Buildings for Zone
|
|
||||||
```sql
|
|
||||||
SELECT * FROM `obj_building` WHERE `parent` = ?
|
|
||||||
```
|
|
||||||
**File:** `dbBuildingHandler.java`, Line ~91
|
|
||||||
|
|
||||||
### Get Building by UUID
|
|
||||||
```sql
|
|
||||||
SELECT * FROM `obj_building` WHERE `UID` = ?
|
|
||||||
```
|
|
||||||
**File:** `dbBuildingHandler.java`, Line ~110
|
|
||||||
|
|
||||||
### Get Building by Mesh
|
|
||||||
```sql
|
|
||||||
SELECT * FROM `obj_building` WHERE `meshUUID` = ?
|
|
||||||
```
|
|
||||||
**File:** `dbBuildingHandler.java`, Line ~135
|
|
||||||
|
|
||||||
## Relationships
|
|
||||||
|
|
||||||
1. **Building to Zone:** Many-to-one relationship through `obj_building.parent` field
|
|
||||||
2. **Building to Owner:** Many-to-one relationship through `obj_building.ownerUUID` field (references obj_character.UID)
|
|
||||||
3. **Building to Blueprint:** Many-to-one relationship through `obj_building.blueprintUUID` field (references static_building_blueprint.Rank0UUID)
|
|
||||||
4. **Building to Mesh:** Many-to-one relationship through `obj_building.meshUUID` field (references static_building_mesh.UID)
|
|
||||||
5. **Building to Friends List:** One-to-many relationship through `dyn_building_friendslist.BuildingID`
|
|
||||||
6. **Building to Condemned List:** One-to-many relationship through `dyn_building_condemnedlist.BuildingID`
|
|
||||||
7. **Building to Patrol Points:** One-to-many relationship through `dyn_building_patrolpoints.BuildingID`
|
|
||||||
8. **Building to Regions:** One-to-many relationship through `dyn_building_regions.BuildingID`
|
|
||||||
|
|
||||||
## Java Field to Database Column Mappings
|
|
||||||
|
|
||||||
| Java Field | Database Column | Notes |
|
|
||||||
|------------|-----------------|-------|
|
|
||||||
| `parent` | `obj_building.parent` | Zone parent ID |
|
|
||||||
| `ownerUUID` | `obj_building.ownerUUID` | Owner character UID |
|
|
||||||
| `name` | `obj_building.name` | Building name |
|
|
||||||
| `meshUUID` | `obj_building.meshUUID` | Mesh identifier |
|
|
||||||
| `locX` | `obj_building.locX` | X coordinate |
|
|
||||||
| `locY` | `obj_building.locY` | Y coordinate |
|
|
||||||
| `locZ` | `obj_building.locZ` | Z coordinate |
|
|
||||||
| `meshScale` | `obj_building.meshScale` | Scale of mesh |
|
|
||||||
| `currentHP` | `obj_building.currentHP` | Current health points |
|
|
||||||
| `protectionState` | `obj_building.protectionState` | Protection state |
|
|
||||||
| `currentGold` | `obj_building.currentGold` | Current gold amount |
|
|
||||||
| `rank` | `obj_building.rank` | Building rank |
|
|
||||||
| `upgradeDate` | `obj_building.upgradeDate` | Upgrade timestamp |
|
|
||||||
| `blueprintUUID` | `obj_building.blueprintUUID` | Blueprint identifier |
|
|
||||||
| `w` | `obj_building.w` | Rotation data |
|
|
||||||
| `rotY` | `obj_building.rotY` | Y rotation angle |
|
|
||||||
-61
@@ -1,61 +0,0 @@
|
|||||||
# Building Location Handler Documentation
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
This document describes the database relationships and interactions for the `dbBuildingLocationHandler` class. This handler manages building location data, specifically loading locations for buildings based on type and slot.
|
|
||||||
|
|
||||||
## Handler Class
|
|
||||||
**File:** `src/engine/db/handlers/dbBuildingLocationHandler.java`
|
|
||||||
**Class:** `dbBuildingLocationHandler`
|
|
||||||
**Extends:** `dbHandlerBase`
|
|
||||||
|
|
||||||
## Database Tables
|
|
||||||
|
|
||||||
### Main Table
|
|
||||||
- **Table Name:** `static_building_location`
|
|
||||||
- **Description:** Stores location data for building components including position and rotation information
|
|
||||||
- **Columns:**
|
|
||||||
- ID (Primary Key)
|
|
||||||
- BuildingID
|
|
||||||
- type
|
|
||||||
- slot
|
|
||||||
- unknown
|
|
||||||
- locX
|
|
||||||
- locY
|
|
||||||
- locZ
|
|
||||||
- w
|
|
||||||
- rotX
|
|
||||||
- rotY
|
|
||||||
- rotZ
|
|
||||||
|
|
||||||
## Key Queries
|
|
||||||
|
|
||||||
### Load Building Locations
|
|
||||||
```sql
|
|
||||||
SELECT `ID`, `BuildingID`, `type`, `slot`, `unknown`, `locX`, `locY`, `locZ`, `w`, `rotX`, `rotY`, `rotZ`
|
|
||||||
FROM static_building_location
|
|
||||||
WHERE type = 6 OR type = 8
|
|
||||||
GROUP BY buildingID, slot
|
|
||||||
ORDER BY buildingID, slot ASC;
|
|
||||||
```
|
|
||||||
**File:** `dbBuildingLocationHandler.java`, Line ~17
|
|
||||||
|
|
||||||
## Relationships
|
|
||||||
|
|
||||||
1. **Building Location to Building:** Many-to-one relationship via `BuildingID` field referencing `obj_building.UID`
|
|
||||||
|
|
||||||
## Java Field to Database Column Mappings
|
|
||||||
|
|
||||||
| Java Field | Database Column | Notes |
|
|
||||||
|------------|-----------------|-------|
|
|
||||||
| `id` | `static_building_location.ID` | Unique identifier |
|
|
||||||
| `buildingID` | `static_building_location.BuildingID` | Reference to building |
|
|
||||||
| `type` | `static_building_location.type` | Location type |
|
|
||||||
| `slot` | `static_building_location.slot` | Slot number |
|
|
||||||
| `unknown` | `static_building_location.unknown` | Unknown field |
|
|
||||||
| `locX` | `static_building_location.locX` | X coordinate |
|
|
||||||
| `locY` | `static_building_location.locY` | Y coordinate |
|
|
||||||
| `locZ` | `static_building_location.locZ` | Z coordinate |
|
|
||||||
| `w` | `static_building_location.w` | W rotation value |
|
|
||||||
| `rotX` | `static_building_location.rotX` | X rotation |
|
|
||||||
| `rotY` | `static_building_location.rotY` | Y rotation |
|
|
||||||
| `rotZ` | `static_building_location.rotZ` | Z rotation |
|
|
||||||
-77
@@ -1,77 +0,0 @@
|
|||||||
# dbCSSessionHandler Documentation
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
This document describes the database relationships and interactions for the `dbCSSessionHandler` class. The session handler manages user login sessions, tracking account activity, character associations, and session-based authentication.
|
|
||||||
|
|
||||||
## Handler Class
|
|
||||||
**File:** `src/engine/db/handlers/dbCSSessionHandler.java`
|
|
||||||
**Class:** `dbCSSessionHandler`
|
|
||||||
**Extends:** `dbHandlerBase`
|
|
||||||
|
|
||||||
## Database Tables
|
|
||||||
|
|
||||||
### Main Session Table
|
|
||||||
- **Table Name:** `dyn_cs_session`
|
|
||||||
- **Description:** Stores information about active and inactive user sessions, including account associations and character details
|
|
||||||
- **Columns:**
|
|
||||||
- UID (Primary Key)
|
|
||||||
- accountID
|
|
||||||
- characterID
|
|
||||||
- sessionKey
|
|
||||||
- lastLoginDate
|
|
||||||
- lastLogoutDate
|
|
||||||
|
|
||||||
### Related Tables
|
|
||||||
|
|
||||||
| Table Name | Description | Relationship |
|
|
||||||
|------------|-------------|--------------|
|
|
||||||
| `obj_account` | Accounts associated with sessions | accountID → obj_account.UID |
|
|
||||||
| `obj_character` | Characters associated with sessions | characterID → obj_character.UID |
|
|
||||||
|
|
||||||
## Key Queries
|
|
||||||
|
|
||||||
### Create Session
|
|
||||||
```sql
|
|
||||||
INSERT INTO `dyn_cs_session` (`accountID`, `characterID`, `sessionKey`, `lastLoginDate`) VALUES(?,?,?,?)
|
|
||||||
```
|
|
||||||
**File:** `dbCSSessionHandler.java`, Line ~35
|
|
||||||
|
|
||||||
### Load Session by Account
|
|
||||||
```sql
|
|
||||||
SELECT * FROM `dyn_cs_session` WHERE `accountID` = ?
|
|
||||||
```
|
|
||||||
**File:** `dbCSSessionHandler.java`, Line ~50
|
|
||||||
|
|
||||||
### Load Session by Character
|
|
||||||
```sql
|
|
||||||
SELECT * FROM `dyn_cs_session` WHERE `characterID` = ?
|
|
||||||
```
|
|
||||||
**File:** `dbCSSessionHandler.java`, Line ~65
|
|
||||||
|
|
||||||
### Update Session Last Login
|
|
||||||
```sql
|
|
||||||
UPDATE `dyn_cs_session` SET `lastLoginDate`=? WHERE `UID`=?
|
|
||||||
```
|
|
||||||
**File:** `dbCSSessionHandler.java`, Line ~80
|
|
||||||
|
|
||||||
### Update Session Last Logout
|
|
||||||
```sql
|
|
||||||
UPDATE `dyn_cs_session` SET `lastLogoutDate`=? WHERE `UID`=?
|
|
||||||
```
|
|
||||||
**File:** `dbCSSessionHandler.java`, Line ~95
|
|
||||||
|
|
||||||
## Relationships
|
|
||||||
|
|
||||||
1. **Session to Account:** Many-to-one relationship via accountID field referencing obj_account.UID
|
|
||||||
2. **Session to Character:** Many-to-one relationship via characterID field referencing obj_character.UID
|
|
||||||
3. **Session to Login History:** One-to-many relationship via session UID (via dyn_login_history table)
|
|
||||||
|
|
||||||
## Java Field to Database Column Mappings
|
|
||||||
|
|
||||||
| Java Field | Database Column | Notes |
|
|
||||||
|------------|-----------------|-------|
|
|
||||||
| `accountID` | `dyn_cs_session.accountID` | Account UID associated with this session |
|
|
||||||
| `characterID` | `dyn_cs_session.characterID` | Character UID associated with this session |
|
|
||||||
| `sessionKey` | `dyn_cs_session.sessionKey` | Session identifier for authentication |
|
|
||||||
| `lastLoginDate` | `dyn_cs_session.lastLoginDate` | Timestamp of last login |
|
|
||||||
| `lastLogoutDate` | `dyn_cs_session.lastLogoutDate` | Timestamp of last logout |
|
|
||||||
-71
@@ -1,71 +0,0 @@
|
|||||||
# Character Power Handler Documentation
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
This document describes the database relationships and interactions for the `dbCharacterPowerHandler` class. This handler manages character power data, including adding, deleting, retrieving, and updating character powers.
|
|
||||||
|
|
||||||
## Handler Class
|
|
||||||
**File:** `src/engine/db/handlers/dbCharacterPowerHandler.java`
|
|
||||||
**Class:** `dbCharacterPowerHandler`
|
|
||||||
**Extends:** `dbHandlerBase`
|
|
||||||
|
|
||||||
## Database Tables
|
|
||||||
|
|
||||||
### Main Table
|
|
||||||
- **Table Name:** `dyn_character_power`
|
|
||||||
- **Description:** Stores dynamic power information for characters including power token, character ID, and training levels
|
|
||||||
- **Columns:**
|
|
||||||
- UID (Primary Key)
|
|
||||||
- CharacterID
|
|
||||||
- powersBaseToken
|
|
||||||
- trains
|
|
||||||
|
|
||||||
## Key Queries
|
|
||||||
|
|
||||||
### Add Character Power
|
|
||||||
```sql
|
|
||||||
INSERT INTO `dyn_character_power` (`CharacterID`, `powersBaseToken`, `trains`) VALUES (?, ?, ?);
|
|
||||||
```
|
|
||||||
**File:** `dbCharacterPowerHandler.java`, Line ~20
|
|
||||||
|
|
||||||
### Delete Character Power
|
|
||||||
```sql
|
|
||||||
DELETE FROM `dyn_character_power` WHERE `UID` = ?
|
|
||||||
```
|
|
||||||
**File:** `dbCharacterPowerHandler.java`, Line ~41
|
|
||||||
|
|
||||||
### Get Character Power by ID
|
|
||||||
```sql
|
|
||||||
SELECT * FROM `dyn_character_power` WHERE `UID` = ?
|
|
||||||
```
|
|
||||||
**File:** `dbCharacterPowerHandler.java`, Line ~57
|
|
||||||
|
|
||||||
### Get All Powers for Character
|
|
||||||
```sql
|
|
||||||
SELECT * FROM `dyn_character_power` WHERE CharacterID = ?
|
|
||||||
```
|
|
||||||
**File:** `dbCharacterPowerHandler.java`, Line ~76
|
|
||||||
|
|
||||||
### Update Trains
|
|
||||||
```sql
|
|
||||||
UPDATE `dyn_character_power` SET `trains`=? WHERE `UID`=?
|
|
||||||
```
|
|
||||||
**File:** `dbCharacterPowerHandler.java`, Line ~98
|
|
||||||
|
|
||||||
### Update Database
|
|
||||||
```sql
|
|
||||||
UPDATE `dyn_character_power` SET `PowersBaseToken`=?, `CharacterID`=?, `trains`=? WHERE `UID`=?
|
|
||||||
```
|
|
||||||
**File:** `dbCharacterPowerHandler.java`, Line ~115
|
|
||||||
|
|
||||||
## Relationships
|
|
||||||
|
|
||||||
1. **Character Power to Character:** Many-to-one relationship via `CharacterID` field referencing `obj_character.UID`
|
|
||||||
2. **Character Power to Power Base:** Many-to-one relationship via `powersBaseToken` field referencing `static_powers_base.token`
|
|
||||||
|
|
||||||
## Java Field to Database Column Mappings
|
|
||||||
|
|
||||||
| Java Field | Database Column | Notes |
|
|
||||||
|------------|-----------------|-------|
|
|
||||||
| `characterID` | `dyn_character_power.CharacterID` | Reference to character |
|
|
||||||
| `powerToken` | `dyn_character_power.powersBaseToken` | Reference to power base |
|
|
||||||
| `trains` | `dyn_character_power.trains` | Training level |
|
|
||||||
-63
@@ -1,63 +0,0 @@
|
|||||||
# Character Rune Handler Documentation
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
This document describes the database relationships and interactions for the `dbCharacterRuneHandler` class. This handler manages character rune data, including adding, retrieving, deleting, and updating character runes.
|
|
||||||
|
|
||||||
## Handler Class
|
|
||||||
**File:** `src/engine/db/handlers/dbCharacterRuneHandler.java`
|
|
||||||
**Class:** `dbCharacterRuneHandler`
|
|
||||||
**Extends:** `dbHandlerBase`
|
|
||||||
|
|
||||||
## Database Tables
|
|
||||||
|
|
||||||
### Main Table
|
|
||||||
- **Table Name:** `dyn_character_rune`
|
|
||||||
- **Description:** Stores dynamic rune information for characters including character ID and rune base ID
|
|
||||||
- **Columns:**
|
|
||||||
- UID (Primary Key)
|
|
||||||
- CharacterID
|
|
||||||
- RuneBaseID
|
|
||||||
|
|
||||||
## Key Queries
|
|
||||||
|
|
||||||
### Add Character Rune
|
|
||||||
```sql
|
|
||||||
INSERT INTO `dyn_character_rune` (`CharacterID`, `RuneBaseID`) VALUES (?, ?);
|
|
||||||
```
|
|
||||||
**File:** `dbCharacterRuneHandler.java`, Line ~20
|
|
||||||
|
|
||||||
### Get Character Rune by ID
|
|
||||||
```sql
|
|
||||||
SELECT * FROM `dyn_character_rune` WHERE `UID`=?
|
|
||||||
```
|
|
||||||
**File:** `dbCharacterRuneHandler.java`, Line ~43
|
|
||||||
|
|
||||||
### Delete Character Rune
|
|
||||||
```sql
|
|
||||||
DELETE FROM `dyn_character_rune` WHERE `UID`=?;
|
|
||||||
```
|
|
||||||
**File:** `dbCharacterRuneHandler.java`, Line ~61
|
|
||||||
|
|
||||||
### Get All Runes for Character
|
|
||||||
```sql
|
|
||||||
SELECT * FROM `dyn_character_rune` WHERE `CharacterID` = ?
|
|
||||||
```
|
|
||||||
**File:** `dbCharacterRuneHandler.java`, Line ~74
|
|
||||||
|
|
||||||
### Update Database
|
|
||||||
```sql
|
|
||||||
UPDATE `dyn_character_rune` SET `CharacterID`=?, `RuneBaseID`=? WHERE `UID` = ?
|
|
||||||
```
|
|
||||||
**File:** `dbCharacterRuneHandler.java`, Line ~91
|
|
||||||
|
|
||||||
## Relationships
|
|
||||||
|
|
||||||
1. **Character Rune to Character:** Many-to-one relationship via `CharacterID` field referencing `obj_character.UID`
|
|
||||||
2. **Character Rune to Rune Base:** Many-to-one relationship via `RuneBaseID` field referencing `static_rune_base.ID`
|
|
||||||
|
|
||||||
## Java Field to Database Column Mappings
|
|
||||||
|
|
||||||
| Java Field | Database Column | Notes |
|
|
||||||
|------------|-----------------|-------|
|
|
||||||
| `playerID` | `dyn_character_rune.CharacterID` | Reference to character |
|
|
||||||
| `runeBaseID` | `dyn_character_rune.RuneBaseID` | Reference to rune base |
|
|
||||||
-71
@@ -1,71 +0,0 @@
|
|||||||
# Character Skill Handler Documentation
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
This document describes the database relationships and interactions for the `dbCharacterSkillHandler` class. This handler manages character skill data, including adding, deleting, retrieving, and updating character skills.
|
|
||||||
|
|
||||||
## Handler Class
|
|
||||||
**File:** `src/engine/db/handlers/dbCharacterSkillHandler.java`
|
|
||||||
**Class:** `dbCharacterSkillHandler`
|
|
||||||
**Extends:** `dbHandlerBase`
|
|
||||||
|
|
||||||
## Database Tables
|
|
||||||
|
|
||||||
### Main Table
|
|
||||||
- **Table Name:** `dyn_character_skill`
|
|
||||||
- **Description:** Stores dynamic skill information for characters including skill base ID, character ID, and training levels
|
|
||||||
- **Columns:**
|
|
||||||
- UID (Primary Key)
|
|
||||||
- CharacterID
|
|
||||||
- skillsBaseID
|
|
||||||
- trains
|
|
||||||
|
|
||||||
## Key Queries
|
|
||||||
|
|
||||||
### Add Skill
|
|
||||||
```sql
|
|
||||||
INSERT INTO `dyn_character_skill` (`CharacterID`, `skillsBaseID`, `trains`) VALUES (?, ?, ?);
|
|
||||||
```
|
|
||||||
**File:** `dbCharacterSkillHandler.java`, Line ~20
|
|
||||||
|
|
||||||
### Delete Skill
|
|
||||||
```sql
|
|
||||||
DELETE FROM `dyn_character_skill` WHERE `UID` = ?
|
|
||||||
```
|
|
||||||
**File:** `dbCharacterSkillHandler.java`, Line ~43
|
|
||||||
|
|
||||||
### Get Skill by ID
|
|
||||||
```sql
|
|
||||||
SELECT * FROM `dyn_character_skill` WHERE `UID` = ?
|
|
||||||
```
|
|
||||||
**File:** `dbCharacterSkillHandler.java`, Line ~59
|
|
||||||
|
|
||||||
### Get All Skills for Character
|
|
||||||
```sql
|
|
||||||
SELECT * FROM `dyn_character_skill` WHERE `CharacterID` = ?
|
|
||||||
```
|
|
||||||
**File:** `dbCharacterSkillHandler.java`, Line ~80
|
|
||||||
|
|
||||||
### Update Trains
|
|
||||||
```sql
|
|
||||||
UPDATE `dyn_character_skill` SET `trains`=? WHERE `UID` = ?
|
|
||||||
```
|
|
||||||
**File:** `dbCharacterSkillHandler.java`, Line ~104
|
|
||||||
|
|
||||||
### Update Database
|
|
||||||
```sql
|
|
||||||
UPDATE `dyn_character_skill` SET `skillsBaseID`=?, `CharacterID`=?, `trains`=? WHERE `UID`=?
|
|
||||||
```
|
|
||||||
**File:** `dbCharacterSkillHandler.java`, Line ~123
|
|
||||||
|
|
||||||
## Relationships
|
|
||||||
|
|
||||||
1. **Character Skill to Character:** Many-to-one relationship via `CharacterID` field referencing `obj_character.UID`
|
|
||||||
2. **Character Skill to Skill Base:** Many-to-one relationship via `skillsBaseID` field referencing `static_skills_base.ID`
|
|
||||||
|
|
||||||
## Java Field to Database Column Mappings
|
|
||||||
|
|
||||||
| Java Field | Database Column | Notes |
|
|
||||||
|------------|-----------------|-------|
|
|
||||||
| `characterID` | `dyn_character_skill.CharacterID` | Reference to character |
|
|
||||||
| `skillBaseID` | `dyn_character_skill.skillsBaseID` | Reference to skill base |
|
|
||||||
| `trains` | `dyn_character_skill.trains` | Training level |
|
|
||||||
-97
@@ -1,97 +0,0 @@
|
|||||||
# City Handler Documentation
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
This document describes the database relationships and interactions for the `dbCityHandler` class. The city handler manages city-related data including city creation, zone information, and building structures within the Magicbane emulator system.
|
|
||||||
|
|
||||||
## Handler Class
|
|
||||||
**File:** `src/engine/db/handlers/dbCityHandler.java`
|
|
||||||
**Class:** `dbCityHandler`
|
|
||||||
**Extends:** `dbHandlerBase`
|
|
||||||
|
|
||||||
## Database Tables
|
|
||||||
|
|
||||||
### Main City Table
|
|
||||||
- **Table Name:** `obj_city`
|
|
||||||
- **Description:** Core city information including name, motto, and metadata
|
|
||||||
- **Columns:**
|
|
||||||
- UID (Primary Key)
|
|
||||||
- name
|
|
||||||
- motto
|
|
||||||
- treeOfLifeUUID
|
|
||||||
- established
|
|
||||||
- realmTaxDate
|
|
||||||
- population
|
|
||||||
- siegesWithstood
|
|
||||||
- isNpc
|
|
||||||
- isCapital
|
|
||||||
- isNoobIsle
|
|
||||||
- bindX
|
|
||||||
- bindZ
|
|
||||||
- bindRadius
|
|
||||||
- radiusType
|
|
||||||
- forceRename
|
|
||||||
- open
|
|
||||||
- hash
|
|
||||||
|
|
||||||
### Related Tables
|
|
||||||
|
|
||||||
| Table Name | Description | Relationship |
|
|
||||||
|------------|-------------|--------------|
|
|
||||||
| `obj_zone` | Zone information within cities | CityID → obj_city.UID |
|
|
||||||
| `obj_building` | Building information within zones | ZoneID → obj_zone.UID |
|
|
||||||
| `object` | Base object table that links to obj_city | UID → obj_city.UID |
|
|
||||||
|
|
||||||
## Key Queries
|
|
||||||
|
|
||||||
### Load City Data
|
|
||||||
```sql
|
|
||||||
SELECT * FROM `object` o
|
|
||||||
JOIN `obj_city` c ON o.`UID` = c.`UID`
|
|
||||||
WHERE o.`type` = 'city' AND o.`parent` = ?
|
|
||||||
```
|
|
||||||
**File:** `dbCityHandler.java`, Line ~45
|
|
||||||
|
|
||||||
### Load Zones for City
|
|
||||||
```sql
|
|
||||||
SELECT * FROM `object` o
|
|
||||||
JOIN `obj_zone` z ON o.`UID` = z.`UID`
|
|
||||||
WHERE o.`type` = 'zone' AND o.`parent` = ?
|
|
||||||
```
|
|
||||||
**File:** `dbCityHandler.java`, Line ~60
|
|
||||||
|
|
||||||
### Load Buildings for Zone
|
|
||||||
```sql
|
|
||||||
SELECT * FROM `object` o
|
|
||||||
JOIN `obj_building` b ON o.`UID` = b.`UID`
|
|
||||||
WHERE o.`type` = 'building' AND o.`parent` = ?
|
|
||||||
```
|
|
||||||
**File:** `dbCityHandler.java`, Line ~75
|
|
||||||
|
|
||||||
### Create New City
|
|
||||||
```sql
|
|
||||||
CALL `city_CREATE`(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
||||||
```
|
|
||||||
**File:** `dbCityHandler.java`, Line ~90
|
|
||||||
|
|
||||||
## Relationships
|
|
||||||
|
|
||||||
1. **City to Object:** One-to-one (City is a type of object)
|
|
||||||
2. **Zone to City:** Many-to-one (Multiple zones per city)
|
|
||||||
3. **Building to Zone:** Many-to-one (Multiple buildings per zone)
|
|
||||||
4. **City to Zones:** One-to-many (via `obj_zone.parent` field)
|
|
||||||
5. **Zone to Buildings:** One-to-many (via `obj_building.parent` field)
|
|
||||||
|
|
||||||
## Java Field to Database Column Mappings
|
|
||||||
|
|
||||||
| Java Field | Database Column | Notes |
|
|
||||||
|------------|-----------------|-------|
|
|
||||||
| `name` | `obj_city.name` | City name |
|
|
||||||
| `motto` | `obj_city.motto` | City motto |
|
|
||||||
| `established` | `obj_city.established` | Date established |
|
|
||||||
| `population` | `obj_city.population` | Population count |
|
|
||||||
| `isNpc` | `obj_city.isNpc` | NPC flag |
|
|
||||||
| `bindX` | `obj_city.bindX` | X binding coordinate |
|
|
||||||
| `bindZ` | `obj_city.bindZ` | Z binding coordinate |
|
|
||||||
| `bindRadius` | `obj_city.bindRadius` | Binding radius |
|
|
||||||
| `isCapital` | `obj_city.isCapital` | Capital city flag |
|
|
||||||
| `isNoobIsle` | `obj_city.isNoobIsle` | Noob island flag |
|
|
||||||
-82
@@ -1,82 +0,0 @@
|
|||||||
# Contract Handler Documentation
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
This document describes the database relationships and interactions for the `dbContractHandler` class. This handler manages contract data for NPCs, including loading contracts, their inventory sets, and sell lists.
|
|
||||||
|
|
||||||
## Handler Class
|
|
||||||
**File:** `src/engine/db/handlers/dbContractHandler.java`
|
|
||||||
**Class:** `dbContractHandler`
|
|
||||||
**Extends:** `dbHandlerBase`
|
|
||||||
|
|
||||||
## Database Tables
|
|
||||||
|
|
||||||
### Main Table
|
|
||||||
- **Table Name:** `static_npc_contract`
|
|
||||||
- **Description:** Stores static contract information for NPCs including contract ID, name, mob base ID, class ID, vendor dialog, and icon ID
|
|
||||||
- **Columns:**
|
|
||||||
- ID (Primary Key)
|
|
||||||
- contractID
|
|
||||||
- name
|
|
||||||
- mobbaseID
|
|
||||||
- classID
|
|
||||||
- vendorDialog
|
|
||||||
- iconID
|
|
||||||
- allowedBuildingTypeID
|
|
||||||
|
|
||||||
### Related Tables
|
|
||||||
|
|
||||||
| Table Name | Description | Relationship |
|
|
||||||
|------------|-------------|--------------|
|
|
||||||
| `static_npc_inventoryset` | Stores inventory items for contracts | inventorySet → static_npc_contract.inventorySet |
|
|
||||||
| `static_npc_contract_selltype` | Stores sell type information for contracts | contractID → static_npc_contract.ID |
|
|
||||||
|
|
||||||
## Key Queries
|
|
||||||
|
|
||||||
### Get Contract by ID
|
|
||||||
```sql
|
|
||||||
SELECT * FROM `static_npc_contract` WHERE `ID` = ?
|
|
||||||
```
|
|
||||||
**File:** `dbContractHandler.java`, Line ~17
|
|
||||||
|
|
||||||
### Load Contract Inventory
|
|
||||||
```sql
|
|
||||||
SELECT * FROM `static_npc_inventoryset` WHERE `inventorySet` = ?;
|
|
||||||
```
|
|
||||||
**File:** `dbContractHandler.java`, Line ~43
|
|
||||||
|
|
||||||
### Load Sell List for Contract
|
|
||||||
```sql
|
|
||||||
SELECT * FROM `static_npc_contract_selltype` WHERE `contractID` = ?;
|
|
||||||
```
|
|
||||||
**File:** `dbContractHandler.java`, Line ~65
|
|
||||||
|
|
||||||
### Update Allowed Buildings
|
|
||||||
```sql
|
|
||||||
UPDATE `static_npc_contract` SET `allowedBuildingTypeID`=? WHERE `contractID`=?
|
|
||||||
```
|
|
||||||
**File:** `dbContractHandler.java`, Line ~87
|
|
||||||
|
|
||||||
### Update Database
|
|
||||||
```sql
|
|
||||||
UPDATE `static_npc_contract` SET `contractID`=?, `name`=?, `mobbaseID`=?, `classID`=?, vendorDialog=?, iconID=?, allowedBuildingTypeID=? WHERE `ID`=?
|
|
||||||
```
|
|
||||||
**File:** `dbContractHandler.java`, Line ~100
|
|
||||||
|
|
||||||
## Relationships
|
|
||||||
|
|
||||||
1. **Contract to Mob Base:** Many-to-one relationship via `mobbaseID` field referencing `obj_mobbase.ID`
|
|
||||||
2. **Contract to Vendor Dialog:** Many-to-one relationship via `vendorDialog` field referencing `obj_vendor_dialog.UID`
|
|
||||||
3. **Contract to Inventory Set:** One-to-many relationship via `inventorySet` field
|
|
||||||
4. **Contract to Sell Types:** One-to-many relationship via `contractID` field
|
|
||||||
|
|
||||||
## Java Field to Database Column Mappings
|
|
||||||
|
|
||||||
| Java Field | Database Column | Notes |
|
|
||||||
|------------|-----------------|-------|
|
|
||||||
| `contractID` | `static_npc_contract.contractID` | Contract identifier |
|
|
||||||
| `name` | `static_npc_contract.name` | Contract name |
|
|
||||||
| `mobbaseID` | `static_npc_contract.mobbaseID` | Reference to mob base |
|
|
||||||
| `classID` | `static_npc_contract.classID` | Class identifier |
|
|
||||||
| `vendorDialogID` | `static_npc_contract.vendorDialog` | Reference to vendor dialog |
|
|
||||||
| `iconID` | `static_npc_contract.iconID` | Icon identifier |
|
|
||||||
| `allowedBuildings` | `static_npc_contract.allowedBuildingTypeID` | Allowed building types |
|
|
||||||
-57
@@ -1,57 +0,0 @@
|
|||||||
# dbEffectsBaseHandler Documentation
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
This document describes the database relationships and interactions for the `dbEffectsBaseHandler` class. This handler manages static data about power effects in Magicbane, including their base properties and modifiers.
|
|
||||||
|
|
||||||
## Handler Class
|
|
||||||
**File:** `src/engine/db/handlers/dbEffectsBaseHandler.java`
|
|
||||||
**Class:** `dbEffectsBaseHandler`
|
|
||||||
**Extends:** `dbHandlerBase`
|
|
||||||
|
|
||||||
## Database Tables
|
|
||||||
|
|
||||||
### Main Effect Base Table
|
|
||||||
- **Table Name:** `static_power_effectbase`
|
|
||||||
- **Description:** Core table containing base information about power effects, including names and types
|
|
||||||
- **Columns:**
|
|
||||||
- IDString (Primary Key)
|
|
||||||
- name
|
|
||||||
- description
|
|
||||||
- effectType
|
|
||||||
|
|
||||||
### Modifier Tables
|
|
||||||
|
|
||||||
| Table Name | Description | Relationship |
|
|
||||||
|------------|-------------|--------------|
|
|
||||||
| `static_power_effectmod` | Stores modifier properties for effects | EffectBaseID → static_power_effectbase.IDString |
|
|
||||||
|
|
||||||
## Key Queries
|
|
||||||
|
|
||||||
### Get All Effects Base
|
|
||||||
```sql
|
|
||||||
SELECT * FROM static_power_effectbase ORDER BY `IDString` DESC
|
|
||||||
```
|
|
||||||
**File:** `dbEffectsBaseHandler.java`, Line ~25
|
|
||||||
|
|
||||||
### Get Effect Modifiers
|
|
||||||
```sql
|
|
||||||
SELECT * FROM static_power_effectmod WHERE `effectBaseID` = ?
|
|
||||||
```
|
|
||||||
**File:** `dbEffectsBaseHandler.java`, Line ~40
|
|
||||||
|
|
||||||
## Relationships
|
|
||||||
|
|
||||||
1. **Effect Base to Modifiers:** One-to-many relationship via effectBaseID field in static_power_effectmod referencing static_power_effectbase.IDString
|
|
||||||
2. **Effect Base to Resources Cost:** Many-to-many relationship through static_power_effectcost table
|
|
||||||
|
|
||||||
## Java Field to Database Column Mappings
|
|
||||||
|
|
||||||
| Java Field | Database Column | Notes |
|
|
||||||
|------------|-----------------|-------|
|
|
||||||
| `IDString` | `static_power_effectbase.IDString` | Unique identifier for the effect |
|
|
||||||
| `name` | `static_power_effectbase.name` | Display name of the effect |
|
|
||||||
| `description` | `static_power_effectbase.description` | Description of the effect |
|
|
||||||
| `effectType` | `static_power_effectbase.effectType` | Type of effect |
|
|
||||||
| `modType` | `static_power_effectmod.modType` | Modifier type for effect modifiers |
|
|
||||||
| `modValue` | `static_power_effectmod.modValue` | Value of the modifier |
|
|
||||||
| `other fields...` | Various columns | Other properties related to effects and modifiers |
|
|
||||||
-40
@@ -1,40 +0,0 @@
|
|||||||
# dbEffectsResourceCostHandler Documentation
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
This document describes the database relationships and interactions for the `dbEffectsResourceCostHandler` class. This handler manages the resource costs associated with power effects, including mana, health, and other resource types required to use specific powers.
|
|
||||||
|
|
||||||
## Handler Class
|
|
||||||
**File:** `src/engine/db/handlers/dbEffectsResourceCostHandler.java`
|
|
||||||
**Class:** `dbEffectsResourceCostHandler`
|
|
||||||
**Extends:** `dbHandlerBase`
|
|
||||||
|
|
||||||
## Database Tables
|
|
||||||
|
|
||||||
### Main Resource Cost Table
|
|
||||||
- **Table Name:** `static_power_effectcost`
|
|
||||||
- **Description:** Stores resource cost information for power effects, defining what resources are required to use specific effects
|
|
||||||
- **Columns:**
|
|
||||||
- IDString (Primary Key)
|
|
||||||
- resourceType
|
|
||||||
- resourceAmount
|
|
||||||
|
|
||||||
## Key Queries
|
|
||||||
|
|
||||||
### Get Resource Cost by Effect ID
|
|
||||||
```sql
|
|
||||||
SELECT * FROM static_power_effectcost WHERE `IDString` = ?
|
|
||||||
```
|
|
||||||
**File:** `dbEffectsResourceCostHandler.java`, Line ~25
|
|
||||||
|
|
||||||
## Relationships
|
|
||||||
|
|
||||||
1. **Effect Cost to Effect Base:** Many-to-one relationship via IDString field referencing static_power_effectbase.IDString
|
|
||||||
|
|
||||||
## Java Field to Database Column Mappings
|
|
||||||
|
|
||||||
| Java Field | Database Column | Notes |
|
|
||||||
|------------|-----------------|-------|
|
|
||||||
| `idString` | `static_power_effectcost.IDString` | Unique identifier linking to effect base |
|
|
||||||
| `resourceType` | `static_power_effectcost.resourceType` | Type of resource required (mana, health, etc.) |
|
|
||||||
| `resourceAmount` | `static_power_effectcost.resourceAmount` | Amount of resource required |
|
|
||||||
| `other fields...` | Various columns | Other properties related to resource costs |
|
|
||||||
-46
@@ -1,46 +0,0 @@
|
|||||||
# dbEnchantmentHandler Documentation
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
This document describes the database relationships and interactions for the `dbEnchantmentHandler` class. This handler manages item enchantments, which are special properties applied to items that modify their attributes or provide additional abilities.
|
|
||||||
|
|
||||||
## Handler Class
|
|
||||||
**File:** `src/engine/db/handlers/dbEnchantmentHandler.java`
|
|
||||||
**Class:** `dbEnchantmentHandler`
|
|
||||||
**Extends:** `dbHandlerBase`
|
|
||||||
|
|
||||||
## Database Tables
|
|
||||||
|
|
||||||
### Main Enchantment Table
|
|
||||||
- **Table Name:** `dyn_item_enchantment`
|
|
||||||
- **Description:** Stores enchantment information for items, including the type of power action and rank level
|
|
||||||
- **Columns:**
|
|
||||||
- itemID (Primary Key)
|
|
||||||
- powerAction
|
|
||||||
- rank
|
|
||||||
|
|
||||||
## Key Queries
|
|
||||||
|
|
||||||
### Get Enchantments by Item ID
|
|
||||||
```sql
|
|
||||||
SELECT * FROM dyn_item_enchantment WHERE `itemID` = ?
|
|
||||||
```
|
|
||||||
**File:** `dbEnchantmentHandler.java`, Line ~25
|
|
||||||
|
|
||||||
### Save Enchantment
|
|
||||||
```sql
|
|
||||||
INSERT INTO `dyn_item_enchantment` (`itemID`, `powerAction`, `rank`) VALUES(?,?,?)
|
|
||||||
```
|
|
||||||
**File:** `dbEnchantmentHandler.java`, Line ~40
|
|
||||||
|
|
||||||
## Relationships
|
|
||||||
|
|
||||||
1. **Enchantment to Item:** Many-to-one relationship via itemID field referencing obj_item.UID
|
|
||||||
|
|
||||||
## Java Field to Database Column Mappings
|
|
||||||
|
|
||||||
| Java Field | Database Column | Notes |
|
|
||||||
|------------|-----------------|-------|
|
|
||||||
| `itemID` | `dyn_item_enchantment.itemID` | Unique identifier for the item |
|
|
||||||
| `powerAction` | `dyn_item_enchantment.powerAction` | The power action associated with the enchantment |
|
|
||||||
| `rank` | `dyn_item_enchantment.rank` | The rank or strength level of the enchantment |
|
|
||||||
| `other fields...` | Various columns | Other properties related to item enchantments |
|
|
||||||
-118
@@ -1,118 +0,0 @@
|
|||||||
# Guild Handler Documentation
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
This document describes the database relationships and interactions for the `dbGuildHandler` class. The guild system in Magicbane is complex, involving multiple related tables for managing guilds, their history, alliances, enemies, and member management.
|
|
||||||
|
|
||||||
## Handler Class
|
|
||||||
**File:** `src/engine/db/handlers/dbGuildHandler.java`
|
|
||||||
**Class:** `dbGuildHandler`
|
|
||||||
**Extends:** `dbHandlerBase`
|
|
||||||
|
|
||||||
## Database Tables
|
|
||||||
|
|
||||||
### Main Guild Table
|
|
||||||
- **Table Name:** `obj_guild`
|
|
||||||
- **Description:** Core guild information including name, leader, tags, charter, and ownership details
|
|
||||||
- **Columns:**
|
|
||||||
- UID (Primary Key)
|
|
||||||
- name
|
|
||||||
- leaderUID
|
|
||||||
- backgroundColor01
|
|
||||||
- backgroundColor02
|
|
||||||
- symbolColor
|
|
||||||
- backgroundDesign
|
|
||||||
- symbol
|
|
||||||
- charter
|
|
||||||
- leadershipType
|
|
||||||
- motto
|
|
||||||
- ownedCity
|
|
||||||
|
|
||||||
### Related Tables
|
|
||||||
|
|
||||||
| Table Name | Description | Relationship |
|
|
||||||
|------------|-------------|--------------|
|
|
||||||
| `dyn_character_guildhistory` | Tracks character's guild membership history | CharacterID → obj_character.UID, GuildID → obj_guild.UID |
|
|
||||||
| `dyn_guild_allianceenemylist` | Stores alliance/enemy relationships between guilds | GuildID → obj_guild.UID, OtherGuildID → obj_guild.UID |
|
|
||||||
| `dyn_guild_banishlist` | Lists characters banned from guilds | GuildID → obj_guild.UID, CharacterID → obj_character.UID |
|
|
||||||
| `dyn_guild_characterkoslist` | Stores characters marked as KOS (Kill on Sight) for guilds | GuildID → obj_guild.UID, KOSCharacterID → obj_character.UID |
|
|
||||||
| `dyn_guild_guildkoslist` | Stores guilds marked as KOS for other guilds | GuildID → obj_guild.UID, KOSGuildID → obj_guild.UID |
|
|
||||||
| `object` | Base object table that links to obj_guild | UID → obj_guild.UID |
|
|
||||||
|
|
||||||
## Key Queries
|
|
||||||
|
|
||||||
### Get Guild by ID
|
|
||||||
```sql
|
|
||||||
SELECT `obj_guild`.*, `object`.`parent`
|
|
||||||
FROM `obj_guild`
|
|
||||||
INNER JOIN `object` ON `object`.`UID` = `obj_guild`.`UID`
|
|
||||||
WHERE `object`.`UID`=?
|
|
||||||
```
|
|
||||||
**File:** `dbGuildHandler.java`, Line ~450
|
|
||||||
|
|
||||||
### Get Guild History of Player
|
|
||||||
```sql
|
|
||||||
SELECT g.* FROM `obj_guild` g, `dyn_character_guildhistory` l
|
|
||||||
WHERE g.`UID` = l.`GuildID` && l.`CharacterID` = ?
|
|
||||||
```
|
|
||||||
**File:** `dbGuildHandler.java`, Line ~200
|
|
||||||
|
|
||||||
### Get Guild Allies
|
|
||||||
```sql
|
|
||||||
SELECT g.* FROM `obj_guild` g, `dyn_guild_allianceenemylist` l
|
|
||||||
WHERE l.isAlliance = 1 && l.OtherGuildID = g.UID && l.GuildID=?
|
|
||||||
```
|
|
||||||
**File:** `dbGuildHandler.java`, Line ~230
|
|
||||||
|
|
||||||
### Get Guild Enemies
|
|
||||||
```sql
|
|
||||||
SELECT g.* FROM `obj_guild` g, `dyn_guild_allianceenemylist` l
|
|
||||||
WHERE l.isAlliance = 0 && l.OtherGuildID = g.UID && l.GuildID=?
|
|
||||||
```
|
|
||||||
**File:** `dbGuildHandler.java`, Line ~253
|
|
||||||
|
|
||||||
### Get Guild KOS Characters
|
|
||||||
```sql
|
|
||||||
SELECT c.* FROM `obj_character` c, `dyn_guild_characterkoslist` l
|
|
||||||
WHERE c.`char_isActive` = 1 && l.`KOSCharacterID` = c.`UID` && l.`GuildID`=?
|
|
||||||
```
|
|
||||||
**File:** `dbGuildHandler.java`, Line ~273
|
|
||||||
|
|
||||||
### Get Guild KOS Guilds
|
|
||||||
```sql
|
|
||||||
SELECT g.* FROM `obj_guild` g, `dyn_guild_guildkoslist` l
|
|
||||||
WHERE l.KOSGuildID = g.UID && l.GuildID = ?
|
|
||||||
```
|
|
||||||
**File:** `dbGuildHandler.java`, Line ~295
|
|
||||||
|
|
||||||
### Save Guild (Stored Procedure)
|
|
||||||
```sql
|
|
||||||
CALL `guild_CREATE`(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
||||||
```
|
|
||||||
**File:** `dbGuildHandler.java`, Line ~483
|
|
||||||
|
|
||||||
## Relationships
|
|
||||||
|
|
||||||
1. **Guild to Character:** Many-to-many through `obj_character.guildUID` field
|
|
||||||
2. **Guild to Guild History:** One-to-many (via `dyn_character_guildhistory.GuildID`)
|
|
||||||
3. **Guild to Alliances/Enemies:** Many-to-many (via `dyn_guild_allianceenemylist`)
|
|
||||||
4. **Guild to Bans List:** One-to-many (via `dyn_guild_banishlist.GuildID`)
|
|
||||||
5. **Guild to KOS Characters:** One-to-many (via `dyn_guild_characterkoslist.GuildID`)
|
|
||||||
6. **Guild to KOS Guilds:** One-to-many (via `dyn_guild_guildkoslist.GuildID`)
|
|
||||||
7. **Guild to Sub-Guilds:** Parent-child relationship via `object.parent` field
|
|
||||||
|
|
||||||
|
|
||||||
## Java Field to Database Column Mappings
|
|
||||||
|
|
||||||
| Java Field | Database Column | Notes |
|
|
||||||
|------------|-----------------|-------|
|
|
||||||
| `name` | `obj_guild.name` | Guild name |
|
|
||||||
| `leaderUID` | `obj_guild.leaderUID` | Leader character UID |
|
|
||||||
| `backgroundColor01` | `obj_guild.backgroundColor01` | First background color |
|
|
||||||
| `backgroundColor02` | `obj_guild.backgroundColor02` | Second background color |
|
|
||||||
| `symbolColor` | `obj_guild.symbolColor` | Symbol color |
|
|
||||||
| `backgroundDesign` | `obj_guild.backgroundDesign` | Background design ID |
|
|
||||||
| `symbol` | `obj_guild.symbol` | Guild symbol ID |
|
|
||||||
| `charter` | `obj_guild.charter` | Charter information |
|
|
||||||
| `leadershipType` | `obj_guild.leadershipType` | Leadership type |
|
|
||||||
| `motto` | `obj_guild.motto` | Guild motto |
|
|
||||||
| `ownedCity` | `obj_guild.ownedCity` | Owned city ID |
|
|
||||||
-42
@@ -1,42 +0,0 @@
|
|||||||
# dbHeightMapHandler Documentation
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
This document describes the database relationships and interactions for the `dbHeightMapHandler` class. This handler manages height map data for zones, which is used to determine terrain elevation in the game world.
|
|
||||||
|
|
||||||
## Handler Class
|
|
||||||
**File:** `src/engine/db/handlers/dbHeightMapHandler.java`
|
|
||||||
**Class:** `dbHeightMapHandler`
|
|
||||||
**Extends:** `dbHandlerBase`
|
|
||||||
|
|
||||||
## Database Tables
|
|
||||||
|
|
||||||
### Main Height Map Table
|
|
||||||
- **Table Name:** `static_zone_heightmap`
|
|
||||||
- **Description:** Stores raw height map data for zones, representing terrain elevation information
|
|
||||||
- **Columns:**
|
|
||||||
- zoneLoadID (Primary Key)
|
|
||||||
- heightMapData
|
|
||||||
- width
|
|
||||||
- height
|
|
||||||
|
|
||||||
## Key Queries
|
|
||||||
|
|
||||||
### Get Height Map by Zone Load ID
|
|
||||||
```sql
|
|
||||||
SELECT * FROM static_zone_heightmap WHERE `zoneLoadID` = ?
|
|
||||||
```
|
|
||||||
**File:** `dbHeightMapHandler.java`, Line ~25
|
|
||||||
|
|
||||||
## Relationships
|
|
||||||
|
|
||||||
1. **Height Map to Zone:** Many-to-one relationship via zoneLoadID field referencing static_zone_load.zoneLoadID
|
|
||||||
|
|
||||||
## Java Field to Database Column Mappings
|
|
||||||
|
|
||||||
| Java Field | Database Column | Notes |
|
|
||||||
|------------|-----------------|-------|
|
|
||||||
| `zoneLoadID` | `static_zone_heightmap.zoneLoadID` | Unique identifier for the zone |
|
|
||||||
| `heightMapData` | `static_zone_heightmap.heightMapData` | Raw height map data for terrain elevation |
|
|
||||||
| `width` | `static_zone_size.width` | Width dimension of the zone |
|
|
||||||
| `height` | `static_zone_size.height` | Height dimension of the zone |
|
|
||||||
| `other fields...` | Various columns | Other properties related to height maps |
|
|
||||||
-71
@@ -1,71 +0,0 @@
|
|||||||
# dbItemBaseHandler Documentation
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
This document describes the database relationships and interactions for the `dbItemBaseHandler` class. This handler manages static item base data, including item properties, stats, and appearance information.
|
|
||||||
|
|
||||||
## Handler Class
|
|
||||||
**File:** `src/engine/db/handlers/dbItemBaseHandler.java`
|
|
||||||
**Class:** `dbItemBaseHandler`
|
|
||||||
**Extends:** `dbHandlerBase`
|
|
||||||
|
|
||||||
## Database Tables
|
|
||||||
|
|
||||||
### Main Item Base Table
|
|
||||||
- **Table Name:** `static_itembase`
|
|
||||||
- **Description:** Core table storing base properties of items, including names, descriptions, and appearance settings
|
|
||||||
- **Columns:**
|
|
||||||
- UID (Primary Key)
|
|
||||||
- name
|
|
||||||
- description
|
|
||||||
- itemClass
|
|
||||||
- icon
|
|
||||||
- mesh
|
|
||||||
|
|
||||||
### Related Tables
|
|
||||||
|
|
||||||
| Table Name | Description | Relationship |
|
|
||||||
|------------|-------------|--------------|
|
|
||||||
| `static_item_bakedinstat` | Stores stat information for items | ItemBaseID → static_itembase.UID |
|
|
||||||
| `static_itembase_animations` | Stores animation settings for items | ItemBaseID → static_itembase.UID |
|
|
||||||
|
|
||||||
## Key Queries
|
|
||||||
|
|
||||||
### Get Item Base by UID
|
|
||||||
```sql
|
|
||||||
SELECT * FROM static_itembase WHERE `UID` = ?
|
|
||||||
```
|
|
||||||
**File:** `dbItemBaseHandler.java`, Line ~25
|
|
||||||
|
|
||||||
### Get Item Stats
|
|
||||||
```sql
|
|
||||||
SELECT * FROM static_item_bakedinstat WHERE `itemBaseID` = ?
|
|
||||||
```
|
|
||||||
**File:** `dbItemBaseHandler.java`, Line ~40
|
|
||||||
|
|
||||||
### Get Item Animations
|
|
||||||
```sql
|
|
||||||
SELECT * FROM static_itembase_animations WHERE `itemBaseID` = ?
|
|
||||||
```
|
|
||||||
**File:** `dbItemBaseHandler.java`, Line ~55
|
|
||||||
|
|
||||||
## Relationships
|
|
||||||
|
|
||||||
1. **Item Base to Stats:** One-to-many relationship via itemBaseID field in static_item_bakedinstat referencing static_itembase.UID
|
|
||||||
2. **Item Base to Animations:** One-to-many relationship via itemBaseID field in static_itembase_animations referencing static_itembase.UID
|
|
||||||
|
|
||||||
## Java Field to Database Column Mappings
|
|
||||||
|
|
||||||
| Java Field | Database Column | Notes |
|
|
||||||
|------------|-----------------|-------|
|
|
||||||
| `UID` | `static_itembase.UID` | Unique identifier for the item |
|
|
||||||
| `name` | `static_itembase.name` | Name of the item |
|
|
||||||
| `description` | `static_itembase.description` | Description of the item |
|
|
||||||
| `itemClass` | `static_itembase.itemClass` | Class of the item |
|
|
||||||
| `icon` | `static_itembase.icon` | Icon identifier for the item |
|
|
||||||
| `mesh` | `static_itembase.mesh` | Mesh identifier for the item |
|
|
||||||
| `fromUse` | `static_item_bakedinstat.fromUse` | Flag indicating if stat is from use |
|
|
||||||
| `animation` | `static_itembase_animations.animation` | Animation associated with the item |
|
|
||||||
| `rightHand` | `static_itembase_animations.rightHand` | Flag indicating right hand animation |
|
|
||||||
| `runeSet` | `static_npc_runeSet.runeSet` | NPC rune set identifier |
|
|
||||||
| `runeBase` | `static_npc_runeSet.runeBase` | Base rune identifier |
|
|
||||||
| `other fields...` | Various columns | Other properties related to item base data |
|
|
||||||
-64
@@ -1,64 +0,0 @@
|
|||||||
# dbItemHandler Documentation
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
This document describes the database relationships and interactions for the `dbItemHandler` class. This handler manages item data in players' inventories, including item properties, location information, and ownership details.
|
|
||||||
|
|
||||||
## Handler Class
|
|
||||||
**File:** `src/engine/db/handlers/dbItemHandler.java`
|
|
||||||
**Class:** `dbItemHandler`
|
|
||||||
**Extends:** `dbHandlerBase`
|
|
||||||
|
|
||||||
## Database Tables
|
|
||||||
|
|
||||||
### Main Item Table
|
|
||||||
- **Table Name:** `obj_item`
|
|
||||||
- **Description:** Stores information about items in player inventories, including location, ownership, and attributes
|
|
||||||
- **Columns:**
|
|
||||||
- UID (Primary Key)
|
|
||||||
- ownerUID
|
|
||||||
- containerID
|
|
||||||
- itemBaseID
|
|
||||||
- item_container
|
|
||||||
- equipSlot
|
|
||||||
- flags
|
|
||||||
- customName
|
|
||||||
|
|
||||||
## Key Queries
|
|
||||||
|
|
||||||
### Get Item by UID
|
|
||||||
```sql
|
|
||||||
SELECT * FROM obj_item WHERE `UID` = ?
|
|
||||||
```
|
|
||||||
**File:** `dbItemHandler.java`, Line ~25
|
|
||||||
|
|
||||||
### Save Item
|
|
||||||
```sql
|
|
||||||
INSERT INTO `obj_item` (`ownerUID`, `containerID`, `itemBaseID`, `item_container`, `equipSlot`, `flags`, `customName`) VALUES(?,?,?,?,?,?,?)
|
|
||||||
```
|
|
||||||
**File:** `dbItemHandler.java`, Line ~40
|
|
||||||
|
|
||||||
### Get Items by Owner
|
|
||||||
```sql
|
|
||||||
SELECT * FROM obj_item WHERE `ownerUID` = ?
|
|
||||||
```
|
|
||||||
**File:** `dbItemHandler.java`, Line ~55
|
|
||||||
|
|
||||||
## Relationships
|
|
||||||
|
|
||||||
1. **Item to Owner:** Many-to-one relationship via ownerUID field referencing obj_character.UID
|
|
||||||
2. **Item to Container:** Many-to-one relationship via containerID field referencing obj_container.UID
|
|
||||||
3. **Item to Item Base:** Many-to-one relationship via itemBaseID field referencing static_itembase.UID
|
|
||||||
|
|
||||||
## Java Field to Database Column Mappings
|
|
||||||
|
|
||||||
| Java Field | Database Column | Notes |
|
|
||||||
|------------|-----------------|-------|
|
|
||||||
| `UID` | `obj_item.UID` | Unique identifier for the item |
|
|
||||||
| `ownerUID` | `obj_item.ownerUID` | UID of the character who owns this item |
|
|
||||||
| `containerID` | `obj_item.containerID` | Container ID where item is stored |
|
|
||||||
| `itemBaseID` | `obj_item.itemBaseID` | UID of the base item definition |
|
|
||||||
| `item_container` | `obj_item.item_container` | Container type (inventory, equip, bank, etc.) |
|
|
||||||
| `equipSlot` | `obj_item.equipSlot` | Slot where item is equipped |
|
|
||||||
| `flags` | `obj_item.flags` | Item flags for special properties |
|
|
||||||
| `customName` | `obj_item.customName` | Custom name of the item |
|
|
||||||
| `other fields...` | Various columns | Other item-specific properties |
|
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
# dbKitHandler Documentation
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
This document describes the database relationships and interactions for the `dbKitHandler` class. The kit handler manages static data about game kits, which are predefined sets of items or abilities that players can obtain or use in the game.
|
|
||||||
|
|
||||||
## Handler Class
|
|
||||||
**File:** `src/engine/db/handlers/dbKitHandler.java`
|
|
||||||
**Class:** `dbKitHandler`
|
|
||||||
**Extends:** `dbHandlerBase`
|
|
||||||
|
|
||||||
## Database Tables
|
|
||||||
|
|
||||||
### Main Kit Table
|
|
||||||
- **Table Name:** `static_rune_validkit`
|
|
||||||
- **Description:** Stores information about valid kits available in the game, including their properties and restrictions
|
|
||||||
- **Columns:**
|
|
||||||
- UID (Primary Key)
|
|
||||||
- kitName
|
|
||||||
- description
|
|
||||||
- raceRestriction
|
|
||||||
- classRestriction
|
|
||||||
- itemLimit
|
|
||||||
- isAvailable
|
|
||||||
|
|
||||||
## Key Queries
|
|
||||||
|
|
||||||
### GET_ALL_KITS
|
|
||||||
```sql
|
|
||||||
SELECT * FROM `static_rune_validkit`
|
|
||||||
```
|
|
||||||
**File:** `dbKitHandler.java`, Line ~29
|
|
||||||
|
|
||||||
### GET_KIT_BY_NAME
|
|
||||||
```sql
|
|
||||||
SELECT * FROM `static_rune_validkit` WHERE `kitName`=?
|
|
||||||
```
|
|
||||||
**File:** `dbKitHandler.java`, Line ~45
|
|
||||||
|
|
||||||
## Relationships
|
|
||||||
|
|
||||||
1. **Kit to Race Restrictions:** Many-to-many relationship through raceRestriction field
|
|
||||||
2. **Kit to Class Restrictions:** Many-to-many relationship through classRestriction field
|
|
||||||
3. **Kit to Items:** One-to-many relationship via itemLimit referencing items in the game
|
|
||||||
|
|
||||||
## Java Field to Database Column Mappings
|
|
||||||
|
|
||||||
| Java Field | Database Column | Notes |
|
|
||||||
|------------|-----------------|-------|
|
|
||||||
| `kitName` | `static_rune_validkit.kitName` | Unique name identifier for the kit |
|
|
||||||
| `description` | `static_rune_validkit.description` | Description of the kit's purpose and benefits |
|
|
||||||
| `raceRestriction` | `static_rune_validkit.raceRestriction` | Race restriction for the kit |
|
|
||||||
| `classRestriction` | `static_rune_validkit.classRestriction` | Class restriction for the kit |
|
|
||||||
| `itemLimit` | `static_rune_validkit.itemLimit` | Maximum number of items allowed in this kit |
|
|
||||||
| `isAvailable` | `static_rune_validkit.isAvailable` | Boolean flag indicating if kit is currently available |
|
|
||||||
-91
@@ -1,91 +0,0 @@
|
|||||||
# dbLootHandler Documentation
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
This document describes the database relationships and interactions for the `dbLootHandler` class. The loot handler manages static loot tables and item generation data used in the game's loot system, including general tables, item tables, modifier tables, and booty sets.
|
|
||||||
|
|
||||||
## Handler Class
|
|
||||||
**File:** `src/engine/db/handlers/dbLootHandler.java`
|
|
||||||
**Class:** `dbLootHandler`
|
|
||||||
**Extends:** `dbHandlerBase`
|
|
||||||
|
|
||||||
## Database Tables
|
|
||||||
|
|
||||||
### Main Tables
|
|
||||||
- **Table Name:** `static_loot_gen`
|
|
||||||
- **Description:** Stores general loot table entries for item generation
|
|
||||||
- **Columns:**
|
|
||||||
- genTable (Primary Key)
|
|
||||||
- itemID
|
|
||||||
- weight
|
|
||||||
- minLevel
|
|
||||||
- maxLevel
|
|
||||||
|
|
||||||
### Related Tables
|
|
||||||
|
|
||||||
| Table Name | Description | Relationship |
|
|
||||||
|------------|-------------|--------------|
|
|
||||||
| `static_loot_item` | Stores item-specific loot table entries | One-to-many with genTable |
|
|
||||||
| `static_loot_mod` | Stores modifier information for loot items | One-to-many with modTable |
|
|
||||||
| `static_loot_modtype` | Defines modifier types used in loot systems | One-to-many with modType |
|
|
||||||
| `static_loot_bootySet` | Stores booty set definitions for loot generation | One-to-many with bootySet |
|
|
||||||
|
|
||||||
## Key Queries
|
|
||||||
|
|
||||||
### LOAD_GEN_ITEM_TABLES
|
|
||||||
```sql
|
|
||||||
SELECT * FROM `static_loot_gen`
|
|
||||||
```
|
|
||||||
**File:** `dbLootHandler.java`, Line ~32
|
|
||||||
|
|
||||||
### LOAD_ITEM_TABLES
|
|
||||||
```sql
|
|
||||||
SELECT * FROM `static_loot_item`
|
|
||||||
```
|
|
||||||
**File:** `dbLootHandler.java`, Line ~64
|
|
||||||
|
|
||||||
### LOAD_MOD_TABLES
|
|
||||||
```sql
|
|
||||||
SELECT * FROM `static_loot_mod`
|
|
||||||
```
|
|
||||||
**File:** `dbLootHandler.java`, Line ~96
|
|
||||||
|
|
||||||
### LOAD_MOD_TYPE_TABLES
|
|
||||||
```sql
|
|
||||||
SELECT * FROM `static_loot_modtype`
|
|
||||||
```
|
|
||||||
**File:** `dbLootHandler.java`, Line ~128
|
|
||||||
|
|
||||||
### LOAD_BOOTY_TABLES
|
|
||||||
```sql
|
|
||||||
SELECT * FROM static_loot_bootySet
|
|
||||||
```
|
|
||||||
**File:** `dbLootHandler.java`, Line ~160
|
|
||||||
|
|
||||||
### LOAD_ENCHANT_VALUES
|
|
||||||
```sql
|
|
||||||
SELECT `IDString`, `minMod` FROM `static_power_effectmod` WHERE `modType` = ?
|
|
||||||
```
|
|
||||||
**File:** `dbLootHandler.java`, Line ~192
|
|
||||||
|
|
||||||
## Relationships
|
|
||||||
|
|
||||||
1. **Loot Generation Tables:** The main loot tables are related through the genTable, itemTable, and modTable fields to form a hierarchical loot generation system
|
|
||||||
2. **Item Tables:** Connected to general tables through itemID fields for specific item definitions
|
|
||||||
3. **Modifier Tables:** Linked through modTable and modType fields for modifier definitions
|
|
||||||
4. **Booty Sets:** Connected through bootySet field for specific booty set configurations
|
|
||||||
|
|
||||||
## Java Field to Database Column Mappings
|
|
||||||
|
|
||||||
| Java Field | Database Column | Notes |
|
|
||||||
|------------|-----------------|-------|
|
|
||||||
| `genTableID` | `static_loot_gen.genTable` | Unique identifier for the loot table |
|
|
||||||
| `itemID` | `static_loot_gen.itemID` | Item ID for this loot entry |
|
|
||||||
| `weight` | `static_loot_gen.weight` | Weight for random selection |
|
|
||||||
| `minLevel` | `static_loot_gen.minLevel` | Minimum level requirement |
|
|
||||||
| `maxLevel` | `static_loot_gen.maxLevel` | Maximum level requirement |
|
|
||||||
| `itemTableID` | `static_loot_item.itemTable` | Item table identifier |
|
|
||||||
| `modTableID` | `static_loot_mod.modTable` | Modifier table identifier |
|
|
||||||
| `modTypeID` | `static_loot_modtype.modType` | Modifier type identifier |
|
|
||||||
| `bootySetID` | `static_loot_bootySet.bootySet` | Booty set identifier |
|
|
||||||
| `IDString` | `static_power_effectmod.IDString` | ID string for effect modifiers |
|
|
||||||
| `minMod` | `static_power_effectmod.minMod` | Minimum modifier value |
|
|
||||||
-49
@@ -1,49 +0,0 @@
|
|||||||
# dbMenuHandler Documentation
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
This document describes the database relationships and interactions for the `dbMenuHandler` class. The menu handler manages NPC menu options and their associated data, providing functionality to retrieve menu options based on menu IDs.
|
|
||||||
|
|
||||||
## Handler Class
|
|
||||||
**File:** `src/engine/db/handlers/dbMenuHandler.java`
|
|
||||||
**Class:** `dbMenuHandler`
|
|
||||||
**Extends:** `dbHandlerBase`
|
|
||||||
|
|
||||||
## Database Tables
|
|
||||||
|
|
||||||
### Main Table
|
|
||||||
- **Table Name:** `static_npc_menuoption`
|
|
||||||
- **Description:** Stores NPC menu option data including text, actions, and relationships to parent menus
|
|
||||||
- **Columns:**
|
|
||||||
- menuID (Primary Key)
|
|
||||||
- optionText
|
|
||||||
- actionType
|
|
||||||
- actionValue
|
|
||||||
- nextMenuID
|
|
||||||
- conditionType
|
|
||||||
- conditionValue
|
|
||||||
|
|
||||||
## Key Queries
|
|
||||||
|
|
||||||
### GET_MENU_OPTIONS
|
|
||||||
```sql
|
|
||||||
SELECT * FROM `static_npc_menuoption` WHERE menuID = ?
|
|
||||||
```
|
|
||||||
**File:** `dbMenuHandler.java`, Line ~25
|
|
||||||
|
|
||||||
## Relationships
|
|
||||||
|
|
||||||
1. **Menu Options to Menu:** One-to-many relationship via menuID field referencing parent menu structure
|
|
||||||
2. **Menu Options to Next Menu:** Many-to-one relationship via nextMenuID field for navigation between menus
|
|
||||||
3. **Menu Options to Conditions:** Zero-to-many relationship via conditionType and conditionValue fields for dynamic menu display
|
|
||||||
|
|
||||||
## Java Field to Database Column Mappings
|
|
||||||
|
|
||||||
| Java Field | Database Column | Notes |
|
|
||||||
|------------|-----------------|-------|
|
|
||||||
| `menuID` | `static_npc_menuoption.menuID` | Unique identifier for the parent menu |
|
|
||||||
| `optionText` | `static_npc_menuoption.optionText` | Text displayed for this menu option |
|
|
||||||
| `actionType` | `static_npc_menuoption.actionType` | Type of action to perform when selected |
|
|
||||||
| `actionValue` | `static_npc_menuoption.actionValue` | Value associated with the action |
|
|
||||||
| `nextMenuID` | `static_npc_menuoption.nextMenuID` | ID of the menu to navigate to when selected |
|
|
||||||
| `conditionType` | `static_npc_menuoption.conditionType` | Type of condition for displaying this option |
|
|
||||||
| `conditionValue` | `static_npc_menuoption.conditionValue` | Value associated with the condition |
|
|
||||||
-83
@@ -1,83 +0,0 @@
|
|||||||
# dbMineHandler Documentation
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
This document describes the database relationships and interactions for the `dbMineHandler` class. The mine handler manages mine objects and their properties, including ownership, resource types, production types, and flags for various mine behaviors.
|
|
||||||
|
|
||||||
## Handler Class
|
|
||||||
**File:** `src/engine/db/handlers/dbMineHandler.java`
|
|
||||||
**Class:** `dbMineHandler`
|
|
||||||
**Extends:** `dbHandlerBase`
|
|
||||||
|
|
||||||
## Database Tables
|
|
||||||
|
|
||||||
### Main Table
|
|
||||||
- **Table Name:** `obj_mine`
|
|
||||||
- **Description:** Stores mine-specific data including owner, resource type, production type, and flags
|
|
||||||
- **Columns:**
|
|
||||||
- UID (Primary Key)
|
|
||||||
- mine_ownerUID
|
|
||||||
- mine_resource
|
|
||||||
- mine_type
|
|
||||||
- flags
|
|
||||||
|
|
||||||
### Related Tables
|
|
||||||
|
|
||||||
| Table Name | Description | Relationship |
|
|
||||||
|------------|-------------|--------------|
|
|
||||||
| `obj_building` | Base building data for mines | One-to-one with obj_mine via UID |
|
|
||||||
| `object` | Generic object data including parent relationships | One-to-one with obj_mine via UID |
|
|
||||||
|
|
||||||
## Key Queries
|
|
||||||
|
|
||||||
### GET_MINE
|
|
||||||
```sql
|
|
||||||
SELECT `obj_building`.*, `object`.`parent` FROM `object` INNER JOIN `obj_building` ON `obj_building`.`UID` = `object`.`UID` WHERE `object`.`UID` = ?
|
|
||||||
```
|
|
||||||
**File:** `dbMineHandler.java`, Line ~25
|
|
||||||
|
|
||||||
### GET_ALL_MINES_FOR_SERVER
|
|
||||||
```sql
|
|
||||||
SELECT `obj_mine`.*, `object`.`parent` FROM `object` INNER JOIN `obj_mine` ON `obj_mine`.`UID` = `object`.`UID`
|
|
||||||
```
|
|
||||||
**File:** `dbMineHandler.java`, Line ~43
|
|
||||||
|
|
||||||
### CHANGE_OWNER
|
|
||||||
```sql
|
|
||||||
UPDATE `obj_mine` SET `mine_ownerUID`=? WHERE `UID`=?
|
|
||||||
```
|
|
||||||
**File:** `dbMineHandler.java`, Line ~57
|
|
||||||
|
|
||||||
### CHANGE_RESOURCE
|
|
||||||
```sql
|
|
||||||
UPDATE `obj_mine` SET `mine_resource`=? WHERE `UID`=?
|
|
||||||
```
|
|
||||||
**File:** `dbMineHandler.java`, Line ~71
|
|
||||||
|
|
||||||
### CHANGE_TYPE
|
|
||||||
```sql
|
|
||||||
UPDATE `obj_mine` SET `mine_type`=? WHERE `UID`=?
|
|
||||||
```
|
|
||||||
**File:** `dbMineHandler.java`, Line ~85
|
|
||||||
|
|
||||||
### SET_FLAGS
|
|
||||||
```sql
|
|
||||||
UPDATE `obj_mine` SET `flags`=? WHERE `UID`=?
|
|
||||||
```
|
|
||||||
**File:** `dbMineHandler.java`, Line ~99
|
|
||||||
|
|
||||||
## Relationships
|
|
||||||
|
|
||||||
1. **Mine to Building:** One-to-one relationship via UID field (mine data extends building data)
|
|
||||||
2. **Mine to Owner:** Many-to-one relationship via mine_ownerUID referencing obj_character.UID
|
|
||||||
3. **Mine to Resource:** Many-to-one relationship via mine_resource field linking to resource definitions
|
|
||||||
4. **Mine to Parent Object:** One-to-one relationship through object table for parent-child hierarchies
|
|
||||||
|
|
||||||
## Java Field to Database Column Mappings
|
|
||||||
|
|
||||||
| Java Field | Database Column | Notes |
|
|
||||||
|------------|-----------------|-------|
|
|
||||||
| `mine_ownerUID` | `obj_mine.mine_ownerUID` | Character UID of the mine owner |
|
|
||||||
| `mine_resource` | `obj_mine.mine_resource` | Resource type being mined |
|
|
||||||
| `mine_type` | `obj_mine.mine_type` | Production type of the mine |
|
|
||||||
| `flags` | `obj_mine.flags` | Bit flags for mine properties |
|
|
||||||
| `UID` | `obj_mine.UID` | Unique identifier for the mine object |
|
|
||||||
-66
@@ -1,66 +0,0 @@
|
|||||||
# dbMobBaseHandler Documentation
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
This document describes the database relationships and interactions for the `dbMobBaseHandler` class. This handler manages static data about mob (monster) base properties in Magicbane, including their characteristics, stats, and behaviors.
|
|
||||||
|
|
||||||
## Handler Class
|
|
||||||
**File:** `src/engine/db/handlers/dbMobBaseHandler.java`
|
|
||||||
**Class:** `dbMobBaseHandler`
|
|
||||||
**Extends:** `dbHandlerBase`
|
|
||||||
|
|
||||||
## Database Tables
|
|
||||||
|
|
||||||
### Main Mob Base Table
|
|
||||||
- **Table Name:** `static_mob_base`
|
|
||||||
- **Description:** Core table storing base properties of mobs, including names, descriptions, and basic characteristics
|
|
||||||
- **Columns:**
|
|
||||||
- UID (Primary Key)
|
|
||||||
- name
|
|
||||||
- description
|
|
||||||
- mobType
|
|
||||||
- level
|
|
||||||
- health
|
|
||||||
|
|
||||||
### Related Tables
|
|
||||||
|
|
||||||
| Table Name | Description | Relationship |
|
|
||||||
|------------|-------------|--------------|
|
|
||||||
| `static_mob_stats` | Stores stat information for mobs | MobBaseID → static_mob_base.UID |
|
|
||||||
| `static_mob_loot` | Stores loot information for mobs | MobBaseID → static_mob_base.UID |
|
|
||||||
|
|
||||||
## Key Queries
|
|
||||||
|
|
||||||
### Get Mob Base by UID
|
|
||||||
```sql
|
|
||||||
SELECT * FROM static_mob_base WHERE `UID` = ?
|
|
||||||
```
|
|
||||||
**File:** `dbMobBaseHandler.java`, Line ~25
|
|
||||||
|
|
||||||
### Get Mob Stats
|
|
||||||
```sql
|
|
||||||
SELECT * FROM static_mob_stats WHERE `mobBaseID` = ?
|
|
||||||
```
|
|
||||||
**File:** `dbMobBaseHandler.java`, Line ~40
|
|
||||||
|
|
||||||
### Get Mob Loot
|
|
||||||
```sql
|
|
||||||
SELECT * FROM static_mob_loot WHERE `mobBaseID` = ?
|
|
||||||
```
|
|
||||||
**File:** `dbMobBaseHandler.java`, Line ~55
|
|
||||||
|
|
||||||
## Relationships
|
|
||||||
|
|
||||||
1. **Mob Base to Stats:** One-to-many relationship via mobBaseID field in static_mob_stats referencing static_mob_base.UID
|
|
||||||
2. **Mob Base to Loot:** One-to-many relationship via mobBaseID field in static_mob_loot referencing static_mob_base.UID
|
|
||||||
|
|
||||||
## Java Field to Database Column Mappings
|
|
||||||
|
|
||||||
| Java Field | Database Column | Notes |
|
|
||||||
|------------|-----------------|-------|
|
|
||||||
| `UID` | `static_mob_base.UID` | Unique identifier for the mob |
|
|
||||||
| `name` | `static_mob_base.name` | Name of the mob |
|
|
||||||
| `description` | `static_mob_base.description` | Description of the mob |
|
|
||||||
| `mobType` | `static_mob_base.mobType` | Type of mob |
|
|
||||||
| `level` | `static_mob_base.level` | Level of the mob |
|
|
||||||
| `health` | `static_mob_base.health` | Base health of the mob |
|
|
||||||
| `other fields...` | Various columns | Other properties related to mob base data |
|
|
||||||
@@ -1,70 +0,0 @@
|
|||||||
# dbMobHandler Documentation
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
This document describes the database relationships and interactions for the `dbMobHandler` class. This handler manages dynamic mob data in the game world, including their current state, location, and behavior.
|
|
||||||
|
|
||||||
## Handler Class
|
|
||||||
**File:** `src/engine/db/handlers/dbMobHandler.java`
|
|
||||||
**Class:** `dbMobHandler`
|
|
||||||
**Extends:** `dbHandlerBase`
|
|
||||||
|
|
||||||
## Database Tables
|
|
||||||
|
|
||||||
### Main Mob Table
|
|
||||||
- **Table Name:** `dyn_mob`
|
|
||||||
- **Description:** Stores current state information for mobs in the game world, including location, health, and status
|
|
||||||
- **Columns:**
|
|
||||||
- UID (Primary Key)
|
|
||||||
- mobBaseID
|
|
||||||
- zoneUUID
|
|
||||||
- x
|
|
||||||
- y
|
|
||||||
- z
|
|
||||||
- health
|
|
||||||
- isAlive
|
|
||||||
|
|
||||||
### Related Tables
|
|
||||||
|
|
||||||
| Table Name | Description | Relationship |
|
|
||||||
|------------|-------------|--------------|
|
|
||||||
| `obj_character` | Characters that may interact with mobs | OwnerUID → obj_character.UID |
|
|
||||||
|
|
||||||
## Key Queries
|
|
||||||
|
|
||||||
### Get Mob by UID
|
|
||||||
```sql
|
|
||||||
SELECT * FROM dyn_mob WHERE `UID` = ?
|
|
||||||
```
|
|
||||||
**File:** `dbMobHandler.java`, Line ~25
|
|
||||||
|
|
||||||
### Save Mob
|
|
||||||
```sql
|
|
||||||
INSERT INTO `dyn_mob` (`mobBaseID`, `zoneUUID`, `x`, `y`, `z`, `health`, `isAlive`) VALUES(?,?,?,?,?,?,?)
|
|
||||||
```
|
|
||||||
**File:** `dbMobHandler.java`, Line ~40
|
|
||||||
|
|
||||||
### Get Mobs by Zone
|
|
||||||
```sql
|
|
||||||
SELECT * FROM dyn_mob WHERE `zoneUUID` = ?
|
|
||||||
```
|
|
||||||
**File:** `dbMobHandler.java`, Line ~55
|
|
||||||
|
|
||||||
## Relationships
|
|
||||||
|
|
||||||
1. **Mob to Mob Base:** Many-to-one relationship via mobBaseID field referencing static_mob_base.UID
|
|
||||||
2. **Mob to Zone:** Many-to-one relationship via zoneUUID field referencing obj_zone.UID
|
|
||||||
3. **Mob to Owner:** Many-to-one relationship via ownerUID field referencing obj_character.UID (if applicable)
|
|
||||||
|
|
||||||
## Java Field to Database Column Mappings
|
|
||||||
|
|
||||||
| Java Field | Database Column | Notes |
|
|
||||||
|------------|-----------------|-------|
|
|
||||||
| `UID` | `dyn_mob.UID` | Unique identifier for the mob |
|
|
||||||
| `mobBaseID` | `dyn_mob.mobBaseID` | UID of the base mob definition |
|
|
||||||
| `zoneUUID` | `dyn_mob.zoneUUID` | Zone where the mob is located |
|
|
||||||
| `x` | `dyn_mob.x` | X coordinate of mob position |
|
|
||||||
| `y` | `dyn_mob.y` | Y coordinate of mob position |
|
|
||||||
| `z` | `dyn_mob.z` | Z coordinate of mob position |
|
|
||||||
| `health` | `dyn_mob.health` | Current health of the mob |
|
|
||||||
| `isAlive` | `dyn_mob.isAlive` | Flag indicating if mob is alive |
|
|
||||||
| `other fields...` | Various columns | Other properties related to mob state |
|
|
||||||
@@ -1,71 +0,0 @@
|
|||||||
# dbNPCHandler Documentation
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
This document describes the database relationships and interactions for the `dbNPCHandler` class. This handler manages non-player character (NPC) data, including their base properties, current state, and behaviors in the game world.
|
|
||||||
|
|
||||||
## Handler Class
|
|
||||||
**File:** `src/engine/db/handlers/dbNPCHandler.java`
|
|
||||||
**Class:** `dbNPCHandler`
|
|
||||||
**Extends:** `dbHandlerBase`
|
|
||||||
|
|
||||||
## Database Tables
|
|
||||||
|
|
||||||
### Main NPC Table
|
|
||||||
- **Table Name:** `dyn_npc`
|
|
||||||
- **Description:** Stores current state information for NPCs, including location, health, and behavior flags
|
|
||||||
- **Columns:**
|
|
||||||
- UID (Primary Key)
|
|
||||||
- npcBaseID
|
|
||||||
- zoneUUID
|
|
||||||
- x
|
|
||||||
- y
|
|
||||||
- z
|
|
||||||
- health
|
|
||||||
- isAlive
|
|
||||||
- behavior
|
|
||||||
|
|
||||||
### Related Tables
|
|
||||||
|
|
||||||
| Table Name | Description | Relationship |
|
|
||||||
|------------|-------------|--------------|
|
|
||||||
| `static_npc_base` | Base properties of NPCs | npcBaseID → static_npc_base.UID |
|
|
||||||
|
|
||||||
## Key Queries
|
|
||||||
|
|
||||||
### Get NPC by UID
|
|
||||||
```sql
|
|
||||||
SELECT * FROM dyn_npc WHERE `UID` = ?
|
|
||||||
```
|
|
||||||
**File:** `dbNPCHandler.java`, Line ~25
|
|
||||||
|
|
||||||
### Save NPC
|
|
||||||
```sql
|
|
||||||
INSERT INTO `dyn_npc` (`npcBaseID`, `zoneUUID`, `x`, `y`, `z`, `health`, `isAlive`, `behavior`) VALUES(?,?,?,?,?,?,?,?)
|
|
||||||
```
|
|
||||||
**File:** `dbNPCHandler.java`, Line ~40
|
|
||||||
|
|
||||||
### Get NPCs by Zone
|
|
||||||
```sql
|
|
||||||
SELECT * FROM dyn_npc WHERE `zoneUUID` = ?
|
|
||||||
```
|
|
||||||
**File:** `dbNPCHandler.java`, Line ~55
|
|
||||||
|
|
||||||
## Relationships
|
|
||||||
|
|
||||||
1. **NPC to NPC Base:** Many-to-one relationship via npcBaseID field referencing static_npc_base.UID
|
|
||||||
2. **NPC to Zone:** Many-to-one relationship via zoneUUID field referencing obj_zone.UID
|
|
||||||
|
|
||||||
## Java Field to Database Column Mappings
|
|
||||||
|
|
||||||
| Java Field | Database Column | Notes |
|
|
||||||
|------------|-----------------|-------|
|
|
||||||
| `UID` | `dyn_npc.UID` | Unique identifier for the NPC |
|
|
||||||
| `npcBaseID` | `dyn_npc.npcBaseID` | UID of the base NPC definition |
|
|
||||||
| `zoneUUID` | `dyn_npc.zoneUUID` | Zone where the NPC is located |
|
|
||||||
| `x` | `dyn_npc.x` | X coordinate of NPC position |
|
|
||||||
| `y` | `dyn_npc.y` | Y coordinate of NPC position |
|
|
||||||
| `z` | `dyn_npc.z` | Z coordinate of NPC position |
|
|
||||||
| `health` | `dyn_npc.health` | Current health of the NPC |
|
|
||||||
| `isAlive` | `dyn_npc.isAlive` | Flag indicating if NPC is alive |
|
|
||||||
| `behavior` | `dyn_npc.behavior` | Behavior type or state of the NPC |
|
|
||||||
| `other fields...` | Various columns | Other properties related to NPC state |
|
|
||||||
-72
@@ -1,72 +0,0 @@
|
|||||||
# dbPetitionHandler Documentation
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
This document describes the database relationships and interactions for the `dbPetitionHandler` class. This handler manages player petitions, which are requests or complaints submitted by players to game administrators.
|
|
||||||
|
|
||||||
## Handler Class
|
|
||||||
**File:** `src/engine/db/handlers/dbPetitionHandler.java`
|
|
||||||
**Class:** `dbPetitionHandler`
|
|
||||||
**Extends:** `dbHandlerBase`
|
|
||||||
|
|
||||||
## Database Tables
|
|
||||||
|
|
||||||
### Main Petition Table
|
|
||||||
- **Table Name:** `dyn_petition`
|
|
||||||
- **Description:** Stores information about player petitions, including submission details, status, and resolution
|
|
||||||
- **Columns:**
|
|
||||||
- UID (Primary Key)
|
|
||||||
- characterID
|
|
||||||
- petitionType
|
|
||||||
- description
|
|
||||||
- status
|
|
||||||
- submittedDate
|
|
||||||
- resolvedDate
|
|
||||||
|
|
||||||
### Related Tables
|
|
||||||
|
|
||||||
| Table Name | Description | Relationship |
|
|
||||||
|------------|-------------|--------------|
|
|
||||||
| `obj_character` | Characters who submitted petitions | characterID → obj_character.UID |
|
|
||||||
|
|
||||||
## Key Queries
|
|
||||||
|
|
||||||
### Get Petition by UID
|
|
||||||
```sql
|
|
||||||
SELECT * FROM dyn_petition WHERE `UID` = ?
|
|
||||||
```
|
|
||||||
**File:** `dbPetitionHandler.java`, Line ~25
|
|
||||||
|
|
||||||
### Save Petition
|
|
||||||
```sql
|
|
||||||
INSERT INTO `dyn_petition` (`characterID`, `petitionType`, `description`, `status`, `submittedDate`) VALUES(?,?,?,?,?)
|
|
||||||
```
|
|
||||||
**File:** `dbPetitionHandler.java`, Line ~40
|
|
||||||
|
|
||||||
### Get Petitions by Character
|
|
||||||
```sql
|
|
||||||
SELECT * FROM dyn_petition WHERE `characterID` = ?
|
|
||||||
```
|
|
||||||
**File:** `dbPetitionHandler.java`, Line ~55
|
|
||||||
|
|
||||||
### Update Petition Status
|
|
||||||
```sql
|
|
||||||
UPDATE `dyn_petition` SET `status`=?, `resolvedDate`=? WHERE `UID`=?
|
|
||||||
```
|
|
||||||
**File:** `dbPetitionHandler.java`, Line ~70
|
|
||||||
|
|
||||||
## Relationships
|
|
||||||
|
|
||||||
1. **Petition to Character:** Many-to-one relationship via characterID field referencing obj_character.UID
|
|
||||||
|
|
||||||
## Java Field to Database Column Mappings
|
|
||||||
|
|
||||||
| Java Field | Database Column | Notes |
|
|
||||||
|------------|-----------------|-------|
|
|
||||||
| `UID` | `dyn_petition.UID` | Unique identifier for the petition |
|
|
||||||
| `characterID` | `dyn_petition.characterID` | UID of the character who submitted the petition |
|
|
||||||
| `petitionType` | `dyn_petition.petitionType` | Type or category of the petition |
|
|
||||||
| `description` | `dyn_petition.description` | Description of the petition |
|
|
||||||
| `status` | `dyn_petition.status` | Current status of the petition (open, in progress, resolved) |
|
|
||||||
| `submittedDate` | `dyn_petition.submittedDate` | Timestamp when petition was submitted |
|
|
||||||
| `resolvedDate` | `dyn_petition.resolvedDate` | Timestamp when petition was resolved |
|
|
||||||
| `other fields...` | Various columns | Other properties related to petition data |
|
|
||||||
-149
@@ -1,149 +0,0 @@
|
|||||||
# Player Character Handler Documentation
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
This document describes the database relationships and interactions for the `dbPlayerCharacterHandler` class. The player character handler manages all aspects of character data including creation, updates, and retrieval operations within the Magicbane emulator system.
|
|
||||||
|
|
||||||
## Handler Class
|
|
||||||
**File:** `src/engine/db/handlers/dbPlayerCharacterHandler.java`
|
|
||||||
**Class:** `dbPlayerCharacterHandler`
|
|
||||||
**Extends:** `dbHandlerBase`
|
|
||||||
|
|
||||||
## Database Tables
|
|
||||||
|
|
||||||
### Main Character Table
|
|
||||||
- **Table Name:** `obj_character`
|
|
||||||
- **Description:** Core character information including attributes, stats, and personal details
|
|
||||||
- **Columns:**
|
|
||||||
- UID (Primary Key)
|
|
||||||
- char_firstname
|
|
||||||
- char_lastname
|
|
||||||
- char_isActive
|
|
||||||
- char_raceID
|
|
||||||
- char_baseClassID
|
|
||||||
- char_promotionClassID
|
|
||||||
- char_strMod
|
|
||||||
- char_dexMod
|
|
||||||
- char_conMod
|
|
||||||
- char_intMod
|
|
||||||
- char_spiMod
|
|
||||||
- char_experience
|
|
||||||
- char_skinColor
|
|
||||||
- char_hairColor
|
|
||||||
- char_hairStyle
|
|
||||||
- char_beardColor
|
|
||||||
- char_beardStyle
|
|
||||||
- char_bindBuilding
|
|
||||||
- guildUID
|
|
||||||
- guild_isInnerCouncil
|
|
||||||
- guild_isRecruiter
|
|
||||||
- guild_isTaxCollector
|
|
||||||
- guild_isFullMember
|
|
||||||
- guild_title
|
|
||||||
- anniversery
|
|
||||||
- hash
|
|
||||||
|
|
||||||
### Related Tables
|
|
||||||
|
|
||||||
| Table Name | Description | Relationship |
|
|
||||||
|------------|-------------|--------------|
|
|
||||||
| `dyn_character_ignore` | Stores character ignore lists for players | accountUID → obj_account.UID |
|
|
||||||
| `dyn_character_friends` | Manages friendship relationships between characters | CharacterID → obj_character.UID |
|
|
||||||
| `dyn_character_guildhistory` | Tracks character's guild membership history | CharacterID → obj_character.UID, GuildID → obj_guild.UID |
|
|
||||||
| `dyn_character_heraldy` | Stores heraldry information for characters | CharacterID → obj_character.UID |
|
|
||||||
| `dyn_character_killmap` | Records kill statistics for characters | CharacterID → obj_character.UID |
|
|
||||||
| `dyn_character_murdermap` | Tracks murder statistics for characters | CharacterID → obj_character.UID |
|
|
||||||
| `dyn_character_power` | Manages character powers/abilities | CharacterID → obj_character.UID |
|
|
||||||
| `dyn_character_rune` | Stores rune information for characters | CharacterID → obj_character.UID |
|
|
||||||
| `dyn_character_skill` | Manages character skills and training | CharacterID → obj_character.UID |
|
|
||||||
|
|
||||||
## Key Queries
|
|
||||||
|
|
||||||
### Create New Character
|
|
||||||
```sql
|
|
||||||
CALL `character_CREATE`(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
||||||
```
|
|
||||||
**File:** `dbPlayerCharacterHandler.java`, Line ~35
|
|
||||||
|
|
||||||
### Get Characters for Account
|
|
||||||
```sql
|
|
||||||
SELECT `obj_character`.*, `object`.`parent` FROM `object` INNER JOIN `obj_character` ON `obj_character`.`UID` = `object`.`UID` WHERE `object`.`parent`=? && `obj_character`.`char_isActive`='1';
|
|
||||||
```
|
|
||||||
**File:** `dbPlayerCharacterHandler.java`, Line ~109
|
|
||||||
|
|
||||||
### Get All Active Characters
|
|
||||||
```sql
|
|
||||||
SELECT `obj_character`.*, `object`.`parent` FROM `object` INNER JOIN `obj_character` ON `obj_character`.`UID` = `object`.`UID` WHERE `obj_character`.`char_isActive`='1';
|
|
||||||
```
|
|
||||||
**File:** `dbPlayerCharacterHandler.java`, Line ~127
|
|
||||||
|
|
||||||
### Get Character by UID
|
|
||||||
```sql
|
|
||||||
SELECT `obj_character`.*, `object`.`parent` FROM `object` INNER JOIN `obj_character` ON `obj_character`.`UID` = `object`.`UID` WHERE `object`.`UID` = ?
|
|
||||||
```
|
|
||||||
**File:** `dbPlayerCharacterHandler.java`, Line ~185
|
|
||||||
|
|
||||||
### Get Character by Name
|
|
||||||
```sql
|
|
||||||
SELECT `char_firstname` FROM `obj_character` WHERE `char_isActive`=1 && `char_firstname`=?
|
|
||||||
```
|
|
||||||
**File:** `dbPlayerCharacterHandler.java`, Line ~203
|
|
||||||
|
|
||||||
### Update Character Name
|
|
||||||
```sql
|
|
||||||
UPDATE `obj_character` SET `char_firstname`=?, `char_lastname`=? WHERE `char_firstname`=? AND `char_isActive`='1'
|
|
||||||
```
|
|
||||||
**File:** `dbPlayerCharacterHandler.java`, Line ~222
|
|
||||||
|
|
||||||
### Set Character Ignore List
|
|
||||||
```sql
|
|
||||||
INSERT INTO `dyn_character_ignore` (`accountUID`, `ignoringUID`, `characterName`) VALUES (?, ?, ?)
|
|
||||||
```
|
|
||||||
**File:** `dbPlayerCharacterHandler.java`, Line ~83
|
|
||||||
|
|
||||||
### Get Character Ignore List
|
|
||||||
```sql
|
|
||||||
SELECT * FROM `dyn_character_ignore` WHERE `accountUID` = ?
|
|
||||||
```
|
|
||||||
**File:** `dbPlayerCharacterHandler.java`, Line ~151
|
|
||||||
|
|
||||||
## Relationships
|
|
||||||
|
|
||||||
1. **Character to Account:** Many-to-one (via `obj_character.parent` field referencing `obj_account.UID`)
|
|
||||||
2. **Character to Guild:** Many-to-one (via `obj_character.guildUID` field)
|
|
||||||
3. **Character to Ignore List:** One-to-many (via `dyn_character_ignore.accountUID`)
|
|
||||||
4. **Character to Friends List:** One-to-many (via `dyn_character_friends.CharacterID`)
|
|
||||||
5. **Character to Guild History:** One-to-many (via `dyn_character_guildhistory.CharacterID`)
|
|
||||||
6. **Character to Heraldry:** One-to-one (via `dyn_character_heraldy.CharacterID`)
|
|
||||||
7. **Character to Skills:** One-to-many (via `dyn_character_skill.CharacterID`)
|
|
||||||
8. **Character to Powers:** One-to-many (via `dyn_character_power.CharacterID`)
|
|
||||||
9. **Character to Runes:** One-to-many (via `dyn_character_rune.CharacterID`)
|
|
||||||
|
|
||||||
## Java Field to Database Column Mappings
|
|
||||||
|
|
||||||
| Java Field | Database Column | Notes |
|
|
||||||
|------------|-----------------|-------|
|
|
||||||
| `firstName` | `obj_character.char_firstname` | Character's first name |
|
|
||||||
| `lastName` | `obj_character.char_lastname` | Character's last name |
|
|
||||||
| `isActive` | `obj_character.char_isActive` | Boolean flag for active status |
|
|
||||||
| `race` | `obj_character.char_raceID` | Race identifier |
|
|
||||||
| `baseClass` | `obj_character.char_baseClassID` | Base class identifier |
|
|
||||||
| `promotionClass` | `obj_character.char_promotionClassID` | Promotion class identifier |
|
|
||||||
| `strMod` | `obj_character.char_strMod` | Strength modifier |
|
|
||||||
| `dexMod` | `obj_character.char_dexMod` | Dexterity modifier |
|
|
||||||
| `conMod` | `obj_character.char_conMod` | Constitution modifier |
|
|
||||||
| `intMod` | `obj_character.char_intMod` | Intelligence modifier |
|
|
||||||
| `spiMod` | `obj_character.char_spiMod` | Spirit modifier |
|
|
||||||
| `exp` | `obj_character.char_experience` | Experience points |
|
|
||||||
| `skinColor` | `obj_character.char_skinColor` | Skin color value |
|
|
||||||
| `hairColor` | `obj_character.char_hairColor` | Hair color value |
|
|
||||||
| `hairStyle` | `obj_character.char_hairStyle` | Hair style identifier |
|
|
||||||
| `beardColor` | `obj_character.char_beardColor` | Beard color value |
|
|
||||||
| `beardStyle` | `obj_character.char_beardStyle` | Beard style identifier |
|
|
||||||
| `bindBuilding` | `obj_character.char_bindBuilding` | Bind building UID |
|
|
||||||
| `guildUID` | `obj_character.guildUID` | Guild identifier |
|
|
||||||
| `isInnerCouncil` | `obj_character.guild_isInnerCouncil` | Inner council status |
|
|
||||||
| `isRecruiter` | `obj_character.guild_isRecruiter` | Recruiter status |
|
|
||||||
| `isTaxCollector` | `obj_character.guild_isTaxCollector` | Tax collector status |
|
|
||||||
| `isFullMember` | `obj_character.guild_isFullMember` | Full member status |
|
|
||||||
| `guildTitle` | `obj_character.guild_title` | Guild title identifier |
|
|
||||||
| `anniversery` | `obj_character.anniversery` | Anniversary flag |
|
|
||||||
-81
@@ -1,81 +0,0 @@
|
|||||||
# Power Handler Documentation
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
This document describes the database relationships and interactions for the `dbPowerHandler` class. The power handler manages game powers and abilities that characters can possess and use in the Magicbane emulator system.
|
|
||||||
|
|
||||||
## Handler Class
|
|
||||||
**File:** `src/engine/db/handlers/dbPowerHandler.java`
|
|
||||||
**Class:** `dbPowerHandler`
|
|
||||||
**Extends:** `dbHandlerBase`
|
|
||||||
|
|
||||||
## Database Tables
|
|
||||||
|
|
||||||
### Main Table(s)
|
|
||||||
- **Table Name:** `obj_power`
|
|
||||||
- **Description:** Core power information including name, description, and activation properties
|
|
||||||
- **Columns:**
|
|
||||||
- UID (Primary Key)
|
|
||||||
- name
|
|
||||||
- description
|
|
||||||
- powerType
|
|
||||||
- activationType
|
|
||||||
- cooldownTime
|
|
||||||
- duration
|
|
||||||
- maxLevel
|
|
||||||
- cost
|
|
||||||
- iconID
|
|
||||||
|
|
||||||
### Related Tables
|
|
||||||
|
|
||||||
| Table Name | Description | Relationship |
|
|
||||||
|------------|-------------|--------------|
|
|
||||||
| `obj_character_power` | Tracks character-specific power levels and status | CharacterID → obj_character.UID, PowerID → obj_power.UID |
|
|
||||||
| `static_power_requirement` | Stores requirements for unlocking powers | PowerID → obj_power.UID |
|
|
||||||
|
|
||||||
## Key Queries
|
|
||||||
|
|
||||||
### Get Power by ID
|
|
||||||
```sql
|
|
||||||
SELECT * FROM `obj_power` WHERE `UID`=?
|
|
||||||
```
|
|
||||||
**File:** `dbPowerHandler.java`, Line ~60
|
|
||||||
|
|
||||||
### Get Character's Powers
|
|
||||||
```sql
|
|
||||||
SELECT p.*, cp.level, cp.isUnlocked
|
|
||||||
FROM `obj_power` p
|
|
||||||
INNER JOIN `obj_character_power` cp ON p.`UID` = cp.`PowerID`
|
|
||||||
WHERE cp.`CharacterID`=?
|
|
||||||
```
|
|
||||||
**File:** `dbPowerHandler.java`, Line ~85
|
|
||||||
|
|
||||||
### Get Power Requirements
|
|
||||||
```sql
|
|
||||||
SELECT * FROM `static_power_requirement` WHERE `PowerID`=?
|
|
||||||
```
|
|
||||||
**File:** `dbPowerHandler.java`, Line ~120
|
|
||||||
|
|
||||||
## Relationships
|
|
||||||
|
|
||||||
1. **Power to Character:** Many-to-many through `obj_character_power` table
|
|
||||||
2. **Power to Requirements:** One-to-many (via `static_power_requirement.PowerID`)
|
|
||||||
3. **Power to Static Data:** Power definitions are stored in static tables
|
|
||||||
|
|
||||||
## Java Field to Database Column Mappings
|
|
||||||
|
|
||||||
| Java Field | Database Column | Notes |
|
|
||||||
|------------|-----------------|-------|
|
|
||||||
| `name` | `obj_power.name` | Power name |
|
|
||||||
| `description` | `obj_power.description` | Power description |
|
|
||||||
| `powerType` | `obj_power.powerType` | Type of power (active, passive) |
|
|
||||||
| `activationType` | `obj_power.activationType` | How the power is activated |
|
|
||||||
| `cooldownTime` | `obj_power.cooldownTime` | Cooldown period in seconds |
|
|
||||||
| `duration` | `obj_power.duration` | Duration of power effect |
|
|
||||||
| `maxLevel` | `obj_power.maxLevel` | Maximum level for this power |
|
|
||||||
| `cost` | `obj_power.cost` | Resource cost to use power |
|
|
||||||
| `iconID` | `obj_power.iconID` | Icon identifier for UI display |
|
|
||||||
|
|
||||||
## Notes
|
|
||||||
- The power system is designed to support both active and passive abilities
|
|
||||||
- Power requirements are stored separately to allow flexible unlocking mechanisms
|
|
||||||
- Character-specific power data is tracked in the `obj_character_power` table
|
|
||||||
-77
@@ -1,77 +0,0 @@
|
|||||||
# Promotion Class Handler Documentation
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
This document describes the database relationships and interactions for the `dbPromotionClassHandler` class. The promotion class handler manages character class promotions and advancement systems in the Magicbane emulator.
|
|
||||||
|
|
||||||
## Handler Class
|
|
||||||
**File:** `src/engine/db/handlers/dbPromotionClassHandler.java`
|
|
||||||
**Class:** `dbPromotionClassHandler`
|
|
||||||
**Extends:** `dbHandlerBase`
|
|
||||||
|
|
||||||
## Database Tables
|
|
||||||
|
|
||||||
### Main Table(s)
|
|
||||||
- **Table Name:** `obj_promotionclass`
|
|
||||||
- **Description:** Core promotion class information including name, requirements, and advancement paths
|
|
||||||
- **Columns:**
|
|
||||||
- UID (Primary Key)
|
|
||||||
- name
|
|
||||||
- description
|
|
||||||
- baseClassID
|
|
||||||
- requiredLevel
|
|
||||||
- requiredItems
|
|
||||||
- statBonuses
|
|
||||||
- skillBonus
|
|
||||||
|
|
||||||
### Related Tables
|
|
||||||
|
|
||||||
| Table Name | Description | Relationship |
|
|
||||||
|------------|-------------|--------------|
|
|
||||||
| `obj_character_promotionclass` | Tracks character-specific promotion class status | CharacterID → obj_character.UID, PromotionClassID → obj_promotionclass.UID |
|
|
||||||
| `static_promotion_requirement` | Stores requirements for class promotions | PromotionClassID → obj_promotionclass.UID |
|
|
||||||
|
|
||||||
## Key Queries
|
|
||||||
|
|
||||||
### Get Promotion Class by ID
|
|
||||||
```sql
|
|
||||||
SELECT * FROM `obj_promotionclass` WHERE `UID`=?
|
|
||||||
```
|
|
||||||
**File:** `dbPromotionClassHandler.java`, Line ~60
|
|
||||||
|
|
||||||
### Get Character's Promotion Classes
|
|
||||||
```sql
|
|
||||||
SELECT pc.*, cpc.isUnlocked
|
|
||||||
FROM `obj_promotionclass` pc
|
|
||||||
INNER JOIN `obj_character_promotionclass` cpc ON pc.`UID` = cpc.`PromotionClassID`
|
|
||||||
WHERE cpc.`CharacterID`=?
|
|
||||||
```
|
|
||||||
**File:** `dbPromotionClassHandler.java`, Line ~85
|
|
||||||
|
|
||||||
### Get Promotion Requirements
|
|
||||||
```sql
|
|
||||||
SELECT * FROM `static_promotion_requirement` WHERE `PromotionClassID`=?
|
|
||||||
```
|
|
||||||
**File:** `dbPromotionClassHandler.java`, Line ~120
|
|
||||||
|
|
||||||
## Relationships
|
|
||||||
|
|
||||||
1. **Promotion Class to Character:** Many-to-many through `obj_character_promotionclass` table
|
|
||||||
2. **Promotion Class to Requirements:** One-to-many (via `static_promotion_requirement.PromotionClassID`)
|
|
||||||
3. **Promotion Class to Base Class:** Many-to-one relationship via baseClassID
|
|
||||||
|
|
||||||
## Java Field to Database Column Mappings
|
|
||||||
|
|
||||||
| Java Field | Database Column | Notes |
|
|
||||||
|------------|-----------------|-------|
|
|
||||||
| `name` | `obj_promotionclass.name` | Promotion class name |
|
|
||||||
| `description` | `obj_promotionclass.description` | Description of the promotion class |
|
|
||||||
| `baseClassID` | `obj_promotionclass.baseClassID` | Reference to base class |
|
|
||||||
| `requiredLevel` | `obj_promotionclass.requiredLevel` | Level required for promotion |
|
|
||||||
| `requiredItems` | `obj_promotionclass.requiredItems` | Items required for promotion |
|
|
||||||
| `statBonuses` | `obj_promotionclass.statBonuses` | Stat bonuses granted |
|
|
||||||
| `skillBonus` | `obj_promotionclass.skillBonus` | Skill bonuses granted |
|
|
||||||
|
|
||||||
## Notes
|
|
||||||
- Promotion classes are tied to base classes and provide advancement paths for characters
|
|
||||||
- The system supports both unlocked and locked promotion classes
|
|
||||||
- Requirements are stored separately to allow flexible advancement mechanics
|
|
||||||
-45
@@ -1,45 +0,0 @@
|
|||||||
# Race Handler Documentation
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
This document describes the database relationships and interactions for the `dbRaceHandler` class. The race handler manages race-related data including beard colors and styles for different races in the Magicbane emulator.
|
|
||||||
|
|
||||||
## Handler Class
|
|
||||||
**File:** `src/engine/db/handlers/dbRaceHandler.java`
|
|
||||||
**Class:** `dbRaceHandler`
|
|
||||||
**Extends:** `dbHandlerBase`
|
|
||||||
|
|
||||||
## Database Tables
|
|
||||||
|
|
||||||
### Race-related Tables
|
|
||||||
- **Table Name:** `static_rune_racebeardcolor`
|
|
||||||
- **Description:** Stores beard color information for different races
|
|
||||||
- **Columns:**
|
|
||||||
- RaceID (Foreign Key)
|
|
||||||
- color
|
|
||||||
|
|
||||||
## Key Queries
|
|
||||||
|
|
||||||
### Get Beard Colors for Race
|
|
||||||
```sql
|
|
||||||
SELECT `color` FROM `static_rune_racebeardcolor` WHERE `RaceID` = ?
|
|
||||||
```
|
|
||||||
**File:** `dbRaceHandler.java`, Line ~25
|
|
||||||
|
|
||||||
### Get Beard Styles for Race
|
|
||||||
```sql
|
|
||||||
SELECT `style` FROM `static_rune_racebeardstyle` WHERE `RaceID` = ?
|
|
||||||
```
|
|
||||||
**File:** `dbRaceHandler.java`, Line ~40
|
|
||||||
|
|
||||||
## Relationships
|
|
||||||
|
|
||||||
1. **Race to Beard Colors:** One-to-many (via `static_rune_racebeardcolor.RaceID`)
|
|
||||||
2. **Race to Beard Styles:** One-to-many (via `static_rune_racebeardstyle.RaceID`)
|
|
||||||
|
|
||||||
|
|
||||||
## Java Field to Database Column Mappings
|
|
||||||
|
|
||||||
| Java Field | Database Column | Notes |
|
|
||||||
|------------|-----------------|-------|
|
|
||||||
| `RaceID` | `static_rune_racebeardcolor.RaceID` | Foreign key to race |
|
|
||||||
| `color` | `static_rune_racebeardcolor.color` | Beard color value |
|
|
||||||
-78
@@ -1,78 +0,0 @@
|
|||||||
# Realm Handler Documentation
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
This document describes the database relationships and interactions for the `dbRealmHandler` class. The realm handler manages different game realms or worlds within the Magicbane emulator system.
|
|
||||||
|
|
||||||
## Handler Class
|
|
||||||
**File:** `src/engine/db/handlers/dbRealmHandler.java`
|
|
||||||
**Class:** `dbRealmHandler`
|
|
||||||
**Extends:** `dbHandlerBase`
|
|
||||||
|
|
||||||
## Database Tables
|
|
||||||
|
|
||||||
### Main Table(s)
|
|
||||||
- **Table Name:** `obj_realm`
|
|
||||||
- **Description:** Core realm information including name, status, and configuration settings
|
|
||||||
- **Columns:**
|
|
||||||
- UID (Primary Key)
|
|
||||||
- name
|
|
||||||
- description
|
|
||||||
- status
|
|
||||||
- maxPlayers
|
|
||||||
- serverIP
|
|
||||||
- serverPort
|
|
||||||
- isPublic
|
|
||||||
- creationDate
|
|
||||||
|
|
||||||
### Related Tables
|
|
||||||
|
|
||||||
| Table Name | Description | Relationship |
|
|
||||||
|------------|-------------|--------------|
|
|
||||||
| `dyn_realm_playerlist` | Tracks active players in each realm | RealmID → obj_realm.UID, CharacterID → obj_character.UID |
|
|
||||||
| `obj_realm_config` | Configuration settings for each realm | RealmID → obj_realm.UID |
|
|
||||||
|
|
||||||
## Key Queries
|
|
||||||
|
|
||||||
### Get Realm by ID
|
|
||||||
```sql
|
|
||||||
SELECT * FROM `obj_realm` WHERE `UID`=?
|
|
||||||
```
|
|
||||||
**File:** `dbRealmHandler.java`, Line ~60
|
|
||||||
|
|
||||||
### Get All Active Realms
|
|
||||||
```sql
|
|
||||||
SELECT * FROM `obj_realm` WHERE `status`='active'
|
|
||||||
```
|
|
||||||
**File:** `dbRealmHandler.java`, Line ~85
|
|
||||||
|
|
||||||
### Get Realm Players
|
|
||||||
```sql
|
|
||||||
SELECT c.* FROM `obj_character` c
|
|
||||||
INNER JOIN `dyn_realm_playerlist` rpl ON c.`UID` = rpl.`CharacterID`
|
|
||||||
WHERE rpl.`RealmID`=?
|
|
||||||
```
|
|
||||||
**File:** `dbRealmHandler.java`, Line ~120
|
|
||||||
|
|
||||||
## Relationships
|
|
||||||
|
|
||||||
1. **Realm to Character:** Many-to-many through `dyn_realm_playerlist` table
|
|
||||||
2. **Realm to Configuration:** One-to-one (via `obj_realm_config.RealmID`)
|
|
||||||
3. **Realm to Player Status:** Real-time tracking of active players
|
|
||||||
|
|
||||||
## Java Field to Database Column Mappings
|
|
||||||
|
|
||||||
| Java Field | Database Column | Notes |
|
|
||||||
|------------|-----------------|-------|
|
|
||||||
| `name` | `obj_realm.name` | Realm name |
|
|
||||||
| `description` | `obj_realm.description` | Description of the realm |
|
|
||||||
| `status` | `obj_realm.status` | Current status (active, inactive) |
|
|
||||||
| `maxPlayers` | `obj_realm.maxPlayers` | Maximum number of players allowed |
|
|
||||||
| `serverIP` | `obj_realm.serverIP` | Server IP address |
|
|
||||||
| `serverPort` | `obj_realm.serverPort` | Server port number |
|
|
||||||
| `isPublic` | `obj_realm.isPublic` | Whether realm is publicly accessible |
|
|
||||||
| `creationDate` | `obj_realm.creationDate` | When the realm was created |
|
|
||||||
|
|
||||||
## Notes
|
|
||||||
- Realms represent different game worlds or instances
|
|
||||||
- Players can move between realms based on configuration
|
|
||||||
- The system tracks real-time player presence in each realm
|
|
||||||
-69
@@ -1,69 +0,0 @@
|
|||||||
# Resist Handler Documentation
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
This document describes the database relationships and interactions for the `dbResistHandler` class. The resist handler manages character resistance values against various damage types and effects in the Magicbane emulator system.
|
|
||||||
|
|
||||||
## Handler Class
|
|
||||||
**File:** `src/engine/db/handlers/dbResistHandler.java`
|
|
||||||
**Class:** `dbResistHandler`
|
|
||||||
**Extends:** `dbHandlerBase`
|
|
||||||
|
|
||||||
## Database Tables
|
|
||||||
|
|
||||||
### Main Table(s)
|
|
||||||
- **Table Name:** `obj_resist`
|
|
||||||
- **Description:** Core resistance information including damage type and resistance values
|
|
||||||
- **Columns:**
|
|
||||||
- UID (Primary Key)
|
|
||||||
- resistType
|
|
||||||
- value
|
|
||||||
- description
|
|
||||||
|
|
||||||
### Related Tables
|
|
||||||
|
|
||||||
| Table Name | Description | Relationship |
|
|
||||||
|------------|-------------|--------------|
|
|
||||||
| `obj_character_resist` | Tracks character-specific resistance values | CharacterID → obj_character.UID, ResistID → obj_resist.UID |
|
|
||||||
| `static_resist_type` | Static definitions of resistance types | ResistTypeID → obj_resist.UID |
|
|
||||||
|
|
||||||
## Key Queries
|
|
||||||
|
|
||||||
### Get Resist by ID
|
|
||||||
```sql
|
|
||||||
SELECT * FROM `obj_resist` WHERE `UID`=?
|
|
||||||
```
|
|
||||||
**File:** `dbResistHandler.java`, Line ~60
|
|
||||||
|
|
||||||
### Get Character's Resistances
|
|
||||||
```sql
|
|
||||||
SELECT r.*, cr.value as characterValue
|
|
||||||
FROM `obj_resist` r
|
|
||||||
INNER JOIN `obj_character_resist` cr ON r.`UID` = cr.`ResistID`
|
|
||||||
WHERE cr.`CharacterID`=?
|
|
||||||
```
|
|
||||||
**File:** `dbResistHandler.java`, Line ~85
|
|
||||||
|
|
||||||
### Get Resist by Type
|
|
||||||
```sql
|
|
||||||
SELECT * FROM `obj_resist` WHERE `resistType`=?
|
|
||||||
```
|
|
||||||
**File:** `dbResistHandler.java`, Line ~120
|
|
||||||
|
|
||||||
## Relationships
|
|
||||||
|
|
||||||
1. **Resist to Character:** Many-to-many through `obj_character_resist` table
|
|
||||||
2. **Resist to Static Types:** One-to-many (via `static_resist_type.ResistTypeID`)
|
|
||||||
3. **Resist to Damage Types:** Direct mapping to game damage types
|
|
||||||
|
|
||||||
## Java Field to Database Column Mappings
|
|
||||||
|
|
||||||
| Java Field | Database Column | Notes |
|
|
||||||
|------------|-----------------|-------|
|
|
||||||
| `resistType` | `obj_resist.resistType` | Type of resistance (fire, ice, etc.) |
|
|
||||||
| `value` | `obj_resist.value` | Resistance value |
|
|
||||||
| `description` | `obj_resist.description` | Description of the resistance type |
|
|
||||||
|
|
||||||
## Notes
|
|
||||||
- Resistances are applied to various damage types in combat
|
|
||||||
- Character-specific resistances can be modified through equipment or abilities
|
|
||||||
- The system supports multiple resistance types for comprehensive damage mitigation
|
|
||||||
-77
@@ -1,77 +0,0 @@
|
|||||||
# Rune Base Attribute Handler Documentation
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
This document describes the database relationships and interactions for the `dbRuneBaseAttributeHandler` class. The rune base attribute handler manages the fundamental attributes and properties of rune base items in the Magicbane emulator system.
|
|
||||||
|
|
||||||
## Handler Class
|
|
||||||
**File:** `src/engine/db/handlers/dbRuneBaseAttributeHandler.java`
|
|
||||||
**Class:** `dbRuneBaseAttributeHandler`
|
|
||||||
**Extends:** `dbHandlerBase`
|
|
||||||
|
|
||||||
## Database Tables
|
|
||||||
|
|
||||||
### Main Table(s)
|
|
||||||
- **Table Name:** `obj_runebaseattribute`
|
|
||||||
- **Description:** Core rune base attribute information including name, description, and property values
|
|
||||||
- **Columns:**
|
|
||||||
- UID (Primary Key)
|
|
||||||
- name
|
|
||||||
- description
|
|
||||||
- attributeType
|
|
||||||
- minValue
|
|
||||||
- maxValue
|
|
||||||
- defaultValue
|
|
||||||
- isStackable
|
|
||||||
|
|
||||||
### Related Tables
|
|
||||||
|
|
||||||
| Table Name | Description | Relationship |
|
|
||||||
|------------|-------------|--------------|
|
|
||||||
| `obj_rune_baseattribute` | Links rune base items to their attributes | RuneBaseID → obj_runebase.UID, AttributeID → obj_runebaseattribute.UID |
|
|
||||||
| `static_rune_attribute_type` | Static definitions of attribute types | AttributeTypeID → obj_runebaseattribute.UID |
|
|
||||||
|
|
||||||
## Key Queries
|
|
||||||
|
|
||||||
### Get Rune Base Attribute by ID
|
|
||||||
```sql
|
|
||||||
SELECT * FROM `obj_runebaseattribute` WHERE `UID`=?
|
|
||||||
```
|
|
||||||
**File:** `dbRuneBaseAttributeHandler.java`, Line ~60
|
|
||||||
|
|
||||||
### Get Attributes for Rune Base
|
|
||||||
```sql
|
|
||||||
SELECT rba.*, rbaa.attributeValue
|
|
||||||
FROM `obj_runebaseattribute` rba
|
|
||||||
INNER JOIN `obj_rune_baseattribute` rbaa ON rba.`UID` = rbaa.`AttributeID`
|
|
||||||
WHERE rbaa.`RuneBaseID`=?
|
|
||||||
```
|
|
||||||
**File:** `dbRuneBaseAttributeHandler.java`, Line ~85
|
|
||||||
|
|
||||||
### Get Attribute by Type
|
|
||||||
```sql
|
|
||||||
SELECT * FROM `obj_runebaseattribute` WHERE `attributeType`=?
|
|
||||||
```
|
|
||||||
**File:** `dbRuneBaseAttributeHandler.java`, Line ~120
|
|
||||||
|
|
||||||
## Relationships
|
|
||||||
|
|
||||||
1. **Rune Base Attribute to Rune Base:** Many-to-many through `obj_rune_baseattribute` table
|
|
||||||
2. **Rune Base Attribute to Static Types:** One-to-many (via `static_rune_attribute_type.AttributeTypeID`)
|
|
||||||
3. **Attribute to Property Values:** Defines the range and default values for each attribute
|
|
||||||
|
|
||||||
## Java Field to Database Column Mappings
|
|
||||||
|
|
||||||
| Java Field | Database Column | Notes |
|
|
||||||
|------------|-----------------|-------|
|
|
||||||
| `name` | `obj_runebaseattribute.name` | Attribute name |
|
|
||||||
| `description` | `obj_runebaseattribute.description` | Description of the attribute |
|
|
||||||
| `attributeType` | `obj_runebaseattribute.attributeType` | Type of attribute (stat, effect, etc.) |
|
|
||||||
| `minValue` | `obj_runebaseattribute.minValue` | Minimum value allowed |
|
|
||||||
| `maxValue` | `obj_runebaseattribute.maxValue` | Maximum value allowed |
|
|
||||||
| `defaultValue` | `obj_runebaseattribute.defaultValue` | Default value for the attribute |
|
|
||||||
| `isStackable` | `obj_runebaseattribute.isStackable` | Whether the attribute can stack |
|
|
||||||
|
|
||||||
## Notes
|
|
||||||
- Rune base attributes define the core properties of rune items
|
|
||||||
- Attributes can be applied to different rune base types
|
|
||||||
- The system supports both fixed and variable attribute values
|
|
||||||
-77
@@ -1,77 +0,0 @@
|
|||||||
# Rune Base Effect Handler Documentation
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
This document describes the database relationships and interactions for the `dbRuneBaseEffectHandler` class. The rune base effect handler manages the effects and abilities that rune base items can provide in the Magicbane emulator system.
|
|
||||||
|
|
||||||
## Handler Class
|
|
||||||
**File:** `src/engine/db/handlers/dbRuneBaseEffectHandler.java`
|
|
||||||
**Class:** `dbRuneBaseEffectHandler`
|
|
||||||
**Extends:** `dbHandlerBase`
|
|
||||||
|
|
||||||
## Database Tables
|
|
||||||
|
|
||||||
### Main Table(s)
|
|
||||||
- **Table Name:** `obj_runebaseeffect`
|
|
||||||
- **Description:** Core rune base effect information including name, description, and activation properties
|
|
||||||
- **Columns:**
|
|
||||||
- UID (Primary Key)
|
|
||||||
- name
|
|
||||||
- description
|
|
||||||
- effectType
|
|
||||||
- activationType
|
|
||||||
- duration
|
|
||||||
- cooldownTime
|
|
||||||
- powerValue
|
|
||||||
|
|
||||||
### Related Tables
|
|
||||||
|
|
||||||
| Table Name | Description | Relationship |
|
|
||||||
|------------|-------------|--------------|
|
|
||||||
| `obj_rune_baseeffect` | Links rune base items to their effects | RuneBaseID → obj_runebase.UID, EffectID → obj_runebaseeffect.UID |
|
|
||||||
| `static_rune_effect_type` | Static definitions of effect types | EffectTypeID → obj_runebaseeffect.UID |
|
|
||||||
|
|
||||||
## Key Queries
|
|
||||||
|
|
||||||
### Get Rune Base Effect by ID
|
|
||||||
```sql
|
|
||||||
SELECT * FROM `obj_runebaseeffect` WHERE `UID`=?
|
|
||||||
```
|
|
||||||
**File:** `dbRuneBaseEffectHandler.java`, Line ~60
|
|
||||||
|
|
||||||
### Get Effects for Rune Base
|
|
||||||
```sql
|
|
||||||
SELECT rbe.*, rba.effectValue
|
|
||||||
FROM `obj_runebaseeffect` rbe
|
|
||||||
INNER JOIN `obj_rune_baseeffect` rba ON rbe.`UID` = rba.`EffectID`
|
|
||||||
WHERE rba.`RuneBaseID`=?
|
|
||||||
```
|
|
||||||
**File:** `dbRuneBaseEffectHandler.java`, Line ~85
|
|
||||||
|
|
||||||
### Get Effect by Type
|
|
||||||
```sql
|
|
||||||
SELECT * FROM `obj_runebaseeffect` WHERE `effectType`=?
|
|
||||||
```
|
|
||||||
**File:** `dbRuneBaseEffectHandler.java`, Line ~120
|
|
||||||
|
|
||||||
## Relationships
|
|
||||||
|
|
||||||
1. **Rune Base Effect to Rune Base:** Many-to-many through `obj_rune_baseeffect` table
|
|
||||||
2. **Rune Base Effect to Static Types:** One-to-many (via `static_rune_effect_type.EffectTypeID`)
|
|
||||||
3. **Effect to Activation Properties:** Defines how effects are triggered and applied
|
|
||||||
|
|
||||||
## Java Field to Database Column Mappings
|
|
||||||
|
|
||||||
| Java Field | Database Column | Notes |
|
|
||||||
|------------|-----------------|-------|
|
|
||||||
| `name` | `obj_runebaseeffect.name` | Effect name |
|
|
||||||
| `description` | `obj_runebaseeffect.description` | Description of the effect |
|
|
||||||
| `effectType` | `obj_runebaseeffect.effectType` | Type of effect (damage, healing, buff, etc.) |
|
|
||||||
| `activationType` | `obj_runebaseeffect.activationType` | How the effect is activated |
|
|
||||||
| `duration` | `obj_runebaseeffect.duration` | Duration of effect in seconds |
|
|
||||||
| `cooldownTime` | `obj_runebaseeffect.cooldownTime` | Cooldown period between activations |
|
|
||||||
| `powerValue` | `obj_runebaseeffect.powerValue` | Strength or power value of the effect |
|
|
||||||
|
|
||||||
## Notes
|
|
||||||
- Rune base effects define the abilities and powers that runes can provide
|
|
||||||
- Effects have various activation methods (passive, active, triggered)
|
|
||||||
- The system supports duration-based and cooldown-based effects
|
|
||||||
-76
@@ -1,76 +0,0 @@
|
|||||||
# Rune Base Handler Documentation
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
This document describes the database relationships and interactions for the `dbRuneBaseHandler` class. The rune base handler manages the base definitions and properties of rune items in the Magicbane emulator system.
|
|
||||||
|
|
||||||
## Handler Class
|
|
||||||
**File:** `src/engine/db/handlers/dbRuneBaseHandler.java`
|
|
||||||
**Class:** `dbRuneBaseHandler`
|
|
||||||
**Extends:** `dbHandlerBase`
|
|
||||||
|
|
||||||
## Database Tables
|
|
||||||
|
|
||||||
### Main Table(s)
|
|
||||||
- **Table Name:** `obj_runebase`
|
|
||||||
- **Description:** Core rune base item information including name, description, and basic properties
|
|
||||||
- **Columns:**
|
|
||||||
- UID (Primary Key)
|
|
||||||
- name
|
|
||||||
- description
|
|
||||||
- itemType
|
|
||||||
- rarity
|
|
||||||
- iconID
|
|
||||||
- value
|
|
||||||
- weight
|
|
||||||
|
|
||||||
### Related Tables
|
|
||||||
|
|
||||||
| Table Name | Description | Relationship |
|
|
||||||
|------------|-------------|--------------|
|
|
||||||
| `obj_rune_baseattribute` | Links rune base items to their attributes | RuneBaseID → obj_runebase.UID, AttributeID → obj_runebaseattribute.UID |
|
|
||||||
| `obj_rune_baseeffect` | Links rune base items to their effects | RuneBaseID → obj_runebase.UID, EffectID → obj_runebaseeffect.UID |
|
|
||||||
| `static_rune_type` | Static definitions of rune types | RuneTypeID → obj_runebase.UID |
|
|
||||||
|
|
||||||
## Key Queries
|
|
||||||
|
|
||||||
### Get Rune Base by ID
|
|
||||||
```sql
|
|
||||||
SELECT * FROM `obj_runebase` WHERE `UID`=?
|
|
||||||
```
|
|
||||||
**File:** `dbRuneBaseHandler.java`, Line ~60
|
|
||||||
|
|
||||||
### Get All Rune Bases
|
|
||||||
```sql
|
|
||||||
SELECT * FROM `obj_runebase`
|
|
||||||
```
|
|
||||||
**File:** `dbRuneBaseHandler.java`, Line ~85
|
|
||||||
|
|
||||||
### Get Rune Base by Type
|
|
||||||
```sql
|
|
||||||
SELECT * FROM `obj_runebase` WHERE `itemType`=?
|
|
||||||
```
|
|
||||||
**File:** `dbRuneBaseHandler.java`, Line ~120
|
|
||||||
|
|
||||||
## Relationships
|
|
||||||
|
|
||||||
1. **Rune Base to Attributes:** Many-to-many through `obj_rune_baseattribute` table
|
|
||||||
2. **Rune Base to Effects:** Many-to-many through `obj_rune_baseeffect` table
|
|
||||||
3. **Rune Base to Static Types:** One-to-many (via `static_rune_type.RuneTypeID`)
|
|
||||||
4. **Rune Base to Item Properties:** Defines the core characteristics of rune items
|
|
||||||
|
|
||||||
## Java Field to Database Column Mappings
|
|
||||||
|
|
||||||
| Java Field | Database Column | Notes |
|
|
||||||
|------------|-----------------|-------|
|
|
||||||
| `name` | `obj_runebase.name` | Rune base name |
|
|
||||||
| `description` | `obj_runebase.description` | Description of the rune |
|
|
||||||
| `itemType` | `obj_runebase.itemType` | Type of rune (weapon, armor, etc.) |
|
|
||||||
| `rarity` | `obj_runebase.rarity` | Rarity level of the rune |
|
|
||||||
| `iconID` | `obj_runebase.iconID` | Icon identifier for UI display |
|
|
||||||
| `value` | `obj_runebase.value` | Value or worth of the rune |
|
|
||||||
| `weight` | `obj_runebase.weight` | Weight of the rune item |
|
|
||||||
|
|
||||||
## Notes
|
|
||||||
- Rune bases define the fundamental properties of all rune items in the game
|
|
||||||
- Each rune base can have multiple attributes and effects associated with it
|
|
||||||
- The system supports various rune types with different characteristics
|
|
||||||
-78
@@ -1,78 +0,0 @@
|
|||||||
# Runegate Handler Documentation
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
This document describes the database relationships and interactions for the `dbRunegateHandler` class. The runegate handler manages runegate structures and their properties in the Magicbane emulator system.
|
|
||||||
|
|
||||||
## Handler Class
|
|
||||||
**File:** `src/engine/db/handlers/dbRunegateHandler.java`
|
|
||||||
**Class:** `dbRunegateHandler`
|
|
||||||
**Extends:** `dbHandlerBase`
|
|
||||||
|
|
||||||
## Database Tables
|
|
||||||
|
|
||||||
### Main Table(s)
|
|
||||||
- **Table Name:** `obj_runegate`
|
|
||||||
- **Description:** Core runegate information including location, properties, and activation status
|
|
||||||
- **Columns:**
|
|
||||||
- UID (Primary Key)
|
|
||||||
- name
|
|
||||||
- description
|
|
||||||
- locationX
|
|
||||||
- locationY
|
|
||||||
- locationZ
|
|
||||||
- isActive
|
|
||||||
- activationTime
|
|
||||||
- cooldownPeriod
|
|
||||||
- destinationRealmID
|
|
||||||
|
|
||||||
### Related Tables
|
|
||||||
|
|
||||||
| Table Name | Description | Relationship |
|
|
||||||
|------------|-------------|--------------|
|
|
||||||
| `obj_runegate_connection` | Links runegates to their destinations | SourceRunegateID → obj_runegate.UID, DestinationRunegateID → obj_runegate.UID |
|
|
||||||
| `dyn_runegate_usage` | Tracks usage history of runegates | RunegateID → obj_runegate.UID, CharacterID → obj_character.UID |
|
|
||||||
|
|
||||||
## Key Queries
|
|
||||||
|
|
||||||
### Get Runegate by ID
|
|
||||||
```sql
|
|
||||||
SELECT * FROM `obj_runegate` WHERE `UID`=?
|
|
||||||
```
|
|
||||||
**File:** `dbRunegateHandler.java`, Line ~60
|
|
||||||
|
|
||||||
### Get Active Runegates
|
|
||||||
```sql
|
|
||||||
SELECT * FROM `obj_runegate` WHERE `isActive`=1
|
|
||||||
```
|
|
||||||
**File:** `dbRunegateHandler.java`, Line ~85
|
|
||||||
|
|
||||||
### Get Runegate by Location
|
|
||||||
```sql
|
|
||||||
SELECT * FROM `obj_runegate` WHERE `locationX`=? AND `locationY`=? AND `locationZ`=?
|
|
||||||
```
|
|
||||||
**File:** `dbRunegateHandler.java`, Line ~120
|
|
||||||
|
|
||||||
## Relationships
|
|
||||||
|
|
||||||
1. **Runegate to Connections:** Many-to-many through `obj_runegate_connection` table
|
|
||||||
2. **Runegate to Usage History:** One-to-many (via `dyn_runegate_usage.RunegateID`)
|
|
||||||
3. **Runegate to Destination Realms:** Links runegates to different game realms
|
|
||||||
|
|
||||||
## Java Field to Database Column Mappings
|
|
||||||
|
|
||||||
| Java Field | Database Column | Notes |
|
|
||||||
|------------|-----------------|-------|
|
|
||||||
| `name` | `obj_runegate.name` | Runegate name |
|
|
||||||
| `description` | `obj_runegate.description` | Description of the runegate |
|
|
||||||
| `locationX` | `obj_runegate.locationX` | X coordinate of runegate location |
|
|
||||||
| `locationY` | `obj_runegate.locationY` | Y coordinate of runegate location |
|
|
||||||
| `locationZ` | `obj_runegate.locationZ` | Z coordinate of runegate location |
|
|
||||||
| `isActive` | `obj_runegate.isActive` | Whether the runegate is currently active |
|
|
||||||
| `activationTime` | `obj_runegate.activationTime` | Time when runegate was last activated |
|
|
||||||
| `cooldownPeriod` | `obj_runegate.cooldownPeriod` | Cooldown period between uses |
|
|
||||||
| `destinationRealmID` | `obj_runegate.destinationRealmID` | Realm ID for destination |
|
|
||||||
|
|
||||||
## Notes
|
|
||||||
- Runegates function as teleportation devices in the game world
|
|
||||||
- They can connect to other runegates in different locations or realms
|
|
||||||
- The system tracks usage history for balance and maintenance purposes
|
|
||||||
-78
@@ -1,78 +0,0 @@
|
|||||||
# Shrine Handler Documentation
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
This document describes the database relationships and interactions for the `dbShrineHandler` class. The shrine handler manages shrine structures and their properties in the Magicbane emulator system.
|
|
||||||
|
|
||||||
## Handler Class
|
|
||||||
**File:** `src/engine/db/handlers/dbShrineHandler.java`
|
|
||||||
**Class:** `dbShrineHandler`
|
|
||||||
**Extends:** `dbHandlerBase`
|
|
||||||
|
|
||||||
## Database Tables
|
|
||||||
|
|
||||||
### Main Table(s)
|
|
||||||
- **Table Name:** `obj_shrine`
|
|
||||||
- **Description:** Core shrine information including location, properties, and effects
|
|
||||||
- **Columns:**
|
|
||||||
- UID (Primary Key)
|
|
||||||
- name
|
|
||||||
- description
|
|
||||||
- locationX
|
|
||||||
- locationY
|
|
||||||
- locationZ
|
|
||||||
- shrineType
|
|
||||||
- isActive
|
|
||||||
- effectDuration
|
|
||||||
- effectPower
|
|
||||||
|
|
||||||
### Related Tables
|
|
||||||
|
|
||||||
| Table Name | Description | Relationship |
|
|
||||||
|------------|-------------|--------------|
|
|
||||||
| `obj_shrine_effect` | Defines effects provided by shrines | ShrineID → obj_shrine.UID, EffectID → obj_shrineeffect.UID |
|
|
||||||
| `dyn_shrine_usage` | Tracks usage history of shrines | ShrineID → obj_shrine.UID, CharacterID → obj_character.UID |
|
|
||||||
|
|
||||||
## Key Queries
|
|
||||||
|
|
||||||
### Get Shrine by ID
|
|
||||||
```sql
|
|
||||||
SELECT * FROM `obj_shrine` WHERE `UID`=?
|
|
||||||
```
|
|
||||||
**File:** `dbShrineHandler.java`, Line ~60
|
|
||||||
|
|
||||||
### Get Active Shrines
|
|
||||||
```sql
|
|
||||||
SELECT * FROM `obj_shrine` WHERE `isActive`=1
|
|
||||||
```
|
|
||||||
**File:** `dbShrineHandler.java`, Line ~85
|
|
||||||
|
|
||||||
### Get Shrine by Location
|
|
||||||
```sql
|
|
||||||
SELECT * FROM `obj_shrine` WHERE `locationX`=? AND `locationY`=? AND `locationZ`=?
|
|
||||||
```
|
|
||||||
**File:** `dbShrineHandler.java`, Line ~120
|
|
||||||
|
|
||||||
## Relationships
|
|
||||||
|
|
||||||
1. **Shrine to Effects:** Many-to-many through `obj_shrine_effect` table
|
|
||||||
2. **Shrine to Usage History:** One-to-many (via `dyn_shrine_usage.ShrineID`)
|
|
||||||
3. **Shrine to Shrine Types:** Different types of shrines with different effects
|
|
||||||
|
|
||||||
## Java Field to Database Column Mappings
|
|
||||||
|
|
||||||
| Java Field | Database Column | Notes |
|
|
||||||
|------------|-----------------|-------|
|
|
||||||
| `name` | `obj_shrine.name` | Shrine name |
|
|
||||||
| `description` | `obj_shrine.description` | Description of the shrine |
|
|
||||||
| `locationX` | `obj_shrine.locationX` | X coordinate of shrine location |
|
|
||||||
| `locationY` | `obj_shrine.locationY` | Y coordinate of shrine location |
|
|
||||||
| `locationZ` | `obj_shrine.locationZ` | Z coordinate of shrine location |
|
|
||||||
| `shrineType` | `obj_shrine.shrineType` | Type of shrine (healing, buff, etc.) |
|
|
||||||
| `isActive` | `obj_shrine.isActive` | Whether the shrine is currently active |
|
|
||||||
| `effectDuration` | `obj_shrine.effectDuration` | Duration of shrine effects |
|
|
||||||
| `effectPower` | `obj_shrine.effectPower` | Power level of shrine effects |
|
|
||||||
|
|
||||||
## Notes
|
|
||||||
- Shrines provide various beneficial effects to players who interact with them
|
|
||||||
- They can be healing shrines, buff shrines, or other special effect shrines
|
|
||||||
- The system tracks usage history for balance and maintenance purposes
|
|
||||||
-81
@@ -1,81 +0,0 @@
|
|||||||
# Skill Base Handler Documentation
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
This document describes the database relationships and interactions for the `dbSkillBaseHandler` class. The skill base handler manages the fundamental definitions and properties of skills in the Magicbane emulator system.
|
|
||||||
|
|
||||||
## Handler Class
|
|
||||||
**File:** `src/engine/db/handlers/dbSkillBaseHandler.java`
|
|
||||||
**Class:** `dbSkillBaseHandler`
|
|
||||||
**Extends:** `dbHandlerBase`
|
|
||||||
|
|
||||||
## Database Tables
|
|
||||||
|
|
||||||
### Main Table(s)
|
|
||||||
- **Table Name:** `obj_skillbase`
|
|
||||||
- **Description:** Core skill base information including name, description, and activation properties
|
|
||||||
- **Columns:**
|
|
||||||
- UID (Primary Key)
|
|
||||||
- name
|
|
||||||
- description
|
|
||||||
- skillType
|
|
||||||
- activationType
|
|
||||||
- cooldownTime
|
|
||||||
- duration
|
|
||||||
- maxLevel
|
|
||||||
- cost
|
|
||||||
- iconID
|
|
||||||
|
|
||||||
### Related Tables
|
|
||||||
|
|
||||||
| Table Name | Description | Relationship |
|
|
||||||
|------------|-------------|--------------|
|
|
||||||
| `obj_character_skill` | Tracks character-specific skill levels and status | CharacterID → obj_character.UID, SkillID → obj_skillbase.UID |
|
|
||||||
| `static_skill_requirement` | Stores requirements for unlocking skills | SkillID → obj_skillbase.UID |
|
|
||||||
|
|
||||||
## Key Queries
|
|
||||||
|
|
||||||
### Get Skill Base by ID
|
|
||||||
```sql
|
|
||||||
SELECT * FROM `obj_skillbase` WHERE `UID`=?
|
|
||||||
```
|
|
||||||
**File:** `dbSkillBaseHandler.java`, Line ~60
|
|
||||||
|
|
||||||
### Get Character's Skills
|
|
||||||
```sql
|
|
||||||
SELECT s.*, cs.level, cs.isUnlocked
|
|
||||||
FROM `obj_skillbase` s
|
|
||||||
INNER JOIN `obj_character_skill` cs ON s.`UID` = cs.`SkillID`
|
|
||||||
WHERE cs.`CharacterID`=?
|
|
||||||
```
|
|
||||||
**File:** `dbSkillBaseHandler.java`, Line ~85
|
|
||||||
|
|
||||||
### Get Skill Requirements
|
|
||||||
```sql
|
|
||||||
SELECT * FROM `static_skill_requirement` WHERE `SkillID`=?
|
|
||||||
```
|
|
||||||
**File:** `dbSkillBaseHandler.java`, Line ~120
|
|
||||||
|
|
||||||
## Relationships
|
|
||||||
|
|
||||||
1. **Skill Base to Character:** Many-to-many through `obj_character_skill` table
|
|
||||||
2. **Skill Base to Requirements:** One-to-many (via `static_skill_requirement.SkillID`)
|
|
||||||
3. **Skill Base to Static Data:** Skill definitions are stored in static tables
|
|
||||||
|
|
||||||
## Java Field to Database Column Mappings
|
|
||||||
|
|
||||||
| Java Field | Database Column | Notes |
|
|
||||||
|------------|-----------------|-------|
|
|
||||||
| `name` | `obj_skillbase.name` | Skill name |
|
|
||||||
| `description` | `obj_skillbase.description` | Skill description |
|
|
||||||
| `skillType` | `obj_skillbase.skillType` | Type of skill (attack, defense, support) |
|
|
||||||
| `activationType` | `obj_skillbase.activationType` | How the skill is activated |
|
|
||||||
| `cooldownTime` | `obj_skillbase.cooldownTime` | Cooldown period in seconds |
|
|
||||||
| `duration` | `obj_skillbase.duration` | Duration of skill effect |
|
|
||||||
| `maxLevel` | `obj_skillbase.maxLevel` | Maximum level for this skill |
|
|
||||||
| `cost` | `obj_skillbase.cost` | Resource cost to use skill |
|
|
||||||
| `iconID` | `obj_skillbase.iconID` | Icon identifier for UI display |
|
|
||||||
|
|
||||||
## Notes
|
|
||||||
- Skill bases define the core properties of all skills in the game
|
|
||||||
- Skills can be activated in various ways (instant, channeling, etc.)
|
|
||||||
- The system supports both unlocked and locked skill progression
|
|
||||||
-75
@@ -1,75 +0,0 @@
|
|||||||
# Skill Requirement Handler Documentation
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
This document describes the database relationships and interactions for the `dbSkillReqHandler` class. The skill requirement handler manages the prerequisites and conditions needed to unlock or use various skills in the Magicbane emulator system.
|
|
||||||
|
|
||||||
## Handler Class
|
|
||||||
**File:** `src/engine/db/handlers/dbSkillReqHandler.java`
|
|
||||||
**Class:** `dbSkillReqHandler`
|
|
||||||
**Extends:** `dbHandlerBase`
|
|
||||||
|
|
||||||
## Database Tables
|
|
||||||
|
|
||||||
### Main Table(s)
|
|
||||||
- **Table Name:** `static_skill_requirement`
|
|
||||||
- **Description:** Core skill requirement information including type, value, and conditions
|
|
||||||
- **Columns:**
|
|
||||||
- UID (Primary Key)
|
|
||||||
- skillID
|
|
||||||
- requirementType
|
|
||||||
- requirementValue
|
|
||||||
- prerequisiteSkillID
|
|
||||||
- prerequisiteLevel
|
|
||||||
- prerequisiteStat
|
|
||||||
|
|
||||||
### Related Tables
|
|
||||||
|
|
||||||
| Table Name | Description | Relationship |
|
|
||||||
|------------|-------------|--------------|
|
|
||||||
| `obj_skillbase` | Links to the skill that has requirements | SkillID → obj_skillbase.UID |
|
|
||||||
| `obj_character_skill` | Tracks character-specific skill status | CharacterID → obj_character.UID, SkillID → obj_skillbase.UID |
|
|
||||||
|
|
||||||
## Key Queries
|
|
||||||
|
|
||||||
### Get Skill Requirements by Skill ID
|
|
||||||
```sql
|
|
||||||
SELECT * FROM `static_skill_requirement` WHERE `skillID`=?
|
|
||||||
```
|
|
||||||
**File:** `dbSkillReqHandler.java`, Line ~60
|
|
||||||
|
|
||||||
### Get Specific Requirement by ID
|
|
||||||
```sql
|
|
||||||
SELECT * FROM `static_skill_requirement` WHERE `UID`=?
|
|
||||||
```
|
|
||||||
**File:** `dbSkillReqHandler.java`, Line ~85
|
|
||||||
|
|
||||||
### Get Requirements for Character Skill
|
|
||||||
```sql
|
|
||||||
SELECT sr.*, cs.level as characterLevel
|
|
||||||
FROM `static_skill_requirement` sr
|
|
||||||
LEFT JOIN `obj_character_skill` cs ON sr.`prerequisiteSkillID` = cs.`SkillID`
|
|
||||||
WHERE sr.`skillID`=?
|
|
||||||
```
|
|
||||||
**File:** `dbSkillReqHandler.java`, Line ~120
|
|
||||||
|
|
||||||
## Relationships
|
|
||||||
|
|
||||||
1. **Skill Requirement to Skill Base:** Many-to-one (via `skillID` → obj_skillbase.UID)
|
|
||||||
2. **Skill Requirement to Prerequisite Skills:** Many-to-one (via `prerequisiteSkillID` → obj_skillbase.UID)
|
|
||||||
3. **Skill Requirement to Character Skills:** One-to-many through character skill tracking
|
|
||||||
|
|
||||||
## Java Field to Database Column Mappings
|
|
||||||
|
|
||||||
| Java Field | Database Column | Notes |
|
|
||||||
|------------|-----------------|-------|
|
|
||||||
| `skillID` | `static_skill_requirement.skillID` | Reference to the skill that requires this condition |
|
|
||||||
| `requirementType` | `static_skill_requirement.requirementType` | Type of requirement (level, skill, stat) |
|
|
||||||
| `requirementValue` | `static_skill_requirement.requirementValue` | Value needed for requirement |
|
|
||||||
| `prerequisiteSkillID` | `static_skill_requirement.prerequisiteSkillID` | Prerequisite skill ID if applicable |
|
|
||||||
| `prerequisiteLevel` | `static_skill_requirement.prerequisiteLevel` | Required level of prerequisite skill |
|
|
||||||
| `prerequisiteStat` | `static_skill_requirement.prerequisiteStat` | Required stat value if applicable |
|
|
||||||
|
|
||||||
## Notes
|
|
||||||
- Skill requirements define the conditions needed to unlock or use skills
|
|
||||||
- Requirements can be based on character level, other skills, or specific stats
|
|
||||||
- The system supports complex requirement chains for advanced skill trees
|
|
||||||
-72
@@ -1,72 +0,0 @@
|
|||||||
# Vendor Dialog Handler Documentation
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
This document describes the database relationships and interactions for the `dbVendorDialogHandler` class. The vendor dialog handler manages the dialog systems and interaction options for NPC vendors in the Magicbane emulator system.
|
|
||||||
|
|
||||||
## Handler Class
|
|
||||||
**File:** `src/engine/db/handlers/dbVendorDialogHandler.java`
|
|
||||||
**Class:** `dbVendorDialogHandler`
|
|
||||||
**Extends:** `dbHandlerBase`
|
|
||||||
|
|
||||||
## Database Tables
|
|
||||||
|
|
||||||
### Main Table(s)
|
|
||||||
- **Table Name:** `static_npc_dialog`
|
|
||||||
- **Description:** Core vendor dialog information including text, options, and responses
|
|
||||||
- **Columns:**
|
|
||||||
- UID (Primary Key)
|
|
||||||
- npcID
|
|
||||||
- dialogText
|
|
||||||
- responseType
|
|
||||||
- nextDialogID
|
|
||||||
- isFinal
|
|
||||||
- triggerEvent
|
|
||||||
|
|
||||||
### Related Tables
|
|
||||||
|
|
||||||
| Table Name | Description | Relationship |
|
|
||||||
|------------|-------------|--------------|
|
|
||||||
| `static_npc_dialog_option` | Defines available options for each dialog | DialogID → static_npc_dialog.UID |
|
|
||||||
| `obj_npc` | Links to the NPC that has this dialog system | npcID → obj_npc.UID |
|
|
||||||
|
|
||||||
## Key Queries
|
|
||||||
|
|
||||||
### Get Dialog by ID
|
|
||||||
```sql
|
|
||||||
SELECT * FROM `static_npc_dialog` WHERE `UID`=?
|
|
||||||
```
|
|
||||||
**File:** `dbVendorDialogHandler.java`, Line ~60
|
|
||||||
|
|
||||||
### Get Dialog Options for Dialog
|
|
||||||
```sql
|
|
||||||
SELECT * FROM `static_npc_dialog_option` WHERE `dialogID`=?
|
|
||||||
```
|
|
||||||
**File:** `dbVendorDialogHandler.java`, Line ~85
|
|
||||||
|
|
||||||
### Get Initial Dialog for NPC
|
|
||||||
```sql
|
|
||||||
SELECT * FROM `static_npc_dialog` WHERE `npcID`=? AND `nextDialogID` IS NULL
|
|
||||||
```
|
|
||||||
**File:** `dbVendorDialogHandler.java`, Line ~120
|
|
||||||
|
|
||||||
## Relationships
|
|
||||||
|
|
||||||
1. **Dialog to Options:** One-to-many (via `dialogID` → static_npc_dialog.UID)
|
|
||||||
2. **Dialog to NPC:** Many-to-one (via `npcID` → obj_npc.UID)
|
|
||||||
3. **Dialog to Next Dialog:** Chain of dialog progression through `nextDialogID`
|
|
||||||
|
|
||||||
## Java Field to Database Column Mappings
|
|
||||||
|
|
||||||
| Java Field | Database Column | Notes |
|
|
||||||
|------------|-----------------|-------|
|
|
||||||
| `npcID` | `static_npc_dialog.npcID` | Reference to the NPC this dialog belongs to |
|
|
||||||
| `dialogText` | `static_npc_dialog.dialogText` | Text displayed in the dialog |
|
|
||||||
| `responseType` | `static_npc_dialog.responseType` | Type of response expected (buy, sell, quest) |
|
|
||||||
| `nextDialogID` | `static_npc_dialog.nextDialogID` | ID of next dialog in sequence |
|
|
||||||
| `isFinal` | `static_npc_dialog.isFinal` | Whether this is the final dialog in chain |
|
|
||||||
| `triggerEvent` | `static_npc_dialog.triggerEvent` | Event that triggers this dialog |
|
|
||||||
|
|
||||||
## Notes
|
|
||||||
- Vendor dialogs provide interactive communication with NPCs
|
|
||||||
- Dialog systems support branching conversations and quest progression
|
|
||||||
- The system handles complex dialog chains with multiple options and outcomes
|
|
||||||
-83
@@ -1,83 +0,0 @@
|
|||||||
# Warehouse Handler Documentation
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
This document describes the database relationships and interactions for the `dbWarehouseHandler` class. The warehouse handler manages storage systems and inventory management for characters in the Magicbane emulator system.
|
|
||||||
|
|
||||||
## Handler Class
|
|
||||||
**File:** `src/engine/db/handlers/dbWarehouseHandler.java`
|
|
||||||
**Class:** `dbWarehouseHandler`
|
|
||||||
**Extends:** `dbHandlerBase`
|
|
||||||
|
|
||||||
## Database Tables
|
|
||||||
|
|
||||||
### Main Table(s)
|
|
||||||
- **Table Name:** `obj_warehouse`
|
|
||||||
- **Description:** Core warehouse information including storage capacity and location
|
|
||||||
- **Columns:**
|
|
||||||
- UID (Primary Key)
|
|
||||||
- name
|
|
||||||
- description
|
|
||||||
- characterID
|
|
||||||
- storageCapacity
|
|
||||||
- currentStorage
|
|
||||||
- locationX
|
|
||||||
- locationY
|
|
||||||
- locationZ
|
|
||||||
- isPublic
|
|
||||||
|
|
||||||
### Related Tables
|
|
||||||
|
|
||||||
| Table Name | Description | Relationship |
|
|
||||||
|------------|-------------|--------------|
|
|
||||||
| `obj_warehouse_item` | Tracks items stored in warehouses | WarehouseID → obj_warehouse.UID, ItemID → obj_item.UID |
|
|
||||||
| `obj_character_warehouse` | Links characters to their warehouse access | CharacterID → obj_character.UID, WarehouseID → obj_warehouse.UID |
|
|
||||||
|
|
||||||
## Key Queries
|
|
||||||
|
|
||||||
### Get Warehouse by ID
|
|
||||||
```sql
|
|
||||||
SELECT * FROM `obj_warehouse` WHERE `UID`=?
|
|
||||||
```
|
|
||||||
**File:** `dbWarehouseHandler.java`, Line ~60
|
|
||||||
|
|
||||||
### Get Character's Warehouses
|
|
||||||
```sql
|
|
||||||
SELECT w.* FROM `obj_warehouse` w
|
|
||||||
INNER JOIN `obj_character_warehouse` cw ON w.`UID` = cw.`WarehouseID`
|
|
||||||
WHERE cw.`CharacterID`=?
|
|
||||||
```
|
|
||||||
**File:** `dbWarehouseHandler.java`, Line ~85
|
|
||||||
|
|
||||||
### Get Warehouse Items
|
|
||||||
```sql
|
|
||||||
SELECT i.*, wi.quantity
|
|
||||||
FROM `obj_item` i
|
|
||||||
INNER JOIN `obj_warehouse_item` wi ON i.`UID` = wi.`ItemID`
|
|
||||||
WHERE wi.`WarehouseID`=?
|
|
||||||
```
|
|
||||||
**File:** `dbWarehouseHandler.java`, Line ~120
|
|
||||||
|
|
||||||
## Relationships
|
|
||||||
|
|
||||||
1. **Warehouse to Items:** Many-to-many through `obj_warehouse_item` table
|
|
||||||
2. **Warehouse to Characters:** Many-to-many through `obj_character_warehouse` table
|
|
||||||
3. **Warehouse to Storage Capacity:** Tracks current and maximum storage limits
|
|
||||||
|
|
||||||
## Java Field to Database Column Mappings
|
|
||||||
|
|
||||||
| Java Field | Database Column | Notes |
|
|
||||||
|------------|-----------------|-------|
|
|
||||||
| `name` | `obj_warehouse.name` | Warehouse name |
|
|
||||||
| `description` | `obj_warehouse.description` | Description of the warehouse |
|
|
||||||
| `characterID` | `obj_warehouse.characterID` | Character who owns this warehouse |
|
|
||||||
| `storageCapacity` | `obj_warehouse.storageCapacity` | Maximum storage capacity |
|
|
||||||
| `currentStorage` | `obj_warehouse.currentStorage` | Current amount of stored items |
|
|
||||||
| `locationX` | `obj_warehouse.locationX` | X coordinate of warehouse location |
|
|
||||||
| `locationY` | `obj_warehouse.locationY` | Y coordinate of warehouse location |
|
|
||||||
| `locationZ` | `obj_warehouse.locationZ` | Z coordinate of warehouse location |
|
|
||||||
| `isPublic` | `obj_warehouse.isPublic` | Whether the warehouse is publicly accessible |
|
|
||||||
|
|
||||||
## Notes
|
|
||||||
- Warehouses provide extended storage for character inventories
|
|
||||||
- Multiple characters can access shared warehouses
|
|
||||||
- The system tracks both storage capacity and current usage
|
|
||||||
@@ -1,201 +0,0 @@
|
|||||||
# Magicbane Database Handler Documentation Index
|
|
||||||
|
|
||||||
This index provides an overview of all database handler documentation files created for the Magicbane emulator project.
|
|
||||||
|
|
||||||
## Available Documentation Files
|
|
||||||
|
|
||||||
1. **dbAccountHandler_Documentation.md**
|
|
||||||
- Documents account management functionality including authentication and account status tracking
|
|
||||||
- Covers `obj_account` table and its relationships to character objects
|
|
||||||
|
|
||||||
2. **dbCityHandler_Documentation.md**
|
|
||||||
- Documents city management functionality including city creation, zones, and buildings
|
|
||||||
- Covers `obj_city`, `obj_zone`, and `obj_building` tables
|
|
||||||
|
|
||||||
3. **dbPlayerCharacterHandler_Documentation.md**
|
|
||||||
- Describes player character handling including creation, updates, and retrieval operations
|
|
||||||
- Covers `obj_character` table and related dynamic tables
|
|
||||||
|
|
||||||
4. **dbRaceHandler_Documentation.md**
|
|
||||||
- Describes race-related data handling for beard colors and styles
|
|
||||||
- Focuses on static race data tables
|
|
||||||
|
|
||||||
5. **dbGuildHandler_Documentation.md**
|
|
||||||
- Describes the complex guild system with relationships to history, alliances, enemies, and member management
|
|
||||||
- Covers multiple related tables including `obj_guild`, `dyn_character_guildhistory`, `dyn_guild_allianceenemylist`, etc.
|
|
||||||
|
|
||||||
6. **dbBaneHandler_Documentation.md**
|
|
||||||
- Documents bane management functionality for city-based special objects
|
|
||||||
- Covers `dyn_banes` table and its relationships to cities, players, and buildings
|
|
||||||
|
|
||||||
7. **dbCSSessionHandler_Documentation.md**
|
|
||||||
- Documents client session management including session creation, retrieval, updating, and deletion
|
|
||||||
- Covers `dyn_session` table and its relationships to accounts and characters
|
|
||||||
|
|
||||||
8. **dbKitHandler_Documentation.md**
|
|
||||||
- Documents kit management functionality for static kit data
|
|
||||||
- Covers `static_rune_validkit` table and its relationships to races, classes, and items
|
|
||||||
|
|
||||||
9. **dbLootHandler_Documentation.md**
|
|
||||||
- Documents loot system functionality including general tables, item tables, modifier tables, and booty sets
|
|
||||||
- Covers `static_loot_gen`, `static_loot_item`, `static_loot_mod`, `static_loot_modtype`, and `static_loot_bootySet` tables
|
|
||||||
|
|
||||||
10. **dbMenuHandler_Documentation.md**
|
|
||||||
- Documents NPC menu option handling including retrieval of menu options by menu ID
|
|
||||||
- Covers `static_npc_menuoption` table
|
|
||||||
|
|
||||||
11. **dbContractHandler_Documentation.md**
|
|
||||||
- Documents contract management functionality for player contracts and quest tracking
|
|
||||||
- Covers `dyn_contract` table and its relationships to characters and quests
|
|
||||||
|
|
||||||
12. **dbEffectsBaseHandler_Documentation.md**
|
|
||||||
- Documents effect base data handling including effect types, categories, and properties
|
|
||||||
- Covers `static_effect_base` table and related lookup tables
|
|
||||||
|
|
||||||
13. **dbEffectsResourceCostHandler_Documentation.md**
|
|
||||||
- Documents resource cost handling for game effects and abilities
|
|
||||||
- Covers `static_effect_resourcecost` table and its relationships to effects and resources
|
|
||||||
|
|
||||||
14. **dbEnchantmentHandler_Documentation.md**
|
|
||||||
- Documents enchantment management functionality for item enhancements
|
|
||||||
- Covers `dyn_enchantment` table and related data structures
|
|
||||||
|
|
||||||
15. **dbHeightMapHandler_Documentation.md**
|
|
||||||
- Documents height map data handling for terrain and elevation information
|
|
||||||
- Covers `static_heightmap` table and its spatial data relationships
|
|
||||||
|
|
||||||
16. **dbItemBaseHandler_Documentation.md**
|
|
||||||
- Documents base item data handling including item properties, types, and categories
|
|
||||||
- Covers `static_item_base` table and related lookup tables
|
|
||||||
|
|
||||||
17. **dbItemHandler_Documentation.md**
|
|
||||||
- Documents item management functionality for player inventory and items
|
|
||||||
- Covers `dyn_item` table and its relationships to characters and locations
|
|
||||||
|
|
||||||
18. **dbMineHandler_Documentation.md**
|
|
||||||
- Documents mine management functionality including resource extraction and mining operations
|
|
||||||
- Covers `dyn_mine` table and related mining data structures
|
|
||||||
|
|
||||||
19. **dbMobBaseHandler_Documentation.md**
|
|
||||||
- Documents base mob data handling including mob types, stats, and behaviors
|
|
||||||
- Covers `static_mob_base` table and related lookup tables
|
|
||||||
|
|
||||||
20. **dbMobHandler_Documentation.md**
|
|
||||||
- Documents mob management functionality for NPC creatures and monster behavior
|
|
||||||
- Covers `dyn_mob` table and its relationships to zones and character data
|
|
||||||
|
|
||||||
21. **dbNPCHandler_Documentation.md**
|
|
||||||
- Documents NPC handling including conversation systems and NPC properties
|
|
||||||
- Covers `dyn_npc` table and related interaction data
|
|
||||||
|
|
||||||
22. **dbPetitionHandler_Documentation.md**
|
|
||||||
- Documents petition management functionality for player support requests
|
|
||||||
- Covers `dyn_petition` table and its relationships to accounts and characters
|
|
||||||
|
|
||||||
23. **dbPowerHandler_Documentation.md**
|
|
||||||
- Documents power handling including character abilities, skills, and power systems
|
|
||||||
- Covers `static_power_base`, `dyn_character_power`, and related tables
|
|
||||||
|
|
||||||
24. **dbPromotionClassHandler_Documentation.md**
|
|
||||||
- Documents promotion class handling for character advancement and class changes
|
|
||||||
- Covers `static_promotion_class` table and related data structures
|
|
||||||
|
|
||||||
25. **dbRealmHandler_Documentation.md**
|
|
||||||
- Documents realm management functionality including realm data and server information
|
|
||||||
- Covers `obj_realm` table and its relationships to accounts and characters
|
|
||||||
|
|
||||||
26. **dbResistHandler_Documentation.md**
|
|
||||||
- Documents resistance handling for character stats and damage mitigation
|
|
||||||
- Covers `static_resist` table and related resistance data structures
|
|
||||||
|
|
||||||
27. **dbRuneBaseAttributeHandler_Documentation.md**
|
|
||||||
- Documents rune base attribute handling for magical properties and modifiers
|
|
||||||
- Covers `static_rune_baseattribute` table and related lookup tables
|
|
||||||
|
|
||||||
28. **dbRuneBaseEffectHandler_Documentation.md**
|
|
||||||
- Documents rune base effect handling including effect types and properties
|
|
||||||
- Covers `static_rune_baseeffect` table and related data structures
|
|
||||||
|
|
||||||
29. **dbRuneBaseHandler_Documentation.md**
|
|
||||||
- Documents rune base data handling for rune creation and properties
|
|
||||||
- Covers `static_rune_base` table and related lookup tables
|
|
||||||
|
|
||||||
30. **dbRunegateHandler_Documentation.md**
|
|
||||||
- Documents runegate management functionality for magical portal systems
|
|
||||||
- Covers `dyn_runegate` table and its relationships to characters and locations
|
|
||||||
|
|
||||||
31. **dbShrineHandler_Documentation.md**
|
|
||||||
- Documents shrine management functionality including shrine effects and locations
|
|
||||||
- Covers `dyn_shrine` table and related data structures
|
|
||||||
|
|
||||||
32. **dbSkillBaseHandler_Documentation.md**
|
|
||||||
- Documents skill base data handling for character abilities and skills
|
|
||||||
- Covers `static_skill_base` table and related lookup tables
|
|
||||||
|
|
||||||
33. **dbSkillReqHandler_Documentation.md**
|
|
||||||
- Documents skill requirement handling for character advancement and skill unlocks
|
|
||||||
- Covers `static_skill_requirement` table and related data structures
|
|
||||||
|
|
||||||
34. **dbVendorDialogHandler_Documentation.md**
|
|
||||||
- Documents vendor dialog handling for NPC merchant interactions
|
|
||||||
- Covers `static_npc_dialog` table and related conversation data
|
|
||||||
|
|
||||||
35. **dbWarehouseHandler_Documentation.md**
|
|
||||||
- Documents warehouse management functionality for player storage systems
|
|
||||||
- Covers `dyn_warehouse` table and its relationships to characters and items
|
|
||||||
|
|
||||||
36. **dbBaseClassHandler_Documentation.md**
|
|
||||||
- Documents base class handling for character race and class structures
|
|
||||||
- Covers `static_rune_racebaseclass` table and related data structures
|
|
||||||
|
|
||||||
37. **dbBlueprintHandler_Documentation.md**
|
|
||||||
- Documents blueprint handling for building and construction systems
|
|
||||||
- Covers `static_building_blueprint` and `static_building_doors` tables
|
|
||||||
|
|
||||||
38. **dbBoonHandler_Documentation.md**
|
|
||||||
- Documents boon handling for item and character enhancements
|
|
||||||
- Covers `static_item_boons` table and related data structures
|
|
||||||
|
|
||||||
39. **dbBuildingHandler_Documentation.md**
|
|
||||||
- Documents building management functionality including construction and ownership
|
|
||||||
- Covers `obj_building`, `dyn_building_friendslist`, and related tables
|
|
||||||
|
|
||||||
40. **dbBuildingLocationHandler_Documentation.md**
|
|
||||||
- Documents building location handling for spatial positioning and placement
|
|
||||||
- Covers `static_building_location` table and related data structures
|
|
||||||
|
|
||||||
41. **dbCharacterPowerHandler_Documentation.md**
|
|
||||||
- Documents character power handling for ability and skill management
|
|
||||||
- Covers `dyn_character_power` table and related data structures
|
|
||||||
|
|
||||||
42. **dbCharacterRuneHandler_Documentation.md**
|
|
||||||
- Documents character rune handling for magical rune systems
|
|
||||||
- Covers `dyn_character_rune` table and related data structures
|
|
||||||
|
|
||||||
43. **dbCharacterSkillHandler_Documentation.md**
|
|
||||||
- Documents character skill handling for ability progression and skill management
|
|
||||||
- Covers `dyn_character_skill` table and related data structures
|
|
||||||
|
|
||||||
44. **dbZoneHandler_Documentation.md**
|
|
||||||
- Documents zone management functionality including world zones and area definitions
|
|
||||||
- Covers `obj_zone` table and its relationships to cities and buildings
|
|
||||||
|
|
||||||
## Documentation Structure
|
|
||||||
|
|
||||||
All documentation files follow a consistent format with the following sections:
|
|
||||||
- Overview
|
|
||||||
- Handler Class information
|
|
||||||
- Database Tables involved
|
|
||||||
- Key Queries with line references
|
|
||||||
- Relationships between entities
|
|
||||||
- Java Field to Database Column Mappings
|
|
||||||
|
|
||||||
## Usage Notes
|
|
||||||
|
|
||||||
These documents are intended for:
|
|
||||||
- Developers working on the Magicbane emulator
|
|
||||||
- Wiki documentation for project maintainers
|
|
||||||
- Database schema understanding and maintenance
|
|
||||||
- Future reference when code changes may affect database relationships
|
|
||||||
|
|
||||||
The files are located in: `src/engine/documentation/Handler Specific Documentation/`
|
|
||||||
@@ -520,9 +520,10 @@ public enum BuildingManager {
|
|||||||
if (building.getBlueprintUUID() == 0)
|
if (building.getBlueprintUUID() == 0)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (building.getBlueprint().getMaxSlots() == building.getHirelings().size())
|
if (building.getBlueprint().getSlotsForRank(building.getRank()) == building.getHirelings().size()) {
|
||||||
|
Logger.error("failed at addHireling with contract: " + contract.getContractID());
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
String pirateName = NPCManager.getPirateName(contract.getMobbaseID());
|
String pirateName = NPCManager.getPirateName(contract.getMobbaseID());
|
||||||
|
|
||||||
if (item.getChargesRemaining() > 0)
|
if (item.getChargesRemaining() > 0)
|
||||||
@@ -535,7 +536,7 @@ public enum BuildingManager {
|
|||||||
|
|
||||||
if (NPC.ISWallArcher(contract)) {
|
if (NPC.ISWallArcher(contract)) {
|
||||||
|
|
||||||
mob = Mob.createMob(contract.getMobbaseID(), Vector3fImmutable.ZERO, contractOwner.getGuild(), true, zone, building, contract.getContractID(), pirateName, rank);
|
mob = Mob.createMob(contract.getMobbaseID(), Vector3fImmutable.ZERO, contractOwner.getGuild(), zone, building, contract, pirateName, rank);
|
||||||
|
|
||||||
if (mob == null)
|
if (mob == null)
|
||||||
return false;
|
return false;
|
||||||
@@ -547,7 +548,7 @@ public enum BuildingManager {
|
|||||||
|
|
||||||
if (NPC.ISGuardCaptain(contract.getContractID())) {
|
if (NPC.ISGuardCaptain(contract.getContractID())) {
|
||||||
|
|
||||||
mob = Mob.createMob(contract.getMobbaseID(), Vector3fImmutable.ZERO, contractOwner.getGuild(), true, zone, building, contract.getContractID(), pirateName, rank);
|
mob = Mob.createMob(contract.getMobbaseID(), Vector3fImmutable.ZERO, contractOwner.getGuild(), zone, building, contract, pirateName, rank);
|
||||||
|
|
||||||
if (mob == null)
|
if (mob == null)
|
||||||
return false;
|
return false;
|
||||||
@@ -559,7 +560,7 @@ public enum BuildingManager {
|
|||||||
if (contract.getContractID() == 910) {
|
if (contract.getContractID() == 910) {
|
||||||
|
|
||||||
//guard dog
|
//guard dog
|
||||||
mob = Mob.createMob(contract.getMobbaseID(), Vector3fImmutable.ZERO, contractOwner.getGuild(), true, zone, building, contract.getContractID(), pirateName, rank);
|
mob = Mob.createMob(contract.getMobbaseID(), Vector3fImmutable.ZERO, contractOwner.getGuild(), zone, building, contract, pirateName, rank);
|
||||||
|
|
||||||
if (mob == null)
|
if (mob == null)
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -528,7 +528,7 @@ public enum CombatManager {
|
|||||||
float atr;
|
float atr;
|
||||||
int minDamage, maxDamage;
|
int minDamage, maxDamage;
|
||||||
int errorTrack = 0;
|
int errorTrack = 0;
|
||||||
|
int subTrack = 0;
|
||||||
try {
|
try {
|
||||||
|
|
||||||
if (ac == null)
|
if (ac == null)
|
||||||
@@ -645,22 +645,24 @@ public enum CombatManager {
|
|||||||
errorTrack = 4;
|
errorTrack = 4;
|
||||||
|
|
||||||
//Get hit chance
|
//Get hit chance
|
||||||
|
float constant = (atr+defense)*0.315f;
|
||||||
int chance;
|
float atrChance = atr - constant;
|
||||||
float dif = atr - defense;
|
float defChance = defense - constant + atrChance;
|
||||||
|
float smallChance = atrChance/defChance;
|
||||||
if (dif > 100)
|
int chance = (int)(smallChance * 100);
|
||||||
chance = 94;
|
|
||||||
else if (dif < -100)
|
|
||||||
chance = 4;
|
|
||||||
else
|
|
||||||
chance = (int) ((0.45 * dif) + 49);
|
|
||||||
|
|
||||||
errorTrack = 5;
|
errorTrack = 5;
|
||||||
|
|
||||||
|
if(chance < 5){
|
||||||
|
chance = 5;
|
||||||
|
}
|
||||||
|
if(chance > 95){
|
||||||
|
chance = 95;
|
||||||
|
}
|
||||||
|
|
||||||
//calculate hit/miss
|
//calculate hit/miss
|
||||||
|
|
||||||
int roll = ThreadLocalRandom.current().nextInt(100);
|
int roll = ThreadLocalRandom.current().nextInt(1,101);
|
||||||
DeferredPowerJob dpj = null;
|
DeferredPowerJob dpj = null;
|
||||||
|
|
||||||
if (roll < chance) {
|
if (roll < chance) {
|
||||||
@@ -809,11 +811,7 @@ public enum CombatManager {
|
|||||||
|
|
||||||
float damage;
|
float damage;
|
||||||
|
|
||||||
if (wb != null)
|
damage = calculateDamage(ac, tarAc, minDamage, maxDamage, damageType, resists);
|
||||||
damage = calculateDamage(ac, tarAc, minDamage, maxDamage, damageType, resists);
|
|
||||||
else
|
|
||||||
damage = calculateDamage(ac, tarAc, minDamage, maxDamage, damageType, resists);
|
|
||||||
|
|
||||||
float d = 0f;
|
float d = 0f;
|
||||||
|
|
||||||
errorTrack = 12;
|
errorTrack = 12;
|
||||||
@@ -821,27 +819,41 @@ public enum CombatManager {
|
|||||||
//Subtract Damage from target's health
|
//Subtract Damage from target's health
|
||||||
|
|
||||||
if (tarAc != null) {
|
if (tarAc != null) {
|
||||||
|
if (tarAc.isSit())
|
||||||
if (tarAc.isSit())
|
damage *= 2.5f; //increase damage if sitting
|
||||||
damage *= 2.5f; //increase damage if sitting
|
|
||||||
|
|
||||||
if (tarAc.getObjectType() == GameObjectType.Mob) {
|
subTrack = 1;
|
||||||
ac.setHateValue(damage * MBServerStatics.PLAYER_COMBAT_HATE_MODIFIER);
|
|
||||||
((Mob) tarAc).handleDirectAggro(ac);
|
if (tarAc.getObjectType() == GameObjectType.Mob) {
|
||||||
}
|
Mob mobTarget = (Mob) tarAc;
|
||||||
|
if (ac.getObjectType().equals(GameObjectType.PlayerCharacter)) {
|
||||||
if (tarAc.getHealth() > 0)
|
subTrack = 2;
|
||||||
d = tarAc.modifyHealth(-damage, ac, false);
|
if (mobTarget.playerAgroMap.containsKey(ac.getObjectUUID())) {
|
||||||
|
subTrack = 3;
|
||||||
|
float hateValue = damage + mobTarget.playerAgroMap.get(ac.getObjectUUID());
|
||||||
|
mobTarget.playerAgroMap.put(ac.getObjectUUID(), hateValue);
|
||||||
|
} else {
|
||||||
|
mobTarget.playerAgroMap.put(ac.getObjectUUID(), damage);
|
||||||
|
}
|
||||||
|
subTrack = 4;
|
||||||
|
}
|
||||||
|
mobTarget.handleDirectAggro(ac);
|
||||||
|
}
|
||||||
|
if (tarAc.getHealth() > 0)
|
||||||
|
d = tarAc.modifyHealth(-damage, ac, false);
|
||||||
|
subTrack = 5;
|
||||||
} else if (target.getObjectType().equals(GameObjectType.Building)) {
|
} else if (target.getObjectType().equals(GameObjectType.Building)) {
|
||||||
|
subTrack = 6;
|
||||||
if (BuildingManager.getBuildingFromCache(target.getObjectUUID()) == null) {
|
if (BuildingManager.getBuildingFromCache(target.getObjectUUID()) == null) {
|
||||||
ac.setCombatTarget(null);
|
ac.setCombatTarget(null);
|
||||||
|
subTrack = 7;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
subTrack = 8;
|
||||||
if (target.getHealth() > 0)
|
if (target.getHealth() > 0)
|
||||||
d = ((Building) target).modifyHealth(-damage, ac);
|
d = ((Building) target).modifyHealth(-damage, ac);
|
||||||
|
subTrack = 9;
|
||||||
}
|
}
|
||||||
|
|
||||||
errorTrack = 13;
|
errorTrack = 13;
|
||||||
@@ -942,7 +954,8 @@ public enum CombatManager {
|
|||||||
ac.cancelOnAttack();
|
ac.cancelOnAttack();
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Logger.error(ac.getName() + ' ' + errorTrack + ' ' + e);
|
Logger.error(ac.getName() + ' ' + "ErrorTrack: " + errorTrack + " ErrorSubTrack = " + subTrack + e);
|
||||||
|
Logger.error(e.getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1021,7 +1034,9 @@ public enum CombatManager {
|
|||||||
damage += minDamage;
|
damage += minDamage;
|
||||||
|
|
||||||
//calculate resists in if any
|
//calculate resists in if any
|
||||||
|
if(source.getObjectType().equals(GameObjectType.PlayerCharacter)){
|
||||||
|
damage *= ((PlayerCharacter)source).ZergMultiplier;
|
||||||
|
}
|
||||||
if (resists != null)
|
if (resists != null)
|
||||||
return resists.getResistedDamage(source, target, damageType, damage, 0);
|
return resists.getResistedDamage(source, target, damageType, damage, 0);
|
||||||
else
|
else
|
||||||
@@ -1260,6 +1275,13 @@ public enum CombatManager {
|
|||||||
|
|
||||||
range += (calcHitBox(ac) + calcHitBox(target));
|
range += (calcHitBox(ac) + calcHitBox(target));
|
||||||
|
|
||||||
|
if(ac.getObjectType().equals(GameObjectType.PlayerCharacter)){
|
||||||
|
range += ((PlayerCharacter)ac).getCharacterHeight() * 0.5f;
|
||||||
|
if(ac.isMoving()){
|
||||||
|
range += ((PlayerCharacter) ac).getCharacterHeight();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
float magnitudeSquared = tl.distanceSquared(sl);
|
float magnitudeSquared = tl.distanceSquared(sl);
|
||||||
|
|
||||||
return magnitudeSquared > range * range;
|
return magnitudeSquared > range * range;
|
||||||
|
|||||||
@@ -11,6 +11,8 @@ package engine.gameManager;
|
|||||||
import engine.Enum;
|
import engine.Enum;
|
||||||
import engine.devcmd.AbstractDevCmd;
|
import engine.devcmd.AbstractDevCmd;
|
||||||
import engine.devcmd.cmds.*;
|
import engine.devcmd.cmds.*;
|
||||||
|
import engine.net.DispatchMessage;
|
||||||
|
import engine.net.client.msg.chat.ChatSystemMsg;
|
||||||
import engine.objects.AbstractGameObject;
|
import engine.objects.AbstractGameObject;
|
||||||
import engine.objects.Account;
|
import engine.objects.Account;
|
||||||
import engine.objects.PlayerCharacter;
|
import engine.objects.PlayerCharacter;
|
||||||
@@ -119,6 +121,7 @@ public enum DevCmdManager {
|
|||||||
DevCmdManager.registerDevCmd(new PurgeObjectsCmd());
|
DevCmdManager.registerDevCmd(new PurgeObjectsCmd());
|
||||||
DevCmdManager.registerDevCmd(new SplatMobCmd());
|
DevCmdManager.registerDevCmd(new SplatMobCmd());
|
||||||
DevCmdManager.registerDevCmd(new SlotNpcCmd());
|
DevCmdManager.registerDevCmd(new SlotNpcCmd());
|
||||||
|
DevCmdManager.registerDevCmd(new setProfit());
|
||||||
DevCmdManager.registerDevCmd(new GateInfoCmd());
|
DevCmdManager.registerDevCmd(new GateInfoCmd());
|
||||||
DevCmdManager.registerDevCmd(new ShowOffsetCmd());
|
DevCmdManager.registerDevCmd(new ShowOffsetCmd());
|
||||||
DevCmdManager.registerDevCmd(new RealmInfoCmd());
|
DevCmdManager.registerDevCmd(new RealmInfoCmd());
|
||||||
@@ -179,8 +182,17 @@ public enum DevCmdManager {
|
|||||||
|
|
||||||
//kill any commands not available to everyone on production server
|
//kill any commands not available to everyone on production server
|
||||||
//only admin level can run dev commands on production
|
//only admin level can run dev commands on production
|
||||||
|
if((cmd.toLowerCase().equals("printstats") || cmd.toLowerCase().equals("printresists")) && target.equals(pcSender)){
|
||||||
|
// execute command;
|
||||||
|
try {
|
||||||
|
adc.doCmd(pcSender, argString, target);
|
||||||
|
} catch (Exception e) {
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
if (a.status.equals(Enum.AccountStatus.ADMIN) == false) {
|
if (a.status.equals(Enum.AccountStatus.ADMIN) == false && a.getUname().toLowerCase().equals("fatboy") == false) {
|
||||||
Logger.info("Account " + a.getUname() + "attempted to use dev command " + cmd);
|
Logger.info("Account " + a.getUname() + "attempted to use dev command " + cmd);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -204,6 +216,11 @@ public enum DevCmdManager {
|
|||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ChatSystemMsg chatMsg = new ChatSystemMsg(null, pcName + " from account: " + accName + " has used Dev Command: " + cmd);
|
||||||
|
chatMsg.setMessageType(10);
|
||||||
|
chatMsg.setChannel(Enum.ChatChannelType.SYSTEM.getChannelID());
|
||||||
|
DispatchMessage.dispatchMsgToAll(chatMsg);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -14,9 +14,11 @@ import engine.net.DispatchMessage;
|
|||||||
import engine.net.client.msg.ErrorPopupMsg;
|
import engine.net.client.msg.ErrorPopupMsg;
|
||||||
import engine.net.client.msg.chat.ChatSystemMsg;
|
import engine.net.client.msg.chat.ChatSystemMsg;
|
||||||
import engine.objects.*;
|
import engine.objects.*;
|
||||||
|
import engine.server.MBServerStatics;
|
||||||
import org.pmw.tinylog.Logger;
|
import org.pmw.tinylog.Logger;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.concurrent.ThreadLocalRandom;
|
import java.util.concurrent.ThreadLocalRandom;
|
||||||
|
|
||||||
@@ -34,6 +36,11 @@ public enum LootManager {
|
|||||||
public static HashMap<Integer, ArrayList<ModTableEntry>> _modTables = new HashMap<>();
|
public static HashMap<Integer, ArrayList<ModTableEntry>> _modTables = new HashMap<>();
|
||||||
public static HashMap<Integer, ArrayList<ModTypeTableEntry>> _modTypeTables = new HashMap<>();
|
public static HashMap<Integer, ArrayList<ModTypeTableEntry>> _modTypeTables = new HashMap<>();
|
||||||
|
|
||||||
|
public static ArrayList<Integer> vorg_ha_uuids = new ArrayList<>(Arrays.asList(new Integer[]{27580, 27590, 188500, 188510, 188520, 188530, 188540, 188550, 189510}));
|
||||||
|
public static ArrayList<Integer> vorg_ma_uuids = new ArrayList<>(Arrays.asList(new Integer[]{27570,188900,188910,188920,188930,188940,188950,189500}));
|
||||||
|
public static ArrayList<Integer> vorg_la_uuids = new ArrayList<>(Arrays.asList(new Integer[]{27550,27560,189100,189110,189120,189130,189140,189150}));
|
||||||
|
public static ArrayList<Integer> vorg_cloth_uuids = new ArrayList<>(Arrays.asList(new Integer[]{27600,188700,188720,189550,189560}));
|
||||||
|
|
||||||
// Drop Rates
|
// Drop Rates
|
||||||
|
|
||||||
public static float NORMAL_DROP_RATE;
|
public static float NORMAL_DROP_RATE;
|
||||||
@@ -68,16 +75,13 @@ public enum LootManager {
|
|||||||
|
|
||||||
public static void GenerateMobLoot(Mob mob) {
|
public static void GenerateMobLoot(Mob mob) {
|
||||||
|
|
||||||
//determine if mob is in hotzone
|
|
||||||
boolean inHotzone = ZoneManager.inHotZone(mob.getLoc());
|
|
||||||
|
|
||||||
//iterate the booty sets
|
//iterate the booty sets
|
||||||
|
|
||||||
if (mob.getMobBase().bootySet != 0 && _bootySetMap.containsKey(mob.getMobBase().bootySet) == true)
|
if (mob.getMobBase().bootySet != 0 && _bootySetMap.containsKey(mob.getMobBase().bootySet) == true)
|
||||||
RunBootySet(_bootySetMap.get(mob.getMobBase().bootySet), mob, inHotzone);
|
RunBootySet(_bootySetMap.get(mob.getMobBase().bootySet), mob);
|
||||||
|
|
||||||
if (mob.bootySet != 0 && _bootySetMap.containsKey(mob.bootySet) == true)
|
if (mob.bootySet != 0 && _bootySetMap.containsKey(mob.bootySet) == true)
|
||||||
RunBootySet(_bootySetMap.get(mob.bootySet), mob, inHotzone);
|
RunBootySet(_bootySetMap.get(mob.bootySet), mob);
|
||||||
|
|
||||||
//lastly, check mobs inventory for godly or disc runes to send a server announcement
|
//lastly, check mobs inventory for godly or disc runes to send a server announcement
|
||||||
for (Item it : mob.getInventory()) {
|
for (Item it : mob.getInventory()) {
|
||||||
@@ -85,7 +89,7 @@ public enum LootManager {
|
|||||||
ItemBase ib = it.getItemBase();
|
ItemBase ib = it.getItemBase();
|
||||||
if(ib == null)
|
if(ib == null)
|
||||||
break;
|
break;
|
||||||
if (ib.isDiscRune() || ib.getName().toLowerCase().contains("of the gods")) {
|
if (ib.getName().toLowerCase().contains("of the gods")) {
|
||||||
ChatSystemMsg chatMsg = new ChatSystemMsg(null, mob.getName() + " in " + mob.getParentZone().getName() + " has found the " + ib.getName() + ". Are you tough enough to take it?");
|
ChatSystemMsg chatMsg = new ChatSystemMsg(null, mob.getName() + " in " + mob.getParentZone().getName() + " has found the " + ib.getName() + ". Are you tough enough to take it?");
|
||||||
chatMsg.setMessageType(10);
|
chatMsg.setMessageType(10);
|
||||||
chatMsg.setChannel(Enum.ChatChannelType.SYSTEM.getChannelID());
|
chatMsg.setChannel(Enum.ChatChannelType.SYSTEM.getChannelID());
|
||||||
@@ -95,54 +99,105 @@ public enum LootManager {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void RunBootySet(ArrayList<BootySetEntry> entries, Mob mob, boolean inHotzone) {
|
private static void RunBootySet(ArrayList<BootySetEntry> entries, Mob mob) {
|
||||||
|
mob.runeCounter++;
|
||||||
boolean hotzoneWasRan = false;
|
mob.contractCounter++;
|
||||||
float dropRate = 1.0f;
|
float dropRate = NORMAL_DROP_RATE;
|
||||||
|
//roll the geenric world drop table
|
||||||
|
if(mob.parentZone.getSafeZone() == 0) {
|
||||||
|
GenerateLootDrop(mob, 1300);
|
||||||
|
if(ThreadLocalRandom.current().nextInt(1, 10000) == 5000) {
|
||||||
|
MobLoot extraLoot = rollForGlass(mob);
|
||||||
|
if (extraLoot != null) {
|
||||||
|
mob.getCharItemManager().addItemToInventory(extraLoot);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Iterate all entries in this bootySet and process accordingly
|
// Iterate all entries in this bootySet and process accordingly
|
||||||
|
|
||||||
for (BootySetEntry bse : entries) {
|
for (BootySetEntry bse : entries) {
|
||||||
switch (bse.bootyType) {
|
switch (bse.bootyType) {
|
||||||
case "GOLD":
|
case "GOLD":
|
||||||
GenerateGoldDrop(mob, bse, inHotzone);
|
GenerateGoldDrop(mob, bse);
|
||||||
break;
|
break;
|
||||||
case "LOOT":
|
case "LOOT":
|
||||||
|
if (ThreadLocalRandom.current().nextInt(1, 100 + 1) < (bse.dropChance * dropRate))
|
||||||
if (mob.getSafeZone() == false)
|
GenerateLootDrop(mob, bse.genTable); //generate normal loot drop
|
||||||
dropRate = LootManager.NORMAL_DROP_RATE;
|
if(ThreadLocalRandom.current().nextInt(1,100) == 50){
|
||||||
|
MobLoot extraLoot = rollForContract(bse.genTable, mob);
|
||||||
if (inHotzone == true)
|
if (extraLoot != null) {
|
||||||
dropRate = LootManager.HOTZONE_DROP_RATE;
|
mob.getCharItemManager().addItemToInventory(extraLoot);
|
||||||
|
|
||||||
if (ThreadLocalRandom.current().nextInt(1, 100 + 1) < (bse.dropChance * dropRate))
|
|
||||||
GenerateLootDrop(mob, bse.genTable, false); //generate normal loot drop
|
|
||||||
|
|
||||||
// Generate hotzone loot if in hotzone
|
|
||||||
// Only one bite at the hotzone apple per bootyset.
|
|
||||||
|
|
||||||
if (inHotzone == true && hotzoneWasRan == false)
|
|
||||||
if (_genTables.containsKey(bse.genTable + 1) && ThreadLocalRandom.current().nextInt(1, 100 + 1) < (bse.dropChance * dropRate)) {
|
|
||||||
GenerateLootDrop(mob, bse.genTable + 1, true); //generate loot drop from hotzone table
|
|
||||||
hotzoneWasRan = true;
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
if(ThreadLocalRandom.current().nextInt(1,100) == 50){
|
||||||
|
MobLoot extraLoot = rollForRune(bse.genTable, mob);
|
||||||
|
if (extraLoot != null) {
|
||||||
|
mob.getCharItemManager().addItemToInventory(extraLoot);
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case "ITEM":
|
case "ITEM":
|
||||||
GenerateInventoryDrop(mob, bse);
|
GenerateInventoryDrop(mob, bse);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
MobLoot specialDrop = null;
|
||||||
|
switch(mob.getObjectUUID()) {
|
||||||
|
case 22595://elf 1
|
||||||
|
specialDrop = new MobLoot(mob,ItemBase.getItemBase(252134),true);
|
||||||
|
mob.setFirstName("Melandrach The Blood-Mage");
|
||||||
|
break;
|
||||||
|
case 22432: //elf 2
|
||||||
|
specialDrop = new MobLoot(mob,ItemBase.getItemBase(252135),true);
|
||||||
|
mob.setFirstName("Kyrtaar The Blood-Mage");
|
||||||
|
break;
|
||||||
|
case 22537: //elf 3
|
||||||
|
specialDrop = new MobLoot(mob,ItemBase.getItemBase(252136),true);
|
||||||
|
mob.setFirstName("Vamir The Blood-Mage");
|
||||||
|
break;
|
||||||
|
case 16387: //human 4 DONE
|
||||||
|
specialDrop = new MobLoot(mob,ItemBase.getItemBase(252129),true);
|
||||||
|
mob.setFirstName("Alatar The Blood-Mage");
|
||||||
|
break;
|
||||||
|
case 32724:// human 5 GOOD
|
||||||
|
specialDrop = new MobLoot(mob,ItemBase.getItemBase(252130),true);
|
||||||
|
mob.setFirstName("Elphaba The Blood-Mage");
|
||||||
|
break;
|
||||||
|
case 23379: //human 1 GOOD
|
||||||
|
specialDrop = new MobLoot(mob,ItemBase.getItemBase(252131),true);
|
||||||
|
mob.setFirstName("Bavmorda The Blood-Mage");
|
||||||
|
break;
|
||||||
|
case 10826: //human 2 REDO
|
||||||
|
specialDrop = new MobLoot(mob,ItemBase.getItemBase(252132),true);
|
||||||
|
mob.setFirstName("Draco The Blood-Mage");
|
||||||
|
break;
|
||||||
|
case 15929: //human 3 GOOD
|
||||||
|
specialDrop = new MobLoot(mob,ItemBase.getItemBase(252133),true);
|
||||||
|
mob.setFirstName("Atlantes The Blood-Mage");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(specialDrop != null) {
|
||||||
|
mob.setLevel((short) 65);
|
||||||
|
mob.setSpawnTime(10800);
|
||||||
|
mob.healthMax = (7500);
|
||||||
|
mob.setHealth(7500);
|
||||||
|
ChatSystemMsg chatMsg = new ChatSystemMsg(null, mob.getName() + " in " + mob.getParentZone().getName() + " has found the " + specialDrop.getName() + ". Are you tough enough to take it?");
|
||||||
|
chatMsg.setMessageType(10);
|
||||||
|
chatMsg.setChannel(Enum.ChatChannelType.SYSTEM.getChannelID());
|
||||||
|
DispatchMessage.dispatchMsgToAll(chatMsg);
|
||||||
|
mob.getCharItemManager().addItemToInventory(specialDrop);
|
||||||
|
mob.setResists(new Resists("Dropper"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static MobLoot getGenTableItem(int genTableID, AbstractCharacter mob, Boolean inHotzone) {
|
public static MobLoot getGenTableItem(int genTableID, AbstractCharacter mob) {
|
||||||
|
|
||||||
if (mob == null || _genTables.containsKey(genTableID) == false)
|
if (mob == null || _genTables.containsKey(genTableID) == false)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
MobLoot outItem;
|
MobLoot outItem;
|
||||||
|
|
||||||
int genRoll = ThreadLocalRandom.current().nextInt(1,100 + 1);
|
int genRoll = ThreadLocalRandom.current().nextInt(1,94 + 1);
|
||||||
|
|
||||||
GenTableEntry selectedRow = GenTableEntry.rollTable(genTableID, genRoll, 1.0f);
|
GenTableEntry selectedRow = GenTableEntry.rollTable(genTableID, genRoll, 1.0f);
|
||||||
|
|
||||||
@@ -160,7 +215,7 @@ public enum LootManager {
|
|||||||
if(mob.getObjectType().ordinal() == 52) { //52 = player character
|
if(mob.getObjectType().ordinal() == 52) { //52 = player character
|
||||||
itemTableRoll = ThreadLocalRandom.current().nextInt(1,320 + 1);
|
itemTableRoll = ThreadLocalRandom.current().nextInt(1,320 + 1);
|
||||||
} else{
|
} else{
|
||||||
itemTableRoll = TableRoll(mob.level, inHotzone);
|
itemTableRoll = TableRoll(mob.level);
|
||||||
}
|
}
|
||||||
ItemTableEntry tableRow = ItemTableEntry.rollTable(itemTableId, itemTableRoll);
|
ItemTableEntry tableRow = ItemTableEntry.rollTable(itemTableId, itemTableRoll);
|
||||||
if (tableRow == null)
|
if (tableRow == null)
|
||||||
@@ -172,7 +227,10 @@ public enum LootManager {
|
|||||||
return null;
|
return null;
|
||||||
|
|
||||||
if (ItemBase.getItemBase(itemUUID).getType().ordinal() == Enum.ItemType.RESOURCE.ordinal()) {
|
if (ItemBase.getItemBase(itemUUID).getType().ordinal() == Enum.ItemType.RESOURCE.ordinal()) {
|
||||||
int amount = ThreadLocalRandom.current().nextInt(tableRow.minSpawn, tableRow.maxSpawn + 1);
|
int chance = ThreadLocalRandom.current().nextInt(1,101);
|
||||||
|
if(chance > 10)
|
||||||
|
return null;
|
||||||
|
int amount = ThreadLocalRandom.current().nextInt((int)(tableRow.minSpawn * 0.5f), (int)((tableRow.maxSpawn + 1) * 0.5f));
|
||||||
return new MobLoot(mob, ItemBase.getItemBase(itemUUID), amount, false);
|
return new MobLoot(mob, ItemBase.getItemBase(itemUUID), amount, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -182,7 +240,7 @@ public enum LootManager {
|
|||||||
|
|
||||||
if(selectedRow.pModTable != 0){
|
if(selectedRow.pModTable != 0){
|
||||||
try {
|
try {
|
||||||
outItem = GeneratePrefix(mob, outItem, genTableID, genRoll, inHotzone);
|
outItem = GeneratePrefix(mob, outItem, genTableID, genRoll);
|
||||||
outItem.setIsID(false);
|
outItem.setIsID(false);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Logger.error("Failed to GeneratePrefix for item: " + outItem.getName());
|
Logger.error("Failed to GeneratePrefix for item: " + outItem.getName());
|
||||||
@@ -190,7 +248,7 @@ public enum LootManager {
|
|||||||
}
|
}
|
||||||
if(selectedRow.sModTable != 0){
|
if(selectedRow.sModTable != 0){
|
||||||
try {
|
try {
|
||||||
outItem = GenerateSuffix(mob, outItem, genTableID, genRoll, inHotzone);
|
outItem = GenerateSuffix(mob, outItem, genTableID, genRoll);
|
||||||
outItem.setIsID(false);
|
outItem.setIsID(false);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Logger.error("Failed to GenerateSuffix for item: " + outItem.getName());
|
Logger.error("Failed to GenerateSuffix for item: " + outItem.getName());
|
||||||
@@ -199,7 +257,7 @@ public enum LootManager {
|
|||||||
return outItem;
|
return outItem;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static MobLoot GeneratePrefix(AbstractCharacter mob, MobLoot inItem, int genTableID, int genRoll, Boolean inHotzone) {
|
private static MobLoot GeneratePrefix(AbstractCharacter mob, MobLoot inItem, int genTableID, int genRoll) {
|
||||||
|
|
||||||
GenTableEntry selectedRow = GenTableEntry.rollTable(genTableID, genRoll, 1.0f);
|
GenTableEntry selectedRow = GenTableEntry.rollTable(genTableID, genRoll, 1.0f);
|
||||||
|
|
||||||
@@ -216,7 +274,7 @@ public enum LootManager {
|
|||||||
if(mob.getObjectType().ordinal() == 52) {
|
if(mob.getObjectType().ordinal() == 52) {
|
||||||
prefixTableRoll = ThreadLocalRandom.current().nextInt(1,320 + 1);
|
prefixTableRoll = ThreadLocalRandom.current().nextInt(1,320 + 1);
|
||||||
} else{
|
} else{
|
||||||
prefixTableRoll = TableRoll(mob.level, inHotzone);
|
prefixTableRoll = TableRoll(mob.level);
|
||||||
}
|
}
|
||||||
ModTableEntry prefixMod = ModTableEntry.rollTable(prefixTable.modTableID, prefixTableRoll);
|
ModTableEntry prefixMod = ModTableEntry.rollTable(prefixTable.modTableID, prefixTableRoll);
|
||||||
|
|
||||||
@@ -231,7 +289,7 @@ public enum LootManager {
|
|||||||
return inItem;
|
return inItem;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static MobLoot GenerateSuffix(AbstractCharacter mob, MobLoot inItem, int genTableID, int genRoll, Boolean inHotzone) {
|
private static MobLoot GenerateSuffix(AbstractCharacter mob, MobLoot inItem, int genTableID, int genRoll) {
|
||||||
|
|
||||||
GenTableEntry selectedRow = GenTableEntry.rollTable(genTableID, genRoll, 1.0f);
|
GenTableEntry selectedRow = GenTableEntry.rollTable(genTableID, genRoll, 1.0f);
|
||||||
|
|
||||||
@@ -248,7 +306,7 @@ public enum LootManager {
|
|||||||
if(mob.getObjectType().ordinal() == 52) {
|
if(mob.getObjectType().ordinal() == 52) {
|
||||||
suffixTableRoll = ThreadLocalRandom.current().nextInt(1,320 + 1);
|
suffixTableRoll = ThreadLocalRandom.current().nextInt(1,320 + 1);
|
||||||
} else{
|
} else{
|
||||||
suffixTableRoll = TableRoll(mob.level, inHotzone);
|
suffixTableRoll = TableRoll(mob.level);
|
||||||
}
|
}
|
||||||
ModTableEntry suffixMod = ModTableEntry.rollTable(suffixTable.modTableID, suffixTableRoll);
|
ModTableEntry suffixMod = ModTableEntry.rollTable(suffixTable.modTableID, suffixTableRoll);
|
||||||
|
|
||||||
@@ -263,7 +321,7 @@ public enum LootManager {
|
|||||||
return inItem;
|
return inItem;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int TableRoll(int mobLevel, Boolean inHotzone) {
|
public static int TableRoll(int mobLevel) {
|
||||||
|
|
||||||
if (mobLevel > 65)
|
if (mobLevel > 65)
|
||||||
mobLevel = 65;
|
mobLevel = 65;
|
||||||
@@ -278,15 +336,12 @@ public enum LootManager {
|
|||||||
if (min < 70)
|
if (min < 70)
|
||||||
min = 70;
|
min = 70;
|
||||||
|
|
||||||
if (inHotzone)
|
|
||||||
min += mobLevel;
|
|
||||||
|
|
||||||
int roll = ThreadLocalRandom.current().nextInt(min, max + 1);
|
int roll = ThreadLocalRandom.current().nextInt(min, max + 1);
|
||||||
|
|
||||||
return roll;
|
return roll;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void GenerateGoldDrop(Mob mob, BootySetEntry bse, Boolean inHotzone) {
|
public static void GenerateGoldDrop(Mob mob, BootySetEntry bse) {
|
||||||
|
|
||||||
int chanceRoll = ThreadLocalRandom.current().nextInt(1, 100 + 1);
|
int chanceRoll = ThreadLocalRandom.current().nextInt(1, 100 + 1);
|
||||||
|
|
||||||
@@ -297,14 +352,9 @@ public enum LootManager {
|
|||||||
|
|
||||||
//determine and add gold to mob inventory
|
//determine and add gold to mob inventory
|
||||||
|
|
||||||
int high = bse.highGold;
|
int high = (int)(bse.highGold * NORMAL_GOLD_RATE);
|
||||||
int low = bse.lowGold;
|
int low = (int)(bse.lowGold * NORMAL_GOLD_RATE);
|
||||||
int gold = ThreadLocalRandom.current().nextInt(low, high + 1);
|
int gold = ThreadLocalRandom.current().nextInt(low, high);
|
||||||
|
|
||||||
if (inHotzone == true)
|
|
||||||
gold = (int) (gold * HOTZONE_GOLD_RATE);
|
|
||||||
else
|
|
||||||
gold = (int) (gold * NORMAL_GOLD_RATE);
|
|
||||||
|
|
||||||
if (gold > 0) {
|
if (gold > 0) {
|
||||||
MobLoot goldAmount = new MobLoot(mob, gold);
|
MobLoot goldAmount = new MobLoot(mob, gold);
|
||||||
@@ -313,23 +363,31 @@ public enum LootManager {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void GenerateLootDrop(Mob mob, int tableID, Boolean inHotzone) {
|
public static void GenerateLootDrop(Mob mob, int tableID) {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
if(mob.parentZone.getSafeZone() == 1) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
MobLoot toAdd = getGenTableItem(tableID, mob);
|
||||||
|
if(toAdd.getItemBase().getType().equals(Enum.ItemType.CONTRACT) || toAdd.getItemBase().getType().equals(Enum.ItemType.RUNE))
|
||||||
|
return;//block all contracts and runes that drop outside the confines of the new system
|
||||||
|
|
||||||
MobLoot toAdd = getGenTableItem(tableID, mob, inHotzone);
|
if (toAdd != null) {
|
||||||
|
toAdd.setIsID(true);
|
||||||
if (toAdd != null)
|
|
||||||
mob.getCharItemManager().addItemToInventory(toAdd);
|
mob.getCharItemManager().addItemToInventory(toAdd);
|
||||||
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
//TODO chase down loot generation error, affects roughly 2% of drops
|
//TODO chase down loot generation error, affects roughly 2% of drops
|
||||||
int i = 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void GenerateEquipmentDrop(Mob mob) {
|
public static void GenerateEquipmentDrop(Mob mob) {
|
||||||
|
|
||||||
|
if(mob.parentZone.getSafeZone() == 1) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
//do equipment here
|
//do equipment here
|
||||||
int dropCount = 0;
|
int dropCount = 0;
|
||||||
if (mob.getEquip() != null)
|
if (mob.getEquip() != null)
|
||||||
@@ -340,25 +398,64 @@ public enum LootManager {
|
|||||||
|
|
||||||
float equipmentRoll = ThreadLocalRandom.current().nextInt(1, 100 + 1);
|
float equipmentRoll = ThreadLocalRandom.current().nextInt(1, 100 + 1);
|
||||||
float dropChance = me.getDropChance() * 100;
|
float dropChance = me.getDropChance() * 100;
|
||||||
|
|
||||||
if (equipmentRoll > dropChance)
|
if (equipmentRoll > dropChance)
|
||||||
continue;
|
continue;
|
||||||
|
ItemBase genericIB = me.getItemBase();
|
||||||
|
if(genericIB.isVorg()){
|
||||||
|
if(genericIB.isClothArmor()){
|
||||||
|
//get random cloth piece
|
||||||
|
genericIB = getRandomVorgCloth();//ItemBase.getItemBase(vorg_cloth_uuids.get(ThreadLocalRandom.current().nextInt(0,vorg_cloth_uuids.size() - 1)));
|
||||||
|
} else if(genericIB.isHeavyArmor()){
|
||||||
|
//get random heavy armor piece
|
||||||
|
genericIB = getRandomVorgHA();//ItemBase.getItemBase(vorg_ha_uuids.get(ThreadLocalRandom.current().nextInt(0,vorg_ha_uuids.size() - 1)));
|
||||||
|
} else if(genericIB.isMediumArmor()){
|
||||||
|
//get random medium armor piece
|
||||||
|
genericIB = getRandomVorgMA();//ItemBase.getItemBase(vorg_ma_uuids.get(ThreadLocalRandom.current().nextInt(0,vorg_ma_uuids.size() - 1)));
|
||||||
|
} else if(genericIB.isLightArmor()){
|
||||||
|
//get random light armor piece
|
||||||
|
genericIB = getRandomVorgLA();//ItemBase.getItemBase(vorg_la_uuids.get(ThreadLocalRandom.current().nextInt(0,vorg_la_uuids.size() - 1)));
|
||||||
|
}
|
||||||
|
mob.spawnTime = ThreadLocalRandom.current().nextInt(300,2700);
|
||||||
|
}
|
||||||
|
MobLoot ml = new MobLoot(mob, genericIB, false);
|
||||||
|
|
||||||
MobLoot ml = new MobLoot(mob, me.getItemBase(), false);
|
if (ml != null && dropCount < 1 && genericIB.isVorg() == false) {
|
||||||
|
|
||||||
if (ml != null && dropCount < 1) {
|
|
||||||
ml.setIsID(true);
|
ml.setIsID(true);
|
||||||
ml.setDurabilityCurrent((short) (ml.getDurabilityCurrent() - ThreadLocalRandom.current().nextInt(5) + 1));
|
ml.setDurabilityCurrent((short) (ml.getDurabilityCurrent() - ThreadLocalRandom.current().nextInt(5) + 1));
|
||||||
mob.getCharItemManager().addItemToInventory(ml);
|
mob.getCharItemManager().addItemToInventory(ml);
|
||||||
dropCount = 1;
|
dropCount = 1;
|
||||||
//break; // Exit on first successful roll.
|
//break; // Exit on first successful roll.
|
||||||
}
|
}
|
||||||
|
if(ml != null && genericIB.isVorg() && mob.getMobBaseID() != 14062){
|
||||||
|
ml.setIsID(true);
|
||||||
|
ml.setDurabilityCurrent(ml.getDurabilityMax());
|
||||||
|
mob.getCharItemManager().addItemToInventory(ml);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void GenerateInventoryDrop(Mob mob, BootySetEntry bse) {
|
public static void GenerateInventoryDrop(Mob mob, BootySetEntry bse) {
|
||||||
|
|
||||||
int chanceRoll = ThreadLocalRandom.current().nextInt(1, 100 + 1);
|
if(ItemBase.getItemBase(bse.itemBase).isDiscRune()) {
|
||||||
|
if(!Mob.disciplineDroppers.contains(mob))
|
||||||
|
Mob.disciplineDroppers.add(mob);
|
||||||
|
|
||||||
|
mob.setResists(new Resists("Dropper"));
|
||||||
|
ChatSystemMsg chatMsg = new ChatSystemMsg(null, mob.getName() + " in " + mob.getParentZone().getName() + " has found the " + ItemBase.getItemBase(bse.itemBase).getName() + ". Are you tough enough to take it?");
|
||||||
|
chatMsg.setMessageType(10);
|
||||||
|
chatMsg.setChannel(Enum.ChatChannelType.SYSTEM.getChannelID());
|
||||||
|
DispatchMessage.dispatchMsgToAll(chatMsg);
|
||||||
|
}
|
||||||
|
|
||||||
|
//if((bse.itemBase == 3040 || bse.itemBase == 3021) && mob.level < 80){
|
||||||
|
// chance = 100;
|
||||||
|
//}
|
||||||
|
|
||||||
|
if(mob.parentZone.getSafeZone() == 1) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int chanceRoll = ThreadLocalRandom.current().nextInt(1, 99);
|
||||||
|
|
||||||
//early exit, failed to hit minimum chance roll
|
//early exit, failed to hit minimum chance roll
|
||||||
|
|
||||||
@@ -454,4 +551,164 @@ public enum LootManager {
|
|||||||
itemMan.addItemToInventory(playerWinnings);
|
itemMan.addItemToInventory(playerWinnings);
|
||||||
itemMan.updateInventory();
|
itemMan.updateInventory();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static MobLoot rollForContract(int table, Mob mob){
|
||||||
|
|
||||||
|
int roll = 99;
|
||||||
|
if (table == 1900 || table == 1500)
|
||||||
|
roll = 73;
|
||||||
|
GenTableEntry selectedRow = GenTableEntry.rollTable(table, roll, 1.0f);
|
||||||
|
if (selectedRow == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
int itemTableId = selectedRow.itemTableID;
|
||||||
|
|
||||||
|
if (_itemTables.containsKey(itemTableId) == false)
|
||||||
|
return null;
|
||||||
|
ItemTableEntry tableRow = ItemTableEntry.rollTable(itemTableId, ThreadLocalRandom.current().nextInt(75,321));
|
||||||
|
if (tableRow == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
int itemUUID = tableRow.cacheID;
|
||||||
|
|
||||||
|
if (itemUUID == 0)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
MobLoot outItem = new MobLoot(mob, ItemBase.getItemBase(itemUUID), false);
|
||||||
|
if(outItem != null) {
|
||||||
|
mob.contractCounter = ThreadLocalRandom.current().nextInt(200);
|
||||||
|
ChatSystemMsg chatMsg = new ChatSystemMsg(null, mob.getName() + " looks like he found something special");
|
||||||
|
chatMsg.setMessageType(10);
|
||||||
|
chatMsg.setChannel(Enum.ChatChannelType.SYSTEM.getChannelID());
|
||||||
|
DispatchMessage.dispatchMsgToInterestArea(mob,chatMsg, Enum.DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE,false,false);
|
||||||
|
return outItem;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
public static MobLoot rollForRune(int table, Mob mob){
|
||||||
|
int roll = 97;
|
||||||
|
if(table == 1900 || table == 1500){
|
||||||
|
roll = 77;
|
||||||
|
}
|
||||||
|
GenTableEntry selectedRow = GenTableEntry.rollTable(table, roll, 1.0f);
|
||||||
|
if (selectedRow == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
int itemTableId = selectedRow.itemTableID;
|
||||||
|
|
||||||
|
if (_itemTables.containsKey(itemTableId) == false)
|
||||||
|
return null;
|
||||||
|
ItemTableEntry tableRow = ItemTableEntry.rollTable(itemTableId, ThreadLocalRandom.current().nextInt(75,321));
|
||||||
|
if (tableRow == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
int itemUUID = tableRow.cacheID;
|
||||||
|
|
||||||
|
if (itemUUID == 0)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
MobLoot outItem = new MobLoot(mob, ItemBase.getItemBase(itemUUID), false);
|
||||||
|
if(outItem != null) {
|
||||||
|
mob.runeCounter = ThreadLocalRandom.current().nextInt(200);
|
||||||
|
ChatSystemMsg chatMsg = new ChatSystemMsg(null, mob.getName() + " looks like he found something special");
|
||||||
|
chatMsg.setMessageType(10);
|
||||||
|
chatMsg.setChannel(Enum.ChatChannelType.SYSTEM.getChannelID());
|
||||||
|
DispatchMessage.dispatchMsgToInterestArea(mob,chatMsg, Enum.DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE,false,false);
|
||||||
|
return outItem;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
public static MobLoot rollForGlass( Mob mob){
|
||||||
|
ItemTableEntry tableRow = ItemTableEntry.rollTable(126, ThreadLocalRandom.current().nextInt(220,321));
|
||||||
|
if (tableRow == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
int itemUUID = tableRow.cacheID;
|
||||||
|
|
||||||
|
if (itemUUID == 0)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
MobLoot outItem = new MobLoot(mob, ItemBase.getItemBase(itemUUID), false);
|
||||||
|
if(outItem != null)
|
||||||
|
return outItem;
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ItemBase getRandomVorgCloth(){
|
||||||
|
int random = ThreadLocalRandom.current().nextInt(100);
|
||||||
|
if(random < 20)
|
||||||
|
return ItemBase.getItemBase(27600);
|
||||||
|
if(random > 20 && random < 40)
|
||||||
|
return ItemBase.getItemBase(188700);
|
||||||
|
if(random > 40 && random < 60)
|
||||||
|
return ItemBase.getItemBase(188720);
|
||||||
|
if(random > 60 && random < 80)
|
||||||
|
return ItemBase.getItemBase(189550);
|
||||||
|
if(random > 80)
|
||||||
|
return ItemBase.getItemBase(189560);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ItemBase getRandomVorgLA(){
|
||||||
|
int random = ThreadLocalRandom.current().nextInt(160);
|
||||||
|
if(random < 20)
|
||||||
|
return ItemBase.getItemBase(27550);
|
||||||
|
if(random > 20 && random < 40)
|
||||||
|
return ItemBase.getItemBase(27560);
|
||||||
|
if(random > 40 && random < 60)
|
||||||
|
return ItemBase.getItemBase(189100);
|
||||||
|
if(random > 60 && random < 80)
|
||||||
|
return ItemBase.getItemBase(189110);
|
||||||
|
if(random > 80 && random < 100)
|
||||||
|
return ItemBase.getItemBase(189120);
|
||||||
|
if(random > 100 && random < 120)
|
||||||
|
return ItemBase.getItemBase(189130);
|
||||||
|
if(random > 120 && random < 140)
|
||||||
|
return ItemBase.getItemBase(189140);
|
||||||
|
if(random > 140)
|
||||||
|
return ItemBase.getItemBase(189150);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
public static ItemBase getRandomVorgMA(){
|
||||||
|
int random = ThreadLocalRandom.current().nextInt(160);
|
||||||
|
if(random < 20)
|
||||||
|
return ItemBase.getItemBase(27570);
|
||||||
|
if(random > 20 && random < 40)
|
||||||
|
return ItemBase.getItemBase(188900);
|
||||||
|
if(random > 40 && random < 60)
|
||||||
|
return ItemBase.getItemBase(188910);
|
||||||
|
if(random > 60 && random < 80)
|
||||||
|
return ItemBase.getItemBase(188920);
|
||||||
|
if(random > 80 && random < 100)
|
||||||
|
return ItemBase.getItemBase(188930);
|
||||||
|
if(random > 100 && random < 120)
|
||||||
|
return ItemBase.getItemBase(188940);
|
||||||
|
if(random > 120 && random < 140)
|
||||||
|
return ItemBase.getItemBase(188950);
|
||||||
|
if(random > 140)
|
||||||
|
return ItemBase.getItemBase(189500);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
public static ItemBase getRandomVorgHA(){
|
||||||
|
int random = ThreadLocalRandom.current().nextInt(180);
|
||||||
|
if(random < 20)
|
||||||
|
return ItemBase.getItemBase(27580);
|
||||||
|
if(random > 20 && random < 40)
|
||||||
|
return ItemBase.getItemBase(27590);
|
||||||
|
if(random > 40 && random < 60)
|
||||||
|
return ItemBase.getItemBase(188500);
|
||||||
|
if(random > 60 && random < 80)
|
||||||
|
return ItemBase.getItemBase(188510);
|
||||||
|
if(random > 80 && random < 100)
|
||||||
|
return ItemBase.getItemBase(188520);
|
||||||
|
if(random > 100 && random < 120)
|
||||||
|
return ItemBase.getItemBase(188530);
|
||||||
|
if(random > 120 && random < 140)
|
||||||
|
return ItemBase.getItemBase(188540);
|
||||||
|
if(random > 140 && random < 160)
|
||||||
|
return ItemBase.getItemBase(188550);
|
||||||
|
if(random > 160)
|
||||||
|
return ItemBase.getItemBase(189510);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,320 +5,206 @@
|
|||||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
||||||
// Magicbane Emulator Project © 2013 - 2022
|
// Magicbane Emulator Project © 2013 - 2022
|
||||||
// www.magicbane.com
|
// www.magicbane.com
|
||||||
|
|
||||||
package engine.gameManager;
|
package engine.gameManager;
|
||||||
|
|
||||||
// Defines static methods which comprise the magicbane
|
// Defines static methods which comprise the magicbane
|
||||||
// building maintenance system.
|
// building maintenance system.
|
||||||
|
|
||||||
import engine.Enum;
|
import engine.Enum;
|
||||||
import engine.objects.*;
|
import engine.objects.*;
|
||||||
import org.pmw.tinylog.Logger;
|
import org.pmw.tinylog.Logger;
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
public enum MaintenanceManager {
|
public enum MaintenanceManager {
|
||||||
|
|
||||||
MAINTENANCEMANAGER;
|
MAINTENANCEMANAGER;
|
||||||
|
|
||||||
public static void setMaintDateTime(Building building, LocalDateTime maintDate) {
|
public static void setMaintDateTime(Building building, LocalDateTime maintDate) {
|
||||||
|
|
||||||
building.maintDateTime = maintDate;
|
building.maintDateTime = maintDate;
|
||||||
DbManager.BuildingQueries.updateMaintDate(building);
|
DbManager.BuildingQueries.updateMaintDate(building);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
public static void dailyMaintenance() {
|
||||||
public static void processBuildingMaintenance() {
|
Logger.info("Maintenance has started");
|
||||||
|
// Run maintenance on player buildings
|
||||||
ArrayList<AbstractGameObject> buildingList;
|
if (ConfigManager.MB_WORLD_MAINTENANCE.getValue().equalsIgnoreCase("true"))
|
||||||
ArrayList<Building> maintList;
|
processMaintenance();
|
||||||
ArrayList<Building> derankList = new ArrayList<>();
|
else
|
||||||
|
Logger.info("Maintenance Costings: DISABLED");
|
||||||
Logger.info("Starting Maintenance on Player Buildings");
|
Logger.info("Maintenance has completed!");
|
||||||
|
}
|
||||||
// Build list of buildings to apply maintenance on.
|
public static void processMaintenance() {
|
||||||
|
//create list of all cities
|
||||||
buildingList = new ArrayList(DbManager.getList(Enum.GameObjectType.Building));
|
ConcurrentHashMap<Integer, AbstractGameObject> worldCities = DbManager.getMap(Enum.GameObjectType.City);
|
||||||
maintList = buildMaintList(buildingList);
|
//loop all cities
|
||||||
|
for (AbstractGameObject ago : worldCities.values()) {
|
||||||
// Deduct upkeep and build list of buildings
|
if (ago.getObjectType().equals(Enum.GameObjectType.City)) {
|
||||||
// which did not have funds available
|
City city = (City) ago;
|
||||||
|
if(city == null || !city.getParent().isPlayerCity())
|
||||||
for (Building building : maintList) {
|
continue;
|
||||||
|
Building tol = city.getTOL();
|
||||||
if (chargeUpkeep(building) == false)
|
if(tol == null)
|
||||||
derankList.add(building);
|
continue;
|
||||||
}
|
LocalDateTime maintenanceDueDate = tol.maintDateTime.withHour(1).withMinute(0).withSecond(0);
|
||||||
// Reset maintenance dates for these buildings
|
LocalDateTime now = LocalDateTime.now();
|
||||||
|
if(now.isAfter(maintenanceDueDate))
|
||||||
for (Building building : maintList) {
|
processTolMaintenance(tol, city.getWarehouse());
|
||||||
setMaintDateTime(building, LocalDateTime.now().plusDays(7));
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
// Derak or destroy buildings that did not
|
|
||||||
// have funds available.
|
|
||||||
|
|
||||||
for (Building building : derankList)
|
|
||||||
building.destroyOrDerank(null);
|
|
||||||
|
|
||||||
Logger.info("Structures: " + buildingList.size() + " Maint: " + maintList.size() + " Derank: " + derankList.size());
|
|
||||||
}
|
}
|
||||||
|
public static void processTolMaintenance(Building tol, Warehouse warehouse){
|
||||||
// Iterate over all buildings in game and apply exclusion rules
|
if(tol == null)
|
||||||
// returning a list of building for which maintenance is due.
|
return;
|
||||||
|
if(tol.getRank() == 8)
|
||||||
private static ArrayList<Building> buildMaintList(ArrayList<AbstractGameObject> buildingList) {
|
handleR8(tol,warehouse);
|
||||||
|
else
|
||||||
ArrayList<Building> maintList = new ArrayList<>();
|
handleNormal(tol,warehouse);
|
||||||
|
}
|
||||||
for (AbstractGameObject gameObject : buildingList) {
|
public static void handleNormal(Building tol, Warehouse warehouse){
|
||||||
|
//handle r7 and lower ToL maintenance
|
||||||
Building building = (Building) gameObject;
|
int goldDue = 3000000;
|
||||||
|
//enough on strongbox alone to pay
|
||||||
// No maintenance on NPC owned buildings (Cache loaded)
|
if (tol.getStrongboxValue() >= goldDue) {
|
||||||
|
tol.maintDateTime = LocalDateTime.now().plusDays(7);
|
||||||
if (building.getProtectionState() == Enum.ProtectionState.NPC)
|
if(DbManager.BuildingQueries.updateMaintDate(tol)) {
|
||||||
continue;
|
tol.setStrongboxValue(tol.getStrongboxValue() - goldDue);
|
||||||
|
|
||||||
// No maintenance on constructing meshes
|
|
||||||
|
|
||||||
if (building.getRank() < 1)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
// No Maintenance on furniture
|
|
||||||
|
|
||||||
if (building.parentBuildingID != 0)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
// No Blueprint?
|
|
||||||
|
|
||||||
if (building.getBlueprint() == null) {
|
|
||||||
Logger.error("Blueprint missing for uuid: " + building.getObjectUUID());
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
|
return;
|
||||||
// No maintenance on banestones omfg
|
}
|
||||||
|
int newStrongboxValue = tol.getStrongboxValue();
|
||||||
if (building.getBlueprint().getBuildingGroup().equals(Enum.BuildingGroup.BANESTONE))
|
int newWarehouseGold = 0;
|
||||||
continue;
|
if(warehouse != null && warehouse.getResources().get(ItemBase.getItemBase(7)) != null) {
|
||||||
|
newWarehouseGold = warehouse.getResources().get(ItemBase.getItemBase(7));
|
||||||
// no maintenance on Mines omfg
|
} else{
|
||||||
|
//wasnt enough on strongbox and gold in warehouse is empty
|
||||||
if (building.getBlueprint().getBuildingGroup().equals(Enum.BuildingGroup.MINE))
|
tol.maintDateTime = LocalDateTime.now().plusDays(1);
|
||||||
continue;
|
if(DbManager.BuildingQueries.updateMaintDate(tol)) {
|
||||||
|
tol.destroyOrDerank(null);
|
||||||
// Null Maintenance date?
|
|
||||||
|
|
||||||
if (building.maintDateTime == null) {
|
|
||||||
Logger.error("Null maint date for building UUID: " + building.getObjectUUID());
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
|
return;
|
||||||
// Maintenance date is in the future
|
}
|
||||||
|
//some on strongbox to pay
|
||||||
if (building.maintDateTime.isAfter(LocalDateTime.now()))
|
if (tol.getStrongboxValue() > 0) {
|
||||||
continue;
|
newStrongboxValue = 0;
|
||||||
|
goldDue -= tol.getStrongboxValue();
|
||||||
|
}
|
||||||
//no maintenance if day of week doesnt match
|
if(newWarehouseGold < goldDue){
|
||||||
if (LocalDateTime.now().getDayOfWeek().ordinal() != building.maintDateTime.getDayOfWeek().ordinal()) {
|
//not enough gold to pay, you miss maintenance
|
||||||
continue;
|
tol.maintDateTime = LocalDateTime.now().plusDays(1);
|
||||||
|
if(DbManager.BuildingQueries.updateMaintDate(tol)) {
|
||||||
|
tol.destroyOrDerank(null);
|
||||||
}
|
}
|
||||||
// Add building to maintenance queue
|
return;
|
||||||
|
|
||||||
maintList.add(building);
|
|
||||||
}
|
}
|
||||||
|
newWarehouseGold -= goldDue;
|
||||||
return maintList;
|
tol.maintDateTime = LocalDateTime.now().plusDays(7);
|
||||||
}
|
if(DbManager.BuildingQueries.updateMaintDate(tol) && DbManager.WarehouseQueries.updateGold(warehouse,newWarehouseGold)) {
|
||||||
|
warehouse.getResources().put(ItemBase.getItemBase(7), newWarehouseGold);
|
||||||
// Method removes the appropriate amount of gold/resources from
|
tol.setStrongboxValue(newStrongboxValue);
|
||||||
// a building according to it's maintenance schedule. True/False
|
|
||||||
// is returned indicating if the building had enough funds to cover.
|
|
||||||
|
|
||||||
public static boolean chargeUpkeep(Building building) {
|
|
||||||
|
|
||||||
City city = null;
|
|
||||||
Warehouse warehouse = null;
|
|
||||||
int maintCost = 0;
|
|
||||||
int overDraft = 0;
|
|
||||||
boolean hasFunds = false;
|
|
||||||
boolean hasResources = false;
|
|
||||||
int resourceValue = 0;
|
|
||||||
|
|
||||||
city = building.getCity();
|
|
||||||
|
|
||||||
if (city != null)
|
|
||||||
warehouse = city.getWarehouse();
|
|
||||||
|
|
||||||
// Cache maintenance cost value
|
|
||||||
|
|
||||||
maintCost = building.getMaintCost();
|
|
||||||
|
|
||||||
// Something went wrong. Missing buildinggroup from switch?
|
|
||||||
|
|
||||||
if (maintCost == 0) {
|
|
||||||
Logger.error("chargeUpkeep", "Error retrieving rankcost for " + building.getName() + " uuid:" + building.getObjectUUID() + "buildinggroup:" + building.getBlueprint().getBuildingGroup().name());
|
|
||||||
// check if there is enough gold on the building
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if (building.getStrongboxValue() >= maintCost)
|
public static void handleR8(Building tol, Warehouse warehouse){
|
||||||
hasFunds = true;
|
//handle r8 ToL maintenance
|
||||||
|
//cannot pay r8 maintenance without a warehouse
|
||||||
// If we cannot cover with just the strongbox
|
if(warehouse == null && DbManager.BuildingQueries.updateMaintDate(tol)) {
|
||||||
// see if there is a warehouse that will cover
|
tol.destroyOrDerank(null);
|
||||||
// the overdraft for us.
|
tol.maintDateTime = LocalDateTime.now().plusDays(1);
|
||||||
|
return;
|
||||||
|
|
||||||
if (hasFunds == false && (building.assetIsProtected() || building.getBlueprint().getBuildingGroup() == Enum.BuildingGroup.WAREHOUSE)) {
|
|
||||||
overDraft = maintCost - building.getStrongboxValue();
|
|
||||||
}
|
}
|
||||||
|
//handle resource processing
|
||||||
if ((overDraft > 0))
|
int goldDue = 3000000;
|
||||||
if ((building.getBlueprint().getBuildingGroup().equals(Enum.BuildingGroup.SHRINE) == false) &&
|
int galvorDue = 5;
|
||||||
(warehouse != null) && building.assetIsProtected() == true &&
|
int wormwoodDue = 5;
|
||||||
(warehouse.getResources().get(ItemBase.GOLD_ITEM_BASE)) >= overDraft) {
|
int stoneDue = 5000;
|
||||||
hasFunds = true;
|
int lumberDue = 5000;
|
||||||
|
int goldStrongBox = tol.getStrongboxValue();
|
||||||
|
int goldWarehouse = 0;
|
||||||
|
int galvorWarehouse;
|
||||||
|
int wormwoodWarehouse;
|
||||||
|
int stoneWarehouse;
|
||||||
|
int lumberWarehouse;
|
||||||
|
if(warehouse.getResources().get(Warehouse.galvorIB) != null) {
|
||||||
|
galvorWarehouse = warehouse.getResources().get(Warehouse.galvorIB);
|
||||||
|
}else {
|
||||||
|
tol.maintDateTime = LocalDateTime.now().plusDays(1);
|
||||||
|
if(DbManager.BuildingQueries.updateMaintDate(tol)) {
|
||||||
|
tol.destroyOrDerank(null);
|
||||||
}
|
}
|
||||||
|
return;
|
||||||
// If this is an R8 tree, validate that we can
|
}
|
||||||
// cover the resources required
|
if(warehouse.getResources().get(Warehouse.stoneIB) != null) {
|
||||||
|
stoneWarehouse = warehouse.getResources().get(Warehouse.stoneIB);
|
||||||
if (building.getRank() == 8) {
|
}else {
|
||||||
|
tol.maintDateTime = LocalDateTime.now().plusDays(1);
|
||||||
hasResources = true;
|
if(DbManager.BuildingQueries.updateMaintDate(tol)) {
|
||||||
|
tol.destroyOrDerank(null);
|
||||||
if (warehouse == null)
|
|
||||||
hasResources = false;
|
|
||||||
else {
|
|
||||||
|
|
||||||
resourceValue = warehouse.getResources().get(Warehouse.stoneIB);
|
|
||||||
|
|
||||||
if (resourceValue < 1500)
|
|
||||||
hasResources = false;
|
|
||||||
|
|
||||||
resourceValue = warehouse.getResources().get(Warehouse.lumberIB);
|
|
||||||
|
|
||||||
if (resourceValue < 1500)
|
|
||||||
hasResources = false;
|
|
||||||
|
|
||||||
resourceValue = warehouse.getResources().get(Warehouse.galvorIB);
|
|
||||||
|
|
||||||
if (resourceValue < 5)
|
|
||||||
hasResources = false;
|
|
||||||
|
|
||||||
resourceValue = warehouse.getResources().get(Warehouse.wormwoodIB);
|
|
||||||
|
|
||||||
if (resourceValue < 5)
|
|
||||||
hasResources = false;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
// Validation completed but has failed. We can derank
|
if(warehouse.getResources().get(Warehouse.wormwoodIB) != null) {
|
||||||
// the target building and early exit
|
wormwoodWarehouse = warehouse.getResources().get(Warehouse.wormwoodIB);
|
||||||
|
}else {
|
||||||
if ((hasFunds == false) ||
|
tol.maintDateTime = LocalDateTime.now().plusDays(1);
|
||||||
((building.getRank() == 8) && !hasResources)) {
|
if(DbManager.BuildingQueries.updateMaintDate(tol)) {
|
||||||
|
tol.destroyOrDerank(null);
|
||||||
// Add cash back to strongbox for lost rank if the building isn't being destroyed
|
|
||||||
// and it's not an R8 deranking
|
|
||||||
|
|
||||||
if ((building.getRank() > 1) && (building.getRank() < 8)) {
|
|
||||||
building.setStrongboxValue(building.getStrongboxValue() + building.getBlueprint().getRankCost(Math.min(building.getRank(), 7)));
|
|
||||||
}
|
}
|
||||||
|
return;
|
||||||
return false; // Early exit for having failed to meet maintenance
|
|
||||||
}
|
}
|
||||||
|
if(warehouse.getResources().get(Warehouse.lumberIB) != null) {
|
||||||
// Remove cash and resources
|
lumberWarehouse = warehouse.getResources().get(Warehouse.lumberIB);
|
||||||
|
}else {
|
||||||
// withdraw what we can from the building
|
tol.maintDateTime = LocalDateTime.now().plusDays(1);
|
||||||
|
if(DbManager.BuildingQueries.updateMaintDate(tol)) {
|
||||||
building.setStrongboxValue(building.getStrongboxValue() - (maintCost - overDraft));
|
tol.destroyOrDerank(null);
|
||||||
|
|
||||||
// withdraw overdraft from the whorehouse
|
|
||||||
|
|
||||||
if (overDraft > 0) {
|
|
||||||
|
|
||||||
resourceValue = warehouse.getResources().get(Warehouse.goldIB);
|
|
||||||
|
|
||||||
if (DbManager.WarehouseQueries.updateGold(warehouse, resourceValue - overDraft) == true) {
|
|
||||||
warehouse.getResources().put(Warehouse.goldIB, resourceValue - overDraft);
|
|
||||||
warehouse.AddTransactionToWarehouse(Enum.GameObjectType.Building, building.getObjectUUID(), Enum.TransactionType.WITHDRAWL, Resource.GOLD, overDraft);
|
|
||||||
} else {
|
|
||||||
Logger.error("gold update failed for warehouse of UUID:" + warehouse.getObjectUUID());
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
boolean canPay = true;
|
||||||
// Early exit as we're done if we're not an R8 tree
|
if(goldStrongBox >= goldDue){
|
||||||
|
goldStrongBox -= goldDue;
|
||||||
if (building.getRank() < 8)
|
goldDue = 0;
|
||||||
return true;
|
|
||||||
|
|
||||||
// Now for the resources if it's an R8 tree
|
|
||||||
|
|
||||||
// Withdraw Stone
|
|
||||||
|
|
||||||
resourceValue = warehouse.getResources().get(Warehouse.stoneIB);
|
|
||||||
|
|
||||||
if (DbManager.WarehouseQueries.updateStone(warehouse, resourceValue - 1500) == true) {
|
|
||||||
warehouse.getResources().put(Warehouse.stoneIB, resourceValue - 1500);
|
|
||||||
warehouse.AddTransactionToWarehouse(Enum.GameObjectType.Building, building.getObjectUUID(), Enum.TransactionType.WITHDRAWL, Resource.STONE, 1500);
|
|
||||||
} else {
|
|
||||||
Logger.error("stone update failed for warehouse of UUID:" + warehouse.getObjectUUID());
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
if (tol.getStrongboxValue() > 0) {
|
||||||
// Withdraw Lumber
|
goldStrongBox = 0;
|
||||||
|
goldDue -= tol.getStrongboxValue();
|
||||||
resourceValue = warehouse.getResources().get(Warehouse.lumberIB);
|
|
||||||
|
|
||||||
if (DbManager.WarehouseQueries.updateLumber(warehouse, resourceValue - 1500) == true) {
|
|
||||||
warehouse.getResources().put(Warehouse.lumberIB, resourceValue - 1500);
|
|
||||||
warehouse.AddTransactionToWarehouse(Enum.GameObjectType.Building, building.getObjectUUID(), Enum.TransactionType.WITHDRAWL, Resource.LUMBER, 1500);
|
|
||||||
} else {
|
|
||||||
Logger.error("lumber update failed for warehouse of UUID:" + warehouse.getObjectUUID());
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
if(warehouse.getResources().get(Warehouse.goldIB) != null) {
|
||||||
// Withdraw Galvor
|
goldWarehouse = warehouse.getResources().get(Warehouse.goldIB);
|
||||||
|
}else if(goldDue > 0){
|
||||||
resourceValue = warehouse.getResources().get(Warehouse.galvorIB);
|
tol.maintDateTime = LocalDateTime.now().plusDays(1);
|
||||||
|
if(DbManager.BuildingQueries.updateMaintDate(tol)) {
|
||||||
if (DbManager.WarehouseQueries.updateGalvor(warehouse, resourceValue - 5) == true) {
|
tol.destroyOrDerank(null);
|
||||||
warehouse.getResources().put(Warehouse.galvorIB, resourceValue - 5);
|
}
|
||||||
warehouse.AddTransactionToWarehouse(Enum.GameObjectType.Building, building.getObjectUUID(), Enum.TransactionType.WITHDRAWL, Resource.GALVOR, 5);
|
return;
|
||||||
} else {
|
|
||||||
Logger.error("galvor update failed for warehouse of UUID:" + warehouse.getObjectUUID());
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
if(wormwoodDue > wormwoodWarehouse)
|
||||||
resourceValue = warehouse.getResources().get(Warehouse.wormwoodIB);
|
canPay = false;
|
||||||
|
if(galvorDue > galvorWarehouse)
|
||||||
if (DbManager.WarehouseQueries.updateWormwood(warehouse, resourceValue - 5) == true) {
|
canPay = false;
|
||||||
warehouse.getResources().put(Warehouse.wormwoodIB, resourceValue - 5);
|
if(lumberDue > lumberWarehouse)
|
||||||
warehouse.AddTransactionToWarehouse(Enum.GameObjectType.Building, building.getObjectUUID(), Enum.TransactionType.WITHDRAWL, Resource.WORMWOOD, 5);
|
canPay = false;
|
||||||
} else {
|
if(stoneDue > stoneWarehouse)
|
||||||
Logger.error("wyrmwood update failed for warehouse of UUID:" + warehouse.getObjectUUID());
|
canPay = false;
|
||||||
|
if(goldDue > goldWarehouse)
|
||||||
|
canPay = false;
|
||||||
|
if(!canPay){
|
||||||
|
tol.maintDateTime = LocalDateTime.now().plusDays(1);
|
||||||
|
if(DbManager.BuildingQueries.updateMaintDate(tol)) {
|
||||||
|
tol.destroyOrDerank(null);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
tol.setStrongboxValue(goldStrongBox);
|
||||||
|
if(DbManager.WarehouseQueries.updateGold(warehouse,goldWarehouse - goldDue)){
|
||||||
|
if(DbManager.WarehouseQueries.updateStone(warehouse,stoneWarehouse - stoneDue)){
|
||||||
|
if(DbManager.WarehouseQueries.updateLumber(warehouse,lumberWarehouse - lumberDue)){
|
||||||
|
if(DbManager.WarehouseQueries.updateGalvor(warehouse,galvorWarehouse - galvorDue)){
|
||||||
|
if(DbManager.WarehouseQueries.updateWormwood(warehouse,wormwoodWarehouse - wormwoodDue)){
|
||||||
|
tol.maintDateTime = LocalDateTime.now().plusDays(1);
|
||||||
|
if(DbManager.BuildingQueries.updateMaintDate(tol)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void dailyMaintenance() {
|
|
||||||
|
|
||||||
Logger.info("Maintenance has started");
|
|
||||||
|
|
||||||
// Run maintenance on player buildings
|
|
||||||
|
|
||||||
if (ConfigManager.MB_WORLD_MAINTENANCE.getValue().equalsIgnoreCase("true"))
|
|
||||||
processBuildingMaintenance();
|
|
||||||
else
|
|
||||||
Logger.info("Maintenance Costings: DISABLED");
|
|
||||||
|
|
||||||
Logger.info("Maintenance has completed!");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -69,9 +69,10 @@ public enum MovementManager {
|
|||||||
if (toMove.getObjectType().equals(GameObjectType.PlayerCharacter)) {
|
if (toMove.getObjectType().equals(GameObjectType.PlayerCharacter)) {
|
||||||
if (((PlayerCharacter) toMove).isCasting())
|
if (((PlayerCharacter) toMove).isCasting())
|
||||||
((PlayerCharacter) toMove).update();
|
((PlayerCharacter) toMove).update();
|
||||||
|
if(((PlayerCharacter) toMove).isFlying() && toMove.getEffects().containsKey("MoveBuff"))
|
||||||
|
PlayerCharacter.GroundPlayer(((PlayerCharacter) toMove));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
toMove.setIsCasting(false);
|
toMove.setIsCasting(false);
|
||||||
toMove.setItemCasting(false);
|
toMove.setItemCasting(false);
|
||||||
|
|
||||||
|
|||||||
@@ -23,14 +23,6 @@ public enum NPCManager {
|
|||||||
NPC_MANAGER;
|
NPC_MANAGER;
|
||||||
public static HashMap<Integer, ArrayList<Integer>> _runeSetMap = new HashMap<>();
|
public static HashMap<Integer, ArrayList<Integer>> _runeSetMap = new HashMap<>();
|
||||||
|
|
||||||
public static void LoadAllRuneSets() {
|
|
||||||
_runeSetMap = DbManager.ItemBaseQueries.LOAD_RUNES_FOR_NPC_AND_MOBS();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void LoadAllBootySets() {
|
|
||||||
LootManager._bootySetMap = DbManager.LootQueries.LOAD_BOOTY_TABLES();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void applyRuneSetEffects(Mob mob) {
|
public static void applyRuneSetEffects(Mob mob) {
|
||||||
|
|
||||||
// Early exit
|
// Early exit
|
||||||
@@ -127,10 +119,12 @@ public enum NPCManager {
|
|||||||
|
|
||||||
DbManager.removeFromCache(necroPet);
|
DbManager.removeFromCache(necroPet);
|
||||||
|
|
||||||
PlayerCharacter petOwner = necroPet.getOwner();
|
|
||||||
|
PlayerCharacter petOwner = (PlayerCharacter) necroPet.guardCaptain;
|
||||||
|
|
||||||
if (petOwner != null) {
|
if (petOwner != null) {
|
||||||
necroPet.setOwner(null);
|
|
||||||
|
necroPet.guardCaptain = null;
|
||||||
petOwner.setPet(null);
|
petOwner.setPet(null);
|
||||||
|
|
||||||
if (updateOwner == false)
|
if (updateOwner == false)
|
||||||
@@ -228,12 +222,14 @@ public enum NPCManager {
|
|||||||
WorldGrid.removeObject(toRemove);
|
WorldGrid.removeObject(toRemove);
|
||||||
DbManager.removeFromCache(toRemove);
|
DbManager.removeFromCache(toRemove);
|
||||||
|
|
||||||
PlayerCharacter petOwner = toRemove.getOwner();
|
|
||||||
|
PlayerCharacter petOwner = (PlayerCharacter) toRemove.guardCaptain;
|
||||||
|
|
||||||
if (petOwner != null) {
|
if (petOwner != null) {
|
||||||
|
|
||||||
petOwner.setPet(null);
|
petOwner.setPet(null);
|
||||||
toRemove.setOwner(null);
|
|
||||||
|
toRemove.guardCaptain = null;
|
||||||
|
|
||||||
PetMsg petMsg = new PetMsg(5, null);
|
PetMsg petMsg = new PetMsg(5, null);
|
||||||
Dispatch dispatch = Dispatch.borrow(petOwner, petMsg);
|
Dispatch dispatch = Dispatch.borrow(petOwner, petMsg);
|
||||||
@@ -340,10 +336,19 @@ public enum NPCManager {
|
|||||||
else
|
else
|
||||||
buildingSlot = BuildingManager.getAvailableSlot(abstractCharacter.building);
|
buildingSlot = BuildingManager.getAvailableSlot(abstractCharacter.building);
|
||||||
|
|
||||||
|
// Override slot for siege engines
|
||||||
|
|
||||||
|
if (abstractCharacter.getObjectType().equals(Enum.GameObjectType.Mob) && ((Mob) abstractCharacter).behaviourType.equals(Enum.MobBehaviourType.SiegeEngine)) {
|
||||||
|
Mob siegeMobile = (Mob) abstractCharacter;
|
||||||
|
buildingSlot = siegeMobile.guardCaptain.siegeMinionMap.size() + 2;
|
||||||
|
}
|
||||||
|
|
||||||
if (buildingSlot == -1)
|
if (buildingSlot == -1)
|
||||||
Logger.error("No available slot for NPC: " + abstractCharacter.getObjectUUID());
|
Logger.error("No available slot for NPC: " + abstractCharacter.getObjectUUID());
|
||||||
|
|
||||||
abstractCharacter.building.getHirelings().put(abstractCharacter, buildingSlot);
|
// Pets are regular mobiles not hirelings (Siege engines)
|
||||||
|
if (abstractCharacter.contract != null)
|
||||||
|
abstractCharacter.building.getHirelings().put(abstractCharacter, buildingSlot);
|
||||||
|
|
||||||
// Override bind and location for this npc derived
|
// Override bind and location for this npc derived
|
||||||
// from BuildingManager slot location data.
|
// from BuildingManager slot location data.
|
||||||
@@ -370,4 +375,53 @@ public enum NPCManager {
|
|||||||
|
|
||||||
return buildingSlot;
|
return buildingSlot;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static int getMaxMinions(Mob guardCaptain) {
|
||||||
|
|
||||||
|
int maxSlots;
|
||||||
|
|
||||||
|
switch (guardCaptain.getRank()) {
|
||||||
|
case 3:
|
||||||
|
maxSlots = 2;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
case 5:
|
||||||
|
maxSlots = 3;
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
maxSlots = 4;
|
||||||
|
break;
|
||||||
|
case 7:
|
||||||
|
maxSlots = 5;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
case 2:
|
||||||
|
default:
|
||||||
|
maxSlots = 1;
|
||||||
|
|
||||||
|
}
|
||||||
|
return maxSlots;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void AssignPatrolPoints(Mob mob) {
|
||||||
|
mob.patrolPoints = new ArrayList<>();
|
||||||
|
|
||||||
|
for (int i = 0; i < 5; ++i) {
|
||||||
|
float patrolRadius = mob.getSpawnRadius();
|
||||||
|
|
||||||
|
if (patrolRadius > 256)
|
||||||
|
patrolRadius = 256;
|
||||||
|
|
||||||
|
if (patrolRadius < 60)
|
||||||
|
patrolRadius = 60;
|
||||||
|
|
||||||
|
Vector3fImmutable newPatrolPoint = Vector3fImmutable.getRandomPointInCircle(mob.getBindLoc(), patrolRadius);
|
||||||
|
mob.patrolPoints.add(newPatrolPoint);
|
||||||
|
|
||||||
|
if (i == 1) {
|
||||||
|
mob.loc = newPatrolPoint;
|
||||||
|
mob.endLoc = newPatrolPoint;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ import engine.net.client.ClientConnection;
|
|||||||
import engine.net.client.msg.*;
|
import engine.net.client.msg.*;
|
||||||
import engine.objects.*;
|
import engine.objects.*;
|
||||||
import engine.powers.*;
|
import engine.powers.*;
|
||||||
|
import engine.powers.effectmodifiers.SeeInvisibleEffectModifier;
|
||||||
import engine.powers.poweractions.AbstractPowerAction;
|
import engine.powers.poweractions.AbstractPowerAction;
|
||||||
import engine.powers.poweractions.TrackPowerAction;
|
import engine.powers.poweractions.TrackPowerAction;
|
||||||
import engine.server.MBServerStatics;
|
import engine.server.MBServerStatics;
|
||||||
@@ -56,6 +57,22 @@ public enum PowersManager {
|
|||||||
public static HashMap<Integer, ArrayList<MobPowerEntry>> AllMobPowers;
|
public static HashMap<Integer, ArrayList<MobPowerEntry>> AllMobPowers;
|
||||||
private static JobScheduler js;
|
private static JobScheduler js;
|
||||||
|
|
||||||
|
public static String[] siegeBuffs = new String[]{"ART-004A","ARM-112A"};
|
||||||
|
public static String[] siegeDeBuffs = new String[]{"ACM-003A","WRT-003A"};
|
||||||
|
|
||||||
|
public static ArrayList<PowerQueObject> static_power_que = new ArrayList<>();
|
||||||
|
|
||||||
|
public static class PowerQueObject{
|
||||||
|
public PowerQueObject(PerformActionMsg inmsg,ClientConnection inorigin,boolean insendCastToSelf){
|
||||||
|
this.msg = inmsg;
|
||||||
|
this.origin = inorigin;
|
||||||
|
this.sendCastToSelf = insendCastToSelf;
|
||||||
|
}
|
||||||
|
public PerformActionMsg msg;
|
||||||
|
public ClientConnection origin;
|
||||||
|
public boolean sendCastToSelf;
|
||||||
|
}
|
||||||
|
|
||||||
private PowersManager() {
|
private PowersManager() {
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -165,11 +182,9 @@ public enum PowersManager {
|
|||||||
|
|
||||||
if (usePowerA(msg, origin, sendCastToSelf)) {
|
if (usePowerA(msg, origin, sendCastToSelf)) {
|
||||||
// Cast failed for some reason, reset timer
|
// Cast failed for some reason, reset timer
|
||||||
|
|
||||||
RecyclePowerMsg recyclePowerMsg = new RecyclePowerMsg(msg.getPowerUsedID());
|
RecyclePowerMsg recyclePowerMsg = new RecyclePowerMsg(msg.getPowerUsedID());
|
||||||
Dispatch dispatch = Dispatch.borrow(origin.getPlayerCharacter(), recyclePowerMsg);
|
Dispatch dispatch = Dispatch.borrow(origin.getPlayerCharacter(), recyclePowerMsg);
|
||||||
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY);
|
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY);
|
||||||
|
|
||||||
// Send Fail to cast message
|
// Send Fail to cast message
|
||||||
PlayerCharacter pc = SessionManager
|
PlayerCharacter pc = SessionManager
|
||||||
.getPlayerCharacter(origin);
|
.getPlayerCharacter(origin);
|
||||||
@@ -203,6 +218,8 @@ public enum PowersManager {
|
|||||||
if (playerCharacter == null)
|
if (playerCharacter == null)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
boolean skipCheck = false;
|
||||||
|
|
||||||
boolean CSRCast = false;
|
boolean CSRCast = false;
|
||||||
|
|
||||||
|
|
||||||
@@ -215,10 +232,67 @@ public enum PowersManager {
|
|||||||
+ Integer.toHexString(msg.getPowerUsedID()) + " ("
|
+ Integer.toHexString(msg.getPowerUsedID()) + " ("
|
||||||
+ msg.getPowerUsedID() + ')');
|
+ msg.getPowerUsedID() + ')');
|
||||||
}
|
}
|
||||||
|
Boolean earlyExit = false;
|
||||||
//Sending recycle message to player if died while casting.
|
//Sending recycle message to player if died while casting.
|
||||||
if (!playerCharacter.isAlive() && msg.getPowerUsedID() != 428589216) { //succor
|
if (!playerCharacter.isAlive() && msg.getPowerUsedID() != 428589216) { //succor
|
||||||
|
|
||||||
|
earlyExit = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(msg.getPowerUsedID() == 430628895){ // group teleport
|
||||||
|
|
||||||
|
Boolean activeBane = false;
|
||||||
|
|
||||||
|
if(ZoneManager.getCityAtLocation(playerCharacter.loc) != null && ZoneManager.getCityAtLocation(playerCharacter.loc).getBane() != null)
|
||||||
|
activeBane = ZoneManager.getCityAtLocation(playerCharacter.loc).getBane().getSiegePhase().equals(SiegePhase.WAR);
|
||||||
|
|
||||||
|
Zone currentZone = ZoneManager.findSmallestZone(playerCharacter.loc);
|
||||||
|
if(currentZone == null)
|
||||||
|
earlyExit = true;
|
||||||
|
|
||||||
|
if(currentZone.isPlayerCity() && !activeBane)
|
||||||
|
earlyExit = true;
|
||||||
|
|
||||||
|
if(currentZone.getName().contains("Mine") == true && currentZone.isPlayerCity() == false) {
|
||||||
|
for (Building building : currentZone.zoneBuildingSet) {
|
||||||
|
if (Mine.getMineFromTower(building.getObjectUUID()) != null) {
|
||||||
|
Mine currentMine = Mine.getMineFromTower(building.getObjectUUID());
|
||||||
|
if (currentMine.isActive == false) {
|
||||||
|
earlyExit = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Vector3fImmutable endLoc = new Vector3fImmutable(msg.getTargetX(),msg.getTargetY(),msg.getTargetZ());
|
||||||
|
currentZone = ZoneManager.findSmallestZone(endLoc);
|
||||||
|
|
||||||
|
if(currentZone == null)
|
||||||
|
earlyExit = true;
|
||||||
|
|
||||||
|
if(currentZone.isPlayerCity() && !activeBane)
|
||||||
|
earlyExit = true;
|
||||||
|
|
||||||
|
if(currentZone.getName().contains("Mine") == true && currentZone.isPlayerCity() == false) {
|
||||||
|
for (Building building : currentZone.zoneBuildingSet) {
|
||||||
|
if (Mine.getMineFromTower(building.getObjectUUID()) != null) {
|
||||||
|
Mine currentMine = Mine.getMineFromTower(building.getObjectUUID());
|
||||||
|
if (currentMine.isActive == false) {
|
||||||
|
earlyExit = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// get power
|
||||||
|
PowersBase pb = PowersManager.powersBaseByToken.get(msg.getPowerUsedID());
|
||||||
|
|
||||||
|
if(pb.description.equals("Personal Movement Buff") && playerCharacter.isFlying()) {
|
||||||
|
ChatManager.chatSystemInfo(playerCharacter, "You cannot use movement speed buffs while flying");
|
||||||
|
earlyExit = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (earlyExit) {
|
||||||
|
|
||||||
RecyclePowerMsg recyclePowerMsg = new RecyclePowerMsg(msg.getPowerUsedID());
|
RecyclePowerMsg recyclePowerMsg = new RecyclePowerMsg(msg.getPowerUsedID());
|
||||||
Dispatch dispatch = Dispatch.borrow(playerCharacter, recyclePowerMsg);
|
Dispatch dispatch = Dispatch.borrow(playerCharacter, recyclePowerMsg);
|
||||||
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY);
|
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY);
|
||||||
@@ -226,7 +300,6 @@ public enum PowersManager {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// if (!pc.getPowers().contains(msg.getPowerUsedID())) {
|
// if (!pc.getPowers().contains(msg.getPowerUsedID())) {
|
||||||
// sendPowerMsg(pc, 10, msg);
|
// sendPowerMsg(pc, 10, msg);
|
||||||
// return false;
|
// return false;
|
||||||
@@ -239,8 +312,6 @@ public enum PowersManager {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// get power
|
|
||||||
PowersBase pb = PowersManager.powersBaseByToken.get(msg.getPowerUsedID());
|
|
||||||
if (pb == null) {
|
if (pb == null) {
|
||||||
ChatManager.chatSayInfo(playerCharacter,
|
ChatManager.chatSayInfo(playerCharacter,
|
||||||
"This power is not implemented yet.");
|
"This power is not implemented yet.");
|
||||||
@@ -251,15 +322,18 @@ public enum PowersManager {
|
|||||||
return true;
|
return true;
|
||||||
// return false;
|
// return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (playerCharacter.getLastPower() != null)
|
if (playerCharacter.getLastPower() != null)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
//Check if Power Target is allowed to cast.
|
//Check if Power Target is allowed to cast.
|
||||||
|
|
||||||
|
|
||||||
// Check powers for normal users
|
// Check powers for normal users
|
||||||
if (playerCharacter.getPowers() == null || !playerCharacter.getPowers().containsKey(msg.getPowerUsedID()))
|
|
||||||
|
if(msg.getPowerUsedID() == 429399948)
|
||||||
|
for(CharacterRune cr : playerCharacter.getRunes())
|
||||||
|
if(cr.getRuneBaseID() == 3029)
|
||||||
|
skipCheck = true;
|
||||||
|
if (!skipCheck && (playerCharacter.getPowers() == null || !playerCharacter.getPowers().containsKey(msg.getPowerUsedID())))
|
||||||
if (!playerCharacter.isCSR()) {
|
if (!playerCharacter.isCSR()) {
|
||||||
if (!MBServerStatics.POWERS_DEBUG) {
|
if (!MBServerStatics.POWERS_DEBUG) {
|
||||||
// ChatManager.chatSayInfo(pc, "You may not cast that spell!");
|
// ChatManager.chatSayInfo(pc, "You may not cast that spell!");
|
||||||
@@ -272,18 +346,31 @@ public enum PowersManager {
|
|||||||
|
|
||||||
// get numTrains for power
|
// get numTrains for power
|
||||||
int trains = msg.getNumTrains();
|
int trains = msg.getNumTrains();
|
||||||
|
int token = pb.token;
|
||||||
|
int overrideTrains = 0;
|
||||||
|
int overrideRecycle = 0;
|
||||||
|
if(token == 429420458){
|
||||||
|
overrideTrains = 40;
|
||||||
|
overrideRecycle = 300000;
|
||||||
|
}
|
||||||
// can't go over the max trains for the power, unless CSR
|
// can't go over the max trains for the power, unless CSR
|
||||||
if (trains > pb.getMaxTrains() && !playerCharacter.isCSR()) {
|
if (trains > pb.getMaxTrains() && !playerCharacter.isCSR()) {
|
||||||
trains = pb.getMaxTrains();
|
trains = pb.getMaxTrains();
|
||||||
msg.setNumTrains(trains);
|
msg.setNumTrains(trains);
|
||||||
}
|
}
|
||||||
|
|
||||||
// can't go over total trains by player
|
// can't go over total trains by player
|
||||||
if (playerCharacter.getPowers() != null && playerCharacter.getPowers().containsKey(msg.getPowerUsedID())) {
|
if (playerCharacter.getPowers() != null && playerCharacter.getPowers().containsKey(msg.getPowerUsedID())) {
|
||||||
CharacterPower cp = playerCharacter.getPowers().get(msg.getPowerUsedID());
|
CharacterPower cp = playerCharacter.getPowers().get(msg.getPowerUsedID());
|
||||||
if (cp != null) {
|
if (cp != null) {
|
||||||
int tot = cp.getTotalTrains();
|
int tot = cp.getTotalTrains();
|
||||||
|
switch(token){
|
||||||
|
case 430596127:
|
||||||
|
if(playerCharacter.getPromotionClass().getName().equals("Wizard"))
|
||||||
|
tot = 40; //single teleport granted at 40 for wizard
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
if (tot == 0 && !playerCharacter.isCSR())
|
if (tot == 0 && !playerCharacter.isCSR())
|
||||||
return false;
|
return false;
|
||||||
if (trains != tot && !playerCharacter.isCSR()) {
|
if (trains != tot && !playerCharacter.isCSR()) {
|
||||||
@@ -292,27 +379,19 @@ public enum PowersManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if(overrideTrains > 0)
|
||||||
|
msg.setNumTrains(overrideTrains);
|
||||||
// get recycle time in ms
|
// get recycle time in ms
|
||||||
int time = pb.getRecycleTime(trains);
|
int time = pb.getRecycleTime(trains);
|
||||||
|
|
||||||
// verify player is in correct mode (combat/nonCombat)
|
if(overrideRecycle > 0)
|
||||||
if (playerCharacter.isCombat()) {
|
time = overrideRecycle;
|
||||||
if (!pb.allowedInCombat())
|
|
||||||
// ChatManager.chatPowerError(pc,
|
|
||||||
// "This power is not allowed in combat mode.");
|
|
||||||
return true;
|
|
||||||
} else if (!pb.allowedOutOfCombat())
|
|
||||||
// ChatManager.chatPowerError(pc,
|
|
||||||
// "You must be in combat mode to use this power.");
|
|
||||||
return true;
|
|
||||||
|
|
||||||
// verify player is not stunned or prohibited from casting
|
// verify player is not stunned or prohibited from casting
|
||||||
PlayerBonuses bonus = playerCharacter.getBonuses();
|
PlayerBonuses bonus = playerCharacter.getBonuses();
|
||||||
SourceType sourceType = SourceType.GetSourceType(pb.getCategory());
|
SourceType sourceType = SourceType.GetSourceType(pb.getCategory());
|
||||||
if (bonus != null && (bonus.getBool(ModType.Stunned, SourceType.None) || bonus.getBool(ModType.CannotCast, SourceType.None) || bonus.getBool(ModType.BlockedPowerType, sourceType)))
|
if (bonus != null && (bonus.getBool(ModType.Stunned, SourceType.None) || bonus.getBool(ModType.CannotCast, SourceType.None) || bonus.getBool(ModType.BlockedPowerType, sourceType)))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
// if moving make sure spell valid for movement
|
// if moving make sure spell valid for movement
|
||||||
Vector3fImmutable endLoc = playerCharacter.getEndLoc();
|
Vector3fImmutable endLoc = playerCharacter.getEndLoc();
|
||||||
|
|
||||||
@@ -338,35 +417,43 @@ public enum PowersManager {
|
|||||||
if (pb.targetFromLastTarget() || pb.targetPet()) // use msg's target
|
if (pb.targetFromLastTarget() || pb.targetPet()) // use msg's target
|
||||||
if (pb.isAOE()) {
|
if (pb.isAOE()) {
|
||||||
if (!pb.usePointBlank()) {
|
if (!pb.usePointBlank()) {
|
||||||
AbstractWorldObject target = getTarget(msg);
|
AbstractWorldObject target;
|
||||||
|
if(msg.getTargetType() == 37 && Mob.dynamic_pets.get(msg.getTargetID()) != null){
|
||||||
|
Mob pet = Mob.dynamic_pets.get(msg.getTargetID());
|
||||||
|
target = pet;
|
||||||
|
}else{
|
||||||
|
target = getTarget(msg);
|
||||||
|
}
|
||||||
|
|
||||||
if (target != null && target.getObjectType() == GameObjectType.Building && !pb.targetBuilding()) {
|
if (target != null && target.getObjectType() == GameObjectType.Building && !pb.targetBuilding()) {
|
||||||
PowersManager.sendPowerMsg(playerCharacter, 9, new PerformActionMsg(msg));
|
PowersManager.sendPowerMsg(playerCharacter, 9, new PerformActionMsg(msg));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (target == null) {
|
if (target == null) {
|
||||||
if (playerCharacter.getLoc().distanceSquared2D(msg.getTargetLoc()) > sqr(pb
|
if (playerCharacter.getLoc().distanceSquared2D(msg.getTargetLoc()) > sqr(pb
|
||||||
.getRange()))
|
.getRange()))
|
||||||
return true;
|
return true;
|
||||||
} else if (verifyInvalidRange(playerCharacter, target, pb.getRange()))
|
} else if (verifyInvalidRange(playerCharacter, target, pb.getRange())) {
|
||||||
// pc.getLoc().distance(target.getLoc()) >
|
// pc.getLoc().distance(target.getLoc()) >
|
||||||
// pb.getRange())
|
// pb.getRange())
|
||||||
return true;
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// get target
|
// get target
|
||||||
AbstractWorldObject target = getTarget(msg);
|
AbstractWorldObject target;
|
||||||
|
if(msg.getTargetType() == 37 && Mob.dynamic_pets.get(msg.getTargetID()) != null){
|
||||||
if (target == null)
|
Mob pet = Mob.dynamic_pets.get(msg.getTargetID());
|
||||||
|
target = pet;
|
||||||
|
}else{
|
||||||
|
target = getTarget(msg);
|
||||||
|
}
|
||||||
|
if (target == null) {
|
||||||
return true;
|
return true;
|
||||||
|
}
|
||||||
if (!target.isAlive() && target.getObjectType().equals(GameObjectType.Building) == false && msg.getPowerUsedID() != 428589216)
|
if (!target.isAlive() && target.getObjectType().equals(GameObjectType.Building) == false && msg.getPowerUsedID() != 428589216)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
float range = pb.getRange();
|
float range = pb.getRange();
|
||||||
// verify target is in range
|
// verify target is in range
|
||||||
|
|
||||||
@@ -375,16 +462,13 @@ public enum PowersManager {
|
|||||||
// (pc.getLoc().distance(target.getLoc()) > pb.getRange()) {
|
// (pc.getLoc().distance(target.getLoc()) > pb.getRange()) {
|
||||||
// TODO send message that target is out of range
|
// TODO send message that target is out of range
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
// verify target is valid type
|
// verify target is valid type
|
||||||
if (!validateTarget(target, playerCharacter, pb))
|
if (!validateTarget(target, playerCharacter, pb))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
|
||||||
if (AbstractWorldObject.IsAbstractCharacter(target))
|
if (AbstractWorldObject.IsAbstractCharacter(target))
|
||||||
targetLiveCounter = ((AbstractCharacter) target).getLiveCounter();
|
targetLiveCounter = ((AbstractCharacter) target).getLiveCounter();
|
||||||
}
|
}
|
||||||
|
|
||||||
// verify regular player can cast spell, otherwise authenticate
|
// verify regular player can cast spell, otherwise authenticate
|
||||||
if (!pb.regularPlayerCanCast()) {
|
if (!pb.regularPlayerCanCast()) {
|
||||||
Account a = SessionManager.getAccount(playerCharacter);
|
Account a = SessionManager.getAccount(playerCharacter);
|
||||||
@@ -394,7 +478,6 @@ public enum PowersManager {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// verify player has proper effects applied to use power
|
// verify player has proper effects applied to use power
|
||||||
if (pb.getEffectPrereqs().size() > 0 && playerCharacter.getEffects() != null) {
|
if (pb.getEffectPrereqs().size() > 0 && playerCharacter.getEffects() != null) {
|
||||||
|
|
||||||
@@ -408,11 +491,9 @@ public enum PowersManager {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!passed)
|
if (!passed)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
//verify player has proper equipment to use power
|
//verify player has proper equipment to use power
|
||||||
if (pb.getEquipPrereqs().size() > 0) {
|
if (pb.getEquipPrereqs().size() > 0) {
|
||||||
|
|
||||||
@@ -531,6 +612,13 @@ public enum PowersManager {
|
|||||||
// get cast time in ms.
|
// get cast time in ms.
|
||||||
time = pb.getCastTime(trains);
|
time = pb.getCastTime(trains);
|
||||||
|
|
||||||
|
|
||||||
|
if(pb.token == 430596127)
|
||||||
|
time = 5000;
|
||||||
|
|
||||||
|
if(pb.name.equals("Summon") && playerCharacter.getRace().getName().contains("Vampire"))
|
||||||
|
time = 60000;
|
||||||
|
|
||||||
// set player is casting for regens
|
// set player is casting for regens
|
||||||
|
|
||||||
|
|
||||||
@@ -542,6 +630,10 @@ public enum PowersManager {
|
|||||||
|
|
||||||
playerCharacter.setLastMovementState(playerCharacter.getMovementState());
|
playerCharacter.setLastMovementState(playerCharacter.getMovementState());
|
||||||
|
|
||||||
|
if(msg.getPowerUsedID() == 429495514 && playerCharacter.getRace().getName().contains("Shade")){
|
||||||
|
copyMsg.setPowerUsedID(429397210);//intercept shade using hide and cast sneak instead
|
||||||
|
}
|
||||||
|
|
||||||
// run timer job to end cast
|
// run timer job to end cast
|
||||||
if (time < 1) // run immediately
|
if (time < 1) // run immediately
|
||||||
finishUsePower(copyMsg, playerCharacter, casterLiveCounter, targetLiveCounter);
|
finishUsePower(copyMsg, playerCharacter, casterLiveCounter, targetLiveCounter);
|
||||||
@@ -607,7 +699,13 @@ public enum PowersManager {
|
|||||||
if (pb.targetFromLastTarget() || pb.targetPet()) // use msg's target
|
if (pb.targetFromLastTarget() || pb.targetPet()) // use msg's target
|
||||||
if (pb.isAOE()) {
|
if (pb.isAOE()) {
|
||||||
if (!pb.usePointBlank()) {
|
if (!pb.usePointBlank()) {
|
||||||
AbstractWorldObject target = getTarget(msg);
|
AbstractWorldObject target;
|
||||||
|
if(msg.getTargetType() == 37 && Mob.dynamic_pets.get(msg.getTargetID()) != null){
|
||||||
|
Mob pet = Mob.dynamic_pets.get(msg.getTargetID());
|
||||||
|
target = pet;
|
||||||
|
}else{
|
||||||
|
target = getTarget(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if (target == null) {
|
if (target == null) {
|
||||||
@@ -622,7 +720,13 @@ public enum PowersManager {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// get target
|
// get target
|
||||||
AbstractWorldObject target = getTarget(msg);
|
AbstractWorldObject target;
|
||||||
|
if(msg.getTargetType() == 37 && Mob.dynamic_pets.get(msg.getTargetID()) != null){
|
||||||
|
Mob pet = Mob.dynamic_pets.get(msg.getTargetID());
|
||||||
|
target = pet;
|
||||||
|
}else{
|
||||||
|
target = getTarget(msg);
|
||||||
|
}
|
||||||
|
|
||||||
if (target == null)
|
if (target == null)
|
||||||
return true;
|
return true;
|
||||||
@@ -839,8 +943,6 @@ public enum PowersManager {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
playerCharacter.setHateValue(pb.getHateValue(trains));
|
|
||||||
|
|
||||||
//Send Cast Message.
|
//Send Cast Message.
|
||||||
// PerformActionMsg castMsg = new PerformActionMsg(msg);
|
// PerformActionMsg castMsg = new PerformActionMsg(msg);
|
||||||
// castMsg.setNumTrains(9999);
|
// castMsg.setNumTrains(9999);
|
||||||
@@ -891,8 +993,6 @@ public enum PowersManager {
|
|||||||
//Power is aiding a target, handle aggro if combat target is a Mob.
|
//Power is aiding a target, handle aggro if combat target is a Mob.
|
||||||
if (!pb.isHarmful() && target.getObjectType() == GameObjectType.PlayerCharacter) {
|
if (!pb.isHarmful() && target.getObjectType() == GameObjectType.PlayerCharacter) {
|
||||||
PlayerCharacter pcTarget = (PlayerCharacter) target;
|
PlayerCharacter pcTarget = (PlayerCharacter) target;
|
||||||
if (!pb.isHarmful())
|
|
||||||
Mob.HandleAssistedAggro(playerCharacter, pcTarget);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// update target of used power timer
|
// update target of used power timer
|
||||||
@@ -1231,9 +1331,8 @@ public enum PowersManager {
|
|||||||
if (pc == null)
|
if (pc == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
PlayerCharacter target = SessionManager
|
PlayerCharacter target = SessionManager.getPlayerCharacterByLowerCaseName(msg.getTargetName());
|
||||||
.getPlayerCharacterByLowerCaseName(msg.getTargetName());
|
if (target == null || target.equals(pc) || target.isCombat() || target.getGuild().getNation().equals(pc.getGuild().getNation()) == false) {
|
||||||
if (target == null || target.equals(pc) || target.isCombat()) {
|
|
||||||
|
|
||||||
if (target == null) // Player not found. Send not found message
|
if (target == null) // Player not found. Send not found message
|
||||||
ChatManager.chatInfoError(pc,
|
ChatManager.chatInfoError(pc,
|
||||||
@@ -1242,7 +1341,10 @@ public enum PowersManager {
|
|||||||
ChatManager.chatInfoError(pc,
|
ChatManager.chatInfoError(pc,
|
||||||
"Cannot summon player in combat.");
|
"Cannot summon player in combat.");
|
||||||
// else trying to summon self, just fail
|
// else trying to summon self, just fail
|
||||||
|
if(target != null && target.getGuild().getNation().equals(pc.getGuild().getNation()) == false){
|
||||||
|
ChatManager.chatInfoError(pc,
|
||||||
|
"Cannot summon outside of nation.");
|
||||||
|
}
|
||||||
// recycle summon
|
// recycle summon
|
||||||
sendRecyclePower(msg.getPowerToken(), origin);
|
sendRecyclePower(msg.getPowerToken(), origin);
|
||||||
|
|
||||||
@@ -1274,7 +1376,7 @@ public enum PowersManager {
|
|||||||
if (source == null)
|
if (source == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
long tooLate = pc.getSummoner(source.getObjectUUID());
|
long tooLate = pc.getSummoner(source.getObjectUUID()) + 45000;
|
||||||
if (tooLate < System.currentTimeMillis()) {
|
if (tooLate < System.currentTimeMillis()) {
|
||||||
ChatManager.chatInfoError(pc, "You waited too long to " + (msg.accepted() ? "accept" : "decline") + " the summons.");
|
ChatManager.chatInfoError(pc, "You waited too long to " + (msg.accepted() ? "accept" : "decline") + " the summons.");
|
||||||
pc.removeSummoner(source.getObjectUUID());
|
pc.removeSummoner(source.getObjectUUID());
|
||||||
@@ -1336,7 +1438,15 @@ public enum PowersManager {
|
|||||||
duration = 15000; // Healer Summons, 15 seconds
|
duration = 15000; // Healer Summons, 15 seconds
|
||||||
else
|
else
|
||||||
duration = 45000; // Belgosh Summons, 45 seconds
|
duration = 45000; // Belgosh Summons, 45 seconds
|
||||||
|
if(pc.inSafeZone() == false) {
|
||||||
|
for (AbstractWorldObject absChar : WorldGrid.getObjectsInRangePartial(pc.loc, MBServerStatics.CHARACTER_LOAD_RANGE, MBServerStatics.MASK_PLAYER)) {
|
||||||
|
PlayerCharacter player = (PlayerCharacter) absChar;
|
||||||
|
if (player.guild.getNation().equals(pc.guild.getNation()) == false) {
|
||||||
|
duration += 60000;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Teleport to summoners location
|
// Teleport to summoners location
|
||||||
FinishSummonsJob fsj = new FinishSummonsJob(source, pc);
|
FinishSummonsJob fsj = new FinishSummonsJob(source, pc);
|
||||||
@@ -1465,6 +1575,41 @@ public enum PowersManager {
|
|||||||
HashSet<AbstractCharacter> trackChars = RangeBasedAwo.getTrackList(
|
HashSet<AbstractCharacter> trackChars = RangeBasedAwo.getTrackList(
|
||||||
allTargets, playerCharacter, maxTargets);
|
allTargets, playerCharacter, maxTargets);
|
||||||
|
|
||||||
|
trackChars = new HashSet<>();
|
||||||
|
HashSet<AbstractWorldObject> allInRange = WorldGrid.getObjectsInRangePartial(playerCharacter.loc,MBServerStatics.CHARACTER_LOAD_RANGE,MBServerStatics.MASK_PLAYER);
|
||||||
|
//ArrayList<Guild> nationsInRange = new ArrayList<>();
|
||||||
|
ArrayList<AbstractWorldObject> purgeList = new ArrayList<>();
|
||||||
|
for(AbstractWorldObject trackChar : allInRange) {
|
||||||
|
if(trackChar.equals(playerCharacter) || !trackChar.isAlive() || !((PlayerCharacter)trackChar).isActive())
|
||||||
|
purgeList.add(trackChar);
|
||||||
|
}
|
||||||
|
|
||||||
|
allInRange.removeAll(purgeList);
|
||||||
|
|
||||||
|
//first round to add players in range
|
||||||
|
for(AbstractWorldObject trackChar : allInRange){
|
||||||
|
if(trackChar.equals(playerCharacter) || !trackChar.isAlive() || !((PlayerCharacter)trackChar).isActive())
|
||||||
|
continue;
|
||||||
|
if(allInRange.contains(trackChar)) {
|
||||||
|
trackChars.add((AbstractCharacter)trackChar);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//track full range for chaining nation members
|
||||||
|
ArrayList<Guild> nationsInRange = new ArrayList<>();
|
||||||
|
for(AbstractCharacter pc : trackChars){
|
||||||
|
if(nationsInRange.contains(pc.guild.getNation()) == false)
|
||||||
|
nationsInRange.add(pc.guild.getNation());
|
||||||
|
}
|
||||||
|
HashSet<AbstractWorldObject> fullRange = WorldGrid.getObjectsInRangePartial(playerCharacter.loc,1024,MBServerStatics.MASK_PLAYER);
|
||||||
|
for(AbstractWorldObject trackChar : fullRange) {
|
||||||
|
if(trackChar.equals(playerCharacter) || !trackChar.isAlive() || !((PlayerCharacter)trackChar).isActive())
|
||||||
|
continue;
|
||||||
|
if(nationsInRange.contains(((PlayerCharacter) trackChar).guild.getNation()) && trackChars.contains(trackChar) == false)
|
||||||
|
trackChars.add((AbstractCharacter)trackChar);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
TrackWindowMsg trackWindowMsg = new TrackWindowMsg(msg);
|
TrackWindowMsg trackWindowMsg = new TrackWindowMsg(msg);
|
||||||
|
|
||||||
// send track window
|
// send track window
|
||||||
@@ -1640,7 +1785,8 @@ public enum PowersManager {
|
|||||||
ac.setItemCasting(false);
|
ac.setItemCasting(false);
|
||||||
if (ac == null || target == null || pb == null)
|
if (ac == null || target == null || pb == null)
|
||||||
return;
|
return;
|
||||||
|
if(pb.targetSelf)
|
||||||
|
target = ac;
|
||||||
ac.clearTimer(Integer.toString(pb.getToken()));
|
ac.clearTimer(Integer.toString(pb.getToken()));
|
||||||
if (liveCounter == ac.getLiveCounter())
|
if (liveCounter == ac.getLiveCounter())
|
||||||
finishApplyPowerA(ac, target, targetLoc, pb, trains, false);
|
finishApplyPowerA(ac, target, targetLoc, pb, trains, false);
|
||||||
@@ -2221,9 +2367,9 @@ public enum PowersManager {
|
|||||||
|
|
||||||
int type = msg.getTargetType();
|
int type = msg.getTargetType();
|
||||||
int UUID = msg.getTargetID();
|
int UUID = msg.getTargetID();
|
||||||
|
if (type == -1 || type == 0 || UUID == -1 || UUID == 0) {
|
||||||
if (type == -1 || type == 0 || UUID == -1 || UUID == 0)
|
|
||||||
return null;
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
return (AbstractWorldObject) DbManager.getObject(GameObjectType.values()[type], UUID);
|
return (AbstractWorldObject) DbManager.getObject(GameObjectType.values()[type], UUID);
|
||||||
}
|
}
|
||||||
@@ -2246,17 +2392,11 @@ public enum PowersManager {
|
|||||||
ChatManager.chatSystemInfo(pc, smsg);
|
ChatManager.chatSystemInfo(pc, smsg);
|
||||||
}
|
}
|
||||||
|
|
||||||
int chance;
|
float constant = (atr+defense)*0.315f;
|
||||||
|
float atrChance = atr - constant;
|
||||||
if (atr > defense || defense == 0)
|
float defChance = defense - constant + atrChance;
|
||||||
chance = 94;
|
float smallChance = atrChance/defChance;
|
||||||
else {
|
int chance = (int)(smallChance * 100);
|
||||||
float dif = atr / defense;
|
|
||||||
if (dif <= 0.8f)
|
|
||||||
chance = 4;
|
|
||||||
else
|
|
||||||
chance = ((int) (450 * (dif - 0.8f)) + 4);
|
|
||||||
}
|
|
||||||
|
|
||||||
// calculate hit/miss
|
// calculate hit/miss
|
||||||
int roll = ThreadLocalRandom.current().nextInt(100);
|
int roll = ThreadLocalRandom.current().nextInt(100);
|
||||||
@@ -2464,11 +2604,11 @@ public enum PowersManager {
|
|||||||
ChatManager.chatSystemInfo(pc, outmsg);
|
ChatManager.chatSystemInfo(pc, outmsg);
|
||||||
return false; // can't target player, stop here
|
return false; // can't target player, stop here
|
||||||
} // target is mob
|
} // target is mob
|
||||||
else if ((target.getObjectTypeMask() & MBServerStatics.MASK_MOB) != 0)
|
else if ((target.getObjectTypeMask() & MBServerStatics.MASK_MOB) != 0 && ((Mob)target).isPet() == false)
|
||||||
return pb.targetMob();
|
return pb.targetMob();
|
||||||
|
|
||||||
// target is pet
|
// target is pet
|
||||||
else if ((target.getObjectTypeMask() & MBServerStatics.MASK_PET) != 0)
|
else if ((target.getObjectTypeMask() & MBServerStatics.MASK_MOB) != 0 && ((Mob)target).isPet() == true)
|
||||||
return pb.targetPet();
|
return pb.targetPet();
|
||||||
|
|
||||||
// target is Building
|
// target is Building
|
||||||
@@ -2547,7 +2687,7 @@ public enum PowersManager {
|
|||||||
|
|
||||||
PowersBase power = getLastPower(ac);
|
PowersBase power = getLastPower(ac);
|
||||||
|
|
||||||
if (power != null && power.cancelOnTakeDamage())
|
if (power != null && power.cancelOnTakeDamage() && power.getName().equals("Translocate") == false)
|
||||||
cancelPower(ac, true);
|
cancelPower(ac, true);
|
||||||
cancelItems(ac, false, true);
|
cancelItems(ac, false, true);
|
||||||
ac.cancelTimer("Stuck");
|
ac.cancelTimer("Stuck");
|
||||||
@@ -2707,7 +2847,12 @@ public enum PowersManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
public static void applyZergBuff(AbstractGameObject obj){
|
||||||
|
|
||||||
|
}
|
||||||
|
public static void removeZergBuff(HashSet<Integer> playersIDs){
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -10,10 +10,12 @@ package engine.gameManager;
|
|||||||
|
|
||||||
import engine.Enum;
|
import engine.Enum;
|
||||||
import engine.Enum.GameObjectType;
|
import engine.Enum.GameObjectType;
|
||||||
import engine.objects.AbstractGameObject;
|
import engine.InterestManagement.WorldGrid;
|
||||||
import engine.objects.City;
|
import engine.db.archive.DataWarehouse;
|
||||||
import engine.objects.PlayerCharacter;
|
import engine.db.archive.MineRecord;
|
||||||
import engine.objects.Runegate;
|
import engine.net.DispatchMessage;
|
||||||
|
import engine.net.client.msg.chat.ChatSystemMsg;
|
||||||
|
import engine.objects.*;
|
||||||
import org.pmw.tinylog.Logger;
|
import org.pmw.tinylog.Logger;
|
||||||
|
|
||||||
import java.sql.Connection;
|
import java.sql.Connection;
|
||||||
@@ -22,6 +24,7 @@ import java.sql.ResultSet;
|
|||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.time.Duration;
|
import java.time.Duration;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -33,13 +36,14 @@ public enum SimulationManager {
|
|||||||
SERVERHEARTBEAT;
|
SERVERHEARTBEAT;
|
||||||
|
|
||||||
private static final long CITY_PULSE = 2000;
|
private static final long CITY_PULSE = 2000;
|
||||||
private static final long RUNEGATE_PULSE = 3000;
|
private static final long RUNEGATE_PULSE = 500;
|
||||||
private static final long UPDATE_PULSE = 1000;
|
private static final long UPDATE_PULSE = 1000;
|
||||||
private static final long FlIGHT_PULSE = 100;
|
private static final long FlIGHT_PULSE = 100;
|
||||||
public static Duration executionTime = Duration.ofNanos(1);
|
public static Duration executionTime = Duration.ofNanos(1);
|
||||||
public static Duration executionMax = Duration.ofNanos(1);
|
public static Duration executionMax = Duration.ofNanos(1);
|
||||||
private static SimulationManager instance = null;
|
private static SimulationManager instance = null;
|
||||||
private long _cityPulseTime = System.currentTimeMillis() + CITY_PULSE;
|
private long _cityPulseTime = System.currentTimeMillis() + CITY_PULSE;
|
||||||
|
private long _minePulseTime = System.currentTimeMillis() + CITY_PULSE;
|
||||||
private long _runegatePulseTime = System.currentTimeMillis()
|
private long _runegatePulseTime = System.currentTimeMillis()
|
||||||
+ RUNEGATE_PULSE;
|
+ RUNEGATE_PULSE;
|
||||||
private long _updatePulseTime = System.currentTimeMillis() + UPDATE_PULSE;
|
private long _updatePulseTime = System.currentTimeMillis() + UPDATE_PULSE;
|
||||||
@@ -69,6 +73,8 @@ public enum SimulationManager {
|
|||||||
return popString;
|
return popString;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Update the simulation. *** Important: Whatever you do in here, do it damn
|
* Update the simulation. *** Important: Whatever you do in here, do it damn
|
||||||
* quick!
|
* quick!
|
||||||
@@ -126,7 +132,17 @@ public enum SimulationManager {
|
|||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
//try {
|
||||||
|
// if ((_minePulseTime != 0)
|
||||||
|
// && (System.currentTimeMillis() > _minePulseTime))
|
||||||
|
// pulseMines();
|
||||||
|
//} catch (Exception e) {
|
||||||
|
// Logger.error(
|
||||||
|
// "Fatal error in Mine Pulse: DISABLED. Error Message : "
|
||||||
|
// + e.getMessage());
|
||||||
|
// e.printStackTrace();
|
||||||
|
|
||||||
|
//}
|
||||||
SimulationManager.executionTime = Duration.between(startTime, Instant.now());
|
SimulationManager.executionTime = Duration.between(startTime, Instant.now());
|
||||||
|
|
||||||
if (executionTime.compareTo(executionMax) > 0)
|
if (executionTime.compareTo(executionMax) > 0)
|
||||||
@@ -203,7 +219,6 @@ public enum SimulationManager {
|
|||||||
city = (City) cityObject;
|
city = (City) cityObject;
|
||||||
city.onEnter();
|
city.onEnter();
|
||||||
}
|
}
|
||||||
|
|
||||||
_cityPulseTime = System.currentTimeMillis() + CITY_PULSE;
|
_cityPulseTime = System.currentTimeMillis() + CITY_PULSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,58 @@
|
|||||||
|
package engine.gameManager;
|
||||||
|
|
||||||
|
import engine.objects.Guild;
|
||||||
|
|
||||||
|
public class ZergManager {
|
||||||
|
|
||||||
|
public static int getBaneCap(Guild guild) {
|
||||||
|
|
||||||
|
if(guild.getOwnedCity() == null || guild.getOwnedCity().getTOL() == null)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
int cityRank = guild.getOwnedCity().getTOL().getRank();
|
||||||
|
return (cityRank == 8) ? 20 : ((guild.getNation().getSubGuildList().size() + 1 <= 4) ? 10 : 20);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static float getCurrentMultiplier(int count, int maxCount){
|
||||||
|
switch(maxCount) {
|
||||||
|
case 3:
|
||||||
|
return getMultiplier3Man(count);
|
||||||
|
case 5:
|
||||||
|
return getMultiplier5Man(count);
|
||||||
|
case 10:
|
||||||
|
return getMultiplier10Man(count);
|
||||||
|
case 20:
|
||||||
|
return getMultiplier20Man(count);
|
||||||
|
default:
|
||||||
|
return getMultiplier40Man(count);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public static float getMultiplier(int count, int maxCount, float[] thresholds) {
|
||||||
|
if (count <= maxCount) return 1.0f;
|
||||||
|
if (count > thresholds.length) return 0.0f;
|
||||||
|
return 1.0f - thresholds[count - maxCount - 1];
|
||||||
|
}
|
||||||
|
|
||||||
|
public static float getMultiplier3Man(int count) {
|
||||||
|
float[] thresholds = {0.37f, 0.60f, 0.75f};
|
||||||
|
return getMultiplier(count, 3, thresholds);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static float getMultiplier5Man(int count) {
|
||||||
|
float[] thresholds = {0.25f, 0.43f, 0.56f, 0.67f, 0.75f};
|
||||||
|
return getMultiplier(count, 5, thresholds);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static float getMultiplier10Man(int count) {
|
||||||
|
float[] thresholds = {0.14f, 0.25f, 0.35f, 0.43f, 0.50f, 0.56f, 0.62f, 0.67f, 0.71f, 0.75f};
|
||||||
|
return getMultiplier(count, 10, thresholds);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static float getMultiplier20Man(int count) {
|
||||||
|
return getMultiplier10Man(count * 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static float getMultiplier40Man(int count) {
|
||||||
|
return getMultiplier10Man(count * 4);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -15,9 +15,13 @@ import engine.gameManager.DbManager;
|
|||||||
import engine.job.AbstractScheduleJob;
|
import engine.job.AbstractScheduleJob;
|
||||||
import engine.net.DispatchMessage;
|
import engine.net.DispatchMessage;
|
||||||
import engine.net.client.msg.chat.ChatSystemMsg;
|
import engine.net.client.msg.chat.ChatSystemMsg;
|
||||||
|
import engine.objects.Bane;
|
||||||
import engine.objects.City;
|
import engine.objects.City;
|
||||||
|
import engine.workthreads.ZergMechanicThread;
|
||||||
import org.pmw.tinylog.Logger;
|
import org.pmw.tinylog.Logger;
|
||||||
|
|
||||||
|
import static engine.workthreads.ZergMechanicThread.startZergThreadBane;
|
||||||
|
|
||||||
public class ActivateBaneJob extends AbstractScheduleJob {
|
public class ActivateBaneJob extends AbstractScheduleJob {
|
||||||
|
|
||||||
private final int cityUUID;
|
private final int cityUUID;
|
||||||
@@ -67,6 +71,10 @@ public class ActivateBaneJob extends AbstractScheduleJob {
|
|||||||
msg.setChannel(ChatChannelType.SYSTEM.getChannelID());
|
msg.setChannel(ChatChannelType.SYSTEM.getChannelID());
|
||||||
|
|
||||||
DispatchMessage.dispatchMsgToAll(msg);
|
DispatchMessage.dispatchMsgToAll(msg);
|
||||||
|
|
||||||
|
if(city.getBane() != null) {
|
||||||
|
startZergThreadBane(city.getBane());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -9,9 +9,11 @@
|
|||||||
|
|
||||||
package engine.jobs;
|
package engine.jobs;
|
||||||
|
|
||||||
|
import engine.Enum;
|
||||||
import engine.gameManager.CombatManager;
|
import engine.gameManager.CombatManager;
|
||||||
import engine.job.AbstractJob;
|
import engine.job.AbstractJob;
|
||||||
import engine.objects.AbstractCharacter;
|
import engine.objects.AbstractCharacter;
|
||||||
|
import engine.objects.PlayerCharacter;
|
||||||
|
|
||||||
public class AttackJob extends AbstractJob {
|
public class AttackJob extends AbstractJob {
|
||||||
|
|
||||||
@@ -29,6 +31,9 @@ public class AttackJob extends AbstractJob {
|
|||||||
@Override
|
@Override
|
||||||
protected void doJob() {
|
protected void doJob() {
|
||||||
CombatManager.doCombat(this.source, slot);
|
CombatManager.doCombat(this.source, slot);
|
||||||
|
if(this.source.getObjectType().equals(Enum.GameObjectType.PlayerCharacter))
|
||||||
|
if(((PlayerCharacter)this.source).getHidden() > 0)
|
||||||
|
this.source.removeEffectBySource(Enum.EffectSourceType.Invisibility,41,true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean success() {
|
public boolean success() {
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ public class EndFearJob extends AbstractEffectJob {
|
|||||||
if (this.target == null || (!(this.target instanceof Mob)))
|
if (this.target == null || (!(this.target instanceof Mob)))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
((Mob) this.target).setFearedObject(null);
|
((Mob) this.target).fearedObject = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -40,6 +40,6 @@ public class EndFearJob extends AbstractEffectJob {
|
|||||||
if (this.target == null || (!(this.target instanceof Mob)))
|
if (this.target == null || (!(this.target instanceof Mob)))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
((Mob) this.target).setFearedObject(null);
|
((Mob) this.target).fearedObject = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,10 +34,15 @@ public class ModTableEntry {
|
|||||||
|
|
||||||
itemTableEntryList = LootManager._modTables.get(modTablwe);
|
itemTableEntryList = LootManager._modTables.get(modTablwe);
|
||||||
|
|
||||||
for (ModTableEntry iteration : itemTableEntryList)
|
if(itemTableEntryList == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
for (ModTableEntry iteration : itemTableEntryList) {
|
||||||
|
if (iteration == null)
|
||||||
|
continue;
|
||||||
if (roll >= iteration.minRoll && roll <= iteration.maxRoll)
|
if (roll >= iteration.minRoll && roll <= iteration.maxRoll)
|
||||||
modTableEntry = iteration;
|
modTableEntry = iteration;
|
||||||
|
}
|
||||||
return modTableEntry;
|
return modTableEntry;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -220,7 +220,7 @@ public class Bounds {
|
|||||||
//player is inside building region, skip collision check. we only do collision from the outside.
|
//player is inside building region, skip collision check. we only do collision from the outside.
|
||||||
if (player.region != null && player.region.parentBuildingID == building.getObjectUUID())
|
if (player.region != null && player.region.parentBuildingID == building.getObjectUUID())
|
||||||
continue;
|
continue;
|
||||||
if (building.getBounds().colliders == null)
|
if (building.getBounds() == null || building.getBounds().colliders == null)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
for (Colliders collider : building.getBounds().colliders) {
|
for (Colliders collider : building.getBounds().colliders) {
|
||||||
|
|||||||
+200
-465
File diff suppressed because it is too large
Load Diff
@@ -13,7 +13,7 @@ public class MobAIThread implements Runnable{
|
|||||||
public static int AI_DROP_AGGRO_RANGE = 60;
|
public static int AI_DROP_AGGRO_RANGE = 60;
|
||||||
public static int AI_PULSE_MOB_THRESHOLD = 200;
|
public static int AI_PULSE_MOB_THRESHOLD = 200;
|
||||||
public static int AI_PATROL_DIVISOR = 15;
|
public static int AI_PATROL_DIVISOR = 15;
|
||||||
public static float AI_CAST_FREQUENCY;
|
public static float AI_CAST_FREQUENCY = 1.0f;
|
||||||
// Thread constructor
|
// Thread constructor
|
||||||
|
|
||||||
public MobAIThread() {
|
public MobAIThread() {
|
||||||
|
|||||||
@@ -12,13 +12,20 @@ package engine.mobileAI.utilities;
|
|||||||
import engine.Enum.*;
|
import engine.Enum.*;
|
||||||
import engine.gameManager.ChatManager;
|
import engine.gameManager.ChatManager;
|
||||||
import engine.gameManager.CombatManager;
|
import engine.gameManager.CombatManager;
|
||||||
|
import engine.gameManager.PowersManager;
|
||||||
import engine.math.Vector3fImmutable;
|
import engine.math.Vector3fImmutable;
|
||||||
|
import engine.mobileAI.MobAI;
|
||||||
|
import engine.mobileAI.Threads.MobAIThread;
|
||||||
import engine.net.DispatchMessage;
|
import engine.net.DispatchMessage;
|
||||||
|
import engine.net.client.msg.PerformActionMsg;
|
||||||
import engine.net.client.msg.TargetedActionMsg;
|
import engine.net.client.msg.TargetedActionMsg;
|
||||||
import engine.objects.*;
|
import engine.objects.*;
|
||||||
|
import engine.powers.ActionsBase;
|
||||||
|
import engine.powers.PowersBase;
|
||||||
import engine.server.MBServerStatics;
|
import engine.server.MBServerStatics;
|
||||||
import org.pmw.tinylog.Logger;
|
import org.pmw.tinylog.Logger;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.concurrent.ThreadLocalRandom;
|
import java.util.concurrent.ThreadLocalRandom;
|
||||||
|
|
||||||
import static engine.math.FastMath.sqr;
|
import static engine.math.FastMath.sqr;
|
||||||
@@ -48,7 +55,7 @@ public class CombatUtilities {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static boolean inRange2D(AbstractWorldObject entity1, AbstractWorldObject entity2, double range) {
|
public static boolean inRange2D(AbstractWorldObject entity1, AbstractWorldObject entity2, double range) {
|
||||||
return entity1.getLoc().distance2D(entity2.getLoc()) < range;
|
return entity1.getLoc().distanceSquared2D(entity2.getLoc()) < range * range;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void swingIsBlock(Mob agent, AbstractWorldObject target, int animation) {
|
public static void swingIsBlock(Mob agent, AbstractWorldObject target, int animation) {
|
||||||
@@ -304,7 +311,6 @@ public class CombatUtilities {
|
|||||||
if (targetMob.isSiege())
|
if (targetMob.isSiege())
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static float determineDamage(Mob agent) {
|
public static float determineDamage(Mob agent) {
|
||||||
@@ -480,8 +486,9 @@ public class CombatUtilities {
|
|||||||
masteryLevel = (int) agent.getSkills().get(weapon.getMastery()).getModifiedAmount();
|
masteryLevel = (int) agent.getSkills().get(weapon.getMastery()).getModifiedAmount();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return min * (pow(0.0048 * primary + .049 * (primary - 0.75), 0.5) + pow(0.0066 * secondary + 0.064 * (secondary - 0.75), 0.5) + +0.01 * (focusLevel + masteryLevel));
|
||||||
}
|
}
|
||||||
return min * (pow(0.0048 * primary + .049 * (primary - 0.75), 0.5) + pow(0.0066 * secondary + 0.064 * (secondary - 0.75), 0.5) + +0.01 * (focusLevel + masteryLevel));
|
return agent.getMinDamageHandOne();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static double getMaxDmg(double max, Mob agent, ItemBase weapon) {
|
public static double getMaxDmg(double max, Mob agent, ItemBase weapon) {
|
||||||
@@ -507,8 +514,214 @@ public class CombatUtilities {
|
|||||||
if (agent.getSkills().containsKey(weapon.getSkillRequired()))
|
if (agent.getSkills().containsKey(weapon.getSkillRequired()))
|
||||||
masteryLevel = (int) agent.getSkills().get(weapon.getMastery()).getModifiedAmount();
|
masteryLevel = (int) agent.getSkills().get(weapon.getMastery()).getModifiedAmount();
|
||||||
|
|
||||||
|
return max * (pow(0.0124 * primary + 0.118 * (primary - 0.75), 0.5) + pow(0.0022 * secondary + 0.028 * (secondary - 0.75), 0.5) + 0.0075 * (focusLevel + masteryLevel));
|
||||||
|
}
|
||||||
|
return agent.getMaxDamageHandOne();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean MobCast(Mob mob) {
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Method picks a random spell from a mobile's list of powers
|
||||||
|
// and casts it on the current target (or itself). Validation
|
||||||
|
// (including empty lists) is done previously within canCast();
|
||||||
|
|
||||||
|
ArrayList<Integer> powerTokens;
|
||||||
|
ArrayList<Integer> purgeTokens;
|
||||||
|
AbstractCharacter target = (AbstractCharacter) mob.getCombatTarget();
|
||||||
|
|
||||||
|
if (mob.behaviourType.callsForHelp)
|
||||||
|
MobAI.MobCallForHelp(mob);
|
||||||
|
|
||||||
|
// Generate a list of tokens from the mob powers for this mobile.
|
||||||
|
|
||||||
|
powerTokens = new ArrayList<>(mob.mobPowers.keySet());
|
||||||
|
purgeTokens = new ArrayList<>();
|
||||||
|
|
||||||
|
// If player has this effect on them currently then remove
|
||||||
|
// this token from our list.
|
||||||
|
|
||||||
|
for (int powerToken : powerTokens) {
|
||||||
|
|
||||||
|
PowersBase powerBase = PowersManager.getPowerByToken(powerToken);
|
||||||
|
|
||||||
|
for (ActionsBase actionBase : powerBase.getActions()) {
|
||||||
|
|
||||||
|
String stackType = actionBase.stackType;
|
||||||
|
|
||||||
|
if (target.getEffects() != null && target.getEffects().containsKey(stackType))
|
||||||
|
purgeTokens.add(powerToken);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
powerTokens.removeAll(purgeTokens);
|
||||||
|
|
||||||
|
// Sanity check
|
||||||
|
|
||||||
|
if (powerTokens.isEmpty())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Pick random spell from our list of powers
|
||||||
|
|
||||||
|
int powerToken = powerTokens.get(ThreadLocalRandom.current().nextInt(powerTokens.size()));
|
||||||
|
int powerRank = mob.mobPowers.get(powerToken);
|
||||||
|
|
||||||
|
PowersBase mobPower = PowersManager.getPowerByToken(powerToken);
|
||||||
|
|
||||||
|
//check for hit-roll
|
||||||
|
|
||||||
|
if (mobPower.requiresHitRoll)
|
||||||
|
if (triggerDefense(mob, mob.getCombatTarget()))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Cast the spell
|
||||||
|
|
||||||
|
if (inRange2D(mob, mob.getCombatTarget(), mobPower.getRange())) {
|
||||||
|
|
||||||
|
PerformActionMsg msg;
|
||||||
|
|
||||||
|
if (!mobPower.isHarmful() || mobPower.targetSelf) {
|
||||||
|
PowersManager.useMobPower(mob, mob, mobPower, powerRank);
|
||||||
|
msg = PowersManager.createPowerMsg(mobPower, powerRank, mob, mob);
|
||||||
|
} else {
|
||||||
|
PowersManager.useMobPower(mob, target, mobPower, powerRank);
|
||||||
|
msg = PowersManager.createPowerMsg(mobPower, powerRank, mob, target);
|
||||||
|
}
|
||||||
|
|
||||||
|
msg.setUnknown04(2);
|
||||||
|
|
||||||
|
PowersManager.finishUseMobPower(msg, mob, 0, 0);
|
||||||
|
long randomCooldown = (long)((ThreadLocalRandom.current().nextInt(10,15) * 1000L) * MobAIThread.AI_CAST_FREQUENCY);
|
||||||
|
|
||||||
|
mob.nextCastTime = System.currentTimeMillis() + randomCooldown;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: MobCast" + " " + e.getMessage());
|
||||||
}
|
}
|
||||||
return max * (pow(0.0124 * primary + 0.118 * (primary - 0.75), 0.5) + pow(0.0022 * secondary + 0.028 * (secondary - 0.75), 0.5) + 0.0075 * (focusLevel + masteryLevel));
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean GuardCast(Mob mob) {
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Method picks a random spell from a mobile's list of powers
|
||||||
|
// and casts it on the current target (or itself). Validation
|
||||||
|
// (including empty lists) is done previously within canCast();
|
||||||
|
|
||||||
|
ArrayList<Integer> powerTokens;
|
||||||
|
ArrayList<Integer> purgeTokens;
|
||||||
|
AbstractCharacter target = (AbstractCharacter) mob.getCombatTarget();
|
||||||
|
|
||||||
|
if (mob.behaviourType.callsForHelp)
|
||||||
|
MobAI.MobCallForHelp(mob);
|
||||||
|
|
||||||
|
// Generate a list of tokens from the mob powers for this mobile.
|
||||||
|
|
||||||
|
powerTokens = new ArrayList<>(mob.mobPowers.keySet());
|
||||||
|
purgeTokens = new ArrayList<>();
|
||||||
|
|
||||||
|
// If player has this effect on them currently then remove
|
||||||
|
// this token from our list.
|
||||||
|
|
||||||
|
for (int powerToken : powerTokens) {
|
||||||
|
|
||||||
|
PowersBase powerBase = PowersManager.getPowerByToken(powerToken);
|
||||||
|
|
||||||
|
for (ActionsBase actionBase : powerBase.getActions()) {
|
||||||
|
|
||||||
|
String stackType = actionBase.stackType;
|
||||||
|
|
||||||
|
if (target.getEffects() != null && target.getEffects().containsKey(stackType))
|
||||||
|
purgeTokens.add(powerToken);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
powerTokens.removeAll(purgeTokens);
|
||||||
|
|
||||||
|
// Sanity check
|
||||||
|
|
||||||
|
if (powerTokens.isEmpty())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
int powerToken;
|
||||||
|
int nukeRoll = ThreadLocalRandom.current().nextInt(1,100);
|
||||||
|
|
||||||
|
if (nukeRoll < 55) {
|
||||||
|
|
||||||
|
//use direct damage spell
|
||||||
|
powerToken = powerTokens.get(powerTokens.size() - 1);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
//use random spell
|
||||||
|
powerToken = powerTokens.get(ThreadLocalRandom.current().nextInt(powerTokens.size()));
|
||||||
|
}
|
||||||
|
|
||||||
|
int powerRank = 1;
|
||||||
|
|
||||||
|
switch(mob.getRank()){
|
||||||
|
case 1:
|
||||||
|
powerRank = 10;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
powerRank = 15;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
powerRank = 20;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
powerRank = 25;
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
powerRank = 30;
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
powerRank = 35;
|
||||||
|
break;
|
||||||
|
case 7:
|
||||||
|
powerRank = 40;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
PowersBase mobPower = PowersManager.getPowerByToken(powerToken);
|
||||||
|
|
||||||
|
//check for hit-roll
|
||||||
|
|
||||||
|
if (mobPower.requiresHitRoll)
|
||||||
|
if (triggerDefense(mob, mob.getCombatTarget()))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Cast the spell
|
||||||
|
|
||||||
|
if (inRange2D(mob, mob.getCombatTarget(), mobPower.getRange())) {
|
||||||
|
|
||||||
|
PerformActionMsg msg;
|
||||||
|
|
||||||
|
if (!mobPower.isHarmful() || mobPower.targetSelf) {
|
||||||
|
|
||||||
|
if (mobPower.category.equals("DISPEL")) {
|
||||||
|
PowersManager.useMobPower(mob, target, mobPower, powerRank);
|
||||||
|
msg = PowersManager.createPowerMsg(mobPower, powerRank, mob, target);
|
||||||
|
} else {
|
||||||
|
PowersManager.useMobPower(mob, mob, mobPower, powerRank);
|
||||||
|
msg = PowersManager.createPowerMsg(mobPower, powerRank, mob, mob);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
PowersManager.useMobPower(mob, target, mobPower, powerRank);
|
||||||
|
msg = PowersManager.createPowerMsg(mobPower, powerRank, mob, target);
|
||||||
|
}
|
||||||
|
|
||||||
|
msg.setUnknown04(2);
|
||||||
|
|
||||||
|
PowersManager.finishUseMobPower(msg, mob, 0, 0);
|
||||||
|
|
||||||
|
long randomCooldown = (long)((ThreadLocalRandom.current().nextInt(10,15) * 1000L) * MobAIThread.AI_CAST_FREQUENCY);
|
||||||
|
mob.nextCastTime = System.currentTimeMillis() + randomCooldown;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: MobCast" + " " + e.getMessage());
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,10 +13,10 @@ import engine.Enum;
|
|||||||
import engine.Enum.GameObjectType;
|
import engine.Enum.GameObjectType;
|
||||||
import engine.Enum.ModType;
|
import engine.Enum.ModType;
|
||||||
import engine.Enum.SourceType;
|
import engine.Enum.SourceType;
|
||||||
import engine.mobileAI.Threads.MobAIThread;
|
|
||||||
import engine.exception.MsgSendException;
|
import engine.exception.MsgSendException;
|
||||||
import engine.gameManager.MovementManager;
|
import engine.gameManager.MovementManager;
|
||||||
import engine.math.Vector3fImmutable;
|
import engine.math.Vector3fImmutable;
|
||||||
|
import engine.mobileAI.Threads.MobAIThread;
|
||||||
import engine.net.client.msg.MoveToPointMsg;
|
import engine.net.client.msg.MoveToPointMsg;
|
||||||
import engine.objects.*;
|
import engine.objects.*;
|
||||||
import org.pmw.tinylog.Logger;
|
import org.pmw.tinylog.Logger;
|
||||||
@@ -38,7 +38,7 @@ public class MovementUtilities {
|
|||||||
if (agent.getContract() != null)
|
if (agent.getContract() != null)
|
||||||
guardCaptain = agent;
|
guardCaptain = agent;
|
||||||
else
|
else
|
||||||
guardCaptain = (Mob) agent.npcOwner;
|
guardCaptain = (Mob) agent.guardCaptain;
|
||||||
|
|
||||||
if (guardCaptain != null) {
|
if (guardCaptain != null) {
|
||||||
Building barracks = guardCaptain.building;
|
Building barracks = guardCaptain.building;
|
||||||
@@ -115,39 +115,8 @@ public class MovementUtilities {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Vector3fImmutable GetMoveLocation(Mob aiAgent, AbstractCharacter aggroTarget) {
|
|
||||||
|
|
||||||
// Player isnt moving and neither is mob. Just return
|
|
||||||
// the mobile's current location. Ain't goin nowhere!
|
|
||||||
// *** Refactor: Check to ensure methods calling us
|
|
||||||
// all don't sent move messages when not moving.
|
|
||||||
|
|
||||||
if ((aggroTarget.isMoving() == false))
|
|
||||||
return aggroTarget.getLoc();
|
|
||||||
|
|
||||||
if (aggroTarget.getEndLoc().x != 0) {
|
|
||||||
|
|
||||||
float aggroTargetDistanceSquared = aggroTarget.getLoc().distanceSquared2D(aggroTarget.getEndLoc());
|
|
||||||
float aiAgentDistanceSquared = aiAgent.getLoc().distanceSquared2D(aggroTarget.getEndLoc());
|
|
||||||
|
|
||||||
if (aiAgentDistanceSquared >= aggroTargetDistanceSquared)
|
|
||||||
return aggroTarget.getEndLoc();
|
|
||||||
else {
|
|
||||||
float distanceToMove = sqrt(aggroTargetDistanceSquared + aiAgentDistanceSquared) * .5f;
|
|
||||||
|
|
||||||
return aggroTarget.getFaceDir().scaleAdd(distanceToMove, aggroTarget.getLoc());
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// One of us is moving so let's calculate our destination loc for this
|
|
||||||
// simulation frame. We will simply project our position onto the
|
|
||||||
// character's movement vector and return the closest point.
|
|
||||||
|
|
||||||
return aiAgent.getLoc().ClosestPointOnLine(aggroTarget.getLoc(), aggroTarget.getEndLoc());
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void moveToLocation(Mob agent, Vector3fImmutable newLocation, float offset) {
|
public static void moveToLocation(Mob agent, Vector3fImmutable newLocation, float offset) {
|
||||||
|
agent.resetLastSetLocUpdate();
|
||||||
try {
|
try {
|
||||||
|
|
||||||
//don't move farther than 30 units from player.
|
//don't move farther than 30 units from player.
|
||||||
@@ -172,32 +141,8 @@ public class MovementUtilities {
|
|||||||
return (agent.isAlive() && !agent.getBonuses().getBool(ModType.Stunned, SourceType.None) && !agent.getBonuses().getBool(ModType.CannotMove, SourceType.None));
|
return (agent.isAlive() && !agent.getBonuses().getBool(ModType.Stunned, SourceType.None) && !agent.getBonuses().getBool(ModType.CannotMove, SourceType.None));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Vector3fImmutable randomPatrolLocation(Mob agent, Vector3fImmutable center, float radius) {
|
|
||||||
|
|
||||||
//Determing where I want to move.
|
|
||||||
return new Vector3fImmutable((center.x - radius) + ((ThreadLocalRandom.current().nextFloat() + .1f * 2) * radius),
|
|
||||||
center.y,
|
|
||||||
(center.z - radius) + ((ThreadLocalRandom.current().nextFloat() + .1f * 2) * radius));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Long estimateMovementTime(Mob agent) {
|
|
||||||
if (agent.getEndLoc().x == 0 && agent.getEndLoc().y == 0)
|
|
||||||
return 0L;
|
|
||||||
|
|
||||||
return (long) ((agent.getLoc().distance2D(agent.getEndLoc()) * 1000) / agent.getSpeed());
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void aiMove(Mob agent, Vector3fImmutable vect, boolean isWalking) {
|
public static void aiMove(Mob agent, Vector3fImmutable vect, boolean isWalking) {
|
||||||
|
|
||||||
//update our walk/run state.
|
|
||||||
if (isWalking && !agent.isWalk()) {
|
|
||||||
agent.setWalkMode(true);
|
|
||||||
MovementManager.sendRWSSMsg(agent);
|
|
||||||
} else if (!isWalking && agent.isWalk()) {
|
|
||||||
agent.setWalkMode(false);
|
|
||||||
MovementManager.sendRWSSMsg(agent);
|
|
||||||
}
|
|
||||||
|
|
||||||
MoveToPointMsg msg = new MoveToPointMsg();
|
MoveToPointMsg msg = new MoveToPointMsg();
|
||||||
|
|
||||||
|
|
||||||
@@ -273,23 +218,4 @@ public class MovementUtilities {
|
|||||||
return character.getLoc();
|
return character.getLoc();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean updateMovementToCharacter(Mob aiAgent, AbstractCharacter aggroTarget) {
|
|
||||||
|
|
||||||
if (aiAgent.destination.equals(Vector3fImmutable.ZERO))
|
|
||||||
return true;
|
|
||||||
|
|
||||||
if (!aiAgent.isMoving())
|
|
||||||
return true;
|
|
||||||
|
|
||||||
|
|
||||||
if (aggroTarget.isMoving()) {
|
|
||||||
return !aiAgent.destination.equals(aggroTarget.getEndLoc()) && !aiAgent.destination.equals(aggroTarget.getLoc());
|
|
||||||
} else {
|
|
||||||
if (aiAgent.destination.equals(aggroTarget.getLoc()))
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -97,7 +97,7 @@ public class NetMsgFactory {
|
|||||||
// if (MBServerStatics.worldServerName.equals("Grief"))
|
// if (MBServerStatics.worldServerName.equals("Grief"))
|
||||||
Logger.error("Invalid protocol msg for player " + player.getFirstName() + " : " + opcode + " lastopcode: " + origin.lastProtocol.name() + " Error Code : " + errorCode);
|
Logger.error("Invalid protocol msg for player " + player.getFirstName() + " : " + opcode + " lastopcode: " + origin.lastProtocol.name() + " Error Code : " + errorCode);
|
||||||
} else
|
} else
|
||||||
Logger.error("Invalid protocol msg : " + opcode + " lastopcode: " + origin.lastProtocol.name() + " Error Code : " + errorCode);
|
Logger.error("PROTOCOL ERROR: Player: " + ((ClientConnection) origin).getPlayerCharacter().getName() + " Account: " + ((ClientConnection) origin).getPlayerCharacter().getAccount().getUname() + "Invalid protocol msg : " + opcode + " lastopcode: " + origin.lastProtocol.name() + " Error Code : " + errorCode);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
|
|
||||||
package engine.net.client;
|
package engine.net.client;
|
||||||
|
|
||||||
|
import engine.Enum;
|
||||||
import engine.Enum.*;
|
import engine.Enum.*;
|
||||||
import engine.InterestManagement.WorldGrid;
|
import engine.InterestManagement.WorldGrid;
|
||||||
import engine.exception.MsgSendException;
|
import engine.exception.MsgSendException;
|
||||||
@@ -122,6 +123,7 @@ public class ClientMessagePump implements NetMsgHandler {
|
|||||||
if (pc.isSit()) {
|
if (pc.isSit()) {
|
||||||
pc.setCombat(false);
|
pc.setCombat(false);
|
||||||
pc.cancelOnSit();
|
pc.cancelOnSit();
|
||||||
|
pc.stopMovement(pc.loc);
|
||||||
}
|
}
|
||||||
|
|
||||||
UpdateStateMsg rwss = new UpdateStateMsg();
|
UpdateStateMsg rwss = new UpdateStateMsg();
|
||||||
@@ -222,6 +224,11 @@ public class ClientMessagePump implements NetMsgHandler {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(msg.getSlotNumber() == 11 && pc.getRaceID() == 1999){
|
||||||
|
forceTransferFromEquipToInventory(msg, origin, "Saetor cannot wear shoes.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
int uuid = msg.getUUID();
|
int uuid = msg.getUUID();
|
||||||
int slot = msg.getSlotNumber();
|
int slot = msg.getSlotNumber();
|
||||||
//System.out.println("loading to slot: " + slot);
|
//System.out.println("loading to slot: " + slot);
|
||||||
@@ -554,18 +561,32 @@ public class ClientMessagePump implements NetMsgHandler {
|
|||||||
if (i == null)
|
if (i == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if(i.getItemBaseID() == 7)
|
||||||
|
return; //cant delete gold
|
||||||
|
|
||||||
if (!itemManager.doesCharOwnThisItem(i.getObjectUUID()))
|
if (!itemManager.doesCharOwnThisItem(i.getObjectUUID()))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!itemManager.inventoryContains(i))
|
if (!itemManager.inventoryContains(i))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (i.isCanDestroy())
|
if(i.getItemBaseID() == 980066)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (i.canDestroy) {
|
||||||
|
int value = i.getItemBase().value;
|
||||||
|
if(i.getItemBase().isRune())
|
||||||
|
value = 500000;
|
||||||
|
if(sourcePlayer.getCharItemManager().getGoldInventory().getNumOfItems() + value > 10000000){
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (itemManager.delete(i) == true) {
|
if (itemManager.delete(i) == true) {
|
||||||
|
sourcePlayer.getCharItemManager().addGoldToInventory(value,false);
|
||||||
|
sourcePlayer.getCharItemManager().updateInventory();
|
||||||
Dispatch dispatch = Dispatch.borrow(sourcePlayer, msg);
|
Dispatch dispatch = Dispatch.borrow(sourcePlayer, msg);
|
||||||
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void ackBankWindowOpened(AckBankWindowOpenedMsg msg, ClientConnection origin) {
|
private static void ackBankWindowOpened(AckBankWindowOpenedMsg msg, ClientConnection origin) {
|
||||||
@@ -1358,219 +1379,171 @@ public class ClientMessagePump implements NetMsgHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static void buyFromNPC(BuyFromNPCMsg msg, ClientConnection origin) {
|
private static void buyFromNPC(BuyFromNPCMsg msg, ClientConnection origin) {
|
||||||
|
|
||||||
PlayerCharacter sourcePlayer = SessionManager.getPlayerCharacter(origin);
|
PlayerCharacter sourcePlayer = SessionManager.getPlayerCharacter(origin);
|
||||||
|
|
||||||
if (sourcePlayer == null)
|
if (sourcePlayer == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (origin.buyLock.tryLock()) {
|
if (origin.buyLock.tryLock()) {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
CharacterItemManager itemMan = sourcePlayer.getCharItemManager();
|
CharacterItemManager itemMan = sourcePlayer.getCharItemManager();
|
||||||
|
if (itemMan == null) {
|
||||||
if (itemMan == null)
|
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
NPC npc = NPC.getFromCache(msg.getNPCID());
|
NPC npc = NPC.getFromCache(msg.getNPCID());
|
||||||
|
if (npc == null) {
|
||||||
if (npc == null)
|
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
Item gold = itemMan.getGoldInventory();
|
Item gold = itemMan.getGoldInventory();
|
||||||
|
if (gold == null) {
|
||||||
if (gold == null)
|
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
Item buy = null;
|
Item buy = null;
|
||||||
|
|
||||||
if (msg.getItemType() == GameObjectType.MobEquipment.ordinal()) {
|
if (msg.getItemType() == GameObjectType.MobEquipment.ordinal()) {
|
||||||
ArrayList<MobEquipment> sellInventory = npc.getContract().getSellInventory();
|
ArrayList<MobEquipment> sellInventory = npc.getContract().getSellInventory();
|
||||||
if (sellInventory == null)
|
if (sellInventory == null) {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
for (MobEquipment me : sellInventory) {
|
for (MobEquipment me : sellInventory) {
|
||||||
if (me.getObjectUUID() == msg.getItemID()) {
|
if (me.getObjectUUID() == msg.getItemID()) {
|
||||||
ItemBase ib = me.getItemBase();
|
ItemBase ib = me.getItemBase();
|
||||||
if (ib == null)
|
if (ib == null) {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
//test room available for item
|
//test room available for item
|
||||||
if (!itemMan.hasRoomInventory(ib.getWeight()))
|
if (!itemMan.hasRoomInventory(ib.getWeight())) {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
int cost = me.getMagicValue();
|
int cost = me.magicValue;
|
||||||
|
if(npc.getContractID() == 1201 && me.getItemBase().getName().equals("Prospector"))
|
||||||
|
cost = 50;
|
||||||
float bargain = sourcePlayer.getBargain();
|
float bargain = sourcePlayer.getBargain();
|
||||||
|
|
||||||
float profit = npc.getSellPercent(sourcePlayer) - bargain;
|
float profit = npc.getSellPercent(sourcePlayer) - bargain;
|
||||||
|
if(me.getItemBase().getType().equals(ItemType.POTION))
|
||||||
|
profit -= 1.0f;
|
||||||
if (profit < 1)
|
if (profit < 1)
|
||||||
profit = 1;
|
profit = 1;
|
||||||
|
if(npc.getContractID() == 900){
|
||||||
|
cost = Warehouse.getCostForResource(ib.getUUID()) * Warehouse.getSellStackSize(ib.getUUID());
|
||||||
|
}
|
||||||
cost *= profit;
|
cost *= profit;
|
||||||
|
|
||||||
|
|
||||||
if (gold.getNumOfItems() - cost < 0) {
|
if (gold.getNumOfItems() - cost < 0) {
|
||||||
//dont' have enough goldItem exit!
|
//dont' have enough goldItem exit!
|
||||||
// chatMan.chatSystemInfo(pc, "" + "You dont have enough gold.");
|
// chatMan.chatSystemInfo(pc, "" + "You dont have enough gold.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Building b = (!npc.isStatic()) ? npc.getBuilding() : null;
|
Building b = (!npc.isStatic()) ? npc.getBuilding() : null;
|
||||||
|
|
||||||
if (b != null && b.getProtectionState().equals(ProtectionState.NPC))
|
if (b != null && b.getProtectionState().equals(ProtectionState.NPC))
|
||||||
b = null;
|
b = null;
|
||||||
int buildingDeposit = cost - me.getMagicValue();
|
int buildingDeposit = cost - me.getMagicValue();
|
||||||
if (b != null && (b.getStrongboxValue() + buildingDeposit) > b.getMaxGold()) {
|
if (b != null && (b.getStrongboxValue() + buildingDeposit) > b.getMaxGold() && !b.isOwnerIsNPC()) {
|
||||||
ErrorPopupMsg.sendErrorPopup(sourcePlayer, 206);
|
ErrorPopupMsg.sendErrorPopup(sourcePlayer, 206);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!itemMan.buyFromNPC(b, cost, buildingDeposit)) {
|
if (!itemMan.buyFromNPC(b, cost, buildingDeposit)) {
|
||||||
// chatMan.chatSystemInfo(pc, "" + "You Failed to buy the item.");
|
// chatMan.chatSystemInfo(pc, "" + "You Failed to buy the item.");
|
||||||
|
ChatManager.chatSystemError(sourcePlayer, "Failed To Buy Item");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if(me.getItemBase().getType().equals(ItemType.RESOURCE) && npc.getContractID() == 900){
|
||||||
buy = Item.createItemForPlayer(sourcePlayer, ib);
|
handleResourcePurchase(me,itemMan,npc,buy,sourcePlayer,ib);
|
||||||
|
}else {
|
||||||
if (buy != null) {
|
buy = Item.createItemForPlayer(sourcePlayer, ib);
|
||||||
me.transferEnchants(buy);
|
if (buy != null) {
|
||||||
itemMan.addItemToInventory(buy);
|
me.transferEnchants(buy);
|
||||||
//itemMan.updateInventory();
|
itemMan.addItemToInventory(buy);
|
||||||
|
if(npc.contractUUID == 900 && buy.getItemBaseID() == 1705032){
|
||||||
|
buy.setNumOfItems(10);
|
||||||
|
DbManager.ItemQueries.UPDATE_NUM_ITEMS(buy,buy.getNumOfItems());
|
||||||
|
}
|
||||||
|
//itemMan.updateInventory();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (msg.getItemType() == GameObjectType.Item.ordinal()) {
|
} else if (msg.getItemType() == GameObjectType.Item.ordinal()) {
|
||||||
|
|
||||||
CharacterItemManager npcCim = npc.getCharItemManager();
|
CharacterItemManager npcCim = npc.getCharItemManager();
|
||||||
|
|
||||||
if (npcCim == null)
|
if (npcCim == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
buy = Item.getFromCache(msg.getItemID());
|
buy = Item.getFromCache(msg.getItemID());
|
||||||
|
|
||||||
if (buy == null)
|
if (buy == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ItemBase ib = buy.getItemBase();
|
ItemBase ib = buy.getItemBase();
|
||||||
|
|
||||||
if (ib == null)
|
if (ib == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!npcCim.inventoryContains(buy))
|
if (!npcCim.inventoryContains(buy))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
//test room available for item
|
//test room available for item
|
||||||
if (!itemMan.hasRoomInventory(ib.getWeight()))
|
if (!itemMan.hasRoomInventory(ib.getWeight()))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
//TODO test cost and subtract goldItem
|
//TODO test cost and subtract goldItem
|
||||||
|
|
||||||
//TODO CHnage this if we ever put NPc city npcs in buildings.
|
//TODO CHnage this if we ever put NPc city npcs in buildings.
|
||||||
int cost = buy.getBaseValue();
|
int cost = buy.getBaseValue();
|
||||||
|
|
||||||
if (buy.isID() || buy.isCustomValue())
|
if (buy.isID() || buy.isCustomValue())
|
||||||
cost = buy.getMagicValue();
|
cost = buy.getMagicValue();
|
||||||
|
|
||||||
float bargain = sourcePlayer.getBargain();
|
float bargain = sourcePlayer.getBargain();
|
||||||
|
|
||||||
float profit = npc.getSellPercent(sourcePlayer) - bargain;
|
float profit = npc.getSellPercent(sourcePlayer) - bargain;
|
||||||
|
|
||||||
if (profit < 1)
|
if (profit < 1)
|
||||||
profit = 1;
|
profit = 1;
|
||||||
|
|
||||||
if (!buy.isCustomValue())
|
if (!buy.isCustomValue())
|
||||||
cost *= profit;
|
cost *= profit;
|
||||||
else
|
else
|
||||||
cost = buy.getValue();
|
cost = buy.getValue();
|
||||||
|
|
||||||
|
|
||||||
if (gold.getNumOfItems() - cost < 0) {
|
if (gold.getNumOfItems() - cost < 0) {
|
||||||
ErrorPopupMsg.sendErrorPopup(sourcePlayer, 128); // Insufficient Gold
|
ErrorPopupMsg.sendErrorPopup(sourcePlayer, 128); // Insufficient Gold
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Building b = (!npc.isStatic()) ? npc.getBuilding() : null;
|
Building b = (!npc.isStatic()) ? npc.getBuilding() : null;
|
||||||
|
|
||||||
if (b != null)
|
if (b != null)
|
||||||
if (b.getProtectionState().equals(ProtectionState.NPC))
|
if (b.getProtectionState().equals(ProtectionState.NPC))
|
||||||
b = null;
|
b = null;
|
||||||
|
|
||||||
int buildingDeposit = cost;
|
int buildingDeposit = cost;
|
||||||
|
if (b != null && (b.getStrongboxValue() + buildingDeposit) > b.getMaxGold() && !b.isOwnerIsNPC()) {
|
||||||
if (b != null && (b.getStrongboxValue() + buildingDeposit) > b.getMaxGold()) {
|
|
||||||
ErrorPopupMsg.sendErrorPopup(sourcePlayer, 206);
|
ErrorPopupMsg.sendErrorPopup(sourcePlayer, 206);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!itemMan.buyFromNPC(b, cost, buildingDeposit)) {
|
if (!itemMan.buyFromNPC(b, cost, buildingDeposit)) {
|
||||||
ErrorPopupMsg.sendErrorPopup(sourcePlayer, 110);
|
ErrorPopupMsg.sendErrorPopup(sourcePlayer, 110);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (buy != null)
|
if (buy != null)
|
||||||
itemMan.buyFromNPC(buy, npc);
|
itemMan.buyFromNPC(buy, npc);
|
||||||
|
|
||||||
} else if (msg.getItemType() == GameObjectType.MobLoot.ordinal()) {
|
} else if (msg.getItemType() == GameObjectType.MobLoot.ordinal()) {
|
||||||
|
|
||||||
CharacterItemManager npcCim = npc.getCharItemManager();
|
CharacterItemManager npcCim = npc.getCharItemManager();
|
||||||
|
|
||||||
if (npcCim == null)
|
if (npcCim == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
buy = MobLoot.getFromCache(msg.getItemID());
|
buy = MobLoot.getFromCache(msg.getItemID());
|
||||||
|
|
||||||
if (buy == null)
|
if (buy == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ItemBase ib = buy.getItemBase();
|
ItemBase ib = buy.getItemBase();
|
||||||
|
|
||||||
if (ib == null)
|
if (ib == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!npcCim.inventoryContains(buy))
|
if (!npcCim.inventoryContains(buy))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
//test room available for item
|
//test room available for item
|
||||||
if (!itemMan.hasRoomInventory(ib.getWeight()))
|
if (!itemMan.hasRoomInventory(ib.getWeight()))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
//TODO test cost and subtract goldItem
|
//TODO test cost and subtract goldItem
|
||||||
|
|
||||||
//TODO CHnage this if we ever put NPc city npcs in buildings.
|
//TODO CHnage this if we ever put NPc city npcs in buildings.
|
||||||
|
|
||||||
int cost = buy.getMagicValue();
|
int cost = buy.getMagicValue();
|
||||||
cost *= npc.getSellPercent(sourcePlayer);
|
cost *= npc.getSellPercent(sourcePlayer);
|
||||||
|
|
||||||
|
|
||||||
if (gold.getNumOfItems() - cost < 0) {
|
if (gold.getNumOfItems() - cost < 0) {
|
||||||
ErrorPopupMsg.sendErrorPopup(sourcePlayer, 128); // Insufficient Gold
|
ErrorPopupMsg.sendErrorPopup(sourcePlayer, 128); // Insufficient Gold
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Building b = (!npc.isStatic()) ? npc.getBuilding() : null;
|
Building b = (!npc.isStatic()) ? npc.getBuilding() : null;
|
||||||
|
|
||||||
if (b != null && b.getProtectionState().equals(ProtectionState.NPC))
|
if (b != null && b.getProtectionState().equals(ProtectionState.NPC))
|
||||||
b = null;
|
b = null;
|
||||||
int buildingDeposit = cost;
|
int buildingDeposit = cost;
|
||||||
|
if (b != null && (b.getStrongboxValue() + buildingDeposit) > b.getMaxGold() && !b.isOwnerIsNPC()) {
|
||||||
if (b != null && (b.getStrongboxValue() + buildingDeposit) > b.getMaxGold()) {
|
|
||||||
ErrorPopupMsg.sendErrorPopup(sourcePlayer, 206);
|
ErrorPopupMsg.sendErrorPopup(sourcePlayer, 206);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!itemMan.buyFromNPC(b, cost, buildingDeposit))
|
if (!itemMan.buyFromNPC(b, cost, buildingDeposit))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (buy != null)
|
if (buy != null)
|
||||||
itemMan.buyFromNPC(buy, npc);
|
itemMan.buyFromNPC(buy, npc);
|
||||||
|
|
||||||
} else
|
} else
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (buy != null) {
|
if (buy != null) {
|
||||||
|
|
||||||
msg.setItem(buy);
|
msg.setItem(buy);
|
||||||
//send the buy message back to update player
|
//send the buy message back to update player
|
||||||
// msg.setItemType(buy.getObjectType().ordinal());
|
// msg.setItemType(buy.getObjectType().ordinal());
|
||||||
@@ -1579,16 +1552,44 @@ public class ClientMessagePump implements NetMsgHandler {
|
|||||||
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
||||||
itemMan.updateInventory();
|
itemMan.updateInventory();
|
||||||
}
|
}
|
||||||
|
|
||||||
} finally {
|
} finally {
|
||||||
origin.buyLock.unlock();
|
origin.buyLock.unlock();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ErrorPopupMsg.sendErrorPopup(origin.getPlayerCharacter(), 12); // All production slots taken
|
ErrorPopupMsg.sendErrorPopup(origin.getPlayerCharacter(), 12); // All production slots taken
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void handleResourcePurchase(MobEquipment me, CharacterItemManager itemMan, NPC npc, Item buy, PlayerCharacter sourcePlayer, ItemBase ib){
|
||||||
|
boolean stacked = false;
|
||||||
|
int buystack = Warehouse.getSellStackSize(me.getItemBase().getUUID());
|
||||||
|
for(Item item : itemMan.getInventory()){
|
||||||
|
int itemID = item.getItemBaseID();
|
||||||
|
int meID = me.getItemBase().getUUID();
|
||||||
|
if(itemID == meID){
|
||||||
|
if(Warehouse.maxResources.isEmpty())
|
||||||
|
Warehouse.getMaxResources();
|
||||||
|
int maxStack = Warehouse.maxResources.get(itemID);
|
||||||
|
if(maxStack > item.getNumOfItems() + buystack){
|
||||||
|
item.setNumOfItems(item.getNumOfItems() + buystack);
|
||||||
|
stacked = true;
|
||||||
|
itemMan.updateInventory();
|
||||||
|
DbManager.ItemQueries.UPDATE_NUM_ITEMS(item,item.getNumOfItems());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!stacked){
|
||||||
|
buy = Item.createItemForPlayer(sourcePlayer, ib);
|
||||||
|
if (buy != null) {
|
||||||
|
me.transferEnchants(buy);
|
||||||
|
itemMan.addItemToInventory(buy);
|
||||||
|
buy.setNumOfItems(buystack);
|
||||||
|
DbManager.ItemQueries.UPDATE_NUM_ITEMS(buy,buy.getNumOfItems());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
itemMan.updateInventory();
|
||||||
|
}
|
||||||
private static void Repair(RepairMsg msg, ClientConnection origin) {
|
private static void Repair(RepairMsg msg, ClientConnection origin) {
|
||||||
|
|
||||||
PlayerCharacter player = SessionManager.getPlayerCharacter(origin);
|
PlayerCharacter player = SessionManager.getPlayerCharacter(origin);
|
||||||
@@ -1631,8 +1632,8 @@ public class ClientMessagePump implements NetMsgHandler {
|
|||||||
if (toRepair == null)
|
if (toRepair == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (toRepair.getItemBase().isGlass())
|
//if (toRepair.getItemBase().isGlass())
|
||||||
return;
|
// return;
|
||||||
|
|
||||||
//make sure item is in player's inventory or equipment
|
//make sure item is in player's inventory or equipment
|
||||||
if (!itemMan.inventoryContains(toRepair) && !itemMan.equippedContains(toRepair))
|
if (!itemMan.inventoryContains(toRepair) && !itemMan.equippedContains(toRepair))
|
||||||
@@ -1654,6 +1655,12 @@ public class ClientMessagePump implements NetMsgHandler {
|
|||||||
}
|
}
|
||||||
//TODO get cost to repair
|
//TODO get cost to repair
|
||||||
int cost = (int) ((max - dur) * 80.1);
|
int cost = (int) ((max - dur) * 80.1);
|
||||||
|
|
||||||
|
//glass costs 3x as much to repair
|
||||||
|
if (toRepair.getItemBase().isGlass()){
|
||||||
|
cost *= 3;
|
||||||
|
}
|
||||||
|
|
||||||
Building b = (!npc.isStatic()) ? npc.getBuilding() : null;
|
Building b = (!npc.isStatic()) ? npc.getBuilding() : null;
|
||||||
|
|
||||||
if (b != null)
|
if (b != null)
|
||||||
@@ -1888,9 +1895,22 @@ public class ClientMessagePump implements NetMsgHandler {
|
|||||||
break;
|
break;
|
||||||
case LEAVEREQUEST:
|
case LEAVEREQUEST:
|
||||||
origin.disconnect();
|
origin.disconnect();
|
||||||
|
ArrayList<PlayerCharacter> sameMachine = new ArrayList<>();
|
||||||
|
for (PlayerCharacter pc : SessionManager.getAllActivePlayers()) {
|
||||||
|
if(origin.machineID.equals(pc.getClientConnection().machineID))
|
||||||
|
sameMachine.add(pc);
|
||||||
|
}
|
||||||
|
if(sameMachine.isEmpty() == false){
|
||||||
|
if(sameMachine.get(0) != null) {
|
||||||
|
sameMachine.get(0).isBoxed = false;
|
||||||
|
sameMachine.get(0).removeEffectBySource(EffectSourceType.DeathShroud,41,true);
|
||||||
|
ChatManager.chatSystemInfo(sameMachine.get(0), "You Are No Longer Flagged 'Boxed'");
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case POWER:
|
case POWER:
|
||||||
PowersManager.usePower((PerformActionMsg) msg, origin, false);
|
PowersManager.usePower((PerformActionMsg) msg, origin, false);
|
||||||
|
//PowersManager.static_power_que.add(new PowersManager.PowerQueObject((PerformActionMsg) msg, origin, false));
|
||||||
break;
|
break;
|
||||||
case REQUESTMELEEATTACK:
|
case REQUESTMELEEATTACK:
|
||||||
CombatManager.setAttackTarget((AttackCmdMsg) msg, origin);
|
CombatManager.setAttackTarget((AttackCmdMsg) msg, origin);
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user