forked from MagicBane/Server
Compare commits
1170 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| a97734bac0 | |||
| 9caeb80ccc | |||
| 0e3e334cc1 | |||
| 536d35bb49 | |||
| f57f300716 | |||
| 62ab1b9fb2 | |||
| 6b846cba0f | |||
| 7b8831ebdd | |||
| 6b92225a5f | |||
| bbdc58c217 | |||
| 537a30710a | |||
| 5626255b12 | |||
| ea8a7c0e39 | |||
| f7f5aa59a0 | |||
| b2038e201c | |||
| dbe748bcdd | |||
| 165e721eb8 | |||
| f7f306855a | |||
| 6a54767a53 | |||
| 9b8de72a6f | |||
| 1a0ad765bf | |||
| 69c74240da | |||
| fe498e9b20 | |||
| ee7e16c32e | |||
| 7820ff06c9 | |||
| 41713a9412 | |||
| e03dc8d8be | |||
| 8c2ddd266d | |||
| a290e3659e | |||
| 676f0e7023 | |||
| 1fda6cc80d | |||
| 04a2d6fb1c | |||
| 7eb6535051 | |||
| b4b3b0ae17 | |||
| 2681671543 | |||
| 50bf375006 | |||
| 9fa3c9d7aa | |||
| dbf681b065 | |||
| 3fdc299210 | |||
| 7bf4f0627e | |||
| 47f39fd963 | |||
| a92a67579a | |||
| 6dfac2d604 | |||
| de1e8eed98 | |||
| 0ec2add724 | |||
| 87675bb950 | |||
| 873e56f076 | |||
| 01b59cce99 | |||
| 8c9696a3f9 | |||
| 128f677d0e | |||
| a7b9fec032 | |||
| d25109fcf6 | |||
| 9283181a14 | |||
| 8dd4953023 | |||
| 5ba476e5a5 | |||
| 0f402ac0cc | |||
| 9032565220 | |||
| 8194bd8ef2 | |||
| 78911a0a21 | |||
| d96a2a8d25 | |||
| 76c637e733 | |||
| 0331fc88af | |||
| 03f6ee6c70 | |||
| 97d5a19e91 | |||
| 6d064636a5 | |||
| d67bf0bc64 | |||
| 199215f2e6 | |||
| 602b16457f | |||
| 7c67e15d40 | |||
| 2d69e335e0 | |||
| afeb4f59bd | |||
| dd2707f6fb | |||
| 49ce99fd58 | |||
| 65e306c3cb | |||
| 86db21de43 | |||
| 1f897a3cb8 | |||
| 47c47bb61b | |||
| f62794f8ab | |||
| e9d9f50c9e | |||
| e3ec9ac56f | |||
| 2612a7f074 | |||
| e71ca71b30 | |||
| 6db31794fc | |||
| b06d854182 | |||
| 6080bae50d | |||
| 49c956d2bf | |||
| 49ca340b36 | |||
| 43072786b1 | |||
| aba82616df | |||
| 78f95d0173 | |||
| 2a7fd87686 | |||
| 9078a41c58 | |||
| 2a0e780306 | |||
| 77a73e9171 | |||
| 8a4db1b1de | |||
| a5186265e2 | |||
| b7e4f309e8 | |||
| a7d01cc461 | |||
| 28ca527aca | |||
| 9277ddd8ef | |||
| 16df24ea27 | |||
| e6f92d105d | |||
| 887501c040 | |||
| 35ab20701c | |||
| 617cad69e1 | |||
| 4268d39d17 | |||
| 3561564f8c | |||
| f4361113ed | |||
| 32563e3f5f | |||
| 011ceea598 | |||
| eaeb2eb943 | |||
| 3b1bb803a8 | |||
| acb111a114 | |||
| aaa737649e | |||
| 67653febd5 | |||
| 7227a5c860 | |||
| b15c335b42 | |||
| c849bf0a1d | |||
| 6bac4d830a | |||
| 96122b5beb | |||
| 35ef86110f | |||
| 3e04f36fd7 | |||
| 454335c233 | |||
| 4b6b209188 | |||
| 44b5e8cfd9 | |||
| e1c109cd6c | |||
| 71735c73ff | |||
| 54b8a1df19 | |||
| fed9ba4240 | |||
| 64d9401089 | |||
| 1b8403f07b | |||
| 95c13789c7 | |||
| d3fc4f2263 | |||
| d562c49cd5 | |||
| 83aa28cad4 | |||
| 15a823a4e5 | |||
| 4b2fbf2dc0 | |||
| e07fe59a12 | |||
| 8d950aaa91 | |||
| 8fb88ee7e1 | |||
| 2cfc5b64a7 | |||
| cc385b923c | |||
| 6af4cd2fc2 | |||
| 3990defd7a | |||
| 12bb1a39f8 | |||
| 158dbf9141 | |||
| c8ae48ae60 | |||
| 76b75f0a37 | |||
| 9b250a38f3 | |||
| cbcdaaa221 | |||
| c761cd982f | |||
| f4af11b38f | |||
| 8982c287b4 | |||
| 85e1f3434c | |||
| 9c623f277b | |||
| f9f4665e52 | |||
| ec23f78c58 | |||
| 58b287bc4b | |||
| 89b5ebe7aa | |||
| 169f49e6c3 | |||
| bfc0c57dd8 | |||
| 1c5d78d566 | |||
| a46619c50a | |||
| d4e430e816 | |||
| e49fc398ed | |||
| ef9c431d5e | |||
| cf6db2444c | |||
| d074aa8f1c | |||
| 4ea4609b1b | |||
| 58e84bfc21 | |||
| 0a82a69a95 | |||
| b33af64f60 | |||
| 6311f8b2f8 | |||
| e4ac2bc489 | |||
| 5b6896e537 | |||
| 46b9da0612 | |||
| 898f6dfa69 | |||
| 67628a21b3 | |||
| 9f09a0e8b0 | |||
| 251210d166 | |||
| 5841db2a0d | |||
| 6127bbadb4 | |||
| 8e5584f413 | |||
| d5e69446c7 | |||
| b3247160d7 | |||
| 06e31c1243 | |||
| ac5528382c | |||
| 9d8467613a | |||
| 8ff0594333 | |||
| 2e7707fcbe | |||
| 78131ed6f2 | |||
| 9b2a1a271e | |||
| 846d720c2f | |||
| 9ba2f375cf | |||
| 22c975d251 | |||
| 601687133f | |||
| 2c47f593f3 | |||
| 6d004d631c | |||
| 2b4a87777c | |||
| b795db7fbd | |||
| af684c6968 | |||
| 80b1ab709d | |||
| 140ba6ae75 | |||
| c24d779d08 | |||
| 5f169fcfae | |||
| a5e0396dc6 | |||
| c5b2db051b | |||
| b94f8e4b03 | |||
| dbfc33563c | |||
| 57e7c3285f | |||
| c01d47fe21 | |||
| d5eb423db8 | |||
| 69113ee3c4 | |||
| c1aa6e2434 | |||
| 7820743222 | |||
| e6762ef9b5 | |||
| 81b60cd269 | |||
| 755d89ebe0 | |||
| aab28cd68c | |||
| 97b2af52b9 | |||
| 16a0b9c0e3 | |||
| bfd89036b2 | |||
| 9cad140836 | |||
| a9ca96bf96 | |||
| 1ef18490b5 | |||
| 8d739c3dae | |||
| 44f5fb02a3 | |||
| 240198eec6 | |||
| dfe300ba4b | |||
| b48d294eca | |||
| be27262e47 | |||
| d1d51ef791 | |||
| e380c4dddb | |||
| f9a7b91868 | |||
| cb73a81e33 | |||
| 47f1aa8a89 | |||
| ca0738b6ed | |||
| 5fabd31495 | |||
| e90465ee8f | |||
| 1b1c636628 | |||
| 5f28d3ae10 | |||
| d0e93773ad | |||
| 2160719126 | |||
| 0449465af9 | |||
| 891e350362 | |||
| 942c37442e | |||
| 0571d5ded3 | |||
| 1f63df4f08 | |||
| eec07f3a28 | |||
| a199014a98 | |||
| 48f8cf32b7 | |||
| f28b15b95e | |||
| 8e5aec841d | |||
| 9b7bcdc043 | |||
| 2dbaac5bcf | |||
| 2f201151df | |||
| 3d48951184 | |||
| 3d199a9362 | |||
| c8a95cab41 | |||
| 43631af53b | |||
| 89e31fd159 | |||
| ffecdbb06b | |||
| 7331c870c2 | |||
| 4b760baae4 | |||
| 8106b100ec | |||
| 53285ca898 | |||
| 9db7411ee6 | |||
| a12687913e | |||
| 937656a91d | |||
| 5f2034a35b | |||
| 87d39ae29d | |||
| bd95a8d7af | |||
| 1fa9a88ae3 | |||
| 34e3ae20d7 | |||
| 55b6d60141 | |||
| 92d0aec77d | |||
| 1282f58a3c | |||
| 1070d61251 | |||
| f7ab5347ab | |||
| 517e64d613 | |||
| 5ed31c5e2e | |||
| c50bcb0a32 | |||
| 09a6e18d4f | |||
| b0dd7e9b59 | |||
| 92d685c3e3 | |||
| 84a1db1e09 | |||
| d0e3cac4c3 | |||
| 9a5fd53271 | |||
| 8d4fb261b5 | |||
| 4a7a999ed1 | |||
| e69c0f2799 | |||
| 9e36d558bf | |||
| df2271fe2c | |||
| 1f7d2a14bf | |||
| a99047aee8 | |||
| 5dc9e127bb | |||
| bb05bdd87c | |||
| 4c0b480aeb | |||
| 3cf38da567 | |||
| 96731bd9bb | |||
| 9d79afa395 | |||
| 944290f958 | |||
| e6eb753666 | |||
| 4ad7e0f021 | |||
| 8d587538e0 | |||
| 4ae64ab94c | |||
| c5e6205801 | |||
| 5a3f4e690f | |||
| 048474b014 | |||
| 24e01acff4 | |||
| a75670bf0e | |||
| d56d58492a | |||
| 7b33c1392a | |||
| 86c95f0eb5 | |||
| 6ed648d6d4 | |||
| c722450f65 | |||
| bbcbd6fc39 | |||
| 123c488fc6 | |||
| f5ebda9147 | |||
| 1132f88b85 | |||
| edc4aa5d07 | |||
| 734b67be6d | |||
| 53c8b28d2d | |||
| 017026fd03 | |||
| 4e9b1927f2 | |||
| 56ce5b5a3c | |||
| afd1b4e760 | |||
| 1975e60f36 | |||
| fbdca5b917 | |||
| 78dfa0c68c | |||
| a04ad2f382 | |||
| 257a8aff15 | |||
| 291a20c4d0 | |||
| eec08ce962 | |||
| 99183dc248 | |||
| 6c7f01dc72 | |||
| 6ebeb9cadf | |||
| 8e0f1090d9 | |||
| bc0bc577ea | |||
| 3b5c0e6210 | |||
| d6fa7dba9d | |||
| b5fbc8478d | |||
| b79c827d81 | |||
| b9b254f8e8 | |||
| 6834146eb2 | |||
| e9f1711120 | |||
| 29f054e192 | |||
| 7d9c5d3498 | |||
| 618353c088 | |||
| 24656b1030 | |||
| 27cb704837 | |||
| 6961b186a9 | |||
| bee91a6aa7 | |||
| 8c5b1d56c2 | |||
| f21e8c130b | |||
| 345c451ac8 | |||
| c3a7262a7f | |||
| d1c6d9edec | |||
| 1e865eecbc | |||
| 5f735a49c1 | |||
| e609c015b9 | |||
| 5a198669b9 | |||
| fe399664f3 | |||
| 3bc62e9baa | |||
| cf23266f31 | |||
| b097472402 | |||
| 57b18c2d15 | |||
| 040eef576e | |||
| d76403a0c8 | |||
| 8ce1054599 | |||
| 0daf8cfe4c | |||
| 898c4c2fa0 | |||
| ecba693105 | |||
| dbc0da20df | |||
| 354d0ab283 | |||
| c1b66269bb | |||
| 7981acb582 | |||
| 03448397ee | |||
| 685dc572e8 | |||
| 5a161a0808 | |||
| 3e4aad9db9 | |||
| 47981872be | |||
| daea835613 | |||
| 55923559cd | |||
| 9efde874f3 | |||
| 9b2b0073a5 | |||
| 33328f74db | |||
| 41023fb890 | |||
| 54a279c3e6 | |||
| 29aea83217 | |||
| 30d27f8a68 | |||
| 17e54ea4aa | |||
| 86c0bbb065 | |||
| ec4cad5e19 | |||
| b674625f7b | |||
| d57b45ef9c | |||
| 2a38c60a67 | |||
| cd1e38b184 | |||
| 69457d5f7e | |||
| 7728a800d9 | |||
| 8b2c018103 | |||
| 76d39f5cc3 | |||
| 826457fb25 | |||
| 0681d3d116 | |||
| ccdea6f970 | |||
| ab00fd7a85 | |||
| 70d67a2b7f | |||
| f5b27e0c5b | |||
| 3c26df5f86 | |||
| 9ed43b5891 | |||
| 4814404f1c | |||
| b1d41e8e85 | |||
| cc5aa4c140 | |||
| 934c0a98f8 | |||
| 91c2cd47fb | |||
| 22f14fb8f1 | |||
| 93a975dd42 | |||
| 7d1570fdca | |||
| 76db3e1f96 | |||
| afbe23fc03 | |||
| 4e417c8810 | |||
| d79c69658a | |||
| 0d125e2640 | |||
| e4a3405032 | |||
| c391272e5b | |||
| 0d3423d51b | |||
| 549ca25483 | |||
| 603d4ca3a8 | |||
| fababd3e42 | |||
| bec6230a06 | |||
| 773b6253b9 | |||
| 1ffcc1086b | |||
| 992d52a389 | |||
| 61088d0b59 | |||
| 601e97eaca | |||
| eae4675f85 | |||
| 84410114e7 | |||
| 70855acbcf | |||
| 2a8e0dea73 | |||
| 6c4f18218c | |||
| 0b5f469b13 | |||
| 68a43388ff | |||
| 5fe12df436 | |||
| caa0aa5172 | |||
| 37a81ed53e | |||
| 39afb33186 | |||
| 228152596c | |||
| d75a052bd3 | |||
| 81d6a55096 | |||
| 55d9cf6d26 | |||
| 9cf69ec73f | |||
| 4595582def | |||
| 0b2d598261 | |||
| cf342cd1a6 | |||
| 05bb323c0c | |||
| c415bb15e2 | |||
| eac58b086b | |||
| fea39ffa85 | |||
| fb8971ce86 | |||
| e44dd5e2cc | |||
| 3ed303bec4 | |||
| f4267c3c92 | |||
| c5f678ea0e | |||
| 4fe3d92b3f | |||
| 284fc7e37e | |||
| 402d69312c | |||
| 198648d3db | |||
| 3a01dbf5f6 | |||
| 0ec505e37f | |||
| 1e26d7f38c | |||
| 64f9f4d4b9 | |||
| 89c06f714f | |||
| 157d116626 | |||
| de229ddde5 | |||
| 8b456f66ef | |||
| 2e35e35a6e | |||
| cca078f017 | |||
| f658a30132 | |||
| 0a827d2404 | |||
| 806adee3de | |||
| bdd108065b | |||
| 8d41c5475c | |||
| 99ad461a82 | |||
| 9da56b4226 | |||
| beeca529cd | |||
| ebb765ae82 | |||
| 65e391f6f7 | |||
| ab45d92bd1 | |||
| a366c95941 | |||
| f2d9eb003c | |||
| bb1a99912c | |||
| fd30e52741 | |||
| 58a0b6150f | |||
| 9aa053beb6 | |||
| 7eb084efaa | |||
| 1568377725 | |||
| 7b32cfe235 | |||
| 7ef3efafd3 | |||
| ffdd79c497 | |||
| b156da7ded | |||
| 9278954f2f | |||
| 4324ebe855 | |||
| 4a69dca5cc | |||
| 2cc54b4002 | |||
| eac0aebd59 | |||
| 172dcfb6d8 | |||
| d320d83c22 | |||
| af2dd004e4 | |||
| dfbace76db | |||
| 119f762492 | |||
| e586c442c1 | |||
| c01e87ee8b | |||
| af4025d948 | |||
| b7c2b7a0d5 | |||
| f073a93d47 | |||
| 47914838f5 | |||
| 69e2630d77 | |||
| 08148c058c | |||
| a7ee8f553b | |||
| 8395bb80f1 | |||
| becd3cbf65 | |||
| 80ec681a2c | |||
| 96a80ce1b6 | |||
| f18cf5c8a6 | |||
| 4c21159553 | |||
| 475c0a9b09 | |||
| f80ad61179 | |||
| 10ccfb1086 | |||
| 44197fd83c | |||
| 0d9e03f848 | |||
| 810812d06b | |||
| 539d7f6e79 | |||
| 3358d9e943 | |||
| eeffd9b357 | |||
| b33f41200e | |||
| 030d1110b9 | |||
| 09af8084b9 | |||
| 0cff9524c2 | |||
| f6299f5b97 | |||
| b1250ae4e4 | |||
| a9144471b1 | |||
| 9f924da18b | |||
| aac92f1760 | |||
| fdf42bd913 | |||
| ecee2f2e8c | |||
| 1b487fdbb6 | |||
| bb7bd6d71b | |||
| 34178906a3 | |||
| c689722459 | |||
| 8e4ff8c67f | |||
| 4ff22d1d20 | |||
| 5ed7712aed | |||
| a6fcb5ea00 | |||
| 8f402c8c03 | |||
| 5761e313fd | |||
| 441771839a | |||
| ad6700974f | |||
| 499aec2c61 | |||
| ceed4c641a | |||
| 669c0b4cd7 | |||
| 7964de1045 | |||
| 961e2915b4 | |||
| 6c6a64fa98 | |||
| 7a8a751bca | |||
| 69bf6ef8cd | |||
| 05e542215d | |||
| 868eaab5ed | |||
| e7d22717cd | |||
| bbabf814e1 | |||
| 938fcb1352 | |||
| 42a71396cd | |||
| 9ec95b974f | |||
| 49ea9e50cf | |||
| 456edce9fc | |||
| 537512ed5d | |||
| d0efd08a84 | |||
| bb7ba9a6df | |||
| 09695d97db | |||
| 4fe4835c29 | |||
| 86435a3563 | |||
| bc84c7537b | |||
| 29736f9c8f | |||
| 99a9cd297c | |||
| e86749febd | |||
| 4b86fbb12c | |||
| 4c342c9b9a | |||
| d2e0b7b95c | |||
| 53fe763764 | |||
| 86d7233aa4 | |||
| d19ea0968a | |||
| 7eb49446c1 | |||
| 01a88c85a6 | |||
| 5492374f2c | |||
| 9ca00be694 | |||
| 23d9807fe3 | |||
| 8a3e3ae866 | |||
| 117646cda4 | |||
| 6cf502c4bb | |||
| 1bb99127c4 | |||
| 8aeccd35c9 | |||
| c90b94d1ec | |||
| 031fd24842 | |||
| e1c07deb52 | |||
| 5f10c24f03 | |||
| f643caacbe | |||
| cb5ab26924 | |||
| 94c9e92553 | |||
| 507638594d | |||
| e72c4886e8 | |||
| 5ba11a6238 | |||
| 2fc7671051 | |||
| d142097b0f | |||
| 4330bb3ecd | |||
| 2e1dd27332 | |||
| 4f08d7286e | |||
| 7f8fb13552 | |||
| 93e0d119b0 | |||
| a9bc44f19b | |||
| 83bc09f34b | |||
| 4386e1c828 | |||
| 72b2e54331 | |||
| e912c24025 | |||
| c9c1f6ba1c | |||
| abda30fc25 | |||
| 62c188c5c7 | |||
| 67f7b6f3f8 | |||
| f04ccb9403 | |||
| b71bb60669 | |||
| 5eab1ad1c0 | |||
| f96d0caf3c | |||
| 3e6655a199 | |||
| 386cdc8c18 | |||
| 63b40c27a5 | |||
| 6985dffda4 | |||
| 88e16448a8 | |||
| 4cb428e993 | |||
| af9945f9db | |||
| f0594fb1b2 | |||
| a155bc0308 | |||
| dce7444483 | |||
| 76eed79b0a | |||
| f73ed17c05 | |||
| b049d21aff | |||
| f6cce5ee1f | |||
| 8038c2ebe2 | |||
| 9f51b9af57 | |||
| cbc75bf9d7 | |||
| 0ecfa546cd | |||
| b89fb0803d | |||
| 11005d58a7 | |||
| b0c6239314 | |||
| 67f66155e9 | |||
| 7fbae12e99 | |||
| 65580c0a47 | |||
| 236afe4cc6 | |||
| c23a6af28f | |||
| 2535106d2c | |||
| d8379ae5a9 | |||
| 9f13f5fc5d | |||
| 884cb30ebd | |||
| 30488e5da6 | |||
| b7e798a950 | |||
| e999ca3f68 | |||
| 039638c0d8 | |||
| f282504896 | |||
| 0062936ac6 | |||
| 19c41daa86 | |||
| d860b16cfd | |||
| e3b42a8ad9 | |||
| 20bd7a82af | |||
| e607eb8220 | |||
| 38ca49d1a5 | |||
| a21bdfe031 | |||
| f95832b87c | |||
| feff9b3540 | |||
| 78118aa08c | |||
| 3539372437 | |||
| 7c498625bd | |||
| e379016123 | |||
| afa68b840c | |||
| 1926deb7f9 | |||
| 25c1f34c23 | |||
| d0e04e53ad | |||
| e475fb5cc9 | |||
| f72f632cd8 | |||
| 02ea27fc6f | |||
| 5d338bb87c | |||
| f9f08c2886 | |||
| dcc139043d | |||
| 520219404c | |||
| f97991f00d | |||
| 7b7e1c5337 | |||
| 6e66659940 | |||
| 3d83baed78 | |||
| 049b27da96 | |||
| 6bcbe0f633 | |||
| 8c44e39275 | |||
| e36ab1f5d2 | |||
| 865c775f41 | |||
| 198778ba2d | |||
| 215aabdc5f | |||
| 8d92c8be37 | |||
| 93b3ce07f0 | |||
| f9b7c8b851 | |||
| b3cf72abdc | |||
| 65fddd06a9 | |||
| 41f4a8ff58 | |||
| a13d5018b9 | |||
| 2ac3ce5bc8 | |||
| 85514987e7 | |||
| c9eb07b5ba | |||
| 7201b61498 | |||
| 55b3161900 | |||
| 9d5c4424a1 | |||
| d507ba2339 | |||
| 4ec5103454 | |||
| 3e09cd415e | |||
| 1098265145 | |||
| df7a106237 | |||
| 00b38970a1 | |||
| c1004e5817 | |||
| 13e9738345 | |||
| 1a7c1e2544 | |||
| ff082487b5 | |||
| 14cac0d892 | |||
| a8347e0b53 | |||
| a73c3453ea | |||
| a64932b2c9 | |||
| 685297171c | |||
| 2e3e403165 | |||
| fbd910ef50 | |||
| 30129d161f | |||
| a6510af56d | |||
| 9830920635 | |||
| 93025b72cd | |||
| 22639baa4c | |||
| 1aba8dfb11 | |||
| 8b4eb96262 | |||
| cafe6cd2fe | |||
| da6140f6f4 | |||
| 3fc68ce2ff | |||
| 5e8927245b | |||
| 75de1b3ae8 | |||
| 6743114d19 | |||
| 28cca67cb3 | |||
| bad7c6e798 | |||
| ecd3b38d3a | |||
| 8f09f16603 | |||
| 80812cb402 | |||
| 66fbf7aee6 | |||
| a92c603ab2 | |||
| 365438370d | |||
| a40b8fc915 | |||
| 5d92c1c86d | |||
| c526fd8847 | |||
| cd767dc68c | |||
| e21ebc75ee | |||
| 931eaaae4a | |||
| 4d487e6bf0 | |||
| 6c45a6573a | |||
| 45b0dda7d9 | |||
| caf3bc7470 | |||
| 5259b801f7 | |||
| 77e6d0db75 | |||
| b2d7e5ec1e | |||
| 15bc99d216 | |||
| 63c6e2abd7 | |||
| 8ab97a1b36 | |||
| d1aa581879 | |||
| 5f56143c5e | |||
| 1a2b558ac3 | |||
| 4f4ff74bf1 | |||
| ded3b08080 | |||
| 14a29c8612 | |||
| e66e430d30 | |||
| c833f560c1 | |||
| 454c721842 | |||
| 26eda324dc | |||
| 16951d36a2 | |||
| e1d36125d2 | |||
| 7a3c259d2f | |||
| aa5fb2a2c5 | |||
| a92cc6506c | |||
| 3971548142 | |||
| d94de771bf | |||
| c5f47ffcd4 | |||
| b336235ad7 | |||
| eea07309aa | |||
| 5529170036 | |||
| 3d745e93b6 | |||
| 019082bec7 | |||
| 855cceea70 | |||
| 487eae85e1 | |||
| 5d188e61c0 | |||
| 546c335198 | |||
| aaecc5eda2 | |||
| d13e939ddd | |||
| afea79474e | |||
| 05f555b5b5 | |||
| 85931b6dc2 | |||
| 9f0c7f6a76 | |||
| 022c06c803 | |||
| 1b72e7d6b7 | |||
| 666ac6df5b | |||
| 36481a53d9 | |||
| 5a9901d775 | |||
| b3a24d0158 | |||
| 8890826070 | |||
| daa84a1fef | |||
| a4bd47f001 | |||
| d031f1be01 | |||
| a48abc59ce | |||
| 878f05c323 | |||
| d462711d25 | |||
| 40a0120a28 | |||
| ac812eaeae | |||
| 9965223d9b | |||
| 08b99d0d3a | |||
| 519a6a2b1e | |||
| 524f5d470b | |||
| 6631c6a5d7 | |||
| 10f95fb0d9 | |||
| a315366026 | |||
| 1901c9a679 | |||
| 415ad5402f | |||
| 9a40e12dbc | |||
| a1af663796 | |||
| 78b7ddb32a | |||
| 5e5ee4fed1 | |||
| 84c022a39b | |||
| 300741b05a | |||
| dc685a01c6 | |||
| 752f897a34 | |||
| 722cb6b1fd | |||
| 50c095cd09 | |||
| c23546eb46 | |||
| 36340c4e52 | |||
| a7ab38f40c | |||
| 0901c03b74 | |||
| 50817352c1 | |||
| ee4a7447bc | |||
| a6d3c827ad | |||
| d4ea31b91f | |||
| 210faaec6d | |||
| 16be9b9dae | |||
| 2b8f709182 | |||
| aec22d8563 | |||
| 1996d042f0 | |||
| 27b6665717 | |||
| ce20045611 | |||
| 277f8bfd69 | |||
| 1da2db856f | |||
| 33dfe1389c | |||
| 013b69405a | |||
| ca07a53835 | |||
| bbdb6ae1f6 | |||
| 4a63222318 | |||
| 1a1c552964 | |||
| 3587dc2d75 | |||
| 96eb9a3ad0 | |||
| eaa70f43c0 | |||
| a426b773d3 | |||
| 84841edda9 | |||
| d416dbe47b | |||
| 7052da7e54 | |||
| 8f2a2f0ba6 | |||
| d575ba663d | |||
| 964fe7f335 | |||
| d3e92d6576 | |||
| 9dbd6069f1 | |||
| 7ae25c9a1b | |||
| 689969a005 | |||
| b270e1ac8d | |||
| 95d38cea44 | |||
| 3ed0765fe5 | |||
| 0c90164c24 | |||
| a45fa39afc | |||
| 8959f5e1c5 | |||
| df338ab00e | |||
| ac7a2452d6 | |||
| 80104e6d07 | |||
| 8f394cd01d | |||
| e5a32c83c5 | |||
| 8dce20e69f | |||
| 3428a06bb8 | |||
| 177f9a1ff6 | |||
| 9d93944dd1 | |||
| a4cba1a352 | |||
| 17b4232d80 | |||
| 2eb58eb719 | |||
| db5a4195ad | |||
| 3fb29f8e2b | |||
| dacdb2cf35 | |||
| c8473cbe03 | |||
| e9edf8a7ea | |||
| 5a73aa3d90 | |||
| 04101c1c3e | |||
| 0c9343f24d | |||
| b71710871c | |||
| f6df6db17b | |||
| 3f8b3bc6cb | |||
| 383ef27128 | |||
| d8189768ae | |||
| a5eb2fce75 | |||
| 1fe242a284 | |||
| a4b83ca9a0 | |||
| 2365b26c1c | |||
| 8fb044f71b | |||
| 5ce42475c4 | |||
| 57b9d31fff | |||
| 7671586cb0 | |||
| a1997e31a8 | |||
| f5478e9f64 | |||
| 06abea3576 | |||
| ae6b584a5f | |||
| 9e27c69906 | |||
| 00afe27900 | |||
| 4e5c1a32d3 | |||
| d4f5043a25 | |||
| 03a5a55974 | |||
| dbab4c1212 | |||
| d186a96796 | |||
| 6880d014c3 | |||
| 6542dec358 | |||
| 1a2738c3a9 | |||
| 12118ff125 | |||
| c3a00186ff | |||
| fafa777e98 | |||
| d4da99f61c | |||
| bb293c0c02 | |||
| 1e29971b3c | |||
| 25d70cca4f | |||
| 362832a196 | |||
| ed150a5ccd | |||
| d2247b66f1 | |||
| 3b58ea716c | |||
| 368e548e46 | |||
| 6f3612d196 | |||
| 0f38146fcc | |||
| 1a13f3f096 | |||
| 9cc102ca2a | |||
| 50ff4b89bf | |||
| 9b898825ab | |||
| 5be9033c40 | |||
| 67e55ab0a0 | |||
| 227549bf22 | |||
| 19707d10a3 | |||
| 91565ced89 | |||
| 2383b00c8c | |||
| 405063f036 | |||
| d2f3c6a879 | |||
| 4f759c1bd2 | |||
| 9d7f9ce7b3 | |||
| 56f3dfce92 | |||
| 9a66f18edb | |||
| d7270ffb84 | |||
| dd834a3104 | |||
| e28ed1b882 | |||
| 2370123c72 | |||
| 8a5133f04b | |||
| a0f874b319 | |||
| 415d11ae33 | |||
| f93b1ce30e | |||
| 9fb2e4ff1b | |||
| 601d0f4324 | |||
| cbf7db3347 | |||
| 217be1d234 | |||
| 7fabd6554d | |||
| d673819796 | |||
| a963a331a2 | |||
| eda5b8995f | |||
| d5e95eedf3 | |||
| 032e703704 | |||
| ad1444f5ba | |||
| a4b30b8620 | |||
| 9c002c7bff | |||
| 90495a27d9 | |||
| 1246fa699a | |||
| 511d37f5e0 | |||
| 7a03a0eaa9 | |||
| 2f57cb613e | |||
| e386c3078a | |||
| 3802889834 | |||
| f825b2baba | |||
| 6c92abd083 | |||
| c652379a5f | |||
| 61d34ab4ad | |||
| d511641410 | |||
| c8430625bf | |||
| a418224bbb | |||
| 9e3c13dea3 | |||
| 335850f7ff | |||
| f6baf8fe83 | |||
| 4c9b82b649 | |||
| f2570992e5 | |||
| 6911d6314d | |||
| eaeea9730c | |||
| fb0790a733 | |||
| 3230cd53e1 | |||
| edbce067b8 | |||
| 83877e5107 | |||
| 3a67540212 | |||
| 1a5db96023 | |||
| ef82f9ab5b | |||
| bf7e5c6333 | |||
| 443f0f5450 | |||
| cb1dccd630 | |||
| 2e558acbee | |||
| 74162ea54c | |||
| ccbe4fba04 | |||
| 5aeddb6166 | |||
| 49df5203ae | |||
| 0cfe801d18 | |||
| 89c01e8244 | |||
| 6605e4dd61 | |||
| d6239de6fd | |||
| 99ad6f3712 | |||
| f3041e7549 | |||
| 1269031be3 | |||
| ce96274f28 | |||
| a9a9bd0a3d | |||
| 33789adadc | |||
| 15b50a75c4 | |||
| ead34dbb1f | |||
| a9b1356efa | |||
| 33e105bc7b | |||
| e5041147f4 | |||
| 576e627ad1 | |||
| 4059664354 | |||
| 974c0ca7e8 | |||
| 8e7a7b8b6d | |||
| 1e3b1db905 | |||
| 51c98746c4 | |||
| 4c21439847 | |||
| 31385ee533 | |||
| bd4e34e0e1 | |||
| 9f591b166b | |||
| 7e457fa17b | |||
| 926b9d2bae | |||
| c5822b5acf | |||
| 516b66a50a | |||
| 39305d63c7 | |||
| c0cb856961 | |||
| 2fb97a676f | |||
| cbff151dc3 | |||
| eed75fd2fd | |||
| 6374390b34 | |||
| 2185d3ef7c | |||
| 4aaa96e36c | |||
| bf86680547 | |||
| 960307e262 | |||
| eedf96cc31 | |||
| 6fb5fce4d3 | |||
| 7688d21fe6 | |||
| 23e60b36b4 | |||
| ab8fc8e0a0 | |||
| b30f04046d | |||
| 9bd03c7d43 | |||
| 78118a1ac1 | |||
| 1f863d0cce | |||
| c49204aeeb | |||
| b1de3755fd | |||
| 83a1cc5aba | |||
| 9b0b15c31e | |||
| 802651d2d4 | |||
| 52a48e5618 | |||
| 14fe248e19 | |||
| 5b81be371e | |||
| 82d67f2850 | |||
| 1c342bd566 | |||
| bb8ad3c971 | |||
| e9fef85b72 | |||
| c0d1a4f274 | |||
| 94be3335a0 | |||
| 7d03f78546 | |||
| 023f933d0b | |||
| 9995cc01b7 | |||
| fd03b263d1 | |||
| 6a09a3fd44 | |||
| 1322f8610c | |||
| 90ab6175b5 | |||
| 2e3e9ee882 | |||
| 5158329785 | |||
| b8e0165da2 | |||
| 0fa6ebc136 | |||
| 4e5e362197 | |||
| 61514fef2b | |||
| 59e593ab0d | |||
| 2c6ea98ef9 | |||
| bd3ea16b57 | |||
| 45165332f6 | |||
| d764a66e55 | |||
| ac41e64429 | |||
| 462beb30b3 | |||
| 3a89e9c087 | |||
| e71863cbd2 | |||
| 5ec0ff0598 | |||
| 2ca9b77cfb | |||
| 4f535ef5fe | |||
| a46ad71bb0 | |||
| 90d6911d41 | |||
| e13ebae0df | |||
| 3e15fc8206 | |||
| 6a400467dd | |||
| 488188e9c3 | |||
| 0d31bc4280 | |||
| 6375b4431c | |||
| 683422f8a4 | |||
| e4dbad2669 | |||
| 34721fdee8 | |||
| f27668552c | |||
| 306fdf4235 | |||
| 553b09d827 | |||
| 8ee17f0c64 | |||
| 7e5ad644d3 | |||
| 846b8a7cde | |||
| f27a4f174b | |||
| c6d4375aa8 | |||
| b9ec54c76a | |||
| b351d7c1ae | |||
| 729ebe7cd0 | |||
| f51c28e708 | |||
| 9fbf55127d | |||
| f9fd61dc6b | |||
| 4f198e1f53 | |||
| 24c85a5140 | |||
| 3e1a5f4ccd | |||
| 34e5a3878c | |||
| 663e285091 | |||
| d87c03bb79 | |||
| abc57688d3 | |||
| 29671d56fc | |||
| e8cf6a722b | |||
| 2793ec331b | |||
| 1a0b91b068 | |||
| bec6cbe6e6 | |||
| f7ab10ff07 | |||
| 9671cbdc1a | |||
| e0af1f5932 | |||
| 8cb52c6142 | |||
| e5133211a9 | |||
| 8548612a80 | |||
| 41c3193275 | |||
| 15771d2802 | |||
| b4a62e5f3e | |||
| fc7e6735a1 | |||
| aeb21c328e | |||
| 9a34b13c2e | |||
| 231feef7fe | |||
| 0e6b68139f | |||
| ef62c2bb39 | |||
| 8f68997f3c | |||
| aebe2698c3 | |||
| 54e7a8fc7f | |||
| 8b4d37c53c | |||
| fbfca46d2f | |||
| 3228f473de | |||
| 17fcf0ee40 | |||
| 395fe31e02 | |||
| e98f9cf1f7 | |||
| fe0c0f97a5 | |||
| 7e27838818 | |||
| bc8094c20c | |||
| 3649c629b7 | |||
| 1c31070fc8 | |||
| bff41967db | |||
| d3692d0fb7 | |||
| 074a799d01 | |||
| 36ffd08a72 | |||
| 58f828b3cd |
@@ -0,0 +1,150 @@
|
||||
package engine.Dungeons;
|
||||
|
||||
import engine.Enum;
|
||||
import engine.InterestManagement.WorldGrid;
|
||||
import engine.gameManager.BuildingManager;
|
||||
import engine.gameManager.PowersManager;
|
||||
import engine.gameManager.ZoneManager;
|
||||
import engine.math.Vector3fImmutable;
|
||||
import engine.net.ByteBufferWriter;
|
||||
import engine.objects.*;
|
||||
import engine.powers.EffectsBase;
|
||||
import engine.server.MBServerStatics;
|
||||
import org.pmw.tinylog.Logger;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
|
||||
public class Dungeon {
|
||||
|
||||
public static int NoFlyEffectID = -1733819072;
|
||||
public static int NoTeleportEffectID = -1971545187;
|
||||
public static int NoSummonEffectID = 2122002462;
|
||||
public ArrayList<PlayerCharacter> participants;
|
||||
public int maxPerGuild;
|
||||
public Vector3fImmutable entrance;
|
||||
public ArrayList<Mob> dungeon_mobs;
|
||||
public Long respawnTime = 0L;
|
||||
|
||||
public Dungeon(Vector3fImmutable entrance, int maxCount){
|
||||
this.participants = new ArrayList<>();
|
||||
this.entrance = entrance;
|
||||
this.dungeon_mobs = new ArrayList<>();
|
||||
this.maxPerGuild = maxCount;
|
||||
}
|
||||
public void applyDungeonEffects(PlayerCharacter player){
|
||||
EffectsBase noFly = PowersManager.getEffectByToken(NoFlyEffectID);
|
||||
EffectsBase noTele = PowersManager.getEffectByToken(NoTeleportEffectID);
|
||||
EffectsBase noSum = PowersManager.getEffectByToken(NoSummonEffectID);
|
||||
|
||||
if(noFly != null)
|
||||
player.addEffectNoTimer(noFly.getName(),noFly,40,true);
|
||||
|
||||
if(noTele != null)
|
||||
player.addEffectNoTimer(noTele.getName(),noTele,40,true);
|
||||
|
||||
if(noSum != null)
|
||||
player.addEffectNoTimer(noSum.getName(),noSum,40,true);
|
||||
}
|
||||
|
||||
public void removeDungeonEffects(PlayerCharacter player) {
|
||||
EffectsBase noFly = PowersManager.getEffectByToken(NoFlyEffectID);
|
||||
EffectsBase noTele = PowersManager.getEffectByToken(NoTeleportEffectID);
|
||||
EffectsBase noSum = PowersManager.getEffectByToken(NoSummonEffectID);
|
||||
for (Effect eff : player.effects.values()) {
|
||||
if (noFly != null && eff.getEffectsBase().equals(noFly))
|
||||
eff.endEffect();
|
||||
|
||||
if (noTele != null && eff.getEffectsBase().equals(noTele))
|
||||
eff.endEffect();
|
||||
|
||||
if (noSum != null && eff.getEffectsBase().equals(noSum))
|
||||
eff.endEffect();
|
||||
}
|
||||
}
|
||||
|
||||
public static void serializeForClientMsgTeleport(ByteBufferWriter writer) {
|
||||
Guild rulingGuild = Guild.getErrantGuild();
|
||||
Guild rulingNation = Guild.getErrantGuild();
|
||||
|
||||
Zone zone = ZoneManager.getZoneByUUID(994);
|
||||
// Begin Serialzing soverign guild data
|
||||
writer.putInt(Enum.GameObjectType.Zone.ordinal());
|
||||
writer.putInt(994);
|
||||
writer.putString("Whitehorn Citadel");
|
||||
writer.putInt(rulingGuild.getObjectType().ordinal());
|
||||
writer.putInt(rulingGuild.getObjectUUID());
|
||||
|
||||
writer.putString("Whitehorn Militants"); // guild name
|
||||
writer.putString("In the Citadel, We Fight!"); // motto
|
||||
writer.putString(rulingGuild.getLeadershipType());
|
||||
|
||||
// Serialize guild ruler's name
|
||||
// If tree is abandoned blank out the name
|
||||
// to allow them a rename.
|
||||
|
||||
writer.putString("Kol'roth The Destroyer");//sovreign
|
||||
|
||||
writer.putInt(rulingGuild.getCharter());
|
||||
writer.putInt(0); // always 00000000
|
||||
|
||||
writer.put((byte)0);
|
||||
|
||||
writer.put((byte) 1);
|
||||
writer.put((byte) 1); // *** Refactor: What are these flags?
|
||||
writer.put((byte) 1);
|
||||
writer.put((byte) 1);
|
||||
writer.put((byte) 1);
|
||||
|
||||
GuildTag._serializeForDisplay(rulingGuild.getGuildTag(), writer);
|
||||
GuildTag._serializeForDisplay(rulingNation.getGuildTag(), writer);
|
||||
|
||||
writer.putInt(0);// TODO Implement description text
|
||||
|
||||
writer.put((byte) 1);
|
||||
writer.put((byte) 0);
|
||||
writer.put((byte) 1);
|
||||
|
||||
// Begin serializing nation guild info
|
||||
|
||||
if (rulingNation.isEmptyGuild()) {
|
||||
writer.putInt(rulingGuild.getObjectType().ordinal());
|
||||
writer.putInt(rulingGuild.getObjectUUID());
|
||||
} else {
|
||||
writer.putInt(rulingNation.getObjectType().ordinal());
|
||||
writer.putInt(rulingNation.getObjectUUID());
|
||||
}
|
||||
|
||||
|
||||
// Serialize nation name
|
||||
|
||||
writer.putString("Whitehorn Militants"); //nation name
|
||||
|
||||
writer.putInt(-1);//city rank, -1 puts it at top of list always
|
||||
|
||||
writer.putInt(0xFFFFFFFF);
|
||||
|
||||
writer.putInt(0);
|
||||
|
||||
writer.putString("Kol'roth The Destroyer");//nation ruler
|
||||
|
||||
writer.putLocalDateTime(LocalDateTime.now());
|
||||
|
||||
//location
|
||||
Vector3fImmutable loc = Vector3fImmutable.getRandomPointOnCircle(BuildingManager.getBuilding(2827951).loc,30f);
|
||||
|
||||
writer.putFloat(loc.x);
|
||||
writer.putFloat(loc.y);
|
||||
writer.putFloat(loc.z);
|
||||
|
||||
writer.putInt(0);
|
||||
|
||||
writer.put((byte) 1);
|
||||
writer.put((byte) 0);
|
||||
writer.putInt(0x64);
|
||||
writer.put((byte) 0);
|
||||
writer.put((byte) 0);
|
||||
writer.put((byte) 0);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,105 @@
|
||||
package engine.Dungeons;
|
||||
|
||||
import engine.Enum;
|
||||
import engine.InterestManagement.WorldGrid;
|
||||
import engine.gameManager.DbManager;
|
||||
import engine.gameManager.ZoneManager;
|
||||
import engine.math.Vector3fImmutable;
|
||||
import engine.objects.*;
|
||||
import engine.powers.EffectsBase;
|
||||
import engine.server.MBServerStatics;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
|
||||
public class DungeonManager {
|
||||
public static ArrayList<Dungeon> dungeons;
|
||||
|
||||
private static final float dungeonAiRange = 64f;
|
||||
private static final float maxTravel = 64f;
|
||||
|
||||
public static void joinDungeon(PlayerCharacter pc, Dungeon dungeon){
|
||||
if(requestEnter(pc,dungeon)) {
|
||||
dungeon.participants.add(pc);
|
||||
dungeon.applyDungeonEffects(pc);
|
||||
translocateToDungeon(pc, dungeon);
|
||||
}
|
||||
}
|
||||
|
||||
public static void leaveDungeon(PlayerCharacter pc, Dungeon dungeon){
|
||||
dungeon.participants.remove(pc);
|
||||
dungeon.removeDungeonEffects(pc);
|
||||
translocateOutOfDungeon(pc);
|
||||
}
|
||||
|
||||
public static boolean requestEnter(PlayerCharacter pc, Dungeon dungeon){
|
||||
int current = 0;
|
||||
Guild nation = pc.guild.getNation();
|
||||
|
||||
if(nation == null)
|
||||
return false;
|
||||
|
||||
for(PlayerCharacter participant : dungeon.participants){
|
||||
if(participant.guild.getNation().equals(nation)){
|
||||
current ++;
|
||||
}
|
||||
}
|
||||
|
||||
if(current >= dungeon.maxPerGuild)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public static void translocateToDungeon(PlayerCharacter pc, Dungeon dungeon){
|
||||
pc.teleport(dungeon.entrance);
|
||||
pc.setSafeMode();
|
||||
}
|
||||
|
||||
public static void translocateOutOfDungeon(PlayerCharacter pc){
|
||||
pc.teleport(pc.bindLoc);
|
||||
pc.setSafeMode();
|
||||
}
|
||||
|
||||
public static void pulse_dungeons(){
|
||||
for(Dungeon dungeon : dungeons){
|
||||
|
||||
//early exit, if no players present don't waste resources
|
||||
if(dungeon.participants.isEmpty())
|
||||
continue;
|
||||
|
||||
if(dungeon.respawnTime > 0 && System.currentTimeMillis() > dungeon.respawnTime){
|
||||
respawnMobs(dungeon);
|
||||
}
|
||||
|
||||
//remove any players that have left
|
||||
HashSet<AbstractWorldObject> obj = WorldGrid.getObjectsInRangePartial(dungeon.entrance,4096f,MBServerStatics.MASK_PLAYER);
|
||||
for(PlayerCharacter player : dungeon.participants)
|
||||
if(!obj.contains(player))
|
||||
leaveDungeon(player,dungeon);
|
||||
|
||||
//cycle dungeon mob AI
|
||||
for(Mob mob : dungeon.dungeon_mobs)
|
||||
dungeonMobAI(mob);
|
||||
}
|
||||
}
|
||||
|
||||
public static void dungeonMobAI(Mob mob){
|
||||
|
||||
}
|
||||
|
||||
public static void respawnMobs(Dungeon dungeon){
|
||||
for(Mob mob : dungeon.dungeon_mobs){
|
||||
|
||||
if(!mob.isAlive() && mob.despawned)
|
||||
mob.respawn();
|
||||
|
||||
if(!mob.isAlive() && !mob.despawned){
|
||||
mob.despawn();
|
||||
mob.respawn();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
+43
-27
@@ -9,15 +9,13 @@
|
||||
package engine;
|
||||
|
||||
import ch.claude_martin.enumbitset.EnumBitSetHelper;
|
||||
import engine.gameManager.BuildingManager;
|
||||
import engine.gameManager.ConfigManager;
|
||||
import engine.gameManager.PowersManager;
|
||||
import engine.gameManager.ZoneManager;
|
||||
import engine.math.Vector2f;
|
||||
import engine.math.Vector3fImmutable;
|
||||
import engine.objects.AbstractCharacter;
|
||||
import engine.objects.ItemBase;
|
||||
import engine.objects.Shrine;
|
||||
import engine.objects.Zone;
|
||||
import engine.objects.*;
|
||||
import engine.powers.EffectsBase;
|
||||
import org.pmw.tinylog.Logger;
|
||||
|
||||
@@ -139,8 +137,8 @@ public class Enum {
|
||||
HALFGIANTMALE(2010, MonsterType.HalfGiant, RunSpeed.STANDARD, CharacterSex.MALE, 1.15f),
|
||||
HUMANMALE(2011, MonsterType.Human, RunSpeed.STANDARD, CharacterSex.MALE, 1),
|
||||
HUMANFEMALE(2012, MonsterType.Human, RunSpeed.STANDARD, CharacterSex.FEMALE, 1),
|
||||
IREKEIMALE(2013, MonsterType.Irekei, RunSpeed.STANDARD, CharacterSex.MALE, 1.1f),
|
||||
IREKEIFEMALE(2014, MonsterType.Irekei, RunSpeed.STANDARD, CharacterSex.FEMALE, 1.1f),
|
||||
IREKEIMALE(2013, MonsterType.Irekei, RunSpeed.IREKEI, CharacterSex.MALE, 1.1f),
|
||||
IREKEIFEMALE(2014, MonsterType.Irekei, RunSpeed.IREKEI, CharacterSex.FEMALE, 1.1f),
|
||||
SHADEMALE(2015, MonsterType.Shade, RunSpeed.STANDARD, CharacterSex.MALE, 1),
|
||||
SHADEFEMALE(2016, MonsterType.Shade, RunSpeed.STANDARD, CharacterSex.FEMALE, 1),
|
||||
MINOMALE(2017, MonsterType.Minotaur, RunSpeed.MINOTAUR, CharacterSex.MALE, 1.3f),
|
||||
@@ -152,7 +150,8 @@ public class Enum {
|
||||
NEPHFEMALE(2026, MonsterType.Nephilim, RunSpeed.STANDARD, CharacterSex.FEMALE, 1.1f),
|
||||
HALFGIANTFEMALE(2027, MonsterType.HalfGiant, RunSpeed.STANDARD, CharacterSex.FEMALE, 1.15f),
|
||||
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,1);
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private static HashMap<Integer, RaceType> _raceTypeByID = new HashMap<>();
|
||||
@@ -208,8 +207,8 @@ public class Enum {
|
||||
SENTINEL(0, 0, 0, 0, 0, 0, 0),
|
||||
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),
|
||||
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),
|
||||
IREKEI(6.499500105f, 14.6685f, 4.2199998f, 14.6685f, 6.3299999f, 18.379999f, 6.5f);
|
||||
private float walkStandard;
|
||||
private float walkCombat;
|
||||
private float runStandard;
|
||||
@@ -469,11 +468,14 @@ public class Enum {
|
||||
|
||||
// 14001 does not have a banestone to bind at
|
||||
|
||||
if (ruinZone.getLoadNum() == 14001)
|
||||
if (ruinZone.getLoadNum() == 14001) {
|
||||
spawnLocation = Vector3fImmutable.getRandomPointOnCircle(ruinZone.getLoc(), 30);
|
||||
else
|
||||
spawnLocation = Vector3fImmutable.getRandomPointOnCircle(ruinZone.getLoc()
|
||||
.add(new Vector3fImmutable(-196.016f, 2.812f, 203.621f)), 30);
|
||||
}else {
|
||||
//spawnLocation = Vector3fImmutable.getRandomPointOnCircle(ruinZone.getLoc()
|
||||
//.add(new Vector3fImmutable(-196.016f, 2.812f, 203.621f)), 30);
|
||||
spawnLocation = Vector3fImmutable.getRandomPointOnCircle(BuildingManager.getBuilding(27977).loc,30f);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -776,6 +778,7 @@ public class Enum {
|
||||
Combat,
|
||||
Spires,
|
||||
Snare,
|
||||
Snared,
|
||||
Stun,
|
||||
Blind,
|
||||
Root,
|
||||
@@ -878,6 +881,7 @@ public class Enum {
|
||||
Siege,
|
||||
Slash,
|
||||
Snare,
|
||||
Snared,
|
||||
Sorcery,
|
||||
Spear,
|
||||
SpearMastery,
|
||||
@@ -957,6 +961,17 @@ public class Enum {
|
||||
Wizardry;
|
||||
|
||||
public static SourceType GetSourceType(String modName) {
|
||||
switch(modName){
|
||||
case "Slashing":
|
||||
modName = "Slash";
|
||||
break;
|
||||
case "Crushing":
|
||||
modName = "Crush";
|
||||
break;
|
||||
case "Piercing":
|
||||
modName = "Pierce";
|
||||
break;
|
||||
}
|
||||
SourceType returnMod;
|
||||
if (modName.isEmpty())
|
||||
return SourceType.None;
|
||||
@@ -964,8 +979,8 @@ public class Enum {
|
||||
try {
|
||||
returnMod = SourceType.valueOf(modName.replace(",", ""));
|
||||
} catch (Exception e) {
|
||||
Logger.error(modName);
|
||||
Logger.error(e);
|
||||
//Logger.error(modName);
|
||||
//Logger.error(e);
|
||||
return SourceType.None;
|
||||
}
|
||||
return returnMod;
|
||||
@@ -1016,6 +1031,7 @@ public class Enum {
|
||||
Silence,
|
||||
Slash,
|
||||
Snare,
|
||||
Snared,
|
||||
Stance,
|
||||
Stun,
|
||||
Summon,
|
||||
@@ -1140,6 +1156,7 @@ public class Enum {
|
||||
SkillDebuff,
|
||||
SlashResistanceDebuff,
|
||||
Snare,
|
||||
Snared,
|
||||
StackableAttrCONBuff,
|
||||
StackableAttrDEXBuff,
|
||||
StackableAttrSTRBuff,
|
||||
@@ -2306,9 +2323,9 @@ public class Enum {
|
||||
|
||||
public enum CityBoundsType {
|
||||
|
||||
GRID(640),
|
||||
ZONE(875),
|
||||
PLACEMENT(876);
|
||||
GRID(544),
|
||||
ZONE(672),
|
||||
PLACEMENT(673);
|
||||
|
||||
public final float extents;
|
||||
|
||||
@@ -2822,6 +2839,7 @@ public class Enum {
|
||||
|
||||
public enum MobBehaviourType {
|
||||
None(null, false, false, false, false, false),
|
||||
//Power
|
||||
Power(null, false, true, true, true, false),
|
||||
PowerHelpee(Power, false, true, true, false, true),
|
||||
PowerHelpeeWimpy(Power, true, false, true, false, false),
|
||||
@@ -2846,7 +2864,6 @@ public class Enum {
|
||||
//Independent Types
|
||||
SimpleStandingGuard(null, false, false, false, false, false),
|
||||
Pet1(null, false, false, true, false, false),
|
||||
SiegeEngine(null, false, false, false, false, false),
|
||||
Simple(null, false, false, true, false, false),
|
||||
Helpee(null, false, true, true, false, true),
|
||||
HelpeeWimpy(null, true, false, true, false, false),
|
||||
@@ -2857,12 +2874,13 @@ public class Enum {
|
||||
HamletGuard(null, false, true, false, false, false),
|
||||
AggroWanderer(null, false, false, true, false, false);
|
||||
|
||||
public final MobBehaviourType BehaviourHelperType;
|
||||
public final boolean isWimpy;
|
||||
public final boolean isAgressive;
|
||||
public final boolean canRoam;
|
||||
public final boolean callsForHelp;
|
||||
public final boolean respondsToCallForHelp;
|
||||
private static HashMap<Integer, MobBehaviourType> _behaviourTypes = new HashMap<>();
|
||||
public MobBehaviourType BehaviourHelperType;
|
||||
public boolean isWimpy;
|
||||
public boolean isAgressive;
|
||||
public boolean canRoam;
|
||||
public boolean callsForHelp;
|
||||
public boolean respondsToCallForHelp;
|
||||
|
||||
MobBehaviourType(MobBehaviourType helpeebehaviourType, boolean wimpy, boolean agressive, boolean canroam, boolean callsforhelp, boolean respondstocallforhelp) {
|
||||
this.BehaviourHelperType = helpeebehaviourType;
|
||||
@@ -2879,8 +2897,6 @@ public class Enum {
|
||||
MOBILE,
|
||||
PET,
|
||||
CHARMED,
|
||||
|
||||
SIEGEENGINE,
|
||||
GUARD;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,10 +19,7 @@ import engine.net.AbstractNetMsg;
|
||||
import engine.net.Dispatch;
|
||||
import engine.net.DispatchMessage;
|
||||
import engine.net.client.ClientConnection;
|
||||
import engine.net.client.msg.LoadCharacterMsg;
|
||||
import engine.net.client.msg.LoadStructureMsg;
|
||||
import engine.net.client.msg.MoveToPointMsg;
|
||||
import engine.net.client.msg.UnloadObjectsMsg;
|
||||
import engine.net.client.msg.*;
|
||||
import engine.objects.*;
|
||||
import engine.server.MBServerStatics;
|
||||
import org.pmw.tinylog.Logger;
|
||||
@@ -467,7 +464,7 @@ public enum InterestManager implements Runnable {
|
||||
if (awonpc.despawned == true)
|
||||
continue;
|
||||
|
||||
awonpc.playerAgroMap.put(player.getObjectUUID(), 0f);
|
||||
awonpc.playerAgroMap.put(player.getObjectUUID(), false);
|
||||
((Mob) awonpc).setCombatTarget(null);
|
||||
lcm = new LoadCharacterMsg(awonpc, PlayerCharacter.hideNonAscii());
|
||||
|
||||
@@ -480,7 +477,7 @@ public enum InterestManager implements Runnable {
|
||||
if (!awonpc.isAlive())
|
||||
continue;
|
||||
|
||||
awonpc.playerAgroMap.put(player.getObjectUUID(), 0f);
|
||||
awonpc.playerAgroMap.put(player.getObjectUUID(), false);
|
||||
|
||||
if ((awonpc.agentType.equals(Enum.AIAgentType.MOBILE)))
|
||||
((Mob) awonpc).setCombatTarget(null);
|
||||
@@ -514,6 +511,18 @@ public enum InterestManager implements Runnable {
|
||||
if (player == null)
|
||||
return;
|
||||
|
||||
for(PlayerCharacter pc : SessionManager.getAllActivePlayerCharacters()){
|
||||
if(pc.equals(player)){
|
||||
try{
|
||||
WorldGrid.RemoveWorldObject(player);
|
||||
}catch(Exception e){
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
ClientConnection origin = player.getClientConnection();
|
||||
|
||||
if (origin == null)
|
||||
@@ -521,10 +530,10 @@ public enum InterestManager implements Runnable {
|
||||
|
||||
// Update loaded upbjects lists
|
||||
|
||||
player.isBoxed = PlayerCharacter.checkIfBoxed(player);
|
||||
player.setDirtyLoad(true);
|
||||
updateStaticList(player, origin);
|
||||
updateMobileList(player, origin);
|
||||
|
||||
}
|
||||
|
||||
public synchronized void HandleLoadForTeleport(PlayerCharacter playerCharacter) {
|
||||
@@ -558,4 +567,23 @@ public enum InterestManager implements Runnable {
|
||||
playerCharacter.setDirtyLoad(true);
|
||||
}
|
||||
}
|
||||
|
||||
public void RefreshLoadedObjects(PlayerCharacter player){
|
||||
try {
|
||||
if (player == null)
|
||||
return;
|
||||
|
||||
ClientConnection origin = player.getClientConnection();
|
||||
|
||||
if (origin == null)
|
||||
return;
|
||||
|
||||
// Update loaded upbjects lists
|
||||
player.setDirtyLoad(true);
|
||||
updateStaticList(player, origin);
|
||||
updateMobileList(player, origin);
|
||||
}catch(Exception e){
|
||||
Logger.error(e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,116 @@
|
||||
package engine.ZergMehcanics;
|
||||
|
||||
import engine.InterestManagement.WorldGrid;
|
||||
import engine.gameManager.BuildingManager;
|
||||
import engine.gameManager.ZergManager;
|
||||
import engine.objects.*;
|
||||
import engine.server.MBServerStatics;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
|
||||
public class MineAntiZerg {
|
||||
|
||||
public static HashMap<Mine,HashMap<PlayerCharacter,Long>> leaveTimers = new HashMap<>();
|
||||
public static HashMap<Mine,ArrayList<PlayerCharacter>> currentPlayers = new HashMap<>();
|
||||
|
||||
public static void runMines(){
|
||||
for(Mine mine : Mine.getMines()){
|
||||
|
||||
Building tower = BuildingManager.getBuildingFromCache(mine.getBuildingID());
|
||||
|
||||
if(tower == null)
|
||||
continue;
|
||||
|
||||
if(!mine.isActive)
|
||||
continue;
|
||||
|
||||
logPlayersPresent(tower,mine);
|
||||
|
||||
auditPlayersPresent(tower,mine);
|
||||
|
||||
auditPlayers(mine);
|
||||
}
|
||||
}
|
||||
|
||||
public static void logPlayersPresent(Building tower, Mine mine){
|
||||
HashSet<AbstractWorldObject> loadedPlayers = WorldGrid.getObjectsInRangePartial(tower.loc, MBServerStatics.CHARACTER_LOAD_RANGE * 3,MBServerStatics.MASK_PLAYER);
|
||||
|
||||
ArrayList<PlayerCharacter> playersPresent = new ArrayList<>();
|
||||
for(AbstractWorldObject player : loadedPlayers){
|
||||
playersPresent.add((PlayerCharacter)player);
|
||||
}
|
||||
|
||||
currentPlayers.put(mine,playersPresent);
|
||||
}
|
||||
|
||||
public static void auditPlayersPresent(Building tower, Mine mine){
|
||||
HashSet<AbstractWorldObject> loadedPlayers = WorldGrid.getObjectsInRangePartial(tower.loc, MBServerStatics.CHARACTER_LOAD_RANGE * 3,MBServerStatics.MASK_PLAYER);
|
||||
|
||||
ArrayList<PlayerCharacter> toRemove = new ArrayList<>();
|
||||
|
||||
for(PlayerCharacter player : currentPlayers.get(mine)){
|
||||
if(!loadedPlayers.contains(player)){
|
||||
toRemove.add(player);
|
||||
}
|
||||
}
|
||||
|
||||
currentPlayers.get(mine).removeAll(toRemove);
|
||||
|
||||
for(PlayerCharacter player : toRemove){
|
||||
if(leaveTimers.containsKey(mine)){
|
||||
leaveTimers.get(mine).put(player,System.currentTimeMillis());
|
||||
}else{
|
||||
HashMap<PlayerCharacter,Long> leaveTime = new HashMap<>();
|
||||
leaveTime.put(player,System.currentTimeMillis());
|
||||
leaveTimers.put(mine,leaveTime);
|
||||
}
|
||||
}
|
||||
|
||||
toRemove.clear();
|
||||
|
||||
for(PlayerCharacter player : leaveTimers.get(mine).keySet()){
|
||||
long timeGone = System.currentTimeMillis() - leaveTimers.get(mine).get(player);
|
||||
if(timeGone > 180000L) {//3 minutes
|
||||
toRemove.add(player);
|
||||
player.ZergMultiplier = 1.0f;
|
||||
}
|
||||
}
|
||||
|
||||
for(PlayerCharacter player : toRemove) {
|
||||
leaveTimers.get(mine).remove(player);
|
||||
}
|
||||
}
|
||||
|
||||
public static void auditPlayers(Mine mine){
|
||||
|
||||
HashMap<Guild,ArrayList<PlayerCharacter>> playersByNation = new HashMap<>();
|
||||
|
||||
for(PlayerCharacter player : currentPlayers.get(mine)){
|
||||
if(playersByNation.containsKey(player.guild.getNation())){
|
||||
playersByNation.get(player.guild.getNation()).add(player);
|
||||
}else{
|
||||
ArrayList<PlayerCharacter> players = new ArrayList<>();
|
||||
players.add(player);
|
||||
playersByNation.put(player.guild.getNation(),players);
|
||||
}
|
||||
}
|
||||
|
||||
for(PlayerCharacter player : leaveTimers.get(mine).keySet()){
|
||||
if(playersByNation.containsKey(player.guild.getNation())){
|
||||
playersByNation.get(player.guild.getNation()).add(player);
|
||||
}else{
|
||||
ArrayList<PlayerCharacter> players = new ArrayList<>();
|
||||
players.add(player);
|
||||
playersByNation.put(player.guild.getNation(),players);
|
||||
}
|
||||
}
|
||||
|
||||
for(Guild nation : playersByNation.keySet()){
|
||||
for(PlayerCharacter player : playersByNation.get(nation)){
|
||||
player.ZergMultiplier = ZergManager.getCurrentMultiplier(playersByNation.get(nation).size(), mine.capSize);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -13,14 +13,13 @@ import engine.Enum;
|
||||
import engine.Enum.GameObjectType;
|
||||
import engine.gameManager.ConfigManager;
|
||||
import engine.gameManager.DbManager;
|
||||
import engine.net.DispatchMessage;
|
||||
import engine.net.client.msg.chat.ChatSystemMsg;
|
||||
import engine.objects.Account;
|
||||
import engine.objects.PlayerCharacter;
|
||||
import org.pmw.tinylog.Logger;
|
||||
|
||||
import java.sql.Connection;
|
||||
import java.sql.PreparedStatement;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.sql.*;
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class dbAccountHandler extends dbHandlerBase {
|
||||
@@ -77,18 +76,24 @@ public class dbAccountHandler extends dbHandlerBase {
|
||||
}
|
||||
}
|
||||
|
||||
public void SET_TRASH(String machineID) {
|
||||
|
||||
public void SET_TRASH(String machineID, String type) {
|
||||
try (Connection connection = DbManager.getConnection();
|
||||
PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO dyn_trash(`machineID`, `count`)"
|
||||
+ " VALUES (?, 1) ON DUPLICATE KEY UPDATE `count` = `count` + 1;")) {
|
||||
PreparedStatement preparedStatement = connection.prepareStatement(
|
||||
"INSERT INTO dyn_trash(`machineID`, `count`, `type`)"
|
||||
+ " VALUES (?, 1, ?) ON DUPLICATE KEY UPDATE `count` = `count` + 1;")) {
|
||||
|
||||
preparedStatement.setString(1, machineID);
|
||||
preparedStatement.setString(2, type);
|
||||
preparedStatement.execute();
|
||||
|
||||
} catch (SQLException e) {
|
||||
Logger.error(e);
|
||||
}
|
||||
|
||||
ChatSystemMsg chatMsg = new ChatSystemMsg(null, "Account: " + machineID + " has been kicked from game for cheating");
|
||||
chatMsg.setMessageType(10);
|
||||
chatMsg.setChannel(Enum.ChatChannelType.SYSTEM.getChannelID());
|
||||
DispatchMessage.dispatchMsgToAll(chatMsg);
|
||||
}
|
||||
|
||||
public ArrayList<String> GET_TRASH_LIST() {
|
||||
@@ -270,4 +275,21 @@ public class dbAccountHandler extends dbHandlerBase {
|
||||
}
|
||||
}
|
||||
|
||||
public void TRASH_CHEATERS() {
|
||||
try (Connection connection = DbManager.getConnection();
|
||||
CallableStatement callableStatement = connection.prepareCall("{CALL BanAccountsWithMachineID()}")) {
|
||||
|
||||
boolean hasResultSet = callableStatement.execute();
|
||||
|
||||
if (!hasResultSet && callableStatement.getUpdateCount() > 0) {
|
||||
Logger.info("TRASHED CHEATERS");
|
||||
} else {
|
||||
Logger.warn("No cheaters to trash.");
|
||||
}
|
||||
|
||||
} catch (SQLException e) {
|
||||
Logger.error("Error trashing cheaters: ", e);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -10,17 +10,13 @@
|
||||
package engine.db.handlers;
|
||||
|
||||
import engine.gameManager.DbManager;
|
||||
import engine.objects.Bane;
|
||||
import engine.objects.Building;
|
||||
import engine.objects.City;
|
||||
import engine.objects.PlayerCharacter;
|
||||
import engine.gameManager.ZoneManager;
|
||||
import engine.math.Vector3fImmutable;
|
||||
import engine.objects.*;
|
||||
import org.joda.time.DateTime;
|
||||
import org.pmw.tinylog.Logger;
|
||||
|
||||
import java.sql.Connection;
|
||||
import java.sql.PreparedStatement;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.sql.*;
|
||||
|
||||
public class dbBaneHandler extends dbHandlerBase {
|
||||
|
||||
@@ -89,6 +85,139 @@ public class dbBaneHandler extends dbHandlerBase {
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean SET_BANE_TIME_NEW(int hour, int cityUUID) {
|
||||
hour += 12; // Adjust hour
|
||||
try (Connection connection = DbManager.getConnection();
|
||||
PreparedStatement getStatement = connection.prepareStatement("SELECT `placementDate`, `liveDate` FROM `dyn_banes` WHERE `cityUUID`=?");
|
||||
PreparedStatement updateStatement = connection.prepareStatement("UPDATE `dyn_banes` SET `liveDate`=?, `time_set`=? WHERE `cityUUID`=?")) {
|
||||
|
||||
// Retrieve placementDate and liveDate
|
||||
getStatement.setInt(1, cityUUID);
|
||||
try (ResultSet rs = getStatement.executeQuery()) {
|
||||
if (rs.next()) {
|
||||
DateTime placementDate = new DateTime(rs.getTimestamp("placementDate").getTime());
|
||||
Timestamp liveDateTimestamp = rs.getTimestamp("liveDate");
|
||||
|
||||
// Explicitly check if liveDate is null
|
||||
DateTime toSet;
|
||||
if (liveDateTimestamp == null) {
|
||||
// If liveDate is null, default to placementDate
|
||||
toSet = placementDate;
|
||||
} else {
|
||||
// If liveDate is not null, use it
|
||||
DateTime liveDate = new DateTime(liveDateTimestamp.getTime());
|
||||
toSet = liveDate;
|
||||
}
|
||||
|
||||
// Adjust the time
|
||||
toSet = toSet.withHourOfDay(hour).withMinuteOfHour(0).withSecondOfMinute(0).withMillisOfSecond(0);
|
||||
|
||||
// Update liveDate and time_set flag
|
||||
updateStatement.setTimestamp(1, new java.sql.Timestamp(toSet.getMillis()));
|
||||
updateStatement.setInt(2, 1); // time_set flag
|
||||
updateStatement.setInt(3, cityUUID);
|
||||
|
||||
updateStatement.execute();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
} catch (SQLException e) {
|
||||
Logger.error(e);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean SET_BANE_DAY_NEW(int dayOffset, int cityUUID) {
|
||||
try (Connection connection = DbManager.getConnection();
|
||||
PreparedStatement getStatement = connection.prepareStatement("SELECT `placementDate`, `liveDate` FROM `dyn_banes` WHERE `cityUUID`=?");
|
||||
PreparedStatement updateStatement = connection.prepareStatement("UPDATE `dyn_banes` SET `liveDate`=?, `day_set`=? WHERE `cityUUID`=?")) {
|
||||
|
||||
// Retrieve placementDate and liveDate
|
||||
getStatement.setInt(1, cityUUID);
|
||||
try (ResultSet rs = getStatement.executeQuery()) {
|
||||
if (rs.next()) {
|
||||
DateTime placementDate = new DateTime(rs.getTimestamp("placementDate").getTime());
|
||||
Timestamp liveDateTimestamp = rs.getTimestamp("liveDate");
|
||||
|
||||
// Explicitly check if liveDate is null
|
||||
DateTime liveDate;
|
||||
if (liveDateTimestamp == null) {
|
||||
// If liveDate is null, default to placementDate
|
||||
liveDate = placementDate;
|
||||
} else {
|
||||
// If liveDate is not null, use it
|
||||
liveDate = new DateTime(liveDateTimestamp.getTime());
|
||||
}
|
||||
|
||||
// Calculate the new liveDate while preserving the time component
|
||||
DateTime updatedDate = placementDate.plusDays(dayOffset)
|
||||
.withHourOfDay(liveDate.getHourOfDay())
|
||||
.withMinuteOfHour(liveDate.getMinuteOfHour())
|
||||
.withSecondOfMinute(liveDate.getSecondOfMinute())
|
||||
.withMillisOfSecond(liveDate.getMillisOfSecond());
|
||||
|
||||
// Update liveDate and day_set flag
|
||||
updateStatement.setTimestamp(1, new java.sql.Timestamp(updatedDate.getMillis()));
|
||||
updateStatement.setInt(2, 1); // day_set flag
|
||||
updateStatement.setInt(3, cityUUID);
|
||||
|
||||
updateStatement.execute();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
} catch (SQLException e) {
|
||||
Logger.error(e);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
public boolean SET_BANE_CAP_NEW(int count, int cityUUID) {
|
||||
|
||||
try (Connection connection = DbManager.getConnection();
|
||||
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `dyn_banes` SET `cap_size`=? WHERE `cityUUID`=?")) {
|
||||
|
||||
preparedStatement.setInt(1, count);
|
||||
preparedStatement.setLong(2, cityUUID);
|
||||
|
||||
preparedStatement.execute();
|
||||
|
||||
} catch (SQLException e) {
|
||||
Logger.error(e);
|
||||
return false;
|
||||
}
|
||||
try (Connection connection = DbManager.getConnection();
|
||||
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `dyn_banes` SET `cap_set`=? WHERE `cityUUID`=?")) {
|
||||
|
||||
preparedStatement.setInt(1, 1);
|
||||
preparedStatement.setLong(2, cityUUID);
|
||||
|
||||
preparedStatement.execute();
|
||||
|
||||
} catch (SQLException e) {
|
||||
Logger.error(e);
|
||||
return false;
|
||||
}
|
||||
|
||||
try (Connection connection = DbManager.getConnection();
|
||||
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `dyn_banes` SET `cap_size`=? WHERE `cityUUID`=?")) {
|
||||
|
||||
preparedStatement.setInt(1, count);
|
||||
preparedStatement.setLong(2, cityUUID);
|
||||
|
||||
preparedStatement.execute();
|
||||
|
||||
} catch (SQLException e) {
|
||||
Logger.error(e);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean REMOVE_BANE(Bane bane) {
|
||||
|
||||
if (bane == null)
|
||||
@@ -107,4 +236,25 @@ public class dbBaneHandler extends dbHandlerBase {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public DateTime getLiveDate(int cityUUID) {
|
||||
try (Connection connection = DbManager.getConnection();
|
||||
PreparedStatement statement = connection.prepareStatement("SELECT `liveDate` FROM `dyn_banes` WHERE `cityUUID`=?")) {
|
||||
|
||||
statement.setInt(1, cityUUID);
|
||||
|
||||
try (ResultSet rs = statement.executeQuery()) {
|
||||
if (rs.next()) {
|
||||
Timestamp liveDateTimestamp = rs.getTimestamp("liveDate");
|
||||
if (liveDateTimestamp != null) {
|
||||
return new DateTime(liveDateTimestamp.getTime());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} catch (SQLException e) {
|
||||
Logger.error(e);
|
||||
}
|
||||
return null; // Return null if liveDate is not found or an error occurs
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,10 +11,7 @@ package engine.db.handlers;
|
||||
|
||||
import engine.Enum;
|
||||
import engine.gameManager.DbManager;
|
||||
import engine.objects.AbstractGameObject;
|
||||
import engine.objects.Building;
|
||||
import engine.objects.City;
|
||||
import engine.objects.Zone;
|
||||
import engine.objects.*;
|
||||
import org.pmw.tinylog.Logger;
|
||||
|
||||
import java.sql.*;
|
||||
@@ -95,7 +92,16 @@ public class dbCityHandler extends dbHandlerBase {
|
||||
|
||||
return objectList;
|
||||
}
|
||||
public Integer GET_CAPITAL_CITY_COUNT() {
|
||||
|
||||
int cityCount = 0;
|
||||
for(Realm realm : Realm._realms.values()){
|
||||
if(realm.isRuled())
|
||||
cityCount ++;
|
||||
}
|
||||
|
||||
return cityCount;
|
||||
}
|
||||
public ArrayList<City> GET_CITIES_BY_ZONE(final int objectUUID) {
|
||||
|
||||
ArrayList<City> cityList = new ArrayList<>();
|
||||
|
||||
@@ -98,32 +98,54 @@ public class dbContractHandler extends dbHandlerBase {
|
||||
|
||||
public void LOAD_SELL_LIST_FOR_CONTRACT(final Contract contract) {
|
||||
|
||||
try (Connection connection = DbManager.getConnection();
|
||||
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_npc_contract_selltype` WHERE `contractID` = ?;")) {
|
||||
if(!contract.getName().contains("Sage")) {
|
||||
try (Connection connection = DbManager.getConnection();
|
||||
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_npc_contract_selltype` WHERE `contractID` = ?;")) {
|
||||
|
||||
preparedStatement.setInt(1, contract.getObjectUUID());
|
||||
preparedStatement.setInt(1, contract.getObjectUUID());
|
||||
|
||||
ResultSet rs = preparedStatement.executeQuery();
|
||||
ResultSet rs = preparedStatement.executeQuery();
|
||||
|
||||
while (rs.next()) {
|
||||
while (rs.next()) {
|
||||
|
||||
int type = rs.getInt("type");
|
||||
int value = rs.getInt("value");
|
||||
int type = rs.getInt("type");
|
||||
int value = rs.getInt("value");
|
||||
|
||||
switch (type) {
|
||||
case 1:
|
||||
contract.getBuyItemType().add(value);
|
||||
break;
|
||||
case 2:
|
||||
contract.getBuySkillToken().add(value);
|
||||
break;
|
||||
case 3:
|
||||
contract.getBuyUnknownToken().add(value);
|
||||
break;
|
||||
switch (type) {
|
||||
case 1:
|
||||
contract.getBuyItemType().add(value);
|
||||
break;
|
||||
case 2:
|
||||
contract.getBuySkillToken().add(value);
|
||||
break;
|
||||
case 3:
|
||||
contract.getBuyUnknownToken().add(value);
|
||||
break;
|
||||
}
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
Logger.error(e);
|
||||
}
|
||||
}else{
|
||||
try (Connection connection = DbManager.getConnection();
|
||||
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_npc_contract_selltype`;")) {
|
||||
|
||||
ResultSet rs = preparedStatement.executeQuery();
|
||||
|
||||
while (rs.next()) {
|
||||
int value = rs.getInt("value");
|
||||
if(!contract.getBuySkillToken().contains(value))
|
||||
contract.getBuySkillToken().add(value);
|
||||
|
||||
if(!contract.getBuyItemType().contains(value))
|
||||
contract.getBuyItemType().add(value);
|
||||
|
||||
if(!contract.getBuyUnknownToken().contains(value))
|
||||
contract.getBuyUnknownToken().add(value);
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
Logger.error(e);
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
Logger.error(e);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -32,7 +32,6 @@ public abstract class dbHandlerBase {
|
||||
try {
|
||||
if (rs.next()) {
|
||||
abstractGameObject = localClass.getConstructor(ResultSet.class).newInstance(rs);
|
||||
|
||||
DbManager.addToCache(abstractGameObject);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
@@ -57,12 +56,28 @@ public abstract class dbHandlerBase {
|
||||
while (rs.next()) {
|
||||
|
||||
int id = rs.getInt(1);
|
||||
try {
|
||||
if (rs.getInt("capSize") == 0) {
|
||||
continue;
|
||||
}
|
||||
}catch(Exception e){
|
||||
//not a mine
|
||||
}
|
||||
|
||||
if (DbManager.inCache(localObjectType, id)) {
|
||||
objectList.add((T) DbManager.getFromCache(localObjectType, id));
|
||||
} else {
|
||||
try{
|
||||
if(rs.getInt("mineLiveHour") == 1)
|
||||
continue;
|
||||
}catch(Exception e){
|
||||
//not a mine
|
||||
}
|
||||
AbstractGameObject toAdd = localClass.getConstructor(ResultSet.class).newInstance(rs);
|
||||
DbManager.addToCache(toAdd);
|
||||
if(toAdd.getObjectType().equals(GameObjectType.Zone) && rs.getInt("canLoad") == 0){
|
||||
continue;
|
||||
}
|
||||
objectList.add((T) toAdd);
|
||||
|
||||
if (toAdd != null && toAdd instanceof AbstractWorldObject)
|
||||
|
||||
@@ -22,6 +22,7 @@ import java.util.HashMap;
|
||||
|
||||
public class dbItemBaseHandler extends dbHandlerBase {
|
||||
|
||||
public static final HashMap<Integer,Float> dexReductions = new HashMap<>();
|
||||
public dbItemBaseHandler() {
|
||||
|
||||
}
|
||||
@@ -45,6 +46,14 @@ public class dbItemBaseHandler extends dbHandlerBase {
|
||||
}
|
||||
}
|
||||
|
||||
public void LOAD_DEX_REDUCTION(ItemBase itemBase) {
|
||||
if(dexReductions.containsKey(itemBase.getUUID())){
|
||||
itemBase.dexReduction = dexReductions.get(itemBase.getUUID());
|
||||
}else{
|
||||
itemBase.dexReduction = 0.0f;
|
||||
}
|
||||
}
|
||||
|
||||
public void LOAD_ANIMATIONS(ItemBase itemBase) {
|
||||
|
||||
ArrayList<Integer> tempList = new ArrayList<>();
|
||||
@@ -94,6 +103,21 @@ public class dbItemBaseHandler extends dbHandlerBase {
|
||||
}
|
||||
|
||||
Logger.info("read: " + recordsRead + " cached: " + ItemBase.getUUIDCache().size());
|
||||
try (Connection connection = DbManager.getConnection();
|
||||
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_item_dexpenalty`")) {
|
||||
|
||||
ResultSet rs = preparedStatement.executeQuery();
|
||||
|
||||
// Check if a result was found
|
||||
if (rs.next()) {
|
||||
int ID = rs.getInt("ID");
|
||||
float factor = rs.getInt("item_bulk_factor");
|
||||
dexReductions.put(ID,factor);
|
||||
}
|
||||
|
||||
} catch (SQLException e) {
|
||||
Logger.error(e);
|
||||
}
|
||||
}
|
||||
|
||||
public HashMap<Integer, ArrayList<Integer>> LOAD_RUNES_FOR_NPC_AND_MOBS() {
|
||||
|
||||
@@ -134,9 +134,13 @@ public class dbItemHandler extends dbHandlerBase {
|
||||
|
||||
ResultSet rs = preparedStatement.executeQuery();
|
||||
|
||||
if (rs.next())
|
||||
worked = rs.getBoolean("result");
|
||||
|
||||
if (rs.next()) {
|
||||
try {
|
||||
worked = rs.getBoolean("result");
|
||||
}catch(Exception e){
|
||||
worked = false;
|
||||
}
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
Logger.error(e);
|
||||
}
|
||||
@@ -496,4 +500,18 @@ public class dbItemHandler extends dbHandlerBase {
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,26 +28,31 @@ public class dbMobHandler extends dbHandlerBase {
|
||||
this.localObjectType = engine.Enum.GameObjectType.valueOf(this.localClass.getSimpleName());
|
||||
}
|
||||
|
||||
public Mob PERSIST(Mob toAdd) {
|
||||
public Mob ADD_MOB(Mob toAdd) {
|
||||
|
||||
Mob mobile = null;
|
||||
|
||||
try (Connection connection = DbManager.getConnection();
|
||||
PreparedStatement preparedStatement = connection.prepareStatement("CALL `mob_CREATE`(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);")) {
|
||||
|
||||
preparedStatement.setLong(1, toAdd.parentZoneUUID);
|
||||
preparedStatement.setInt(2, toAdd.loadID);
|
||||
preparedStatement.setInt(3, toAdd.guildUUID);
|
||||
preparedStatement.setFloat(4, toAdd.bindLoc.x);
|
||||
preparedStatement.setFloat(5, toAdd.bindLoc.y);
|
||||
preparedStatement.setFloat(6, toAdd.bindLoc.z);
|
||||
preparedStatement.setLong(1, toAdd.getParentZoneID());
|
||||
preparedStatement.setInt(2, toAdd.getMobBaseID());
|
||||
preparedStatement.setInt(3, toAdd.getGuildUUID());
|
||||
preparedStatement.setFloat(4, toAdd.getSpawnX());
|
||||
preparedStatement.setFloat(5, toAdd.getSpawnY());
|
||||
preparedStatement.setFloat(6, toAdd.getSpawnZ());
|
||||
preparedStatement.setInt(7, 0);
|
||||
preparedStatement.setFloat(8, toAdd.spawnRadius);
|
||||
preparedStatement.setInt(9, toAdd.spawnTime);
|
||||
preparedStatement.setInt(10, toAdd.contractUUID);
|
||||
preparedStatement.setInt(11, toAdd.buildingUUID);
|
||||
preparedStatement.setInt(12, toAdd.level);
|
||||
preparedStatement.setString(13, toAdd.firstName);
|
||||
preparedStatement.setFloat(8, toAdd.getSpawnRadius());
|
||||
preparedStatement.setInt(9, toAdd.getTrueSpawnTime());
|
||||
|
||||
if (toAdd.getContract() != null)
|
||||
preparedStatement.setInt(10, toAdd.getContract().getContractID());
|
||||
else
|
||||
preparedStatement.setInt(10, 0);
|
||||
|
||||
preparedStatement.setInt(11, toAdd.getBuildingID());
|
||||
preparedStatement.setInt(12, toAdd.getLevel());
|
||||
preparedStatement.setString(13, toAdd.getFirstName());
|
||||
|
||||
ResultSet rs = preparedStatement.executeQuery();
|
||||
|
||||
@@ -101,17 +106,17 @@ public class dbMobHandler extends dbHandlerBase {
|
||||
return row_count;
|
||||
}
|
||||
|
||||
public void LOAD_GUARD_MINIONS(Mob guardCaptain) {
|
||||
public void LOAD_PATROL_POINTS(Mob captain) {
|
||||
|
||||
try (Connection connection = DbManager.getConnection();
|
||||
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `dyn_guards` WHERE `captainUID` = ?")) {
|
||||
|
||||
preparedStatement.setInt(1, guardCaptain.getObjectUUID());
|
||||
preparedStatement.setInt(1, captain.getObjectUUID());
|
||||
ResultSet rs = preparedStatement.executeQuery();
|
||||
|
||||
while (rs.next()) {
|
||||
String minionName = rs.getString("name");
|
||||
Mob toCreate = Mob.createGuardMinion(guardCaptain, guardCaptain.getLevel(), minionName);
|
||||
String name = rs.getString("name");
|
||||
Mob toCreate = Mob.createGuardMob(captain, captain.getGuild(), captain.getParentZone(), captain.building.getLoc(), captain.getLevel(), name);
|
||||
|
||||
if (toCreate == null)
|
||||
return;
|
||||
|
||||
@@ -131,6 +131,32 @@ public class dbNPCHandler extends dbHandlerBase {
|
||||
return npc;
|
||||
}
|
||||
|
||||
public int BANE_COMMANDER_EXISTS(final int objectUUID) {
|
||||
|
||||
int uid = 0;
|
||||
|
||||
String query = "SELECT `UID` FROM `obj_npc` WHERE `npc_buildingID` = ? LIMIT 1;";
|
||||
|
||||
try (Connection connection = DbManager.getConnection();
|
||||
PreparedStatement preparedStatement = connection.prepareStatement(query)) {
|
||||
|
||||
preparedStatement.setInt(1, objectUUID);
|
||||
|
||||
try (ResultSet rs = preparedStatement.executeQuery()) {
|
||||
if (rs.next()) {
|
||||
// Retrieve the UID column value
|
||||
uid = rs.getInt("UID");
|
||||
}
|
||||
}
|
||||
|
||||
} catch (SQLException e) {
|
||||
Logger.error(e);
|
||||
}
|
||||
|
||||
return uid;
|
||||
}
|
||||
|
||||
|
||||
public int MOVE_NPC(long npcID, long parentID, float locX, float locY, float locZ) {
|
||||
|
||||
int rowCount;
|
||||
@@ -176,6 +202,18 @@ public class dbNPCHandler extends dbHandlerBase {
|
||||
return result;
|
||||
}
|
||||
|
||||
public static void updateSpecialPricing(final NPC npc){
|
||||
try (Connection connection = DbManager.getConnection();
|
||||
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE obj_npc SET specialPrice=? WHERE UID = ?")) {
|
||||
preparedStatement.setInt(1, npc.getSpecialPrice());
|
||||
preparedStatement.setInt(2, npc.getDBID());
|
||||
|
||||
preparedStatement.executeUpdate();
|
||||
|
||||
} catch (SQLException e) {
|
||||
Logger.error(e);
|
||||
}
|
||||
}
|
||||
public void updateDatabase(final NPC npc) {
|
||||
|
||||
try (Connection connection = DbManager.getConnection();
|
||||
|
||||
@@ -14,6 +14,7 @@ import engine.gameManager.ChatManager;
|
||||
import engine.objects.AbstractGameObject;
|
||||
import engine.objects.Item;
|
||||
import engine.objects.PlayerCharacter;
|
||||
import engine.server.MBServerStatics;
|
||||
|
||||
/**
|
||||
* @author Eighty
|
||||
@@ -46,10 +47,10 @@ public class AddGoldCmd extends AbstractDevCmd {
|
||||
throwbackError(pc, "Quantity must be a number, " + words[0] + " is invalid");
|
||||
return;
|
||||
}
|
||||
if (amt < 1 || amt > 10000000) {
|
||||
throwbackError(pc, "Quantity must be between 1 and 10000000 (10 million)");
|
||||
if (amt < 1 || amt > MBServerStatics.PLAYER_GOLD_LIMIT) {
|
||||
throwbackError(pc, "Quantity must be between 1 and " + MBServerStatics.PLAYER_GOLD_LIMIT);
|
||||
return;
|
||||
} else if ((curAmt + amt) > 10000000) {
|
||||
} else if ((curAmt + amt) > MBServerStatics.PLAYER_GOLD_LIMIT) {
|
||||
throwbackError(pc, "This would place your inventory over 10,000,000 gold.");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -9,12 +9,17 @@
|
||||
|
||||
package engine.devcmd.cmds;
|
||||
|
||||
import engine.Enum;
|
||||
import engine.Enum.GameObjectType;
|
||||
import engine.InterestManagement.InterestManager;
|
||||
import engine.InterestManagement.WorldGrid;
|
||||
import engine.devcmd.AbstractDevCmd;
|
||||
import engine.gameManager.ChatManager;
|
||||
import engine.gameManager.DbManager;
|
||||
import engine.gameManager.LootManager;
|
||||
import engine.gameManager.ZoneManager;
|
||||
import engine.math.Vector3fImmutable;
|
||||
import engine.mobileAI.utilities.MovementUtilities;
|
||||
import engine.objects.*;
|
||||
import org.pmw.tinylog.Logger;
|
||||
|
||||
@@ -43,7 +48,7 @@ public class AddMobCmd extends AbstractDevCmd {
|
||||
MobBase mb = (MobBase) mobbaseAGO;
|
||||
int loadID = mb.getObjectUUID();
|
||||
Mob mob = Mob.createMob(loadID, Vector3fImmutable.getRandomPointInCircle(pc.getLoc(), 100),
|
||||
null, zone, null, null, "", 1);
|
||||
null, true, zone, null, 0, "", 1);
|
||||
if (mob != null) {
|
||||
mob.updateDatabase();
|
||||
this.setResult(String.valueOf(mob.getDBID()));
|
||||
@@ -83,13 +88,41 @@ public class AddMobCmd extends AbstractDevCmd {
|
||||
}
|
||||
|
||||
|
||||
Mob mob = Mob.createMob(loadID, pc.getLoc(),
|
||||
null, zone, null, null, "", 1);
|
||||
Mob mob = Mob.createMob(loadID, pc.getLoc(),null, true, zone, null, 0, "", 1);
|
||||
//Mob mob = Mob.createStrongholdMob(loadID,pc.loc,Guild.getErrantGuild(),true,zone,null,0,"Whitehorn Militant",75);
|
||||
if (mob != null) {
|
||||
mob.updateDatabase();
|
||||
ChatManager.chatSayInfo(pc,
|
||||
"Mob with ID " + mob.getDBID() + " added");
|
||||
this.setResult(String.valueOf(mob.getDBID()));
|
||||
|
||||
mob.parentZone = zone;
|
||||
mob.bindLoc = pc.loc;
|
||||
mob.setLoc(pc.loc);
|
||||
mob.equipmentSetID = 6327;
|
||||
mob.runAfterLoad();
|
||||
mob.setLevel((short)75);
|
||||
mob.setResists(new Resists("Elite"));
|
||||
mob.spawnTime = 10;
|
||||
mob.BehaviourType = Enum.MobBehaviourType.Aggro;
|
||||
zone.zoneMobSet.add(mob);
|
||||
mob.isHellgateMob = true;
|
||||
LootManager.GenerateStrongholdLoot(mob,false,false);
|
||||
mob.healthMax = mob.mobBase.getHealthMax();
|
||||
mob.setHealth(mob.healthMax);
|
||||
mob.maxDamageHandOne = 1550;
|
||||
mob.minDamageHandOne = 750;
|
||||
mob.atrHandOne = 1800;
|
||||
mob.defenseRating = 2200;
|
||||
mob.setFirstName("Whitehorn Militant");
|
||||
//InterestManager.setObjectDirty(mob);
|
||||
//WorldGrid.addObject(mob,pc.loc.x,pc.loc.z);
|
||||
//WorldGrid.updateObject(mob);
|
||||
//guard.stronghold = mine;
|
||||
mob.mobPowers.clear();
|
||||
mob.mobPowers.put(429399948,20); // find weakness
|
||||
|
||||
|
||||
} else {
|
||||
throwbackError(pc, "Failed to create mob of type " + loadID);
|
||||
Logger.error("Failed to create mob of type "
|
||||
|
||||
@@ -13,6 +13,7 @@ import engine.Enum.GameObjectType;
|
||||
import engine.InterestManagement.WorldGrid;
|
||||
import engine.devcmd.AbstractDevCmd;
|
||||
import engine.gameManager.*;
|
||||
import engine.math.Vector3fImmutable;
|
||||
import engine.objects.*;
|
||||
import org.pmw.tinylog.Logger;
|
||||
|
||||
@@ -31,7 +32,6 @@ public class AddNPCCmd extends AbstractDevCmd {
|
||||
int contractID;
|
||||
String name = "";
|
||||
int level = 0;
|
||||
|
||||
if (words.length < 2) {
|
||||
this.sendUsage(pc);
|
||||
return;
|
||||
@@ -39,59 +39,54 @@ public class AddNPCCmd extends AbstractDevCmd {
|
||||
try {
|
||||
contractID = Integer.parseInt(words[0]);
|
||||
level = Integer.parseInt(words[1]);
|
||||
|
||||
for (int i = 2; i < words.length; i++) {
|
||||
name += words[i];
|
||||
if (i + 1 < words.length)
|
||||
name += "";
|
||||
}
|
||||
|
||||
} catch (NumberFormatException e) {
|
||||
throwbackError(pc,
|
||||
"Failed to parse supplied contractID or level to an Integer.");
|
||||
return; // NaN
|
||||
}
|
||||
|
||||
Contract contract = DbManager.ContractQueries.GET_CONTRACT(contractID);
|
||||
|
||||
if (contract == null || level < 1 || level > 75) {
|
||||
throwbackError(pc,
|
||||
"Invalid addNPC Command. Need contract ID, and level");
|
||||
return; // NaN
|
||||
}
|
||||
|
||||
// Pick a random name
|
||||
if (name.isEmpty())
|
||||
name = NPCManager.getPirateName(contract.getMobbaseID());
|
||||
|
||||
Zone zone = ZoneManager.findSmallestZone(pc.getLoc());
|
||||
|
||||
if (zone == null) {
|
||||
throwbackError(pc, "Failed to find zone to place npc in.");
|
||||
return;
|
||||
}
|
||||
|
||||
Building building = null;
|
||||
if (target != null)
|
||||
if (target.getObjectType() == GameObjectType.Building) {
|
||||
Building parentBuilding = (Building) target;
|
||||
BuildingManager.addHirelingForWorld(parentBuilding, pc, parentBuilding.getLoc(), parentBuilding.getParentZone(), contract, level);
|
||||
return;
|
||||
building = (Building)target;
|
||||
}
|
||||
|
||||
NPC npc = NPC.createNPC(name, contractID,
|
||||
pc.getLoc(), null, zone, (short) level, null);
|
||||
|
||||
if (npc != null) {
|
||||
WorldGrid.addObject(npc, pc);
|
||||
ChatManager.chatSayInfo(pc,
|
||||
"NPC with ID " + npc.getDBID() + " added");
|
||||
this.setResult(String.valueOf(npc.getDBID()));
|
||||
} else {
|
||||
throwbackError(pc, "Failed to create npc of contract type "
|
||||
+ contractID);
|
||||
Logger.error(
|
||||
"Failed to create npc of contract type " + contractID);
|
||||
NPC created;
|
||||
Guild guild = null;
|
||||
Vector3fImmutable loc;
|
||||
if(building != null){
|
||||
guild = building.getGuild();
|
||||
loc = building.loc;
|
||||
} else{
|
||||
loc = pc.loc;
|
||||
}
|
||||
created = NPC.createNPC(name, contractID, loc, guild, zone, (short)level, building);
|
||||
created.bindLoc = loc;
|
||||
if(building != null) {
|
||||
created.buildingUUID = building.getObjectUUID();
|
||||
created.building = building;
|
||||
NPCManager.slotCharacterInBuilding(created);
|
||||
}
|
||||
created.setLoc(created.bindLoc);
|
||||
created.updateDatabase();
|
||||
throwbackInfo(pc, "Created NPC with UUID: " + created.getObjectUUID());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
||||
// Magicbane Emulator Project © 2013 - 2022
|
||||
// www.magicbane.com
|
||||
|
||||
|
||||
package engine.devcmd.cmds;
|
||||
|
||||
import engine.Dungeons.DungeonManager;
|
||||
import engine.Enum.GameObjectType;
|
||||
import engine.devcmd.AbstractDevCmd;
|
||||
import engine.gameManager.BuildingManager;
|
||||
import engine.gameManager.ChatManager;
|
||||
import engine.gameManager.DbManager;
|
||||
import engine.gameManager.ZoneManager;
|
||||
import engine.math.Vector3fImmutable;
|
||||
import engine.objects.*;
|
||||
import org.pmw.tinylog.Logger;
|
||||
|
||||
/**
|
||||
* @author Eighty
|
||||
*/
|
||||
public class DungenonCmd extends AbstractDevCmd {
|
||||
|
||||
public DungenonCmd() {
|
||||
super("dungeon");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void _doCmd(PlayerCharacter pc, String[] words,
|
||||
AbstractGameObject target) {
|
||||
|
||||
Zone parent = ZoneManager.findSmallestZone(pc.loc);
|
||||
if(parent == null)
|
||||
return;
|
||||
|
||||
Vector3fImmutable loc = Vector3fImmutable.getRandomPointOnCircle(BuildingManager.getBuilding(2827951).loc,30f);
|
||||
pc.teleport(loc);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String _getHelpString() {
|
||||
return "indicate mob or building followed by an id and a level";
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String _getUsageString() {
|
||||
return "'/dungeon mob 2001 10'";
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
||||
// Magicbane Emulator Project © 2013 - 2022
|
||||
// www.magicbane.com
|
||||
|
||||
|
||||
package engine.devcmd.cmds;
|
||||
|
||||
import engine.Enum.ItemContainerType;
|
||||
import engine.Enum.ItemType;
|
||||
import engine.Enum.OwnerType;
|
||||
import engine.devcmd.AbstractDevCmd;
|
||||
import engine.gameManager.ChatManager;
|
||||
import engine.gameManager.DbManager;
|
||||
import engine.objects.*;
|
||||
import engine.powers.EffectsBase;
|
||||
import engine.server.MBServerStatics;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
/**
|
||||
* @author Eighty
|
||||
*/
|
||||
public class GimmeCmd extends AbstractDevCmd {
|
||||
|
||||
public GimmeCmd() {
|
||||
super("gimme");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void _doCmd(PlayerCharacter pc, String[] words,
|
||||
AbstractGameObject target) {
|
||||
int amt = 0;
|
||||
int currentGold = pc.getCharItemManager().getGoldInventory().getNumOfItems();
|
||||
amt = MBServerStatics.PLAYER_GOLD_LIMIT - currentGold;
|
||||
if (!pc.getCharItemManager().addGoldToInventory(amt, true)) {
|
||||
throwbackError(pc, "Failed to add gold to inventory");
|
||||
return;
|
||||
}
|
||||
|
||||
ChatManager.chatSayInfo(pc, amt + " gold added to inventory");
|
||||
|
||||
if(pc.level < 75) {
|
||||
pc.setLevel((short) 75);
|
||||
ChatManager.chatSayInfo(pc, "Level set to 75");
|
||||
}
|
||||
pc.getCharItemManager().updateInventory();
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String _getHelpString() {
|
||||
return "Round up current gold in inventory to 10,000,000";
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String _getUsageString() {
|
||||
return "'./gimme";
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,77 +0,0 @@
|
||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
||||
// Magicbane Emulator Project © 2013 - 2022
|
||||
// www.magicbane.com
|
||||
|
||||
|
||||
package engine.devcmd.cmds;
|
||||
|
||||
import engine.devcmd.AbstractDevCmd;
|
||||
import engine.gameManager.ZoneManager;
|
||||
import engine.objects.AbstractGameObject;
|
||||
import engine.objects.PlayerCharacter;
|
||||
|
||||
/**
|
||||
* ./hotzone <- display the current hotzone & time remaining
|
||||
* ./hotzone random <- change hotzone to random new zone
|
||||
*/
|
||||
|
||||
public class HotzoneCmd extends AbstractDevCmd {
|
||||
|
||||
public HotzoneCmd() {
|
||||
super("hotzone");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void _doCmd(PlayerCharacter playerCharacter, String[] words,
|
||||
AbstractGameObject target) {
|
||||
|
||||
StringBuilder data = new StringBuilder();
|
||||
String outString;
|
||||
|
||||
for (String s : words) {
|
||||
data.append(s);
|
||||
data.append(' ');
|
||||
}
|
||||
|
||||
String input = data.toString().trim();
|
||||
|
||||
if (input.length() == 0) {
|
||||
outString = "Current hotZone: " + ZoneManager.hotZone.getName() + "\r\n";
|
||||
outString += "Available hotZones: " + ZoneManager.availableHotZones();
|
||||
throwbackInfo(playerCharacter, outString);
|
||||
return;
|
||||
}
|
||||
|
||||
if (input.equalsIgnoreCase("random")) {
|
||||
ZoneManager.generateAndSetRandomHotzone();
|
||||
outString = "New hotZone: " + ZoneManager.hotZone.getName() + "\r\n";
|
||||
outString += "Available hotZones: " + ZoneManager.availableHotZones();
|
||||
throwbackInfo(playerCharacter, outString);
|
||||
return;
|
||||
}
|
||||
|
||||
if (input.equalsIgnoreCase("reset")) {
|
||||
ZoneManager.resetHotZones();
|
||||
throwbackInfo(playerCharacter, "Available hotZones: " + ZoneManager.availableHotZones());
|
||||
return;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String _getHelpString() {
|
||||
return "Use no arguments to see the current hotzone or \"random\" to change it randomly.";
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String _getUsageString() {
|
||||
return "'./hotzone [random]";
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -15,9 +15,13 @@ import engine.Enum.GameObjectType;
|
||||
import engine.Enum.TargetColor;
|
||||
import engine.devcmd.AbstractDevCmd;
|
||||
import engine.gameManager.BuildingManager;
|
||||
import engine.gameManager.PowersManager;
|
||||
import engine.gameManager.SessionManager;
|
||||
import engine.math.Vector3fImmutable;
|
||||
import engine.objects.*;
|
||||
import engine.powers.EffectsBase;
|
||||
import engine.powers.PowersBase;
|
||||
import engine.server.MBServerStatics;
|
||||
import engine.util.StringUtils;
|
||||
|
||||
import java.text.DecimalFormat;
|
||||
@@ -331,13 +335,19 @@ public class InfoCmd extends AbstractDevCmd {
|
||||
output += "Movement State: " + targetPC.getMovementState().name();
|
||||
output += newline;
|
||||
output += "Movement Speed: " + targetPC.getSpeed();
|
||||
|
||||
output += newline;
|
||||
output += "Altitude : " + targetPC.getLoc().y;
|
||||
|
||||
output += newline;
|
||||
output += "Swimming : " + targetPC.isSwimming();
|
||||
output += newline;
|
||||
output += "isMoving : " + targetPC.isMoving();
|
||||
|
||||
output += newline;
|
||||
output += "Zerg Multiplier : " + targetPC.ZergMultiplier + newline;
|
||||
output += "Hidden : " + targetPC.getHidden() + newline;
|
||||
output += "Target Loc: " + targetPC.loc + newline;
|
||||
output += "Player Loc: " + pc.loc + newline;
|
||||
output += "Distance Squared: " + pc.loc.distanceSquared(targetPC.loc) + newline;
|
||||
output += "IsBoxed: " + targetPC.isBoxed;
|
||||
break;
|
||||
|
||||
case NPC:
|
||||
@@ -440,9 +450,7 @@ public class InfoCmd extends AbstractDevCmd {
|
||||
output += "isSummonedPet: true";
|
||||
else
|
||||
output += "isSummonedPet: false";
|
||||
|
||||
|
||||
PlayerCharacter owner = (PlayerCharacter) targetMob.guardCaptain;
|
||||
PlayerCharacter owner = targetMob.getOwner();
|
||||
if (owner != null)
|
||||
output += " owner: " + owner.getObjectUUID();
|
||||
output += newline;
|
||||
@@ -494,13 +502,16 @@ public class InfoCmd extends AbstractDevCmd {
|
||||
output += newline;
|
||||
output += "No building found." + newline;
|
||||
}
|
||||
int max = (int)(4.882 * targetMob.level + 121.0);
|
||||
if(max > 321){
|
||||
max = 321;
|
||||
|
||||
output += "Damage: " + targetMob.mobBase.getDamageMin() + " - " + targetMob.mobBase.getDamageMax() + newline;
|
||||
output += "ATR: " + targetMob.mobBase.getAttackRating() + newline;
|
||||
output += "DEF: " + targetMob.defenseRating + newline;
|
||||
output += "RANGE: " + targetMob.getRange() + newline;
|
||||
output += "Effects:" + newline;
|
||||
for(MobBaseEffects mbe : targetMob.mobBase.mobbaseEffects){
|
||||
EffectsBase eb = PowersManager.getEffectByToken(mbe.getToken());
|
||||
output += eb.getName() + newline;
|
||||
}
|
||||
int min = (int)(4.469 * targetMob.level - 3.469);
|
||||
output += "Min Loot Roll = " + min;
|
||||
output += "Max Loot Roll = " + max;
|
||||
break;
|
||||
case Item: //intentional passthrough
|
||||
case MobLoot:
|
||||
@@ -531,6 +542,13 @@ public class InfoCmd extends AbstractDevCmd {
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case Corpse:
|
||||
Corpse corpse = (Corpse)target;
|
||||
Long timeLeft = MBServerStatics.CORPSE_CLEANUP_TIMER_MS - (System.currentTimeMillis() - corpse.spawnedTime);
|
||||
output += "Despawn in: " + timeLeft;
|
||||
output += newline;
|
||||
break;
|
||||
}
|
||||
|
||||
throwbackInfo(pc, output);
|
||||
|
||||
@@ -16,6 +16,7 @@ import engine.objects.AbstractGameObject;
|
||||
import engine.objects.Building;
|
||||
import engine.objects.Mine;
|
||||
import engine.objects.PlayerCharacter;
|
||||
import engine.workthreads.HalfHourlyJobThread;
|
||||
import engine.workthreads.HourlyJobThread;
|
||||
|
||||
/**
|
||||
@@ -41,10 +42,10 @@ public class MineActiveCmd extends AbstractDevCmd {
|
||||
String trigger = args[0];
|
||||
switch (trigger) {
|
||||
case "true":
|
||||
HourlyJobThread.mineWindowOpen(mine);
|
||||
HalfHourlyJobThread.mineWindowOpen(mine);
|
||||
break;
|
||||
case "false":
|
||||
HourlyJobThread.mineWindowClose(mine);
|
||||
HalfHourlyJobThread.mineWindowClose(mine);
|
||||
break;
|
||||
default:
|
||||
this.sendUsage(pcSender);
|
||||
|
||||
@@ -0,0 +1,75 @@
|
||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
||||
// Magicbane Emulator Project © 2013 - 2022
|
||||
// www.magicbane.com
|
||||
|
||||
|
||||
package engine.devcmd.cmds;
|
||||
|
||||
import engine.Enum;
|
||||
import engine.Enum.BuildingGroup;
|
||||
import engine.Enum.GameObjectType;
|
||||
import engine.Enum.TargetColor;
|
||||
import engine.devcmd.AbstractDevCmd;
|
||||
import engine.gameManager.BuildingManager;
|
||||
import engine.gameManager.PowersManager;
|
||||
import engine.gameManager.SessionManager;
|
||||
import engine.math.Vector3fImmutable;
|
||||
import engine.objects.*;
|
||||
import engine.powers.EffectsBase;
|
||||
import engine.server.MBServerStatics;
|
||||
import engine.util.StringUtils;
|
||||
|
||||
import java.text.DecimalFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
|
||||
/**
|
||||
* @author
|
||||
*/
|
||||
public class PrintEffectsCmd extends AbstractDevCmd {
|
||||
|
||||
public PrintEffectsCmd() {
|
||||
super("printeffects");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void _doCmd(PlayerCharacter pc, String[] words,
|
||||
AbstractGameObject target) {
|
||||
|
||||
if(!target.getObjectType().equals(GameObjectType.PlayerCharacter)) {
|
||||
throwbackInfo(pc, "Target Must PlayerCharacter");
|
||||
return;
|
||||
}
|
||||
String newline = "\r\n ";
|
||||
String output = "Effects for Player:" + newline;
|
||||
|
||||
AbstractCharacter absTar = (AbstractCharacter) target;
|
||||
|
||||
for(String key : absTar.effects.keySet()){
|
||||
Effect eff = absTar.effects.get(key);
|
||||
if(eff.getJobContainer() != null) {
|
||||
output += "[" + key + "] " + eff.getName() + " (" + eff.getTrains() + ") " + eff.getJobContainer().timeToExecutionLeft() * 0.001f + newline;
|
||||
}else{
|
||||
output += eff.getName() + " (" + eff.getTrains() + ") " + "PERMANENT" + newline;
|
||||
}
|
||||
}
|
||||
|
||||
throwbackInfo(pc, output);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String _getHelpString() {
|
||||
return "Gets information on an Object.";
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String _getUsageString() {
|
||||
return "' /info targetID'";
|
||||
}
|
||||
|
||||
}
|
||||
@@ -49,6 +49,8 @@ public class PrintSkillsCmd extends AbstractDevCmd {
|
||||
+ skill.getModifiedAmount() + '('
|
||||
+ skill.getTotalSkillPercet() + " )");
|
||||
}
|
||||
//throwbackInfo(pc, "= = = = = NEW CALCULATIONS = = = = =");
|
||||
// PlayerCombatStats.PrintSkillsToClient(pc);
|
||||
} else
|
||||
throwbackInfo(pc, "Skills not found for player");
|
||||
}
|
||||
|
||||
@@ -9,7 +9,9 @@
|
||||
|
||||
package engine.devcmd.cmds;
|
||||
|
||||
import engine.Enum;
|
||||
import engine.devcmd.AbstractDevCmd;
|
||||
import engine.gameManager.PowersManager;
|
||||
import engine.objects.*;
|
||||
|
||||
import java.util.HashMap;
|
||||
@@ -56,23 +58,43 @@ public class PrintStatsCmd extends AbstractDevCmd {
|
||||
|
||||
public void printStatsPlayer(PlayerCharacter pc, PlayerCharacter tar) {
|
||||
String newline = "\r\n ";
|
||||
String out = "Server stats for Player " + tar.getFirstName() + newline;
|
||||
out += "Unused Stats: " + tar.getUnusedStatPoints() + newline;
|
||||
out += "Stats Base (Modified)" + newline;
|
||||
out += " Str: " + (int) tar.statStrBase + " (" + tar.getStatStrCurrent() + ')' + ", maxStr: " + tar.getStrMax() + newline;
|
||||
out += " Dex: " + (int) tar.statDexBase + " (" + tar.getStatDexCurrent() + ')' + ", maxDex: " + tar.getDexMax() + newline;
|
||||
out += " Con: " + (int) tar.statConBase + " (" + tar.getStatConCurrent() + ')' + ", maxCon: " + tar.getConMax() + newline;
|
||||
out += " Int: " + (int) tar.statIntBase + " (" + tar.getStatIntCurrent() + ')' + ", maxInt: " + tar.getIntMax() + newline;
|
||||
out += " Spi: " + (int) tar.statSpiBase + " (" + tar.getStatSpiCurrent() + ')' + ", maxSpi: " + tar.getSpiMax() + newline;
|
||||
throwbackInfo(pc, out);
|
||||
out = "Health: " + tar.getHealth() + ", maxHealth: " + tar.getHealthMax() + newline;
|
||||
out += "Mana: " + tar.getMana() + ", maxMana: " + tar.getManaMax() + newline;
|
||||
out += "Stamina: " + tar.getStamina() + ", maxStamina: " + tar.getStaminaMax() + newline;
|
||||
out += "Defense: " + tar.getDefenseRating() + 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 += "isAlive: " + tar.isAlive() + ", Combat: " + tar.isCombat() + newline;
|
||||
throwbackInfo(pc, out);
|
||||
|
||||
String newOut = "Server stats for Player " + tar.getFirstName() + newline;
|
||||
newOut += "HEALTH: " + tar.getHealth() + " / " + tar.getHealthMax() + newline;
|
||||
newOut += "MANA: " + tar.getMana() + " / " + tar.getManaMax() + newline;
|
||||
newOut += "STAMINA: " + tar.getStamina() + " / " + tar.getStaminaMax() + newline;
|
||||
newOut += "Unused Stats: " + tar.getUnusedStatPoints() + newline;
|
||||
newOut += "Stats Base (Modified)" + newline;
|
||||
newOut += " Str: " + (int) tar.statStrBase + " (" + tar.getStatStrCurrent() + ')' + ", maxStr: " + tar.getStrMax() + newline;
|
||||
newOut += " Dex: " + (int) tar.statDexBase + " (" + tar.getStatDexCurrent() + ')' + ", maxDex: " + tar.getDexMax() + newline;
|
||||
newOut += " Con: " + (int) tar.statConBase + " (" + tar.getStatConCurrent() + ')' + ", maxCon: " + tar.getConMax() + newline;
|
||||
newOut += " Int: " + (int) tar.statIntBase + " (" + tar.getStatIntCurrent() + ')' + ", maxInt: " + tar.getIntMax() + newline;
|
||||
newOut += " Spi: " + (int) tar.statSpiBase + " (" + tar.getStatSpiCurrent() + ')' + ", maxSpi: " + tar.getSpiMax() + newline;
|
||||
newOut += "Move Speed: " + tar.getSpeed() + newline;
|
||||
newOut += "Health Regen: " + tar.combatStats.healthRegen + newline;
|
||||
newOut += "Mana Regen: " + tar.combatStats.manaRegen + newline;
|
||||
newOut += "Stamina Regen: " + tar.combatStats.staminaRegen + newline;
|
||||
newOut += "DEFENSE: " + tar.combatStats.defense + newline;
|
||||
newOut += "HAND ONE" + newline;
|
||||
newOut += "ATR: " + tar.combatStats.atrHandOne + newline;
|
||||
newOut += "MIN: " + tar.combatStats.minDamageHandOne + newline;
|
||||
newOut += "MAX: " + tar.combatStats.maxDamageHandOne + newline;
|
||||
newOut += "RANGE: " + tar.combatStats.rangeHandOne + newline;
|
||||
newOut += "ATTACK SPEED: " + tar.combatStats.attackSpeedHandOne + newline;
|
||||
newOut += "HAND TWO" + newline;
|
||||
newOut += "ATR: " + tar.combatStats.atrHandTwo + newline;
|
||||
newOut += "MIN: " + tar.combatStats.minDamageHandTwo + newline;
|
||||
newOut += "MAX: " + tar.combatStats.maxDamageHandTwo + newline;
|
||||
newOut += "RANGE: " + tar.combatStats.rangeHandTwo + newline;
|
||||
newOut += "ATTACK SPEED: " + tar.combatStats.attackSpeedHandTwo + newline;
|
||||
newOut += "IS BOXED: " + tar.isBoxed + newline;
|
||||
newOut += "=== POWERS ===" + newline;
|
||||
for(CharacterPower power : pc.getPowers().values()){
|
||||
if(power.getPower().requiresHitRoll) {
|
||||
newOut += power.getPower().name + " ATR: " + Math.round(PlayerCombatStats.getSpellAtr(pc,power.getPower())) + newline;
|
||||
}
|
||||
}
|
||||
throwbackInfo(pc, newOut);
|
||||
}
|
||||
|
||||
public void printStatsMob(PlayerCharacter pc, Mob tar) {
|
||||
|
||||
@@ -59,7 +59,7 @@ public class PurgeObjectsCmd extends AbstractDevCmd {
|
||||
|
||||
|
||||
if (npc != null) {
|
||||
for (Mob mob : npc.siegeMinionMap.keySet()) {
|
||||
for (Mob mob : npc.getSiegeMinionMap().keySet()) {
|
||||
WorldGrid.RemoveWorldObject(mob);
|
||||
WorldGrid.removeObject(mob, pc);
|
||||
//Mob.getRespawnMap().remove(mob);
|
||||
@@ -151,7 +151,7 @@ public class PurgeObjectsCmd extends AbstractDevCmd {
|
||||
|
||||
|
||||
if (npc != null) {
|
||||
for (Mob mob : npc.siegeMinionMap.keySet()) {
|
||||
for (Mob mob : npc.getSiegeMinionMap().keySet()) {
|
||||
WorldGrid.RemoveWorldObject(mob);
|
||||
WorldGrid.removeObject(mob, pc);
|
||||
//Mob.getRespawnMap().remove(mob);
|
||||
|
||||
@@ -154,7 +154,7 @@ public class RemoveObjectCmd extends AbstractDevCmd {
|
||||
mobA = (Mob) ac;
|
||||
|
||||
if (npc != null) {
|
||||
for (Mob mob : npc.siegeMinionMap.keySet()) {
|
||||
for (Mob mob : npc.getSiegeMinionMap().keySet()) {
|
||||
WorldGrid.RemoveWorldObject(mob);
|
||||
WorldGrid.removeObject(mob, pc);
|
||||
//Mob.getRespawnMap().remove(mob);
|
||||
@@ -209,7 +209,7 @@ public class RemoveObjectCmd extends AbstractDevCmd {
|
||||
if (npc.building != null)
|
||||
npc.building.getHirelings().remove(npc);
|
||||
|
||||
for (Mob mob : npc.siegeMinionMap.keySet()) {
|
||||
for (Mob mob : npc.getSiegeMinionMap().keySet()) {
|
||||
WorldGrid.RemoveWorldObject(mob);
|
||||
WorldGrid.removeObject(mob, pc);
|
||||
if (mob.getParentZone() != null)
|
||||
|
||||
@@ -46,7 +46,7 @@ public class SetLevelCmd extends AbstractDevCmd {
|
||||
this.sendUsage(pc);
|
||||
return;
|
||||
}
|
||||
if (level < 1 || level > 75) {
|
||||
if (level < 1 || level > 80) {
|
||||
this.sendHelp(pc);
|
||||
return;
|
||||
}
|
||||
@@ -62,7 +62,7 @@ public class SetLevelCmd extends AbstractDevCmd {
|
||||
|
||||
@Override
|
||||
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-80";
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package engine.devcmd.cmds;
|
||||
|
||||
import engine.Enum;
|
||||
import engine.devcmd.AbstractDevCmd;
|
||||
import engine.gameManager.LootManager;
|
||||
import engine.gameManager.ZoneManager;
|
||||
@@ -10,6 +11,8 @@ import java.util.ArrayList;
|
||||
import java.util.concurrent.ThreadLocalRandom;
|
||||
|
||||
public class SimulateBootyCmd extends AbstractDevCmd {
|
||||
|
||||
public int simCount = 250;
|
||||
public SimulateBootyCmd() {
|
||||
super("bootysim");
|
||||
}
|
||||
@@ -24,8 +27,61 @@ public class SimulateBootyCmd extends AbstractDevCmd {
|
||||
String newline = "\r\n ";
|
||||
|
||||
String output;
|
||||
if(target.getObjectType().equals(Enum.GameObjectType.PlayerCharacter)){
|
||||
int ATR = Integer.parseInt(words[0]);
|
||||
int DEF = Integer.parseInt(words[1]);
|
||||
int attacks = Integer.parseInt(words[2]);
|
||||
|
||||
output = "Booty Simulation:" + newline;
|
||||
int hits = 0;
|
||||
int misses = 0;
|
||||
int defaultHits = 0;
|
||||
int defualtMisses = 0;
|
||||
|
||||
float chance = (ATR-((ATR+DEF) * 0.315f)) / ((DEF-((ATR+DEF) * 0.315f)) + (ATR-((ATR+DEF) * 0.315f)));
|
||||
float convertedChance = chance * 100;
|
||||
output = "" + newline;
|
||||
output += "DEF VS ATR SIMULATION: " + attacks + " ATTACKS SIMULATED" + newline;
|
||||
output += "DEF = " + DEF + newline;
|
||||
output += "ATR = " + ATR + newline;
|
||||
output += "CHANCE TO LAND HIT: " + convertedChance + "%" + newline;
|
||||
if(convertedChance < 5){
|
||||
output += "CHANCE ADJUSTED TO 5.0%" + newline;
|
||||
convertedChance = 5.0f;
|
||||
}
|
||||
if(convertedChance > 95){
|
||||
output += "CHANCE ADJUSTED TO 95.0%" + newline;
|
||||
convertedChance = 95.0f;
|
||||
}
|
||||
for(int i = 0; i < attacks; i++){
|
||||
int roll = ThreadLocalRandom.current().nextInt(101);
|
||||
|
||||
if(roll <= convertedChance){
|
||||
hits += 1;
|
||||
}else{
|
||||
misses += 1;
|
||||
}
|
||||
}
|
||||
|
||||
float totalHits = defaultHits + hits;
|
||||
float totalMisses = defualtMisses + misses;
|
||||
float hitPercent = Math.round(totalHits / attacks * 100);
|
||||
float missPercent = Math.round(totalMisses / attacks * 100);
|
||||
|
||||
output += "HITS LANDED: " + (defaultHits + hits) + "(" + Math.round(hitPercent) + "%)" + newline;
|
||||
output += "HITS MISSED: " + (defualtMisses + misses) + "(" + Math.round(missPercent) + "%)";
|
||||
|
||||
throwbackInfo(playerCharacter,output);
|
||||
return;
|
||||
}
|
||||
try
|
||||
{
|
||||
simCount = Integer.parseInt(words[0]);
|
||||
}catch(Exception e)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
output = "Booty Simulation: Rolls:" + simCount + newline;
|
||||
|
||||
Mob mob = (Mob) target;
|
||||
output += "Name: " + mob.getName() + newline;
|
||||
@@ -44,6 +100,7 @@ public class SimulateBootyCmd extends AbstractDevCmd {
|
||||
ArrayList<Item> Resources = new ArrayList<Item>();
|
||||
ArrayList<Item> Runes = new ArrayList<Item>();
|
||||
ArrayList<Item> Contracts = new ArrayList<Item>();
|
||||
ArrayList<Item> GuardContracts = new ArrayList<Item>();
|
||||
ArrayList<Item> Offerings = new ArrayList<Item>();
|
||||
ArrayList<Item> OtherDrops = new ArrayList<Item>();
|
||||
ArrayList<Item> EquipmentDrops = new ArrayList<Item>();
|
||||
@@ -51,14 +108,17 @@ public class SimulateBootyCmd extends AbstractDevCmd {
|
||||
int failures = 0;
|
||||
int goldAmount = 0;
|
||||
|
||||
for (int i = 0; i < 100; ++i) {
|
||||
for (int i = 0; i < simCount; ++i) {
|
||||
|
||||
try {
|
||||
mob.loadInventory();
|
||||
for (Item lootItem : mob.getCharItemManager().getInventory()) {
|
||||
switch (lootItem.getItemBase().getType()) {
|
||||
case CONTRACT: //CONTRACT
|
||||
Contracts.add(lootItem);
|
||||
if(lootItem.getName().contains("Captain"))
|
||||
GuardContracts.add(lootItem);
|
||||
else
|
||||
Contracts.add(lootItem);
|
||||
break;
|
||||
case OFFERING: //OFFERING
|
||||
Offerings.add(lootItem);
|
||||
@@ -130,9 +190,17 @@ public class SimulateBootyCmd extends AbstractDevCmd {
|
||||
}
|
||||
}
|
||||
|
||||
int baseBound = 100000;
|
||||
int levelPenalty = (int) (Math.max(0, Math.abs(50 - mob.level)) * 0.01 * 100000);
|
||||
int totalRange = baseBound + levelPenalty;
|
||||
if(mob.level >= 50){
|
||||
totalRange = baseBound;
|
||||
}
|
||||
output += "TOTAL ROLL POTENTIAL: " + totalRange + newline;
|
||||
output += "GLASS DROPS: " + GlassItems.size() + newline;
|
||||
output += "RUNE DROPS: " + Runes.size() + newline;
|
||||
output += "CONTRACTS DROPS: " + Contracts.size() + newline;
|
||||
output += "GUARD CONTRACTS DROPS: " + GuardContracts.size() + newline;
|
||||
output += "RESOURCE DROPS: " + Resources.size() + newline;
|
||||
output += "OFFERINGS DROPPED: " + Offerings.size() + newline;
|
||||
output += "ENCHANTED ITEMS DROPPED: " + OtherDrops.size() + newline;
|
||||
|
||||
@@ -110,7 +110,7 @@ public class SplatMobCmd extends AbstractDevCmd {
|
||||
|
||||
mobile = Mob.createMob(_mobileUUID,
|
||||
Vector3fImmutable.getRandomPointInCircle(_currentLocation, _targetRange),
|
||||
null, serverZone, null, null, "", 1);
|
||||
null, true, serverZone, null, 0, "", 1);
|
||||
|
||||
if (mobile != null) {
|
||||
mobile.updateDatabase();
|
||||
|
||||
@@ -11,7 +11,6 @@ package engine.devcmd.cmds;
|
||||
|
||||
import engine.Enum.GameObjectType;
|
||||
import engine.devcmd.AbstractDevCmd;
|
||||
import engine.gameManager.PowersManager;
|
||||
import engine.objects.AbstractGameObject;
|
||||
import engine.objects.Mob;
|
||||
import engine.objects.PlayerCharacter;
|
||||
@@ -57,41 +56,36 @@ public class aiInfoCmd extends AbstractDevCmd {
|
||||
Mob mob = (Mob) target;
|
||||
output = "Mob AI Information:" + newline;
|
||||
output += mob.getName() + newline;
|
||||
if (mob.behaviourType != null) {
|
||||
output += "BehaviourType: " + mob.behaviourType.toString() + newline;
|
||||
if (mob.behaviourType.BehaviourHelperType != null) {
|
||||
output += "Behaviour Helper Type: " + mob.behaviourType.BehaviourHelperType.toString() + newline;
|
||||
if (mob.BehaviourType != null) {
|
||||
output += "BehaviourType: " + mob.BehaviourType.toString() + newline;
|
||||
if (mob.BehaviourType.BehaviourHelperType != null) {
|
||||
output += "Behaviour Helper Type: " + mob.BehaviourType.BehaviourHelperType.toString() + newline;
|
||||
} else {
|
||||
output += "Behaviour Helper Type: NULL" + newline;
|
||||
}
|
||||
output += "Wimpy: " + mob.behaviourType.isWimpy + newline;
|
||||
output += "Agressive: " + mob.behaviourType.isAgressive + newline;
|
||||
output += "Can Roam: " + mob.behaviourType.canRoam + newline;
|
||||
output += "Calls For Help: " + mob.behaviourType.callsForHelp + newline;
|
||||
output += "Responds To Call For Help: " + mob.behaviourType.respondsToCallForHelp + newline;
|
||||
} else {
|
||||
output += "BehaviourType: NULL" + newline;
|
||||
}
|
||||
output += "Wimpy: " + mob.BehaviourType.isWimpy + newline;
|
||||
output += "Agressive: " + mob.BehaviourType.isAgressive + newline;
|
||||
output += "Can Roam: " + mob.BehaviourType.canRoam + newline;
|
||||
output += "Calls For Help: " + mob.BehaviourType.callsForHelp + newline;
|
||||
output += "Responds To Call For Help: " + mob.BehaviourType.respondsToCallForHelp + newline;
|
||||
} else {
|
||||
output += "BehaviourType: NULL" + newline;
|
||||
}
|
||||
output += "Aggro Range: " + mob.getAggroRange() + newline;
|
||||
output += "Player Aggro Map Size: " + mob.playerAgroMap.size() + newline;
|
||||
if (mob.playerAgroMap.size() > 0) {
|
||||
output += "Players Loaded:" + newline;
|
||||
}
|
||||
for (Map.Entry<Integer, Float> entry : mob.playerAgroMap.entrySet()) {
|
||||
output += "Player ID: " + entry.getKey() + " Hate Value: " + entry.getValue() + newline;
|
||||
for (Map.Entry<Integer, Boolean> entry : mob.playerAgroMap.entrySet()) {
|
||||
output += "Player ID: " + entry.getKey() + " Hate Value: " + (PlayerCharacter.getPlayerCharacter(entry.getKey())).getHateValue() + newline;
|
||||
}
|
||||
if (mob.getCombatTarget() != null)
|
||||
output += "Current Target: " + mob.getCombatTarget().getName() + newline;
|
||||
else
|
||||
output += "Current Target: NULL" + newline;
|
||||
|
||||
if (mob.guardedCity != null)
|
||||
output += "Patrolling: " + mob.guardedCity.getCityName() + newline;
|
||||
|
||||
output += "Powers:" + newline;
|
||||
|
||||
for (int token : mob.mobPowers.keySet())
|
||||
output += PowersManager.getPowerByToken(token).getName() + newline;
|
||||
output += token + newline;
|
||||
|
||||
throwbackInfo(playerCharacter, output);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,168 @@
|
||||
package engine.gameManager;
|
||||
|
||||
import engine.Enum;
|
||||
import engine.InterestManagement.WorldGrid;
|
||||
import engine.exception.MsgSendException;
|
||||
import engine.math.Vector3f;
|
||||
import engine.math.Vector3fImmutable;
|
||||
import engine.objects.*;
|
||||
import engine.server.MBServerStatics;
|
||||
import org.pmw.tinylog.Logger;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.concurrent.ThreadLocalRandom;
|
||||
|
||||
public class ArenaManager {
|
||||
private static final List<Arena> activeArenas = new ArrayList<>();
|
||||
public static final List<PlayerCharacter> playerQueue = new ArrayList<>();
|
||||
public static Long pulseDelay = 180000L;
|
||||
public static Long lastExecution = 0L;
|
||||
|
||||
public static void pulseArenas() {
|
||||
if(lastExecution == 0L){
|
||||
lastExecution = System.currentTimeMillis();
|
||||
}
|
||||
|
||||
if(activeArenas.isEmpty() && playerQueue.isEmpty())
|
||||
return;
|
||||
|
||||
Iterator<Arena> iterator = activeArenas.iterator();
|
||||
|
||||
while (iterator.hasNext()) {
|
||||
Arena arena = iterator.next();
|
||||
if (arena.checkToComplete()) {
|
||||
iterator.remove();
|
||||
}
|
||||
}
|
||||
|
||||
if(lastExecution + pulseDelay > System.currentTimeMillis())
|
||||
return;
|
||||
|
||||
lastExecution = System.currentTimeMillis();
|
||||
|
||||
while (playerQueue.size() > 1) {
|
||||
createArena();
|
||||
}
|
||||
}
|
||||
|
||||
public static void joinQueue(PlayerCharacter player) {
|
||||
if (!playerQueue.contains(player)) {
|
||||
playerQueue.add(player);
|
||||
}
|
||||
for(PlayerCharacter pc : playerQueue){
|
||||
if(pc.equals(player))
|
||||
continue;
|
||||
ChatManager.chatSystemInfo(pc, player.getName() + " has joined the arena que. There are now " + playerQueue.size() + " players queued.");
|
||||
}
|
||||
}
|
||||
|
||||
public static void leaveQueue(PlayerCharacter player) {
|
||||
playerQueue.remove(player);
|
||||
for(PlayerCharacter pc : playerQueue){
|
||||
if(pc.equals(player))
|
||||
continue;
|
||||
ChatManager.chatSystemInfo(pc, player.getName() + " has left the arena que. There are now " + playerQueue.size() + " players queued.");
|
||||
}
|
||||
}
|
||||
|
||||
private static void createArena() {
|
||||
if (playerQueue.size() > 1) {
|
||||
|
||||
Collections.shuffle(playerQueue);
|
||||
Arena newArena = new Arena();
|
||||
|
||||
//set starting time
|
||||
newArena.startTime = System.currentTimeMillis();
|
||||
|
||||
//decide an arena location
|
||||
newArena.loc = selectRandomArenaLocation();
|
||||
|
||||
// Assign players to the arena
|
||||
newArena.player1 = playerQueue.remove(0);
|
||||
newArena.player2 = playerQueue.remove(0);
|
||||
|
||||
// Teleport players to the arena location
|
||||
Zone sdr = ZoneManager.getZoneByUUID(656);
|
||||
MovementManager.translocate(newArena.player1, Vector3fImmutable.getRandomPointOnCircle(newArena.loc,75f), null);
|
||||
MovementManager.translocate(newArena.player2, Vector3fImmutable.getRandomPointOnCircle(newArena.loc,75f), null);
|
||||
|
||||
// Add the new arena to the active arenas list
|
||||
activeArenas.add(newArena);
|
||||
}
|
||||
}
|
||||
|
||||
public static void endArena(Arena arena, PlayerCharacter winner, PlayerCharacter loser, String condition){
|
||||
if (winner != null && loser != null) {
|
||||
Logger.info("[ARENA] The fight between {} and {} is concluded. Victor: {}",
|
||||
arena.player1.getName(), arena.player2.getName(), winner.getName());
|
||||
} else {
|
||||
Logger.info("[ARENA] The fight between {} and {} is concluded. No Winner Declared.",
|
||||
arena.player1.getName(), arena.player2.getName());
|
||||
}
|
||||
// Teleport players to the arena location
|
||||
Zone sdr = ZoneManager.getZoneByUUID(656);
|
||||
MovementManager.translocate(arena.player1, Vector3fImmutable.getRandomPointOnCircle(sdr.getLoc(),50f), null);
|
||||
MovementManager.translocate(arena.player2, Vector3fImmutable.getRandomPointOnCircle(sdr.getLoc(),50f), null);
|
||||
|
||||
|
||||
|
||||
activeArenas.remove(arena);
|
||||
|
||||
if(winner != null){
|
||||
ChatManager.chatPVP("[ARENA] " + winner.getName() + " has slain " + loser.getName() + " in the arena!");
|
||||
//handle prize distribution
|
||||
//ItemBase specialLoot = ItemBase.getItemBase(866);
|
||||
//Item promoted = new MobLoot(winner, specialLoot, 1, false).promoteToItem(winner);
|
||||
//promoted.setNumOfItems(21235);
|
||||
//promoted.setName("Special Banker(21235)");
|
||||
//DbManager.ItemQueries.UPDATE_NUM_ITEMS(promoted,21235);
|
||||
//winner.getCharItemManager().addItemToInventory(promoted);
|
||||
//winner.getCharItemManager().updateInventory();
|
||||
}
|
||||
}
|
||||
|
||||
public static Vector3fImmutable selectRandomArenaLocation() {
|
||||
boolean locSet = false;
|
||||
Vector3fImmutable loc = Vector3fImmutable.ZERO;
|
||||
|
||||
while (!locSet) {
|
||||
try {
|
||||
float x = ThreadLocalRandom.current().nextInt(114300, 123600);
|
||||
float z = ThreadLocalRandom.current().nextInt(82675, 91700);
|
||||
float y = 0; // Y coordinate is always 0
|
||||
|
||||
loc = new Vector3fImmutable(x, y, z * -1);
|
||||
HashSet<AbstractWorldObject> inRange = WorldGrid.getObjectsInRangePartial(loc,500f, MBServerStatics.MASK_PLAYER);
|
||||
if(inRange.isEmpty() && !isUnderWater(loc))
|
||||
locSet = true;
|
||||
//}
|
||||
}catch(Exception e){
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
return loc;
|
||||
}
|
||||
|
||||
public static boolean isUnderWater(Vector3fImmutable loc) {
|
||||
|
||||
try {
|
||||
|
||||
Zone zone = ZoneManager.findSmallestZone(loc);
|
||||
|
||||
if (zone.getSeaLevel() != 0) {
|
||||
|
||||
float localAltitude = loc.y;
|
||||
if (localAltitude < zone.getSeaLevel())
|
||||
return true;
|
||||
} else {
|
||||
if (loc.y < 0)
|
||||
return true;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -438,6 +438,18 @@ public enum BuildingManager {
|
||||
|
||||
public static boolean IsPlayerHostile(Building building, PlayerCharacter player) {
|
||||
|
||||
if(building.getBlueprint() != null && building.getBlueprint().getBuildingGroup() != null && building.getBlueprint().getBuildingGroup().equals(BuildingGroup.BANESTONE))
|
||||
{
|
||||
Guild playerNation = player.guild.getNation();
|
||||
City banedCity = ZoneManager.getCityAtLocation(building.loc);
|
||||
if(banedCity != null){
|
||||
if(banedCity.getGuild().getNation().equals(playerNation)){
|
||||
return false;
|
||||
}else{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
//Nation Members and Guild members are not hostile.
|
||||
// if (building.getGuild() != null){
|
||||
// if (pc.getGuild() != null)
|
||||
@@ -520,7 +532,30 @@ public enum BuildingManager {
|
||||
if (building.getBlueprintUUID() == 0)
|
||||
return false;
|
||||
|
||||
if (building.getBlueprint().getMaxSlots() == building.getHirelings().size())
|
||||
if(building.getBlueprint().getBuildingGroup().equals(BuildingGroup.TOL)){
|
||||
if(contract.getContractID() == 850) {
|
||||
boolean hasRunemaster = false;
|
||||
for (AbstractCharacter npc : building.getHirelings().keySet()) {
|
||||
|
||||
if (npc.getObjectType() != GameObjectType.NPC)
|
||||
continue;
|
||||
|
||||
if(npc.contractUUID == 850)
|
||||
hasRunemaster = true;
|
||||
}
|
||||
|
||||
if(hasRunemaster)
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int maxSlots = building.getBlueprint().getMaxSlots();
|
||||
if(building.getBlueprint().getBuildingGroup() != null) {
|
||||
maxSlots = building.getBlueprint().getSlotsForRank(building.getRank());
|
||||
}
|
||||
|
||||
if (maxSlots == building.getHirelings().size())
|
||||
return false;
|
||||
|
||||
String pirateName = NPCManager.getPirateName(contract.getMobbaseID());
|
||||
@@ -535,7 +570,7 @@ public enum BuildingManager {
|
||||
|
||||
if (NPC.ISWallArcher(contract)) {
|
||||
|
||||
mob = Mob.createMob(contract.getMobbaseID(), Vector3fImmutable.ZERO, contractOwner.getGuild(), zone, building, contract, pirateName, rank);
|
||||
mob = Mob.createMob(contract.getMobbaseID(), Vector3fImmutable.ZERO, contractOwner.getGuild(), true, zone, building, contract.getContractID(), pirateName, rank);
|
||||
|
||||
if (mob == null)
|
||||
return false;
|
||||
@@ -547,7 +582,7 @@ public enum BuildingManager {
|
||||
|
||||
if (NPC.ISGuardCaptain(contract.getContractID())) {
|
||||
|
||||
mob = Mob.createMob(contract.getMobbaseID(), Vector3fImmutable.ZERO, contractOwner.getGuild(), zone, building, contract, pirateName, rank);
|
||||
mob = Mob.createMob(contract.getMobbaseID(), Vector3fImmutable.ZERO, contractOwner.getGuild(), true, zone, building, contract.getContractID(), pirateName, rank);
|
||||
|
||||
if (mob == null)
|
||||
return false;
|
||||
@@ -559,7 +594,7 @@ public enum BuildingManager {
|
||||
if (contract.getContractID() == 910) {
|
||||
|
||||
//guard dog
|
||||
mob = Mob.createMob(contract.getMobbaseID(), Vector3fImmutable.ZERO, contractOwner.getGuild(), zone, building, contract, pirateName, rank);
|
||||
mob = Mob.createMob(contract.getMobbaseID(), Vector3fImmutable.ZERO, contractOwner.getGuild(), true, zone, building, contract.getContractID(), pirateName, rank);
|
||||
|
||||
if (mob == null)
|
||||
return false;
|
||||
|
||||
@@ -27,6 +27,7 @@ import engine.objects.*;
|
||||
import engine.server.MBServerStatics;
|
||||
import engine.server.world.WorldServer;
|
||||
import engine.session.Session;
|
||||
import engine.util.KeyCloneAudit;
|
||||
import org.pmw.tinylog.Logger;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -84,6 +85,15 @@ public enum ChatManager {
|
||||
if ((checkTime > 0L) && (curMsgTime - checkTime < FLOOD_TIME_THRESHOLD))
|
||||
isFlood = true;
|
||||
|
||||
if(KeyCloneAudit.auditChatMsg(pc,msg.getMessage())){
|
||||
return;
|
||||
}
|
||||
|
||||
if(msg.getMessage().equalsIgnoreCase("./zerg")){
|
||||
ZergManager.PrintDetailsToClient(pc);
|
||||
return;
|
||||
}
|
||||
|
||||
switch (protocolMsg) {
|
||||
case CHATSAY:
|
||||
ChatManager.chatSay(pc, msg.getMessage(), isFlood);
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
|
||||
package engine.gameManager;
|
||||
|
||||
import engine.Enum;
|
||||
import engine.Enum.*;
|
||||
import engine.exception.MsgSendException;
|
||||
import engine.job.JobContainer;
|
||||
@@ -26,7 +27,6 @@ import engine.powers.effectmodifiers.WeaponProcEffectModifier;
|
||||
import engine.server.MBServerStatics;
|
||||
import org.pmw.tinylog.Logger;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.ThreadLocalRandom;
|
||||
|
||||
@@ -301,6 +301,21 @@ public enum CombatManager {
|
||||
if (target == null)
|
||||
return 0;
|
||||
|
||||
//pet to assist in attacking target
|
||||
if(abstractCharacter.getObjectType().equals(GameObjectType.PlayerCharacter)){
|
||||
PlayerCharacter attacker = (PlayerCharacter)abstractCharacter;
|
||||
if(attacker.combatStats == null){
|
||||
attacker.combatStats = new PlayerCombatStats(attacker);
|
||||
}
|
||||
if(attacker.getPet() != null){
|
||||
Mob pet = attacker.getPet();
|
||||
if(pet.combatTarget == null && pet.assist)
|
||||
pet.setCombatTarget(attacker.combatTarget);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
//target must be valid type
|
||||
|
||||
if (AbstractWorldObject.IsAbstractCharacter(target)) {
|
||||
@@ -316,10 +331,13 @@ public enum CombatManager {
|
||||
else if (!tar.isActive())
|
||||
return 0;
|
||||
|
||||
if (target.getObjectType().equals(GameObjectType.PlayerCharacter) && abstractCharacter.getObjectType().equals(GameObjectType.PlayerCharacter) && abstractCharacter.getTimers().get("Attack" + slot) == null)
|
||||
if (target.getObjectType().equals(GameObjectType.PlayerCharacter) && abstractCharacter.getObjectType().equals(GameObjectType.PlayerCharacter) && abstractCharacter.getTimers().get("Attack" + slot) == null) {
|
||||
if(((PlayerCharacter)target).combatStats == null){
|
||||
((PlayerCharacter)target).combatStats = new PlayerCombatStats(((PlayerCharacter)target));
|
||||
}
|
||||
if (!((PlayerCharacter) abstractCharacter).canSee((PlayerCharacter) target))
|
||||
return 0;
|
||||
|
||||
}
|
||||
//must not be immune to all or immune to attack
|
||||
|
||||
Resists res = tar.getResists();
|
||||
@@ -414,7 +432,10 @@ public enum CombatManager {
|
||||
|
||||
//Source can attack.
|
||||
//NOTE Don't 'return;' beyond this point until timer created
|
||||
|
||||
if(abstractCharacter.getObjectType().equals(GameObjectType.PlayerCharacter)){
|
||||
PlayerCharacter pc = (PlayerCharacter)abstractCharacter;
|
||||
pc.updateMovementState();
|
||||
}
|
||||
boolean attackFailure = (wb != null) && (wb.getRange() > 35f) && abstractCharacter.isMoving();
|
||||
|
||||
//Target can't attack on move with ranged weapons.
|
||||
@@ -452,6 +473,28 @@ public enum CombatManager {
|
||||
|
||||
//Range check.
|
||||
|
||||
//if(abstractCharacter.isMoving()){
|
||||
// range += (abstractCharacter.getSpeed() * 0.1f); // add movement vector offset for moving attacker
|
||||
//}
|
||||
|
||||
//if(AbstractWorldObject.IsAbstractCharacter(target)) {
|
||||
// AbstractCharacter tarAc = (AbstractCharacter) target;
|
||||
// if(tarAc != null && tarAc.isMoving()){
|
||||
// range += (tarAc.getSpeed() * 0.1f); // add movement vector offset for moving target
|
||||
// }
|
||||
//}
|
||||
|
||||
//float attackerHitBox = abstractCharacter.calcHitBox(); // add attacker hitbox
|
||||
//float targetHitBox = 0.0f;
|
||||
//if(AbstractCharacter.IsAbstractCharacter(target)){
|
||||
// AbstractCharacter targetCharacter = (AbstractCharacter)target;
|
||||
// targetHitBox = targetCharacter.calcHitBox(); // add target hitbox
|
||||
//}
|
||||
|
||||
//range += attackerHitBox + targetHitBox + 2.5f; // offset standard range to sync where client tries to stop
|
||||
|
||||
range += 2; //sync offset
|
||||
|
||||
if (NotInRange(abstractCharacter, target, range)) {
|
||||
|
||||
//target is in stealth and can't be seen by source
|
||||
@@ -475,6 +518,16 @@ public enum CombatManager {
|
||||
}
|
||||
}
|
||||
|
||||
if(abstractCharacter.getObjectType().equals(GameObjectType.PlayerCharacter)){
|
||||
PlayerCharacter pc = (PlayerCharacter)abstractCharacter;
|
||||
if(pc.isBoxed){
|
||||
if(target.getObjectType().equals(GameObjectType.PlayerCharacter)) {
|
||||
ChatManager.chatSystemInfo(pc, "You Are PvE Flagged: Cannot Attack Players.");
|
||||
attackFailure = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//TODO Verify attacker has los (if not ranged weapon).
|
||||
|
||||
if (!attackFailure) {
|
||||
@@ -483,16 +536,24 @@ public enum CombatManager {
|
||||
createTimer(abstractCharacter, slot, 20, true); //2 second for no weapon
|
||||
else {
|
||||
int wepSpeed = (int) (wb.getSpeed());
|
||||
if(abstractCharacter.getObjectType().equals(GameObjectType.PlayerCharacter)){
|
||||
PlayerCharacter pc = (PlayerCharacter)abstractCharacter;
|
||||
if(slot == 1){
|
||||
wepSpeed = (int) pc.combatStats.attackSpeedHandOne;
|
||||
}else{
|
||||
wepSpeed = (int) pc.combatStats.attackSpeedHandTwo;
|
||||
}
|
||||
}else {
|
||||
|
||||
if (weapon != null && weapon.getBonusPercent(ModType.WeaponSpeed, SourceType.None) != 0f) //add weapon speed bonus
|
||||
wepSpeed *= (1 + weapon.getBonus(ModType.WeaponSpeed, SourceType.None));
|
||||
if (weapon != null && weapon.getBonusPercent(ModType.WeaponSpeed, SourceType.None) != 0f) //add weapon speed bonus
|
||||
wepSpeed *= (1 + weapon.getBonus(ModType.WeaponSpeed, SourceType.None));
|
||||
|
||||
if (abstractCharacter.getBonuses() != null && abstractCharacter.getBonuses().getFloatPercentAll(ModType.AttackDelay, SourceType.None) != 0f) //add effects speed bonus
|
||||
wepSpeed *= (1 + abstractCharacter.getBonuses().getFloatPercentAll(ModType.AttackDelay, SourceType.None));
|
||||
|
||||
if (wepSpeed < 10)
|
||||
wepSpeed = 10; //Old was 10, but it can be reached lower with legit buffs,effects.
|
||||
if (abstractCharacter.getBonuses() != null && abstractCharacter.getBonuses().getFloatPercentAll(ModType.AttackDelay, SourceType.None) != 0f) //add effects speed bonus
|
||||
wepSpeed *= (1 + abstractCharacter.getBonuses().getFloatPercentAll(ModType.AttackDelay, SourceType.None));
|
||||
|
||||
if (wepSpeed < 10)
|
||||
wepSpeed = 10; //Old was 10, but it can be reached lower with legit buffs,effects.
|
||||
}
|
||||
createTimer(abstractCharacter, slot, wepSpeed, true);
|
||||
}
|
||||
|
||||
@@ -537,14 +598,32 @@ public enum CombatManager {
|
||||
if (target == null)
|
||||
return;
|
||||
|
||||
if (mainHand) {
|
||||
atr = ac.getAtrHandOne();
|
||||
minDamage = ac.getMinDamageHandOne();
|
||||
maxDamage = ac.getMaxDamageHandOne();
|
||||
} else {
|
||||
atr = ac.getAtrHandTwo();
|
||||
minDamage = ac.getMinDamageHandTwo();
|
||||
maxDamage = ac.getMaxDamageHandTwo();
|
||||
if(ac.getObjectType().equals(GameObjectType.PlayerCharacter)){
|
||||
PlayerCharacter pc = (PlayerCharacter) ac;
|
||||
if( pc.combatStats == null){
|
||||
pc.combatStats = new PlayerCombatStats(pc);
|
||||
}
|
||||
pc.combatStats.calculateATR(true);
|
||||
pc.combatStats.calculateATR(false);
|
||||
if (mainHand) {
|
||||
atr = pc.combatStats.atrHandOne;
|
||||
minDamage = pc.combatStats.minDamageHandOne;
|
||||
maxDamage = pc.combatStats.maxDamageHandOne;
|
||||
} else {
|
||||
atr = pc.combatStats.atrHandTwo;
|
||||
minDamage = pc.combatStats.minDamageHandTwo;
|
||||
maxDamage = pc.combatStats.maxDamageHandTwo;
|
||||
}
|
||||
}else {
|
||||
if (mainHand) {
|
||||
atr = ac.getAtrHandOne();
|
||||
minDamage = ac.getMinDamageHandOne();
|
||||
maxDamage = ac.getMaxDamageHandOne();
|
||||
} else {
|
||||
atr = ac.getAtrHandTwo();
|
||||
minDamage = ac.getMinDamageHandTwo();
|
||||
maxDamage = ac.getMaxDamageHandTwo();
|
||||
}
|
||||
}
|
||||
|
||||
boolean tarIsRat = false;
|
||||
@@ -638,7 +717,15 @@ public enum CombatManager {
|
||||
}
|
||||
} else {
|
||||
AbstractCharacter tar = (AbstractCharacter) target;
|
||||
defense = tar.getDefenseRating();
|
||||
if(tar.getObjectType().equals(GameObjectType.PlayerCharacter)){
|
||||
if(((PlayerCharacter)tar).combatStats == null){
|
||||
((PlayerCharacter)tar).combatStats = new PlayerCombatStats((PlayerCharacter)tar);
|
||||
}
|
||||
((PlayerCharacter)tar).combatStats.calculateDefense();
|
||||
defense = ((PlayerCharacter)tar).combatStats.defense;
|
||||
}else {
|
||||
defense = tar.getDefenseRating();
|
||||
}
|
||||
handleRetaliate(tar, ac); //Handle target attacking back if in combat and has no other target
|
||||
}
|
||||
|
||||
@@ -646,24 +733,24 @@ public enum CombatManager {
|
||||
|
||||
//Get hit chance
|
||||
|
||||
int chance;
|
||||
float dif = atr - defense;
|
||||
//int chance;
|
||||
//float dif = atr - defense;
|
||||
|
||||
if (dif > 100)
|
||||
chance = 94;
|
||||
else if (dif < -100)
|
||||
chance = 4;
|
||||
else
|
||||
chance = (int) ((0.45 * dif) + 49);
|
||||
//if (dif > 100)
|
||||
// chance = 94;
|
||||
//else if (dif < -100)
|
||||
// chance = 4;
|
||||
//else
|
||||
// chance = (int) ((0.45 * dif) + 49);
|
||||
|
||||
errorTrack = 5;
|
||||
|
||||
//calculate hit/miss
|
||||
|
||||
int roll = ThreadLocalRandom.current().nextInt(100);
|
||||
DeferredPowerJob dpj = null;
|
||||
|
||||
if (roll < chance) {
|
||||
boolean hitLanded = LandHit((int)atr,(int)defense);
|
||||
if (hitLanded) {
|
||||
|
||||
if (ac.getObjectType().equals(GameObjectType.PlayerCharacter))
|
||||
updateAttackTimers((PlayerCharacter) ac, target, true);
|
||||
@@ -692,7 +779,25 @@ public enum CombatManager {
|
||||
|
||||
PlayerBonuses bonus = ac.getBonuses();
|
||||
float attackRange = getWeaponRange(wb, bonus);
|
||||
dpj.attack(target, attackRange);
|
||||
|
||||
if(ac.isMoving()){
|
||||
attackRange += (ac.getSpeed() * 0.1f);
|
||||
}
|
||||
|
||||
if(AbstractWorldObject.IsAbstractCharacter(target)) {
|
||||
//AbstractCharacter tarAc = (AbstractCharacter) target;
|
||||
if(tarAc != null && tarAc.isMoving()){
|
||||
attackRange += (tarAc.getSpeed() * 0.1f);
|
||||
}
|
||||
}
|
||||
|
||||
if(specialCaseHitRoll(dpj.getPowerToken())) {
|
||||
if(hitLanded) {
|
||||
dpj.attack(target, attackRange);
|
||||
}
|
||||
}else{
|
||||
dpj.attack(target, attackRange);
|
||||
}
|
||||
|
||||
if (dpj.getPower() != null && (dpj.getPowerToken() == -1851459567 || dpj.getPowerToken() == -1851489518))
|
||||
((PlayerCharacter) ac).setWeaponPower(dpj);
|
||||
@@ -707,7 +812,25 @@ public enum CombatManager {
|
||||
|
||||
if (dpj != null && dpj.getPower() != null && (dpj.getPowerToken() == -1851459567 || dpj.getPowerToken() == -1851489518)) {
|
||||
float attackRange = getWeaponRange(wb, bonuses);
|
||||
dpj.attack(target, attackRange);
|
||||
|
||||
if(ac.isMoving()){
|
||||
attackRange += (ac.getSpeed() * 0.1f);
|
||||
}
|
||||
|
||||
if(AbstractWorldObject.IsAbstractCharacter(target)) {
|
||||
//AbstractCharacter tarAc = (AbstractCharacter) target;
|
||||
if(tarAc != null && tarAc.isMoving()){
|
||||
attackRange += (tarAc.getSpeed() * 0.1f);
|
||||
}
|
||||
}
|
||||
|
||||
if(specialCaseHitRoll(dpj.getPowerToken())) {
|
||||
if(hitLanded) {
|
||||
dpj.attack(target, attackRange);
|
||||
}
|
||||
}else{
|
||||
dpj.attack(target, attackRange);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -814,8 +937,28 @@ public enum CombatManager {
|
||||
else
|
||||
damage = calculateDamage(ac, tarAc, minDamage, maxDamage, damageType, resists);
|
||||
|
||||
if(weapon != null && weapon.effects != null){
|
||||
float armorPierce = 0;
|
||||
for(Effect eff : weapon.effects.values()){
|
||||
for(AbstractEffectModifier mod : eff.getEffectModifiers()){
|
||||
if(mod.modType.equals(ModType.ArmorPiercing)){
|
||||
armorPierce += mod.getPercentMod() + (mod.getRamp() * eff.getTrains());
|
||||
}
|
||||
}
|
||||
}
|
||||
if(armorPierce > 0){
|
||||
damage *= 1 + (armorPierce * 0.01f);
|
||||
}
|
||||
}
|
||||
//Resists.handleFortitude(tarAc,damageType,damage);
|
||||
|
||||
float d = 0f;
|
||||
|
||||
int originalDamage = (int)damage;
|
||||
if(ac != null && ac.getObjectType().equals(GameObjectType.PlayerCharacter)){
|
||||
damage *= ((PlayerCharacter)ac).ZergMultiplier;
|
||||
} // Health modifications are modified by the ZergMechanic
|
||||
|
||||
errorTrack = 12;
|
||||
|
||||
//Subtract Damage from target's health
|
||||
@@ -826,13 +969,18 @@ public enum CombatManager {
|
||||
damage *= 2.5f; //increase damage if sitting
|
||||
|
||||
if (tarAc.getObjectType() == GameObjectType.Mob) {
|
||||
if(ac.getObjectType().equals(GameObjectType.PlayerCharacter))
|
||||
((Mob)tarAc).playerAgroMap.put(ac.getObjectUUID(), ((Mob) tarAc).playerAgroMap.get(ac.getObjectUUID()) + damage);
|
||||
ac.setHateValue(damage * MBServerStatics.PLAYER_COMBAT_HATE_MODIFIER);
|
||||
((Mob) tarAc).handleDirectAggro(ac);
|
||||
}
|
||||
|
||||
if (tarAc.getHealth() > 0)
|
||||
if (tarAc.getHealth() > 0) {
|
||||
d = tarAc.modifyHealth(-damage, ac, false);
|
||||
if(tarAc != null && tarAc.getObjectType().equals(GameObjectType.PlayerCharacter) && ((PlayerCharacter)ac).ZergMultiplier != 1.0f){
|
||||
PlayerCharacter debugged = (PlayerCharacter)tarAc;
|
||||
ChatManager.chatSystemInfo(debugged, "ZERG DEBUG: " + ac.getName() + " Hits You For: " + (int)damage + " instead of " + originalDamage);
|
||||
}
|
||||
}
|
||||
|
||||
tarAc.cancelOnTakeDamage();
|
||||
|
||||
} else if (target.getObjectType().equals(GameObjectType.Building)) {
|
||||
|
||||
@@ -864,35 +1012,7 @@ public enum CombatManager {
|
||||
errorTrack = 14;
|
||||
|
||||
//handle procs
|
||||
|
||||
if (weapon != null && tarAc != null && tarAc.isAlive()) {
|
||||
|
||||
ConcurrentHashMap<String, Effect> effects = weapon.getEffects();
|
||||
|
||||
for (Effect eff : effects.values()) {
|
||||
if (eff == null)
|
||||
continue;
|
||||
|
||||
HashSet<AbstractEffectModifier> aems = eff.getEffectModifiers();
|
||||
|
||||
if (aems != null) {
|
||||
for (AbstractEffectModifier aem : aems) {
|
||||
|
||||
if (!tarAc.isAlive())
|
||||
break;
|
||||
|
||||
if (aem instanceof WeaponProcEffectModifier) {
|
||||
|
||||
int procChance = ThreadLocalRandom.current().nextInt(100);
|
||||
|
||||
if (procChance < MBServerStatics.PROC_CHANCE)
|
||||
((WeaponProcEffectModifier) aem).applyProc(ac, target);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
procChanceHandler(weapon,ac,tarAc);
|
||||
|
||||
errorTrack = 15;
|
||||
|
||||
@@ -901,6 +1021,16 @@ public enum CombatManager {
|
||||
if (ac.isAlive() && tarAc != null && tarAc.isAlive())
|
||||
handleDamageShields(ac, tarAc, damage);
|
||||
|
||||
//handle mob hate values
|
||||
if(target.getObjectType().equals(GameObjectType.Mob) && ac.getObjectType().equals(GameObjectType.PlayerCharacter)){
|
||||
Mob mobTarget = (Mob)target;
|
||||
if(mobTarget.hate_values.containsKey((PlayerCharacter) ac)){
|
||||
mobTarget.hate_values.put((PlayerCharacter) ac,mobTarget.hate_values.get((PlayerCharacter) ac) + damage);
|
||||
}else{
|
||||
mobTarget.hate_values.put((PlayerCharacter) ac, damage);
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
// Apply Weapon power effect if any.
|
||||
@@ -916,7 +1046,26 @@ public enum CombatManager {
|
||||
if (wp.requiresHitRoll() == false) {
|
||||
PlayerBonuses bonus = ac.getBonuses();
|
||||
float attackRange = getWeaponRange(wb, bonus);
|
||||
dpj.attack(target, attackRange);
|
||||
|
||||
if(ac.isMoving()){
|
||||
attackRange += (ac.getSpeed() * 0.1f);
|
||||
}
|
||||
|
||||
if(AbstractWorldObject.IsAbstractCharacter(target)) {
|
||||
AbstractCharacter tarAc = (AbstractCharacter) target;
|
||||
if(tarAc != null && tarAc.isMoving()){
|
||||
attackRange += (tarAc.getSpeed() * 0.1f);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if(specialCaseHitRoll(dpj.getPowerToken())) {
|
||||
if(hitLanded) {
|
||||
dpj.attack(target, attackRange);
|
||||
}
|
||||
}else{
|
||||
dpj.attack(target, attackRange);
|
||||
}
|
||||
} else
|
||||
((PlayerCharacter) ac).setWeaponPower(null);
|
||||
}
|
||||
@@ -947,6 +1096,41 @@ public enum CombatManager {
|
||||
}
|
||||
}
|
||||
|
||||
private static void procChanceHandler(Item weapon, AbstractCharacter ac, AbstractCharacter tarAc) {
|
||||
|
||||
//no weapon means no proc
|
||||
if(weapon == null)
|
||||
return;
|
||||
|
||||
//caster is dead of null, no proc
|
||||
if(ac == null || !ac.isAlive())
|
||||
return;
|
||||
|
||||
//target is dead or null, no proc
|
||||
if(tarAc == null || !tarAc.isAlive())
|
||||
return;
|
||||
|
||||
//no effects on weapon, skip proc
|
||||
if(weapon.effects == null || weapon.effects.isEmpty())
|
||||
return;
|
||||
|
||||
for (Effect eff : weapon.effects.values()){
|
||||
for(AbstractEffectModifier mod : eff.getEffectModifiers()) {
|
||||
if (mod.modType.equals(ModType.WeaponProc)) {
|
||||
int procChance = ThreadLocalRandom.current().nextInt(100);
|
||||
if (procChance < MBServerStatics.PROC_CHANCE) {
|
||||
try {
|
||||
((WeaponProcEffectModifier) mod).applyProc(ac, tarAc);
|
||||
break;
|
||||
} catch (Exception e) {
|
||||
Logger.error(eff.getName() + " Failed To Cast Proc");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean canTestParry(AbstractCharacter ac, AbstractWorldObject target) {
|
||||
|
||||
if (ac == null || target == null || !AbstractWorldObject.IsAbstractCharacter(target))
|
||||
@@ -965,6 +1149,12 @@ public enum CombatManager {
|
||||
Item tarMain = tarItem.getItemFromEquipped(1);
|
||||
Item tarOff = tarItem.getItemFromEquipped(2);
|
||||
|
||||
if(target.getObjectType().equals(GameObjectType.PlayerCharacter)){
|
||||
PlayerCharacter pc = (PlayerCharacter) target;
|
||||
if(pc.getRaceID() == 1999 && !isRanged(acMain) && !isRanged(acOff))
|
||||
return true;
|
||||
}
|
||||
|
||||
return !isRanged(acMain) && !isRanged(acOff) && !isRanged(tarMain) && !isRanged(tarOff);
|
||||
}
|
||||
|
||||
@@ -1023,10 +1213,12 @@ public enum CombatManager {
|
||||
|
||||
//calculate resists in if any
|
||||
|
||||
|
||||
|
||||
if (resists != null)
|
||||
return resists.getResistedDamage(source, target, damageType, damage, 0);
|
||||
else
|
||||
return damage;
|
||||
damage = resists.getResistedDamage(source, target, damageType, damage, 0);
|
||||
|
||||
return damage;
|
||||
}
|
||||
|
||||
private static void sendPassiveDefenseMessage(AbstractCharacter source, ItemBase wb, AbstractWorldObject target, int passiveType, DeferredPowerJob dpj, boolean mainHand) {
|
||||
@@ -1176,6 +1368,14 @@ public enum CombatManager {
|
||||
|
||||
private static boolean testPassive(AbstractCharacter source, AbstractCharacter target, String type) {
|
||||
|
||||
if(target.getBonuses() != null)
|
||||
if(target.getBonuses().getBool(ModType.Stunned, SourceType.None))
|
||||
return false;
|
||||
|
||||
if(source.getBonuses() != null)
|
||||
if(source.getBonuses().getBool(ModType.IgnorePassiveDefense, SourceType.None))
|
||||
return false;
|
||||
|
||||
float chance = target.getPassiveChance(type, source.getLevel(), true);
|
||||
|
||||
if (chance == 0f)
|
||||
@@ -1186,7 +1386,7 @@ public enum CombatManager {
|
||||
if (chance > 75f)
|
||||
chance = 75f;
|
||||
|
||||
int roll = ThreadLocalRandom.current().nextInt(100);
|
||||
int roll = ThreadLocalRandom.current().nextInt(1,100);
|
||||
|
||||
return roll < chance;
|
||||
|
||||
@@ -1238,14 +1438,17 @@ public enum CombatManager {
|
||||
DispatchMessage.dispatchMsgToInterestArea(pc, rwss, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, false, false);
|
||||
}
|
||||
|
||||
private static void toggleSit(boolean toggle, ClientConnection origin) {
|
||||
public static void toggleSit(boolean toggle, ClientConnection origin) {
|
||||
|
||||
PlayerCharacter pc = SessionManager.getPlayerCharacter(origin);
|
||||
|
||||
if (pc == null)
|
||||
return;
|
||||
|
||||
pc.setSit(toggle);
|
||||
if(pc.isFlying())
|
||||
pc.setSit(false);
|
||||
else
|
||||
pc.setSit(toggle);
|
||||
|
||||
UpdateStateMsg rwss = new UpdateStateMsg();
|
||||
rwss.setPlayer(pc);
|
||||
@@ -1323,6 +1526,13 @@ public enum CombatManager {
|
||||
return;
|
||||
|
||||
retaliater.setCombatTarget(ac);
|
||||
if(retaliater.isPlayerGuard && (retaliater.BehaviourType.equals(MobBehaviourType.GuardMinion) || retaliater.BehaviourType.equals(MobBehaviourType.GuardCaptain))){
|
||||
for(Mob guard : retaliater.guardedCity.getParent().zoneMobSet){
|
||||
if(guard.isPlayerGuard && guard.combatTarget == null){
|
||||
guard.setCombatTarget(ac);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1354,9 +1564,9 @@ public enum CombatManager {
|
||||
|
||||
Resists resists = ac.getResists();
|
||||
|
||||
if (resists != null)
|
||||
if (resists != null) {
|
||||
amount = resists.getResistedDamage(target, ac, ds.getDamageType(), amount, 0);
|
||||
|
||||
}
|
||||
total += amount;
|
||||
}
|
||||
|
||||
@@ -1439,4 +1649,31 @@ public enum CombatManager {
|
||||
((AbstractCharacter) awo).getCharItemManager().damageRandomArmor(1);
|
||||
}
|
||||
|
||||
public static boolean LandHit(int ATR, int DEF){
|
||||
|
||||
//float chance = (ATR-((ATR+DEF) * 0.315f)) / ((DEF-((ATR+DEF) * 0.315f)) + (ATR-((ATR+DEF) * 0.315f)));
|
||||
//float convertedChance = chance * 100;
|
||||
|
||||
int roll = ThreadLocalRandom.current().nextInt(101);
|
||||
|
||||
//if(roll <= 5)//always 5% chance to miss
|
||||
// return false;
|
||||
|
||||
//if(roll >= 95)//always 5% chance to hit
|
||||
// return true;
|
||||
|
||||
float chance = PlayerCombatStats.getHitChance(ATR,DEF);
|
||||
return chance >= roll;
|
||||
}
|
||||
|
||||
public static boolean specialCaseHitRoll(int powerID){
|
||||
switch(powerID) {
|
||||
case 563200808: // Naargal's Bite
|
||||
case 563205337: // Naargal's Dart
|
||||
case 563205930: // Sword of Saint Malorn
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -65,6 +65,7 @@ public enum ConfigManager {
|
||||
MB_WORLD_MAINTENANCE,
|
||||
MB_WORLD_GREETING,
|
||||
MB_WORLD_KEYCLONE_MAX,
|
||||
MB_WORLD_TESTMODE,
|
||||
MB_USE_RUINS,
|
||||
|
||||
// Mobile AI modifiers
|
||||
@@ -97,7 +98,8 @@ public enum ConfigManager {
|
||||
MB_MAGICBOT_FORTOFIX,
|
||||
MB_MAGICBOT_RECRUIT,
|
||||
MB_MAGICBOT_MAGICBOX,
|
||||
MB_MAGICBOT_ADMINLOG;
|
||||
MB_MAGICBOT_ADMINLOG,
|
||||
MB_WORLD_BOXLIMIT;
|
||||
|
||||
// Map to hold our config pulled in from the environment
|
||||
// We also use the config to point to the current message pump
|
||||
|
||||
@@ -56,6 +56,7 @@ public enum DevCmdManager {
|
||||
DevCmdManager.registerDevCmd(new PrintResistsCmd());
|
||||
DevCmdManager.registerDevCmd(new PrintLocationCmd());
|
||||
DevCmdManager.registerDevCmd(new InfoCmd());
|
||||
DevCmdManager.registerDevCmd(new PrintEffectsCmd());
|
||||
DevCmdManager.registerDevCmd(new aiInfoCmd());
|
||||
DevCmdManager.registerDevCmd(new SimulateBootyCmd());
|
||||
DevCmdManager.registerDevCmd(new GetHeightCmd());
|
||||
@@ -79,13 +80,13 @@ public enum DevCmdManager {
|
||||
DevCmdManager.registerDevCmd(new AddGoldCmd());
|
||||
DevCmdManager.registerDevCmd(new ZoneInfoCmd());
|
||||
DevCmdManager.registerDevCmd(new DebugMeleeSyncCmd());
|
||||
DevCmdManager.registerDevCmd(new HotzoneCmd());
|
||||
DevCmdManager.registerDevCmd(new MineActiveCmd());
|
||||
// Dev
|
||||
DevCmdManager.registerDevCmd(new ApplyStatModCmd());
|
||||
DevCmdManager.registerDevCmd(new AddBuildingCmd());
|
||||
DevCmdManager.registerDevCmd(new AddNPCCmd());
|
||||
DevCmdManager.registerDevCmd(new AddMobCmd());
|
||||
DevCmdManager.registerDevCmd(new DungenonCmd());
|
||||
DevCmdManager.registerDevCmd(new RemoveObjectCmd());
|
||||
DevCmdManager.registerDevCmd(new RotateCmd());
|
||||
DevCmdManager.registerDevCmd(new FlashMsgCmd());
|
||||
@@ -103,6 +104,7 @@ public enum DevCmdManager {
|
||||
DevCmdManager.registerDevCmd(new SetAdminRuneCmd());
|
||||
DevCmdManager.registerDevCmd(new SetInvulCmd());
|
||||
DevCmdManager.registerDevCmd(new MakeItemCmd());
|
||||
DevCmdManager.registerDevCmd(new GimmeCmd());
|
||||
DevCmdManager.registerDevCmd(new EnchantCmd());
|
||||
DevCmdManager.registerDevCmd(new SetSubRaceCmd());
|
||||
// Admin
|
||||
@@ -177,10 +179,44 @@ public enum DevCmdManager {
|
||||
return false;
|
||||
}
|
||||
|
||||
if(!pcSender.getTimestamps().containsKey("DEVCOMMAND"))
|
||||
pcSender.getTimestamps().put("DEVCOMMAND",System.currentTimeMillis() - 1500L);
|
||||
else if(System.currentTimeMillis() - pcSender.getTimestamps().get("DEVCOMMAND") < 1000L)
|
||||
return false;
|
||||
|
||||
//kill any commands not available to everyone on production server
|
||||
//only admin level can run dev commands on production
|
||||
|
||||
if (a.status.equals(Enum.AccountStatus.ADMIN) == false) {
|
||||
boolean playerAllowed = false;
|
||||
if(ConfigManager.MB_WORLD_TESTMODE.getValue().equals("true")) {
|
||||
switch (adc.getMainCmdString()) {
|
||||
case "printresists":
|
||||
case "printstats":
|
||||
case "printskills":
|
||||
case "printpowers":
|
||||
case "gimme":
|
||||
case "goto":
|
||||
case "teleportmode":
|
||||
case "printbonuses":
|
||||
playerAllowed = true;
|
||||
if (!a.status.equals(Enum.AccountStatus.ADMIN))
|
||||
target = pcSender;
|
||||
break;
|
||||
}
|
||||
}else{
|
||||
switch (adc.getMainCmdString()) {
|
||||
case "printresists":
|
||||
case "printstats":
|
||||
case "printskills":
|
||||
case "printpowers":
|
||||
case "printbonuses":
|
||||
//case "gimme":
|
||||
playerAllowed = true;
|
||||
if (!a.status.equals(Enum.AccountStatus.ADMIN))
|
||||
target = pcSender;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!playerAllowed && !a.status.equals(Enum.AccountStatus.ADMIN)) {
|
||||
Logger.info("Account " + a.getUname() + "attempted to use dev command " + cmd);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,289 @@
|
||||
package engine.gameManager;
|
||||
|
||||
import engine.mobileAI.MobAI;
|
||||
import engine.mobileAI.utilities.CombatUtilities;
|
||||
import engine.mobileAI.utilities.MovementUtilities;
|
||||
import engine.objects.*;
|
||||
import engine.server.MBServerStatics;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.concurrent.ThreadLocalRandom;
|
||||
|
||||
public class HellgateManager {
|
||||
public static ArrayList<Mob> hellgate_mobs;
|
||||
public static ArrayList<Mob> hellgate_mini_bosses;
|
||||
public static Mob hellgate_boss;
|
||||
|
||||
public static Long hellgate_time_completed = 0L;
|
||||
public static final int citadel_ruins_zone_id = 993;
|
||||
public static final int hell_portal_1_zone_id = 994;
|
||||
public static final int hell_portal_2_zone_id = 996;
|
||||
public static final int hell_portal_3_zone_id = 997;
|
||||
public static final int hell_portal_4_zone_id = 998;
|
||||
|
||||
public static boolean initialized = false;
|
||||
|
||||
public static final ArrayList<Integer> static_rune_ids_low = new ArrayList<>(Arrays.asList(
|
||||
250001, 250002, 250003, 250004, 250005, 250006, 250010, 250011,
|
||||
250012, 250013, 250014, 250015, 250019, 250020, 250021, 250022,
|
||||
250023, 250024, 250028, 250029, 250030, 250031, 250032, 250033,
|
||||
250037, 250038, 250039, 250040, 250041, 250042
|
||||
));
|
||||
|
||||
public static final ArrayList<Integer> static_rune_ids_mid = new ArrayList<>(Arrays.asList(
|
||||
250006, 250007, 250008,
|
||||
250015, 250016, 250017,
|
||||
250024, 250025, 250026,
|
||||
250033, 250034, 250035,
|
||||
250042, 250043, 250044
|
||||
));
|
||||
|
||||
public static final ArrayList<Integer> static_rune_ids_high = new ArrayList<>(Arrays.asList(
|
||||
250007, 250008,
|
||||
250016, 250017,
|
||||
250025, 250026,
|
||||
250034, 250035,
|
||||
250043, 250044
|
||||
));
|
||||
public static void confiureHellgate(){
|
||||
compile_mob_list();
|
||||
}
|
||||
public static void pulseHellgates(){
|
||||
if(!initialized){
|
||||
confiureHellgate();
|
||||
if(hellgate_boss != null)
|
||||
initialized = true;
|
||||
return;
|
||||
}
|
||||
|
||||
if(hellgate_mobs == null) {
|
||||
return;
|
||||
}
|
||||
if(hellgate_mini_bosses == null) {
|
||||
return;
|
||||
}
|
||||
if(hellgate_boss == null){
|
||||
return;
|
||||
}
|
||||
|
||||
if(!hellgate_boss.isAlive() && hellgate_time_completed == 0L)
|
||||
hellgate_time_completed = System.currentTimeMillis();
|
||||
|
||||
if(hellgate_time_completed != 0L && System.currentTimeMillis() > hellgate_time_completed + MBServerStatics.THIRTY_MINUTES){
|
||||
ResetHellgate();
|
||||
}
|
||||
}
|
||||
|
||||
public static void compile_mob_list(){
|
||||
if(hellgate_mobs == null) {
|
||||
hellgate_mobs =new ArrayList<>();
|
||||
}
|
||||
if(hellgate_mini_bosses == null) {
|
||||
hellgate_mini_bosses =new ArrayList<>();
|
||||
}
|
||||
Zone hellgate_zone = ZoneManager.getZoneByUUID(citadel_ruins_zone_id);
|
||||
if(hellgate_zone == null)
|
||||
return;
|
||||
|
||||
for(Mob mob : hellgate_zone.zoneMobSet){
|
||||
switch(mob.getMobBaseID()){
|
||||
case 14163: // basic saetor warrior
|
||||
mob.getCharItemManager().clearInventory();
|
||||
SpecialLootHandler(mob,false,false);
|
||||
mob.setResists(new Resists("Elite"));
|
||||
mob.healthMax = 8500;
|
||||
mob.setHealth(mob.healthMax);
|
||||
hellgate_mobs.add(mob);
|
||||
break;
|
||||
case 12770: // minotaur mini boss
|
||||
mob.getCharItemManager().clearInventory();
|
||||
SpecialLootHandler(mob,true,false);
|
||||
mob.setResists(new Resists("Elite"));
|
||||
mob.healthMax = 12500;
|
||||
mob.setHealth(mob.healthMax);
|
||||
hellgate_mini_bosses.add(mob);
|
||||
break;
|
||||
case 14180: // mordoth, son of morlock
|
||||
mob.getCharItemManager().clearInventory();
|
||||
SpecialLootHandler(mob,false,true);
|
||||
mob.setResists(new Resists("Elite"));
|
||||
mob.healthMax = mob.mobBase.getHealthMax();
|
||||
mob.setHealth(mob.healthMax);
|
||||
hellgate_boss = mob;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void ResetHellgate(){
|
||||
hellgate_time_completed = 0L;
|
||||
for(Mob mob : hellgate_mobs){
|
||||
if(!mob.isAlive()){
|
||||
if(!mob.despawned){
|
||||
mob.despawn();
|
||||
}
|
||||
mob.respawn();
|
||||
}
|
||||
mob.setHealth(mob.healthMax);
|
||||
SpecialLootHandler(mob,false,false);
|
||||
}
|
||||
for(Mob mob : hellgate_mini_bosses){
|
||||
if(!mob.isAlive()){
|
||||
if(!mob.despawned){
|
||||
mob.despawn();
|
||||
}
|
||||
mob.respawn();
|
||||
}
|
||||
mob.setHealth(mob.healthMax);
|
||||
SpecialLootHandler(mob,true,false);
|
||||
}
|
||||
if(!hellgate_boss.isAlive()){
|
||||
if(!hellgate_boss.despawned){
|
||||
hellgate_boss.despawn();
|
||||
}
|
||||
hellgate_boss.respawn();
|
||||
}
|
||||
hellgate_boss.setHealth(hellgate_boss.healthMax);
|
||||
SpecialLootHandler(hellgate_boss,false,true);
|
||||
}
|
||||
|
||||
public static void SpecialMobAIHandler(Mob mob){
|
||||
|
||||
if(mob.playerAgroMap.isEmpty())
|
||||
return;
|
||||
|
||||
if(!mob.isAlive())
|
||||
return;
|
||||
|
||||
if(mob.combatTarget == null)
|
||||
MobAI.NewAggroMechanic(mob);
|
||||
|
||||
if(MovementUtilities.canMove(mob) && mob.combatTarget != null && !CombatUtilities.inRangeToAttack(mob,mob.combatTarget))
|
||||
MobAI.chaseTarget(mob);
|
||||
|
||||
if(mob.combatTarget != null)
|
||||
MobAI.CheckForAttack(mob);
|
||||
|
||||
if(mob.combatTarget == null && mob.loc.distanceSquared(mob.bindLoc) > 1024) {//32 units
|
||||
mob.teleport(mob.bindLoc);
|
||||
mob.setCombatTarget(null);
|
||||
MovementUtilities.aiMove(mob,mob.bindLoc,true);
|
||||
}
|
||||
}
|
||||
|
||||
public static void SpecialLootHandler(Mob mob, Boolean commander, Boolean epic){
|
||||
mob.getCharItemManager().clearInventory();
|
||||
int contractRoll = ThreadLocalRandom.current().nextInt(1,101);
|
||||
if(contractRoll <= 25){
|
||||
//generate random contract
|
||||
|
||||
}
|
||||
|
||||
int runeRoll = ThreadLocalRandom.current().nextInt(1,101);
|
||||
ItemBase runeBase = null;
|
||||
int roll;
|
||||
int itemId;
|
||||
if(runeRoll <= 60 && !commander && !epic) {
|
||||
//generate random rune (standard 5-30)
|
||||
roll = ThreadLocalRandom.current().nextInt(static_rune_ids_low.size() + 1);
|
||||
itemId = static_rune_ids_low.get(0);
|
||||
try {
|
||||
itemId = static_rune_ids_low.get(roll);
|
||||
} catch (Exception e) {
|
||||
|
||||
}
|
||||
runeBase = ItemBase.getItemBase(itemId);
|
||||
if (runeBase != null) {
|
||||
MobLoot rune = new MobLoot(mob, runeBase, true);
|
||||
|
||||
if (rune != null)
|
||||
mob.getCharItemManager().addItemToInventory(rune);
|
||||
}
|
||||
}
|
||||
if(runeRoll <= 50 && commander) {
|
||||
//generate random rune (30-40)
|
||||
roll = ThreadLocalRandom.current().nextInt(static_rune_ids_mid.size() + 1);
|
||||
itemId = static_rune_ids_mid.get(0);
|
||||
try {
|
||||
itemId = static_rune_ids_mid.get(roll);
|
||||
} catch (Exception e) {
|
||||
|
||||
}
|
||||
runeBase = ItemBase.getItemBase(itemId);
|
||||
if (runeBase != null) {
|
||||
MobLoot rune = new MobLoot(mob, runeBase, true);
|
||||
|
||||
if (rune != null)
|
||||
mob.getCharItemManager().addItemToInventory(rune);
|
||||
}
|
||||
}
|
||||
|
||||
if(runeRoll <= 80 && epic) {
|
||||
//generate random rune (35-40)
|
||||
roll = ThreadLocalRandom.current().nextInt(static_rune_ids_high.size() + 1);
|
||||
itemId = static_rune_ids_high.get(0);
|
||||
try {
|
||||
itemId = static_rune_ids_high.get(roll);
|
||||
} catch (Exception e) {
|
||||
|
||||
}
|
||||
runeBase = ItemBase.getItemBase(itemId);
|
||||
if (runeBase != null) {
|
||||
MobLoot rune = new MobLoot(mob, runeBase, true);
|
||||
|
||||
if (rune != null)
|
||||
mob.getCharItemManager().addItemToInventory(rune);
|
||||
}
|
||||
}
|
||||
|
||||
if(commander || epic) {
|
||||
//handle special case for racial guards
|
||||
|
||||
roll = ThreadLocalRandom.current().nextInt(LootManager.racial_guard_uuids.size() + 1);
|
||||
itemId = LootManager.racial_guard_uuids.get(0);
|
||||
try {
|
||||
itemId = LootManager.racial_guard_uuids.get(roll);
|
||||
} catch (Exception e) {
|
||||
|
||||
}
|
||||
runeBase = ItemBase.getItemBase(itemId);
|
||||
if (runeBase != null) {
|
||||
MobLoot rune = new MobLoot(mob, runeBase, true);
|
||||
|
||||
if (rune != null)
|
||||
mob.getCharItemManager().addItemToInventory(rune);
|
||||
}
|
||||
}
|
||||
|
||||
if(epic){
|
||||
//handle glass chance for epic
|
||||
int glassRoll = ThreadLocalRandom.current().nextInt(1,101);
|
||||
if(glassRoll < 5){
|
||||
int glassID = LootManager.rollRandomItem(126);
|
||||
ItemBase glassItem = ItemBase.getItemBase(glassID);
|
||||
if (glassItem != null) {
|
||||
MobLoot glass = new MobLoot(mob, glassItem, true);
|
||||
|
||||
if (glass != null)
|
||||
mob.getCharItemManager().addItemToInventory(glass);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//handle gold drops
|
||||
int goldDrop;
|
||||
if(!commander && !epic){
|
||||
goldDrop = ThreadLocalRandom.current().nextInt(25000);
|
||||
mob.getCharItemManager().addGoldToInventory(goldDrop,false);
|
||||
}
|
||||
if(commander){
|
||||
goldDrop = ThreadLocalRandom.current().nextInt(100000,250000);
|
||||
mob.getCharItemManager().addGoldToInventory(goldDrop,false);
|
||||
}
|
||||
if(epic){
|
||||
goldDrop = ThreadLocalRandom.current().nextInt(2500000,5000000);
|
||||
mob.getCharItemManager().addGoldToInventory(goldDrop,false);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,238 @@
|
||||
package engine.gameManager;
|
||||
|
||||
import engine.Enum;
|
||||
import engine.InterestManagement.WorldGrid;
|
||||
import engine.math.Vector3fImmutable;
|
||||
import engine.net.Dispatch;
|
||||
import engine.net.DispatchMessage;
|
||||
import engine.net.client.msg.HotzoneChangeMsg;
|
||||
import engine.net.client.msg.chat.ChatSystemMsg;
|
||||
import engine.objects.*;
|
||||
import engine.server.MBServerStatics;
|
||||
import org.pmw.tinylog.Logger;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Random;
|
||||
import java.util.concurrent.ThreadLocalRandom;
|
||||
|
||||
public class HotzoneManager {
|
||||
public static Long lastPulseTime = 0L;
|
||||
public static HashMap<Guild, ArrayList<PlayerCharacter>> playersPresent;
|
||||
public static Mob hotzoneMob = null;
|
||||
public static boolean three_quarter_health = false;
|
||||
public static boolean half_health = false;
|
||||
public static boolean quarter_health = false;
|
||||
public static void SelectRandomHotzone(){
|
||||
if(hotzoneMob != null){
|
||||
hotzoneMob.killCharacter("Hotzone Over");
|
||||
hotzoneMob.despawn();
|
||||
hotzoneMob.spawnTime = 1000000000;
|
||||
DbManager.MobQueries.DELETE_MOB( hotzoneMob);
|
||||
}
|
||||
Random random = new Random();
|
||||
Zone newHotzone = null;
|
||||
while (newHotzone == null || newHotzone.getObjectUUID() == 931 || newHotzone.getObjectUUID() == 913)
|
||||
newHotzone = (Zone) ZoneManager.macroZones.toArray()[random.nextInt(ZoneManager.macroZones.size())];
|
||||
ZoneManager.setHotZone(newHotzone);
|
||||
ZoneManager.hotZone = newHotzone;
|
||||
int R8UUId = 0;
|
||||
switch(random.nextInt(5)) {
|
||||
case 1:
|
||||
R8UUId = 14152;
|
||||
break;
|
||||
case 2:
|
||||
R8UUId = 14179;
|
||||
break;
|
||||
case 3:
|
||||
R8UUId = 14180;
|
||||
break;
|
||||
case 4:
|
||||
R8UUId = 14220;
|
||||
break;
|
||||
default:
|
||||
R8UUId = 14319;
|
||||
break;
|
||||
}
|
||||
Mob created = Mob.createMob(R8UUId,newHotzone.getLoc(), Guild.getErrantGuild(),true,newHotzone,null,0,"",85);
|
||||
if(created == null){
|
||||
Logger.error("Failed To Generate Hotzone R8 Mob");
|
||||
return;
|
||||
}
|
||||
ChatSystemMsg chatMsg = new ChatSystemMsg(null, created.getFirstName() + " has spawned in " + newHotzone.getName() + ". Glory and riches await adventurers who dare defeat it!");
|
||||
chatMsg.setMessageType(10);
|
||||
chatMsg.setChannel(Enum.ChatChannelType.SYSTEM.getChannelID());
|
||||
DispatchMessage.dispatchMsgToAll(chatMsg);
|
||||
|
||||
created.bindLoc = newHotzone.getLoc();
|
||||
created.runAfterLoad();
|
||||
WorldGrid.addObject(created,created.bindLoc.x,created.bindLoc.z);
|
||||
created.teleport(created.bindLoc);
|
||||
created.BehaviourType = Enum.MobBehaviourType.Aggro;
|
||||
hotzoneMob = created;
|
||||
created.setHealth(100000);
|
||||
created.setResists(new Resists("Dropper"));
|
||||
GenerateHotzoneEpicLoot(created);
|
||||
ZoneManager.hotZone = newHotzone;
|
||||
|
||||
for(PlayerCharacter player : SessionManager.getAllActivePlayerCharacters()) {
|
||||
HotzoneChangeMsg hcm = new HotzoneChangeMsg(Enum.GameObjectType.Zone.ordinal(), ZoneManager.hotZone.getObjectUUID());
|
||||
Dispatch dispatch = Dispatch.borrow(player, hcm);
|
||||
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);
|
||||
}
|
||||
three_quarter_health = false;
|
||||
half_health = false;
|
||||
quarter_health = false;
|
||||
}
|
||||
|
||||
public static void GenerateHotzoneEpicLoot(Mob mob) {
|
||||
mob.getCharItemManager().clearInventory();
|
||||
Random random = new Random();
|
||||
int roll;
|
||||
int itemId;
|
||||
//wrapped rune:
|
||||
ItemBase runeBase = ItemBase.getItemBase(971070);
|
||||
if (runeBase != null) {
|
||||
MobLoot rune = new MobLoot(mob, runeBase, true);
|
||||
|
||||
if (rune != null)
|
||||
mob.getCharItemManager().addItemToInventory(rune);
|
||||
}
|
||||
|
||||
roll = ThreadLocalRandom.current().nextInt(1, 101);
|
||||
if (roll >= 95) {
|
||||
//glass
|
||||
int glassID = LootManager.rollRandomItem(126);
|
||||
ItemBase glassItem = ItemBase.getItemBase(glassID);
|
||||
if (glassItem != null) {
|
||||
MobLoot glass = new MobLoot(mob, glassItem, true);
|
||||
|
||||
if (glass != null)
|
||||
mob.getCharItemManager().addItemToInventory(glass);
|
||||
}
|
||||
}
|
||||
|
||||
roll = ThreadLocalRandom.current().nextInt(1, 101);
|
||||
if (roll >= 95) {
|
||||
//r8 banescroll
|
||||
int baneID = 910018;
|
||||
ItemBase baneItem = ItemBase.getItemBase(baneID);
|
||||
if (baneItem != null) {
|
||||
MobLoot bane = new MobLoot(mob, baneItem, true);
|
||||
|
||||
if (bane != null)
|
||||
mob.getCharItemManager().addItemToInventory(bane);
|
||||
}
|
||||
}
|
||||
|
||||
roll = ThreadLocalRandom.current().nextInt(1, 101);
|
||||
if (roll >= 95) {
|
||||
//guard captain
|
||||
roll = ThreadLocalRandom.current().nextInt(LootManager.racial_guard_uuids.size() + 1);
|
||||
itemId = LootManager.racial_guard_uuids.get(0);
|
||||
try {
|
||||
itemId = LootManager.racial_guard_uuids.get(roll);
|
||||
} catch (Exception e) {
|
||||
|
||||
}
|
||||
runeBase = ItemBase.getItemBase(itemId);
|
||||
if (runeBase != null) {
|
||||
MobLoot rune = new MobLoot(mob, runeBase, true);
|
||||
|
||||
if (rune != null)
|
||||
mob.getCharItemManager().addItemToInventory(rune);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void ClearHotzone(){
|
||||
ZoneManager.hotZone = null;
|
||||
for(PlayerCharacter player : SessionManager.getAllActivePlayerCharacters()) {
|
||||
HotzoneChangeMsg hcm = new HotzoneChangeMsg(Enum.GameObjectType.Zone.ordinal(), 0);
|
||||
Dispatch dispatch = Dispatch.borrow(player, hcm);
|
||||
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);
|
||||
}
|
||||
}
|
||||
|
||||
public static void pulse(){
|
||||
if(HotzoneManager.playersPresent == null)
|
||||
HotzoneManager.playersPresent = new HashMap<>();
|
||||
|
||||
if(ZoneManager.hotZone == null)
|
||||
return;
|
||||
|
||||
if(lastPulseTime + 5000L > System.currentTimeMillis())
|
||||
return;
|
||||
|
||||
lastPulseTime = System.currentTimeMillis();
|
||||
|
||||
//handle world announcements for HZ boss
|
||||
if(hotzoneMob != null){
|
||||
float health = hotzoneMob.getHealth();
|
||||
if(health < 75000 && health > 50000 && !three_quarter_health){
|
||||
//mob at 50%-75% health
|
||||
three_quarter_health = true;
|
||||
String name = hotzoneMob.getName();
|
||||
ChatSystemMsg chatMsg = new ChatSystemMsg(null, name + " In The Hotzone Is At 75% Health");
|
||||
chatMsg.setMessageType(10);
|
||||
chatMsg.setChannel(Enum.ChatChannelType.SYSTEM.getChannelID());
|
||||
DispatchMessage.dispatchMsgToAll(chatMsg);
|
||||
}else if(health < 50000 && health > 25000 && !half_health){
|
||||
//mob ta 25%-50% health
|
||||
half_health = true;
|
||||
String name = hotzoneMob.getName();
|
||||
ChatSystemMsg chatMsg = new ChatSystemMsg(null, name + " In The Hotzone Is At 50% Health");
|
||||
chatMsg.setMessageType(10);
|
||||
chatMsg.setChannel(Enum.ChatChannelType.SYSTEM.getChannelID());
|
||||
DispatchMessage.dispatchMsgToAll(chatMsg);
|
||||
}else if(health < 25000 && !quarter_health){
|
||||
//mob under 25% health
|
||||
quarter_health = true;
|
||||
String name = hotzoneMob.getName();
|
||||
ChatSystemMsg chatMsg = new ChatSystemMsg(null, name + " In The Hotzone Is At 25% Health");
|
||||
chatMsg.setMessageType(10);
|
||||
chatMsg.setChannel(Enum.ChatChannelType.SYSTEM.getChannelID());
|
||||
DispatchMessage.dispatchMsgToAll(chatMsg);
|
||||
}else if (health > 75000){
|
||||
//mob at 75% - 100% health
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
HashSet<AbstractWorldObject> inRange = WorldGrid.getObjectsInRangePartial(ZoneManager.hotZone.getLoc(),ZoneManager.hotZone.getBounds().getHalfExtents().x * 2, MBServerStatics.MASK_PLAYER);
|
||||
|
||||
//clear out old players who aren't here anymore
|
||||
for(Guild nation : HotzoneManager.playersPresent.keySet()){
|
||||
for(PlayerCharacter pc : HotzoneManager.playersPresent.get(nation)){
|
||||
if (!inRange.contains(pc)) {
|
||||
HotzoneManager.playersPresent.get(nation).remove(pc);
|
||||
if(HotzoneManager.playersPresent.get(nation).size() < 1){
|
||||
HotzoneManager.playersPresent.remove(nation);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//check status of current players/nation in vicinity
|
||||
for(AbstractWorldObject awo : inRange){
|
||||
PlayerCharacter pc = (PlayerCharacter)awo;
|
||||
Guild nation = pc.guild.getNation();
|
||||
if(HotzoneManager.playersPresent.containsKey(nation)){
|
||||
//nation already here, add to list
|
||||
if(HotzoneManager.playersPresent.get(nation).size() >= 5 && !HotzoneManager.playersPresent.get(nation).contains(pc)){
|
||||
//more than 5, boot player out
|
||||
MovementManager.translocate(pc, Vector3fImmutable.getRandomPointOnCircle(ZoneManager.getZoneByUUID(656).getLoc(),30f),Regions.GetRegionForTeleport(ZoneManager.getZoneByUUID(656).getLoc()));
|
||||
}
|
||||
if(!HotzoneManager.playersPresent.get(nation).contains(pc)){
|
||||
//less than 5, allow player in
|
||||
HotzoneManager.playersPresent.get(nation).add(pc);
|
||||
}
|
||||
}else{
|
||||
ArrayList<PlayerCharacter> newList = new ArrayList<>();
|
||||
newList.add(pc);
|
||||
HotzoneManager.playersPresent.put(nation,newList);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -14,10 +14,10 @@ import engine.net.DispatchMessage;
|
||||
import engine.net.client.msg.ErrorPopupMsg;
|
||||
import engine.net.client.msg.chat.ChatSystemMsg;
|
||||
import engine.objects.*;
|
||||
import engine.server.MBServerStatics;
|
||||
import org.pmw.tinylog.Logger;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.ThreadLocalRandom;
|
||||
|
||||
/**
|
||||
@@ -34,6 +34,21 @@ public enum LootManager {
|
||||
public static HashMap<Integer, ArrayList<ModTableEntry>> _modTables = new HashMap<>();
|
||||
public static HashMap<Integer, ArrayList<ModTypeTableEntry>> _modTypeTables = new HashMap<>();
|
||||
|
||||
public static final ArrayList<Integer> vorg_ha_uuids = new ArrayList<>(Arrays.asList(27580, 27590, 188500, 188510, 188520, 188530, 188540, 188550, 189510));
|
||||
public static final ArrayList<Integer> vorg_ma_uuids = new ArrayList<>(Arrays.asList(27570,188900,188910,188920,188930,188940,188950,189500));
|
||||
public static final ArrayList<Integer> vorg_la_uuids = new ArrayList<>(Arrays.asList(27550,27560,189100,189110,189120,189130,189140,189150));
|
||||
public static final ArrayList<Integer> vorg_cloth_uuids = new ArrayList<>(Arrays.asList(27600,188700,188720,189550,189560));
|
||||
public static final ArrayList<Integer> racial_guard_uuids = new ArrayList<>(Arrays.asList(841,951,952,1050,1052,1180,1182,1250,1252,1350,1352,1450,1452,1500,1502,1525,1527,1550,1552,1575,1577,1600,1602,1650,1652,1700,980100,980102));
|
||||
|
||||
public static final ArrayList<Integer> static_rune_ids = new ArrayList<>(Arrays.asList(
|
||||
250001, 250002, 250003, 250004, 250005, 250006, 250007, 250008, 250010, 250011,
|
||||
250012, 250013, 250014, 250015, 250016, 250017, 250019, 250020, 250021, 250022,
|
||||
250023, 250024, 250025, 250026, 250028, 250029, 250030, 250031, 250032, 250033,
|
||||
250034, 250035, 250037, 250038, 250039, 250040, 250041, 250042, 250043, 250044,
|
||||
250115, 250118, 250119, 250120, 250121, 250122, 252123, 252124, 252125, 252126,
|
||||
252127
|
||||
));
|
||||
|
||||
// Drop Rates
|
||||
|
||||
public static float NORMAL_DROP_RATE;
|
||||
@@ -68,49 +83,85 @@ public enum LootManager {
|
||||
|
||||
public static void GenerateMobLoot(Mob mob) {
|
||||
|
||||
if(mob == null){
|
||||
return;
|
||||
}
|
||||
|
||||
if(!mob.getSafeZone()) {
|
||||
SpecialLootHandler.RollContract(mob);
|
||||
SpecialLootHandler.RollGlass(mob);
|
||||
SpecialLootHandler.RollRune(mob);
|
||||
SpecialLootHandler.RollRacialGuard(mob);
|
||||
}
|
||||
|
||||
//determine if mob is in hotzone
|
||||
boolean inHotzone = ZoneManager.inHotZone(mob.getLoc());
|
||||
boolean inHotzone = false;
|
||||
|
||||
//iterate the booty sets
|
||||
|
||||
if (mob.getMobBase().bootySet != 0 && _bootySetMap.containsKey(mob.getMobBase().bootySet) == true)
|
||||
if(mob.mobBase == null || mob.getMobBaseID() == 253003){
|
||||
int i = 0;
|
||||
}
|
||||
|
||||
if (mob.getMobBase().bootySet != 0 && _bootySetMap.containsKey(mob.getMobBase().bootySet))
|
||||
RunBootySet(_bootySetMap.get(mob.getMobBase().bootySet), mob, inHotzone);
|
||||
|
||||
if (mob.bootySet != 0 && _bootySetMap.containsKey(mob.bootySet) == true)
|
||||
if (mob.bootySet != 0 && _bootySetMap.containsKey(mob.bootySet)) {
|
||||
RunBootySet(_bootySetMap.get(mob.bootySet), mob, inHotzone);
|
||||
}else if(mob.bootySet != 0 && ItemBase.getItemBase(mob.bootySet) != null){
|
||||
MobLoot specialDrop = null;
|
||||
specialDrop = new MobLoot(mob,ItemBase.getItemBase(mob.bootySet),true);
|
||||
if(specialDrop != null) {
|
||||
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"));
|
||||
if(!Mob.discDroppers.contains(mob))
|
||||
Mob.AddDiscDropper(mob);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//lastly, check mobs inventory for godly or disc runes to send a server announcement
|
||||
for (Item it : mob.getInventory()) {
|
||||
for (Item it : mob.getInventory()) {
|
||||
|
||||
ItemBase ib = it.getItemBase();
|
||||
if(ib == null)
|
||||
break;
|
||||
if (ib.isDiscRune() || 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?");
|
||||
chatMsg.setMessageType(10);
|
||||
chatMsg.setChannel(Enum.ChatChannelType.SYSTEM.getChannelID());
|
||||
DispatchMessage.dispatchMsgToAll(chatMsg);
|
||||
}
|
||||
ItemBase ib = it.getItemBase();
|
||||
if (ib == null)
|
||||
break;
|
||||
if (ib.isDiscRune() || ib.getName().toLowerCase().contains("of the gods")) {
|
||||
Zone camp = mob.getParentZone();
|
||||
Zone macro = camp.getParent();
|
||||
String name = camp.getName() + "(" + macro.getName() + ")";
|
||||
ChatSystemMsg chatMsg = new ChatSystemMsg(null, mob.getName() + " in " + name + " has found the " + ib.getName() + ". Are you tough enough to take it?");
|
||||
chatMsg.setMessageType(10);
|
||||
chatMsg.setChannel(Enum.ChatChannelType.SYSTEM.getChannelID());
|
||||
DispatchMessage.dispatchMsgToAll(chatMsg);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private static void RunBootySet(ArrayList<BootySetEntry> entries, Mob mob, boolean inHotzone) {
|
||||
|
||||
boolean hotzoneWasRan = false;
|
||||
float dropRate = 1.0f;
|
||||
float dropRate;
|
||||
|
||||
// Iterate all entries in this bootySet and process accordingly
|
||||
|
||||
Zone zone = ZoneManager.findSmallestZone(mob.loc);
|
||||
for (BootySetEntry bse : entries) {
|
||||
switch (bse.bootyType) {
|
||||
case "GOLD":
|
||||
if (zone != null && zone.getSafeZone() == (byte)1)
|
||||
return; // no loot to drop in safezones
|
||||
GenerateGoldDrop(mob, bse, inHotzone);
|
||||
break;
|
||||
case "LOOT":
|
||||
if (zone != null && zone.getSafeZone() == (byte)1)
|
||||
return; // no loot to drop in safezones
|
||||
|
||||
if (mob.getSafeZone() == false)
|
||||
dropRate = LootManager.NORMAL_DROP_RATE;
|
||||
dropRate = LootManager.NORMAL_DROP_RATE;
|
||||
|
||||
if (inHotzone == true)
|
||||
dropRate = LootManager.HOTZONE_DROP_RATE;
|
||||
@@ -135,6 +186,90 @@ public enum LootManager {
|
||||
}
|
||||
}
|
||||
|
||||
public static void SpecialCaseContractDrop(Mob mob,ArrayList<BootySetEntry> entries){
|
||||
|
||||
int lootTableID = 0;
|
||||
for(BootySetEntry entry : entries){
|
||||
if(entry.bootyType.equals("LOOT")){
|
||||
lootTableID = entry.genTable;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(lootTableID == 0)
|
||||
return;
|
||||
|
||||
int ContractTableID = 0;
|
||||
for(GenTableEntry entry : _genTables.get(lootTableID)){
|
||||
try {
|
||||
if (ItemBase.getItemBase(_itemTables.get(entry.itemTableID).get(0).cacheID).getType().equals(Enum.ItemType.CONTRACT)) {
|
||||
ContractTableID = entry.itemTableID;
|
||||
break;
|
||||
}
|
||||
}catch(Exception e){
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if(ContractTableID == 0)
|
||||
return;
|
||||
|
||||
ItemBase ib = ItemBase.getItemBase(rollRandomItem(ContractTableID));
|
||||
if(ib != null){
|
||||
MobLoot toAdd = new MobLoot(mob,ib,false);
|
||||
mob.getCharItemManager().addItemToInventory(toAdd);
|
||||
}
|
||||
}
|
||||
|
||||
public static void SpecialCaseRuneDrop(Mob mob,ArrayList<BootySetEntry> entries){
|
||||
int roll = ThreadLocalRandom.current().nextInt(static_rune_ids.size() + 1);
|
||||
int itemId = static_rune_ids.get(0);
|
||||
try {
|
||||
itemId = static_rune_ids.get(roll);
|
||||
}catch(Exception e){
|
||||
|
||||
}
|
||||
ItemBase ib = ItemBase.getItemBase(itemId);
|
||||
if(ib != null){
|
||||
MobLoot toAdd = new MobLoot(mob,ib,false);
|
||||
mob.getCharItemManager().addItemToInventory(toAdd);
|
||||
}
|
||||
}
|
||||
|
||||
public static void SpecialCaseResourceDrop(Mob mob,ArrayList<BootySetEntry> entries){
|
||||
int lootTableID = 0;
|
||||
for(BootySetEntry entry : entries){
|
||||
if(entry.bootyType.equals("LOOT")){
|
||||
lootTableID = entry.genTable;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(lootTableID == 0)
|
||||
return;
|
||||
|
||||
int ResourceTableID = 0;
|
||||
for(GenTableEntry entry : _genTables.get(lootTableID)){
|
||||
try {
|
||||
if (ItemBase.getItemBase(_itemTables.get(entry.itemTableID).get(0).cacheID).getType().equals(Enum.ItemType.RESOURCE)) {
|
||||
ResourceTableID = entry.itemTableID;
|
||||
break;
|
||||
}
|
||||
}catch(Exception e){
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if(ResourceTableID == 0)
|
||||
return;
|
||||
|
||||
ItemBase ib = ItemBase.getItemBase(rollRandomItem(ResourceTableID));
|
||||
if(ib != null){
|
||||
MobLoot toAdd = new MobLoot(mob,ib,false);
|
||||
mob.getCharItemManager().addItemToInventory(toAdd);
|
||||
}
|
||||
}
|
||||
|
||||
public static MobLoot getGenTableItem(int genTableID, AbstractCharacter mob, Boolean inHotzone) {
|
||||
|
||||
if (mob == null || _genTables.containsKey(genTableID) == false)
|
||||
@@ -156,11 +291,10 @@ public enum LootManager {
|
||||
|
||||
//gets the 1-320 roll for this mob
|
||||
int itemTableRoll = 0;
|
||||
int objectType = mob.getObjectType().ordinal();
|
||||
if(mob.getObjectType().ordinal() == 52) { //52 = player character
|
||||
itemTableRoll = ThreadLocalRandom.current().nextInt(1,320 + 1);
|
||||
} else{
|
||||
itemTableRoll = TableRoll(mob.level, inHotzone);
|
||||
itemTableRoll = TableRoll(mob.level);
|
||||
}
|
||||
ItemTableEntry tableRow = ItemTableEntry.rollTable(itemTableId, itemTableRoll);
|
||||
if (tableRow == null)
|
||||
@@ -171,14 +305,24 @@ public enum LootManager {
|
||||
if (itemUUID == 0)
|
||||
return null;
|
||||
|
||||
if (ItemBase.getItemBase(itemUUID).getType().ordinal() == Enum.ItemType.RESOURCE.ordinal()) {
|
||||
if (ItemBase.getItemBase(itemUUID).getType().equals(Enum.ItemType.RESOURCE) || ItemBase.getItemBase(itemUUID).getName().equals("Mithril")) {
|
||||
if(ThreadLocalRandom.current().nextInt(1,101) < 91)
|
||||
return null; // cut down world drops rates of resources by 90%
|
||||
int amount = ThreadLocalRandom.current().nextInt(tableRow.minSpawn, tableRow.maxSpawn + 1);
|
||||
return new MobLoot(mob, ItemBase.getItemBase(itemUUID), amount, false);
|
||||
}
|
||||
|
||||
if(ItemBase.getItemBase(itemUUID).getType().equals(Enum.ItemType.RUNE)){
|
||||
int randomRune = rollRandomItem(itemTableId);
|
||||
if(randomRune != 0) {
|
||||
itemUUID = randomRune;
|
||||
}
|
||||
} else if(ItemBase.getItemBase(itemUUID).getType().equals(Enum.ItemType.CONTRACT)){
|
||||
int randomContract = rollRandomItem(itemTableId);
|
||||
if(randomContract != 0) {
|
||||
itemUUID = randomContract;
|
||||
}
|
||||
}
|
||||
outItem = new MobLoot(mob, ItemBase.getItemBase(itemUUID), false);
|
||||
Enum.ItemType outType = outItem.getItemBase().getType();
|
||||
|
||||
|
||||
if(selectedRow.pModTable != 0){
|
||||
try {
|
||||
@@ -196,6 +340,12 @@ public enum LootManager {
|
||||
Logger.error("Failed to GenerateSuffix for item: " + outItem.getName());
|
||||
}
|
||||
}
|
||||
|
||||
if(outItem.getItemBase().getType().equals(Enum.ItemType.CONTRACT) || outItem.getItemBase().getType().equals(Enum.ItemType.RUNE)){
|
||||
if(ThreadLocalRandom.current().nextInt(1,101) < 66)
|
||||
return null; // cut down world drops rates of resources by 65%
|
||||
}
|
||||
|
||||
return outItem;
|
||||
}
|
||||
|
||||
@@ -216,7 +366,7 @@ public enum LootManager {
|
||||
if(mob.getObjectType().ordinal() == 52) {
|
||||
prefixTableRoll = ThreadLocalRandom.current().nextInt(1,320 + 1);
|
||||
} else{
|
||||
prefixTableRoll = TableRoll(mob.level, inHotzone);
|
||||
prefixTableRoll = TableRoll(mob.level);
|
||||
}
|
||||
ModTableEntry prefixMod = ModTableEntry.rollTable(prefixTable.modTableID, prefixTableRoll);
|
||||
|
||||
@@ -224,8 +374,23 @@ public enum LootManager {
|
||||
return inItem;
|
||||
|
||||
if (prefixMod.action.length() > 0) {
|
||||
inItem.setPrefix(prefixMod.action);
|
||||
inItem.addPermanentEnchantment(prefixMod.action, 0, prefixMod.level, true);
|
||||
String action = prefixMod.action;
|
||||
if(action.equals("PRE-108") || action.equals("PRE-058") || action.equals("PRE-031")){//massive, barons and avatars to be replaced by leg or warlords
|
||||
int roll = ThreadLocalRandom.current().nextInt(1,100);
|
||||
if(inItem.getItemBase().getRange() > 15){
|
||||
action = "PRE-040";
|
||||
}else {
|
||||
if (roll > 50) {
|
||||
//set warlords
|
||||
action = "PRE-021";
|
||||
} else {
|
||||
//set legendary
|
||||
action = "PRE-040";
|
||||
}
|
||||
}
|
||||
}
|
||||
inItem.setPrefix(action);
|
||||
inItem.addPermanentEnchantment(action, 0, prefixMod.level, true);
|
||||
}
|
||||
|
||||
return inItem;
|
||||
@@ -248,14 +413,34 @@ public enum LootManager {
|
||||
if(mob.getObjectType().ordinal() == 52) {
|
||||
suffixTableRoll = ThreadLocalRandom.current().nextInt(1,320 + 1);
|
||||
} else{
|
||||
suffixTableRoll = TableRoll(mob.level, inHotzone);
|
||||
suffixTableRoll = TableRoll(mob.level);
|
||||
}
|
||||
ModTableEntry suffixMod = ModTableEntry.rollTable(suffixTable.modTableID, suffixTableRoll);
|
||||
|
||||
if (suffixMod == null)
|
||||
return inItem;
|
||||
|
||||
if (suffixMod.action.length() > 0) {
|
||||
int moveSpeedRoll = ThreadLocalRandom.current().nextInt(100);
|
||||
if(inItem.getItemBase().getValidSlot() == MBServerStatics.SLOT_FEET && moveSpeedRoll < 10){
|
||||
int rankRoll = ThreadLocalRandom.current().nextInt(10);
|
||||
String suffixSpeed = "SUF-148";
|
||||
switch(rankRoll) {
|
||||
case 1:
|
||||
case 2:
|
||||
case 3:
|
||||
suffixSpeed = "SUF-149";
|
||||
break;
|
||||
case 4:
|
||||
case 5:
|
||||
case 6:
|
||||
case 7:
|
||||
suffixSpeed = "SUF-150";
|
||||
break;
|
||||
|
||||
}
|
||||
inItem.setSuffix(suffixSpeed);
|
||||
inItem.addPermanentEnchantment(suffixSpeed, 0, suffixMod.level, false);
|
||||
}else if (suffixMod.action.length() > 0) {
|
||||
inItem.setSuffix(suffixMod.action);
|
||||
inItem.addPermanentEnchantment(suffixMod.action, 0, suffixMod.level, false);
|
||||
}
|
||||
@@ -263,23 +448,36 @@ public enum LootManager {
|
||||
return inItem;
|
||||
}
|
||||
|
||||
public static int TableRoll(int mobLevel, Boolean inHotzone) {
|
||||
public static int TableRoll(int mobLevel) {
|
||||
|
||||
if (mobLevel > 65)
|
||||
mobLevel = 65;
|
||||
|
||||
int max = (int) (4.882 * mobLevel + 127.0);
|
||||
|
||||
if (max > 319)
|
||||
max = 319;
|
||||
|
||||
int min = (int) (4.469 * mobLevel - 3.469);
|
||||
|
||||
if (min < 70)
|
||||
min = 70;
|
||||
|
||||
if (inHotzone)
|
||||
min += mobLevel;
|
||||
int rank = (int)(mobLevel * 0.1f);
|
||||
int min = 50;
|
||||
int max = 100;
|
||||
switch(rank){
|
||||
case 1:
|
||||
min = 200;
|
||||
max = 250;
|
||||
break;
|
||||
case 2:
|
||||
min = 210;
|
||||
max = 275;
|
||||
break;
|
||||
case 3:
|
||||
min = 220;
|
||||
max = 300;
|
||||
break;
|
||||
case 4:
|
||||
min = 230;
|
||||
max = 320;
|
||||
break;
|
||||
case 5:
|
||||
case 6:
|
||||
case 7:
|
||||
case 8:
|
||||
min = 240;
|
||||
max = 320;
|
||||
break;
|
||||
}
|
||||
|
||||
int roll = ThreadLocalRandom.current().nextInt(min, max + 1);
|
||||
|
||||
@@ -299,12 +497,7 @@ public enum LootManager {
|
||||
|
||||
int high = bse.highGold;
|
||||
int low = bse.lowGold;
|
||||
int gold = ThreadLocalRandom.current().nextInt(low, high + 1);
|
||||
|
||||
if (inHotzone == true)
|
||||
gold = (int) (gold * HOTZONE_GOLD_RATE);
|
||||
else
|
||||
gold = (int) (gold * NORMAL_GOLD_RATE);
|
||||
int gold = (int) (ThreadLocalRandom.current().nextInt(low, high + 1) * NORMAL_GOLD_RATE);
|
||||
|
||||
if (gold > 0) {
|
||||
MobLoot goldAmount = new MobLoot(mob, gold);
|
||||
@@ -315,45 +508,67 @@ public enum LootManager {
|
||||
|
||||
public static void GenerateLootDrop(Mob mob, int tableID, Boolean inHotzone) {
|
||||
|
||||
try {
|
||||
MobLoot toAdd = getGenTableItem(tableID, mob, inHotzone);
|
||||
if(toAdd != null){
|
||||
ItemBase ib = toAdd.getItemBase();
|
||||
switch(ib.getType()){
|
||||
case CONTRACT:
|
||||
case RUNE:
|
||||
case RESOURCE:
|
||||
return;
|
||||
}
|
||||
|
||||
MobLoot toAdd = getGenTableItem(tableID, mob, inHotzone);
|
||||
if (ib.getUUID() == 1580021)//mithril
|
||||
return;
|
||||
|
||||
if (toAdd != null)
|
||||
mob.getCharItemManager().addItemToInventory(toAdd);
|
||||
|
||||
} catch (Exception e) {
|
||||
//TODO chase down loot generation error, affects roughly 2% of drops
|
||||
int i = 0;
|
||||
toAdd.setIsID(true);
|
||||
mob.getCharItemManager().addItemToInventory(toAdd);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static void GenerateEquipmentDrop(Mob mob) {
|
||||
|
||||
if (mob == null || mob.getSafeZone())
|
||||
return; // no equipment to drop in safezones
|
||||
|
||||
if(mob.StrongholdGuardian || mob.StrongholdCommander || mob.StrongholdEpic)
|
||||
return; // stronghold mobs don't drop equipment
|
||||
|
||||
//do equipment here
|
||||
int dropCount = 0;
|
||||
if (mob.getEquip() != null)
|
||||
if (mob.getEquip() != null) {
|
||||
boolean isVorg = false;
|
||||
for (MobEquipment me : mob.getEquip().values()) {
|
||||
|
||||
if (me.getDropChance() == 0)
|
||||
continue;
|
||||
|
||||
String name = me.getItemBase().getName().toLowerCase();
|
||||
if (name.contains("vorgrim legionnaire's") || name.contains("vorgrim auxiliary's") ||name.contains("bellugh nuathal") || name.contains("crimson circle"))
|
||||
isVorg = true;
|
||||
|
||||
if(isVorg && !mob.isDropper){
|
||||
continue;
|
||||
}
|
||||
|
||||
float equipmentRoll = ThreadLocalRandom.current().nextInt(1, 100 + 1);
|
||||
float dropChance = me.getDropChance() * 100;
|
||||
|
||||
ItemBase itemBase = me.getItemBase();
|
||||
if(isVorg) {
|
||||
mob.spawnTime = ThreadLocalRandom.current().nextInt(300, 2700);
|
||||
dropChance = 7.5f;
|
||||
itemBase = getRandomVorg(itemBase);
|
||||
}
|
||||
if (equipmentRoll > dropChance)
|
||||
continue;
|
||||
|
||||
MobLoot ml = new MobLoot(mob, me.getItemBase(), false);
|
||||
MobLoot ml = new MobLoot(mob, itemBase, false);
|
||||
|
||||
if (ml != null && dropCount < 1) {
|
||||
ml.setIsID(true);
|
||||
ml.setDurabilityCurrent((short) (ml.getDurabilityCurrent() - ThreadLocalRandom.current().nextInt(5) + 1));
|
||||
mob.getCharItemManager().addItemToInventory(ml);
|
||||
dropCount = 1;
|
||||
//break; // Exit on first successful roll.
|
||||
}
|
||||
ml.setIsID(true);
|
||||
ml.setDurabilityCurrent((short) (ml.getDurabilityCurrent() - ThreadLocalRandom.current().nextInt(5) + 1));
|
||||
mob.getCharItemManager().addItemToInventory(ml);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void GenerateInventoryDrop(Mob mob, BootySetEntry bse) {
|
||||
@@ -365,12 +580,134 @@ public enum LootManager {
|
||||
if (chanceRoll > bse.dropChance)
|
||||
return;
|
||||
|
||||
if(bse.itemBase == 1580021)//mithril
|
||||
return;
|
||||
MobLoot lootItem = new MobLoot(mob, ItemBase.getItemBase(bse.itemBase), true);
|
||||
|
||||
if (lootItem != null)
|
||||
if (lootItem != null) {
|
||||
mob.getCharItemManager().addItemToInventory(lootItem);
|
||||
if(lootItem.getItemBase().isDiscRune() && !Mob.discDroppers.contains(mob))
|
||||
Mob.AddDiscDropper(mob);
|
||||
}
|
||||
}
|
||||
|
||||
public static void newFatePeddler(PlayerCharacter playerCharacter, Item gift) {
|
||||
|
||||
CharacterItemManager itemMan = playerCharacter.getCharItemManager();
|
||||
|
||||
if (itemMan == null)
|
||||
return;
|
||||
|
||||
//check if player owns the gift he is trying to open
|
||||
|
||||
if (!itemMan.doesCharOwnThisItem(gift.getObjectUUID()))
|
||||
return;
|
||||
|
||||
ItemBase ib = gift.getItemBase();
|
||||
|
||||
MobLoot winnings = null;
|
||||
|
||||
if (ib == null)
|
||||
return;
|
||||
switch (ib.getUUID()) {
|
||||
case 971070: //wrapped rune
|
||||
Random random = new Random();
|
||||
int roll = random.nextInt(100);
|
||||
int itemId;
|
||||
ItemBase runeBase;
|
||||
if (roll >= 90) {
|
||||
//35 or 40
|
||||
roll = ThreadLocalRandom.current().nextInt(HellgateManager.static_rune_ids_high.size() + 1);
|
||||
itemId = HellgateManager.static_rune_ids_high.get(0);
|
||||
try {
|
||||
itemId = HellgateManager.static_rune_ids_high.get(roll);
|
||||
} catch (Exception e) {
|
||||
|
||||
}
|
||||
runeBase = ItemBase.getItemBase(itemId);
|
||||
if (runeBase != null) {
|
||||
MobLoot rune = new MobLoot(playerCharacter, runeBase, true);
|
||||
|
||||
if (rune != null)
|
||||
playerCharacter.getCharItemManager().addItemToInventory(rune);
|
||||
}
|
||||
} else if (roll >= 65 && roll <= 89) {
|
||||
//30,35 or 40
|
||||
roll = ThreadLocalRandom.current().nextInt(HellgateManager.static_rune_ids_mid.size() + 1);
|
||||
itemId = HellgateManager.static_rune_ids_mid.get(0);
|
||||
try {
|
||||
itemId = HellgateManager.static_rune_ids_mid.get(roll);
|
||||
} catch (Exception e) {
|
||||
|
||||
}
|
||||
runeBase = ItemBase.getItemBase(itemId);
|
||||
if (runeBase != null) {
|
||||
MobLoot rune = new MobLoot(playerCharacter, runeBase, true);
|
||||
|
||||
if (rune != null)
|
||||
playerCharacter.getCharItemManager().addItemToInventory(rune);
|
||||
}
|
||||
} else {
|
||||
//5-30
|
||||
roll = ThreadLocalRandom.current().nextInt(HellgateManager.static_rune_ids_low.size() + 1);
|
||||
itemId = HellgateManager.static_rune_ids_low.get(0);
|
||||
try {
|
||||
itemId = HellgateManager.static_rune_ids_low.get(roll);
|
||||
} catch (Exception ignored) {
|
||||
|
||||
}
|
||||
runeBase = ItemBase.getItemBase(itemId);
|
||||
if (runeBase != null) {
|
||||
MobLoot rune = new MobLoot(playerCharacter, runeBase, true);
|
||||
|
||||
if (rune != null)
|
||||
playerCharacter.getCharItemManager().addItemToInventory(rune);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 971012: //wrapped glass
|
||||
int chance = ThreadLocalRandom.current().nextInt(100);
|
||||
if(chance == 50){
|
||||
int ID = 7000000;
|
||||
int additional = ThreadLocalRandom.current().nextInt(0,28);
|
||||
ID += (additional * 10);
|
||||
ItemBase glassBase = ItemBase.getItemBase(ID);
|
||||
if(glassBase != null) {
|
||||
winnings = new MobLoot(playerCharacter, glassBase, 1, false);
|
||||
ChatManager.chatSystemInfo(playerCharacter, "You've Won A " + glassBase.getName());
|
||||
}
|
||||
}else{
|
||||
ChatManager.chatSystemInfo(playerCharacter, "Please Try Again!");
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (winnings == null) {
|
||||
itemMan.consume(gift);
|
||||
itemMan.updateInventory();
|
||||
return;
|
||||
}
|
||||
|
||||
//early exit if the inventory of the player will not hold the item
|
||||
|
||||
if (!itemMan.hasRoomInventory(winnings.getItemBase().getWeight())) {
|
||||
ErrorPopupMsg.sendErrorPopup(playerCharacter, 21);
|
||||
return;
|
||||
}
|
||||
|
||||
winnings.setIsID(true);
|
||||
|
||||
//remove gift from inventory
|
||||
|
||||
itemMan.consume(gift);
|
||||
|
||||
//add winnings to player inventory
|
||||
|
||||
Item playerWinnings = winnings.promoteToItem(playerCharacter);
|
||||
itemMan.addItemToInventory(playerWinnings);
|
||||
itemMan.updateInventory();
|
||||
|
||||
}
|
||||
public static void peddleFate(PlayerCharacter playerCharacter, Item gift) {
|
||||
|
||||
//get table ID for the itembase ID
|
||||
@@ -392,12 +729,12 @@ public enum LootManager {
|
||||
|
||||
//check if player owns the gift he is trying to open
|
||||
|
||||
if (itemMan.doesCharOwnThisItem(gift.getObjectUUID()) == false)
|
||||
if (!itemMan.doesCharOwnThisItem(gift.getObjectUUID()))
|
||||
return;
|
||||
|
||||
//roll 1-100 for the gen table selection
|
||||
|
||||
int genRoll = ThreadLocalRandom.current().nextInt(1, 100 + 1);
|
||||
int genRoll = ThreadLocalRandom.current().nextInt(94, 100) + 1;
|
||||
GenTableEntry selectedRow = GenTableEntry.rollTable(tableID, genRoll, LootManager.NORMAL_DROP_RATE);
|
||||
|
||||
if(selectedRow == null)
|
||||
@@ -413,45 +750,276 @@ public enum LootManager {
|
||||
|
||||
//create the item from the table, quantity is always 1
|
||||
|
||||
MobLoot winnings = new MobLoot(playerCharacter, ItemBase.getItemBase(selectedItem.cacheID), 1, false);
|
||||
ItemBase ib = ItemBase.getItemBase(selectedItem.cacheID);
|
||||
if(ib.getUUID() == Warehouse.coalIB.getUUID()){
|
||||
//no more coal, give gold instead
|
||||
if (itemMan.getGoldInventory().getNumOfItems() + 250000 > MBServerStatics.PLAYER_GOLD_LIMIT) {
|
||||
ErrorPopupMsg.sendErrorPopup(playerCharacter, 21);
|
||||
return;
|
||||
}
|
||||
itemMan.addGoldToInventory(250000,false);
|
||||
itemMan.updateInventory();
|
||||
}else {
|
||||
MobLoot winnings = new MobLoot(playerCharacter, ib, 1, false);
|
||||
|
||||
if (winnings == null)
|
||||
return;
|
||||
if (winnings == null)
|
||||
return;
|
||||
|
||||
//early exit if the inventory of the player will not old the item
|
||||
//early exit if the inventory of the player will not hold the item
|
||||
|
||||
if (itemMan.hasRoomInventory(winnings.getItemBase().getWeight()) == false) {
|
||||
ErrorPopupMsg.sendErrorPopup(playerCharacter, 21);
|
||||
return;
|
||||
if (itemMan.hasRoomInventory(winnings.getItemBase().getWeight()) == false) {
|
||||
ErrorPopupMsg.sendErrorPopup(playerCharacter, 21);
|
||||
return;
|
||||
}
|
||||
|
||||
//determine if the winning item needs a prefix
|
||||
|
||||
if (selectedRow.pModTable != 0) {
|
||||
int prefixRoll = ThreadLocalRandom.current().nextInt(220, 320 + 1);
|
||||
ModTableEntry prefix = ModTableEntry.rollTable(selectedRow.pModTable, prefixRoll);
|
||||
if (prefix != null)
|
||||
winnings.addPermanentEnchantment(prefix.action, 0, prefix.level, true);
|
||||
}
|
||||
|
||||
//determine if the winning item needs a suffix
|
||||
|
||||
if (selectedRow.sModTable != 0) {
|
||||
int suffixRoll = ThreadLocalRandom.current().nextInt(220, 320 + 1);
|
||||
ModTableEntry suffix = ModTableEntry.rollTable(selectedRow.sModTable, suffixRoll);
|
||||
if (suffix != null)
|
||||
winnings.addPermanentEnchantment(suffix.action, 0, suffix.level, true);
|
||||
}
|
||||
winnings.setIsID(true);
|
||||
|
||||
//remove gift from inventory
|
||||
|
||||
itemMan.consume(gift);
|
||||
|
||||
//add winnings to player inventory
|
||||
|
||||
Item playerWinnings = winnings.promoteToItem(playerCharacter);
|
||||
itemMan.addItemToInventory(playerWinnings);
|
||||
itemMan.updateInventory();
|
||||
}
|
||||
}
|
||||
|
||||
public static int rollRandomItem(int itemTable){
|
||||
int returnedID = ItemTableEntry.getRandomItem(itemTable);
|
||||
return returnedID;
|
||||
}
|
||||
|
||||
public static ItemBase getRandomVorg(ItemBase itemBase){
|
||||
int roll = 0;
|
||||
if(vorg_ha_uuids.contains(itemBase.getUUID())) {
|
||||
roll = ThreadLocalRandom.current().nextInt(0, 9);
|
||||
switch (roll) {
|
||||
case 1:
|
||||
return ItemBase.getItemBase(vorg_ha_uuids.get(0));
|
||||
case 2:
|
||||
return ItemBase.getItemBase(vorg_ha_uuids.get(1));
|
||||
case 3:
|
||||
return ItemBase.getItemBase(vorg_ha_uuids.get(2));
|
||||
case 4:
|
||||
return ItemBase.getItemBase(vorg_ha_uuids.get(3));
|
||||
case 5:
|
||||
return ItemBase.getItemBase(vorg_ha_uuids.get(4));
|
||||
case 6:
|
||||
return ItemBase.getItemBase(vorg_ha_uuids.get(5));
|
||||
case 7:
|
||||
return ItemBase.getItemBase(vorg_ha_uuids.get(6));
|
||||
case 8:
|
||||
return ItemBase.getItemBase(vorg_ha_uuids.get(7));
|
||||
default:
|
||||
return ItemBase.getItemBase(vorg_ha_uuids.get(8));
|
||||
}
|
||||
}
|
||||
|
||||
//determine if the winning item needs a prefix
|
||||
|
||||
if(selectedRow.pModTable != 0){
|
||||
int prefixRoll = ThreadLocalRandom.current().nextInt(220,320 + 1);
|
||||
ModTableEntry prefix = ModTableEntry.rollTable(selectedRow.pModTable, prefixRoll);
|
||||
if(prefix != null)
|
||||
winnings.addPermanentEnchantment(prefix.action, 0, prefix.level, true);
|
||||
if(vorg_ma_uuids.contains(itemBase.getUUID())) {
|
||||
roll = ThreadLocalRandom.current().nextInt(0, 8);
|
||||
switch (roll) {
|
||||
case 1:
|
||||
return ItemBase.getItemBase(vorg_ma_uuids.get(0));
|
||||
case 2:
|
||||
return ItemBase.getItemBase(vorg_ma_uuids.get(1));
|
||||
case 3:
|
||||
return ItemBase.getItemBase(vorg_ma_uuids.get(2));
|
||||
case 4:
|
||||
return ItemBase.getItemBase(vorg_ma_uuids.get(3));
|
||||
case 5:
|
||||
return ItemBase.getItemBase(vorg_ma_uuids.get(4));
|
||||
case 6:
|
||||
return ItemBase.getItemBase(vorg_ma_uuids.get(5));
|
||||
case 7:
|
||||
return ItemBase.getItemBase(vorg_ma_uuids.get(6));
|
||||
default:
|
||||
return ItemBase.getItemBase(vorg_ma_uuids.get(7));
|
||||
}
|
||||
}
|
||||
|
||||
//determine if the winning item needs a suffix
|
||||
|
||||
if(selectedRow.sModTable != 0){
|
||||
int suffixRoll = ThreadLocalRandom.current().nextInt(220,320 + 1);
|
||||
ModTableEntry suffix = ModTableEntry.rollTable(selectedRow.sModTable, suffixRoll);
|
||||
if (suffix != null)
|
||||
winnings.addPermanentEnchantment(suffix.action, 0, suffix.level, true);
|
||||
if(vorg_la_uuids.contains(itemBase.getUUID())) {
|
||||
roll = ThreadLocalRandom.current().nextInt(0, 8);
|
||||
switch (roll) {
|
||||
case 1:
|
||||
return ItemBase.getItemBase(vorg_la_uuids.get(0));
|
||||
case 2:
|
||||
return ItemBase.getItemBase(vorg_la_uuids.get(1));
|
||||
case 3:
|
||||
return ItemBase.getItemBase(vorg_la_uuids.get(2));
|
||||
case 4:
|
||||
return ItemBase.getItemBase(vorg_la_uuids.get(3));
|
||||
case 5:
|
||||
return ItemBase.getItemBase(vorg_la_uuids.get(4));
|
||||
case 6:
|
||||
return ItemBase.getItemBase(vorg_la_uuids.get(5));
|
||||
case 7:
|
||||
return ItemBase.getItemBase(vorg_la_uuids.get(6));
|
||||
default:
|
||||
return ItemBase.getItemBase(vorg_la_uuids.get(7));
|
||||
}
|
||||
}
|
||||
winnings.setIsID(true);
|
||||
|
||||
//remove gift from inventory
|
||||
if(vorg_cloth_uuids.contains(itemBase.getUUID())) {
|
||||
roll = ThreadLocalRandom.current().nextInt(0, 5);
|
||||
switch (roll) {
|
||||
case 1:
|
||||
return ItemBase.getItemBase(vorg_cloth_uuids.get(0));
|
||||
case 2:
|
||||
return ItemBase.getItemBase(vorg_cloth_uuids.get(1));
|
||||
case 3:
|
||||
return ItemBase.getItemBase(vorg_cloth_uuids.get(2));
|
||||
case 4:
|
||||
return ItemBase.getItemBase(vorg_cloth_uuids.get(3));
|
||||
default:
|
||||
return ItemBase.getItemBase(vorg_cloth_uuids.get(4));
|
||||
}
|
||||
}
|
||||
|
||||
itemMan.consume(gift);
|
||||
return null;
|
||||
}
|
||||
|
||||
//add winnings to player inventory
|
||||
public static void DropPresent(Mob mob){
|
||||
int random = 971049 + ThreadLocalRandom.current().nextInt(24);
|
||||
if (random > 971071)
|
||||
random = 971071;
|
||||
|
||||
Item playerWinnings = winnings.promoteToItem(playerCharacter);
|
||||
itemMan.addItemToInventory(playerWinnings);
|
||||
itemMan.updateInventory();
|
||||
ItemBase present = ItemBase.getItemBase(random);
|
||||
if (present != null) {
|
||||
MobLoot toAdd = new MobLoot(mob, present, true);
|
||||
|
||||
if (toAdd != null)
|
||||
mob.getCharItemManager().addItemToInventory(toAdd);
|
||||
}
|
||||
}
|
||||
|
||||
public static void GenerateStrongholdLoot(Mob mob, boolean commander, boolean epic) {
|
||||
|
||||
mob.getCharItemManager().clearInventory();
|
||||
|
||||
int multiplier = 1;
|
||||
if (commander)
|
||||
multiplier = 2;
|
||||
if(epic)
|
||||
multiplier = 10;
|
||||
|
||||
int high = 125000;
|
||||
int low = 50000;
|
||||
int gold = ThreadLocalRandom.current().nextInt(low, high + 1) * multiplier;
|
||||
|
||||
if (gold > 0) {
|
||||
MobLoot goldAmount = new MobLoot(mob, gold);
|
||||
mob.getCharItemManager().addItemToInventory(goldAmount);
|
||||
}
|
||||
|
||||
//present drop chance for all
|
||||
//if (ThreadLocalRandom.current().nextInt(100) < 35)
|
||||
// DropPresent(mob);
|
||||
|
||||
//random contract drop chance for all
|
||||
if (ThreadLocalRandom.current().nextInt(100) < 40) {
|
||||
int contractTableID = 250;
|
||||
contractTableID += ThreadLocalRandom.current().nextInt(0, 11);
|
||||
if (contractTableID > 259)
|
||||
contractTableID = 659;
|
||||
|
||||
int id = rollRandomItem(contractTableID);
|
||||
ItemBase ib = ItemBase.getItemBase(id);
|
||||
if (ib != null) {
|
||||
MobLoot contract = new MobLoot(mob, ib, true);
|
||||
|
||||
if (contract != null)
|
||||
mob.getCharItemManager().addItemToInventory(contract);
|
||||
}
|
||||
}
|
||||
|
||||
//special commander drop chances
|
||||
if (commander)
|
||||
GenerateCommanderLoot(mob,false);
|
||||
|
||||
//special epic drop chances
|
||||
if (epic) {
|
||||
GenerateCommanderLoot(mob, true);
|
||||
GenerateCommanderLoot(mob,false);
|
||||
}
|
||||
}
|
||||
|
||||
public static void GenerateCommanderLoot(Mob mob, boolean epic){
|
||||
//present chance
|
||||
if (ThreadLocalRandom.current().nextInt(100) < 25)
|
||||
DropPresent(mob);
|
||||
|
||||
//present chance
|
||||
if (ThreadLocalRandom.current().nextInt(100) < 25)
|
||||
DropPresent(mob);
|
||||
|
||||
//chance for glass
|
||||
if (ThreadLocalRandom.current().nextInt(100) < 75) {
|
||||
int glassID = rollRandomItem(126);
|
||||
ItemBase glassItem = ItemBase.getItemBase(glassID);
|
||||
if (glassItem != null) {
|
||||
MobLoot toAdd2 = new MobLoot(mob, glassItem, true);
|
||||
|
||||
if (toAdd2 != null)
|
||||
mob.getCharItemManager().addItemToInventory(toAdd2);
|
||||
}
|
||||
}
|
||||
|
||||
//chance for disc
|
||||
if (ThreadLocalRandom.current().nextInt(100) < 75) {
|
||||
int discID = rollRandomItem(3202);
|
||||
ItemBase discItem = ItemBase.getItemBase(discID);
|
||||
if (discItem != null) {
|
||||
MobLoot toAdd3 = new MobLoot(mob, discItem, true);
|
||||
|
||||
if (toAdd3 != null)
|
||||
mob.getCharItemManager().addItemToInventory(toAdd3);
|
||||
}
|
||||
}
|
||||
|
||||
//chance for stat rune
|
||||
if (ThreadLocalRandom.current().nextInt(100) < 75) {
|
||||
int runeID = rollRandomItem(3201);
|
||||
ItemBase runeItem = ItemBase.getItemBase(runeID);
|
||||
if (runeItem != null) {
|
||||
MobLoot toAdd4 = new MobLoot(mob, runeItem, true);
|
||||
|
||||
if (toAdd4 != null)
|
||||
mob.getCharItemManager().addItemToInventory(toAdd4);
|
||||
}
|
||||
}
|
||||
if(epic){
|
||||
int contractTableID = 250;
|
||||
contractTableID += ThreadLocalRandom.current().nextInt(0, 11);
|
||||
if (contractTableID > 259)
|
||||
contractTableID = 659;
|
||||
|
||||
int id = rollRandomItem(contractTableID);
|
||||
ItemBase ib = ItemBase.getItemBase(id);
|
||||
if (ib != null) {
|
||||
MobLoot contract = new MobLoot(mob, ib, true);
|
||||
|
||||
if (contract != null)
|
||||
mob.getCharItemManager().addItemToInventory(contract);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,130 @@
|
||||
package engine.gameManager;
|
||||
|
||||
import engine.Enum;
|
||||
import engine.math.Vector3fImmutable;
|
||||
import engine.objects.Guild;
|
||||
import engine.objects.Mine;
|
||||
import engine.objects.PlayerCharacter;
|
||||
import engine.objects.Regions;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
public class LoreMineManager {
|
||||
|
||||
//Saetor Allowed Charters:
|
||||
//BARBARIAN
|
||||
//MILITARY
|
||||
//RANGER
|
||||
//AMAZON
|
||||
//WIZARD
|
||||
//MERCENARY
|
||||
//THIEVES
|
||||
//SCOURGE
|
||||
//UNHOLY
|
||||
public static final Map<Enum.GuildType, List<String>> GUILD_RACES = new HashMap<>();
|
||||
public static final Map<Enum.GuildType, List<String>> GUILD_CLASSES = new HashMap<>();
|
||||
public static final Map<Enum.GuildType, Boolean> GUILD_GENDER_RESTRICTION = new HashMap<>();
|
||||
|
||||
static {
|
||||
GUILD_RACES.put(Enum.GuildType.CATHEDRAL, Arrays.asList("Aelfborn", "Centaur", "Elf", "Half Giant", "Human"));
|
||||
GUILD_CLASSES.put(Enum.GuildType.CATHEDRAL, Arrays.asList("Bard", "Channeler", "Crusader", "Nightstalker", "Prelate", "Priest", "Scout", "Sentinel"));
|
||||
|
||||
GUILD_RACES.put(Enum.GuildType.MILITARY, Arrays.asList("Centaur", "Half Giant", "Human", "Saetor"));
|
||||
GUILD_CLASSES.put(Enum.GuildType.MILITARY, Arrays.asList("Bard", "Priest", "Scout", "Warlock", "Warrior", "Wizard"));
|
||||
|
||||
GUILD_RACES.put(Enum.GuildType.TEMPLE, Arrays.asList("Half Giant", "Human"));
|
||||
GUILD_CLASSES.put(Enum.GuildType.TEMPLE, Arrays.asList("Assassin", "Bard", "Channeler", "Confessor", "Nightstalker", "Priest", "Scout", "Templar"));
|
||||
|
||||
GUILD_RACES.put(Enum.GuildType.BARBARIAN, Arrays.asList("Aelfborn", "Half Giant", "Human", "Minotaur", "Saetor"));
|
||||
GUILD_CLASSES.put(Enum.GuildType.BARBARIAN, Arrays.asList("Barbarian", "Bard", "Doomsayer", "Fury", "Priest", "Scout", "Thief", "Warrior"));
|
||||
|
||||
GUILD_RACES.put(Enum.GuildType.RANGER, Arrays.asList("Aelfborn", "Elf", "Half Giant", "Human", "Shade", "Saetor"));
|
||||
GUILD_CLASSES.put(Enum.GuildType.RANGER, Arrays.asList("Bard", "Channeler", "Druid", "Priest", "Ranger", "Scout", "Warrior"));
|
||||
|
||||
GUILD_RACES.put(Enum.GuildType.AMAZON, Arrays.asList("Aelfborn", "Elf", "Half Giant", "Human", "Saetor"));
|
||||
GUILD_CLASSES.put(Enum.GuildType.AMAZON, Arrays.asList("Bard", "Druid", "Fury", "Huntress", "Priest", "Scout", "Warrior", "Wizard"));
|
||||
GUILD_GENDER_RESTRICTION.put(Enum.GuildType.AMAZON, true); // Female only
|
||||
|
||||
GUILD_RACES.put(Enum.GuildType.NOBLE, Arrays.asList("Aelfborn", "Half Giant", "Human"));
|
||||
GUILD_CLASSES.put(Enum.GuildType.NOBLE, Arrays.asList("Assassin", "Bard", "Channeler", "Priest", "Scout", "Thief", "Warlock", "Warrior", "Wizard"));
|
||||
|
||||
GUILD_RACES.put(Enum.GuildType.WIZARD, Arrays.asList("Aelfborn", "Elf", "Human", "Nephilim", "Shade", "Saetor"));
|
||||
GUILD_CLASSES.put(Enum.GuildType.WIZARD, Arrays.asList("Assassin", "Bard", "Channeler", "Doomsayer", "Fury", "Necromancer", "Priest", "Warlock", "Wizard"));
|
||||
|
||||
GUILD_RACES.put(Enum.GuildType.MERCENARY, Arrays.asList("Aelfborn", "Aracoix", "Half Giant", "Human", "Shade", "Saetor"));
|
||||
GUILD_CLASSES.put(Enum.GuildType.MERCENARY, Arrays.asList("Assassin", "Bard", "Priest", "Scout", "Thief", "Warlock", "Warrior"));
|
||||
|
||||
GUILD_RACES.put(Enum.GuildType.THIEVES, Arrays.asList("Aelfborn", "Aracoix", "Elf", "Human", "Irekei", "Nephilim", "Shade", "Vampire", "Saetor"));
|
||||
GUILD_CLASSES.put(Enum.GuildType.THIEVES, Arrays.asList("Assassin", "Barbarian", "Bard", "Priest", "Scout", "Thief", "Wizard"));
|
||||
|
||||
GUILD_RACES.put(Enum.GuildType.DWARF, Arrays.asList("Dwarf"));
|
||||
GUILD_CLASSES.put(Enum.GuildType.DWARF, Arrays.asList("Crusader", "Prelate", "Priest", "Sentinel", "Warrior"));
|
||||
|
||||
GUILD_RACES.put(Enum.GuildType.HIGHCOURT, Arrays.asList("Elf", "Minotaur"));
|
||||
GUILD_CLASSES.put(Enum.GuildType.HIGHCOURT, Arrays.asList("Assassin", "Bard", "Channeler", "Druid", "Necromancer", "Priest", "Ranger", "Scout", "Thief", "Warrior", "Wizard"));
|
||||
|
||||
GUILD_RACES.put(Enum.GuildType.VIRAKT, Arrays.asList("Irekei"));
|
||||
GUILD_CLASSES.put(Enum.GuildType.VIRAKT, Arrays.asList("Assassin", "Bard", "Channeler", "Fury", "Huntress", "Nightstalker", "Priest", "Ranger", "Scout", "Thief", "Warrior", "Wizard"));
|
||||
|
||||
GUILD_RACES.put(Enum.GuildType.SCOURGE, Arrays.asList("Aelfborn", "Human", "Minotaur", "Nephilim", "Saetor"));
|
||||
GUILD_CLASSES.put(Enum.GuildType.SCOURGE, Arrays.asList("Bard", "Channeler", "Doomsayer", "Priest", "Scout", "Warrior", "Wizard"));
|
||||
|
||||
GUILD_RACES.put(Enum.GuildType.KHREE, Arrays.asList("Aracoix"));
|
||||
GUILD_CLASSES.put(Enum.GuildType.KHREE, Arrays.asList("Assassin", "Barbarian", "Bard", "Huntress", "Priest", "Ranger", "Scout", "Thief", "Warlock", "Warrior"));
|
||||
|
||||
GUILD_RACES.put(Enum.GuildType.CENTAUR, Arrays.asList("Centaur"));
|
||||
GUILD_CLASSES.put(Enum.GuildType.CENTAUR, Arrays.asList("Barbarian", "Crusader", "Druid", "Huntress", "Prelate", "Priest", "Ranger", "Sentinel", "Warrior"));
|
||||
|
||||
GUILD_RACES.put(Enum.GuildType.UNHOLY, Arrays.asList("Human", "Shade", "Vampire", "Saetor"));
|
||||
GUILD_CLASSES.put(Enum.GuildType.UNHOLY, Arrays.asList("Assassin", "Channeler", "Necromancer", "Priest", "Scout", "Thief", "Warlock", "Warrior", "Wizard"));
|
||||
}
|
||||
|
||||
public static void AuditPlayer(PlayerCharacter pc, Mine mine){
|
||||
Guild nation = pc.guild.getNation();
|
||||
|
||||
if(mine.chosen_charters == null){
|
||||
mine.chosen_charters = new HashMap<>();
|
||||
}
|
||||
|
||||
Enum.GuildType guildType;
|
||||
if (mine.chosen_charters.containsKey(nation)) {
|
||||
guildType = mine.chosen_charters.get(nation);
|
||||
}else{
|
||||
guildType = Enum.GuildType.getGuildTypeFromInt(pc.guild.getCharter());
|
||||
mine.chosen_charters.put(nation,guildType);
|
||||
}
|
||||
|
||||
if(!validForCharter(pc,guildType)){
|
||||
//bounce out to SDR
|
||||
Vector3fImmutable bounceLoc = Vector3fImmutable.getRandomPointOnCircle(ZoneManager.getZoneByUUID(656).getLoc(),30f);
|
||||
pc.setLoc(bounceLoc);
|
||||
MovementManager.translocate(pc, bounceLoc, Regions.GetRegionForTeleport(ZoneManager.getZoneByUUID(656).getLoc()));
|
||||
ChatManager.chatSystemInfo(pc, "You Failed To Meet Lore Requirements");
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean validForCharter(PlayerCharacter pc, Enum.GuildType guildType) {
|
||||
if(pc.getPromotionClass() == null)
|
||||
return false;
|
||||
|
||||
// Define the races and classes for each GuildType
|
||||
|
||||
|
||||
// Get the allowed races and classes for this guildType
|
||||
List<String> allowedRaces = GUILD_RACES.getOrDefault(guildType, Collections.emptyList());
|
||||
List<String> allowedClasses = GUILD_CLASSES.getOrDefault(guildType, Collections.emptyList());
|
||||
|
||||
// Validate player's race and class
|
||||
if (!allowedRaces.contains(pc.getRace().getName()) || !allowedClasses.contains(pc.getPromotionClass().getName())) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Gender restriction check for AMAZON
|
||||
if (guildType.equals(Enum.GuildType.AMAZON) && pc.isMale() && pc.getRaceID() != 1999) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -24,7 +24,7 @@ public enum MaintenanceManager {
|
||||
|
||||
public static void setMaintDateTime(Building building, LocalDateTime maintDate) {
|
||||
|
||||
building.maintDateTime = maintDate;
|
||||
building.maintDateTime = maintDate.withHour(1).withMinute(0).withSecond(0);
|
||||
DbManager.BuildingQueries.updateMaintDate(building);
|
||||
|
||||
}
|
||||
@@ -49,19 +49,15 @@ public enum MaintenanceManager {
|
||||
|
||||
if (chargeUpkeep(building) == false)
|
||||
derankList.add(building);
|
||||
else
|
||||
setMaintDateTime(building, LocalDateTime.now().plusDays(7));
|
||||
}
|
||||
// Reset maintenance dates for these buildings
|
||||
|
||||
for (Building building : maintList) {
|
||||
setMaintDateTime(building, LocalDateTime.now().plusDays(7));
|
||||
|
||||
}
|
||||
// Derak or destroy buildings that did not
|
||||
// have funds available.
|
||||
|
||||
for (Building building : derankList)
|
||||
for (Building building : derankList) {
|
||||
building.destroyOrDerank(null);
|
||||
|
||||
if(building.getRank() > 0)
|
||||
setMaintDateTime(building, LocalDateTime.now().plusDays(1));
|
||||
}
|
||||
Logger.info("Structures: " + buildingList.size() + " Maint: " + maintList.size() + " Derank: " + derankList.size());
|
||||
}
|
||||
|
||||
@@ -98,6 +94,10 @@ public enum MaintenanceManager {
|
||||
continue;
|
||||
}
|
||||
|
||||
//only ToL pays maintenance
|
||||
if(building.getBlueprint().getBuildingGroup() != null && !building.getBlueprint().getBuildingGroup().equals(Enum.BuildingGroup.TOL))
|
||||
continue;
|
||||
|
||||
// No maintenance on banestones omfg
|
||||
|
||||
if (building.getBlueprint().getBuildingGroup().equals(Enum.BuildingGroup.BANESTONE))
|
||||
@@ -122,9 +122,9 @@ public enum MaintenanceManager {
|
||||
|
||||
|
||||
//no maintenance if day of week doesnt match
|
||||
if (LocalDateTime.now().getDayOfWeek().ordinal() != building.maintDateTime.getDayOfWeek().ordinal()) {
|
||||
continue;
|
||||
}
|
||||
//if (LocalDateTime.now().getDayOfWeek().ordinal() != building.maintDateTime.getDayOfWeek().ordinal()) {
|
||||
// continue;
|
||||
//}
|
||||
// Add building to maintenance queue
|
||||
|
||||
maintList.add(building);
|
||||
@@ -186,49 +186,8 @@ public enum MaintenanceManager {
|
||||
// If this is an R8 tree, validate that we can
|
||||
// cover the resources required
|
||||
|
||||
if (building.getRank() == 8) {
|
||||
|
||||
hasResources = true;
|
||||
|
||||
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;
|
||||
|
||||
}
|
||||
}
|
||||
// Validation completed but has failed. We can derank
|
||||
// the target building and early exit
|
||||
|
||||
if ((hasFunds == false) ||
|
||||
((building.getRank() == 8) && !hasResources)) {
|
||||
|
||||
// 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)));
|
||||
}
|
||||
|
||||
if (hasFunds == false) {
|
||||
return false; // Early exit for having failed to meet maintenance
|
||||
}
|
||||
|
||||
@@ -253,58 +212,6 @@ public enum MaintenanceManager {
|
||||
}
|
||||
}
|
||||
|
||||
// Early exit as we're done if we're not an R8 tree
|
||||
|
||||
if (building.getRank() < 8)
|
||||
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;
|
||||
}
|
||||
|
||||
// Withdraw Lumber
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
// Withdraw Galvor
|
||||
|
||||
resourceValue = warehouse.getResources().get(Warehouse.galvorIB);
|
||||
|
||||
if (DbManager.WarehouseQueries.updateGalvor(warehouse, resourceValue - 5) == true) {
|
||||
warehouse.getResources().put(Warehouse.galvorIB, resourceValue - 5);
|
||||
warehouse.AddTransactionToWarehouse(Enum.GameObjectType.Building, building.getObjectUUID(), Enum.TransactionType.WITHDRAWL, Resource.GALVOR, 5);
|
||||
} else {
|
||||
Logger.error("galvor update failed for warehouse of UUID:" + warehouse.getObjectUUID());
|
||||
return true;
|
||||
}
|
||||
|
||||
resourceValue = warehouse.getResources().get(Warehouse.wormwoodIB);
|
||||
|
||||
if (DbManager.WarehouseQueries.updateWormwood(warehouse, resourceValue - 5) == true) {
|
||||
warehouse.getResources().put(Warehouse.wormwoodIB, resourceValue - 5);
|
||||
warehouse.AddTransactionToWarehouse(Enum.GameObjectType.Building, building.getObjectUUID(), Enum.TransactionType.WITHDRAWL, Resource.WORMWOOD, 5);
|
||||
} else {
|
||||
Logger.error("wyrmwood update failed for warehouse of UUID:" + warehouse.getObjectUUID());
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -66,12 +66,6 @@ public enum MovementManager {
|
||||
if (!toMove.isAlive())
|
||||
return;
|
||||
|
||||
if (toMove.getObjectType().equals(GameObjectType.PlayerCharacter)) {
|
||||
if (((PlayerCharacter) toMove).isCasting())
|
||||
((PlayerCharacter) toMove).update();
|
||||
}
|
||||
|
||||
|
||||
toMove.setIsCasting(false);
|
||||
toMove.setItemCasting(false);
|
||||
|
||||
@@ -96,7 +90,7 @@ public enum MovementManager {
|
||||
if (!toMove.isMoving())
|
||||
toMove.resetLastSetLocUpdate();
|
||||
else
|
||||
toMove.update();
|
||||
toMove.update(false);
|
||||
|
||||
// Update movement for the player
|
||||
|
||||
@@ -105,6 +99,9 @@ public enum MovementManager {
|
||||
// ((Mob)toMove).updateLocation();
|
||||
// get start and end locations for the move
|
||||
Vector3fImmutable startLocation = new Vector3fImmutable(msg.getStartLat(), msg.getStartAlt(), msg.getStartLon());
|
||||
//if(toMove.isMoving()){
|
||||
// startLocation = toMove.getMovementLoc();
|
||||
//}
|
||||
Vector3fImmutable endLocation = new Vector3fImmutable(msg.getEndLat(), msg.getEndAlt(), msg.getEndLon());
|
||||
|
||||
// if (toMove.getObjectType() == GameObjectType.PlayerCharacter)
|
||||
@@ -351,7 +348,7 @@ public enum MovementManager {
|
||||
ChatManager.chatSystemInfo((PlayerCharacter) ac, "Finished Alt change, setting the end location to " + ac.getEndLoc().getX() + ' ' + ac.getEndLoc().getZ() + " moving=" + ac.isMoving() + " and current location is " + curLoc.getX() + ' ' + curLoc.getZ());
|
||||
|
||||
//Send run/walk/sit/stand to tell the client we are flying / landing etc
|
||||
ac.update();
|
||||
ac.update(false);
|
||||
ac.stopMovement(ac.getLoc());
|
||||
if (ac.isAlive())
|
||||
MovementManager.sendRWSSMsg(ac);
|
||||
@@ -408,7 +405,9 @@ public enum MovementManager {
|
||||
if (bonus.getBool(ModType.Stunned, SourceType.None) || bonus.getBool(ModType.CannotMove, SourceType.None))
|
||||
continue;
|
||||
|
||||
member.update();
|
||||
//member.update(false);
|
||||
member.updateLocation();
|
||||
member.updateMovementState();
|
||||
|
||||
|
||||
// All checks passed, let's move the player
|
||||
|
||||
@@ -23,6 +23,14 @@ public enum NPCManager {
|
||||
NPC_MANAGER;
|
||||
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) {
|
||||
|
||||
// Early exit
|
||||
@@ -119,12 +127,10 @@ public enum NPCManager {
|
||||
|
||||
DbManager.removeFromCache(necroPet);
|
||||
|
||||
|
||||
PlayerCharacter petOwner = (PlayerCharacter) necroPet.guardCaptain;
|
||||
PlayerCharacter petOwner = necroPet.getOwner();
|
||||
|
||||
if (petOwner != null) {
|
||||
|
||||
necroPet.guardCaptain = null;
|
||||
necroPet.setOwner(null);
|
||||
petOwner.setPet(null);
|
||||
|
||||
if (updateOwner == false)
|
||||
@@ -222,14 +228,12 @@ public enum NPCManager {
|
||||
WorldGrid.removeObject(toRemove);
|
||||
DbManager.removeFromCache(toRemove);
|
||||
|
||||
|
||||
PlayerCharacter petOwner = (PlayerCharacter) toRemove.guardCaptain;
|
||||
PlayerCharacter petOwner = toRemove.getOwner();
|
||||
|
||||
if (petOwner != null) {
|
||||
|
||||
petOwner.setPet(null);
|
||||
|
||||
toRemove.guardCaptain = null;
|
||||
toRemove.setOwner(null);
|
||||
|
||||
PetMsg petMsg = new PetMsg(5, null);
|
||||
Dispatch dispatch = Dispatch.borrow(petOwner, petMsg);
|
||||
@@ -336,19 +340,10 @@ public enum NPCManager {
|
||||
else
|
||||
buildingSlot = BuildingManager.getAvailableSlot(abstractCharacter.building);
|
||||
|
||||
// Override slot for siege engines
|
||||
//if (buildingSlot == -1)
|
||||
//Logger.error("No available slot for NPC: " + abstractCharacter.getObjectUUID());
|
||||
|
||||
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)
|
||||
Logger.error("No available slot for NPC: " + abstractCharacter.getObjectUUID());
|
||||
|
||||
// Pets are regular mobiles not hirelings (Siege engines)
|
||||
if (abstractCharacter.contract != null)
|
||||
abstractCharacter.building.getHirelings().put(abstractCharacter, buildingSlot);
|
||||
abstractCharacter.building.getHirelings().put(abstractCharacter, buildingSlot);
|
||||
|
||||
// Override bind and location for this npc derived
|
||||
// from BuildingManager slot location data.
|
||||
@@ -375,53 +370,4 @@ public enum NPCManager {
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,6 +10,7 @@ package engine.gameManager;
|
||||
|
||||
import engine.Enum.*;
|
||||
import engine.InterestManagement.HeightMap;
|
||||
import engine.InterestManagement.InterestManager;
|
||||
import engine.InterestManagement.WorldGrid;
|
||||
import engine.db.handlers.dbEffectsBaseHandler;
|
||||
import engine.db.handlers.dbPowerHandler;
|
||||
@@ -163,6 +164,47 @@ public enum PowersManager {
|
||||
public static void usePower(final PerformActionMsg msg, ClientConnection origin,
|
||||
boolean sendCastToSelf) {
|
||||
|
||||
PlayerCharacter pc = SessionManager.getPlayerCharacter(origin);
|
||||
|
||||
if(pc == null)
|
||||
return;
|
||||
|
||||
if(pc.getRecycleTimers().containsKey(msg.getPowerUsedID())) {
|
||||
return;
|
||||
}
|
||||
if(!pc.isFlying() && powersBaseByToken.get(msg.getPowerUsedID()) != null && powersBaseByToken.get(msg.getPowerUsedID()).isSpell) //cant be sitting if flying
|
||||
CombatManager.toggleSit(false,origin);
|
||||
|
||||
//if(pc.isMoving())
|
||||
//pc.stopMovement(pc.getMovementLoc());
|
||||
if(msg.getPowerUsedID() != 421084024 && origin.getPlayerCharacter().getPromotionClassID() != 2513) {
|
||||
if (!origin.getPlayerCharacter().getPowers().containsKey(msg.getPowerUsedID())) {
|
||||
Logger.error(origin.getPlayerCharacter().getFirstName() + " attempted to cast a power they do not have");
|
||||
return;
|
||||
}
|
||||
}
|
||||
//crusader sacrifice
|
||||
if((msg.getPowerUsedID() == 428695403 && msg.getTargetID() == pc.getObjectUUID())){
|
||||
RecyclePowerMsg recyclePowerMsg = new RecyclePowerMsg(msg.getPowerUsedID());
|
||||
Dispatch dispatch = Dispatch.borrow(origin.getPlayerCharacter(), recyclePowerMsg);
|
||||
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY);
|
||||
|
||||
// Send Fail to cast message
|
||||
if (pc != null) {
|
||||
sendPowerMsg(pc, 2, msg);
|
||||
if (pc.isCasting()) {
|
||||
pc.update(false);
|
||||
}
|
||||
|
||||
pc.setIsCasting(false);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if(msg.getPowerUsedID() == -1851459567){//backstab
|
||||
applyPower(pc,pc,pc.loc,-1851459567,msg.getNumTrains(),false);
|
||||
}
|
||||
|
||||
if (usePowerA(msg, origin, sendCastToSelf)) {
|
||||
// Cast failed for some reason, reset timer
|
||||
|
||||
@@ -171,19 +213,20 @@ public enum PowersManager {
|
||||
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY);
|
||||
|
||||
// Send Fail to cast message
|
||||
PlayerCharacter pc = SessionManager
|
||||
.getPlayerCharacter(origin);
|
||||
|
||||
if (pc != null) {
|
||||
sendPowerMsg(pc, 2, msg);
|
||||
if (pc.isCasting()) {
|
||||
pc.update();
|
||||
pc.update(false);
|
||||
}
|
||||
|
||||
pc.setIsCasting(false);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if(msg.getPowerUsedID() == 429429978){
|
||||
origin.getPlayerCharacter().getRecycleTimers().remove(429429978);
|
||||
}
|
||||
}
|
||||
|
||||
public static void useMobPower(Mob caster, AbstractCharacter target, PowersBase pb, int rank) {
|
||||
@@ -192,7 +235,8 @@ public enum PowersManager {
|
||||
msg.setUnknown04(1);
|
||||
|
||||
if (useMobPowerA(msg, caster)) {
|
||||
//sendMobPowerMsg(caster,2,msg); //Lol wtf was i thinking sending msg's to mobs... ZZZZ
|
||||
if(pb.token == -1994153779)
|
||||
InterestManager.setObjectDirty(caster);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -203,8 +247,56 @@ public enum PowersManager {
|
||||
if (playerCharacter == null)
|
||||
return false;
|
||||
|
||||
//if(playerCharacter.getRecycleTimers().containsKey(msg.getPowerUsedID())){
|
||||
// playerCharacter.setIsCasting(false);
|
||||
// playerCharacter.setItemCasting(false);
|
||||
// return false;
|
||||
//}
|
||||
|
||||
boolean CSRCast = false;
|
||||
|
||||
if(msg.getPowerUsedID() == 430628895) {
|
||||
|
||||
boolean failed = false;// group teleport
|
||||
City city = ZoneManager.getCityAtLocation(playerCharacter.loc);
|
||||
if (city == null) {
|
||||
failed = true;
|
||||
}//else{
|
||||
// Bane bane = city.getBane();
|
||||
// if (bane == null) {
|
||||
// failed = true;
|
||||
// }else{
|
||||
// if(!bane.getSiegePhase().equals(SiegePhase.WAR)){
|
||||
// failed = true;
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
if(failed){
|
||||
//check to see if we are at an active mine
|
||||
Zone zone = ZoneManager.findSmallestZone(playerCharacter.loc);
|
||||
if(zone != null){
|
||||
Mine mine = null;
|
||||
for(Building building : zone.zoneBuildingSet){
|
||||
if(building.getBlueprint().getBuildingGroup().equals(BuildingGroup.MINE)){
|
||||
mine = Mine.getMineFromTower(building.getObjectUUID());
|
||||
}
|
||||
}
|
||||
if(mine != null){
|
||||
failed = !mine.isActive;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(failed) {
|
||||
playerCharacter.setIsCasting(false);
|
||||
|
||||
RecyclePowerMsg recyclePowerMsg = new RecyclePowerMsg(msg.getPowerUsedID());
|
||||
Dispatch dispatch = Dispatch.borrow(playerCharacter, recyclePowerMsg);
|
||||
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY);
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (MBServerStatics.POWERS_DEBUG) {
|
||||
ChatManager.chatSayInfo(
|
||||
@@ -241,6 +333,7 @@ public enum PowersManager {
|
||||
|
||||
// get power
|
||||
PowersBase pb = PowersManager.powersBaseByToken.get(msg.getPowerUsedID());
|
||||
|
||||
if (pb == null) {
|
||||
ChatManager.chatSayInfo(playerCharacter,
|
||||
"This power is not implemented yet.");
|
||||
@@ -252,6 +345,35 @@ public enum PowersManager {
|
||||
// return false;
|
||||
}
|
||||
|
||||
//check for movement buffs while flying
|
||||
if(playerCharacter.isFlying()) {
|
||||
switch(pb.token){
|
||||
case 429005674:
|
||||
case 429505739:
|
||||
case 431054700:
|
||||
case 428005600:
|
||||
case 431610080:
|
||||
case 427935608:
|
||||
case 427857146:
|
||||
case 427988218:
|
||||
case 431854842:
|
||||
case 421074170:
|
||||
case 429611355:
|
||||
case 428955899:
|
||||
case 1794395699:
|
||||
case 429428796:
|
||||
case 1514898036:
|
||||
ChatManager.chatSystemInfo(playerCharacter, "You Cannot Fly While Having A MovementBuff");
|
||||
//resync stamina
|
||||
playerCharacter.setStamina(playerCharacter.getStamina(), playerCharacter);
|
||||
|
||||
// Update all surrounding clients.
|
||||
TargetedActionMsg cmm = new TargetedActionMsg(playerCharacter);
|
||||
DispatchMessage.dispatchMsgToInterestArea(playerCharacter, cmm, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (playerCharacter.getLastPower() != null)
|
||||
return true;
|
||||
|
||||
@@ -259,17 +381,18 @@ public enum PowersManager {
|
||||
|
||||
|
||||
// Check powers for normal users
|
||||
if (playerCharacter.getPowers() == null || !playerCharacter.getPowers().containsKey(msg.getPowerUsedID()))
|
||||
if (!playerCharacter.isCSR()) {
|
||||
if (!MBServerStatics.POWERS_DEBUG) {
|
||||
// ChatManager.chatSayInfo(pc, "You may not cast that spell!");
|
||||
|
||||
Logger.info("usePowerA(): Cheat attempted? '" + msg.getPowerUsedID() + "' was not associated with " + playerCharacter.getName());
|
||||
return true;
|
||||
}
|
||||
} else
|
||||
CSRCast = true;
|
||||
if(msg.getPowerUsedID() != 421084024) {
|
||||
if (playerCharacter.getPowers() == null || !playerCharacter.getPowers().containsKey(msg.getPowerUsedID()))
|
||||
if (!playerCharacter.isCSR()) {
|
||||
if (!MBServerStatics.POWERS_DEBUG) {
|
||||
// ChatManager.chatSayInfo(pc, "You may not cast that spell!");
|
||||
|
||||
Logger.info("usePowerA(): Cheat attempted? '" + msg.getPowerUsedID() + "' was not associated with " + playerCharacter.getName());
|
||||
return true;
|
||||
}
|
||||
} else
|
||||
CSRCast = true;
|
||||
}
|
||||
// get numTrains for power
|
||||
int trains = msg.getNumTrains();
|
||||
|
||||
@@ -279,6 +402,14 @@ public enum PowersManager {
|
||||
msg.setNumTrains(trains);
|
||||
}
|
||||
|
||||
//double stack point values for some useless disc spells
|
||||
switch(pb.token){
|
||||
case 429420458: // BH eyes
|
||||
case 429601664: // huntsman skin the beast
|
||||
msg.setNumTrains(msg.getNumTrains() * 2);
|
||||
break;
|
||||
}
|
||||
|
||||
// can't go over total trains by player
|
||||
if (playerCharacter.getPowers() != null && playerCharacter.getPowers().containsKey(msg.getPowerUsedID())) {
|
||||
CharacterPower cp = playerCharacter.getPowers().get(msg.getPowerUsedID());
|
||||
@@ -370,15 +501,20 @@ public enum PowersManager {
|
||||
float range = pb.getRange();
|
||||
// verify target is in range
|
||||
|
||||
if(pb.token != 429396028) {
|
||||
|
||||
if (verifyInvalidRange(playerCharacter, target, range))
|
||||
// (pc.getLoc().distance(target.getLoc()) > pb.getRange()) {
|
||||
// TODO send message that target is out of range
|
||||
return true;
|
||||
// verify target is valid type
|
||||
if (!validateTarget(target, playerCharacter, pb))
|
||||
return true;
|
||||
}else{
|
||||
pb.isSpell = false;
|
||||
}
|
||||
|
||||
if (verifyInvalidRange(playerCharacter, target, range))
|
||||
// (pc.getLoc().distance(target.getLoc()) > pb.getRange()) {
|
||||
// TODO send message that target is out of range
|
||||
return true;
|
||||
|
||||
// verify target is valid type
|
||||
if (!validateTarget(target, playerCharacter, pb))
|
||||
return true;
|
||||
|
||||
|
||||
if (AbstractWorldObject.IsAbstractCharacter(target))
|
||||
@@ -409,6 +545,23 @@ public enum PowersManager {
|
||||
}
|
||||
}
|
||||
|
||||
if(!passed){
|
||||
if (playerCharacter.getRace().getName().contains("Shade")) {
|
||||
if(playerCharacter.getHidden() > 0){
|
||||
switch(msg.getPowerUsedID()){
|
||||
case -1851459567:
|
||||
case 2094922127:
|
||||
case -355707373:
|
||||
case 246186475:
|
||||
case 666419835:
|
||||
case 1480354319:
|
||||
passed = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!passed)
|
||||
return true;
|
||||
}
|
||||
@@ -487,7 +640,6 @@ public enum PowersManager {
|
||||
// Validity checks passed, move on to casting spell
|
||||
//get caster's live counter
|
||||
int casterLiveCounter = playerCharacter.getLiveCounter();
|
||||
|
||||
// run recycle job for when cast is available again, don't bother adding the timer for CSRs
|
||||
if (time > 0) {
|
||||
FinishRecycleTimeJob frtj = new FinishRecycleTimeJob(playerCharacter, msg);
|
||||
@@ -514,7 +666,7 @@ public enum PowersManager {
|
||||
|
||||
// make person casting stand up if spell (unless they're casting a chant which does not make them stand up)
|
||||
if (pb.isSpell() && !pb.isChant() && playerCharacter.isSit()) {
|
||||
playerCharacter.update();
|
||||
playerCharacter.update(false);
|
||||
playerCharacter.setSit(false);
|
||||
UpdateStateMsg updateStateMsg = new UpdateStateMsg(playerCharacter);
|
||||
DispatchMessage.dispatchMsgToInterestArea(playerCharacter, updateStateMsg, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false);
|
||||
@@ -522,10 +674,12 @@ public enum PowersManager {
|
||||
}
|
||||
|
||||
// update cast (use skill) fail condition
|
||||
playerCharacter.cancelOnCast();
|
||||
if(pb.token != 429396028 && pb.breaksForm) {
|
||||
playerCharacter.cancelOnCast();
|
||||
}
|
||||
|
||||
// update castSpell (use spell) fail condition if spell
|
||||
if (pb.isSpell())
|
||||
if (pb.isSpell() && pb.breaksForm)
|
||||
playerCharacter.cancelOnSpell();
|
||||
|
||||
// get cast time in ms.
|
||||
@@ -535,13 +689,12 @@ public enum PowersManager {
|
||||
|
||||
|
||||
if (time > 100) {
|
||||
playerCharacter.update();
|
||||
playerCharacter.update(false);
|
||||
playerCharacter.setIsCasting(true);
|
||||
}
|
||||
|
||||
|
||||
playerCharacter.setLastMovementState(playerCharacter.getMovementState());
|
||||
|
||||
// run timer job to end cast
|
||||
if (time < 1) // run immediately
|
||||
finishUsePower(copyMsg, playerCharacter, casterLiveCounter, targetLiveCounter);
|
||||
@@ -667,10 +820,11 @@ public enum PowersManager {
|
||||
|
||||
// make person casting stand up if spell (unless they're casting a chant which does not make them stand up)
|
||||
// update cast (use skill) fail condition
|
||||
caster.cancelOnCast();
|
||||
if(pb.breaksForm)
|
||||
caster.cancelOnCast();
|
||||
|
||||
// update castSpell (use spell) fail condition if spell
|
||||
if (pb.isSpell())
|
||||
if (pb.isSpell() && pb.breaksForm)
|
||||
caster.cancelOnSpell();
|
||||
|
||||
// get cast time in ms.
|
||||
@@ -700,14 +854,56 @@ public enum PowersManager {
|
||||
// called when a spell finishes casting. perform actions
|
||||
public static void finishUsePower(final PerformActionMsg msg, PlayerCharacter playerCharacter, int casterLiveCounter, int targetLiveCounter) {
|
||||
|
||||
// if(true) {
|
||||
// newFinishCast(msg);
|
||||
// return;
|
||||
//}
|
||||
|
||||
//if(HandleItemEnchantments(playerCharacter, msg)) {
|
||||
// playerCharacter.setIsCasting(false);
|
||||
// PerformActionMsg castMsg = new PerformActionMsg(msg);
|
||||
// castMsg.setNumTrains(9999);
|
||||
// castMsg.setUnknown04(2);
|
||||
// DispatchMessage.dispatchMsgToInterestArea(playerCharacter, castMsg, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false);
|
||||
// return;
|
||||
//}
|
||||
PerformActionMsg performActionMsg;
|
||||
Dispatch dispatch;
|
||||
|
||||
if (playerCharacter == null || msg == null)
|
||||
return;
|
||||
|
||||
//handle sprint for bard sprint
|
||||
if(msg.getPowerUsedID() == 429005674){
|
||||
msg.setPowerUsedID(429611355);
|
||||
}
|
||||
|
||||
//handle root and snare break for wildkin's chase
|
||||
if(msg.getPowerUsedID() == 429494441) {
|
||||
playerCharacter.removeEffectBySource(EffectSourceType.Root,40,true);
|
||||
playerCharacter.removeEffectBySource(EffectSourceType.Snare,40,true);
|
||||
}
|
||||
|
||||
//handle power block portion for shade hide
|
||||
if(playerCharacter.getRace().getName().contains("Shade")) {
|
||||
if (msg.getPowerUsedID() == 429407306 || msg.getPowerUsedID() == 429495514) {
|
||||
int trains = msg.getNumTrains() - 1;
|
||||
if (trains < 1)
|
||||
trains = 1;
|
||||
applyPower(playerCharacter, playerCharacter, playerCharacter.loc, 429397210, trains, false);
|
||||
playerCharacter.removeEffectBySource(EffectSourceType.Invisibility,40,true);
|
||||
applyPower(playerCharacter, playerCharacter, playerCharacter.loc, msg.getPowerUsedID(), msg.getNumTrains(), false);
|
||||
}
|
||||
}
|
||||
if(msg.getTargetType() == GameObjectType.PlayerCharacter.ordinal()) {
|
||||
PlayerCharacter target = PlayerCharacter.getPlayerCharacter(msg.getTargetID());
|
||||
if (msg.getPowerUsedID() == 429601664)
|
||||
if(target.getPromotionClassID() != 2516)//templar
|
||||
PlayerCharacter.getPlayerCharacter(msg.getTargetID()).removeEffectBySource(EffectSourceType.Transform, msg.getNumTrains(), true);
|
||||
}
|
||||
|
||||
if (playerCharacter.isCasting()) {
|
||||
playerCharacter.update();
|
||||
playerCharacter.update(false);
|
||||
playerCharacter.updateStamRegen(-100);
|
||||
}
|
||||
|
||||
@@ -747,6 +943,9 @@ public enum PowersManager {
|
||||
return;
|
||||
}
|
||||
|
||||
if(pb.targetSelf)
|
||||
msg.setTargetID(playerCharacter.getObjectUUID());
|
||||
|
||||
int trains = msg.getNumTrains();
|
||||
|
||||
// verify player is not stunned or power type is blocked
|
||||
@@ -809,15 +1008,16 @@ public enum PowersManager {
|
||||
}
|
||||
float range = pb.getRange() + speedRange;
|
||||
|
||||
if(pb.token != 429396028) {
|
||||
|
||||
if (verifyInvalidRange(playerCharacter, mainTarget, range)) {
|
||||
if (verifyInvalidRange(playerCharacter, mainTarget, range)) {
|
||||
|
||||
sendPowerMsg(playerCharacter, 8, msg);
|
||||
return;
|
||||
sendPowerMsg(playerCharacter, 8, msg);
|
||||
return;
|
||||
}
|
||||
// (pc.getLoc().distance(target.getLoc()) > pb.getRange()) {
|
||||
// TODO send message that target is out of range
|
||||
}
|
||||
// (pc.getLoc().distance(target.getLoc()) > pb.getRange()) {
|
||||
// TODO send message that target is out of range
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -839,6 +1039,8 @@ public enum PowersManager {
|
||||
return;
|
||||
}
|
||||
|
||||
playerCharacter.setHateValue(pb.getHateValue(trains));
|
||||
|
||||
//Send Cast Message.
|
||||
// PerformActionMsg castMsg = new PerformActionMsg(msg);
|
||||
// castMsg.setNumTrains(9999);
|
||||
@@ -889,6 +1091,8 @@ public enum PowersManager {
|
||||
//Power is aiding a target, handle aggro if combat target is a Mob.
|
||||
if (!pb.isHarmful() && target.getObjectType() == GameObjectType.PlayerCharacter) {
|
||||
PlayerCharacter pcTarget = (PlayerCharacter) target;
|
||||
if (!pb.isHarmful())
|
||||
Mob.HandleAssistedAggro(playerCharacter, pcTarget);
|
||||
}
|
||||
|
||||
// update target of used power timer
|
||||
@@ -902,6 +1106,13 @@ public enum PowersManager {
|
||||
|
||||
//Player didn't miss power, send finish cast. Miss cast already sent.
|
||||
|
||||
//if (playerCharacter.isBoxed) {
|
||||
// if (AbstractCharacter.IsAbstractCharacter(target)) {
|
||||
// if (target.getObjectType().equals(GameObjectType.PlayerCharacter)) {
|
||||
// return;
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
|
||||
// finally Apply actions
|
||||
for (ActionsBase ab : pb.getActions()) {
|
||||
@@ -911,7 +1122,7 @@ public enum PowersManager {
|
||||
continue;
|
||||
// If something blocks the action, then stop
|
||||
|
||||
if (ab.blocked(target, pb, trains)) {
|
||||
if (ab.blocked(target, pb, trains, playerCharacter)) {
|
||||
|
||||
PowersManager.sendEffectMsg(playerCharacter, 5, ab, pb);
|
||||
continue;
|
||||
@@ -998,7 +1209,18 @@ public enum PowersManager {
|
||||
|
||||
|
||||
//DispatchMessage.dispatchMsgToInterestArea(playerCharacter, msg, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false);
|
||||
|
||||
//handle mob hate values
|
||||
HashSet<AbstractWorldObject> mobs = WorldGrid.getObjectsInRangePartial(playerCharacter.loc,60.0f,MBServerStatics.MASK_MOB);
|
||||
for(AbstractWorldObject awo : mobs){
|
||||
Mob mobTarget = (Mob)awo;
|
||||
if(mobTarget.hate_values != null) {
|
||||
if (mobTarget.hate_values.containsKey(playerCharacter)) {
|
||||
mobTarget.hate_values.put(playerCharacter, mobTarget.hate_values.get(playerCharacter) + pb.getHateValue(trains));
|
||||
} else {
|
||||
mobTarget.hate_values.put(playerCharacter, pb.getHateValue(trains));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1087,7 +1309,7 @@ public enum PowersManager {
|
||||
continue;
|
||||
// If something blocks the action, then stop
|
||||
|
||||
if (ab.blocked(target, pb, trains))
|
||||
if (ab.blocked(target, pb, trains, caster))
|
||||
continue;
|
||||
// TODO handle overwrite stack order here
|
||||
String stackType = ab.getStackType();
|
||||
@@ -1229,7 +1451,7 @@ public enum PowersManager {
|
||||
|
||||
PlayerCharacter target = SessionManager
|
||||
.getPlayerCharacterByLowerCaseName(msg.getTargetName());
|
||||
if (target == null || target.equals(pc) || target.isCombat()) {
|
||||
if (target == null || target.equals(pc)) {
|
||||
|
||||
if (target == null) // Player not found. Send not found message
|
||||
ChatManager.chatInfoError(pc,
|
||||
@@ -1288,7 +1510,7 @@ public enum PowersManager {
|
||||
// Handle Accepting or Denying a summons.
|
||||
// set timer based on summon type.
|
||||
boolean wentThrough = false;
|
||||
if (msg.accepted())
|
||||
if (msg.accepted()) {
|
||||
// summons accepted, let's move the player if within time
|
||||
if (source.isAlive()) {
|
||||
|
||||
@@ -1333,6 +1555,16 @@ public enum PowersManager {
|
||||
else
|
||||
duration = 45000; // Belgosh Summons, 45 seconds
|
||||
|
||||
boolean enemiesNear = false;
|
||||
for (AbstractWorldObject awo : WorldGrid.getObjectsInRangePartial(pc.loc, MBServerStatics.CHARACTER_LOAD_RANGE, MBServerStatics.MASK_PLAYER)) {
|
||||
PlayerCharacter playerCharacter = (PlayerCharacter) awo;
|
||||
if (!playerCharacter.guild.getNation().equals(pc.guild.getNation())) {
|
||||
enemiesNear = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (enemiesNear && !pc.isInSafeZone())
|
||||
duration += 60000;
|
||||
|
||||
// Teleport to summoners location
|
||||
FinishSummonsJob fsj = new FinishSummonsJob(source, pc);
|
||||
@@ -1342,7 +1574,10 @@ public enum PowersManager {
|
||||
timers.put("Summon", jc);
|
||||
wentThrough = true;
|
||||
}
|
||||
|
||||
}else{
|
||||
// recycle summons power
|
||||
finishRecycleTime(428523680, source, true);
|
||||
}
|
||||
// Summons failed
|
||||
if (!wentThrough)
|
||||
// summons refused. Let's be nice and reset recycle timer
|
||||
@@ -1458,8 +1693,28 @@ public enum PowersManager {
|
||||
}
|
||||
|
||||
// create list of characters
|
||||
HashSet<AbstractCharacter> trackChars = RangeBasedAwo.getTrackList(
|
||||
allTargets, playerCharacter, maxTargets);
|
||||
HashSet<AbstractCharacter> trackChars;
|
||||
|
||||
PowersBase trackPower = PowersManager.getPowerByToken(msg.getPowerToken());
|
||||
if(trackPower != null && trackPower.category.equals("TRACK")){
|
||||
trackChars = getTrackList(playerCharacter);
|
||||
}else{
|
||||
trackChars = RangeBasedAwo.getTrackList(allTargets, playerCharacter, maxTargets);
|
||||
}
|
||||
|
||||
|
||||
|
||||
//switch(msg.getPowerToken()){
|
||||
// case 431511776: // Hunt Foe Huntress
|
||||
// case 429578587: // Hunt Foe Scout
|
||||
// case 429503360: // Track Huntsman
|
||||
// case 44106356: //
|
||||
// trackChars = getTrackList(playerCharacter);
|
||||
// break;
|
||||
// default:
|
||||
// trackChars = RangeBasedAwo.getTrackList(allTargets, playerCharacter, maxTargets);
|
||||
// break;
|
||||
//}
|
||||
|
||||
TrackWindowMsg trackWindowMsg = new TrackWindowMsg(msg);
|
||||
|
||||
@@ -1472,6 +1727,30 @@ public enum PowersManager {
|
||||
|
||||
}
|
||||
|
||||
public static HashSet<AbstractCharacter> getTrackList(PlayerCharacter tracker){
|
||||
HashSet<AbstractCharacter> list = new HashSet<AbstractCharacter>();
|
||||
HashSet<AbstractWorldObject> shortList = WorldGrid.getObjectsInRangePartial(tracker.loc,MBServerStatics.CHARACTER_LOAD_RANGE, MBServerStatics.MASK_PLAYER);
|
||||
HashSet<AbstractWorldObject> fullList = WorldGrid.getObjectsInRangePartial(tracker.loc,1408, MBServerStatics.MASK_PLAYER);
|
||||
ArrayList<Guild> guildsPresent = new ArrayList<>();
|
||||
for(AbstractWorldObject awo : shortList){
|
||||
PlayerCharacter pc = (PlayerCharacter)awo;
|
||||
if(!guildsPresent.contains(pc.guild.getNation())){
|
||||
guildsPresent.add(pc.guild.getNation());
|
||||
}
|
||||
}
|
||||
for(AbstractWorldObject awo : fullList){
|
||||
if(awo.equals(tracker))
|
||||
continue;
|
||||
PlayerCharacter pc = (PlayerCharacter)awo;
|
||||
if(!pc.isAlive())
|
||||
continue;
|
||||
if(guildsPresent.contains(pc.guild.getNation()))
|
||||
list.add(pc);
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
private static void sendRecyclePower(int token, ClientConnection origin) {
|
||||
RecyclePowerMsg recyclePowerMsg = new RecyclePowerMsg(token);
|
||||
|
||||
@@ -1587,6 +1866,10 @@ public enum PowersManager {
|
||||
private static void applyPowerA(AbstractCharacter ac, AbstractWorldObject target,
|
||||
Vector3fImmutable targetLoc, PowersBase pb, int trains,
|
||||
boolean fromItem) {
|
||||
|
||||
if(fromItem && pb.token == 429021400)
|
||||
trains = 40;
|
||||
|
||||
int time = pb.getCastTime(trains);
|
||||
if (!fromItem)
|
||||
finishApplyPowerA(ac, target, targetLoc, pb, trains, false);
|
||||
@@ -1645,6 +1928,18 @@ public enum PowersManager {
|
||||
public static void finishApplyPowerA(AbstractCharacter ac,
|
||||
AbstractWorldObject target, Vector3fImmutable targetLoc,
|
||||
PowersBase pb, int trains, boolean fromChant) {
|
||||
|
||||
|
||||
//if (ac.getObjectType().equals(GameObjectType.PlayerCharacter)){
|
||||
// PlayerCharacter pc = (PlayerCharacter) ac;
|
||||
// if (pc.isBoxed && pb.token != -2133617927) {
|
||||
// if(AbstractCharacter.IsAbstractCharacter(target)){
|
||||
// if (target.getObjectType().equals(GameObjectType.PlayerCharacter)){
|
||||
// return;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
// finally Apply actions
|
||||
ArrayList<ActionsBase> actions = pb.getActions();
|
||||
for (ActionsBase ab : actions) {
|
||||
@@ -1652,7 +1947,7 @@ public enum PowersManager {
|
||||
if (trains < ab.getMinTrains() || trains > ab.getMaxTrains())
|
||||
continue;
|
||||
// If something blocks the action, then stop
|
||||
if (ab.blocked(target, pb, trains))
|
||||
if (ab.blocked(target, pb, trains, ac))
|
||||
// sendPowerMsg(pc, 5, msg);
|
||||
continue;
|
||||
// TODO handle overwrite stack order here
|
||||
@@ -1725,14 +2020,10 @@ public enum PowersManager {
|
||||
}
|
||||
}
|
||||
|
||||
public static void runPowerAction(AbstractCharacter source,
|
||||
AbstractWorldObject awo, Vector3fImmutable targetLoc,
|
||||
ActionsBase ab, int trains, PowersBase pb) {
|
||||
public static void runPowerAction(AbstractCharacter source, AbstractWorldObject awo, Vector3fImmutable targetLoc, ActionsBase ab, int trains, PowersBase pb) {
|
||||
AbstractPowerAction pa = ab.getPowerAction();
|
||||
if (pa == null) {
|
||||
Logger.error(
|
||||
"runPowerAction(): PowerAction not found of IDString: "
|
||||
+ ab.getEffectID());
|
||||
Logger.error("runPowerAction(): PowerAction not found of IDString: " + ab.getEffectID());
|
||||
return;
|
||||
}
|
||||
pa.startAction(source, awo, targetLoc, trains, ab, pb);
|
||||
@@ -2185,7 +2476,7 @@ public enum PowersManager {
|
||||
|
||||
// set player is not casting for regens
|
||||
if (pc.isCasting()) {
|
||||
pc.update();
|
||||
pc.update(false);
|
||||
}
|
||||
pc.setIsCasting(false);
|
||||
|
||||
@@ -2227,7 +2518,8 @@ public enum PowersManager {
|
||||
public static boolean testAttack(PlayerCharacter pc, AbstractWorldObject awo,
|
||||
PowersBase pb, PerformActionMsg msg) {
|
||||
// Get defense for target
|
||||
float atr = CharacterSkill.getATR(pc, pb.getSkillName());
|
||||
//float atr = CharacterSkill.getATR(pc, pb.getSkillName());
|
||||
float atr = PlayerCombatStats.getSpellAtr(pc, pb);
|
||||
float defense;
|
||||
|
||||
if (AbstractWorldObject.IsAbstractCharacter(awo)) {
|
||||
@@ -2237,28 +2529,26 @@ public enum PowersManager {
|
||||
defense = 0f;
|
||||
// Get hit chance
|
||||
|
||||
if (pc.getDebug(16)) {
|
||||
String smsg = "ATR: " + atr + ", Defense: " + defense;
|
||||
ChatManager.chatSystemInfo(pc, smsg);
|
||||
}
|
||||
//if (pc.getDebug(16)) {
|
||||
// String smsg = "ATR: " + atr + ", Defense: " + defense;
|
||||
// ChatManager.chatSystemInfo(pc, smsg);
|
||||
//}
|
||||
|
||||
int chance;
|
||||
//int chance;
|
||||
|
||||
if (atr > defense || defense == 0)
|
||||
chance = 94;
|
||||
else {
|
||||
float dif = atr / defense;
|
||||
if (dif <= 0.8f)
|
||||
chance = 4;
|
||||
else
|
||||
chance = ((int) (450 * (dif - 0.8f)) + 4);
|
||||
}
|
||||
//if (atr > defense || defense == 0)
|
||||
// chance = 94;
|
||||
//else {
|
||||
// float dif = atr / defense;
|
||||
// if (dif <= 0.8f)
|
||||
// chance = 4;
|
||||
// else
|
||||
// chance = ((int) (450 * (dif - 0.8f)) + 4);
|
||||
//}
|
||||
|
||||
// calculate hit/miss
|
||||
int roll = ThreadLocalRandom.current().nextInt(100);
|
||||
|
||||
boolean disable = true;
|
||||
if (roll < chance) {
|
||||
if (CombatManager.LandHit((int)atr,(int)defense)) {
|
||||
// Hit, check if dodge kicked in
|
||||
if (awo instanceof AbstractCharacter) {
|
||||
AbstractCharacter tarAc = (AbstractCharacter) awo;
|
||||
@@ -2270,6 +2560,15 @@ public enum PowersManager {
|
||||
dodgeMsg.setTargetID(awo.getObjectUUID());
|
||||
sendPowerMsg(pc, 4, dodgeMsg);
|
||||
return true;
|
||||
} else if (testPassive(pc, tarAc, "Block")) {
|
||||
// Dodge fired, send dodge message
|
||||
//PerformActionMsg dodgeMsg = new PerformActionMsg(msg);
|
||||
//dodgeMsg.setTargetType(awo.getObjectType().ordinal());
|
||||
//dodgeMsg.setTargetID(awo.getObjectUUID());
|
||||
//sendPowerMsg(pc, 4, dodgeMsg);
|
||||
TargetedActionMsg cmm = new TargetedActionMsg(pc, 75, tarAc, MBServerStatics.COMBAT_SEND_BLOCK);
|
||||
DispatchMessage.sendToAllInRange(tarAc, cmm);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
@@ -2317,7 +2616,12 @@ public enum PowersManager {
|
||||
if (AbstractWorldObject.IsAbstractCharacter(awo)) {
|
||||
AbstractCharacter tarAc = (AbstractCharacter) awo;
|
||||
// Handle Dodge passive
|
||||
return testPassive(caster, tarAc, "Dodge");
|
||||
boolean passiveFired = false;
|
||||
passiveFired = testPassive(caster, tarAc, "Dodge");
|
||||
if(!passiveFired)
|
||||
passiveFired = testPassive(caster, tarAc, "Block");
|
||||
|
||||
return passiveFired;
|
||||
}
|
||||
return false;
|
||||
} else
|
||||
@@ -2558,7 +2862,9 @@ public enum PowersManager {
|
||||
}
|
||||
|
||||
public static void cancelOnStun(AbstractCharacter ac) {
|
||||
|
||||
if(ac.getObjectType().equals(GameObjectType.PlayerCharacter)){
|
||||
//PlayerCharacter.GroundPlayer((PlayerCharacter)ac);
|
||||
}
|
||||
}
|
||||
|
||||
private static PowersBase getLastPower(AbstractCharacter ac) {
|
||||
@@ -2704,6 +3010,191 @@ public enum PowersManager {
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean breakForm(int token) {
|
||||
switch (token) {
|
||||
case 429505865:
|
||||
case 429407561:
|
||||
case 429492073:
|
||||
case 429644123:
|
||||
case 429393769:
|
||||
case 429545819:
|
||||
case 429426537:
|
||||
case 429590377:
|
||||
case 429508425:
|
||||
case 429541193:
|
||||
case 429573961:
|
||||
case 427924330:
|
||||
case 429402918:
|
||||
case 429545688:
|
||||
case 429005674:
|
||||
case 429637823:
|
||||
case 429590426:
|
||||
case 428066972:
|
||||
case 429441862:
|
||||
case 431611756:
|
||||
case 431578988:
|
||||
case 429502506:
|
||||
case 429398191:
|
||||
case 429447384:
|
||||
case 428892191:
|
||||
case 431579167:
|
||||
case 430977067:
|
||||
case 429409100:
|
||||
case 429441868:
|
||||
case 429594877:
|
||||
case 427908971:
|
||||
case 683741153:
|
||||
case 429770569:
|
||||
case 429452379:
|
||||
case 429605055:
|
||||
case 429086971:
|
||||
case 429443230:
|
||||
case 429505400:
|
||||
case 429492122:
|
||||
case 429643992:
|
||||
case 550062236:
|
||||
case 429498252:
|
||||
case 429611224:
|
||||
case 429441834:
|
||||
case 428918940:
|
||||
case 429633739:
|
||||
case 429633579:
|
||||
case 429568043:
|
||||
case 429048646:
|
||||
case 428392639:
|
||||
case 428425407:
|
||||
case 429054168:
|
||||
case 429021400:
|
||||
case 428955864:
|
||||
case 429119704:
|
||||
case 428890328:
|
||||
case 428923096:
|
||||
case 429218008:
|
||||
case 429086936:
|
||||
case 428988632:
|
||||
case 428688204:
|
||||
case 429514603:
|
||||
case 428924959:
|
||||
case 429393818:
|
||||
case 429720966:
|
||||
case 428982463:
|
||||
case 427933887:
|
||||
case 429572287:
|
||||
case 429501222:
|
||||
case 430694431:
|
||||
case 429436131:
|
||||
case 430006124:
|
||||
case 429611355:
|
||||
case 428005600:
|
||||
case 427935608:
|
||||
case 428949695:
|
||||
case 427988218:
|
||||
case 429414616:
|
||||
case 429496495:
|
||||
case 429428796:
|
||||
case 563795754:
|
||||
case 428988217:
|
||||
case 429432716:
|
||||
case 428955899:
|
||||
case 429393286:
|
||||
case 550062220:
|
||||
case 429495557:
|
||||
case 429401278:
|
||||
case 428377478:
|
||||
case 429409094:
|
||||
case 428191947:
|
||||
case 429434474:
|
||||
case 429403363:
|
||||
case 429512920:
|
||||
case 429419611:
|
||||
case 429645676:
|
||||
case 429602895:
|
||||
case 429605071:
|
||||
case 429592428:
|
||||
case 429500010:
|
||||
case 429406602:
|
||||
case 429426586:
|
||||
case 429633898:
|
||||
case 550062212:
|
||||
case 429994027:
|
||||
case 430813227:
|
||||
case 429928491:
|
||||
case 430026795:
|
||||
case 429517915:
|
||||
case 431854842:
|
||||
case 429767544:
|
||||
case 429502507:
|
||||
case 428398816:
|
||||
case 429446315:
|
||||
case 429441979:
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public static boolean HandleItemEnchantments(PlayerCharacter pc, PerformActionMsg msg){
|
||||
switch(msg.getPowerUsedID()){
|
||||
case 429505998: // Reinforce Item
|
||||
case 429407694: // hone weapon
|
||||
case 429440462: // hone armor
|
||||
case 429016905: //poison blade
|
||||
case 429505610: // poison blade
|
||||
case 427908971: // consecrate weapon
|
||||
case 429439055: // mark of slaying
|
||||
case 429605702: // annoint blade
|
||||
case 429414682: // slay rat
|
||||
case 429594877: // consecrate weapon
|
||||
case 429440895: // charm of slaying
|
||||
case 429491437: // infuse with power
|
||||
PowersBase pb = PowersManager.getPowerByToken(msg.getPowerUsedID());
|
||||
if(pb == null)
|
||||
return false;
|
||||
for (ActionsBase action : pb.getActions()){
|
||||
try {
|
||||
if(msg.getNumTrains() > action.maxTrains)
|
||||
continue;
|
||||
EffectsBase eb = action.getPowerAction().getEffectsBase();
|
||||
if(eb == null)
|
||||
return false;
|
||||
//Effect eff = pc.addEffectNoTimer(eb.getName(),eb,msg.getNumTrains(),false);
|
||||
//if(eff == null){
|
||||
// Logger.error(pc.getFirstName() + " failed to apply self buff: " + msg.getPowerUsedID());
|
||||
//}
|
||||
|
||||
UsePowerJob asj = new UsePowerJob(pc,msg,pb.getToken(),pb,pc.getLiveCounter(),pc.getLiveCounter());
|
||||
|
||||
JobContainer jc = JobScheduler.getInstance().scheduleJob(asj, 1800000);
|
||||
Effect eff = new Effect(jc, eb, msg.getNumTrains());
|
||||
// pc.effects.put("CASTABLE", eff);
|
||||
pc.addEffect("CASTABLE",1800,asj,eb,msg.getNumTrains());
|
||||
pc.applyAllBonuses();
|
||||
|
||||
ApplyEffectMsg pum = new ApplyEffectMsg();
|
||||
pum.setEffectID(eff.getEffectToken());
|
||||
pum.setSourceType(pc.getObjectType().ordinal());
|
||||
pum.setSourceID(pc.getObjectUUID());
|
||||
pum.setTargetType(pc.getObjectType().ordinal());
|
||||
pum.setTargetID(pc.getObjectUUID());
|
||||
pum.setNumTrains(eff.getTrains());
|
||||
pum.setUnknown05(1);
|
||||
pum.setUnknown02(2);
|
||||
pum.setUnknown06((byte) 1);
|
||||
pum.setEffectSourceType(GameObjectType.PlayerCharacter.ordinal());
|
||||
pum.setEffectSourceID(pc.getObjectUUID());
|
||||
pum.setDuration(1800);
|
||||
|
||||
|
||||
DispatchMessage.dispatchMsgToInterestArea(pc, pum, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false);
|
||||
}
|
||||
catch(Exception e){
|
||||
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -10,10 +10,7 @@ package engine.gameManager;
|
||||
|
||||
import engine.Enum;
|
||||
import engine.Enum.GameObjectType;
|
||||
import engine.objects.AbstractGameObject;
|
||||
import engine.objects.City;
|
||||
import engine.objects.PlayerCharacter;
|
||||
import engine.objects.Runegate;
|
||||
import engine.objects.*;
|
||||
import org.pmw.tinylog.Logger;
|
||||
|
||||
import java.sql.Connection;
|
||||
@@ -33,7 +30,7 @@ public enum SimulationManager {
|
||||
SERVERHEARTBEAT;
|
||||
|
||||
private static final long CITY_PULSE = 2000;
|
||||
private static final long RUNEGATE_PULSE = 3000;
|
||||
private static final long RUNEGATE_PULSE = 1000;
|
||||
private static final long UPDATE_PULSE = 1000;
|
||||
private static final long FlIGHT_PULSE = 100;
|
||||
public static Duration executionTime = Duration.ofNanos(1);
|
||||
@@ -94,16 +91,13 @@ public enum SimulationManager {
|
||||
"Fatal error in City Pulse: DISABLED. Error Message : "
|
||||
+ e.getMessage());
|
||||
}
|
||||
try {
|
||||
//try {
|
||||
|
||||
if ((_updatePulseTime != 0)
|
||||
&& (System.currentTimeMillis() > _updatePulseTime))
|
||||
pulseUpdate();
|
||||
} catch (Exception e) {
|
||||
Logger.error(
|
||||
"Fatal error in Update Pulse: DISABLED");
|
||||
// _runegatePulseTime = 0;
|
||||
}
|
||||
// if ((_updatePulseTime != 0) && (System.currentTimeMillis() > _updatePulseTime))
|
||||
// pulseUpdate();
|
||||
//} catch (Exception e) {
|
||||
// Logger.error("Fatal error in Update Pulse: DISABLED");
|
||||
//}
|
||||
|
||||
try {
|
||||
if ((_runegatePulseTime != 0)
|
||||
@@ -116,9 +110,18 @@ public enum SimulationManager {
|
||||
}
|
||||
|
||||
try {
|
||||
if ((_cityPulseTime != 0)
|
||||
&& (System.currentTimeMillis() > _cityPulseTime))
|
||||
pulseCities();
|
||||
if ((_cityPulseTime != 0) && (System.currentTimeMillis() > _cityPulseTime)) {
|
||||
try {
|
||||
pulseCities();
|
||||
}catch(Exception e){
|
||||
|
||||
}
|
||||
try {
|
||||
ArenaManager.pulseArenas();
|
||||
}catch(Exception e){
|
||||
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
Logger.error(
|
||||
"Fatal error in City Pulse: DISABLED. Error Message : "
|
||||
@@ -127,6 +130,25 @@ public enum SimulationManager {
|
||||
|
||||
}
|
||||
|
||||
//try{
|
||||
// HellgateManager.pulseHellgates();
|
||||
//}catch(Exception e){
|
||||
// Logger.error("Failed to pulse hellgates");
|
||||
// Logger.error(e.getMessage());
|
||||
//}
|
||||
|
||||
try{
|
||||
if(ZoneManager.hotZone != null && HotzoneManager.hotzoneMob != null && !HotzoneManager.hotzoneMob.isAlive()){
|
||||
HotzoneManager.ClearHotzone();
|
||||
}
|
||||
}catch(Exception e){
|
||||
|
||||
}
|
||||
try{
|
||||
HotzoneManager.pulse();
|
||||
}catch(Exception e){
|
||||
//
|
||||
}
|
||||
SimulationManager.executionTime = Duration.between(startTime, Instant.now());
|
||||
|
||||
if (executionTime.compareTo(executionMax) > 0)
|
||||
@@ -154,7 +176,11 @@ public enum SimulationManager {
|
||||
|
||||
if (player == null)
|
||||
continue;
|
||||
player.update();
|
||||
try {
|
||||
player.update(false);
|
||||
}catch(Exception e){
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
_updatePulseTime = System.currentTimeMillis() + 500;
|
||||
@@ -203,8 +229,12 @@ public enum SimulationManager {
|
||||
city = (City) cityObject;
|
||||
city.onEnter();
|
||||
}
|
||||
|
||||
for(Mine mine : Mine.getMines()){
|
||||
if(mine != null && mine.isActive)
|
||||
mine.onEnter();
|
||||
}
|
||||
_cityPulseTime = System.currentTimeMillis() + CITY_PULSE;
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -214,6 +244,10 @@ public enum SimulationManager {
|
||||
private void pulseRunegates() {
|
||||
|
||||
for (Runegate runegate : Runegate._runegates.values()) {
|
||||
for(Portal portal : runegate._portals)
|
||||
if(!portal.isActive())
|
||||
portal.activate(false);
|
||||
|
||||
runegate.collidePortals();
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,277 @@
|
||||
package engine.gameManager;
|
||||
|
||||
import engine.InterestManagement.WorldGrid;
|
||||
import engine.math.Vector3fImmutable;
|
||||
import engine.objects.*;
|
||||
import engine.server.MBServerStatics;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.concurrent.ThreadLocalRandom;
|
||||
|
||||
public class SpecialLootHandler {
|
||||
public static final List<Integer> DWARVEN_contracts = Arrays.asList(
|
||||
35250, 35251, 35252, 35253, 35254, 35255, 35256, 35257, 35258, 35259, 35260, 35261, 35262, 35263
|
||||
);
|
||||
|
||||
public static final List<Integer> INVORRI_contracts = Arrays.asList(
|
||||
35050, 35051, 35052, 35053, 35054, 35055, 35056, 35057, 35058, 35059, 35060, 35061, 35062, 35063
|
||||
);
|
||||
|
||||
public static final List<Integer> SHADE_contracts = Arrays.asList(
|
||||
35400, 35401, 35402, 35403, 35404, 35405, 35406, 35407, 35408, 35409, 35410, 35411, 35412, 35413,
|
||||
35414, 35415, 35416, 35417, 35418, 35419, 35420, 35421, 35422, 35423, 35424, 35425, 35426, 35427
|
||||
);
|
||||
|
||||
public static final List<Integer> VAMPIRE_contracts = Arrays.asList(
|
||||
35545, 35546, 35547, 35548, 35549, 35550, 35551, 35552, 35553, 35554, 35555, 35556, 35557, 35558,
|
||||
35559, 35560, 35561, 35562, 35563, 35564, 35565, 35566, 35567, 35568, 35569, 35570
|
||||
);
|
||||
|
||||
public static final List<Integer> IREKEI_contracts = Arrays.asList(
|
||||
35100, 35101, 35102, 35103, 35104, 35105, 35106, 35107, 35108, 35109, 35110, 35111, 35112, 35113,
|
||||
35114, 35115, 35116, 35117, 35118, 35119, 35120, 35121, 35122, 35123, 35124, 35125, 35126, 35127
|
||||
);
|
||||
|
||||
public static final List<Integer> AMAZON_contracts = Arrays.asList(
|
||||
35200, 35201, 35202, 35203, 35204, 35205, 35206, 35207, 35208, 35209, 35210, 35211, 35212, 35213
|
||||
);
|
||||
|
||||
public static final List<Integer> GWENDANNEN_contracts = Arrays.asList(
|
||||
35350, 35351, 35352, 35353, 35354, 35355, 35356, 35357, 35358, 35359, 35360, 35361, 35362, 35363,
|
||||
35364, 35365, 35366, 35367, 35368, 35369, 35370, 35371, 35372, 35373, 35374, 35375, 35376, 35377
|
||||
);
|
||||
|
||||
public static final List<Integer> NEPHILIM_contracts = Arrays.asList(
|
||||
35500, 35501, 35502, 35503, 35504, 35505, 35506, 35507, 35508, 35509, 35510, 35511, 35512, 35513,
|
||||
35514, 35515, 35516, 35517, 35518, 35519, 35520, 35521, 35522, 35523, 35524, 35525
|
||||
);
|
||||
|
||||
public static final List<Integer> ELVEN_contracts = Arrays.asList(
|
||||
35000, 35001, 35002, 35003, 35004, 35005, 35006, 35007, 35008, 35009, 35010, 35011, 35012, 35013,
|
||||
35014, 35015, 35016, 35017, 35018, 35019, 35020, 35021, 35022, 35023, 35024, 35025, 35026, 35027
|
||||
);
|
||||
|
||||
public static final List<Integer> CENTAUR_contracts = Arrays.asList(
|
||||
35150, 35151, 35152, 35153, 35154, 35155, 35156, 35157, 35158, 35159, 35160, 35161, 35162, 35163,
|
||||
35164, 35165, 35166, 35167, 35168, 35169, 35170, 35171, 35172, 35173, 35174, 35175, 35176, 35177
|
||||
);
|
||||
|
||||
public static final List<Integer> LIZARDMAN_contracts = Arrays.asList(
|
||||
35300, 35301, 35302, 35303, 35304, 35305, 35306, 35307, 35308, 35309, 35310, 35311, 35312, 35313
|
||||
);
|
||||
|
||||
public static final List<Integer> GLASS_ITEMS = Arrays.asList(
|
||||
7000100, 7000110, 7000120, 7000130, 7000140, 7000150, 7000160, 7000170, 7000180, 7000190,
|
||||
7000200, 7000210, 7000220, 7000230, 7000240, 7000250, 7000270, 7000280
|
||||
);
|
||||
|
||||
public static final List<Integer> STAT_RUNES = Arrays.asList(
|
||||
250001, 250002, 250003, 250004, 250005, 250006, 250007, 250008, 250010, 250011,
|
||||
250012, 250013, 250014, 250015, 250016, 250017, 250019, 250020, 250021, 250022,
|
||||
250023, 250024, 250025, 250026, 250028, 250029, 250030, 250031, 250032, 250033,
|
||||
250034, 250035, 250037, 250038, 250039, 250040, 250041, 250042, 250043, 250044
|
||||
);
|
||||
|
||||
public static final List<Integer> racial_guard = Arrays.asList(
|
||||
841,951,952,1050,1052,1180,1182,1250,1252,1350,1352,1450,
|
||||
1452,1500,1502,1525,1527,1550,1552,1575,1577,1600,1602,1650,1652,1700,980100,
|
||||
980102
|
||||
);
|
||||
|
||||
public static void RollContract(Mob mob){
|
||||
|
||||
Zone zone = getMacroZone(mob);
|
||||
if(zone == null)
|
||||
return;
|
||||
|
||||
int contactId = 0;
|
||||
int roll = ThreadLocalRandom.current().nextInt(250);
|
||||
if(roll == 125){
|
||||
contactId = getContractForZone(zone);
|
||||
}
|
||||
if(contactId == 0)
|
||||
return;
|
||||
|
||||
ItemBase contractBase = ItemBase.getItemBase(contactId);
|
||||
if(contractBase == null)
|
||||
return;
|
||||
|
||||
if(mob.getCharItemManager() == null)
|
||||
return;
|
||||
|
||||
MobLoot contract = new MobLoot(mob,contractBase,false);
|
||||
mob.getCharItemManager().addItemToInventory(contract);
|
||||
|
||||
}
|
||||
|
||||
public static Zone getMacroZone(Mob mob){
|
||||
|
||||
Zone parentZone = mob.parentZone;
|
||||
if(parentZone == null)
|
||||
return null;
|
||||
|
||||
while(!parentZone.isMacroZone() && !parentZone.equals(ZoneManager.getSeaFloor())){
|
||||
parentZone = parentZone.getParent();
|
||||
}
|
||||
|
||||
return parentZone;
|
||||
|
||||
//for(Zone zone : ZoneManager.macroZones){
|
||||
// HashSet<AbstractWorldObject> inZone = WorldGrid.getObjectsInRangePartial(zone.getLoc(),zone.getBounds().getHalfExtents().x * 2f, MBServerStatics.MASK_MOB);
|
||||
// if(inZone.contains(mob)){
|
||||
// return zone;
|
||||
// }
|
||||
//}
|
||||
//return null;
|
||||
}
|
||||
|
||||
public static int getContractForZone(Zone zone){
|
||||
Random random = new Random();
|
||||
switch (zone.getObjectUUID())
|
||||
{
|
||||
case 178:
|
||||
// Kralgaar Holm
|
||||
return DWARVEN_contracts.get(random.nextInt(DWARVEN_contracts.size()));
|
||||
case 122:
|
||||
// Aurrochs Skrae
|
||||
return INVORRI_contracts.get(random.nextInt(INVORRI_contracts.size()));
|
||||
case 197:
|
||||
// Ymur's Crown
|
||||
return INVORRI_contracts.get(random.nextInt(INVORRI_contracts.size()));
|
||||
case 234:
|
||||
// Ecklund Wilds
|
||||
return INVORRI_contracts.get(random.nextInt(INVORRI_contracts.size()));
|
||||
case 313:
|
||||
// Greensward Pyre
|
||||
return SHADE_contracts.get(random.nextInt(SHADE_contracts.size()));
|
||||
case 331:
|
||||
// The Doomplain
|
||||
return VAMPIRE_contracts.get(random.nextInt(VAMPIRE_contracts.size()));
|
||||
case 353:
|
||||
// Thollok Marsh
|
||||
return LIZARDMAN_contracts.get(random.nextInt(LIZARDMAN_contracts.size()));
|
||||
case 371:
|
||||
// The Black Bog
|
||||
return LIZARDMAN_contracts.get(random.nextInt(LIZARDMAN_contracts.size()));
|
||||
case 388:
|
||||
// Sevaath Mere
|
||||
return LIZARDMAN_contracts.get(random.nextInt(LIZARDMAN_contracts.size()));
|
||||
case 418:
|
||||
// Valkos Wilds
|
||||
return GWENDANNEN_contracts.get(random.nextInt(GWENDANNEN_contracts.size()));
|
||||
case 437:
|
||||
// Grimscairne
|
||||
return SHADE_contracts.get(random.nextInt(SHADE_contracts.size()));
|
||||
case 475:
|
||||
// Phaedra's Prize
|
||||
return AMAZON_contracts.get(random.nextInt(AMAZON_contracts.size()));
|
||||
case 491:
|
||||
// Holloch Forest
|
||||
return GWENDANNEN_contracts.get(random.nextInt(GWENDANNEN_contracts.size()));
|
||||
case 508:
|
||||
// Aeran Belendor
|
||||
return ELVEN_contracts.get(random.nextInt(ELVEN_contracts.size()));
|
||||
case 532:
|
||||
// Tainted Swamp
|
||||
return NEPHILIM_contracts.get(random.nextInt(NEPHILIM_contracts.size()));
|
||||
case 550:
|
||||
// Aerath Hellendroth
|
||||
return ELVEN_contracts.get(random.nextInt(ELVEN_contracts.size()));
|
||||
case 569:
|
||||
// Aedroch Highlands
|
||||
return GWENDANNEN_contracts.get(random.nextInt(GWENDANNEN_contracts.size()));
|
||||
case 590:
|
||||
// Fellgrim Forest
|
||||
return GWENDANNEN_contracts.get(random.nextInt(GWENDANNEN_contracts.size()));
|
||||
case 616:
|
||||
// Derros Plains
|
||||
return CENTAUR_contracts.get(random.nextInt(CENTAUR_contracts.size()));
|
||||
case 632:
|
||||
// Ashfell Plain
|
||||
return SHADE_contracts.get(random.nextInt(SHADE_contracts.size()));
|
||||
case 717:
|
||||
// Kharsoom
|
||||
return IREKEI_contracts.get(random.nextInt(IREKEI_contracts.size()));
|
||||
case 737:
|
||||
// Leth'khalivar Desert
|
||||
return IREKEI_contracts.get(random.nextInt(IREKEI_contracts.size()));
|
||||
case 761:
|
||||
// The Blood Sands
|
||||
return IREKEI_contracts.get(random.nextInt(IREKEI_contracts.size()));
|
||||
case 785:
|
||||
// Vale of Nar Addad
|
||||
return IREKEI_contracts.get(random.nextInt(IREKEI_contracts.size()));
|
||||
case 824:
|
||||
// Western Battleground
|
||||
return NEPHILIM_contracts.get(random.nextInt(NEPHILIM_contracts.size()));
|
||||
case 842:
|
||||
// Pandemonium
|
||||
return NEPHILIM_contracts.get(random.nextInt(NEPHILIM_contracts.size()));
|
||||
case 951:
|
||||
//Bone Marches
|
||||
return VAMPIRE_contracts.get(random.nextInt(VAMPIRE_contracts.size()));
|
||||
case 952:
|
||||
//plain of ashes
|
||||
return VAMPIRE_contracts.get(random.nextInt(VAMPIRE_contracts.size()));
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
public static void RollGlass(Mob mob){
|
||||
|
||||
int roll = ThreadLocalRandom.current().nextInt(10000);
|
||||
if(roll != 5000)
|
||||
return;
|
||||
|
||||
Random random = new Random();
|
||||
int glassId = GLASS_ITEMS.get(random.nextInt(GLASS_ITEMS.size()));
|
||||
ItemBase glassBase = ItemBase.getItemBase(glassId);
|
||||
if(glassBase == null)
|
||||
return;
|
||||
|
||||
if(mob.getCharItemManager() == null)
|
||||
return;
|
||||
|
||||
MobLoot glass = new MobLoot(mob,glassBase,false);
|
||||
mob.getCharItemManager().addItemToInventory(glass);
|
||||
}
|
||||
|
||||
public static void RollRune(Mob mob){
|
||||
int runeID = 0;
|
||||
int roll = ThreadLocalRandom.current().nextInt(250);
|
||||
Random random = new Random();
|
||||
if(roll == 125){
|
||||
runeID = STAT_RUNES.get(random.nextInt(STAT_RUNES.size()));
|
||||
}
|
||||
if(runeID == 0)
|
||||
return;
|
||||
|
||||
ItemBase runeBase = ItemBase.getItemBase(runeID);
|
||||
if(runeBase == null)
|
||||
return;
|
||||
|
||||
if(mob.getCharItemManager() == null)
|
||||
return;
|
||||
|
||||
MobLoot rune = new MobLoot(mob,runeBase,false);
|
||||
mob.getCharItemManager().addItemToInventory(rune);
|
||||
}
|
||||
|
||||
public static void RollRacialGuard(Mob mob){
|
||||
int roll = ThreadLocalRandom.current().nextInt(5000);
|
||||
if(roll != 2500)
|
||||
return;
|
||||
|
||||
Random random = new Random();
|
||||
int guardId = racial_guard.get(random.nextInt(racial_guard.size()));
|
||||
ItemBase guardBase = ItemBase.getItemBase(guardId);
|
||||
if(guardBase == null)
|
||||
return;
|
||||
|
||||
if(mob.getCharItemManager() == null)
|
||||
return;
|
||||
|
||||
MobLoot guard = new MobLoot(mob,guardBase,false);
|
||||
mob.getCharItemManager().addItemToInventory(guard);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,347 @@
|
||||
package engine.gameManager;
|
||||
|
||||
import engine.Enum;
|
||||
import engine.InterestManagement.InterestManager;
|
||||
import engine.InterestManagement.WorldGrid;
|
||||
import engine.math.Vector3f;
|
||||
import engine.math.Vector3fImmutable;
|
||||
import engine.objects.*;
|
||||
import org.pmw.tinylog.Logger;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.concurrent.ThreadLocalRandom;
|
||||
|
||||
public class StrongholdManager {
|
||||
|
||||
public static void processStrongholds() {
|
||||
ArrayList<Mine> mines = Mine.getMines();
|
||||
|
||||
|
||||
//process strongholds selecting 3 randomly to become active
|
||||
int count = 0;
|
||||
while (count < 3) {
|
||||
int random = ThreadLocalRandom.current().nextInt(1, mines.size()) - 1;
|
||||
Mine mine = mines.get(random);
|
||||
if (mine != null) {
|
||||
if (!mine.isActive && !mine.isStronghold) {
|
||||
StartStronghold(mine);
|
||||
count++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void StartStronghold(Mine mine){
|
||||
|
||||
//remove buildings
|
||||
Building tower = BuildingManager.getBuilding(mine.getBuildingID());
|
||||
if(tower == null)
|
||||
return;
|
||||
|
||||
mine.isStronghold = true;
|
||||
mine.strongholdMobs = new ArrayList<>();
|
||||
mine.oldBuildings = new HashMap<>();
|
||||
|
||||
Zone mineZone = ZoneManager.findSmallestZone(tower.loc);
|
||||
for(Building building : mineZone.zoneBuildingSet){
|
||||
mine.oldBuildings.put(building.getObjectUUID(),building.meshUUID);
|
||||
building.setMeshUUID(407650);
|
||||
building.setMeshScale(new Vector3f(0,0,0));
|
||||
InterestManager.setObjectDirty(building);
|
||||
WorldGrid.updateObject(building);
|
||||
}
|
||||
|
||||
//update tower to become stronghold mesh
|
||||
tower.setMeshUUID(getStrongholdMeshID(mine.getParentZone()));
|
||||
tower.setMeshScale(new Vector3f(1,1,1));
|
||||
InterestManager.setObjectDirty(tower);
|
||||
WorldGrid.updateObject(tower);
|
||||
|
||||
//create elite mobs
|
||||
for(int i = 0; i < mine.capSize * 2; i++){
|
||||
Vector3fImmutable loc = Vector3fImmutable.getRandomPointOnCircle(tower.loc,30);
|
||||
MobBase guardBase = MobBase.getMobBase(getStrongholdGuardianID(tower.meshUUID));
|
||||
Mob guard = Mob.createStrongholdMob(guardBase.getLoadID(), loc, Guild.getErrantGuild(),true,mineZone,null,0, guardBase.getFirstName(),65);
|
||||
if(guard != null){
|
||||
guard.parentZone = mine.getParentZone();
|
||||
guard.bindLoc = loc;
|
||||
guard.setLoc(loc);
|
||||
guard.StrongholdGuardian = true;
|
||||
guard.equipmentSetID = getStrongholdMobEquipSetID(guard);
|
||||
guard.runAfterLoad();
|
||||
guard.setLevel((short)65);
|
||||
guard.setResists(new Resists("Elite"));
|
||||
guard.spawnTime = 1000000000;
|
||||
guard.BehaviourType = Enum.MobBehaviourType.Aggro;
|
||||
mine.strongholdMobs.add(guard);
|
||||
LootManager.GenerateStrongholdLoot(guard,false,false);
|
||||
guard.healthMax = 12500;
|
||||
guard.setHealth(guard.healthMax);
|
||||
guard.maxDamageHandOne = 1550;
|
||||
guard.minDamageHandOne = 750;
|
||||
guard.atrHandOne = 1800;
|
||||
guard.defenseRating = 2200;
|
||||
guard.setFirstName("Elite Guardian");
|
||||
InterestManager.setObjectDirty(guard);
|
||||
WorldGrid.addObject(guard,loc.x,loc.z);
|
||||
WorldGrid.updateObject(guard);
|
||||
guard.stronghold = mine;
|
||||
guard.mobPowers.clear();
|
||||
guard.mobPowers.put(429399948,20); // find weakness
|
||||
}
|
||||
}
|
||||
//create stronghold commander
|
||||
Vector3fImmutable loc = tower.loc;
|
||||
MobBase commanderBase = MobBase.getMobBase(getStrongholdCommanderID(tower.meshUUID));
|
||||
Mob commander = Mob.createStrongholdMob(commanderBase.getLoadID(), loc,Guild.getErrantGuild(),true,mineZone,null,0, commanderBase.getFirstName(),75);
|
||||
if(commander != null){
|
||||
commander.parentZone = mine.getParentZone();
|
||||
commander.bindLoc = loc;
|
||||
commander.setLoc(loc);
|
||||
commander.StrongholdCommander = true;
|
||||
commander.equipmentSetID = getStrongholdMobEquipSetID(commander);
|
||||
commander.runAfterLoad();
|
||||
commander.setLevel((short)75);
|
||||
commander.setResists(new Resists("Elite"));
|
||||
commander.spawnTime = 1000000000;
|
||||
commander.BehaviourType = Enum.MobBehaviourType.Aggro;
|
||||
commander.mobPowers.clear();
|
||||
commander.mobPowers.put(429032838, 40); // gravechill
|
||||
commander.mobPowers.put(429757701,20); // magebolt
|
||||
commander.mobPowers.put(429121388,20); // blight
|
||||
commander.mobPowers.put(431566891,20); // lightning bolt
|
||||
commander.mobPowers.put(428716075,20); // fire bolt
|
||||
commander.mobPowers.put(429010987,20); // ice bolt
|
||||
mine.strongholdMobs.add(commander);
|
||||
LootManager.GenerateStrongholdLoot(commander,true, false);
|
||||
commander.healthMax = 50000;
|
||||
commander.setHealth(commander.healthMax);
|
||||
commander.maxDamageHandOne = 3500;
|
||||
commander.minDamageHandOne = 1500;
|
||||
commander.atrHandOne = 3500;
|
||||
commander.defenseRating = 3500;
|
||||
commander.setFirstName("Guardian Commander");
|
||||
InterestManager.setObjectDirty(commander);
|
||||
WorldGrid.addObject(commander,loc.x,loc.z);
|
||||
WorldGrid.updateObject(commander);
|
||||
commander.stronghold = mine;
|
||||
}
|
||||
|
||||
mine.isActive = true;
|
||||
tower.setProtectionState(Enum.ProtectionState.PROTECTED);
|
||||
tower.getBounds().setRegions(tower);
|
||||
InterestManager.setObjectDirty(tower);
|
||||
WorldGrid.updateObject(tower);
|
||||
ChatManager.chatSystemChannel(mine.getZoneName() + "'s Stronghold Has Begun!");
|
||||
Logger.info(mine.getZoneName() + "'s Stronghold Has Begun!");
|
||||
}
|
||||
|
||||
public static void EndStronghold(Mine mine){
|
||||
|
||||
//restore the buildings
|
||||
Building tower = BuildingManager.getBuilding(mine.getBuildingID());
|
||||
if(tower == null)
|
||||
return;
|
||||
|
||||
mine.isStronghold = false;
|
||||
|
||||
//get rid of the mobs
|
||||
for(Mob mob : mine.strongholdMobs) {
|
||||
mob.despawn();
|
||||
mob.removeFromCache();
|
||||
DbManager.MobQueries.DELETE_MOB(mob);
|
||||
}
|
||||
|
||||
//restore the buildings
|
||||
Zone mineZone = ZoneManager.findSmallestZone(tower.loc);
|
||||
for(Building building : mineZone.zoneBuildingSet){
|
||||
if(mine.oldBuildings.containsKey(building.getObjectUUID())) {
|
||||
building.setMeshUUID(mine.oldBuildings.get(building.getObjectUUID()));
|
||||
building.setMeshScale(new Vector3f(1, 1, 1));
|
||||
InterestManager.setObjectDirty(building);
|
||||
WorldGrid.updateObject(building);
|
||||
}
|
||||
}
|
||||
|
||||
//update tower to become Mine Tower again
|
||||
tower.setMeshUUID(1500100);
|
||||
|
||||
mine.isActive = false;
|
||||
tower.setProtectionState(Enum.ProtectionState.NPC);
|
||||
tower.getBounds().setRegions(tower);
|
||||
InterestManager.setObjectDirty(tower);
|
||||
WorldGrid.updateObject(tower);
|
||||
ChatManager.chatSystemChannel(mine.getZoneName() + "'s Stronghold Has Concluded!");
|
||||
Logger.info(mine.getZoneName() + "'s Stronghold Has Concluded!");
|
||||
}
|
||||
|
||||
public static int getStrongholdMeshID(Zone parent){
|
||||
while(!parent.isMacroZone()){
|
||||
parent = parent.getParent();
|
||||
if(parent.getName().equalsIgnoreCase("seafloor")){
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
switch(parent.getObjectUUID()){
|
||||
case 197:
|
||||
case 234:
|
||||
case 178:
|
||||
case 122:
|
||||
return 814000; //Frost Giant Hall (ICE)
|
||||
case 968:
|
||||
case 951:
|
||||
case 313:
|
||||
case 331:
|
||||
return 5001500; // Lich Queens Keep (UNDEAD)
|
||||
case 785:
|
||||
case 761:
|
||||
case 717:
|
||||
case 737:
|
||||
return 1306600; // Temple of the Dragon (DESERT)
|
||||
case 353:
|
||||
case 371:
|
||||
case 388:
|
||||
case 532:
|
||||
return 564600; // Undead Lord's Keep (SWAMP)
|
||||
case 550:
|
||||
case 508:
|
||||
case 475:
|
||||
case 418:
|
||||
return 1326600; // elven hall
|
||||
case 437:
|
||||
case 491:
|
||||
case 590:
|
||||
case 569:
|
||||
return 602400;
|
||||
case 824:
|
||||
case 842:
|
||||
case 632:
|
||||
return 1600000; // chaos temple
|
||||
}
|
||||
return 456100; // small stockade
|
||||
}
|
||||
|
||||
public static int getStrongholdGuardianID(int ID){
|
||||
switch(ID){
|
||||
case 814000:
|
||||
return 253004; // Mountain Giant Raider Axe
|
||||
case 5001500:
|
||||
return 253008; // Vampire Spear Warrior
|
||||
case 1306600:
|
||||
return 253007; // Desert Orc Warrior
|
||||
case 564600:
|
||||
return 253010; // Kolthoss Warrior
|
||||
case 1326600:
|
||||
return 253005; //elven warrior
|
||||
case 602400:
|
||||
return 253009; // templar missionary
|
||||
case 1600000:
|
||||
return 253006; // scourger
|
||||
}
|
||||
return 13434; // human sword and board warrior
|
||||
}
|
||||
|
||||
public static int getStrongholdEpicID(int ID){
|
||||
switch(ID){
|
||||
case 814000:
|
||||
return 253023; // Mountain Giant Raider Axe
|
||||
case 5001500:
|
||||
return 253022; // Vampire Spear Warrior
|
||||
case 1306600:
|
||||
return 253021; // Desert Orc Warrior
|
||||
case 564600:
|
||||
return 253018; // Kolthoss Warrior
|
||||
case 1326600:
|
||||
return 253019; //elven warrior
|
||||
case 602400:
|
||||
return 253024; // templar missionary
|
||||
case 1600000:
|
||||
return 253020; // scourger
|
||||
}
|
||||
return 13434; // human sword and board warrior
|
||||
}
|
||||
|
||||
public static int getStrongholdCommanderID(int ID){
|
||||
switch(ID){
|
||||
case 814000:
|
||||
return 253017;
|
||||
case 5001500:
|
||||
return 253012;
|
||||
case 1306600:
|
||||
return 253016; // Desert Orc Xbow
|
||||
case 564600:
|
||||
return 253011; // xbow kolthoss
|
||||
case 1326600:
|
||||
return 253013; //elven bow warrior
|
||||
case 602400:
|
||||
return 253015; // dune giant with xbow
|
||||
case 1600000:
|
||||
return 253014; // barbator
|
||||
}
|
||||
return 13433;
|
||||
}
|
||||
|
||||
public static int getStrongholdMobEquipSetID(Mob mob) {
|
||||
if(mob.StrongholdGuardian){
|
||||
return 6327;
|
||||
}else{
|
||||
return 10790;
|
||||
}
|
||||
}
|
||||
|
||||
public static void CheckToEndStronghold(Mine mine) {
|
||||
|
||||
boolean stillAlive = false;
|
||||
for (Mob mob : mine.strongholdMobs)
|
||||
if (mob.isAlive())
|
||||
stillAlive = true;
|
||||
|
||||
if (!stillAlive) {
|
||||
// Epic encounter
|
||||
|
||||
Building tower = BuildingManager.getBuilding(mine.getBuildingID());
|
||||
if (tower == null)
|
||||
return;
|
||||
|
||||
Zone mineZone = ZoneManager.findSmallestZone(tower.loc);
|
||||
|
||||
Vector3fImmutable loc = tower.loc;
|
||||
MobBase commanderBase = MobBase.getMobBase(getStrongholdEpicID(tower.meshUUID));
|
||||
Mob commander = Mob.createStrongholdMob(commanderBase.getLoadID(), loc, Guild.getErrantGuild(), true, mineZone, null, 0, commanderBase.getFirstName(), 75);
|
||||
if (commander != null) {
|
||||
commander.parentZone = mine.getParentZone();
|
||||
commander.bindLoc = loc;
|
||||
commander.setLoc(loc);
|
||||
commander.StrongholdEpic = true;
|
||||
commander.equipmentSetID = getStrongholdMobEquipSetID(commander);
|
||||
commander.runAfterLoad();
|
||||
commander.setLevel((short) 85);
|
||||
commander.setResists(new Resists("Elite"));
|
||||
commander.spawnTime = 1000000000;
|
||||
commander.BehaviourType = Enum.MobBehaviourType.Aggro;
|
||||
commander.mobPowers.clear();
|
||||
commander.mobPowers.put(429032838, 40); // gravechill
|
||||
commander.mobPowers.put(429757701,40); // magebolt
|
||||
commander.mobPowers.put(429121388,40); // blight
|
||||
commander.mobPowers.put(431566891,40); // lightning bolt
|
||||
commander.mobPowers.put(428716075,40); // fire bolt
|
||||
commander.mobPowers.put(429010987,40); // ice bolt
|
||||
mine.strongholdMobs.add(commander);
|
||||
LootManager.GenerateStrongholdLoot(commander, true, true);
|
||||
commander.healthMax = 250000;
|
||||
commander.setHealth(commander.healthMax);
|
||||
commander.maxDamageHandOne = 5000;
|
||||
commander.minDamageHandOne = 2500;
|
||||
commander.atrHandOne = 5000;
|
||||
commander.defenseRating = 3500;
|
||||
commander.setFirstName("Defender of " + mine.getParentZone().getParent().getName());
|
||||
InterestManager.setObjectDirty(commander);
|
||||
WorldGrid.addObject(commander,loc.x,loc.z);
|
||||
WorldGrid.updateObject(commander);
|
||||
commander.stronghold = mine;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,274 @@
|
||||
package engine.gameManager;
|
||||
import engine.InterestManagement.WorldGrid;
|
||||
import engine.objects.*;
|
||||
import engine.server.MBServerStatics;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class ZergManager {
|
||||
|
||||
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);
|
||||
case 30: return getMultiplier30Man(count);
|
||||
case 40: return getMultiplier40Man(count);
|
||||
default: return 1.0f; //unlimited
|
||||
}
|
||||
}
|
||||
public static float getMultiplier3Man(int count) {
|
||||
if(count < 4)
|
||||
return 1.0f;
|
||||
|
||||
if(count > 6)
|
||||
return 0.0f;
|
||||
|
||||
switch(count){
|
||||
case 4: return 0.50f;
|
||||
case 5: return 0.0f;
|
||||
case 6: return 0.0f;
|
||||
default: return 1.0f;
|
||||
}
|
||||
}
|
||||
public static float getMultiplier5Man(int count) {
|
||||
if(count < 6)
|
||||
return 1.0f;
|
||||
|
||||
if(count > 10)
|
||||
return 0.0f;
|
||||
|
||||
switch(count){
|
||||
case 6: return 0.75f;
|
||||
case 7: return 0.57f;
|
||||
case 8: return 0.44f;
|
||||
case 9: return 0.33f;
|
||||
case 10: return 0.25f;
|
||||
default: return 1.0f;
|
||||
}
|
||||
}
|
||||
public static float getMultiplier10Man(int count) {
|
||||
if(count < 11)
|
||||
return 1.0f;
|
||||
|
||||
if(count > 20)
|
||||
return 0.0f;
|
||||
|
||||
switch(count){
|
||||
case 11: return 0.86f;
|
||||
case 12: return 0.75f;
|
||||
case 13: return 0.65f;
|
||||
case 14: return 0.57f;
|
||||
case 15: return 0.50f;
|
||||
case 16: return 0.44f;
|
||||
case 17: return 0.38f;
|
||||
case 18: return 0.33f;
|
||||
case 19: return 0.29f;
|
||||
case 20: return 0.25f;
|
||||
default: return 1.0f;
|
||||
}
|
||||
}
|
||||
public static float getMultiplier20Man(int count) {
|
||||
if(count < 21)
|
||||
return 1.0f;
|
||||
|
||||
if(count > 40)
|
||||
return 0.0f;
|
||||
|
||||
switch (count)
|
||||
{
|
||||
case 21: return 0.93f;
|
||||
case 22: return 0.86f;
|
||||
case 23: return 0.80f;
|
||||
case 24: return 0.75f;
|
||||
case 25: return 0.70f;
|
||||
case 26: return 0.65f;
|
||||
case 27: return 0.61f;
|
||||
case 28: return 0.57f;
|
||||
case 29: return 0.53f;
|
||||
case 30: return 0.50f;
|
||||
case 31: return 0.47f;
|
||||
case 32: return 0.44f;
|
||||
case 33: return 0.41f;
|
||||
case 34: return 0.38f;
|
||||
case 35: return 0.36f;
|
||||
case 36: return 0.33f;
|
||||
case 37: return 0.31f;
|
||||
case 38: return 0.29f;
|
||||
case 39: return 0.27f;
|
||||
case 40: return 0.25f;
|
||||
default: return 1.0f;
|
||||
}
|
||||
|
||||
}
|
||||
public static float getMultiplier30Man(int count) {
|
||||
if(count < 31)
|
||||
return 1.0f;
|
||||
|
||||
if(count > 60)
|
||||
return 0.0f;
|
||||
|
||||
switch (count)
|
||||
{
|
||||
case 31: return 0.95f;
|
||||
case 32: return 0.91f;
|
||||
case 33: return 0.86f;
|
||||
case 34: return 0.82f;
|
||||
case 35: return 0.79f;
|
||||
case 36: return 0.75f;
|
||||
case 37: return 0.72f;
|
||||
case 38: return 0.68f;
|
||||
case 39: return 0.65f;
|
||||
case 40: return 0.63f;
|
||||
case 41: return 0.60f;
|
||||
case 42: return 0.57f;
|
||||
case 43: return 0.55f;
|
||||
case 44: return 0.52f;
|
||||
case 45: return 0.50f;
|
||||
case 46: return 0.48f;
|
||||
case 47: return 0.46f;
|
||||
case 48: return 0.44f;
|
||||
case 49: return 0.42f;
|
||||
case 50: return 0.40f;
|
||||
case 51: return 0.38f;
|
||||
case 52: return 0.37f;
|
||||
case 53: return 0.35f;
|
||||
case 54: return 0.33f;
|
||||
case 55: return 0.32f;
|
||||
case 56: return 0.30f;
|
||||
case 57: return 0.29f;
|
||||
case 58: return 0.28f;
|
||||
case 59: return 0.26f;
|
||||
case 60: return 0.25f;
|
||||
default: return 1.0f;
|
||||
}
|
||||
|
||||
}
|
||||
public static float getMultiplier40Man(int count) {
|
||||
if(count < 41)
|
||||
return 1.0f;
|
||||
|
||||
if(count > 80)
|
||||
return 0.0f;
|
||||
|
||||
switch (count)
|
||||
{
|
||||
case 41: return 0.96f;
|
||||
case 42: return 0.93f;
|
||||
case 43: return 0.90f;
|
||||
case 44: return 0.86f;
|
||||
case 45: return 0.83f;
|
||||
case 46: return 0.80f;
|
||||
case 47: return 0.78f;
|
||||
case 48: return 0.75f;
|
||||
case 49: return 0.72f;
|
||||
case 50: return 0.70f;
|
||||
case 51: return 0.68f;
|
||||
case 52: return 0.65f;
|
||||
case 53: return 0.63f;
|
||||
case 54: return 0.61f;
|
||||
case 55: return 0.59f;
|
||||
case 56: return 0.57f;
|
||||
case 57: return 0.55f;
|
||||
case 58: return 0.53f;
|
||||
case 59: return 0.52f;
|
||||
case 60: return 0.50f;
|
||||
case 61: return 0.48f;
|
||||
case 62: return 0.47f;
|
||||
case 63: return 0.45f;
|
||||
case 64: return 0.44f;
|
||||
case 65: return 0.42f;
|
||||
case 66: return 0.41f;
|
||||
case 67: return 0.40f;
|
||||
case 68: return 0.38f;
|
||||
case 69: return 0.37f;
|
||||
case 70: return 0.36f;
|
||||
case 71: return 0.35f;
|
||||
case 72: return 0.33f;
|
||||
case 73: return 0.32f;
|
||||
case 74: return 0.31f;
|
||||
case 75: return 0.30f;
|
||||
case 76: return 0.29f;
|
||||
case 77: return 0.28f;
|
||||
case 78: return 0.27f;
|
||||
case 79: return 0.26f;
|
||||
case 80: return 0.25f;
|
||||
default: return 1.0f;
|
||||
}
|
||||
}
|
||||
|
||||
public static void MineTracker(Mine mine){
|
||||
Building tower = BuildingManager.getBuildingFromCache(mine.getBuildingID());
|
||||
if(tower == null)
|
||||
return;
|
||||
|
||||
float affectedRange = MBServerStatics.CHARACTER_LOAD_RANGE * 3;
|
||||
mine.zergTracker.compileCurrent(tower.loc, affectedRange);
|
||||
mine.zergTracker.sortByNation();
|
||||
mine.zergTracker.compileLeaveQue(tower.loc, affectedRange);
|
||||
mine.zergTracker.processLeaveQue();
|
||||
mine.zergTracker.applyMultiplier(mine.capSize);
|
||||
}
|
||||
|
||||
public static void PrintDetailsToClient(PlayerCharacter pc){
|
||||
String newline = "\r\n ";
|
||||
String outstring = newline + "ZERG MANAGER DETAILS FOR: " + pc.getFirstName() + newline;
|
||||
Mine attended = null;
|
||||
for(Mine mine : Mine.getMines()){
|
||||
Building tower = BuildingManager.getBuilding(mine.getBuildingID());
|
||||
if(tower == null)
|
||||
continue;
|
||||
|
||||
float rangeSquared = (MBServerStatics.CHARACTER_LOAD_RANGE * 3) * (MBServerStatics.CHARACTER_LOAD_RANGE * 3);
|
||||
|
||||
if(pc.loc.distanceSquared(tower.loc) < rangeSquared){
|
||||
attended = mine;
|
||||
}
|
||||
}
|
||||
if(attended != null){
|
||||
outstring += "Mine Cap: " + attended.capSize + newline;
|
||||
Building tower = BuildingManager.getBuilding(attended.getBuildingID());
|
||||
if(tower == null)
|
||||
return;
|
||||
|
||||
int count = 0;
|
||||
ArrayList<PlayerCharacter> stillPresent = new ArrayList<>();
|
||||
ArrayList<PlayerCharacter> gonePlayers = new ArrayList<>();
|
||||
for(Integer countedID : attended.mineAttendees.keySet()){
|
||||
PlayerCharacter counted = PlayerCharacter.getFromCache(countedID);
|
||||
if(counted != null){
|
||||
if(counted.guild.getNation().equals(pc.guild.getNation())) {
|
||||
Long timeGone = System.currentTimeMillis() - attended.mineAttendees.get(countedID);
|
||||
if(timeGone > 5000){
|
||||
//outstring += counted.getFirstName() + " GONE FOR: " + timeGone/1000 + " SECONDS" + newline;
|
||||
gonePlayers.add(counted);
|
||||
}else{
|
||||
//outstring += counted.getFirstName() + " STILL PRESENT" + newline;
|
||||
stillPresent.add(counted);
|
||||
}
|
||||
count ++;
|
||||
}
|
||||
}
|
||||
}
|
||||
outstring += newline + "TOTAL NATION MEMBERS COUNTED: " + count + newline;
|
||||
outstring += newline + "PLAYERS PRESENT:" + newline;
|
||||
for(PlayerCharacter present : stillPresent){
|
||||
outstring += present.getFirstName() + newline;
|
||||
}
|
||||
outstring += newline + "PLAYERS GONE:" + newline;
|
||||
for(PlayerCharacter gone : gonePlayers){
|
||||
Long timeGone = System.currentTimeMillis() - attended.mineAttendees.get(gone.getObjectUUID());
|
||||
if(timeGone > 5000) {
|
||||
outstring += gone.getFirstName() + " GONE FOR: " + timeGone / 1000 + " SECONDS" + newline;
|
||||
}
|
||||
}
|
||||
}else{
|
||||
outstring += "Mine: Not Within Mine Distance" + newline;
|
||||
}
|
||||
|
||||
outstring += newline + "Zerg Multiplier: " + pc.ZergMultiplier + newline;
|
||||
|
||||
ChatManager.chatSystemInfo(pc, outstring);
|
||||
}
|
||||
}
|
||||
@@ -19,14 +19,12 @@ import engine.objects.Building;
|
||||
import engine.objects.City;
|
||||
import engine.objects.Zone;
|
||||
import engine.server.MBServerStatics;
|
||||
import org.pmw.tinylog.Logger;
|
||||
|
||||
import java.time.Instant;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.ZoneId;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.ThreadLocalRandom;
|
||||
|
||||
/*
|
||||
* Class contains methods and structures which
|
||||
@@ -109,20 +107,6 @@ public enum ZoneManager {
|
||||
|
||||
}
|
||||
|
||||
// Returns the number of available hotZones
|
||||
// remaining in this cycle (1am)
|
||||
|
||||
public static int availableHotZones() {
|
||||
|
||||
int count = 0;
|
||||
|
||||
for (Zone zone : ZoneManager.macroZones)
|
||||
if (ZoneManager.validHotZone(zone))
|
||||
count = count + 1;
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
// Resets the availability of hotZones
|
||||
// for this cycle
|
||||
|
||||
@@ -217,63 +201,6 @@ public enum ZoneManager {
|
||||
ZoneManager.playerCityZones.add(zone);
|
||||
}
|
||||
|
||||
public static final void generateAndSetRandomHotzone() {
|
||||
|
||||
Zone hotZone;
|
||||
ArrayList<Integer> zoneArray = new ArrayList<>();
|
||||
|
||||
if (ZoneManager.macroZones.isEmpty())
|
||||
return;
|
||||
|
||||
// Reset hotZone availability if none are left.
|
||||
|
||||
if (ZoneManager.availableHotZones() == 0)
|
||||
ZoneManager.resetHotZones();
|
||||
|
||||
for (Zone zone : ZoneManager.macroZones)
|
||||
if (validHotZone(zone))
|
||||
zoneArray.add(zone.getObjectUUID());
|
||||
|
||||
int entryIndex = ThreadLocalRandom.current().nextInt(zoneArray.size());
|
||||
|
||||
hotZone = ZoneManager.getZoneByUUID(zoneArray.get(entryIndex));
|
||||
|
||||
if (hotZone == null) {
|
||||
Logger.error("Hotzone is null");
|
||||
return;
|
||||
}
|
||||
|
||||
ZoneManager.setHotZone(hotZone);
|
||||
|
||||
}
|
||||
|
||||
public static final boolean validHotZone(Zone zone) {
|
||||
|
||||
if (zone.getSafeZone() == (byte) 1)
|
||||
return false; // no safe zone hotzones// if (this.hotzone == null)
|
||||
|
||||
if (zone.getNodes().isEmpty())
|
||||
return false;
|
||||
|
||||
if (zone.equals(ZoneManager.seaFloor))
|
||||
return false;
|
||||
|
||||
//no duplicate hotZones
|
||||
|
||||
if (zone.hasBeenHotzone == true)
|
||||
return false;
|
||||
|
||||
// Enforce min level
|
||||
|
||||
if (zone.minLvl < Integer.parseInt(ConfigManager.MB_HOTZONE_MIN_LEVEL.getValue()))
|
||||
return false;
|
||||
|
||||
if (ZoneManager.hotZone != null)
|
||||
return ZoneManager.hotZone.getObjectUUID() != zone.getObjectUUID();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// Converts world coordinates to coordinates local to a given zone.
|
||||
|
||||
public static Vector3fImmutable worldToLocal(Vector3fImmutable worldVector,
|
||||
|
||||
@@ -68,7 +68,7 @@ public abstract class AbstractJob implements Runnable {
|
||||
this.markStopRunTime();
|
||||
}
|
||||
|
||||
protected abstract void doJob();
|
||||
public abstract void doJob();
|
||||
|
||||
public void executeJob(String threadName) {
|
||||
this.workerID.set(threadName);
|
||||
|
||||
@@ -17,7 +17,7 @@ public abstract class AbstractScheduleJob extends AbstractJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected abstract void doJob();
|
||||
public abstract void doJob();
|
||||
|
||||
public void cancelJob() {
|
||||
JobScheduler.getInstance().cancelScheduledJob(this);
|
||||
|
||||
@@ -16,7 +16,7 @@ public class JobContainer implements Comparable<JobContainer> {
|
||||
final long timeOfExecution;
|
||||
final boolean noTimer;
|
||||
|
||||
JobContainer(AbstractJob job, long timeOfExecution) {
|
||||
public JobContainer(AbstractJob job, long timeOfExecution) {
|
||||
if (job == null) {
|
||||
throw new IllegalArgumentException("No 'null' jobs allowed.");
|
||||
}
|
||||
|
||||
@@ -0,0 +1,75 @@
|
||||
package engine.job;
|
||||
|
||||
import engine.server.world.WorldServer;
|
||||
import org.pmw.tinylog.Logger;
|
||||
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.locks.ReentrantLock;
|
||||
|
||||
public class JobThread implements Runnable {
|
||||
private final AbstractJob currentJob;
|
||||
private final ReentrantLock lock = new ReentrantLock();
|
||||
|
||||
private static Long nextThreadPrint;
|
||||
|
||||
public JobThread(AbstractJob job){
|
||||
this.currentJob = job;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
if (this.currentJob != null) {
|
||||
if (lock.tryLock(5, TimeUnit.SECONDS)) { // Timeout to prevent deadlock
|
||||
try {
|
||||
this.currentJob.doJob();
|
||||
} finally {
|
||||
lock.unlock();
|
||||
}
|
||||
} else {
|
||||
Logger.warn("JobThread could not acquire lock in time, skipping job.");
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
Logger.error(e);
|
||||
}
|
||||
}
|
||||
|
||||
public static void startJobThread(AbstractJob job){
|
||||
JobThread jobThread = new JobThread(job);
|
||||
Thread thread = new Thread(jobThread);
|
||||
thread.setName("JOB THREAD: " + job.getWorkerID());
|
||||
thread.start();
|
||||
|
||||
if(JobThread.nextThreadPrint == null){
|
||||
JobThread.nextThreadPrint = System.currentTimeMillis();
|
||||
}else{
|
||||
if(JobThread.nextThreadPrint < System.currentTimeMillis()){
|
||||
JobThread.tryPrintThreads();
|
||||
JobThread.nextThreadPrint = System.currentTimeMillis() + 10000L;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void tryPrintThreads(){
|
||||
ThreadGroup rootGroup = Thread.currentThread().getThreadGroup();
|
||||
while (rootGroup.getParent() != null) {
|
||||
rootGroup = rootGroup.getParent();
|
||||
}
|
||||
|
||||
// Estimate the number of threads
|
||||
int activeThreads = rootGroup.activeCount();
|
||||
|
||||
// Create an array to hold the threads
|
||||
Thread[] threads = new Thread[activeThreads];
|
||||
|
||||
// Get the active threads
|
||||
rootGroup.enumerate(threads, true);
|
||||
|
||||
int availableThreads = Runtime.getRuntime().availableProcessors();
|
||||
|
||||
// Print the count
|
||||
if(threads.length > 30)
|
||||
Logger.info("Total threads in application: " + threads.length + " / " + availableThreads);
|
||||
}
|
||||
}
|
||||
@@ -58,10 +58,13 @@ public class JobWorker extends ControlledRunnable {
|
||||
} else {
|
||||
|
||||
// execute the new job..
|
||||
this.currentJob.executeJob(this.getThreadName());
|
||||
this.currentJob = null;
|
||||
//this.currentJob.executeJob(this.getThreadName());
|
||||
if(this.currentJob != null) {
|
||||
JobThread.startJobThread(this.currentJob);
|
||||
this.currentJob = null;
|
||||
}
|
||||
}
|
||||
|
||||
Thread.yield();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -45,7 +45,7 @@ public abstract class AbstractEffectJob extends AbstractScheduleJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected abstract void doJob();
|
||||
public abstract void doJob();
|
||||
|
||||
@Override
|
||||
protected abstract void _cancelJob();
|
||||
@@ -117,7 +117,7 @@ public abstract class AbstractEffectJob extends AbstractScheduleJob {
|
||||
}
|
||||
|
||||
public void endEffect() {
|
||||
if (this.eb == null)
|
||||
if (this.eb == null || this.power == null)
|
||||
return;
|
||||
this.eb.endEffect(this.source, this.target, this.trains, this.power, this);
|
||||
}
|
||||
|
||||
@@ -29,7 +29,7 @@ public class ActivateBaneJob extends AbstractScheduleJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
|
||||
City city;
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@ public class AttackJob extends AbstractJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
CombatManager.doCombat(this.source, slot);
|
||||
}
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@ public class BaneDefaultTimeJob extends AbstractScheduleJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
|
||||
//bane already set.
|
||||
if (this.bane.getLiveDate() != null) {
|
||||
|
||||
@@ -97,7 +97,7 @@ public class BasicScheduledJob extends AbstractJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
if (execution == null) {
|
||||
Logger.error("BasicScheduledJob executed with nothing to execute.");
|
||||
return;
|
||||
|
||||
@@ -22,7 +22,7 @@ public class BonusCalcJob extends AbstractJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
if (this.ac != null) {
|
||||
this.ac.applyBonuses();
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@ public class CSessionCleanupJob extends AbstractJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
SessionManager.cSessionCleanup(secKey);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,7 +27,7 @@ public class ChangeAltitudeJob extends AbstractScheduleJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
if (this.ac != null)
|
||||
MovementManager.finishChangeAltitude(ac, targetAlt);
|
||||
}
|
||||
|
||||
@@ -36,7 +36,7 @@ public class ChantJob extends AbstractEffectJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
if (this.aej == null || this.source == null || this.target == null || this.action == null || this.power == null || this.source == null || this.eb == null)
|
||||
return;
|
||||
PlayerBonuses bonuses = null;
|
||||
|
||||
@@ -29,7 +29,7 @@ public class CloseGateJob extends AbstractScheduleJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
|
||||
if (building == null) {
|
||||
Logger.error("Rungate building was null");
|
||||
|
||||
@@ -37,7 +37,7 @@ public class DamageOverTimeJob extends AbstractEffectJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
if (this.target.getObjectType().equals(GameObjectType.Building)
|
||||
&& ((Building) this.target).isVulnerable() == false) {
|
||||
_cancelJob();
|
||||
@@ -60,6 +60,8 @@ public class DamageOverTimeJob extends AbstractEffectJob {
|
||||
|
||||
if (this.iteration < 0) {
|
||||
PowersManager.finishEffectTime(this.source, this.target, this.action, this.trains);
|
||||
if (AbstractWorldObject.IsAbstractCharacter(source))
|
||||
eb.startEffect((AbstractCharacter) this.source, this.target, this.trains, this);
|
||||
return;
|
||||
}
|
||||
this.skipSendEffect = true;
|
||||
|
||||
@@ -28,7 +28,7 @@ public class DatabaseUpdateJob extends AbstractScheduleJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
if (this.ago == null)
|
||||
return;
|
||||
ago.removeDatabaseJob(this.type, false);
|
||||
|
||||
@@ -29,7 +29,7 @@ public class DebugTimerJob extends AbstractScheduleJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
if (this.pc == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -37,7 +37,7 @@ public class DeferredPowerJob extends AbstractEffectJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
//Power ended with no attack, cancel weapon power boost
|
||||
if (this.source != null && this.source instanceof PlayerCharacter) {
|
||||
((PlayerCharacter) this.source).setWeaponPower(null);
|
||||
|
||||
@@ -22,7 +22,7 @@ public class DisconnectJob extends AbstractScheduleJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
if (this.origin != null) {
|
||||
this.origin.disconnect();
|
||||
}
|
||||
|
||||
@@ -28,7 +28,7 @@ public class DoorCloseJob extends AbstractScheduleJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
|
||||
int doorNumber;
|
||||
|
||||
|
||||
@@ -22,14 +22,14 @@ public class EndFearJob extends AbstractEffectJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
|
||||
//cancel fear for mob.
|
||||
|
||||
if (this.target == null || (!(this.target instanceof Mob)))
|
||||
return;
|
||||
|
||||
((Mob) this.target).fearedObject = null;
|
||||
((Mob) this.target).setFearedObject(null);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -40,6 +40,6 @@ public class EndFearJob extends AbstractEffectJob {
|
||||
if (this.target == null || (!(this.target instanceof Mob)))
|
||||
return;
|
||||
|
||||
((Mob) this.target).fearedObject = null;
|
||||
((Mob) this.target).setFearedObject(null);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,7 +26,7 @@ public class FinishCooldownTimeJob extends AbstractJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
PowersManager.finishCooldownTime(this.msg, this.pc);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,7 +22,7 @@ public class FinishEffectTimeJob extends AbstractEffectJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
PowersManager.finishEffectTime(this.source, this.target, this.action, this.trains);
|
||||
}
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ public class FinishRecycleTimeJob extends AbstractScheduleJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
PowersManager.finishRecycleTime(this.msg, this.pc, false);
|
||||
}
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@ public class FinishSpireEffectJob extends AbstractEffectJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
|
||||
PlayerCharacter pc = (PlayerCharacter) target;
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@ public class FinishSummonsJob extends AbstractScheduleJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
|
||||
if (this.target == null)
|
||||
return;
|
||||
@@ -47,13 +47,13 @@ public class FinishSummonsJob extends AbstractScheduleJob {
|
||||
return;
|
||||
|
||||
// cannot summon a player in combat
|
||||
if (this.target.isCombat()) {
|
||||
//if (this.target.isCombat()) {
|
||||
|
||||
ErrorPopupMsg.sendErrorMsg(this.source, "Cannot summon player in combat.");
|
||||
// ErrorPopupMsg.sendErrorMsg(this.source, "Cannot summon player in combat.");
|
||||
|
||||
PowersManager.finishRecycleTime(428523680, this.source, false);
|
||||
return;
|
||||
}
|
||||
// PowersManager.finishRecycleTime(428523680, this.source, false);
|
||||
// return;
|
||||
//}
|
||||
|
||||
if (this.target.getBonuses() != null && this.target.getBonuses().getBool(ModType.BlockedPowerType, SourceType.SUMMON)) {
|
||||
ErrorPopupMsg.sendErrorMsg(this.target, "You have been blocked from receiving summons!");
|
||||
|
||||
@@ -28,7 +28,7 @@ public class LoadEffectsJob extends AbstractJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
if (this.originToSend == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -25,7 +25,7 @@ public class LogoutCharacterJob extends AbstractScheduleJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
server.logoutCharacter(this.pc);
|
||||
}
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ public class NoTimeJob extends AbstractEffectJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -40,11 +40,18 @@ public class PersistentAoeJob extends AbstractEffectJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
|
||||
if (this.aej == null || this.source == null || this.action == null || this.power == null || this.source == null || this.eb == null)
|
||||
return;
|
||||
|
||||
try {
|
||||
if (!this.target.isAlive())
|
||||
PowersManager.finishEffectTime(this.source, this.target, this.action, this.trains);
|
||||
}catch(Exception e){
|
||||
PowersManager.finishEffectTime(this.source, this.target, this.action, this.trains);
|
||||
}
|
||||
|
||||
if (!this.source.isAlive())
|
||||
PowersManager.finishEffectTime(this.source, this.target, this.action, this.trains);
|
||||
else if (this.iteration < this.power.getChantIterations()) {
|
||||
|
||||
@@ -45,7 +45,7 @@ public class RefreshGroupJob extends AbstractJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
|
||||
if (this.pc == null || this.origin == null || grp == null) {
|
||||
return;
|
||||
|
||||
@@ -22,7 +22,7 @@ public class RemoveCorpseJob extends AbstractScheduleJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
|
||||
if (this.corpse != null)
|
||||
Corpse.removeCorpse(corpse, true);
|
||||
|
||||
@@ -25,7 +25,7 @@ public class SiegeSpireWithdrawlJob extends AbstractScheduleJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
|
||||
if (spire == null)
|
||||
return;
|
||||
|
||||
@@ -30,7 +30,7 @@ public class StuckJob extends AbstractScheduleJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
|
||||
Vector3fImmutable stuckLoc;
|
||||
Building building = null;
|
||||
|
||||
@@ -27,7 +27,7 @@ public class SummonSendJob extends AbstractScheduleJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
|
||||
if (this.source == null)
|
||||
return;
|
||||
|
||||
@@ -39,7 +39,7 @@ public class TeleportJob extends AbstractScheduleJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
|
||||
if (this.pc == null || this.npc == null || this.origin == null)
|
||||
return;
|
||||
|
||||
@@ -35,7 +35,7 @@ public class TrackJob extends AbstractEffectJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
|
||||
if (this.tpa == null || this.target == null || this.action == null || this.source == null || this.eb == null || !(this.source instanceof PlayerCharacter))
|
||||
return;
|
||||
|
||||
@@ -29,7 +29,7 @@ public class TransferStatOTJob extends AbstractEffectJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
if (this.dot == null || this.target == null || this.action == null || this.source == null || this.eb == null || this.action == null || this.power == null)
|
||||
return;
|
||||
if (!this.target.isAlive()) {
|
||||
|
||||
@@ -26,7 +26,7 @@ public class UpdateGroupJob extends AbstractScheduleJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
|
||||
if (this.group == null)
|
||||
return;
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
package engine.jobs;
|
||||
|
||||
import engine.gameManager.ZoneManager;
|
||||
import engine.job.AbstractScheduleJob;
|
||||
import engine.objects.Building;
|
||||
import engine.objects.City;
|
||||
import org.pmw.tinylog.Logger;
|
||||
|
||||
/*
|
||||
@@ -20,7 +22,7 @@ public class UpgradeBuildingJob extends AbstractScheduleJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
|
||||
|
||||
// Must have a building to rank!
|
||||
@@ -41,6 +43,18 @@ public class UpgradeBuildingJob extends AbstractScheduleJob {
|
||||
|
||||
rankingBuilding.setRank(rankingBuilding.getRank() + 1);
|
||||
|
||||
if(rankingBuilding.getBlueprint().isWallPiece()){
|
||||
City cityObject = ZoneManager.getCityAtLocation(rankingBuilding.loc);
|
||||
if(cityObject.getTOL().getRank() == 8) {
|
||||
if (rankingBuilding.getBlueprint() != null && rankingBuilding.getBlueprint().getBuildingGroup() != null && rankingBuilding.getBlueprint().isWallPiece()) {
|
||||
float currentHealthRatio = rankingBuilding.getCurrentHitpoints() / rankingBuilding.healthMax;
|
||||
float newMax = rankingBuilding.healthMax * 1.1f;
|
||||
rankingBuilding.setMaxHitPoints(newMax);
|
||||
rankingBuilding.setHealth(rankingBuilding.healthMax * currentHealthRatio);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Reload the object
|
||||
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@ public class UpgradeNPCJob extends AbstractScheduleJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
|
||||
int newRank;
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@ public class UseItemJob extends AbstractScheduleJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
PowersManager.finishApplyPower(ac, target, Vector3fImmutable.ZERO, pb, trains, liveCounter);
|
||||
}
|
||||
|
||||
|
||||
@@ -35,7 +35,7 @@ public class UseMobPowerJob extends AbstractScheduleJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
PowersManager.finishUseMobPower(this.msg, this.caster, casterLiveCounter, targetLiveCounter);
|
||||
}
|
||||
|
||||
|
||||
@@ -35,7 +35,7 @@ public class UsePowerJob extends AbstractScheduleJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
PowersManager.finishUsePower(this.msg, this.pc, casterLiveCounter, targetLiveCounter);
|
||||
}
|
||||
|
||||
|
||||
@@ -9,10 +9,12 @@
|
||||
package engine.loot;
|
||||
|
||||
import engine.gameManager.LootManager;
|
||||
import org.pmw.tinylog.Logger;
|
||||
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.ThreadLocalRandom;
|
||||
|
||||
public class ItemTableEntry {
|
||||
public int minRoll;
|
||||
@@ -35,11 +37,23 @@ public class ItemTableEntry {
|
||||
List<ItemTableEntry> itemTableEntryList;
|
||||
|
||||
itemTableEntryList = LootManager._itemTables.get(itemTable);
|
||||
|
||||
for (ItemTableEntry iteration : itemTableEntryList)
|
||||
if (roll >= iteration.minRoll && roll <= iteration.maxRoll)
|
||||
itemTableEntry = iteration;
|
||||
|
||||
if(itemTableEntryList != null) {
|
||||
for (ItemTableEntry iteration : itemTableEntryList)
|
||||
if (roll >= iteration.minRoll && roll <= iteration.maxRoll)
|
||||
itemTableEntry = iteration;
|
||||
}
|
||||
return itemTableEntry;
|
||||
}
|
||||
|
||||
public static Integer getRandomItem(int itemTable) {
|
||||
int id = 0;
|
||||
List<ItemTableEntry> itemTableEntryList;
|
||||
|
||||
itemTableEntryList = LootManager._itemTables.get(itemTable);
|
||||
|
||||
if(itemTableEntryList != null && itemTableEntryList.size() > 1){
|
||||
id = itemTableEntryList.get(ThreadLocalRandom.current().nextInt(0, itemTableEntryList.size())).cacheID;
|
||||
}
|
||||
return id;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,11 +33,11 @@ public class ModTableEntry {
|
||||
List<ModTableEntry> itemTableEntryList;
|
||||
|
||||
itemTableEntryList = LootManager._modTables.get(modTablwe);
|
||||
|
||||
for (ModTableEntry iteration : itemTableEntryList)
|
||||
if (roll >= iteration.minRoll && roll <= iteration.maxRoll)
|
||||
modTableEntry = iteration;
|
||||
|
||||
if(itemTableEntryList != null) {
|
||||
for (ModTableEntry iteration : itemTableEntryList)
|
||||
if (roll >= iteration.minRoll && roll <= iteration.maxRoll)
|
||||
modTableEntry = iteration;
|
||||
}
|
||||
return modTableEntry;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -220,7 +220,7 @@ public class Bounds {
|
||||
//player is inside building region, skip collision check. we only do collision from the outside.
|
||||
if (player.region != null && player.region.parentBuildingID == building.getObjectUUID())
|
||||
continue;
|
||||
if (building.getBounds().colliders == null)
|
||||
if (building.getBounds() == null || building.getBounds().colliders == null)
|
||||
continue;
|
||||
|
||||
for (Colliders collider : building.getBounds().colliders) {
|
||||
|
||||
@@ -0,0 +1,266 @@
|
||||
package engine.mobileAI.Behaviours;
|
||||
|
||||
import engine.Enum;
|
||||
import engine.InterestManagement.InterestManager;
|
||||
import engine.InterestManagement.WorldGrid;
|
||||
import engine.math.Vector3fImmutable;
|
||||
import engine.mobileAI.utilities.CombatUtilities;
|
||||
import engine.mobileAI.utilities.MovementUtilities;
|
||||
import engine.objects.*;
|
||||
import engine.server.MBServerStatics;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
|
||||
public class StandardMob {
|
||||
|
||||
public static void run(Mob mob){
|
||||
|
||||
HashSet<AbstractWorldObject> inRange = WorldGrid.getObjectsInRangePartial(mob.loc, MBServerStatics.CHARACTER_LOAD_RANGE, MBServerStatics.MASK_PLAYER);
|
||||
|
||||
if(inRange.isEmpty())
|
||||
return;
|
||||
|
||||
if(!mob.isAlive()){
|
||||
CheckForRespawn(mob);
|
||||
return;
|
||||
}
|
||||
|
||||
if (mob.isMoving()) {
|
||||
mob.setLoc(mob.getMovementLoc());
|
||||
mob.updateLocation();
|
||||
}
|
||||
|
||||
if(mob.combatTarget == null) {
|
||||
if (!inRange.isEmpty()) {
|
||||
CheckForAggro(mob);
|
||||
}
|
||||
}else{
|
||||
CheckToDropCombatTarget(mob);
|
||||
if(mob.combatTarget == null){
|
||||
CheckForAggro(mob);
|
||||
}
|
||||
}
|
||||
|
||||
if(MovementUtilities.canMove(mob))
|
||||
CheckForMovement(mob);
|
||||
|
||||
if(mob.combatTarget != null && !mob.isMoving())
|
||||
CheckForAttack(mob);
|
||||
}
|
||||
|
||||
public static void CheckToDropCombatTarget(Mob mob){
|
||||
|
||||
if(!mob.combatTarget.isAlive()){
|
||||
mob.setCombatTarget(null);
|
||||
return;
|
||||
}
|
||||
|
||||
if(mob.combatTarget.getObjectType().equals(Enum.GameObjectType.PlayerCharacter)){
|
||||
PlayerCharacter pcTarget = (PlayerCharacter) mob.combatTarget;
|
||||
if (!mob.canSee(pcTarget)) {
|
||||
mob.setCombatTarget(null);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if(mob.bindLoc.distanceSquared(mob.combatTarget.loc) > 90 * 90){
|
||||
mob.setCombatTarget(null);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
public static void CheckForRespawn(Mob mob){
|
||||
if (mob.deathTime == 0) {
|
||||
mob.setDeathTime(System.currentTimeMillis());
|
||||
return;
|
||||
}
|
||||
|
||||
if (!mob.despawned) {
|
||||
if (mob.getCharItemManager().getInventoryCount() > 0) {
|
||||
if (System.currentTimeMillis() > mob.deathTime + MBServerStatics.DESPAWN_TIMER_WITH_LOOT) {
|
||||
mob.despawn();
|
||||
mob.deathTime = System.currentTimeMillis();
|
||||
return;
|
||||
}
|
||||
//No items in inventory.
|
||||
} else if (mob.isHasLoot()) {
|
||||
if (System.currentTimeMillis() > mob.deathTime + MBServerStatics.DESPAWN_TIMER_ONCE_LOOTED) {
|
||||
mob.despawn();
|
||||
mob.deathTime = System.currentTimeMillis();
|
||||
return;
|
||||
}
|
||||
//Mob never had Loot.
|
||||
} else {
|
||||
if (System.currentTimeMillis() > mob.deathTime + MBServerStatics.DESPAWN_TIMER_ONCE_LOOTED) {
|
||||
mob.despawn();
|
||||
mob.deathTime = System.currentTimeMillis();
|
||||
return;
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if(Mob.discDroppers.contains(mob))
|
||||
return;
|
||||
float baseRespawnTimer = mob.spawnTime;
|
||||
float reduction = (100-mob.level) * 0.01f;
|
||||
float reducedRespawnTime = baseRespawnTimer * (1.0f - reduction);
|
||||
float respawnTimer = reducedRespawnTime * 1000f;
|
||||
if (System.currentTimeMillis() > (mob.deathTime + respawnTimer)) {
|
||||
Zone.respawnQue.add(mob);
|
||||
}
|
||||
}
|
||||
|
||||
public static void CheckForAggro(Mob mob){
|
||||
|
||||
if(mob == null || !mob.isAlive() || mob.playerAgroMap.isEmpty()){
|
||||
return;
|
||||
}
|
||||
|
||||
if(!mob.BehaviourType.isAgressive)
|
||||
return;
|
||||
|
||||
if(mob.BehaviourType.equals(Enum.MobBehaviourType.HamletGuard)){
|
||||
return;
|
||||
}
|
||||
|
||||
if(mob.hate_values == null)
|
||||
mob.hate_values = new HashMap<>();
|
||||
|
||||
if(mob.combatTarget != null)
|
||||
return;
|
||||
|
||||
HashSet<AbstractWorldObject> inRange = WorldGrid.getObjectsInRangePartial(mob.loc, 60f, MBServerStatics.MASK_PLAYER);
|
||||
|
||||
if(inRange.isEmpty()){
|
||||
mob.setCombatTarget(null);
|
||||
return;
|
||||
}
|
||||
|
||||
//clear out any players who are not in hated range anymore
|
||||
ArrayList<PlayerCharacter> toRemove = new ArrayList<>();
|
||||
for(PlayerCharacter pc : mob.hate_values.keySet()){
|
||||
if(!inRange.contains(pc))
|
||||
toRemove.add(pc);
|
||||
}
|
||||
for(PlayerCharacter pc : toRemove){
|
||||
mob.hate_values.remove(pc);
|
||||
}
|
||||
|
||||
//find most hated target
|
||||
PlayerCharacter mostHated = null;
|
||||
for(AbstractWorldObject awo : inRange){
|
||||
PlayerCharacter loadedPlayer = (PlayerCharacter)awo;
|
||||
if (loadedPlayer == null)
|
||||
continue;
|
||||
|
||||
//Player is Dead, Mob no longer needs to attempt to aggro. Remove them from aggro map.
|
||||
if (!loadedPlayer.isAlive())
|
||||
continue;
|
||||
|
||||
//Can't see target, skip aggro.
|
||||
if (!mob.canSee(loadedPlayer))
|
||||
continue;
|
||||
|
||||
// No aggro for this race type
|
||||
if (mob.notEnemy != null && mob.notEnemy.size() > 0 && mob.notEnemy.contains(loadedPlayer.getRace().getRaceType().getMonsterType()))
|
||||
continue;
|
||||
|
||||
//mob has enemies and this player race is not it
|
||||
if (mob.enemy != null && mob.enemy.size() > 0 && !mob.enemy.contains(loadedPlayer.getRace().getRaceType().getMonsterType()))
|
||||
continue;
|
||||
|
||||
if(mostHated == null)
|
||||
mostHated = loadedPlayer;
|
||||
|
||||
if(mob.hate_values.containsKey(loadedPlayer))
|
||||
if(mob.hate_values.get(loadedPlayer) > mob.hate_values.get(mostHated))
|
||||
mostHated = loadedPlayer;
|
||||
}
|
||||
|
||||
if(mostHated != null)
|
||||
mob.setCombatTarget(mostHated);
|
||||
}
|
||||
|
||||
public static void CheckForMovement(Mob mob){
|
||||
|
||||
if(!mob.BehaviourType.canRoam)
|
||||
return;
|
||||
|
||||
if(mob.combatTarget != null){
|
||||
//chase player
|
||||
if(!CombatUtilities.inRange2D(mob,mob.combatTarget,mob.getRange())) {
|
||||
if(mob.combatTarget.getObjectType().equals(Enum.GameObjectType.PlayerCharacter)) {
|
||||
PlayerCharacter target = (PlayerCharacter)mob.combatTarget;
|
||||
if(target.isMoving()){
|
||||
MovementUtilities.aiMove(mob, mob.combatTarget.loc, false);
|
||||
return;
|
||||
}else{
|
||||
Vector3fImmutable smoothLoc = Vector3fImmutable.getRandomPointOnCircle(mob.combatTarget.loc,mob.getRange() -1);
|
||||
MovementUtilities.aiMove(mob, smoothLoc, false);
|
||||
return;
|
||||
}
|
||||
}
|
||||
MovementUtilities.aiMove(mob, mob.combatTarget.loc, false);
|
||||
}
|
||||
|
||||
}else{
|
||||
//patrol
|
||||
if (mob.isMoving()) {
|
||||
mob.stopPatrolTime = System.currentTimeMillis();
|
||||
return;
|
||||
}
|
||||
if(mob.stopPatrolTime + 5000L < System.currentTimeMillis()) {
|
||||
Vector3fImmutable patrolPoint = Vector3fImmutable.getRandomPointOnCircle(mob.bindLoc, 40f);
|
||||
MovementUtilities.aiMove(mob, patrolPoint, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void CheckForAttack(Mob mob){
|
||||
|
||||
if(mob.isMoving())
|
||||
return;
|
||||
|
||||
if(mob.getLastAttackTime() > System.currentTimeMillis())
|
||||
return;
|
||||
|
||||
if (mob.BehaviourType.callsForHelp)
|
||||
MobCallForHelp(mob);
|
||||
|
||||
ItemBase mainHand = mob.getWeaponItemBase(true);
|
||||
ItemBase offHand = mob.getWeaponItemBase(false);
|
||||
|
||||
if(!CombatUtilities.inRangeToAttack(mob,mob.combatTarget))
|
||||
return;
|
||||
|
||||
InterestManager.setObjectDirty(mob);
|
||||
|
||||
if (mainHand == null && offHand == null) {
|
||||
CombatUtilities.combatCycle(mob, mob.combatTarget, true, null);
|
||||
int delay = 3000;
|
||||
mob.setLastAttackTime(System.currentTimeMillis() + delay);
|
||||
} else if (mob.getWeaponItemBase(true) != null) {
|
||||
int delay = 3000;
|
||||
CombatUtilities.combatCycle(mob, mob.combatTarget, true, mob.getWeaponItemBase(true));
|
||||
mob.setLastAttackTime(System.currentTimeMillis() + delay);
|
||||
} else if (mob.getWeaponItemBase(false) != null) {
|
||||
int attackDelay = 3000;
|
||||
CombatUtilities.combatCycle(mob, mob.combatTarget, false, mob.getWeaponItemBase(false));
|
||||
mob.setLastAttackTime(System.currentTimeMillis() + attackDelay);
|
||||
}
|
||||
}
|
||||
|
||||
public static void MobCallForHelp(Mob mob){
|
||||
HashSet<AbstractWorldObject> mobs = WorldGrid.getObjectsInRangePartial(mob.loc,60f, MBServerStatics.MASK_MOB);
|
||||
for(AbstractWorldObject awo : mobs){
|
||||
Mob responder = (Mob)awo;
|
||||
if(responder.combatTarget == null)
|
||||
if(MovementUtilities.canMove(responder))
|
||||
MovementUtilities.aiMove(responder,mob.loc,false);
|
||||
}
|
||||
}
|
||||
}
|
||||
+344
-210
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user