Compare commits
667 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 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 |
+37
-51
@@ -9,15 +9,13 @@
|
|||||||
package engine;
|
package engine;
|
||||||
|
|
||||||
import ch.claude_martin.enumbitset.EnumBitSetHelper;
|
import ch.claude_martin.enumbitset.EnumBitSetHelper;
|
||||||
|
import engine.gameManager.BuildingManager;
|
||||||
import engine.gameManager.ConfigManager;
|
import engine.gameManager.ConfigManager;
|
||||||
import engine.gameManager.PowersManager;
|
import engine.gameManager.PowersManager;
|
||||||
import engine.gameManager.ZoneManager;
|
import engine.gameManager.ZoneManager;
|
||||||
import engine.math.Vector2f;
|
import engine.math.Vector2f;
|
||||||
import engine.math.Vector3fImmutable;
|
import engine.math.Vector3fImmutable;
|
||||||
import engine.objects.AbstractCharacter;
|
import engine.objects.*;
|
||||||
import engine.objects.ItemBase;
|
|
||||||
import engine.objects.Shrine;
|
|
||||||
import engine.objects.Zone;
|
|
||||||
import engine.powers.EffectsBase;
|
import engine.powers.EffectsBase;
|
||||||
import org.pmw.tinylog.Logger;
|
import org.pmw.tinylog.Logger;
|
||||||
|
|
||||||
@@ -152,9 +150,7 @@ public class Enum {
|
|||||||
NEPHFEMALE(2026, MonsterType.Nephilim, RunSpeed.STANDARD, CharacterSex.FEMALE, 1.1f),
|
NEPHFEMALE(2026, MonsterType.Nephilim, RunSpeed.STANDARD, CharacterSex.FEMALE, 1.1f),
|
||||||
HALFGIANTFEMALE(2027, MonsterType.HalfGiant, RunSpeed.STANDARD, CharacterSex.FEMALE, 1.15f),
|
HALFGIANTFEMALE(2027, MonsterType.HalfGiant, RunSpeed.STANDARD, CharacterSex.FEMALE, 1.15f),
|
||||||
VAMPMALE(2028, MonsterType.Vampire, RunSpeed.STANDARD, CharacterSex.MALE, 1),
|
VAMPMALE(2028, MonsterType.Vampire, RunSpeed.STANDARD, CharacterSex.MALE, 1),
|
||||||
VAMPFEMALE(2029, MonsterType.Vampire, RunSpeed.STANDARD, CharacterSex.FEMALE, 1),
|
VAMPFEMALE(2029, MonsterType.Vampire, RunSpeed.STANDARD, CharacterSex.FEMALE, 1);
|
||||||
SAETOR(1999, MonsterType.Minotaur, RunSpeed.MINOTAUR, CharacterSex.MALE, 0.80000001f),
|
|
||||||
LIZARDMAN(1998, MonsterType.Reptile, RunSpeed.STANDARD, CharacterSex.MALE, 1.05f);
|
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
private static HashMap<Integer, RaceType> _raceTypeByID = new HashMap<>();
|
private static HashMap<Integer, RaceType> _raceTypeByID = new HashMap<>();
|
||||||
@@ -174,6 +170,8 @@ public class Enum {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static RaceType getRaceTypebyRuneID(int runeID) {
|
public static RaceType getRaceTypebyRuneID(int runeID) {
|
||||||
|
if(runeID == 1999)
|
||||||
|
return _raceTypeByID.get(2017);
|
||||||
return _raceTypeByID.get(runeID);
|
return _raceTypeByID.get(runeID);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -210,9 +208,8 @@ public class Enum {
|
|||||||
SENTINEL(0, 0, 0, 0, 0, 0, 0),
|
SENTINEL(0, 0, 0, 0, 0, 0, 0),
|
||||||
STANDARD(6.1900001f, 13.97f, 4.2199998f, 13.97f, 6.3299999f, 18.379999f, 6.5f),
|
STANDARD(6.1900001f, 13.97f, 4.2199998f, 13.97f, 6.3299999f, 18.379999f, 6.5f),
|
||||||
CENTAUR(6.1900001f, 16.940001f, 5.5500002f, 16.940001f, 6.3299999f, 18.379999f, 6.5f),
|
CENTAUR(6.1900001f, 16.940001f, 5.5500002f, 16.940001f, 6.3299999f, 18.379999f, 6.5f),
|
||||||
IREKEI(6.35f, 15.25f, 4.2199998f, 14.5f, 6.3299999f, 18.379999f, 6.5f),
|
MINOTAUR(6.6300001f, 15.95f, 4.2199998f, 15.95f, 6.3299999f, 18.379999f, 6.5f),
|
||||||
MINOTAUR(6.6300001f, 15.95f, 4.2199998f, 15.95f, 6.3299999f, 18.379999f, 6.5f);
|
IREKEI(6.499500105f, 14.6685f, 4.2199998f, 14.6685f, 6.3299999f, 18.379999f, 6.5f);
|
||||||
|
|
||||||
private float walkStandard;
|
private float walkStandard;
|
||||||
private float walkCombat;
|
private float walkCombat;
|
||||||
private float runStandard;
|
private float runStandard;
|
||||||
@@ -472,11 +469,14 @@ public class Enum {
|
|||||||
|
|
||||||
// 14001 does not have a banestone to bind at
|
// 14001 does not have a banestone to bind at
|
||||||
|
|
||||||
if (ruinZone.getLoadNum() == 14001)
|
if (ruinZone.getLoadNum() == 14001) {
|
||||||
spawnLocation = Vector3fImmutable.getRandomPointOnCircle(ruinZone.getLoc(), 30);
|
spawnLocation = Vector3fImmutable.getRandomPointOnCircle(ruinZone.getLoc(), 30);
|
||||||
else
|
}else {
|
||||||
spawnLocation = Vector3fImmutable.getRandomPointOnCircle(ruinZone.getLoc()
|
//spawnLocation = Vector3fImmutable.getRandomPointOnCircle(ruinZone.getLoc()
|
||||||
.add(new Vector3fImmutable(-196.016f, 2.812f, 203.621f)), 30);
|
//.add(new Vector3fImmutable(-196.016f, 2.812f, 203.621f)), 30);
|
||||||
|
spawnLocation = Vector3fImmutable.getRandomPointOnCircle(BuildingManager.getBuilding(27977).loc,30f);
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -779,6 +779,7 @@ public class Enum {
|
|||||||
Combat,
|
Combat,
|
||||||
Spires,
|
Spires,
|
||||||
Snare,
|
Snare,
|
||||||
|
Snared,
|
||||||
Stun,
|
Stun,
|
||||||
Blind,
|
Blind,
|
||||||
Root,
|
Root,
|
||||||
@@ -881,6 +882,7 @@ public class Enum {
|
|||||||
Siege,
|
Siege,
|
||||||
Slash,
|
Slash,
|
||||||
Snare,
|
Snare,
|
||||||
|
Snared,
|
||||||
Sorcery,
|
Sorcery,
|
||||||
Spear,
|
Spear,
|
||||||
SpearMastery,
|
SpearMastery,
|
||||||
@@ -960,20 +962,21 @@ public class Enum {
|
|||||||
Wizardry;
|
Wizardry;
|
||||||
|
|
||||||
public static SourceType GetSourceType(String modName) {
|
public static SourceType GetSourceType(String modName) {
|
||||||
SourceType returnMod;
|
|
||||||
if (modName.isEmpty())
|
|
||||||
return SourceType.None;
|
|
||||||
switch(modName){
|
switch(modName){
|
||||||
case "Piercing":
|
case "Slashing":
|
||||||
modName = "Pierce";
|
modName = "Slash";
|
||||||
break;
|
break;
|
||||||
case "Crushing":
|
case "Crushing":
|
||||||
modName = "Crush";
|
modName = "Crush";
|
||||||
break;
|
break;
|
||||||
case "Slashing":
|
case "Piercing":
|
||||||
modName = "Slash";
|
modName = "Pierce";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
SourceType returnMod;
|
||||||
|
if (modName.isEmpty())
|
||||||
|
return SourceType.None;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
returnMod = SourceType.valueOf(modName.replace(",", ""));
|
returnMod = SourceType.valueOf(modName.replace(",", ""));
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
@@ -1029,6 +1032,7 @@ public class Enum {
|
|||||||
Silence,
|
Silence,
|
||||||
Slash,
|
Slash,
|
||||||
Snare,
|
Snare,
|
||||||
|
Snared,
|
||||||
Stance,
|
Stance,
|
||||||
Stun,
|
Stun,
|
||||||
Summon,
|
Summon,
|
||||||
@@ -1153,6 +1157,7 @@ public class Enum {
|
|||||||
SkillDebuff,
|
SkillDebuff,
|
||||||
SlashResistanceDebuff,
|
SlashResistanceDebuff,
|
||||||
Snare,
|
Snare,
|
||||||
|
Snared,
|
||||||
StackableAttrCONBuff,
|
StackableAttrCONBuff,
|
||||||
StackableAttrDEXBuff,
|
StackableAttrDEXBuff,
|
||||||
StackableAttrSTRBuff,
|
StackableAttrSTRBuff,
|
||||||
@@ -1665,24 +1670,6 @@ public class Enum {
|
|||||||
return extents;
|
return extents;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isTrainerBuilding(){
|
|
||||||
switch(this){
|
|
||||||
case AMAZONHALL:
|
|
||||||
case CATHEDRAL:
|
|
||||||
case GREATHALL:
|
|
||||||
case KEEP:
|
|
||||||
case THIEFHALL:
|
|
||||||
case TEMPLEHALL:
|
|
||||||
case WIZARDHALL:
|
|
||||||
case ELVENHALL:
|
|
||||||
case ELVENSANCTUM:
|
|
||||||
case IREKEIHALL:
|
|
||||||
case FORESTHALL:
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum UpdateType {
|
public enum UpdateType {
|
||||||
@@ -2337,9 +2324,9 @@ public class Enum {
|
|||||||
|
|
||||||
public enum CityBoundsType {
|
public enum CityBoundsType {
|
||||||
|
|
||||||
GRID(640),
|
GRID(544),
|
||||||
ZONE(680),
|
ZONE(672),
|
||||||
PLACEMENT(681);
|
PLACEMENT(673);
|
||||||
|
|
||||||
public final float extents;
|
public final float extents;
|
||||||
|
|
||||||
@@ -2853,6 +2840,7 @@ public class Enum {
|
|||||||
|
|
||||||
public enum MobBehaviourType {
|
public enum MobBehaviourType {
|
||||||
None(null, false, false, false, false, false),
|
None(null, false, false, false, false, false),
|
||||||
|
//Power
|
||||||
Power(null, false, true, true, true, false),
|
Power(null, false, true, true, true, false),
|
||||||
PowerHelpee(Power, false, true, true, false, true),
|
PowerHelpee(Power, false, true, true, false, true),
|
||||||
PowerHelpeeWimpy(Power, true, false, true, false, false),
|
PowerHelpeeWimpy(Power, true, false, true, false, false),
|
||||||
@@ -2877,7 +2865,6 @@ public class Enum {
|
|||||||
//Independent Types
|
//Independent Types
|
||||||
SimpleStandingGuard(null, false, false, false, false, false),
|
SimpleStandingGuard(null, false, false, false, false, false),
|
||||||
Pet1(null, false, false, true, false, false),
|
Pet1(null, false, false, true, false, false),
|
||||||
SiegeEngine(null, false, false, false, false, false),
|
|
||||||
Simple(null, false, false, true, false, false),
|
Simple(null, false, false, true, false, false),
|
||||||
Helpee(null, false, true, true, false, true),
|
Helpee(null, false, true, true, false, true),
|
||||||
HelpeeWimpy(null, true, false, true, false, false),
|
HelpeeWimpy(null, true, false, true, false, false),
|
||||||
@@ -2888,12 +2875,13 @@ public class Enum {
|
|||||||
HamletGuard(null, false, true, false, false, false),
|
HamletGuard(null, false, true, false, false, false),
|
||||||
AggroWanderer(null, false, false, true, false, false);
|
AggroWanderer(null, false, false, true, false, false);
|
||||||
|
|
||||||
public final MobBehaviourType BehaviourHelperType;
|
private static HashMap<Integer, MobBehaviourType> _behaviourTypes = new HashMap<>();
|
||||||
public final boolean isWimpy;
|
public MobBehaviourType BehaviourHelperType;
|
||||||
public final boolean isAgressive;
|
public boolean isWimpy;
|
||||||
public final boolean canRoam;
|
public boolean isAgressive;
|
||||||
public final boolean callsForHelp;
|
public boolean canRoam;
|
||||||
public final boolean respondsToCallForHelp;
|
public boolean callsForHelp;
|
||||||
|
public boolean respondsToCallForHelp;
|
||||||
|
|
||||||
MobBehaviourType(MobBehaviourType helpeebehaviourType, boolean wimpy, boolean agressive, boolean canroam, boolean callsforhelp, boolean respondstocallforhelp) {
|
MobBehaviourType(MobBehaviourType helpeebehaviourType, boolean wimpy, boolean agressive, boolean canroam, boolean callsforhelp, boolean respondstocallforhelp) {
|
||||||
this.BehaviourHelperType = helpeebehaviourType;
|
this.BehaviourHelperType = helpeebehaviourType;
|
||||||
@@ -2910,8 +2898,6 @@ public class Enum {
|
|||||||
MOBILE,
|
MOBILE,
|
||||||
PET,
|
PET,
|
||||||
CHARMED,
|
CHARMED,
|
||||||
|
|
||||||
SIEGEENGINE,
|
|
||||||
GUARD;
|
GUARD;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,13 +19,9 @@ import engine.net.AbstractNetMsg;
|
|||||||
import engine.net.Dispatch;
|
import engine.net.Dispatch;
|
||||||
import engine.net.DispatchMessage;
|
import engine.net.DispatchMessage;
|
||||||
import engine.net.client.ClientConnection;
|
import engine.net.client.ClientConnection;
|
||||||
import engine.net.client.msg.LoadCharacterMsg;
|
import engine.net.client.msg.*;
|
||||||
import engine.net.client.msg.LoadStructureMsg;
|
|
||||||
import engine.net.client.msg.MoveToPointMsg;
|
|
||||||
import engine.net.client.msg.UnloadObjectsMsg;
|
|
||||||
import engine.objects.*;
|
import engine.objects.*;
|
||||||
import engine.server.MBServerStatics;
|
import engine.server.MBServerStatics;
|
||||||
import engine.util.BoxTracker;
|
|
||||||
import org.pmw.tinylog.Logger;
|
import org.pmw.tinylog.Logger;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -110,7 +106,7 @@ public enum InterestManager implements Runnable {
|
|||||||
origin.sendMsg(moveMsg);
|
origin.sendMsg(moveMsg);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void reloadCharacter(AbstractCharacter absChar, boolean sendToSelf) {
|
public static void reloadCharacter(AbstractCharacter absChar) {
|
||||||
|
|
||||||
UnloadObjectsMsg uom = new UnloadObjectsMsg();
|
UnloadObjectsMsg uom = new UnloadObjectsMsg();
|
||||||
uom.addObject(absChar);
|
uom.addObject(absChar);
|
||||||
@@ -211,7 +207,7 @@ public enum InterestManager implements Runnable {
|
|||||||
if (origin == null)
|
if (origin == null)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!playerCharacter.enteredWorld)
|
if (!playerCharacter.isEnteredWorld())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (playerCharacter.getTeleportLock().readLock().tryLock()) {
|
if (playerCharacter.getTeleportLock().readLock().tryLock()) {
|
||||||
@@ -468,7 +464,7 @@ public enum InterestManager implements Runnable {
|
|||||||
if (awonpc.despawned == true)
|
if (awonpc.despawned == true)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
awonpc.playerAgroMap.put(player.getObjectUUID(), 0f);
|
awonpc.playerAgroMap.put(player.getObjectUUID(), false);
|
||||||
((Mob) awonpc).setCombatTarget(null);
|
((Mob) awonpc).setCombatTarget(null);
|
||||||
lcm = new LoadCharacterMsg(awonpc, PlayerCharacter.hideNonAscii());
|
lcm = new LoadCharacterMsg(awonpc, PlayerCharacter.hideNonAscii());
|
||||||
|
|
||||||
@@ -481,7 +477,7 @@ public enum InterestManager implements Runnable {
|
|||||||
if (!awonpc.isAlive())
|
if (!awonpc.isAlive())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
awonpc.playerAgroMap.put(player.getObjectUUID(), 0f);
|
awonpc.playerAgroMap.put(player.getObjectUUID(), false);
|
||||||
|
|
||||||
if ((awonpc.agentType.equals(Enum.AIAgentType.MOBILE)))
|
if ((awonpc.agentType.equals(Enum.AIAgentType.MOBILE)))
|
||||||
((Mob) awonpc).setCombatTarget(null);
|
((Mob) awonpc).setCombatTarget(null);
|
||||||
@@ -522,11 +518,10 @@ public enum InterestManager implements Runnable {
|
|||||||
|
|
||||||
// Update loaded upbjects lists
|
// Update loaded upbjects lists
|
||||||
|
|
||||||
|
player.isBoxed = PlayerCharacter.checkIfBoxed(player);
|
||||||
player.setDirtyLoad(true);
|
player.setDirtyLoad(true);
|
||||||
updateStaticList(player, origin);
|
updateStaticList(player, origin);
|
||||||
updateMobileList(player, origin);
|
updateMobileList(player, origin);
|
||||||
BoxTracker.addPlayer(origin.machineID,player);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized void HandleLoadForTeleport(PlayerCharacter playerCharacter) {
|
public synchronized void HandleLoadForTeleport(PlayerCharacter playerCharacter) {
|
||||||
|
|||||||
@@ -10,17 +10,13 @@
|
|||||||
package engine.db.handlers;
|
package engine.db.handlers;
|
||||||
|
|
||||||
import engine.gameManager.DbManager;
|
import engine.gameManager.DbManager;
|
||||||
import engine.objects.Bane;
|
import engine.gameManager.ZoneManager;
|
||||||
import engine.objects.Building;
|
import engine.math.Vector3fImmutable;
|
||||||
import engine.objects.City;
|
import engine.objects.*;
|
||||||
import engine.objects.PlayerCharacter;
|
|
||||||
import org.joda.time.DateTime;
|
import org.joda.time.DateTime;
|
||||||
import org.pmw.tinylog.Logger;
|
import org.pmw.tinylog.Logger;
|
||||||
|
|
||||||
import java.sql.Connection;
|
import java.sql.*;
|
||||||
import java.sql.PreparedStatement;
|
|
||||||
import java.sql.ResultSet;
|
|
||||||
import java.sql.SQLException;
|
|
||||||
|
|
||||||
public class dbBaneHandler extends dbHandlerBase {
|
public class dbBaneHandler extends dbHandlerBase {
|
||||||
|
|
||||||
@@ -89,6 +85,139 @@ public class dbBaneHandler extends dbHandlerBase {
|
|||||||
return true;
|
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) {
|
public boolean REMOVE_BANE(Bane bane) {
|
||||||
|
|
||||||
if (bane == null)
|
if (bane == null)
|
||||||
@@ -107,4 +236,25 @@ public class dbBaneHandler extends dbHandlerBase {
|
|||||||
|
|
||||||
return true;
|
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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -73,14 +73,6 @@ public class dbBlueprintHandler extends dbHandlerBase {
|
|||||||
Blueprint._meshLookup.putIfAbsent(thisBlueprint.getMeshForRank(3), thisBlueprint);
|
Blueprint._meshLookup.putIfAbsent(thisBlueprint.getMeshForRank(3), thisBlueprint);
|
||||||
Blueprint._meshLookup.putIfAbsent(thisBlueprint.getMeshForRank(7), thisBlueprint);
|
Blueprint._meshLookup.putIfAbsent(thisBlueprint.getMeshForRank(7), thisBlueprint);
|
||||||
|
|
||||||
if(thisBlueprint.getName().contains("Vampire Shrine")){
|
|
||||||
Blueprint saetorShrine = new Blueprint(rs);
|
|
||||||
saetorShrine.setBlueprintUUID(1720000);
|
|
||||||
saetorShrine.rank1UUID = 1720000;
|
|
||||||
saetorShrine.rank3UUID = 1720000;
|
|
||||||
saetorShrine.rank7UUID = 1720000;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
|
|||||||
@@ -14,7 +14,6 @@ import engine.gameManager.DbManager;
|
|||||||
import engine.objects.AbstractCharacter;
|
import engine.objects.AbstractCharacter;
|
||||||
import engine.objects.CharacterSkill;
|
import engine.objects.CharacterSkill;
|
||||||
import engine.objects.PlayerCharacter;
|
import engine.objects.PlayerCharacter;
|
||||||
import engine.objects.SkillsBase;
|
|
||||||
import engine.server.MBServerStatics;
|
import engine.server.MBServerStatics;
|
||||||
import org.pmw.tinylog.Logger;
|
import org.pmw.tinylog.Logger;
|
||||||
|
|
||||||
|
|||||||
@@ -11,10 +11,7 @@ package engine.db.handlers;
|
|||||||
|
|
||||||
import engine.Enum;
|
import engine.Enum;
|
||||||
import engine.gameManager.DbManager;
|
import engine.gameManager.DbManager;
|
||||||
import engine.objects.AbstractGameObject;
|
import engine.objects.*;
|
||||||
import engine.objects.Building;
|
|
||||||
import engine.objects.City;
|
|
||||||
import engine.objects.Zone;
|
|
||||||
import org.pmw.tinylog.Logger;
|
import org.pmw.tinylog.Logger;
|
||||||
|
|
||||||
import java.sql.*;
|
import java.sql.*;
|
||||||
@@ -95,7 +92,16 @@ public class dbCityHandler extends dbHandlerBase {
|
|||||||
|
|
||||||
return objectList;
|
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) {
|
public ArrayList<City> GET_CITIES_BY_ZONE(final int objectUUID) {
|
||||||
|
|
||||||
ArrayList<City> cityList = new ArrayList<>();
|
ArrayList<City> cityList = new ArrayList<>();
|
||||||
|
|||||||
@@ -98,6 +98,7 @@ public class dbContractHandler extends dbHandlerBase {
|
|||||||
|
|
||||||
public void LOAD_SELL_LIST_FOR_CONTRACT(final Contract contract) {
|
public void LOAD_SELL_LIST_FOR_CONTRACT(final Contract contract) {
|
||||||
|
|
||||||
|
if(!contract.getName().contains("Sage")) {
|
||||||
try (Connection connection = DbManager.getConnection();
|
try (Connection connection = DbManager.getConnection();
|
||||||
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_npc_contract_selltype` WHERE `contractID` = ?;")) {
|
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_npc_contract_selltype` WHERE `contractID` = ?;")) {
|
||||||
|
|
||||||
@@ -125,6 +126,27 @@ public class dbContractHandler extends dbHandlerBase {
|
|||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
Logger.error(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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean updateAllowedBuildings(final Contract con, final long slotbitvalue) {
|
public boolean updateAllowedBuildings(final Contract con, final long slotbitvalue) {
|
||||||
|
|||||||
@@ -32,7 +32,6 @@ public abstract class dbHandlerBase {
|
|||||||
try {
|
try {
|
||||||
if (rs.next()) {
|
if (rs.next()) {
|
||||||
abstractGameObject = localClass.getConstructor(ResultSet.class).newInstance(rs);
|
abstractGameObject = localClass.getConstructor(ResultSet.class).newInstance(rs);
|
||||||
|
|
||||||
DbManager.addToCache(abstractGameObject);
|
DbManager.addToCache(abstractGameObject);
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
@@ -57,10 +56,23 @@ public abstract class dbHandlerBase {
|
|||||||
while (rs.next()) {
|
while (rs.next()) {
|
||||||
|
|
||||||
int id = rs.getInt(1);
|
int id = rs.getInt(1);
|
||||||
|
try {
|
||||||
|
if (rs.getInt("capSize") == 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}catch(Exception e){
|
||||||
|
//not a mine
|
||||||
|
}
|
||||||
|
|
||||||
if (DbManager.inCache(localObjectType, id)) {
|
if (DbManager.inCache(localObjectType, id)) {
|
||||||
objectList.add((T) DbManager.getFromCache(localObjectType, id));
|
objectList.add((T) DbManager.getFromCache(localObjectType, id));
|
||||||
} else {
|
} else {
|
||||||
|
try{
|
||||||
|
if(rs.getInt("mineLiveHour") == 1)
|
||||||
|
continue;
|
||||||
|
}catch(Exception e){
|
||||||
|
//not a mine
|
||||||
|
}
|
||||||
AbstractGameObject toAdd = localClass.getConstructor(ResultSet.class).newInstance(rs);
|
AbstractGameObject toAdd = localClass.getConstructor(ResultSet.class).newInstance(rs);
|
||||||
DbManager.addToCache(toAdd);
|
DbManager.addToCache(toAdd);
|
||||||
if(toAdd.getObjectType().equals(GameObjectType.Zone) && rs.getInt("canLoad") == 0){
|
if(toAdd.getObjectType().equals(GameObjectType.Zone) && rs.getInt("canLoad") == 0){
|
||||||
|
|||||||
@@ -28,67 +28,10 @@ public class dbItemBaseHandler extends dbHandlerBase {
|
|||||||
|
|
||||||
public void LOAD_BAKEDINSTATS(ItemBase itemBase) {
|
public void LOAD_BAKEDINSTATS(ItemBase itemBase) {
|
||||||
|
|
||||||
int itemBaseID = itemBase.getUUID();
|
|
||||||
switch(itemBaseID){
|
|
||||||
case 27550://bow
|
|
||||||
case 27560://dagger
|
|
||||||
case 27570://hammer
|
|
||||||
case 27580://axe
|
|
||||||
case 27590://sword
|
|
||||||
//return new String[]{"PRE-010","SUF-260"};
|
|
||||||
itemBaseID = 8000000;
|
|
||||||
break;
|
|
||||||
case 27600://staff
|
|
||||||
//return new String[]{"PRE-334","PRE-315"};
|
|
||||||
itemBaseID = 8000010;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 188500://HA chest
|
|
||||||
case 188510://HA arms
|
|
||||||
case 188520://HA legs
|
|
||||||
case 188530://HA gloves
|
|
||||||
case 188550://HA helm
|
|
||||||
case 188720://CC hood
|
|
||||||
case 188900://MA chest
|
|
||||||
case 188910://MA Sleeves
|
|
||||||
case 188920://MA Legs
|
|
||||||
case 188930://MA gloves
|
|
||||||
case 188950://MA helm
|
|
||||||
case 189100://la chest
|
|
||||||
case 189110://la arms
|
|
||||||
case 189120://la legs
|
|
||||||
case 189130://la gloves
|
|
||||||
case 189150://la helm
|
|
||||||
case 189550://CC gloves
|
|
||||||
//return new String[]{"PRE-130", "PRE-232", "PRE-212", "PRE-222", "SUF-007"};
|
|
||||||
itemBaseID = 8000020;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 188540://HA boots
|
|
||||||
case 188940://MA boots
|
|
||||||
case 189140://LA boots
|
|
||||||
case 189560://CC boots
|
|
||||||
//return new String[]{"PRE-133", "PRE-230", "PRE-210", "PRE-220", "SUF-003","SUF-150"};
|
|
||||||
itemBaseID = 8000030;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 188700://CC robe
|
|
||||||
//return new String[]{"PRE-130", "PRE-232", "PRE-212", "PRE-222","SUF-317","SUF-317","SUF-317"};
|
|
||||||
itemBaseID = 8000040;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 189500://MA shield
|
|
||||||
case 189510://HA shield
|
|
||||||
//return new String[]{"PRE-125","PRE-125","PRE-125", "PRE-230", "PRE-210", "PRE-220"};
|
|
||||||
itemBaseID = 8000050;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
try (Connection connection = DbManager.getConnection();
|
try (Connection connection = DbManager.getConnection();
|
||||||
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_item_bakedinstat` WHERE `itemID` = ?")) {
|
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_item_bakedinstat` WHERE `itemID` = ?")) {
|
||||||
|
|
||||||
preparedStatement.setInt(1, itemBaseID);
|
preparedStatement.setInt(1, itemBase.getUUID());
|
||||||
ResultSet rs = preparedStatement.executeQuery();
|
ResultSet rs = preparedStatement.executeQuery();
|
||||||
|
|
||||||
while (rs.next()) {
|
while (rs.next()) {
|
||||||
@@ -102,6 +45,24 @@ public class dbItemBaseHandler extends dbHandlerBase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void LOAD_DEX_REDUCTION(ItemBase itemBase) {
|
||||||
|
|
||||||
|
try (Connection connection = DbManager.getConnection();
|
||||||
|
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_item_dexpenalty` WHERE `ID` = ?")) {
|
||||||
|
|
||||||
|
preparedStatement.setInt(1, itemBase.getUUID());
|
||||||
|
ResultSet rs = preparedStatement.executeQuery();
|
||||||
|
|
||||||
|
// Check if a result was found
|
||||||
|
if (rs.next()) {
|
||||||
|
itemBase.dexReduction = rs.getFloat("item_bulk_factor");
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (SQLException e) {
|
||||||
|
Logger.error(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void LOAD_ANIMATIONS(ItemBase itemBase) {
|
public void LOAD_ANIMATIONS(ItemBase itemBase) {
|
||||||
|
|
||||||
ArrayList<Integer> tempList = new ArrayList<>();
|
ArrayList<Integer> tempList = new ArrayList<>();
|
||||||
@@ -144,19 +105,12 @@ public class dbItemBaseHandler extends dbHandlerBase {
|
|||||||
recordsRead++;
|
recordsRead++;
|
||||||
itemBase = new ItemBase(rs);
|
itemBase = new ItemBase(rs);
|
||||||
ItemBase.addToCache(itemBase);
|
ItemBase.addToCache(itemBase);
|
||||||
|
|
||||||
//copy the vampire shrine for saetor and change uuid and name
|
|
||||||
if(itemBase.getName().contains("Vampire Shrine")){
|
|
||||||
ItemBase saetorShrine = new ItemBase(rs);
|
|
||||||
saetorShrine.setUUID(1035);
|
|
||||||
saetorShrine.setName(saetorShrine.getName().replace("Vampire","Saetor"));
|
|
||||||
ItemBase.addToCache(saetorShrine);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
Logger.error(e);
|
Logger.error(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
Logger.info("read: " + recordsRead + " cached: " + ItemBase.getUUIDCache().size());
|
Logger.info("read: " + recordsRead + " cached: " + ItemBase.getUUIDCache().size());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -134,13 +134,13 @@ public class dbItemHandler extends dbHandlerBase {
|
|||||||
|
|
||||||
ResultSet rs = preparedStatement.executeQuery();
|
ResultSet rs = preparedStatement.executeQuery();
|
||||||
|
|
||||||
if (rs.next())
|
if (rs.next()) {
|
||||||
try {
|
try {
|
||||||
worked = rs.getBoolean("result");
|
worked = rs.getBoolean("result");
|
||||||
}catch(Exception e){
|
}catch(Exception e){
|
||||||
return true;
|
worked = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
Logger.error(e);
|
Logger.error(e);
|
||||||
}
|
}
|
||||||
@@ -354,11 +354,7 @@ public class dbItemHandler extends dbHandlerBase {
|
|||||||
ResultSet rs = preparedStatement.executeQuery();
|
ResultSet rs = preparedStatement.executeQuery();
|
||||||
|
|
||||||
if (rs.next())
|
if (rs.next())
|
||||||
try {
|
|
||||||
worked = rs.getBoolean("result");
|
worked = rs.getBoolean("result");
|
||||||
} catch(Exception e){
|
|
||||||
worked = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
Logger.error(e);
|
Logger.error(e);
|
||||||
|
|||||||
@@ -9,14 +9,12 @@
|
|||||||
package engine.db.handlers;
|
package engine.db.handlers;
|
||||||
|
|
||||||
import engine.Enum;
|
import engine.Enum;
|
||||||
import engine.gameManager.BuildingManager;
|
|
||||||
import engine.gameManager.DbManager;
|
import engine.gameManager.DbManager;
|
||||||
import engine.objects.Mine;
|
import engine.objects.Mine;
|
||||||
import engine.objects.MineProduction;
|
import engine.objects.MineProduction;
|
||||||
import engine.objects.Resource;
|
import engine.objects.Resource;
|
||||||
import org.pmw.tinylog.Logger;
|
import org.pmw.tinylog.Logger;
|
||||||
|
|
||||||
import java.net.UnknownHostException;
|
|
||||||
import java.sql.Connection;
|
import java.sql.Connection;
|
||||||
import java.sql.PreparedStatement;
|
import java.sql.PreparedStatement;
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
@@ -34,24 +32,8 @@ public class dbMineHandler extends dbHandlerBase {
|
|||||||
|
|
||||||
if (id == 0)
|
if (id == 0)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
Mine mine = (Mine) DbManager.getFromCache(Enum.GameObjectType.Mine, id);
|
Mine mine = (Mine) DbManager.getFromCache(Enum.GameObjectType.Mine, id);
|
||||||
try (Connection connection = DbManager.getConnection();
|
|
||||||
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM obj_mine;")) {
|
|
||||||
|
|
||||||
//preparedStatement.setInt(1, id);
|
|
||||||
|
|
||||||
ResultSet rs = preparedStatement.executeQuery();
|
|
||||||
while(rs.next()){
|
|
||||||
if(rs.getInt("UID") == id){
|
|
||||||
int towerUID = rs.getInt("mine_buildingUID");
|
|
||||||
mine = Mine.getMineFromTower(towerUID);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
} catch (SQLException e) {
|
|
||||||
Logger.error(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mine != null)
|
if (mine != null)
|
||||||
return mine;
|
return mine;
|
||||||
@@ -74,27 +56,13 @@ public class dbMineHandler extends dbHandlerBase {
|
|||||||
|
|
||||||
ArrayList<Mine> mines = new ArrayList<>();
|
ArrayList<Mine> mines = new ArrayList<>();
|
||||||
|
|
||||||
//try (Connection connection = DbManager.getConnection();
|
|
||||||
// PreparedStatement preparedStatement = connection.prepareStatement("SELECT `obj_mine`.*, `object`.`parent` FROM `object` INNER JOIN `obj_mine` ON `obj_mine`.`UID` = `object`.`UID`")) {
|
|
||||||
|
|
||||||
// ResultSet rs = preparedStatement.executeQuery();
|
|
||||||
// mines = getObjectsFromRs(rs, 1000);
|
|
||||||
|
|
||||||
// } catch (SQLException e) {
|
|
||||||
// Logger.error(e);
|
|
||||||
//}
|
|
||||||
try (Connection connection = DbManager.getConnection();
|
try (Connection connection = DbManager.getConnection();
|
||||||
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM obj_mine;")) {
|
PreparedStatement preparedStatement = connection.prepareStatement("SELECT `obj_mine`.*, `object`.`parent` FROM `object` INNER JOIN `obj_mine` ON `obj_mine`.`UID` = `object`.`UID`")) {
|
||||||
|
|
||||||
ResultSet rs = preparedStatement.executeQuery();
|
ResultSet rs = preparedStatement.executeQuery();
|
||||||
while(rs.next()){
|
mines = getObjectsFromRs(rs, 1000);
|
||||||
if(BuildingManager.getBuildingFromCache(rs.getInt("mine_buildingUID")) == null)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
mines.add(new Mine(rs));
|
} catch (SQLException e) {
|
||||||
}
|
|
||||||
|
|
||||||
} catch (SQLException | UnknownHostException e) {
|
|
||||||
Logger.error(e);
|
Logger.error(e);
|
||||||
}
|
}
|
||||||
return mines;
|
return mines;
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ import java.sql.PreparedStatement;
|
|||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
|
||||||
|
|
||||||
public class dbMobBaseHandler extends dbHandlerBase {
|
public class dbMobBaseHandler extends dbHandlerBase {
|
||||||
|
|
||||||
@@ -113,25 +112,6 @@ public class dbMobBaseHandler extends dbHandlerBase {
|
|||||||
return mobBaseStats;
|
return mobBaseStats;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void LOAD_ALL_MOBBASE_RACES() {
|
|
||||||
MobBase.mobbase_race_types = new HashMap<>();
|
|
||||||
try (Connection connection = DbManager.getConnection();
|
|
||||||
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_npc_mobbase`;")) {
|
|
||||||
|
|
||||||
ResultSet rs = preparedStatement.executeQuery();
|
|
||||||
|
|
||||||
while (rs.next()) {
|
|
||||||
int id = rs.getInt("loadID");
|
|
||||||
if(MobBase.mobbase_race_types.containsKey(id) == false){
|
|
||||||
MobBase.mobbase_race_types.put(id,rs.getString("raceType"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (SQLException e) {
|
|
||||||
Logger.error(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void LOAD_ALL_MOBBASE_SPEEDS(MobBase mobBase) {
|
public void LOAD_ALL_MOBBASE_SPEEDS(MobBase mobBase) {
|
||||||
|
|
||||||
if (mobBase.getLoadID() == 0)
|
if (mobBase.getLoadID() == 0)
|
||||||
|
|||||||
@@ -28,26 +28,31 @@ public class dbMobHandler extends dbHandlerBase {
|
|||||||
this.localObjectType = engine.Enum.GameObjectType.valueOf(this.localClass.getSimpleName());
|
this.localObjectType = engine.Enum.GameObjectType.valueOf(this.localClass.getSimpleName());
|
||||||
}
|
}
|
||||||
|
|
||||||
public Mob PERSIST(Mob toAdd) {
|
public Mob ADD_MOB(Mob toAdd) {
|
||||||
|
|
||||||
Mob mobile = null;
|
Mob mobile = null;
|
||||||
|
|
||||||
try (Connection connection = DbManager.getConnection();
|
try (Connection connection = DbManager.getConnection();
|
||||||
PreparedStatement preparedStatement = connection.prepareStatement("CALL `mob_CREATE`(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);")) {
|
PreparedStatement preparedStatement = connection.prepareStatement("CALL `mob_CREATE`(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);")) {
|
||||||
|
|
||||||
preparedStatement.setLong(1, toAdd.parentZoneUUID);
|
preparedStatement.setLong(1, toAdd.getParentZoneID());
|
||||||
preparedStatement.setInt(2, toAdd.loadID);
|
preparedStatement.setInt(2, toAdd.getMobBaseID());
|
||||||
preparedStatement.setInt(3, toAdd.guildUUID);
|
preparedStatement.setInt(3, toAdd.getGuildUUID());
|
||||||
preparedStatement.setFloat(4, toAdd.bindLoc.x);
|
preparedStatement.setFloat(4, toAdd.getSpawnX());
|
||||||
preparedStatement.setFloat(5, toAdd.bindLoc.y);
|
preparedStatement.setFloat(5, toAdd.getSpawnY());
|
||||||
preparedStatement.setFloat(6, toAdd.bindLoc.z);
|
preparedStatement.setFloat(6, toAdd.getSpawnZ());
|
||||||
preparedStatement.setInt(7, 0);
|
preparedStatement.setInt(7, 0);
|
||||||
preparedStatement.setFloat(8, toAdd.spawnRadius);
|
preparedStatement.setFloat(8, toAdd.getSpawnRadius());
|
||||||
preparedStatement.setInt(9, toAdd.spawnTime);
|
preparedStatement.setInt(9, toAdd.getTrueSpawnTime());
|
||||||
preparedStatement.setInt(10, toAdd.contractUUID);
|
|
||||||
preparedStatement.setInt(11, toAdd.buildingUUID);
|
if (toAdd.getContract() != null)
|
||||||
preparedStatement.setInt(12, toAdd.level);
|
preparedStatement.setInt(10, toAdd.getContract().getContractID());
|
||||||
preparedStatement.setString(13, toAdd.firstName);
|
else
|
||||||
|
preparedStatement.setInt(10, 0);
|
||||||
|
|
||||||
|
preparedStatement.setInt(11, toAdd.getBuildingID());
|
||||||
|
preparedStatement.setInt(12, toAdd.getLevel());
|
||||||
|
preparedStatement.setString(13, toAdd.getFirstName());
|
||||||
|
|
||||||
ResultSet rs = preparedStatement.executeQuery();
|
ResultSet rs = preparedStatement.executeQuery();
|
||||||
|
|
||||||
@@ -101,17 +106,17 @@ public class dbMobHandler extends dbHandlerBase {
|
|||||||
return row_count;
|
return row_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void LOAD_GUARD_MINIONS(Mob guardCaptain) {
|
public void LOAD_PATROL_POINTS(Mob captain) {
|
||||||
|
|
||||||
try (Connection connection = DbManager.getConnection();
|
try (Connection connection = DbManager.getConnection();
|
||||||
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `dyn_guards` WHERE `captainUID` = ?")) {
|
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `dyn_guards` WHERE `captainUID` = ?")) {
|
||||||
|
|
||||||
preparedStatement.setInt(1, guardCaptain.getObjectUUID());
|
preparedStatement.setInt(1, captain.getObjectUUID());
|
||||||
ResultSet rs = preparedStatement.executeQuery();
|
ResultSet rs = preparedStatement.executeQuery();
|
||||||
|
|
||||||
while (rs.next()) {
|
while (rs.next()) {
|
||||||
String minionName = rs.getString("name");
|
String name = rs.getString("name");
|
||||||
Mob toCreate = Mob.createGuardMinion(guardCaptain, guardCaptain.getLevel(), minionName);
|
Mob toCreate = Mob.createGuardMob(captain, captain.getGuild(), captain.getParentZone(), captain.building.getLoc(), captain.getLevel(), name);
|
||||||
|
|
||||||
if (toCreate == null)
|
if (toCreate == null)
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -131,6 +131,32 @@ public class dbNPCHandler extends dbHandlerBase {
|
|||||||
return npc;
|
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) {
|
public int MOVE_NPC(long npcID, long parentID, float locX, float locY, float locZ) {
|
||||||
|
|
||||||
int rowCount;
|
int rowCount;
|
||||||
@@ -176,6 +202,18 @@ public class dbNPCHandler extends dbHandlerBase {
|
|||||||
return result;
|
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) {
|
public void updateDatabase(final NPC npc) {
|
||||||
|
|
||||||
try (Connection connection = DbManager.getConnection();
|
try (Connection connection = DbManager.getConnection();
|
||||||
|
|||||||
@@ -23,25 +23,7 @@ public class dbResistHandler extends dbHandlerBase {
|
|||||||
public dbResistHandler() {
|
public dbResistHandler() {
|
||||||
|
|
||||||
}
|
}
|
||||||
public void LOAD_RESISTS_FOR_MOBS() {
|
|
||||||
|
|
||||||
Resists resists = null;
|
|
||||||
|
|
||||||
try (Connection connection = DbManager.getConnection();
|
|
||||||
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_npc_mob_resists`;")) {
|
|
||||||
|
|
||||||
ResultSet rs = preparedStatement.executeQuery();
|
|
||||||
|
|
||||||
while(rs.next()){
|
|
||||||
resists = new Resists(rs);
|
|
||||||
if(!Resists.mobResists.containsKey(rs.getInt("ID")))
|
|
||||||
Resists.mobResists.put(rs.getInt("ID"),resists);
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (SQLException e) {
|
|
||||||
Logger.error(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public Resists GET_RESISTS_FOR_MOB(int resistID) {
|
public Resists GET_RESISTS_FOR_MOB(int resistID) {
|
||||||
|
|
||||||
Resists resists = null;
|
Resists resists = null;
|
||||||
|
|||||||
@@ -59,43 +59,6 @@ public class dbRuneBaseHandler extends dbHandlerBase {
|
|||||||
rb.setLevelRequired(rs.getInt("requiredRuneID"));
|
rb.setLevelRequired(rs.getInt("requiredRuneID"));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
int id = rs.getInt("runeID");
|
|
||||||
switch(id) {
|
|
||||||
case 3001:
|
|
||||||
case 3002:
|
|
||||||
case 3003:
|
|
||||||
case 3004:
|
|
||||||
case 3007:
|
|
||||||
case 3008:
|
|
||||||
case 3009:
|
|
||||||
case 3013:
|
|
||||||
case 3014:
|
|
||||||
case 3016:
|
|
||||||
case 3017:
|
|
||||||
case 3018:
|
|
||||||
case 3019:
|
|
||||||
case 3020:
|
|
||||||
case 3021:
|
|
||||||
case 3026:
|
|
||||||
case 3030:
|
|
||||||
case 3031:
|
|
||||||
case 3033:
|
|
||||||
case 3037:
|
|
||||||
case 3040:
|
|
||||||
case 3045:
|
|
||||||
case 3046:
|
|
||||||
case 3047:
|
|
||||||
case 3048:
|
|
||||||
case 2514:
|
|
||||||
rb.getRace().put(1999, true);
|
|
||||||
break;
|
|
||||||
case 3035:
|
|
||||||
rb.getBaseClass().put(2501,true);
|
|
||||||
break;
|
|
||||||
case 3049:
|
|
||||||
rb.getRace().clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
|
|||||||
@@ -143,13 +143,6 @@ public class dbSkillBaseHandler extends dbHandlerBase {
|
|||||||
|
|
||||||
SkillsBase.runeSkillsCache.get(runeID).put(token, amount);
|
SkillsBase.runeSkillsCache.get(runeID).put(token, amount);
|
||||||
}
|
}
|
||||||
//add saetor skills
|
|
||||||
HashMap<Integer, Integer> skills = new HashMap<>();
|
|
||||||
skills.put(71438003,15); // staff
|
|
||||||
skills.put(-61022283,10); // staff mastery
|
|
||||||
skills.put(95961104,10); // parry
|
|
||||||
SkillsBase.runeSkillsCache.put(1999,skills);
|
|
||||||
|
|
||||||
|
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
Logger.error(e);
|
Logger.error(e);
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ public class AddMobCmd extends AbstractDevCmd {
|
|||||||
MobBase mb = (MobBase) mobbaseAGO;
|
MobBase mb = (MobBase) mobbaseAGO;
|
||||||
int loadID = mb.getObjectUUID();
|
int loadID = mb.getObjectUUID();
|
||||||
Mob mob = Mob.createMob(loadID, Vector3fImmutable.getRandomPointInCircle(pc.getLoc(), 100),
|
Mob mob = Mob.createMob(loadID, Vector3fImmutable.getRandomPointInCircle(pc.getLoc(), 100),
|
||||||
null, zone, null, null, "", 1);
|
null, true, zone, null, 0, "", 1);
|
||||||
if (mob != null) {
|
if (mob != null) {
|
||||||
mob.updateDatabase();
|
mob.updateDatabase();
|
||||||
this.setResult(String.valueOf(mob.getDBID()));
|
this.setResult(String.valueOf(mob.getDBID()));
|
||||||
@@ -84,7 +84,7 @@ public class AddMobCmd extends AbstractDevCmd {
|
|||||||
|
|
||||||
|
|
||||||
Mob mob = Mob.createMob(loadID, pc.getLoc(),
|
Mob mob = Mob.createMob(loadID, pc.getLoc(),
|
||||||
null, zone, null, null, "", 1);
|
null, true, zone, null, 0, "", 1);
|
||||||
if (mob != null) {
|
if (mob != null) {
|
||||||
mob.updateDatabase();
|
mob.updateDatabase();
|
||||||
ChatManager.chatSayInfo(pc,
|
ChatManager.chatSayInfo(pc,
|
||||||
|
|||||||
@@ -32,7 +32,6 @@ public class AddNPCCmd extends AbstractDevCmd {
|
|||||||
int contractID;
|
int contractID;
|
||||||
String name = "";
|
String name = "";
|
||||||
int level = 0;
|
int level = 0;
|
||||||
|
|
||||||
if (words.length < 2) {
|
if (words.length < 2) {
|
||||||
this.sendUsage(pc);
|
this.sendUsage(pc);
|
||||||
return;
|
return;
|
||||||
@@ -40,33 +39,26 @@ public class AddNPCCmd extends AbstractDevCmd {
|
|||||||
try {
|
try {
|
||||||
contractID = Integer.parseInt(words[0]);
|
contractID = Integer.parseInt(words[0]);
|
||||||
level = Integer.parseInt(words[1]);
|
level = Integer.parseInt(words[1]);
|
||||||
|
|
||||||
for (int i = 2; i < words.length; i++) {
|
for (int i = 2; i < words.length; i++) {
|
||||||
name += words[i];
|
name += words[i];
|
||||||
if (i + 1 < words.length)
|
if (i + 1 < words.length)
|
||||||
name += "";
|
name += "";
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (NumberFormatException e) {
|
} catch (NumberFormatException e) {
|
||||||
throwbackError(pc,
|
throwbackError(pc,
|
||||||
"Failed to parse supplied contractID or level to an Integer.");
|
"Failed to parse supplied contractID or level to an Integer.");
|
||||||
return; // NaN
|
return; // NaN
|
||||||
}
|
}
|
||||||
|
|
||||||
Contract contract = DbManager.ContractQueries.GET_CONTRACT(contractID);
|
Contract contract = DbManager.ContractQueries.GET_CONTRACT(contractID);
|
||||||
|
|
||||||
if (contract == null || level < 1 || level > 75) {
|
if (contract == null || level < 1 || level > 75) {
|
||||||
throwbackError(pc,
|
throwbackError(pc,
|
||||||
"Invalid addNPC Command. Need contract ID, and level");
|
"Invalid addNPC Command. Need contract ID, and level");
|
||||||
return; // NaN
|
return; // NaN
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pick a random name
|
// Pick a random name
|
||||||
if (name.isEmpty())
|
if (name.isEmpty())
|
||||||
name = NPCManager.getPirateName(contract.getMobbaseID());
|
name = NPCManager.getPirateName(contract.getMobbaseID());
|
||||||
|
|
||||||
Zone zone = ZoneManager.findSmallestZone(pc.getLoc());
|
Zone zone = ZoneManager.findSmallestZone(pc.getLoc());
|
||||||
|
|
||||||
if (zone == null) {
|
if (zone == null) {
|
||||||
throwbackError(pc, "Failed to find zone to place npc in.");
|
throwbackError(pc, "Failed to find zone to place npc in.");
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ package engine.devcmd.cmds;
|
|||||||
|
|
||||||
import engine.devcmd.AbstractDevCmd;
|
import engine.devcmd.AbstractDevCmd;
|
||||||
import engine.objects.*;
|
import engine.objects.*;
|
||||||
import engine.powers.EffectsBase;
|
|
||||||
|
|
||||||
public class EnchantCmd extends AbstractDevCmd {
|
public class EnchantCmd extends AbstractDevCmd {
|
||||||
|
|
||||||
@@ -56,9 +55,21 @@ public class EnchantCmd extends AbstractDevCmd {
|
|||||||
this.setResult(String.valueOf(item.getObjectUUID()));
|
this.setResult(String.valueOf(item.getObjectUUID()));
|
||||||
} else {
|
} else {
|
||||||
int cnt = words.length;
|
int cnt = words.length;
|
||||||
String enchant = words[1];
|
for (int i = 1; i < cnt; i++) {
|
||||||
enchant = EffectsBase.getItemEffectsByName(enchant.toLowerCase());
|
String enchant = words[i];
|
||||||
item.addPermanentEnchantmentForDev(enchant, 0);
|
boolean valid = true;
|
||||||
|
for (Effect eff : item.getEffects().values()) {
|
||||||
|
if (eff.getEffectsBase().getIDString().equals(enchant)) {
|
||||||
|
throwbackError(pc, "This item already has that enchantment");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (valid) {
|
||||||
|
item.addPermanentEnchantmentForDev(enchant, rank);
|
||||||
|
this.setResult(String.valueOf(item.getObjectUUID()));
|
||||||
|
} else
|
||||||
|
throwbackError(pc, "Invalid Enchantment. Enchantment must consist of SUF-001 to SUF-328 or PRE-001 to PRE-334. Sent " + enchant + '.');
|
||||||
|
}
|
||||||
cim.updateInventory();
|
cim.updateInventory();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ public class FlashMsgCmd extends AbstractDevCmd {
|
|||||||
this.sendUsage(pcSender);
|
this.sendUsage(pcSender);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ChatManager.chatSystemFlash(String.join(" ", args));
|
ChatManager.chatSystemFlash(args[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -9,64 +9,55 @@
|
|||||||
|
|
||||||
package engine.devcmd.cmds;
|
package engine.devcmd.cmds;
|
||||||
|
|
||||||
import engine.Enum.GameObjectType;
|
import engine.Enum.ItemContainerType;
|
||||||
import engine.InterestManagement.WorldGrid;
|
import engine.Enum.ItemType;
|
||||||
|
import engine.Enum.OwnerType;
|
||||||
import engine.devcmd.AbstractDevCmd;
|
import engine.devcmd.AbstractDevCmd;
|
||||||
import engine.gameManager.*;
|
import engine.gameManager.ChatManager;
|
||||||
|
import engine.gameManager.DbManager;
|
||||||
import engine.objects.*;
|
import engine.objects.*;
|
||||||
import org.pmw.tinylog.Logger;
|
import engine.powers.EffectsBase;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Eighty
|
* @author Eighty
|
||||||
*/
|
*/
|
||||||
public class setProfit extends AbstractDevCmd {
|
public class GimmeCmd extends AbstractDevCmd {
|
||||||
|
|
||||||
public setProfit() {
|
public GimmeCmd() {
|
||||||
super("setprofit");
|
super("gimme");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void _doCmd(PlayerCharacter pc, String[] words,
|
protected void _doCmd(PlayerCharacter pc, String[] words,
|
||||||
AbstractGameObject target) {
|
AbstractGameObject target) {
|
||||||
|
int amt = 0;
|
||||||
|
int currentGold = pc.getCharItemManager().getGoldInventory().getNumOfItems();
|
||||||
|
amt = 10000000 - currentGold;
|
||||||
|
if (!pc.getCharItemManager().addGoldToInventory(amt, true)) {
|
||||||
|
throwbackError(pc, "Failed to add gold to inventory");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (words.length < 2) {
|
ChatManager.chatSayInfo(pc, amt + " gold added to inventory");
|
||||||
this.sendUsage(pc);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
float updateValue;
|
|
||||||
try {
|
|
||||||
updateValue = Float.parseFloat(words[1]);
|
|
||||||
|
|
||||||
} catch (NumberFormatException e) {
|
if(pc.level < 75) {
|
||||||
throwbackError(pc,
|
pc.setLevel((short) 75);
|
||||||
"Failed to parse supplied contractID or level to an Integer.");
|
ChatManager.chatSayInfo(pc, "Level set to 75");
|
||||||
return; // NaN
|
|
||||||
}
|
}
|
||||||
if(target.getObjectType().equals(GameObjectType.NPC) == false){
|
pc.getCharItemManager().updateInventory();
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
NPC npc = (NPC)target;
|
|
||||||
if(words[0].toLowerCase().equals("buy")){
|
|
||||||
npc.buyPercent = updateValue;
|
|
||||||
npc.updateDatabase();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if(words[0].toLowerCase().equals("sell")){
|
|
||||||
npc.sellPercent = updateValue;
|
|
||||||
npc.updateDatabase();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected String _getHelpString() {
|
protected String _getHelpString() {
|
||||||
return "Sets profit margin of targeted NPC";
|
return "Round up current gold in inventory to 10,000,000";
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected String _getUsageString() {
|
protected String _getUsageString() {
|
||||||
return "' /setprofit buy/sell VALUE(1.0)'";
|
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.Enum.TargetColor;
|
||||||
import engine.devcmd.AbstractDevCmd;
|
import engine.devcmd.AbstractDevCmd;
|
||||||
import engine.gameManager.BuildingManager;
|
import engine.gameManager.BuildingManager;
|
||||||
|
import engine.gameManager.PowersManager;
|
||||||
import engine.gameManager.SessionManager;
|
import engine.gameManager.SessionManager;
|
||||||
import engine.math.Vector3fImmutable;
|
import engine.math.Vector3fImmutable;
|
||||||
import engine.objects.*;
|
import engine.objects.*;
|
||||||
|
import engine.powers.EffectsBase;
|
||||||
|
import engine.powers.PowersBase;
|
||||||
|
import engine.server.MBServerStatics;
|
||||||
import engine.util.StringUtils;
|
import engine.util.StringUtils;
|
||||||
|
|
||||||
import java.text.DecimalFormat;
|
import java.text.DecimalFormat;
|
||||||
@@ -280,7 +284,7 @@ public class InfoCmd extends AbstractDevCmd {
|
|||||||
output += newline;
|
output += newline;
|
||||||
output += "Inventory Weight:" + (targetPC.getCharItemManager().getInventoryWeight() + targetPC.getCharItemManager().getEquipWeight());
|
output += "Inventory Weight:" + (targetPC.getCharItemManager().getInventoryWeight() + targetPC.getCharItemManager().getEquipWeight());
|
||||||
output += newline;
|
output += newline;
|
||||||
output += "Max Inventory Weight:" + targetPC.getInventoryCapacity();
|
output += "Max Inventory Weight:" + ((int) targetPC.statStrBase * 3);
|
||||||
output += newline;
|
output += newline;
|
||||||
output += "ALTITUDE :" + targetPC.getAltitude();
|
output += "ALTITUDE :" + targetPC.getAltitude();
|
||||||
output += newline;
|
output += newline;
|
||||||
@@ -336,9 +340,10 @@ public class InfoCmd extends AbstractDevCmd {
|
|||||||
|
|
||||||
output += "Swimming : " + targetPC.isSwimming();
|
output += "Swimming : " + targetPC.isSwimming();
|
||||||
output += newline;
|
output += newline;
|
||||||
output += "isMoving : " + targetPC.isMoving() + newline;
|
output += "isMoving : " + targetPC.isMoving();
|
||||||
|
output += newline;
|
||||||
output += "Zerg Multiplier : " + targetPC.ZergMultiplier+ newline;
|
output += "Zerg Multiplier : " + targetPC.ZergMultiplier+ newline;
|
||||||
output += "isBoxed: " + targetPC.isBoxed + newline;
|
output += "Hidden : " + targetPC.getHidden();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case NPC:
|
case NPC:
|
||||||
@@ -441,9 +446,7 @@ public class InfoCmd extends AbstractDevCmd {
|
|||||||
output += "isSummonedPet: true";
|
output += "isSummonedPet: true";
|
||||||
else
|
else
|
||||||
output += "isSummonedPet: false";
|
output += "isSummonedPet: false";
|
||||||
|
PlayerCharacter owner = targetMob.getOwner();
|
||||||
|
|
||||||
PlayerCharacter owner = (PlayerCharacter) targetMob.guardCaptain;
|
|
||||||
if (owner != null)
|
if (owner != null)
|
||||||
output += " owner: " + owner.getObjectUUID();
|
output += " owner: " + owner.getObjectUUID();
|
||||||
output += newline;
|
output += newline;
|
||||||
@@ -495,13 +498,16 @@ public class InfoCmd extends AbstractDevCmd {
|
|||||||
output += newline;
|
output += newline;
|
||||||
output += "No building found." + newline;
|
output += "No building found." + newline;
|
||||||
}
|
}
|
||||||
int max = (int)(4.882 * targetMob.level + 121.0);
|
|
||||||
if(max > 321){
|
output += "Damage: " + targetMob.mobBase.getDamageMin() + " - " + targetMob.mobBase.getDamageMax() + newline;
|
||||||
max = 321;
|
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;
|
break;
|
||||||
case Item: //intentional passthrough
|
case Item: //intentional passthrough
|
||||||
case MobLoot:
|
case MobLoot:
|
||||||
@@ -526,12 +532,19 @@ public class InfoCmd extends AbstractDevCmd {
|
|||||||
ConcurrentHashMap<String, Effect> effects = item.getEffects();
|
ConcurrentHashMap<String, Effect> effects = item.getEffects();
|
||||||
for (String name : effects.keySet()) {
|
for (String name : effects.keySet()) {
|
||||||
Effect eff = effects.get(name);
|
Effect eff = effects.get(name);
|
||||||
output += eff.getEffectsBase().getIDString() + " Static:" + eff.isStatic();
|
output += eff.getEffectsBase().getIDString();
|
||||||
output += newline;
|
output += newline;
|
||||||
// output += eff.getEffectToken() + (eff.bakedInStat() ? " (baked in)" : "") + newline;
|
// output += eff.getEffectToken() + (eff.bakedInStat() ? " (baked in)" : "") + newline;
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
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);
|
throwbackInfo(pc, output);
|
||||||
|
|||||||
@@ -65,10 +65,6 @@ public class MakeItemCmd extends AbstractDevCmd {
|
|||||||
|
|
||||||
if (item == null || !worked) {
|
if (item == null || !worked) {
|
||||||
throwbackError(pc, "DB error 2: Unable to create item.");
|
throwbackError(pc, "DB error 2: Unable to create item.");
|
||||||
if(item == null)
|
|
||||||
throwbackError(pc, "Item Null");
|
|
||||||
else
|
|
||||||
throwbackError(pc, "Worked = false");
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -226,10 +222,6 @@ public class MakeItemCmd extends AbstractDevCmd {
|
|||||||
|
|
||||||
if (item == null || !worked) {
|
if (item == null || !worked) {
|
||||||
throwbackError(pc, "DB error 2: Unable to create item.");
|
throwbackError(pc, "DB error 2: Unable to create item.");
|
||||||
if(item == null)
|
|
||||||
throwbackError(pc, "Item Null");
|
|
||||||
else
|
|
||||||
throwbackError(pc, "Worked = false");
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,6 +16,8 @@ import engine.objects.AbstractGameObject;
|
|||||||
import engine.objects.Building;
|
import engine.objects.Building;
|
||||||
import engine.objects.Mine;
|
import engine.objects.Mine;
|
||||||
import engine.objects.PlayerCharacter;
|
import engine.objects.PlayerCharacter;
|
||||||
|
import engine.workthreads.HalfHourlyJobThread;
|
||||||
|
import engine.workthreads.HourlyJobThread;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
@@ -40,10 +42,10 @@ public class MineActiveCmd extends AbstractDevCmd {
|
|||||||
String trigger = args[0];
|
String trigger = args[0];
|
||||||
switch (trigger) {
|
switch (trigger) {
|
||||||
case "true":
|
case "true":
|
||||||
Mine.mineWindowOpen(mine);
|
HalfHourlyJobThread.mineWindowOpen(mine);
|
||||||
break;
|
break;
|
||||||
case "false":
|
case "false":
|
||||||
Mine.mineWindowClose(mine);
|
HalfHourlyJobThread.mineWindowClose(mine);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
this.sendUsage(pcSender);
|
this.sendUsage(pcSender);
|
||||||
|
|||||||
@@ -39,9 +39,6 @@ public class PrintResistsCmd extends AbstractDevCmd {
|
|||||||
if (mb != null)
|
if (mb != null)
|
||||||
name = mb.getFirstName();
|
name = mb.getFirstName();
|
||||||
type = "Mob";
|
type = "Mob";
|
||||||
throwbackInfo(pc, "Server resists for " + type + ' ' + name);
|
|
||||||
tar.getResists().printResistsToClient(pc);
|
|
||||||
return;
|
|
||||||
} else if (tar instanceof NPC) {
|
} else if (tar instanceof NPC) {
|
||||||
NPC npc = (NPC) tar;
|
NPC npc = (NPC) tar;
|
||||||
Contract contract = npc.getContract();
|
Contract contract = npc.getContract();
|
||||||
|
|||||||
@@ -56,30 +56,37 @@ public class PrintStatsCmd extends AbstractDevCmd {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void printStatsPlayer(PlayerCharacter pc, PlayerCharacter tar) {
|
public void printStatsPlayer(PlayerCharacter pc, PlayerCharacter tar) {
|
||||||
tar.calculateMaxHealthManaStamina();
|
|
||||||
String newline = "\r\n ";
|
String newline = "\r\n ";
|
||||||
String out = "Server stats for Player " + tar.getFirstName() + newline;
|
|
||||||
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;
|
|
||||||
out += "Health Regen: " + tar.getRegenModifier(Enum.ModType.HealthRecoverRate) + newline;
|
|
||||||
out += "Stamina Regen: " + tar.getRegenModifier(Enum.ModType.StaminaRecoverRate) + newline;
|
|
||||||
out += "Mana Regen: " + tar.getRegenModifier(Enum.ModType.ManaRecoverRate) + newline;
|
|
||||||
out += "Zerg Multiplier: " + tar.ZergMultiplier + newline;
|
|
||||||
|
|
||||||
throwbackInfo(pc, out);
|
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;
|
||||||
|
throwbackInfo(pc, newOut);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void printStatsMob(PlayerCharacter pc, Mob tar) {
|
public void printStatsMob(PlayerCharacter pc, Mob tar) {
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ public class PurgeObjectsCmd extends AbstractDevCmd {
|
|||||||
|
|
||||||
|
|
||||||
if (npc != null) {
|
if (npc != null) {
|
||||||
for (Mob mob : npc.siegeMinionMap.keySet()) {
|
for (Mob mob : npc.getSiegeMinionMap().keySet()) {
|
||||||
WorldGrid.RemoveWorldObject(mob);
|
WorldGrid.RemoveWorldObject(mob);
|
||||||
WorldGrid.removeObject(mob, pc);
|
WorldGrid.removeObject(mob, pc);
|
||||||
//Mob.getRespawnMap().remove(mob);
|
//Mob.getRespawnMap().remove(mob);
|
||||||
@@ -151,7 +151,7 @@ public class PurgeObjectsCmd extends AbstractDevCmd {
|
|||||||
|
|
||||||
|
|
||||||
if (npc != null) {
|
if (npc != null) {
|
||||||
for (Mob mob : npc.siegeMinionMap.keySet()) {
|
for (Mob mob : npc.getSiegeMinionMap().keySet()) {
|
||||||
WorldGrid.RemoveWorldObject(mob);
|
WorldGrid.RemoveWorldObject(mob);
|
||||||
WorldGrid.removeObject(mob, pc);
|
WorldGrid.removeObject(mob, pc);
|
||||||
//Mob.getRespawnMap().remove(mob);
|
//Mob.getRespawnMap().remove(mob);
|
||||||
|
|||||||
@@ -154,7 +154,7 @@ public class RemoveObjectCmd extends AbstractDevCmd {
|
|||||||
mobA = (Mob) ac;
|
mobA = (Mob) ac;
|
||||||
|
|
||||||
if (npc != null) {
|
if (npc != null) {
|
||||||
for (Mob mob : npc.siegeMinionMap.keySet()) {
|
for (Mob mob : npc.getSiegeMinionMap().keySet()) {
|
||||||
WorldGrid.RemoveWorldObject(mob);
|
WorldGrid.RemoveWorldObject(mob);
|
||||||
WorldGrid.removeObject(mob, pc);
|
WorldGrid.removeObject(mob, pc);
|
||||||
//Mob.getRespawnMap().remove(mob);
|
//Mob.getRespawnMap().remove(mob);
|
||||||
@@ -209,7 +209,7 @@ public class RemoveObjectCmd extends AbstractDevCmd {
|
|||||||
if (npc.building != null)
|
if (npc.building != null)
|
||||||
npc.building.getHirelings().remove(npc);
|
npc.building.getHirelings().remove(npc);
|
||||||
|
|
||||||
for (Mob mob : npc.siegeMinionMap.keySet()) {
|
for (Mob mob : npc.getSiegeMinionMap().keySet()) {
|
||||||
WorldGrid.RemoveWorldObject(mob);
|
WorldGrid.RemoveWorldObject(mob);
|
||||||
WorldGrid.removeObject(mob, pc);
|
WorldGrid.removeObject(mob, pc);
|
||||||
if (mob.getParentZone() != null)
|
if (mob.getParentZone() != null)
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ public class SetAdminRuneCmd extends AbstractDevCmd {
|
|||||||
if (worked) {
|
if (worked) {
|
||||||
ChatManager.chatSayInfo(pcSender,
|
ChatManager.chatSayInfo(pcSender,
|
||||||
"rune of ID " + runeID + " removed");
|
"rune of ID " + runeID + " removed");
|
||||||
InterestManager.reloadCharacter(pcSender,false);
|
InterestManager.reloadCharacter(pcSender);
|
||||||
} else
|
} else
|
||||||
throwbackError(pcSender, "Failed to remove the rune of type "
|
throwbackError(pcSender, "Failed to remove the rune of type "
|
||||||
+ runeID);
|
+ runeID);
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ public class SetBaseClassCmd extends AbstractDevCmd {
|
|||||||
this.setTarget(pc); //for logging
|
this.setTarget(pc); //for logging
|
||||||
ChatManager.chatSayInfo(pc,
|
ChatManager.chatSayInfo(pc,
|
||||||
"BaseClass changed to " + classID);
|
"BaseClass changed to " + classID);
|
||||||
InterestManager.reloadCharacter(pc,false);
|
InterestManager.reloadCharacter(pc);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -14,7 +14,6 @@ import engine.devcmd.AbstractDevCmd;
|
|||||||
import engine.gameManager.ChatManager;
|
import engine.gameManager.ChatManager;
|
||||||
import engine.objects.AbstractGameObject;
|
import engine.objects.AbstractGameObject;
|
||||||
import engine.objects.PlayerCharacter;
|
import engine.objects.PlayerCharacter;
|
||||||
import engine.server.MBServerStatics;
|
|
||||||
|
|
||||||
public class SetLevelCmd extends AbstractDevCmd {
|
public class SetLevelCmd extends AbstractDevCmd {
|
||||||
|
|
||||||
@@ -47,7 +46,7 @@ public class SetLevelCmd extends AbstractDevCmd {
|
|||||||
this.sendUsage(pc);
|
this.sendUsage(pc);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (level < 1 || level > MBServerStatics.LEVELCAP) {
|
if (level < 1 || level > 80) {
|
||||||
this.sendHelp(pc);
|
this.sendHelp(pc);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -58,12 +57,12 @@ public class SetLevelCmd extends AbstractDevCmd {
|
|||||||
tar.setLevel((short) level);
|
tar.setLevel((short) level);
|
||||||
this.setTarget(tar); //for logging
|
this.setTarget(tar); //for logging
|
||||||
ChatManager.chatSayInfo(pc, tar.getFirstName() + " level changed to " + level);
|
ChatManager.chatSayInfo(pc, tar.getFirstName() + " level changed to " + level);
|
||||||
InterestManager.reloadCharacter(tar,false);
|
InterestManager.reloadCharacter(tar);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected String _getHelpString() {
|
protected String _getHelpString() {
|
||||||
return "Sets your character's level to 'amount'. 'amount' must be between 1-" + MBServerStatics.LEVELCAP;
|
return "Sets your character's level to 'amount'. 'amount' must be between 1-80";
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ public class SetPromotionClassCmd extends AbstractDevCmd {
|
|||||||
pc.setPromotionClass(classID);
|
pc.setPromotionClass(classID);
|
||||||
ChatManager.chatSayInfo(pc,
|
ChatManager.chatSayInfo(pc,
|
||||||
"PromotionClass changed to " + classID);
|
"PromotionClass changed to " + classID);
|
||||||
InterestManager.reloadCharacter(pc,false);
|
InterestManager.reloadCharacter(pc);
|
||||||
this.setTarget(pc); //for logging
|
this.setTarget(pc); //for logging
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ public class SetRuneCmd extends AbstractDevCmd {
|
|||||||
if (worked) {
|
if (worked) {
|
||||||
ChatManager.chatSayInfo(pcSender,
|
ChatManager.chatSayInfo(pcSender,
|
||||||
"rune of ID " + runeID + " removed");
|
"rune of ID " + runeID + " removed");
|
||||||
InterestManager.reloadCharacter(pcSender,false);
|
InterestManager.reloadCharacter(pcSender);
|
||||||
} else
|
} else
|
||||||
throwbackError(pcSender, "Failed to remove the rune of type "
|
throwbackError(pcSender, "Failed to remove the rune of type "
|
||||||
+ runeID);
|
+ runeID);
|
||||||
|
|||||||
@@ -1,17 +1,17 @@
|
|||||||
package engine.devcmd.cmds;
|
package engine.devcmd.cmds;
|
||||||
|
|
||||||
import engine.Enum;
|
|
||||||
import engine.devcmd.AbstractDevCmd;
|
import engine.devcmd.AbstractDevCmd;
|
||||||
import engine.gameManager.LootManager;
|
import engine.gameManager.LootManager;
|
||||||
import engine.gameManager.ZoneManager;
|
import engine.gameManager.ZoneManager;
|
||||||
import engine.loot.BootySetEntry;
|
import engine.loot.BootySetEntry;
|
||||||
import engine.objects.*;
|
import engine.objects.*;
|
||||||
import org.pmw.tinylog.Logger;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.concurrent.ThreadLocalRandom;
|
import java.util.concurrent.ThreadLocalRandom;
|
||||||
|
|
||||||
public class SimulateBootyCmd extends AbstractDevCmd {
|
public class SimulateBootyCmd extends AbstractDevCmd {
|
||||||
|
|
||||||
|
public int simCount = 250;
|
||||||
public SimulateBootyCmd() {
|
public SimulateBootyCmd() {
|
||||||
super("bootysim");
|
super("bootysim");
|
||||||
}
|
}
|
||||||
@@ -27,10 +27,16 @@ public class SimulateBootyCmd extends AbstractDevCmd {
|
|||||||
|
|
||||||
String output;
|
String output;
|
||||||
|
|
||||||
output = "Booty Simulation:" + newline;
|
try
|
||||||
if(target.getObjectType().equals(Enum.GameObjectType.Mob) == false){
|
{
|
||||||
return;//ugh what?
|
simCount = Integer.parseInt(words[0]);
|
||||||
|
}catch(Exception e)
|
||||||
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
output = "Booty Simulation: Rolls:" + simCount + newline;
|
||||||
|
|
||||||
Mob mob = (Mob) target;
|
Mob mob = (Mob) target;
|
||||||
output += "Name: " + mob.getName() + newline;
|
output += "Name: " + mob.getName() + newline;
|
||||||
output += "Special Loot:" + newline;
|
output += "Special Loot:" + newline;
|
||||||
@@ -48,6 +54,7 @@ public class SimulateBootyCmd extends AbstractDevCmd {
|
|||||||
ArrayList<Item> Resources = new ArrayList<Item>();
|
ArrayList<Item> Resources = new ArrayList<Item>();
|
||||||
ArrayList<Item> Runes = new ArrayList<Item>();
|
ArrayList<Item> Runes = new ArrayList<Item>();
|
||||||
ArrayList<Item> Contracts = new ArrayList<Item>();
|
ArrayList<Item> Contracts = new ArrayList<Item>();
|
||||||
|
ArrayList<Item> GuardContracts = new ArrayList<Item>();
|
||||||
ArrayList<Item> Offerings = new ArrayList<Item>();
|
ArrayList<Item> Offerings = new ArrayList<Item>();
|
||||||
ArrayList<Item> OtherDrops = new ArrayList<Item>();
|
ArrayList<Item> OtherDrops = new ArrayList<Item>();
|
||||||
ArrayList<Item> EquipmentDrops = new ArrayList<Item>();
|
ArrayList<Item> EquipmentDrops = new ArrayList<Item>();
|
||||||
@@ -55,13 +62,16 @@ public class SimulateBootyCmd extends AbstractDevCmd {
|
|||||||
int failures = 0;
|
int failures = 0;
|
||||||
int goldAmount = 0;
|
int goldAmount = 0;
|
||||||
|
|
||||||
for (int i = 0; i < 10000; ++i) {
|
for (int i = 0; i < simCount; ++i) {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
mob.loadInventory();
|
mob.loadInventory();
|
||||||
for (Item lootItem : mob.getCharItemManager().getInventory()) {
|
for (Item lootItem : mob.getCharItemManager().getInventory()) {
|
||||||
switch (lootItem.getItemBase().getType()) {
|
switch (lootItem.getItemBase().getType()) {
|
||||||
case CONTRACT: //CONTRACT
|
case CONTRACT: //CONTRACT
|
||||||
|
if(lootItem.getName().contains("Captain"))
|
||||||
|
GuardContracts.add(lootItem);
|
||||||
|
else
|
||||||
Contracts.add(lootItem);
|
Contracts.add(lootItem);
|
||||||
break;
|
break;
|
||||||
case OFFERING: //OFFERING
|
case OFFERING: //OFFERING
|
||||||
@@ -83,19 +93,12 @@ public class SimulateBootyCmd extends AbstractDevCmd {
|
|||||||
goldAmount += lootItem.getNumOfItems();
|
goldAmount += lootItem.getNumOfItems();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
if(Warehouse.maxResources.containsKey(lootItem.getItemBaseID())){
|
|
||||||
Resources.add(lootItem);
|
|
||||||
} else {
|
|
||||||
OtherDrops.add(lootItem);
|
OtherDrops.add(lootItem);
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
failures++;
|
failures++;
|
||||||
//throwbackError(playerCharacter,ex.getLocalizedMessage());
|
|
||||||
//Logger.error(ex.fillInStackTrace());
|
|
||||||
//return;
|
|
||||||
}
|
}
|
||||||
if (mob.getEquip() != null) {
|
if (mob.getEquip() != null) {
|
||||||
for (MobEquipment me : mob.getEquip().values()) {
|
for (MobEquipment me : mob.getEquip().values()) {
|
||||||
@@ -141,18 +144,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 += "GLASS DROPS: " + GlassItems.size() + newline;
|
||||||
for(Item glass : GlassItems){
|
|
||||||
output += " " + glass.getName() + newline;
|
|
||||||
}
|
|
||||||
output += "RUNE DROPS: " + Runes.size() + newline;
|
output += "RUNE DROPS: " + Runes.size() + newline;
|
||||||
for(Item rune : Runes){
|
|
||||||
output += " " + rune.getName() + newline;
|
|
||||||
}
|
|
||||||
output += "CONTRACTS DROPS: " + Contracts.size() + newline;
|
output += "CONTRACTS DROPS: " + Contracts.size() + newline;
|
||||||
for(Item contract : Contracts){
|
output += "GUARD CONTRACTS DROPS: " + GuardContracts.size() + newline;
|
||||||
output += " " + contract.getName() + newline;
|
|
||||||
}
|
|
||||||
output += "RESOURCE DROPS: " + Resources.size() + newline;
|
output += "RESOURCE DROPS: " + Resources.size() + newline;
|
||||||
output += "OFFERINGS DROPPED: " + Offerings.size() + newline;
|
output += "OFFERINGS DROPPED: " + Offerings.size() + newline;
|
||||||
output += "ENCHANTED ITEMS DROPPED: " + OtherDrops.size() + newline;
|
output += "ENCHANTED ITEMS DROPPED: " + OtherDrops.size() + newline;
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ public class SlotTestCmd extends AbstractDevCmd {
|
|||||||
outString += "Hirelings List:";
|
outString += "Hirelings List:";
|
||||||
|
|
||||||
for (AbstractCharacter hireling : building.getHirelings().keySet())
|
for (AbstractCharacter hireling : building.getHirelings().keySet())
|
||||||
outString += "\r\n" + hireling.getName() + "(" + hireling.getObjectUUID() + ") slot : " + building.getHirelings().get(hireling);
|
outString += "\r\n" + hireling.getName() + " slot : " + building.getHirelings().get(hireling);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -110,7 +110,7 @@ public class SplatMobCmd extends AbstractDevCmd {
|
|||||||
|
|
||||||
mobile = Mob.createMob(_mobileUUID,
|
mobile = Mob.createMob(_mobileUUID,
|
||||||
Vector3fImmutable.getRandomPointInCircle(_currentLocation, _targetRange),
|
Vector3fImmutable.getRandomPointInCircle(_currentLocation, _targetRange),
|
||||||
null, serverZone, null, null, "", 1);
|
null, true, serverZone, null, 0, "", 1);
|
||||||
|
|
||||||
if (mobile != null) {
|
if (mobile != null) {
|
||||||
mobile.updateDatabase();
|
mobile.updateDatabase();
|
||||||
|
|||||||
@@ -11,10 +11,8 @@ package engine.devcmd.cmds;
|
|||||||
|
|
||||||
import engine.Enum.GameObjectType;
|
import engine.Enum.GameObjectType;
|
||||||
import engine.devcmd.AbstractDevCmd;
|
import engine.devcmd.AbstractDevCmd;
|
||||||
import engine.gameManager.PowersManager;
|
|
||||||
import engine.objects.AbstractGameObject;
|
import engine.objects.AbstractGameObject;
|
||||||
import engine.objects.Mob;
|
import engine.objects.Mob;
|
||||||
import engine.objects.MobBase;
|
|
||||||
import engine.objects.PlayerCharacter;
|
import engine.objects.PlayerCharacter;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@@ -58,18 +56,18 @@ public class aiInfoCmd extends AbstractDevCmd {
|
|||||||
Mob mob = (Mob) target;
|
Mob mob = (Mob) target;
|
||||||
output = "Mob AI Information:" + newline;
|
output = "Mob AI Information:" + newline;
|
||||||
output += mob.getName() + newline;
|
output += mob.getName() + newline;
|
||||||
if (mob.behaviourType != null) {
|
if (mob.BehaviourType != null) {
|
||||||
output += "BehaviourType: " + mob.behaviourType.toString() + newline;
|
output += "BehaviourType: " + mob.BehaviourType.toString() + newline;
|
||||||
if (mob.behaviourType.BehaviourHelperType != null) {
|
if (mob.BehaviourType.BehaviourHelperType != null) {
|
||||||
output += "Behaviour Helper Type: " + mob.behaviourType.BehaviourHelperType.toString() + newline;
|
output += "Behaviour Helper Type: " + mob.BehaviourType.BehaviourHelperType.toString() + newline;
|
||||||
} else {
|
} else {
|
||||||
output += "Behaviour Helper Type: NULL" + newline;
|
output += "Behaviour Helper Type: NULL" + newline;
|
||||||
}
|
}
|
||||||
output += "Wimpy: " + mob.behaviourType.isWimpy + newline;
|
output += "Wimpy: " + mob.BehaviourType.isWimpy + newline;
|
||||||
output += "Agressive: " + mob.behaviourType.isAgressive + newline;
|
output += "Agressive: " + mob.BehaviourType.isAgressive + newline;
|
||||||
output += "Can Roam: " + mob.behaviourType.canRoam + newline;
|
output += "Can Roam: " + mob.BehaviourType.canRoam + newline;
|
||||||
output += "Calls For Help: " + mob.behaviourType.callsForHelp + newline;
|
output += "Calls For Help: " + mob.BehaviourType.callsForHelp + newline;
|
||||||
output += "Responds To Call For Help: " + mob.behaviourType.respondsToCallForHelp + newline;
|
output += "Responds To Call For Help: " + mob.BehaviourType.respondsToCallForHelp + newline;
|
||||||
} else {
|
} else {
|
||||||
output += "BehaviourType: NULL" + newline;
|
output += "BehaviourType: NULL" + newline;
|
||||||
}
|
}
|
||||||
@@ -78,27 +76,18 @@ public class aiInfoCmd extends AbstractDevCmd {
|
|||||||
if (mob.playerAgroMap.size() > 0) {
|
if (mob.playerAgroMap.size() > 0) {
|
||||||
output += "Players Loaded:" + newline;
|
output += "Players Loaded:" + newline;
|
||||||
}
|
}
|
||||||
for (Map.Entry<Integer, Float> entry : mob.playerAgroMap.entrySet()) {
|
for (Map.Entry<Integer, Boolean> entry : mob.playerAgroMap.entrySet()) {
|
||||||
output += "Player ID: " + entry.getKey() + " Hate Value: " + entry.getValue() + newline;
|
output += "Player ID: " + entry.getKey() + " Hate Value: " + (PlayerCharacter.getPlayerCharacter(entry.getKey())).getHateValue() + newline;
|
||||||
}
|
}
|
||||||
if (mob.getCombatTarget() != null)
|
if (mob.getCombatTarget() != null)
|
||||||
output += "Current Target: " + mob.getCombatTarget().getName() + newline;
|
output += "Current Target: " + mob.getCombatTarget().getName() + newline;
|
||||||
else
|
else
|
||||||
output += "Current Target: NULL" + newline;
|
output += "Current Target: NULL" + newline;
|
||||||
|
|
||||||
if (mob.guardedCity != null)
|
|
||||||
output += "Patrolling: " + mob.guardedCity.getCityName() + newline;
|
|
||||||
|
|
||||||
output += "Powers:" + newline;
|
|
||||||
|
|
||||||
for (int token : mob.mobPowers.keySet())
|
for (int token : mob.mobPowers.keySet())
|
||||||
output += PowersManager.getPowerByToken(token).getName() + newline;
|
output += token + newline;
|
||||||
|
|
||||||
output += "Race type: " + MobBase.mobbase_race_types.get(mob.getMobBaseID());
|
|
||||||
throwbackInfo(playerCharacter, output);
|
throwbackInfo(playerCharacter, output);
|
||||||
|
|
||||||
throwbackInfo(playerCharacter, "Race Types: " + MobBase.mobbase_race_types.size());
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -0,0 +1,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) {
|
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.
|
//Nation Members and Guild members are not hostile.
|
||||||
// if (building.getGuild() != null){
|
// if (building.getGuild() != null){
|
||||||
// if (pc.getGuild() != null)
|
// if (pc.getGuild() != null)
|
||||||
@@ -520,10 +532,32 @@ public enum BuildingManager {
|
|||||||
if (building.getBlueprintUUID() == 0)
|
if (building.getBlueprintUUID() == 0)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (building.getBlueprint().getSlotsForRank(building.getRank()) == building.getHirelings().size()) {
|
if(building.getBlueprint().getBuildingGroup().equals(BuildingGroup.TOL)){
|
||||||
Logger.error("failed at addHireling with contract: " + contract.getContractID());
|
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;
|
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());
|
String pirateName = NPCManager.getPirateName(contract.getMobbaseID());
|
||||||
|
|
||||||
if (item.getChargesRemaining() > 0)
|
if (item.getChargesRemaining() > 0)
|
||||||
@@ -536,7 +570,7 @@ public enum BuildingManager {
|
|||||||
|
|
||||||
if (NPC.ISWallArcher(contract)) {
|
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)
|
if (mob == null)
|
||||||
return false;
|
return false;
|
||||||
@@ -548,7 +582,7 @@ public enum BuildingManager {
|
|||||||
|
|
||||||
if (NPC.ISGuardCaptain(contract.getContractID())) {
|
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)
|
if (mob == null)
|
||||||
return false;
|
return false;
|
||||||
@@ -560,7 +594,7 @@ public enum BuildingManager {
|
|||||||
if (contract.getContractID() == 910) {
|
if (contract.getContractID() == 910) {
|
||||||
|
|
||||||
//guard dog
|
//guard dog
|
||||||
mob = Mob.createMob(contract.getMobbaseID(), Vector3fImmutable.ZERO, contractOwner.getGuild(), zone, building, contract, pirateName, rank);
|
mob = Mob.createMob(contract.getMobbaseID(), Vector3fImmutable.ZERO, contractOwner.getGuild(), true, zone, building, contract.getContractID(), pirateName, rank);
|
||||||
|
|
||||||
if (mob == null)
|
if (mob == null)
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -483,6 +483,14 @@ public enum CombatManager {
|
|||||||
createTimer(abstractCharacter, slot, 20, true); //2 second for no weapon
|
createTimer(abstractCharacter, slot, 20, true); //2 second for no weapon
|
||||||
else {
|
else {
|
||||||
int wepSpeed = (int) (wb.getSpeed());
|
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
|
if (weapon != null && weapon.getBonusPercent(ModType.WeaponSpeed, SourceType.None) != 0f) //add weapon speed bonus
|
||||||
wepSpeed *= (1 + weapon.getBonus(ModType.WeaponSpeed, SourceType.None));
|
wepSpeed *= (1 + weapon.getBonus(ModType.WeaponSpeed, SourceType.None));
|
||||||
@@ -492,7 +500,7 @@ public enum CombatManager {
|
|||||||
|
|
||||||
if (wepSpeed < 10)
|
if (wepSpeed < 10)
|
||||||
wepSpeed = 10; //Old was 10, but it can be reached lower with legit buffs,effects.
|
wepSpeed = 10; //Old was 10, but it can be reached lower with legit buffs,effects.
|
||||||
|
}
|
||||||
createTimer(abstractCharacter, slot, wepSpeed, true);
|
createTimer(abstractCharacter, slot, wepSpeed, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -528,7 +536,7 @@ public enum CombatManager {
|
|||||||
float atr;
|
float atr;
|
||||||
int minDamage, maxDamage;
|
int minDamage, maxDamage;
|
||||||
int errorTrack = 0;
|
int errorTrack = 0;
|
||||||
int subTrack = 0;
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
if (ac == null)
|
if (ac == null)
|
||||||
@@ -536,7 +544,18 @@ public enum CombatManager {
|
|||||||
|
|
||||||
if (target == null)
|
if (target == null)
|
||||||
return;
|
return;
|
||||||
|
if(ac.getObjectType().equals(GameObjectType.PlayerCharacter)){
|
||||||
|
PlayerCharacter pc = (PlayerCharacter) ac;
|
||||||
|
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) {
|
if (mainHand) {
|
||||||
atr = ac.getAtrHandOne();
|
atr = ac.getAtrHandOne();
|
||||||
minDamage = ac.getMinDamageHandOne();
|
minDamage = ac.getMinDamageHandOne();
|
||||||
@@ -546,6 +565,7 @@ public enum CombatManager {
|
|||||||
minDamage = ac.getMinDamageHandTwo();
|
minDamage = ac.getMinDamageHandTwo();
|
||||||
maxDamage = ac.getMaxDamageHandTwo();
|
maxDamage = ac.getMaxDamageHandTwo();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
boolean tarIsRat = false;
|
boolean tarIsRat = false;
|
||||||
|
|
||||||
@@ -638,34 +658,36 @@ public enum CombatManager {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
AbstractCharacter tar = (AbstractCharacter) target;
|
AbstractCharacter tar = (AbstractCharacter) target;
|
||||||
|
if(tar.getObjectType().equals(GameObjectType.PlayerCharacter)){
|
||||||
|
defense = ((PlayerCharacter)tar).combatStats.defense;
|
||||||
|
}else {
|
||||||
defense = tar.getDefenseRating();
|
defense = tar.getDefenseRating();
|
||||||
|
}
|
||||||
handleRetaliate(tar, ac); //Handle target attacking back if in combat and has no other target
|
handleRetaliate(tar, ac); //Handle target attacking back if in combat and has no other target
|
||||||
}
|
}
|
||||||
|
|
||||||
errorTrack = 4;
|
errorTrack = 4;
|
||||||
|
|
||||||
//Get hit chance
|
//Get hit chance
|
||||||
float constant = (atr+defense)*0.315f;
|
|
||||||
float atrChance = atr - constant;
|
//int chance;
|
||||||
float defChance = defense - constant + atrChance;
|
float dif = atr - defense;
|
||||||
float smallChance = atrChance/defChance;
|
|
||||||
int chance = (int)(smallChance * 100);
|
//if (dif > 100)
|
||||||
|
// chance = 94;
|
||||||
|
//else if (dif < -100)
|
||||||
|
// chance = 4;
|
||||||
|
//else
|
||||||
|
// chance = (int) ((0.45 * dif) + 49);
|
||||||
|
|
||||||
errorTrack = 5;
|
errorTrack = 5;
|
||||||
|
|
||||||
if(chance < 5){
|
|
||||||
chance = 5;
|
|
||||||
}
|
|
||||||
if(chance > 95){
|
|
||||||
chance = 95;
|
|
||||||
}
|
|
||||||
|
|
||||||
//calculate hit/miss
|
//calculate hit/miss
|
||||||
|
|
||||||
int roll = ThreadLocalRandom.current().nextInt(1,101);
|
|
||||||
DeferredPowerJob dpj = null;
|
DeferredPowerJob dpj = null;
|
||||||
|
|
||||||
if (roll < chance) {
|
boolean hitLanded = LandHit((int)atr,(int)defense);
|
||||||
|
if (hitLanded) {
|
||||||
|
|
||||||
if (ac.getObjectType().equals(GameObjectType.PlayerCharacter))
|
if (ac.getObjectType().equals(GameObjectType.PlayerCharacter))
|
||||||
updateAttackTimers((PlayerCharacter) ac, target, true);
|
updateAttackTimers((PlayerCharacter) ac, target, true);
|
||||||
@@ -694,7 +716,13 @@ public enum CombatManager {
|
|||||||
|
|
||||||
PlayerBonuses bonus = ac.getBonuses();
|
PlayerBonuses bonus = ac.getBonuses();
|
||||||
float attackRange = getWeaponRange(wb, bonus);
|
float attackRange = getWeaponRange(wb, bonus);
|
||||||
|
if(specialCaseHitRoll(dpj.getPowerToken())) {
|
||||||
|
if(hitLanded) {
|
||||||
dpj.attack(target, attackRange);
|
dpj.attack(target, attackRange);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
dpj.attack(target, attackRange);
|
||||||
|
}
|
||||||
|
|
||||||
if (dpj.getPower() != null && (dpj.getPowerToken() == -1851459567 || dpj.getPowerToken() == -1851489518))
|
if (dpj.getPower() != null && (dpj.getPowerToken() == -1851459567 || dpj.getPowerToken() == -1851489518))
|
||||||
((PlayerCharacter) ac).setWeaponPower(dpj);
|
((PlayerCharacter) ac).setWeaponPower(dpj);
|
||||||
@@ -709,8 +737,14 @@ public enum CombatManager {
|
|||||||
|
|
||||||
if (dpj != null && dpj.getPower() != null && (dpj.getPowerToken() == -1851459567 || dpj.getPowerToken() == -1851489518)) {
|
if (dpj != null && dpj.getPower() != null && (dpj.getPowerToken() == -1851459567 || dpj.getPowerToken() == -1851489518)) {
|
||||||
float attackRange = getWeaponRange(wb, bonuses);
|
float attackRange = getWeaponRange(wb, bonuses);
|
||||||
|
if(specialCaseHitRoll(dpj.getPowerToken())) {
|
||||||
|
if(hitLanded) {
|
||||||
dpj.attack(target, attackRange);
|
dpj.attack(target, attackRange);
|
||||||
}
|
}
|
||||||
|
}else{
|
||||||
|
dpj.attack(target, attackRange);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
errorTrack = 7;
|
errorTrack = 7;
|
||||||
@@ -811,7 +845,11 @@ public enum CombatManager {
|
|||||||
|
|
||||||
float damage;
|
float damage;
|
||||||
|
|
||||||
|
if (wb != null)
|
||||||
damage = calculateDamage(ac, tarAc, minDamage, maxDamage, damageType, resists);
|
damage = calculateDamage(ac, tarAc, minDamage, maxDamage, damageType, resists);
|
||||||
|
else
|
||||||
|
damage = calculateDamage(ac, tarAc, minDamage, maxDamage, damageType, resists);
|
||||||
|
|
||||||
float d = 0f;
|
float d = 0f;
|
||||||
|
|
||||||
errorTrack = 12;
|
errorTrack = 12;
|
||||||
@@ -819,41 +857,27 @@ public enum CombatManager {
|
|||||||
//Subtract Damage from target's health
|
//Subtract Damage from target's health
|
||||||
|
|
||||||
if (tarAc != null) {
|
if (tarAc != null) {
|
||||||
|
|
||||||
if (tarAc.isSit())
|
if (tarAc.isSit())
|
||||||
damage *= 2.5f; //increase damage if sitting
|
damage *= 2.5f; //increase damage if sitting
|
||||||
|
|
||||||
|
|
||||||
subTrack = 1;
|
|
||||||
|
|
||||||
if (tarAc.getObjectType() == GameObjectType.Mob) {
|
if (tarAc.getObjectType() == GameObjectType.Mob) {
|
||||||
Mob mobTarget = (Mob) tarAc;
|
ac.setHateValue(damage * MBServerStatics.PLAYER_COMBAT_HATE_MODIFIER);
|
||||||
if (ac.getObjectType().equals(GameObjectType.PlayerCharacter)) {
|
((Mob) tarAc).handleDirectAggro(ac);
|
||||||
subTrack = 2;
|
|
||||||
if (mobTarget.playerAgroMap.containsKey(ac.getObjectUUID())) {
|
|
||||||
subTrack = 3;
|
|
||||||
float hateValue = damage + mobTarget.playerAgroMap.get(ac.getObjectUUID());
|
|
||||||
mobTarget.playerAgroMap.put(ac.getObjectUUID(), hateValue);
|
|
||||||
} else {
|
|
||||||
mobTarget.playerAgroMap.put(ac.getObjectUUID(), damage);
|
|
||||||
}
|
|
||||||
subTrack = 4;
|
|
||||||
}
|
|
||||||
mobTarget.handleDirectAggro(ac);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tarAc.getHealth() > 0)
|
if (tarAc.getHealth() > 0)
|
||||||
d = tarAc.modifyHealth(-damage, ac, false);
|
d = tarAc.modifyHealth(-damage, ac, false);
|
||||||
subTrack = 5;
|
|
||||||
} else if (target.getObjectType().equals(GameObjectType.Building)) {
|
} else if (target.getObjectType().equals(GameObjectType.Building)) {
|
||||||
subTrack = 6;
|
|
||||||
if (BuildingManager.getBuildingFromCache(target.getObjectUUID()) == null) {
|
if (BuildingManager.getBuildingFromCache(target.getObjectUUID()) == null) {
|
||||||
ac.setCombatTarget(null);
|
ac.setCombatTarget(null);
|
||||||
subTrack = 7;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
subTrack = 8;
|
|
||||||
if (target.getHealth() > 0)
|
if (target.getHealth() > 0)
|
||||||
d = ((Building) target).modifyHealth(-damage, ac);
|
d = ((Building) target).modifyHealth(-damage, ac);
|
||||||
subTrack = 9;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
errorTrack = 13;
|
errorTrack = 13;
|
||||||
@@ -878,27 +902,18 @@ public enum CombatManager {
|
|||||||
|
|
||||||
if (weapon != null && tarAc != null && tarAc.isAlive()) {
|
if (weapon != null && tarAc != null && tarAc.isAlive()) {
|
||||||
|
|
||||||
ConcurrentHashMap<String, Effect> effects = weapon.getEffects();
|
if(weapon.effects != null){
|
||||||
|
for (Effect eff : weapon.effects.values()){
|
||||||
for (Effect eff : effects.values()) {
|
for(AbstractEffectModifier mod : eff.getEffectModifiers()){
|
||||||
if (eff == null)
|
if(mod.modType.equals(ModType.WeaponProc)){
|
||||||
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);
|
int procChance = ThreadLocalRandom.current().nextInt(100);
|
||||||
|
if (procChance < MBServerStatics.PROC_CHANCE) {
|
||||||
if (procChance < MBServerStatics.PROC_CHANCE)
|
try {
|
||||||
((WeaponProcEffectModifier) aem).applyProc(ac, target);
|
((WeaponProcEffectModifier) mod).applyProc(ac, target);
|
||||||
|
}catch(Exception e){
|
||||||
|
Logger.error(eff.getName() + " Failed To Cast Proc");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -927,7 +942,13 @@ public enum CombatManager {
|
|||||||
if (wp.requiresHitRoll() == false) {
|
if (wp.requiresHitRoll() == false) {
|
||||||
PlayerBonuses bonus = ac.getBonuses();
|
PlayerBonuses bonus = ac.getBonuses();
|
||||||
float attackRange = getWeaponRange(wb, bonus);
|
float attackRange = getWeaponRange(wb, bonus);
|
||||||
|
if(specialCaseHitRoll(dpj.getPowerToken())) {
|
||||||
|
if(hitLanded) {
|
||||||
dpj.attack(target, attackRange);
|
dpj.attack(target, attackRange);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
dpj.attack(target, attackRange);
|
||||||
|
}
|
||||||
} else
|
} else
|
||||||
((PlayerCharacter) ac).setWeaponPower(null);
|
((PlayerCharacter) ac).setWeaponPower(null);
|
||||||
}
|
}
|
||||||
@@ -954,8 +975,7 @@ public enum CombatManager {
|
|||||||
ac.cancelOnAttack();
|
ac.cancelOnAttack();
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Logger.error(ac.getName() + ' ' + "ErrorTrack: " + errorTrack + " ErrorSubTrack = " + subTrack + e);
|
Logger.error(ac.getName() + ' ' + errorTrack + ' ' + e);
|
||||||
Logger.error(e.getMessage());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1034,9 +1054,7 @@ public enum CombatManager {
|
|||||||
damage += minDamage;
|
damage += minDamage;
|
||||||
|
|
||||||
//calculate resists in if any
|
//calculate resists in if any
|
||||||
if(source.getObjectType().equals(GameObjectType.PlayerCharacter)){
|
|
||||||
damage *= ((PlayerCharacter)source).ZergMultiplier;
|
|
||||||
}
|
|
||||||
if (resists != null)
|
if (resists != null)
|
||||||
return resists.getResistedDamage(source, target, damageType, damage, 0);
|
return resists.getResistedDamage(source, target, damageType, damage, 0);
|
||||||
else
|
else
|
||||||
@@ -1069,6 +1087,10 @@ public enum CombatManager {
|
|||||||
if (eff.getPower() != null && (eff.getPower().getToken() == 429506943 || eff.getPower().getToken() == 429408639 || eff.getPower().getToken() == 429513599 || eff.getPower().getToken() == 429415295))
|
if (eff.getPower() != null && (eff.getPower().getToken() == 429506943 || eff.getPower().getToken() == 429408639 || eff.getPower().getToken() == 429513599 || eff.getPower().getToken() == 429415295))
|
||||||
swingAnimation = 0;
|
swingAnimation = 0;
|
||||||
|
|
||||||
|
if(source != null && source.getObjectType().equals(GameObjectType.PlayerCharacter)){
|
||||||
|
damage *= ((PlayerCharacter)source).ZergMultiplier;
|
||||||
|
} // Health modifications are modified by the ZergMechanic
|
||||||
|
|
||||||
TargetedActionMsg cmm = new TargetedActionMsg(source, target, damage, swingAnimation);
|
TargetedActionMsg cmm = new TargetedActionMsg(source, target, damage, swingAnimation);
|
||||||
DispatchMessage.sendToAllInRange(target, cmm);
|
DispatchMessage.sendToAllInRange(target, cmm);
|
||||||
}
|
}
|
||||||
@@ -1252,13 +1274,16 @@ public enum CombatManager {
|
|||||||
DispatchMessage.dispatchMsgToInterestArea(pc, rwss, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, false, false);
|
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);
|
PlayerCharacter pc = SessionManager.getPlayerCharacter(origin);
|
||||||
|
|
||||||
if (pc == null)
|
if (pc == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if(pc.isFlying())
|
||||||
|
pc.setSit(false);
|
||||||
|
else
|
||||||
pc.setSit(toggle);
|
pc.setSit(toggle);
|
||||||
|
|
||||||
UpdateStateMsg rwss = new UpdateStateMsg();
|
UpdateStateMsg rwss = new UpdateStateMsg();
|
||||||
@@ -1275,13 +1300,6 @@ public enum CombatManager {
|
|||||||
|
|
||||||
range += (calcHitBox(ac) + calcHitBox(target));
|
range += (calcHitBox(ac) + calcHitBox(target));
|
||||||
|
|
||||||
if(ac.getObjectType().equals(GameObjectType.PlayerCharacter)){
|
|
||||||
range += ((PlayerCharacter)ac).getCharacterHeight() * 0.5f;
|
|
||||||
if(ac.isMoving()){
|
|
||||||
range += ((PlayerCharacter) ac).getCharacterHeight();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
float magnitudeSquared = tl.distanceSquared(sl);
|
float magnitudeSquared = tl.distanceSquared(sl);
|
||||||
|
|
||||||
return magnitudeSquared > range * range;
|
return magnitudeSquared > range * range;
|
||||||
@@ -1344,6 +1362,13 @@ public enum CombatManager {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
retaliater.setCombatTarget(ac);
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1460,4 +1485,30 @@ public enum CombatManager {
|
|||||||
((AbstractCharacter) awo).getCharItemManager().damageRandomArmor(1);
|
((AbstractCharacter) awo).getCharItemManager().damageRandomArmor(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean LandHit(int C5, int D5){
|
||||||
|
|
||||||
|
float chance = (C5-((C5+D5) * 0.315f)) / ((D5-((C5+D5) * 0.315f)) + (C5-((C5+D5) * 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;
|
||||||
|
|
||||||
|
return roll <= convertedChance;
|
||||||
|
}
|
||||||
|
|
||||||
|
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_MAINTENANCE,
|
||||||
MB_WORLD_GREETING,
|
MB_WORLD_GREETING,
|
||||||
MB_WORLD_KEYCLONE_MAX,
|
MB_WORLD_KEYCLONE_MAX,
|
||||||
|
MB_WORLD_TESTMODE,
|
||||||
MB_USE_RUINS,
|
MB_USE_RUINS,
|
||||||
|
|
||||||
// Mobile AI modifiers
|
// Mobile AI modifiers
|
||||||
|
|||||||
@@ -11,8 +11,6 @@ package engine.gameManager;
|
|||||||
import engine.Enum;
|
import engine.Enum;
|
||||||
import engine.devcmd.AbstractDevCmd;
|
import engine.devcmd.AbstractDevCmd;
|
||||||
import engine.devcmd.cmds.*;
|
import engine.devcmd.cmds.*;
|
||||||
import engine.net.DispatchMessage;
|
|
||||||
import engine.net.client.msg.chat.ChatSystemMsg;
|
|
||||||
import engine.objects.AbstractGameObject;
|
import engine.objects.AbstractGameObject;
|
||||||
import engine.objects.Account;
|
import engine.objects.Account;
|
||||||
import engine.objects.PlayerCharacter;
|
import engine.objects.PlayerCharacter;
|
||||||
@@ -81,7 +79,6 @@ public enum DevCmdManager {
|
|||||||
DevCmdManager.registerDevCmd(new AddGoldCmd());
|
DevCmdManager.registerDevCmd(new AddGoldCmd());
|
||||||
DevCmdManager.registerDevCmd(new ZoneInfoCmd());
|
DevCmdManager.registerDevCmd(new ZoneInfoCmd());
|
||||||
DevCmdManager.registerDevCmd(new DebugMeleeSyncCmd());
|
DevCmdManager.registerDevCmd(new DebugMeleeSyncCmd());
|
||||||
DevCmdManager.registerDevCmd(new HotzoneCmd());
|
|
||||||
DevCmdManager.registerDevCmd(new MineActiveCmd());
|
DevCmdManager.registerDevCmd(new MineActiveCmd());
|
||||||
// Dev
|
// Dev
|
||||||
DevCmdManager.registerDevCmd(new ApplyStatModCmd());
|
DevCmdManager.registerDevCmd(new ApplyStatModCmd());
|
||||||
@@ -105,6 +102,7 @@ public enum DevCmdManager {
|
|||||||
DevCmdManager.registerDevCmd(new SetAdminRuneCmd());
|
DevCmdManager.registerDevCmd(new SetAdminRuneCmd());
|
||||||
DevCmdManager.registerDevCmd(new SetInvulCmd());
|
DevCmdManager.registerDevCmd(new SetInvulCmd());
|
||||||
DevCmdManager.registerDevCmd(new MakeItemCmd());
|
DevCmdManager.registerDevCmd(new MakeItemCmd());
|
||||||
|
DevCmdManager.registerDevCmd(new GimmeCmd());
|
||||||
DevCmdManager.registerDevCmd(new EnchantCmd());
|
DevCmdManager.registerDevCmd(new EnchantCmd());
|
||||||
DevCmdManager.registerDevCmd(new SetSubRaceCmd());
|
DevCmdManager.registerDevCmd(new SetSubRaceCmd());
|
||||||
// Admin
|
// Admin
|
||||||
@@ -121,7 +119,6 @@ public enum DevCmdManager {
|
|||||||
DevCmdManager.registerDevCmd(new PurgeObjectsCmd());
|
DevCmdManager.registerDevCmd(new PurgeObjectsCmd());
|
||||||
DevCmdManager.registerDevCmd(new SplatMobCmd());
|
DevCmdManager.registerDevCmd(new SplatMobCmd());
|
||||||
DevCmdManager.registerDevCmd(new SlotNpcCmd());
|
DevCmdManager.registerDevCmd(new SlotNpcCmd());
|
||||||
DevCmdManager.registerDevCmd(new setProfit());
|
|
||||||
DevCmdManager.registerDevCmd(new GateInfoCmd());
|
DevCmdManager.registerDevCmd(new GateInfoCmd());
|
||||||
DevCmdManager.registerDevCmd(new ShowOffsetCmd());
|
DevCmdManager.registerDevCmd(new ShowOffsetCmd());
|
||||||
DevCmdManager.registerDevCmd(new RealmInfoCmd());
|
DevCmdManager.registerDevCmd(new RealmInfoCmd());
|
||||||
@@ -182,17 +179,37 @@ public enum DevCmdManager {
|
|||||||
|
|
||||||
//kill any commands not available to everyone on production server
|
//kill any commands not available to everyone on production server
|
||||||
//only admin level can run dev commands on production
|
//only admin level can run dev commands on production
|
||||||
if((cmd.toLowerCase().equals("printstats") || cmd.toLowerCase().equals("printresists")) && target.equals(pcSender)){
|
boolean playerAllowed = false;
|
||||||
// execute command;
|
if(ConfigManager.MB_WORLD_TESTMODE.getValue().equals("true")) {
|
||||||
try {
|
switch (adc.getMainCmdString()) {
|
||||||
adc.doCmd(pcSender, argString, target);
|
case "printresists":
|
||||||
} catch (Exception e) {
|
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{
|
||||||
return true;
|
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 (a.status.equals(Enum.AccountStatus.ADMIN) == false && a.getUname().toLowerCase().equals("fatboy") == false) {
|
if (!playerAllowed && !a.status.equals(Enum.AccountStatus.ADMIN)) {
|
||||||
Logger.info("Account " + a.getUname() + "attempted to use dev command " + cmd);
|
Logger.info("Account " + a.getUname() + "attempted to use dev command " + cmd);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -216,11 +233,6 @@ public enum DevCmdManager {
|
|||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|
||||||
ChatSystemMsg chatMsg = new ChatSystemMsg(null, pcName + " from account: " + accName + " has used Dev Command: " + cmd);
|
|
||||||
chatMsg.setMessageType(10);
|
|
||||||
chatMsg.setChannel(Enum.ChatChannelType.SYSTEM.getChannelID());
|
|
||||||
DispatchMessage.dispatchMsgToAll(chatMsg);
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -5,206 +5,227 @@
|
|||||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
||||||
// Magicbane Emulator Project © 2013 - 2022
|
// Magicbane Emulator Project © 2013 - 2022
|
||||||
// www.magicbane.com
|
// www.magicbane.com
|
||||||
|
|
||||||
package engine.gameManager;
|
package engine.gameManager;
|
||||||
|
|
||||||
// Defines static methods which comprise the magicbane
|
// Defines static methods which comprise the magicbane
|
||||||
// building maintenance system.
|
// building maintenance system.
|
||||||
|
|
||||||
import engine.Enum;
|
import engine.Enum;
|
||||||
import engine.objects.*;
|
import engine.objects.*;
|
||||||
import org.pmw.tinylog.Logger;
|
import org.pmw.tinylog.Logger;
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
|
||||||
public enum MaintenanceManager {
|
public enum MaintenanceManager {
|
||||||
|
|
||||||
MAINTENANCEMANAGER;
|
MAINTENANCEMANAGER;
|
||||||
|
|
||||||
public static void setMaintDateTime(Building building, LocalDateTime maintDate) {
|
public static void setMaintDateTime(Building building, LocalDateTime maintDate) {
|
||||||
building.maintDateTime = maintDate;
|
|
||||||
|
building.maintDateTime = maintDate.withHour(1).withMinute(0).withSecond(0);
|
||||||
DbManager.BuildingQueries.updateMaintDate(building);
|
DbManager.BuildingQueries.updateMaintDate(building);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void processBuildingMaintenance() {
|
||||||
|
|
||||||
|
ArrayList<AbstractGameObject> buildingList;
|
||||||
|
ArrayList<Building> maintList;
|
||||||
|
ArrayList<Building> derankList = new ArrayList<>();
|
||||||
|
|
||||||
|
Logger.info("Starting Maintenance on Player Buildings");
|
||||||
|
|
||||||
|
// Build list of buildings to apply maintenance on.
|
||||||
|
|
||||||
|
buildingList = new ArrayList(DbManager.getList(Enum.GameObjectType.Building));
|
||||||
|
maintList = buildMaintList(buildingList);
|
||||||
|
|
||||||
|
// Deduct upkeep and build list of buildings
|
||||||
|
// which did not have funds available
|
||||||
|
|
||||||
|
for (Building building : maintList) {
|
||||||
|
|
||||||
|
if (chargeUpkeep(building) == false)
|
||||||
|
derankList.add(building);
|
||||||
|
else
|
||||||
|
setMaintDateTime(building, LocalDateTime.now().plusDays(7));
|
||||||
|
}
|
||||||
|
|
||||||
|
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());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Iterate over all buildings in game and apply exclusion rules
|
||||||
|
// returning a list of building for which maintenance is due.
|
||||||
|
|
||||||
|
private static ArrayList<Building> buildMaintList(ArrayList<AbstractGameObject> buildingList) {
|
||||||
|
|
||||||
|
ArrayList<Building> maintList = new ArrayList<>();
|
||||||
|
|
||||||
|
for (AbstractGameObject gameObject : buildingList) {
|
||||||
|
|
||||||
|
Building building = (Building) gameObject;
|
||||||
|
|
||||||
|
// No maintenance on NPC owned buildings (Cache loaded)
|
||||||
|
|
||||||
|
if (building.getProtectionState() == Enum.ProtectionState.NPC)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// No maintenance on constructing meshes
|
||||||
|
|
||||||
|
if (building.getRank() < 1)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// No Maintenance on furniture
|
||||||
|
|
||||||
|
if (building.parentBuildingID != 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// No Blueprint?
|
||||||
|
|
||||||
|
if (building.getBlueprint() == null) {
|
||||||
|
Logger.error("Blueprint missing for uuid: " + building.getObjectUUID());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//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))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// no maintenance on Mines omfg
|
||||||
|
|
||||||
|
if (building.getBlueprint().getBuildingGroup().equals(Enum.BuildingGroup.MINE))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// Null Maintenance date?
|
||||||
|
|
||||||
|
if (building.maintDateTime == null) {
|
||||||
|
Logger.error("Null maint date for building UUID: " + building.getObjectUUID());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Maintenance date is in the future
|
||||||
|
|
||||||
|
if (building.maintDateTime.isAfter(LocalDateTime.now()))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
|
||||||
|
//no maintenance if day of week doesnt match
|
||||||
|
//if (LocalDateTime.now().getDayOfWeek().ordinal() != building.maintDateTime.getDayOfWeek().ordinal()) {
|
||||||
|
// continue;
|
||||||
|
//}
|
||||||
|
// Add building to maintenance queue
|
||||||
|
|
||||||
|
maintList.add(building);
|
||||||
|
}
|
||||||
|
|
||||||
|
return maintList;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Method removes the appropriate amount of gold/resources from
|
||||||
|
// a building according to it's maintenance schedule. True/False
|
||||||
|
// is returned indicating if the building had enough funds to cover.
|
||||||
|
|
||||||
|
public static boolean chargeUpkeep(Building building) {
|
||||||
|
|
||||||
|
City city = null;
|
||||||
|
Warehouse warehouse = null;
|
||||||
|
int maintCost = 0;
|
||||||
|
int overDraft = 0;
|
||||||
|
boolean hasFunds = false;
|
||||||
|
boolean hasResources = false;
|
||||||
|
int resourceValue = 0;
|
||||||
|
|
||||||
|
city = building.getCity();
|
||||||
|
|
||||||
|
if (city != null)
|
||||||
|
warehouse = city.getWarehouse();
|
||||||
|
|
||||||
|
// Cache maintenance cost value
|
||||||
|
|
||||||
|
maintCost = building.getMaintCost();
|
||||||
|
|
||||||
|
// Something went wrong. Missing buildinggroup from switch?
|
||||||
|
|
||||||
|
if (maintCost == 0) {
|
||||||
|
Logger.error("chargeUpkeep", "Error retrieving rankcost for " + building.getName() + " uuid:" + building.getObjectUUID() + "buildinggroup:" + building.getBlueprint().getBuildingGroup().name());
|
||||||
|
// check if there is enough gold on the building
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (building.getStrongboxValue() >= maintCost)
|
||||||
|
hasFunds = true;
|
||||||
|
|
||||||
|
// If we cannot cover with just the strongbox
|
||||||
|
// see if there is a warehouse that will cover
|
||||||
|
// the overdraft for us.
|
||||||
|
|
||||||
|
|
||||||
|
if (hasFunds == false && (building.assetIsProtected() || building.getBlueprint().getBuildingGroup() == Enum.BuildingGroup.WAREHOUSE)) {
|
||||||
|
overDraft = maintCost - building.getStrongboxValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((overDraft > 0))
|
||||||
|
if ((building.getBlueprint().getBuildingGroup().equals(Enum.BuildingGroup.SHRINE) == false) &&
|
||||||
|
(warehouse != null) && building.assetIsProtected() == true &&
|
||||||
|
(warehouse.getResources().get(ItemBase.GOLD_ITEM_BASE)) >= overDraft) {
|
||||||
|
hasFunds = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If this is an R8 tree, validate that we can
|
||||||
|
// cover the resources required
|
||||||
|
|
||||||
|
|
||||||
|
if (hasFunds == false) {
|
||||||
|
return false; // Early exit for having failed to meet maintenance
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove cash and resources
|
||||||
|
|
||||||
|
// withdraw what we can from the building
|
||||||
|
|
||||||
|
building.setStrongboxValue(building.getStrongboxValue() - (maintCost - overDraft));
|
||||||
|
|
||||||
|
// withdraw overdraft from the whorehouse
|
||||||
|
|
||||||
|
if (overDraft > 0) {
|
||||||
|
|
||||||
|
resourceValue = warehouse.getResources().get(Warehouse.goldIB);
|
||||||
|
|
||||||
|
if (DbManager.WarehouseQueries.updateGold(warehouse, resourceValue - overDraft) == true) {
|
||||||
|
warehouse.getResources().put(Warehouse.goldIB, resourceValue - overDraft);
|
||||||
|
warehouse.AddTransactionToWarehouse(Enum.GameObjectType.Building, building.getObjectUUID(), Enum.TransactionType.WITHDRAWL, Resource.GOLD, overDraft);
|
||||||
|
} else {
|
||||||
|
Logger.error("gold update failed for warehouse of UUID:" + warehouse.getObjectUUID());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
public static void dailyMaintenance() {
|
public static void dailyMaintenance() {
|
||||||
|
|
||||||
Logger.info("Maintenance has started");
|
Logger.info("Maintenance has started");
|
||||||
|
|
||||||
// Run maintenance on player buildings
|
// Run maintenance on player buildings
|
||||||
|
|
||||||
if (ConfigManager.MB_WORLD_MAINTENANCE.getValue().equalsIgnoreCase("true"))
|
if (ConfigManager.MB_WORLD_MAINTENANCE.getValue().equalsIgnoreCase("true"))
|
||||||
processMaintenance();
|
processBuildingMaintenance();
|
||||||
else
|
else
|
||||||
Logger.info("Maintenance Costings: DISABLED");
|
Logger.info("Maintenance Costings: DISABLED");
|
||||||
|
|
||||||
Logger.info("Maintenance has completed!");
|
Logger.info("Maintenance has completed!");
|
||||||
}
|
}
|
||||||
public static void processMaintenance() {
|
|
||||||
//create list of all cities
|
|
||||||
ConcurrentHashMap<Integer, AbstractGameObject> worldCities = DbManager.getMap(Enum.GameObjectType.City);
|
|
||||||
//loop all cities
|
|
||||||
for (AbstractGameObject ago : worldCities.values()) {
|
|
||||||
if (ago.getObjectType().equals(Enum.GameObjectType.City)) {
|
|
||||||
City city = (City) ago;
|
|
||||||
if(city == null || !city.getParent().isPlayerCity())
|
|
||||||
continue;
|
|
||||||
Building tol = city.getTOL();
|
|
||||||
if(tol == null)
|
|
||||||
continue;
|
|
||||||
LocalDateTime maintenanceDueDate = tol.maintDateTime.withHour(1).withMinute(0).withSecond(0);
|
|
||||||
LocalDateTime now = LocalDateTime.now();
|
|
||||||
if(now.isAfter(maintenanceDueDate))
|
|
||||||
processTolMaintenance(tol, city.getWarehouse());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public static void processTolMaintenance(Building tol, Warehouse warehouse){
|
|
||||||
if(tol == null)
|
|
||||||
return;
|
|
||||||
if(tol.getRank() == 8)
|
|
||||||
handleR8(tol,warehouse);
|
|
||||||
else
|
|
||||||
handleNormal(tol,warehouse);
|
|
||||||
}
|
|
||||||
public static void handleNormal(Building tol, Warehouse warehouse){
|
|
||||||
//handle r7 and lower ToL maintenance
|
|
||||||
int goldDue = 3000000;
|
|
||||||
//enough on strongbox alone to pay
|
|
||||||
if (tol.getStrongboxValue() >= goldDue) {
|
|
||||||
tol.maintDateTime = LocalDateTime.now().plusDays(7);
|
|
||||||
if(DbManager.BuildingQueries.updateMaintDate(tol)) {
|
|
||||||
tol.setStrongboxValue(tol.getStrongboxValue() - goldDue);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
int newStrongboxValue = tol.getStrongboxValue();
|
|
||||||
int newWarehouseGold = 0;
|
|
||||||
if(warehouse != null && warehouse.getResources().get(ItemBase.getItemBase(7)) != null) {
|
|
||||||
newWarehouseGold = warehouse.getResources().get(ItemBase.getItemBase(7));
|
|
||||||
} else{
|
|
||||||
//wasnt enough on strongbox and gold in warehouse is empty
|
|
||||||
tol.maintDateTime = LocalDateTime.now().plusDays(1);
|
|
||||||
if(DbManager.BuildingQueries.updateMaintDate(tol)) {
|
|
||||||
tol.destroyOrDerank(null);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
//some on strongbox to pay
|
|
||||||
if (tol.getStrongboxValue() > 0) {
|
|
||||||
newStrongboxValue = 0;
|
|
||||||
goldDue -= tol.getStrongboxValue();
|
|
||||||
}
|
|
||||||
if(newWarehouseGold < goldDue){
|
|
||||||
//not enough gold to pay, you miss maintenance
|
|
||||||
tol.maintDateTime = LocalDateTime.now().plusDays(1);
|
|
||||||
if(DbManager.BuildingQueries.updateMaintDate(tol)) {
|
|
||||||
tol.destroyOrDerank(null);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
newWarehouseGold -= goldDue;
|
|
||||||
tol.maintDateTime = LocalDateTime.now().plusDays(7);
|
|
||||||
if(DbManager.BuildingQueries.updateMaintDate(tol) && DbManager.WarehouseQueries.updateGold(warehouse,newWarehouseGold)) {
|
|
||||||
warehouse.getResources().put(ItemBase.getItemBase(7), newWarehouseGold);
|
|
||||||
tol.setStrongboxValue(newStrongboxValue);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public static void handleR8(Building tol, Warehouse warehouse){
|
|
||||||
//handle r8 ToL maintenance
|
|
||||||
//cannot pay r8 maintenance without a warehouse
|
|
||||||
if(warehouse == null && DbManager.BuildingQueries.updateMaintDate(tol)) {
|
|
||||||
tol.destroyOrDerank(null);
|
|
||||||
tol.maintDateTime = LocalDateTime.now().plusDays(1);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
//handle resource processing
|
|
||||||
int goldDue = 3000000;
|
|
||||||
int galvorDue = 5;
|
|
||||||
int wormwoodDue = 5;
|
|
||||||
int stoneDue = 5000;
|
|
||||||
int lumberDue = 5000;
|
|
||||||
int goldStrongBox = tol.getStrongboxValue();
|
|
||||||
int goldWarehouse = 0;
|
|
||||||
int galvorWarehouse;
|
|
||||||
int wormwoodWarehouse;
|
|
||||||
int stoneWarehouse;
|
|
||||||
int lumberWarehouse;
|
|
||||||
if(warehouse.getResources().get(Warehouse.galvorIB) != null) {
|
|
||||||
galvorWarehouse = warehouse.getResources().get(Warehouse.galvorIB);
|
|
||||||
}else {
|
|
||||||
tol.maintDateTime = LocalDateTime.now().plusDays(1);
|
|
||||||
if(DbManager.BuildingQueries.updateMaintDate(tol)) {
|
|
||||||
tol.destroyOrDerank(null);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if(warehouse.getResources().get(Warehouse.stoneIB) != null) {
|
|
||||||
stoneWarehouse = warehouse.getResources().get(Warehouse.stoneIB);
|
|
||||||
}else {
|
|
||||||
tol.maintDateTime = LocalDateTime.now().plusDays(1);
|
|
||||||
if(DbManager.BuildingQueries.updateMaintDate(tol)) {
|
|
||||||
tol.destroyOrDerank(null);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if(warehouse.getResources().get(Warehouse.wormwoodIB) != null) {
|
|
||||||
wormwoodWarehouse = warehouse.getResources().get(Warehouse.wormwoodIB);
|
|
||||||
}else {
|
|
||||||
tol.maintDateTime = LocalDateTime.now().plusDays(1);
|
|
||||||
if(DbManager.BuildingQueries.updateMaintDate(tol)) {
|
|
||||||
tol.destroyOrDerank(null);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if(warehouse.getResources().get(Warehouse.lumberIB) != null) {
|
|
||||||
lumberWarehouse = warehouse.getResources().get(Warehouse.lumberIB);
|
|
||||||
}else {
|
|
||||||
tol.maintDateTime = LocalDateTime.now().plusDays(1);
|
|
||||||
if(DbManager.BuildingQueries.updateMaintDate(tol)) {
|
|
||||||
tol.destroyOrDerank(null);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
boolean canPay = true;
|
|
||||||
if(goldStrongBox >= goldDue){
|
|
||||||
goldStrongBox -= goldDue;
|
|
||||||
goldDue = 0;
|
|
||||||
}
|
|
||||||
if (tol.getStrongboxValue() > 0) {
|
|
||||||
goldStrongBox = 0;
|
|
||||||
goldDue -= tol.getStrongboxValue();
|
|
||||||
}
|
|
||||||
if(warehouse.getResources().get(Warehouse.goldIB) != null) {
|
|
||||||
goldWarehouse = warehouse.getResources().get(Warehouse.goldIB);
|
|
||||||
}else if(goldDue > 0){
|
|
||||||
tol.maintDateTime = LocalDateTime.now().plusDays(1);
|
|
||||||
if(DbManager.BuildingQueries.updateMaintDate(tol)) {
|
|
||||||
tol.destroyOrDerank(null);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if(wormwoodDue > wormwoodWarehouse)
|
|
||||||
canPay = false;
|
|
||||||
if(galvorDue > galvorWarehouse)
|
|
||||||
canPay = false;
|
|
||||||
if(lumberDue > lumberWarehouse)
|
|
||||||
canPay = false;
|
|
||||||
if(stoneDue > stoneWarehouse)
|
|
||||||
canPay = false;
|
|
||||||
if(goldDue > goldWarehouse)
|
|
||||||
canPay = false;
|
|
||||||
if(!canPay){
|
|
||||||
tol.maintDateTime = LocalDateTime.now().plusDays(1);
|
|
||||||
if(DbManager.BuildingQueries.updateMaintDate(tol)) {
|
|
||||||
tol.destroyOrDerank(null);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
tol.setStrongboxValue(goldStrongBox);
|
|
||||||
if(DbManager.WarehouseQueries.updateGold(warehouse,goldWarehouse - goldDue)){
|
|
||||||
if(DbManager.WarehouseQueries.updateStone(warehouse,stoneWarehouse - stoneDue)){
|
|
||||||
if(DbManager.WarehouseQueries.updateLumber(warehouse,lumberWarehouse - lumberDue)){
|
|
||||||
if(DbManager.WarehouseQueries.updateGalvor(warehouse,galvorWarehouse - galvorDue)){
|
|
||||||
if(DbManager.WarehouseQueries.updateWormwood(warehouse,wormwoodWarehouse - wormwoodDue)){
|
|
||||||
tol.maintDateTime = LocalDateTime.now().plusDays(1);
|
|
||||||
if(DbManager.BuildingQueries.updateMaintDate(tol)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -68,11 +68,10 @@ public enum MovementManager {
|
|||||||
|
|
||||||
if (toMove.getObjectType().equals(GameObjectType.PlayerCharacter)) {
|
if (toMove.getObjectType().equals(GameObjectType.PlayerCharacter)) {
|
||||||
if (((PlayerCharacter) toMove).isCasting())
|
if (((PlayerCharacter) toMove).isCasting())
|
||||||
((PlayerCharacter) toMove).update();
|
((PlayerCharacter) toMove).update(false);
|
||||||
if(((PlayerCharacter) toMove).isFlying() && toMove.getEffects().containsKey("MoveBuff"))
|
|
||||||
PlayerCharacter.GroundPlayer(((PlayerCharacter) toMove));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
toMove.setIsCasting(false);
|
toMove.setIsCasting(false);
|
||||||
toMove.setItemCasting(false);
|
toMove.setItemCasting(false);
|
||||||
|
|
||||||
@@ -97,7 +96,7 @@ public enum MovementManager {
|
|||||||
if (!toMove.isMoving())
|
if (!toMove.isMoving())
|
||||||
toMove.resetLastSetLocUpdate();
|
toMove.resetLastSetLocUpdate();
|
||||||
else
|
else
|
||||||
toMove.update();
|
toMove.update(false);
|
||||||
|
|
||||||
// Update movement for the player
|
// Update movement for the player
|
||||||
|
|
||||||
@@ -352,7 +351,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());
|
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
|
//Send run/walk/sit/stand to tell the client we are flying / landing etc
|
||||||
ac.update();
|
ac.update(false);
|
||||||
ac.stopMovement(ac.getLoc());
|
ac.stopMovement(ac.getLoc());
|
||||||
if (ac.isAlive())
|
if (ac.isAlive())
|
||||||
MovementManager.sendRWSSMsg(ac);
|
MovementManager.sendRWSSMsg(ac);
|
||||||
@@ -409,7 +408,7 @@ public enum MovementManager {
|
|||||||
if (bonus.getBool(ModType.Stunned, SourceType.None) || bonus.getBool(ModType.CannotMove, SourceType.None))
|
if (bonus.getBool(ModType.Stunned, SourceType.None) || bonus.getBool(ModType.CannotMove, SourceType.None))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
member.update();
|
member.update(false);
|
||||||
|
|
||||||
|
|
||||||
// All checks passed, let's move the player
|
// All checks passed, let's move the player
|
||||||
|
|||||||
@@ -23,6 +23,14 @@ public enum NPCManager {
|
|||||||
NPC_MANAGER;
|
NPC_MANAGER;
|
||||||
public static HashMap<Integer, ArrayList<Integer>> _runeSetMap = new HashMap<>();
|
public static HashMap<Integer, ArrayList<Integer>> _runeSetMap = new HashMap<>();
|
||||||
|
|
||||||
|
public static void LoadAllRuneSets() {
|
||||||
|
_runeSetMap = DbManager.ItemBaseQueries.LOAD_RUNES_FOR_NPC_AND_MOBS();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void LoadAllBootySets() {
|
||||||
|
LootManager._bootySetMap = DbManager.LootQueries.LOAD_BOOTY_TABLES();
|
||||||
|
}
|
||||||
|
|
||||||
public static void applyRuneSetEffects(Mob mob) {
|
public static void applyRuneSetEffects(Mob mob) {
|
||||||
|
|
||||||
// Early exit
|
// Early exit
|
||||||
@@ -119,12 +127,10 @@ public enum NPCManager {
|
|||||||
|
|
||||||
DbManager.removeFromCache(necroPet);
|
DbManager.removeFromCache(necroPet);
|
||||||
|
|
||||||
|
PlayerCharacter petOwner = necroPet.getOwner();
|
||||||
PlayerCharacter petOwner = (PlayerCharacter) necroPet.guardCaptain;
|
|
||||||
|
|
||||||
if (petOwner != null) {
|
if (petOwner != null) {
|
||||||
|
necroPet.setOwner(null);
|
||||||
necroPet.guardCaptain = null;
|
|
||||||
petOwner.setPet(null);
|
petOwner.setPet(null);
|
||||||
|
|
||||||
if (updateOwner == false)
|
if (updateOwner == false)
|
||||||
@@ -222,14 +228,12 @@ public enum NPCManager {
|
|||||||
WorldGrid.removeObject(toRemove);
|
WorldGrid.removeObject(toRemove);
|
||||||
DbManager.removeFromCache(toRemove);
|
DbManager.removeFromCache(toRemove);
|
||||||
|
|
||||||
|
PlayerCharacter petOwner = toRemove.getOwner();
|
||||||
PlayerCharacter petOwner = (PlayerCharacter) toRemove.guardCaptain;
|
|
||||||
|
|
||||||
if (petOwner != null) {
|
if (petOwner != null) {
|
||||||
|
|
||||||
petOwner.setPet(null);
|
petOwner.setPet(null);
|
||||||
|
toRemove.setOwner(null);
|
||||||
toRemove.guardCaptain = null;
|
|
||||||
|
|
||||||
PetMsg petMsg = new PetMsg(5, null);
|
PetMsg petMsg = new PetMsg(5, null);
|
||||||
Dispatch dispatch = Dispatch.borrow(petOwner, petMsg);
|
Dispatch dispatch = Dispatch.borrow(petOwner, petMsg);
|
||||||
@@ -336,18 +340,9 @@ public enum NPCManager {
|
|||||||
else
|
else
|
||||||
buildingSlot = BuildingManager.getAvailableSlot(abstractCharacter.building);
|
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
|
// Override bind and location for this npc derived
|
||||||
@@ -375,53 +370,4 @@ public enum NPCManager {
|
|||||||
|
|
||||||
return buildingSlot;
|
return buildingSlot;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int getMaxMinions(Mob guardCaptain) {
|
|
||||||
|
|
||||||
int maxSlots;
|
|
||||||
|
|
||||||
switch (guardCaptain.getRank()) {
|
|
||||||
case 3:
|
|
||||||
maxSlots = 2;
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
case 5:
|
|
||||||
maxSlots = 3;
|
|
||||||
break;
|
|
||||||
case 6:
|
|
||||||
maxSlots = 4;
|
|
||||||
break;
|
|
||||||
case 7:
|
|
||||||
maxSlots = 5;
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
case 2:
|
|
||||||
default:
|
|
||||||
maxSlots = 1;
|
|
||||||
|
|
||||||
}
|
|
||||||
return maxSlots;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void AssignPatrolPoints(Mob mob) {
|
|
||||||
mob.patrolPoints = new ArrayList<>();
|
|
||||||
|
|
||||||
for (int i = 0; i < 5; ++i) {
|
|
||||||
float patrolRadius = mob.getSpawnRadius();
|
|
||||||
|
|
||||||
if (patrolRadius > 256)
|
|
||||||
patrolRadius = 256;
|
|
||||||
|
|
||||||
if (patrolRadius < 60)
|
|
||||||
patrolRadius = 60;
|
|
||||||
|
|
||||||
Vector3fImmutable newPatrolPoint = Vector3fImmutable.getRandomPointInCircle(mob.getBindLoc(), patrolRadius);
|
|
||||||
mob.patrolPoints.add(newPatrolPoint);
|
|
||||||
|
|
||||||
if (i == 1) {
|
|
||||||
mob.loc = newPatrolPoint;
|
|
||||||
mob.endLoc = newPatrolPoint;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ package engine.gameManager;
|
|||||||
|
|
||||||
import engine.Enum.*;
|
import engine.Enum.*;
|
||||||
import engine.InterestManagement.HeightMap;
|
import engine.InterestManagement.HeightMap;
|
||||||
|
import engine.InterestManagement.InterestManager;
|
||||||
import engine.InterestManagement.WorldGrid;
|
import engine.InterestManagement.WorldGrid;
|
||||||
import engine.db.handlers.dbEffectsBaseHandler;
|
import engine.db.handlers.dbEffectsBaseHandler;
|
||||||
import engine.db.handlers.dbPowerHandler;
|
import engine.db.handlers.dbPowerHandler;
|
||||||
@@ -27,7 +28,6 @@ import engine.net.client.ClientConnection;
|
|||||||
import engine.net.client.msg.*;
|
import engine.net.client.msg.*;
|
||||||
import engine.objects.*;
|
import engine.objects.*;
|
||||||
import engine.powers.*;
|
import engine.powers.*;
|
||||||
import engine.powers.effectmodifiers.SeeInvisibleEffectModifier;
|
|
||||||
import engine.powers.poweractions.AbstractPowerAction;
|
import engine.powers.poweractions.AbstractPowerAction;
|
||||||
import engine.powers.poweractions.TrackPowerAction;
|
import engine.powers.poweractions.TrackPowerAction;
|
||||||
import engine.server.MBServerStatics;
|
import engine.server.MBServerStatics;
|
||||||
@@ -57,22 +57,6 @@ public enum PowersManager {
|
|||||||
public static HashMap<Integer, ArrayList<MobPowerEntry>> AllMobPowers;
|
public static HashMap<Integer, ArrayList<MobPowerEntry>> AllMobPowers;
|
||||||
private static JobScheduler js;
|
private static JobScheduler js;
|
||||||
|
|
||||||
public static String[] siegeBuffs = new String[]{"ART-004A","ARM-112A"};
|
|
||||||
public static String[] siegeDeBuffs = new String[]{"ACM-003A","WRT-003A"};
|
|
||||||
|
|
||||||
public static ArrayList<PowerQueObject> static_power_que = new ArrayList<>();
|
|
||||||
|
|
||||||
public static class PowerQueObject{
|
|
||||||
public PowerQueObject(PerformActionMsg inmsg,ClientConnection inorigin,boolean insendCastToSelf){
|
|
||||||
this.msg = inmsg;
|
|
||||||
this.origin = inorigin;
|
|
||||||
this.sendCastToSelf = insendCastToSelf;
|
|
||||||
}
|
|
||||||
public PerformActionMsg msg;
|
|
||||||
public ClientConnection origin;
|
|
||||||
public boolean sendCastToSelf;
|
|
||||||
}
|
|
||||||
|
|
||||||
private PowersManager() {
|
private PowersManager() {
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -180,19 +164,26 @@ public enum PowersManager {
|
|||||||
public static void usePower(final PerformActionMsg msg, ClientConnection origin,
|
public static void usePower(final PerformActionMsg msg, ClientConnection origin,
|
||||||
boolean sendCastToSelf) {
|
boolean sendCastToSelf) {
|
||||||
|
|
||||||
|
PlayerCharacter pc = SessionManager.getPlayerCharacter(origin);
|
||||||
|
|
||||||
|
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 (usePowerA(msg, origin, sendCastToSelf)) {
|
if (usePowerA(msg, origin, sendCastToSelf)) {
|
||||||
// Cast failed for some reason, reset timer
|
// Cast failed for some reason, reset timer
|
||||||
|
|
||||||
RecyclePowerMsg recyclePowerMsg = new RecyclePowerMsg(msg.getPowerUsedID());
|
RecyclePowerMsg recyclePowerMsg = new RecyclePowerMsg(msg.getPowerUsedID());
|
||||||
Dispatch dispatch = Dispatch.borrow(origin.getPlayerCharacter(), recyclePowerMsg);
|
Dispatch dispatch = Dispatch.borrow(origin.getPlayerCharacter(), recyclePowerMsg);
|
||||||
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY);
|
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY);
|
||||||
// Send Fail to cast message
|
|
||||||
PlayerCharacter pc = SessionManager
|
|
||||||
.getPlayerCharacter(origin);
|
|
||||||
|
|
||||||
|
// Send Fail to cast message
|
||||||
if (pc != null) {
|
if (pc != null) {
|
||||||
sendPowerMsg(pc, 2, msg);
|
sendPowerMsg(pc, 2, msg);
|
||||||
if (pc.isCasting()) {
|
if (pc.isCasting()) {
|
||||||
pc.update();
|
pc.update(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
pc.setIsCasting(false);
|
pc.setIsCasting(false);
|
||||||
@@ -207,7 +198,8 @@ public enum PowersManager {
|
|||||||
msg.setUnknown04(1);
|
msg.setUnknown04(1);
|
||||||
|
|
||||||
if (useMobPowerA(msg, caster)) {
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -218,10 +210,43 @@ public enum PowersManager {
|
|||||||
if (playerCharacter == null)
|
if (playerCharacter == null)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
boolean skipCheck = false;
|
|
||||||
|
|
||||||
boolean CSRCast = 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)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (MBServerStatics.POWERS_DEBUG) {
|
if (MBServerStatics.POWERS_DEBUG) {
|
||||||
ChatManager.chatSayInfo(
|
ChatManager.chatSayInfo(
|
||||||
@@ -232,67 +257,10 @@ public enum PowersManager {
|
|||||||
+ Integer.toHexString(msg.getPowerUsedID()) + " ("
|
+ Integer.toHexString(msg.getPowerUsedID()) + " ("
|
||||||
+ msg.getPowerUsedID() + ')');
|
+ msg.getPowerUsedID() + ')');
|
||||||
}
|
}
|
||||||
Boolean earlyExit = false;
|
|
||||||
//Sending recycle message to player if died while casting.
|
//Sending recycle message to player if died while casting.
|
||||||
if (!playerCharacter.isAlive() && msg.getPowerUsedID() != 428589216) { //succor
|
if (!playerCharacter.isAlive() && msg.getPowerUsedID() != 428589216) { //succor
|
||||||
|
|
||||||
earlyExit = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(msg.getPowerUsedID() == 430628895){ // group teleport
|
|
||||||
|
|
||||||
Boolean activeBane = false;
|
|
||||||
|
|
||||||
if(ZoneManager.getCityAtLocation(playerCharacter.loc) != null && ZoneManager.getCityAtLocation(playerCharacter.loc).getBane() != null)
|
|
||||||
activeBane = ZoneManager.getCityAtLocation(playerCharacter.loc).getBane().getSiegePhase().equals(SiegePhase.WAR);
|
|
||||||
|
|
||||||
Zone currentZone = ZoneManager.findSmallestZone(playerCharacter.loc);
|
|
||||||
if(currentZone == null)
|
|
||||||
earlyExit = true;
|
|
||||||
|
|
||||||
if(currentZone.isPlayerCity() && !activeBane)
|
|
||||||
earlyExit = true;
|
|
||||||
|
|
||||||
if(currentZone.getName().contains("Mine") == true && currentZone.isPlayerCity() == false) {
|
|
||||||
for (Building building : currentZone.zoneBuildingSet) {
|
|
||||||
if (Mine.getMineFromTower(building.getObjectUUID()) != null) {
|
|
||||||
Mine currentMine = Mine.getMineFromTower(building.getObjectUUID());
|
|
||||||
if (currentMine.isActive == false) {
|
|
||||||
earlyExit = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Vector3fImmutable endLoc = new Vector3fImmutable(msg.getTargetX(),msg.getTargetY(),msg.getTargetZ());
|
|
||||||
currentZone = ZoneManager.findSmallestZone(endLoc);
|
|
||||||
|
|
||||||
if(currentZone == null)
|
|
||||||
earlyExit = true;
|
|
||||||
|
|
||||||
if(currentZone.isPlayerCity() && !activeBane)
|
|
||||||
earlyExit = true;
|
|
||||||
|
|
||||||
if(currentZone.getName().contains("Mine") == true && currentZone.isPlayerCity() == false) {
|
|
||||||
for (Building building : currentZone.zoneBuildingSet) {
|
|
||||||
if (Mine.getMineFromTower(building.getObjectUUID()) != null) {
|
|
||||||
Mine currentMine = Mine.getMineFromTower(building.getObjectUUID());
|
|
||||||
if (currentMine.isActive == false) {
|
|
||||||
earlyExit = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// get power
|
|
||||||
PowersBase pb = PowersManager.powersBaseByToken.get(msg.getPowerUsedID());
|
|
||||||
|
|
||||||
if(pb.description.equals("Personal Movement Buff") && playerCharacter.isFlying()) {
|
|
||||||
ChatManager.chatSystemInfo(playerCharacter, "You cannot use movement speed buffs while flying");
|
|
||||||
earlyExit = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (earlyExit) {
|
|
||||||
|
|
||||||
RecyclePowerMsg recyclePowerMsg = new RecyclePowerMsg(msg.getPowerUsedID());
|
RecyclePowerMsg recyclePowerMsg = new RecyclePowerMsg(msg.getPowerUsedID());
|
||||||
Dispatch dispatch = Dispatch.borrow(playerCharacter, recyclePowerMsg);
|
Dispatch dispatch = Dispatch.borrow(playerCharacter, recyclePowerMsg);
|
||||||
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY);
|
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY);
|
||||||
@@ -300,6 +268,7 @@ public enum PowersManager {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// if (!pc.getPowers().contains(msg.getPowerUsedID())) {
|
// if (!pc.getPowers().contains(msg.getPowerUsedID())) {
|
||||||
// sendPowerMsg(pc, 10, msg);
|
// sendPowerMsg(pc, 10, msg);
|
||||||
// return false;
|
// return false;
|
||||||
@@ -312,6 +281,9 @@ public enum PowersManager {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// get power
|
||||||
|
PowersBase pb = PowersManager.powersBaseByToken.get(msg.getPowerUsedID());
|
||||||
|
|
||||||
if (pb == null) {
|
if (pb == null) {
|
||||||
ChatManager.chatSayInfo(playerCharacter,
|
ChatManager.chatSayInfo(playerCharacter,
|
||||||
"This power is not implemented yet.");
|
"This power is not implemented yet.");
|
||||||
@@ -322,18 +294,44 @@ public enum PowersManager {
|
|||||||
return true;
|
return true;
|
||||||
// return false;
|
// 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)
|
if (playerCharacter.getLastPower() != null)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
//Check if Power Target is allowed to cast.
|
//Check if Power Target is allowed to cast.
|
||||||
|
|
||||||
|
|
||||||
// Check powers for normal users
|
// Check powers for normal users
|
||||||
|
if (playerCharacter.getPowers() == null || !playerCharacter.getPowers().containsKey(msg.getPowerUsedID()))
|
||||||
if(msg.getPowerUsedID() == 429399948)
|
|
||||||
for(CharacterRune cr : playerCharacter.getRunes())
|
|
||||||
if(cr.getRuneBaseID() == 3029)
|
|
||||||
skipCheck = true;
|
|
||||||
if (!skipCheck && (playerCharacter.getPowers() == null || !playerCharacter.getPowers().containsKey(msg.getPowerUsedID())))
|
|
||||||
if (!playerCharacter.isCSR()) {
|
if (!playerCharacter.isCSR()) {
|
||||||
if (!MBServerStatics.POWERS_DEBUG) {
|
if (!MBServerStatics.POWERS_DEBUG) {
|
||||||
// ChatManager.chatSayInfo(pc, "You may not cast that spell!");
|
// ChatManager.chatSayInfo(pc, "You may not cast that spell!");
|
||||||
@@ -346,31 +344,26 @@ public enum PowersManager {
|
|||||||
|
|
||||||
// get numTrains for power
|
// get numTrains for power
|
||||||
int trains = msg.getNumTrains();
|
int trains = msg.getNumTrains();
|
||||||
int token = pb.token;
|
|
||||||
int overrideTrains = 0;
|
|
||||||
int overrideRecycle = 0;
|
|
||||||
if(token == 429420458){
|
|
||||||
overrideTrains = 40;
|
|
||||||
overrideRecycle = 300000;
|
|
||||||
}
|
|
||||||
// can't go over the max trains for the power, unless CSR
|
// can't go over the max trains for the power, unless CSR
|
||||||
if (trains > pb.getMaxTrains() && !playerCharacter.isCSR()) {
|
if (trains > pb.getMaxTrains() && !playerCharacter.isCSR()) {
|
||||||
trains = pb.getMaxTrains();
|
trains = pb.getMaxTrains();
|
||||||
msg.setNumTrains(trains);
|
msg.setNumTrains(trains);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//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
|
// can't go over total trains by player
|
||||||
if (playerCharacter.getPowers() != null && playerCharacter.getPowers().containsKey(msg.getPowerUsedID())) {
|
if (playerCharacter.getPowers() != null && playerCharacter.getPowers().containsKey(msg.getPowerUsedID())) {
|
||||||
CharacterPower cp = playerCharacter.getPowers().get(msg.getPowerUsedID());
|
CharacterPower cp = playerCharacter.getPowers().get(msg.getPowerUsedID());
|
||||||
if (cp != null) {
|
if (cp != null) {
|
||||||
int tot = cp.getTotalTrains();
|
int tot = cp.getTotalTrains();
|
||||||
switch(token){
|
|
||||||
case 430596127:
|
|
||||||
if(playerCharacter.getPromotionClass().getName().equals("Wizard"))
|
|
||||||
tot = 40; //single teleport granted at 40 for wizard
|
|
||||||
break;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tot == 0 && !playerCharacter.isCSR())
|
if (tot == 0 && !playerCharacter.isCSR())
|
||||||
return false;
|
return false;
|
||||||
if (trains != tot && !playerCharacter.isCSR()) {
|
if (trains != tot && !playerCharacter.isCSR()) {
|
||||||
@@ -379,19 +372,27 @@ public enum PowersManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(overrideTrains > 0)
|
|
||||||
msg.setNumTrains(overrideTrains);
|
|
||||||
// get recycle time in ms
|
// get recycle time in ms
|
||||||
int time = pb.getRecycleTime(trains);
|
int time = pb.getRecycleTime(trains);
|
||||||
|
|
||||||
if(overrideRecycle > 0)
|
// verify player is in correct mode (combat/nonCombat)
|
||||||
time = overrideRecycle;
|
if (playerCharacter.isCombat()) {
|
||||||
|
if (!pb.allowedInCombat())
|
||||||
|
// ChatManager.chatPowerError(pc,
|
||||||
|
// "This power is not allowed in combat mode.");
|
||||||
|
return true;
|
||||||
|
} else if (!pb.allowedOutOfCombat())
|
||||||
|
// ChatManager.chatPowerError(pc,
|
||||||
|
// "You must be in combat mode to use this power.");
|
||||||
|
return true;
|
||||||
|
|
||||||
// verify player is not stunned or prohibited from casting
|
// verify player is not stunned or prohibited from casting
|
||||||
PlayerBonuses bonus = playerCharacter.getBonuses();
|
PlayerBonuses bonus = playerCharacter.getBonuses();
|
||||||
SourceType sourceType = SourceType.GetSourceType(pb.getCategory());
|
SourceType sourceType = SourceType.GetSourceType(pb.getCategory());
|
||||||
if (bonus != null && (bonus.getBool(ModType.Stunned, SourceType.None) || bonus.getBool(ModType.CannotCast, SourceType.None) || bonus.getBool(ModType.BlockedPowerType, sourceType)))
|
if (bonus != null && (bonus.getBool(ModType.Stunned, SourceType.None) || bonus.getBool(ModType.CannotCast, SourceType.None) || bonus.getBool(ModType.BlockedPowerType, sourceType)))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
// if moving make sure spell valid for movement
|
// if moving make sure spell valid for movement
|
||||||
Vector3fImmutable endLoc = playerCharacter.getEndLoc();
|
Vector3fImmutable endLoc = playerCharacter.getEndLoc();
|
||||||
|
|
||||||
@@ -417,46 +418,39 @@ public enum PowersManager {
|
|||||||
if (pb.targetFromLastTarget() || pb.targetPet()) // use msg's target
|
if (pb.targetFromLastTarget() || pb.targetPet()) // use msg's target
|
||||||
if (pb.isAOE()) {
|
if (pb.isAOE()) {
|
||||||
if (!pb.usePointBlank()) {
|
if (!pb.usePointBlank()) {
|
||||||
AbstractWorldObject target;
|
AbstractWorldObject target = getTarget(msg);
|
||||||
if(msg.getTargetType() == 37 && Mob.dynamic_pets.get(msg.getTargetID()) != null){
|
|
||||||
Mob pet = Mob.dynamic_pets.get(msg.getTargetID());
|
|
||||||
target = pet;
|
|
||||||
}else{
|
|
||||||
target = getTarget(msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (target != null && target.getObjectType() == GameObjectType.Building && !pb.targetBuilding()) {
|
if (target != null && target.getObjectType() == GameObjectType.Building && !pb.targetBuilding()) {
|
||||||
PowersManager.sendPowerMsg(playerCharacter, 9, new PerformActionMsg(msg));
|
PowersManager.sendPowerMsg(playerCharacter, 9, new PerformActionMsg(msg));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (target == null) {
|
if (target == null) {
|
||||||
if (playerCharacter.getLoc().distanceSquared2D(msg.getTargetLoc()) > sqr(pb
|
if (playerCharacter.getLoc().distanceSquared2D(msg.getTargetLoc()) > sqr(pb
|
||||||
.getRange()))
|
.getRange()))
|
||||||
return true;
|
return true;
|
||||||
} else if (verifyInvalidRange(playerCharacter, target, pb.getRange())) {
|
} else if (verifyInvalidRange(playerCharacter, target, pb.getRange()))
|
||||||
// pc.getLoc().distance(target.getLoc()) >
|
// pc.getLoc().distance(target.getLoc()) >
|
||||||
// pb.getRange())
|
// pb.getRange())
|
||||||
return true;
|
return true;
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// get target
|
// get target
|
||||||
AbstractWorldObject target;
|
AbstractWorldObject target = getTarget(msg);
|
||||||
if(msg.getTargetType() == 37 && Mob.dynamic_pets.get(msg.getTargetID()) != null){
|
|
||||||
Mob pet = Mob.dynamic_pets.get(msg.getTargetID());
|
if (target == null)
|
||||||
target = pet;
|
|
||||||
}else{
|
|
||||||
target = getTarget(msg);
|
|
||||||
}
|
|
||||||
if (target == null) {
|
|
||||||
return true;
|
return true;
|
||||||
}
|
|
||||||
if (!target.isAlive() && target.getObjectType().equals(GameObjectType.Building) == false && msg.getPowerUsedID() != 428589216)
|
if (!target.isAlive() && target.getObjectType().equals(GameObjectType.Building) == false && msg.getPowerUsedID() != 428589216)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
float range = pb.getRange();
|
float range = pb.getRange();
|
||||||
// verify target is in range
|
// verify target is in range
|
||||||
|
|
||||||
|
if(pb.token != 429396028) {
|
||||||
|
|
||||||
if (verifyInvalidRange(playerCharacter, target, range))
|
if (verifyInvalidRange(playerCharacter, target, range))
|
||||||
// (pc.getLoc().distance(target.getLoc()) > pb.getRange()) {
|
// (pc.getLoc().distance(target.getLoc()) > pb.getRange()) {
|
||||||
@@ -465,10 +459,17 @@ public enum PowersManager {
|
|||||||
// verify target is valid type
|
// verify target is valid type
|
||||||
if (!validateTarget(target, playerCharacter, pb))
|
if (!validateTarget(target, playerCharacter, pb))
|
||||||
return true;
|
return true;
|
||||||
|
}else{
|
||||||
|
pb.isSpell = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (AbstractWorldObject.IsAbstractCharacter(target))
|
if (AbstractWorldObject.IsAbstractCharacter(target))
|
||||||
targetLiveCounter = ((AbstractCharacter) target).getLiveCounter();
|
targetLiveCounter = ((AbstractCharacter) target).getLiveCounter();
|
||||||
}
|
}
|
||||||
|
|
||||||
// verify regular player can cast spell, otherwise authenticate
|
// verify regular player can cast spell, otherwise authenticate
|
||||||
if (!pb.regularPlayerCanCast()) {
|
if (!pb.regularPlayerCanCast()) {
|
||||||
Account a = SessionManager.getAccount(playerCharacter);
|
Account a = SessionManager.getAccount(playerCharacter);
|
||||||
@@ -478,6 +479,7 @@ public enum PowersManager {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// verify player has proper effects applied to use power
|
// verify player has proper effects applied to use power
|
||||||
if (pb.getEffectPrereqs().size() > 0 && playerCharacter.getEffects() != null) {
|
if (pb.getEffectPrereqs().size() > 0 && playerCharacter.getEffects() != null) {
|
||||||
|
|
||||||
@@ -491,9 +493,11 @@ public enum PowersManager {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!passed)
|
if (!passed)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
//verify player has proper equipment to use power
|
//verify player has proper equipment to use power
|
||||||
if (pb.getEquipPrereqs().size() > 0) {
|
if (pb.getEquipPrereqs().size() > 0) {
|
||||||
|
|
||||||
@@ -568,7 +572,6 @@ public enum PowersManager {
|
|||||||
// Validity checks passed, move on to casting spell
|
// Validity checks passed, move on to casting spell
|
||||||
//get caster's live counter
|
//get caster's live counter
|
||||||
int casterLiveCounter = playerCharacter.getLiveCounter();
|
int casterLiveCounter = playerCharacter.getLiveCounter();
|
||||||
|
|
||||||
// run recycle job for when cast is available again, don't bother adding the timer for CSRs
|
// run recycle job for when cast is available again, don't bother adding the timer for CSRs
|
||||||
if (time > 0) {
|
if (time > 0) {
|
||||||
FinishRecycleTimeJob frtj = new FinishRecycleTimeJob(playerCharacter, msg);
|
FinishRecycleTimeJob frtj = new FinishRecycleTimeJob(playerCharacter, msg);
|
||||||
@@ -595,7 +598,7 @@ public enum PowersManager {
|
|||||||
|
|
||||||
// make person casting stand up if spell (unless they're casting a chant which does not make them stand up)
|
// 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()) {
|
if (pb.isSpell() && !pb.isChant() && playerCharacter.isSit()) {
|
||||||
playerCharacter.update();
|
playerCharacter.update(false);
|
||||||
playerCharacter.setSit(false);
|
playerCharacter.setSit(false);
|
||||||
UpdateStateMsg updateStateMsg = new UpdateStateMsg(playerCharacter);
|
UpdateStateMsg updateStateMsg = new UpdateStateMsg(playerCharacter);
|
||||||
DispatchMessage.dispatchMsgToInterestArea(playerCharacter, updateStateMsg, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false);
|
DispatchMessage.dispatchMsgToInterestArea(playerCharacter, updateStateMsg, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false);
|
||||||
@@ -603,37 +606,27 @@ public enum PowersManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// update cast (use skill) fail condition
|
// update cast (use skill) fail condition
|
||||||
|
if(pb.token != 429396028 && pb.breaksForm) {
|
||||||
playerCharacter.cancelOnCast();
|
playerCharacter.cancelOnCast();
|
||||||
|
}
|
||||||
|
|
||||||
// update castSpell (use spell) fail condition if spell
|
// update castSpell (use spell) fail condition if spell
|
||||||
if (pb.isSpell())
|
if (pb.isSpell() && pb.breaksForm)
|
||||||
playerCharacter.cancelOnSpell();
|
playerCharacter.cancelOnSpell();
|
||||||
|
|
||||||
// get cast time in ms.
|
// get cast time in ms.
|
||||||
time = pb.getCastTime(trains);
|
time = pb.getCastTime(trains);
|
||||||
|
|
||||||
|
|
||||||
if(pb.token == 430596127)
|
|
||||||
time = 5000;
|
|
||||||
|
|
||||||
if(pb.name.equals("Summon") && playerCharacter.getRace().getName().contains("Vampire"))
|
|
||||||
time = 60000;
|
|
||||||
|
|
||||||
// set player is casting for regens
|
// set player is casting for regens
|
||||||
|
|
||||||
|
|
||||||
if (time > 100) {
|
if (time > 100) {
|
||||||
playerCharacter.update();
|
playerCharacter.update(false);
|
||||||
playerCharacter.setIsCasting(true);
|
playerCharacter.setIsCasting(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
playerCharacter.setLastMovementState(playerCharacter.getMovementState());
|
playerCharacter.setLastMovementState(playerCharacter.getMovementState());
|
||||||
|
|
||||||
if(msg.getPowerUsedID() == 429495514 && playerCharacter.getRace().getName().contains("Shade")){
|
|
||||||
copyMsg.setPowerUsedID(429397210);//intercept shade using hide and cast sneak instead
|
|
||||||
}
|
|
||||||
|
|
||||||
// run timer job to end cast
|
// run timer job to end cast
|
||||||
if (time < 1) // run immediately
|
if (time < 1) // run immediately
|
||||||
finishUsePower(copyMsg, playerCharacter, casterLiveCounter, targetLiveCounter);
|
finishUsePower(copyMsg, playerCharacter, casterLiveCounter, targetLiveCounter);
|
||||||
@@ -699,13 +692,7 @@ public enum PowersManager {
|
|||||||
if (pb.targetFromLastTarget() || pb.targetPet()) // use msg's target
|
if (pb.targetFromLastTarget() || pb.targetPet()) // use msg's target
|
||||||
if (pb.isAOE()) {
|
if (pb.isAOE()) {
|
||||||
if (!pb.usePointBlank()) {
|
if (!pb.usePointBlank()) {
|
||||||
AbstractWorldObject target;
|
AbstractWorldObject target = getTarget(msg);
|
||||||
if(msg.getTargetType() == 37 && Mob.dynamic_pets.get(msg.getTargetID()) != null){
|
|
||||||
Mob pet = Mob.dynamic_pets.get(msg.getTargetID());
|
|
||||||
target = pet;
|
|
||||||
}else{
|
|
||||||
target = getTarget(msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (target == null) {
|
if (target == null) {
|
||||||
@@ -720,13 +707,7 @@ public enum PowersManager {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// get target
|
// get target
|
||||||
AbstractWorldObject target;
|
AbstractWorldObject target = getTarget(msg);
|
||||||
if(msg.getTargetType() == 37 && Mob.dynamic_pets.get(msg.getTargetID()) != null){
|
|
||||||
Mob pet = Mob.dynamic_pets.get(msg.getTargetID());
|
|
||||||
target = pet;
|
|
||||||
}else{
|
|
||||||
target = getTarget(msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (target == null)
|
if (target == null)
|
||||||
return true;
|
return true;
|
||||||
@@ -771,10 +752,11 @@ public enum PowersManager {
|
|||||||
|
|
||||||
// make person casting stand up if spell (unless they're casting a chant which does not make them stand up)
|
// 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
|
// update cast (use skill) fail condition
|
||||||
|
if(pb.breaksForm)
|
||||||
caster.cancelOnCast();
|
caster.cancelOnCast();
|
||||||
|
|
||||||
// update castSpell (use spell) fail condition if spell
|
// update castSpell (use spell) fail condition if spell
|
||||||
if (pb.isSpell())
|
if (pb.isSpell() && pb.breaksForm)
|
||||||
caster.cancelOnSpell();
|
caster.cancelOnSpell();
|
||||||
|
|
||||||
// get cast time in ms.
|
// get cast time in ms.
|
||||||
@@ -810,8 +792,17 @@ public enum PowersManager {
|
|||||||
if (playerCharacter == null || msg == null)
|
if (playerCharacter == null || msg == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if(msg.getPowerUsedID() == 429005674){ //bard sprint
|
||||||
|
//use sprint instead of ballad of beregund the bold
|
||||||
|
//applyPower(playerCharacter,playerCharacter,playerCharacter.loc,429611355,msg.getNumTrains(),false);
|
||||||
|
msg.setPowerUsedID(429611355);
|
||||||
|
}
|
||||||
|
if(msg.getPowerUsedID() == 429494441) {//wildkins chase
|
||||||
|
playerCharacter.removeEffectBySource(EffectSourceType.Root,40,true);
|
||||||
|
playerCharacter.removeEffectBySource(EffectSourceType.Snare,40,true);
|
||||||
|
}
|
||||||
if (playerCharacter.isCasting()) {
|
if (playerCharacter.isCasting()) {
|
||||||
playerCharacter.update();
|
playerCharacter.update(false);
|
||||||
playerCharacter.updateStamRegen(-100);
|
playerCharacter.updateStamRegen(-100);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -913,6 +904,7 @@ public enum PowersManager {
|
|||||||
}
|
}
|
||||||
float range = pb.getRange() + speedRange;
|
float range = pb.getRange() + speedRange;
|
||||||
|
|
||||||
|
if(pb.token != 429396028) {
|
||||||
|
|
||||||
if (verifyInvalidRange(playerCharacter, mainTarget, range)) {
|
if (verifyInvalidRange(playerCharacter, mainTarget, range)) {
|
||||||
|
|
||||||
@@ -921,7 +913,7 @@ public enum PowersManager {
|
|||||||
}
|
}
|
||||||
// (pc.getLoc().distance(target.getLoc()) > pb.getRange()) {
|
// (pc.getLoc().distance(target.getLoc()) > pb.getRange()) {
|
||||||
// TODO send message that target is out of range
|
// TODO send message that target is out of range
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -943,6 +935,8 @@ public enum PowersManager {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
playerCharacter.setHateValue(pb.getHateValue(trains));
|
||||||
|
|
||||||
//Send Cast Message.
|
//Send Cast Message.
|
||||||
// PerformActionMsg castMsg = new PerformActionMsg(msg);
|
// PerformActionMsg castMsg = new PerformActionMsg(msg);
|
||||||
// castMsg.setNumTrains(9999);
|
// castMsg.setNumTrains(9999);
|
||||||
@@ -993,6 +987,8 @@ public enum PowersManager {
|
|||||||
//Power is aiding a target, handle aggro if combat target is a Mob.
|
//Power is aiding a target, handle aggro if combat target is a Mob.
|
||||||
if (!pb.isHarmful() && target.getObjectType() == GameObjectType.PlayerCharacter) {
|
if (!pb.isHarmful() && target.getObjectType() == GameObjectType.PlayerCharacter) {
|
||||||
PlayerCharacter pcTarget = (PlayerCharacter) target;
|
PlayerCharacter pcTarget = (PlayerCharacter) target;
|
||||||
|
if (!pb.isHarmful())
|
||||||
|
Mob.HandleAssistedAggro(playerCharacter, pcTarget);
|
||||||
}
|
}
|
||||||
|
|
||||||
// update target of used power timer
|
// update target of used power timer
|
||||||
@@ -1331,8 +1327,9 @@ public enum PowersManager {
|
|||||||
if (pc == null)
|
if (pc == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
PlayerCharacter target = SessionManager.getPlayerCharacterByLowerCaseName(msg.getTargetName());
|
PlayerCharacter target = SessionManager
|
||||||
if (target == null || target.equals(pc) || target.isCombat() || target.getGuild().getNation().equals(pc.getGuild().getNation()) == false) {
|
.getPlayerCharacterByLowerCaseName(msg.getTargetName());
|
||||||
|
if (target == null || target.equals(pc)) {
|
||||||
|
|
||||||
if (target == null) // Player not found. Send not found message
|
if (target == null) // Player not found. Send not found message
|
||||||
ChatManager.chatInfoError(pc,
|
ChatManager.chatInfoError(pc,
|
||||||
@@ -1341,10 +1338,7 @@ public enum PowersManager {
|
|||||||
ChatManager.chatInfoError(pc,
|
ChatManager.chatInfoError(pc,
|
||||||
"Cannot summon player in combat.");
|
"Cannot summon player in combat.");
|
||||||
// else trying to summon self, just fail
|
// else trying to summon self, just fail
|
||||||
if(target != null && target.getGuild().getNation().equals(pc.getGuild().getNation()) == false){
|
|
||||||
ChatManager.chatInfoError(pc,
|
|
||||||
"Cannot summon outside of nation.");
|
|
||||||
}
|
|
||||||
// recycle summon
|
// recycle summon
|
||||||
sendRecyclePower(msg.getPowerToken(), origin);
|
sendRecyclePower(msg.getPowerToken(), origin);
|
||||||
|
|
||||||
@@ -1376,7 +1370,7 @@ public enum PowersManager {
|
|||||||
if (source == null)
|
if (source == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
long tooLate = pc.getSummoner(source.getObjectUUID()) + 45000;
|
long tooLate = pc.getSummoner(source.getObjectUUID());
|
||||||
if (tooLate < System.currentTimeMillis()) {
|
if (tooLate < System.currentTimeMillis()) {
|
||||||
ChatManager.chatInfoError(pc, "You waited too long to " + (msg.accepted() ? "accept" : "decline") + " the summons.");
|
ChatManager.chatInfoError(pc, "You waited too long to " + (msg.accepted() ? "accept" : "decline") + " the summons.");
|
||||||
pc.removeSummoner(source.getObjectUUID());
|
pc.removeSummoner(source.getObjectUUID());
|
||||||
@@ -1438,15 +1432,17 @@ public enum PowersManager {
|
|||||||
duration = 15000; // Healer Summons, 15 seconds
|
duration = 15000; // Healer Summons, 15 seconds
|
||||||
else
|
else
|
||||||
duration = 45000; // Belgosh Summons, 45 seconds
|
duration = 45000; // Belgosh Summons, 45 seconds
|
||||||
if(pc.inSafeZone() == false) {
|
|
||||||
for (AbstractWorldObject absChar : WorldGrid.getObjectsInRangePartial(pc.loc, MBServerStatics.CHARACTER_LOAD_RANGE, MBServerStatics.MASK_PLAYER)) {
|
boolean enemiesNear = false;
|
||||||
PlayerCharacter player = (PlayerCharacter) absChar;
|
for(AbstractWorldObject awo : WorldGrid.getObjectsInRangePartial(pc.loc,MBServerStatics.CHARACTER_LOAD_RANGE, MBServerStatics.MASK_PLAYER)){
|
||||||
if (player.guild.getNation().equals(pc.guild.getNation()) == false) {
|
PlayerCharacter playerCharacter = (PlayerCharacter)awo;
|
||||||
|
if(!playerCharacter.guild.getNation().equals(pc.guild.getNation())){
|
||||||
|
enemiesNear = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(enemiesNear && !pc.isInSafeZone())
|
||||||
duration += 60000;
|
duration += 60000;
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Teleport to summoners location
|
// Teleport to summoners location
|
||||||
FinishSummonsJob fsj = new FinishSummonsJob(source, pc);
|
FinishSummonsJob fsj = new FinishSummonsJob(source, pc);
|
||||||
@@ -1572,44 +1568,18 @@ public enum PowersManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// create list of characters
|
// create list of characters
|
||||||
HashSet<AbstractCharacter> trackChars = RangeBasedAwo.getTrackList(
|
HashSet<AbstractCharacter> trackChars;
|
||||||
allTargets, playerCharacter, maxTargets);
|
switch(msg.getPowerToken()){
|
||||||
|
case 431511776:
|
||||||
trackChars = new HashSet<>();
|
case 429578587:
|
||||||
HashSet<AbstractWorldObject> allInRange = WorldGrid.getObjectsInRangePartial(playerCharacter.loc,MBServerStatics.CHARACTER_LOAD_RANGE,MBServerStatics.MASK_PLAYER);
|
case 429503360:
|
||||||
//ArrayList<Guild> nationsInRange = new ArrayList<>();
|
trackChars = getTrackList(playerCharacter);
|
||||||
ArrayList<AbstractWorldObject> purgeList = new ArrayList<>();
|
break;
|
||||||
for(AbstractWorldObject trackChar : allInRange) {
|
default:
|
||||||
if(trackChar.equals(playerCharacter) || !trackChar.isAlive() || !((PlayerCharacter)trackChar).isActive())
|
trackChars = RangeBasedAwo.getTrackList(allTargets, playerCharacter, maxTargets);
|
||||||
purgeList.add(trackChar);
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
allInRange.removeAll(purgeList);
|
|
||||||
|
|
||||||
//first round to add players in range
|
|
||||||
for(AbstractWorldObject trackChar : allInRange){
|
|
||||||
if(trackChar.equals(playerCharacter) || !trackChar.isAlive() || !((PlayerCharacter)trackChar).isActive())
|
|
||||||
continue;
|
|
||||||
if(allInRange.contains(trackChar)) {
|
|
||||||
trackChars.add((AbstractCharacter)trackChar);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//track full range for chaining nation members
|
|
||||||
ArrayList<Guild> nationsInRange = new ArrayList<>();
|
|
||||||
for(AbstractCharacter pc : trackChars){
|
|
||||||
if(nationsInRange.contains(pc.guild.getNation()) == false)
|
|
||||||
nationsInRange.add(pc.guild.getNation());
|
|
||||||
}
|
|
||||||
HashSet<AbstractWorldObject> fullRange = WorldGrid.getObjectsInRangePartial(playerCharacter.loc,1024,MBServerStatics.MASK_PLAYER);
|
|
||||||
for(AbstractWorldObject trackChar : fullRange) {
|
|
||||||
if(trackChar.equals(playerCharacter) || !trackChar.isAlive() || !((PlayerCharacter)trackChar).isActive())
|
|
||||||
continue;
|
|
||||||
if(nationsInRange.contains(((PlayerCharacter) trackChar).guild.getNation()) && trackChars.contains(trackChar) == false)
|
|
||||||
trackChars.add((AbstractCharacter)trackChar);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
TrackWindowMsg trackWindowMsg = new TrackWindowMsg(msg);
|
TrackWindowMsg trackWindowMsg = new TrackWindowMsg(msg);
|
||||||
|
|
||||||
// send track window
|
// send track window
|
||||||
@@ -1621,6 +1591,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) {
|
private static void sendRecyclePower(int token, ClientConnection origin) {
|
||||||
RecyclePowerMsg recyclePowerMsg = new RecyclePowerMsg(token);
|
RecyclePowerMsg recyclePowerMsg = new RecyclePowerMsg(token);
|
||||||
|
|
||||||
@@ -1785,8 +1779,7 @@ public enum PowersManager {
|
|||||||
ac.setItemCasting(false);
|
ac.setItemCasting(false);
|
||||||
if (ac == null || target == null || pb == null)
|
if (ac == null || target == null || pb == null)
|
||||||
return;
|
return;
|
||||||
if(pb.targetSelf)
|
|
||||||
target = ac;
|
|
||||||
ac.clearTimer(Integer.toString(pb.getToken()));
|
ac.clearTimer(Integer.toString(pb.getToken()));
|
||||||
if (liveCounter == ac.getLiveCounter())
|
if (liveCounter == ac.getLiveCounter())
|
||||||
finishApplyPowerA(ac, target, targetLoc, pb, trains, false);
|
finishApplyPowerA(ac, target, targetLoc, pb, trains, false);
|
||||||
@@ -2335,7 +2328,7 @@ public enum PowersManager {
|
|||||||
|
|
||||||
// set player is not casting for regens
|
// set player is not casting for regens
|
||||||
if (pc.isCasting()) {
|
if (pc.isCasting()) {
|
||||||
pc.update();
|
pc.update(false);
|
||||||
}
|
}
|
||||||
pc.setIsCasting(false);
|
pc.setIsCasting(false);
|
||||||
|
|
||||||
@@ -2367,9 +2360,9 @@ public enum PowersManager {
|
|||||||
|
|
||||||
int type = msg.getTargetType();
|
int type = msg.getTargetType();
|
||||||
int UUID = msg.getTargetID();
|
int UUID = msg.getTargetID();
|
||||||
if (type == -1 || type == 0 || UUID == -1 || UUID == 0) {
|
|
||||||
|
if (type == -1 || type == 0 || UUID == -1 || UUID == 0)
|
||||||
return null;
|
return null;
|
||||||
}
|
|
||||||
|
|
||||||
return (AbstractWorldObject) DbManager.getObject(GameObjectType.values()[type], UUID);
|
return (AbstractWorldObject) DbManager.getObject(GameObjectType.values()[type], UUID);
|
||||||
}
|
}
|
||||||
@@ -2387,22 +2380,26 @@ public enum PowersManager {
|
|||||||
defense = 0f;
|
defense = 0f;
|
||||||
// Get hit chance
|
// Get hit chance
|
||||||
|
|
||||||
if (pc.getDebug(16)) {
|
//if (pc.getDebug(16)) {
|
||||||
String smsg = "ATR: " + atr + ", Defense: " + defense;
|
// String smsg = "ATR: " + atr + ", Defense: " + defense;
|
||||||
ChatManager.chatSystemInfo(pc, smsg);
|
// ChatManager.chatSystemInfo(pc, smsg);
|
||||||
}
|
//}
|
||||||
|
|
||||||
float constant = (atr+defense)*0.315f;
|
//int chance;
|
||||||
float atrChance = atr - constant;
|
|
||||||
float defChance = defense - constant + atrChance;
|
//if (atr > defense || defense == 0)
|
||||||
float smallChance = atrChance/defChance;
|
// chance = 94;
|
||||||
int chance = (int)(smallChance * 100);
|
//else {
|
||||||
|
// float dif = atr / defense;
|
||||||
|
// if (dif <= 0.8f)
|
||||||
|
// chance = 4;
|
||||||
|
// else
|
||||||
|
// chance = ((int) (450 * (dif - 0.8f)) + 4);
|
||||||
|
//}
|
||||||
|
|
||||||
// calculate hit/miss
|
// calculate hit/miss
|
||||||
int roll = ThreadLocalRandom.current().nextInt(100);
|
|
||||||
|
|
||||||
boolean disable = true;
|
if (CombatManager.LandHit((int)atr,(int)defense)) {
|
||||||
if (roll < chance) {
|
|
||||||
// Hit, check if dodge kicked in
|
// Hit, check if dodge kicked in
|
||||||
if (awo instanceof AbstractCharacter) {
|
if (awo instanceof AbstractCharacter) {
|
||||||
AbstractCharacter tarAc = (AbstractCharacter) awo;
|
AbstractCharacter tarAc = (AbstractCharacter) awo;
|
||||||
@@ -2604,11 +2601,11 @@ public enum PowersManager {
|
|||||||
ChatManager.chatSystemInfo(pc, outmsg);
|
ChatManager.chatSystemInfo(pc, outmsg);
|
||||||
return false; // can't target player, stop here
|
return false; // can't target player, stop here
|
||||||
} // target is mob
|
} // target is mob
|
||||||
else if ((target.getObjectTypeMask() & MBServerStatics.MASK_MOB) != 0 && ((Mob)target).isPet() == false)
|
else if ((target.getObjectTypeMask() & MBServerStatics.MASK_MOB) != 0)
|
||||||
return pb.targetMob();
|
return pb.targetMob();
|
||||||
|
|
||||||
// target is pet
|
// target is pet
|
||||||
else if ((target.getObjectTypeMask() & MBServerStatics.MASK_MOB) != 0 && ((Mob)target).isPet() == true)
|
else if ((target.getObjectTypeMask() & MBServerStatics.MASK_PET) != 0)
|
||||||
return pb.targetPet();
|
return pb.targetPet();
|
||||||
|
|
||||||
// target is Building
|
// target is Building
|
||||||
@@ -2687,7 +2684,7 @@ public enum PowersManager {
|
|||||||
|
|
||||||
PowersBase power = getLastPower(ac);
|
PowersBase power = getLastPower(ac);
|
||||||
|
|
||||||
if (power != null && power.cancelOnTakeDamage() && power.getName().equals("Translocate") == false)
|
if (power != null && power.cancelOnTakeDamage())
|
||||||
cancelPower(ac, true);
|
cancelPower(ac, true);
|
||||||
cancelItems(ac, false, true);
|
cancelItems(ac, false, true);
|
||||||
ac.cancelTimer("Stuck");
|
ac.cancelTimer("Stuck");
|
||||||
@@ -2702,7 +2699,9 @@ public enum PowersManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static void cancelOnStun(AbstractCharacter ac) {
|
public static void cancelOnStun(AbstractCharacter ac) {
|
||||||
|
if(ac.getObjectType().equals(GameObjectType.PlayerCharacter)){
|
||||||
|
//PlayerCharacter.GroundPlayer((PlayerCharacter)ac);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static PowersBase getLastPower(AbstractCharacter ac) {
|
private static PowersBase getLastPower(AbstractCharacter ac) {
|
||||||
@@ -2847,11 +2846,125 @@ public enum PowersManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public static void applyZergBuff(AbstractGameObject obj){
|
|
||||||
|
|
||||||
|
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:
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
public static void removeZergBuff(HashSet<Integer> playersIDs){
|
return true;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,11 +10,6 @@ package engine.gameManager;
|
|||||||
|
|
||||||
import engine.Enum;
|
import engine.Enum;
|
||||||
import engine.Enum.GameObjectType;
|
import engine.Enum.GameObjectType;
|
||||||
import engine.InterestManagement.WorldGrid;
|
|
||||||
import engine.db.archive.DataWarehouse;
|
|
||||||
import engine.db.archive.MineRecord;
|
|
||||||
import engine.net.DispatchMessage;
|
|
||||||
import engine.net.client.msg.chat.ChatSystemMsg;
|
|
||||||
import engine.objects.*;
|
import engine.objects.*;
|
||||||
import org.pmw.tinylog.Logger;
|
import org.pmw.tinylog.Logger;
|
||||||
|
|
||||||
@@ -24,7 +19,6 @@ import java.sql.ResultSet;
|
|||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.time.Duration;
|
import java.time.Duration;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.time.LocalDateTime;
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -36,14 +30,13 @@ public enum SimulationManager {
|
|||||||
SERVERHEARTBEAT;
|
SERVERHEARTBEAT;
|
||||||
|
|
||||||
private static final long CITY_PULSE = 2000;
|
private static final long CITY_PULSE = 2000;
|
||||||
private static final long RUNEGATE_PULSE = 500;
|
private static final long RUNEGATE_PULSE = 1000;
|
||||||
private static final long UPDATE_PULSE = 1000;
|
private static final long UPDATE_PULSE = 1000;
|
||||||
private static final long FlIGHT_PULSE = 100;
|
private static final long FlIGHT_PULSE = 100;
|
||||||
public static Duration executionTime = Duration.ofNanos(1);
|
public static Duration executionTime = Duration.ofNanos(1);
|
||||||
public static Duration executionMax = Duration.ofNanos(1);
|
public static Duration executionMax = Duration.ofNanos(1);
|
||||||
private static SimulationManager instance = null;
|
private static SimulationManager instance = null;
|
||||||
private long _cityPulseTime = System.currentTimeMillis() + CITY_PULSE;
|
private long _cityPulseTime = System.currentTimeMillis() + CITY_PULSE;
|
||||||
private long _minePulseTime = System.currentTimeMillis() + CITY_PULSE;
|
|
||||||
private long _runegatePulseTime = System.currentTimeMillis()
|
private long _runegatePulseTime = System.currentTimeMillis()
|
||||||
+ RUNEGATE_PULSE;
|
+ RUNEGATE_PULSE;
|
||||||
private long _updatePulseTime = System.currentTimeMillis() + UPDATE_PULSE;
|
private long _updatePulseTime = System.currentTimeMillis() + UPDATE_PULSE;
|
||||||
@@ -73,8 +66,6 @@ public enum SimulationManager {
|
|||||||
return popString;
|
return popString;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Update the simulation. *** Important: Whatever you do in here, do it damn
|
* Update the simulation. *** Important: Whatever you do in here, do it damn
|
||||||
* quick!
|
* quick!
|
||||||
@@ -122,27 +113,26 @@ public enum SimulationManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if ((_cityPulseTime != 0)
|
if ((_cityPulseTime != 0) && (System.currentTimeMillis() > _cityPulseTime)) {
|
||||||
&& (System.currentTimeMillis() > _cityPulseTime))
|
try {
|
||||||
pulseCities();
|
pulseCities();
|
||||||
}catch(Exception e){
|
}catch(Exception e){
|
||||||
|
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
ArenaManager.pulseArenas();
|
||||||
|
}catch(Exception e){
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
Logger.error(
|
Logger.error(
|
||||||
"Fatal error in City Pulse: DISABLED. Error Message : "
|
"Fatal error in City Pulse: DISABLED. Error Message : "
|
||||||
+ e.getMessage());
|
+ e.getMessage());
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
|
||||||
}
|
}
|
||||||
//try {
|
|
||||||
// if ((_minePulseTime != 0)
|
|
||||||
// && (System.currentTimeMillis() > _minePulseTime))
|
|
||||||
// pulseMines();
|
|
||||||
//} catch (Exception e) {
|
|
||||||
// Logger.error(
|
|
||||||
// "Fatal error in Mine Pulse: DISABLED. Error Message : "
|
|
||||||
// + e.getMessage());
|
|
||||||
// e.printStackTrace();
|
|
||||||
|
|
||||||
//}
|
|
||||||
SimulationManager.executionTime = Duration.between(startTime, Instant.now());
|
SimulationManager.executionTime = Duration.between(startTime, Instant.now());
|
||||||
|
|
||||||
if (executionTime.compareTo(executionMax) > 0)
|
if (executionTime.compareTo(executionMax) > 0)
|
||||||
@@ -170,7 +160,7 @@ public enum SimulationManager {
|
|||||||
|
|
||||||
if (player == null)
|
if (player == null)
|
||||||
continue;
|
continue;
|
||||||
player.update();
|
player.update(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
_updatePulseTime = System.currentTimeMillis() + 500;
|
_updatePulseTime = System.currentTimeMillis() + 500;
|
||||||
@@ -219,7 +209,12 @@ public enum SimulationManager {
|
|||||||
city = (City) cityObject;
|
city = (City) cityObject;
|
||||||
city.onEnter();
|
city.onEnter();
|
||||||
}
|
}
|
||||||
|
for(Mine mine : Mine.getMines()){
|
||||||
|
if(mine != null && mine.isActive)
|
||||||
|
mine.onEnter();
|
||||||
|
}
|
||||||
_cityPulseTime = System.currentTimeMillis() + CITY_PULSE;
|
_cityPulseTime = System.currentTimeMillis() + CITY_PULSE;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -229,6 +224,10 @@ public enum SimulationManager {
|
|||||||
private void pulseRunegates() {
|
private void pulseRunegates() {
|
||||||
|
|
||||||
for (Runegate runegate : Runegate._runegates.values()) {
|
for (Runegate runegate : Runegate._runegates.values()) {
|
||||||
|
for(Portal portal : runegate._portals)
|
||||||
|
if(!portal.isActive())
|
||||||
|
portal.activate(false);
|
||||||
|
|
||||||
runegate.collidePortals();
|
runegate.collidePortals();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,58 +1,195 @@
|
|||||||
package engine.gameManager;
|
package engine.gameManager;
|
||||||
|
|
||||||
import engine.objects.Guild;
|
import engine.objects.Guild;
|
||||||
|
|
||||||
public class ZergManager {
|
public class ZergManager {
|
||||||
|
|
||||||
public static int getBaneCap(Guild guild) {
|
|
||||||
|
|
||||||
if(guild.getOwnedCity() == null || guild.getOwnedCity().getTOL() == null)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
int cityRank = guild.getOwnedCity().getTOL().getRank();
|
|
||||||
return (cityRank == 8) ? 20 : ((guild.getNation().getSubGuildList().size() + 1 <= 4) ? 10 : 20);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static float getCurrentMultiplier(int count, int maxCount){
|
public static float getCurrentMultiplier(int count, int maxCount){
|
||||||
switch(maxCount) {
|
switch(maxCount) {
|
||||||
case 3:
|
case 3: return getMultiplier3Man(count);
|
||||||
return getMultiplier3Man(count);
|
case 5: return getMultiplier5Man(count);
|
||||||
case 5:
|
case 10: return getMultiplier10Man(count);
|
||||||
return getMultiplier5Man(count);
|
case 20: return getMultiplier20Man(count);
|
||||||
case 10:
|
case 30: return getMultiplier30Man(count);
|
||||||
return getMultiplier10Man(count);
|
case 40: return getMultiplier40Man(count);
|
||||||
case 20:
|
default: return 1.0f; //unlimited
|
||||||
return getMultiplier20Man(count);
|
|
||||||
default:
|
|
||||||
return getMultiplier40Man(count);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public static float getMultiplier(int count, int maxCount, float[] thresholds) {
|
|
||||||
if (count <= maxCount) return 1.0f;
|
|
||||||
if (count > thresholds.length) return 0.0f;
|
|
||||||
return 1.0f - thresholds[count - maxCount - 1];
|
|
||||||
}
|
|
||||||
|
|
||||||
public static float getMultiplier3Man(int count) {
|
public static float getMultiplier3Man(int count) {
|
||||||
float[] thresholds = {0.37f, 0.60f, 0.75f};
|
if(count < 4)
|
||||||
return getMultiplier(count, 3, thresholds);
|
return 1.0f;
|
||||||
}
|
|
||||||
|
|
||||||
|
if(count > 6)
|
||||||
|
return 0.0f;
|
||||||
|
|
||||||
|
switch(count){
|
||||||
|
case 4: return 0.63f;
|
||||||
|
case 5: return 0.40f;
|
||||||
|
case 6: return 0.25f;
|
||||||
|
default: return 1.0f;
|
||||||
|
}
|
||||||
|
}
|
||||||
public static float getMultiplier5Man(int count) {
|
public static float getMultiplier5Man(int count) {
|
||||||
float[] thresholds = {0.25f, 0.43f, 0.56f, 0.67f, 0.75f};
|
if(count < 6)
|
||||||
return getMultiplier(count, 5, thresholds);
|
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) {
|
public static float getMultiplier10Man(int count) {
|
||||||
float[] thresholds = {0.14f, 0.25f, 0.35f, 0.43f, 0.50f, 0.56f, 0.62f, 0.67f, 0.71f, 0.75f};
|
if(count < 11)
|
||||||
return getMultiplier(count, 10, thresholds);
|
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) {
|
public static float getMultiplier20Man(int count) {
|
||||||
return getMultiplier10Man(count * 2);
|
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) {
|
public static float getMultiplier40Man(int count) {
|
||||||
return getMultiplier10Man(count * 4);
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -19,14 +19,12 @@ import engine.objects.Building;
|
|||||||
import engine.objects.City;
|
import engine.objects.City;
|
||||||
import engine.objects.Zone;
|
import engine.objects.Zone;
|
||||||
import engine.server.MBServerStatics;
|
import engine.server.MBServerStatics;
|
||||||
import org.pmw.tinylog.Logger;
|
|
||||||
|
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.time.ZoneId;
|
import java.time.ZoneId;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.concurrent.ThreadLocalRandom;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Class contains methods and structures which
|
* 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
|
// Resets the availability of hotZones
|
||||||
// for this cycle
|
// for this cycle
|
||||||
|
|
||||||
@@ -217,63 +201,6 @@ public enum ZoneManager {
|
|||||||
ZoneManager.playerCityZones.add(zone);
|
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.
|
// Converts world coordinates to coordinates local to a given zone.
|
||||||
|
|
||||||
public static Vector3fImmutable worldToLocal(Vector3fImmutable worldVector,
|
public static Vector3fImmutable worldToLocal(Vector3fImmutable worldVector,
|
||||||
|
|||||||
@@ -117,7 +117,7 @@ public abstract class AbstractEffectJob extends AbstractScheduleJob {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void endEffect() {
|
public void endEffect() {
|
||||||
if (this.eb == null)
|
if (this.eb == null || this.power == null)
|
||||||
return;
|
return;
|
||||||
this.eb.endEffect(this.source, this.target, this.trains, this.power, this);
|
this.eb.endEffect(this.source, this.target, this.trains, this.power, this);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,13 +15,9 @@ import engine.gameManager.DbManager;
|
|||||||
import engine.job.AbstractScheduleJob;
|
import engine.job.AbstractScheduleJob;
|
||||||
import engine.net.DispatchMessage;
|
import engine.net.DispatchMessage;
|
||||||
import engine.net.client.msg.chat.ChatSystemMsg;
|
import engine.net.client.msg.chat.ChatSystemMsg;
|
||||||
import engine.objects.Bane;
|
|
||||||
import engine.objects.City;
|
import engine.objects.City;
|
||||||
import engine.workthreads.ZergMechanicThread;
|
|
||||||
import org.pmw.tinylog.Logger;
|
import org.pmw.tinylog.Logger;
|
||||||
|
|
||||||
import static engine.workthreads.ZergMechanicThread.startZergThreadBane;
|
|
||||||
|
|
||||||
public class ActivateBaneJob extends AbstractScheduleJob {
|
public class ActivateBaneJob extends AbstractScheduleJob {
|
||||||
|
|
||||||
private final int cityUUID;
|
private final int cityUUID;
|
||||||
@@ -71,10 +67,6 @@ public class ActivateBaneJob extends AbstractScheduleJob {
|
|||||||
msg.setChannel(ChatChannelType.SYSTEM.getChannelID());
|
msg.setChannel(ChatChannelType.SYSTEM.getChannelID());
|
||||||
|
|
||||||
DispatchMessage.dispatchMsgToAll(msg);
|
DispatchMessage.dispatchMsgToAll(msg);
|
||||||
|
|
||||||
if(city.getBane() != null) {
|
|
||||||
startZergThreadBane(city.getBane());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -9,11 +9,9 @@
|
|||||||
|
|
||||||
package engine.jobs;
|
package engine.jobs;
|
||||||
|
|
||||||
import engine.Enum;
|
|
||||||
import engine.gameManager.CombatManager;
|
import engine.gameManager.CombatManager;
|
||||||
import engine.job.AbstractJob;
|
import engine.job.AbstractJob;
|
||||||
import engine.objects.AbstractCharacter;
|
import engine.objects.AbstractCharacter;
|
||||||
import engine.objects.PlayerCharacter;
|
|
||||||
|
|
||||||
public class AttackJob extends AbstractJob {
|
public class AttackJob extends AbstractJob {
|
||||||
|
|
||||||
@@ -31,9 +29,6 @@ public class AttackJob extends AbstractJob {
|
|||||||
@Override
|
@Override
|
||||||
protected void doJob() {
|
protected void doJob() {
|
||||||
CombatManager.doCombat(this.source, slot);
|
CombatManager.doCombat(this.source, slot);
|
||||||
if(this.source.getObjectType().equals(Enum.GameObjectType.PlayerCharacter))
|
|
||||||
if(((PlayerCharacter)this.source).getHidden() > 0)
|
|
||||||
this.source.removeEffectBySource(Enum.EffectSourceType.Invisibility,41,true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean success() {
|
public boolean success() {
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ public class EndFearJob extends AbstractEffectJob {
|
|||||||
if (this.target == null || (!(this.target instanceof Mob)))
|
if (this.target == null || (!(this.target instanceof Mob)))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
((Mob) this.target).fearedObject = null;
|
((Mob) this.target).setFearedObject(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -40,6 +40,6 @@ public class EndFearJob extends AbstractEffectJob {
|
|||||||
if (this.target == null || (!(this.target instanceof Mob)))
|
if (this.target == null || (!(this.target instanceof Mob)))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
((Mob) this.target).fearedObject = null;
|
((Mob) this.target).setFearedObject(null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,13 +47,13 @@ public class FinishSummonsJob extends AbstractScheduleJob {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
// cannot summon a player in combat
|
// 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);
|
// PowersManager.finishRecycleTime(428523680, this.source, false);
|
||||||
return;
|
// return;
|
||||||
}
|
//}
|
||||||
|
|
||||||
if (this.target.getBonuses() != null && this.target.getBonuses().getBool(ModType.BlockedPowerType, SourceType.SUMMON)) {
|
if (this.target.getBonuses() != null && this.target.getBonuses().getBool(ModType.BlockedPowerType, SourceType.SUMMON)) {
|
||||||
ErrorPopupMsg.sendErrorMsg(this.target, "You have been blocked from receiving summons!");
|
ErrorPopupMsg.sendErrorMsg(this.target, "You have been blocked from receiving summons!");
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
package engine.jobs;
|
package engine.jobs;
|
||||||
|
|
||||||
|
import engine.gameManager.ZoneManager;
|
||||||
import engine.job.AbstractScheduleJob;
|
import engine.job.AbstractScheduleJob;
|
||||||
import engine.objects.Building;
|
import engine.objects.Building;
|
||||||
|
import engine.objects.City;
|
||||||
import org.pmw.tinylog.Logger;
|
import org.pmw.tinylog.Logger;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -41,6 +43,18 @@ public class UpgradeBuildingJob extends AbstractScheduleJob {
|
|||||||
|
|
||||||
rankingBuilding.setRank(rankingBuilding.getRank() + 1);
|
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
|
// Reload the object
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -9,10 +9,12 @@
|
|||||||
package engine.loot;
|
package engine.loot;
|
||||||
|
|
||||||
import engine.gameManager.LootManager;
|
import engine.gameManager.LootManager;
|
||||||
|
import org.pmw.tinylog.Logger;
|
||||||
|
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.concurrent.ThreadLocalRandom;
|
||||||
|
|
||||||
public class ItemTableEntry {
|
public class ItemTableEntry {
|
||||||
public int minRoll;
|
public int minRoll;
|
||||||
@@ -35,11 +37,23 @@ public class ItemTableEntry {
|
|||||||
List<ItemTableEntry> itemTableEntryList;
|
List<ItemTableEntry> itemTableEntryList;
|
||||||
|
|
||||||
itemTableEntryList = LootManager._itemTables.get(itemTable);
|
itemTableEntryList = LootManager._itemTables.get(itemTable);
|
||||||
|
if(itemTableEntryList != null) {
|
||||||
for (ItemTableEntry iteration : itemTableEntryList)
|
for (ItemTableEntry iteration : itemTableEntryList)
|
||||||
if (roll >= iteration.minRoll && roll <= iteration.maxRoll)
|
if (roll >= iteration.minRoll && roll <= iteration.maxRoll)
|
||||||
itemTableEntry = iteration;
|
itemTableEntry = iteration;
|
||||||
|
}
|
||||||
return itemTableEntry;
|
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,13 +33,8 @@ public class ModTableEntry {
|
|||||||
List<ModTableEntry> itemTableEntryList;
|
List<ModTableEntry> itemTableEntryList;
|
||||||
|
|
||||||
itemTableEntryList = LootManager._modTables.get(modTablwe);
|
itemTableEntryList = LootManager._modTables.get(modTablwe);
|
||||||
|
if(itemTableEntryList != null) {
|
||||||
if(itemTableEntryList == null)
|
for (ModTableEntry iteration : itemTableEntryList)
|
||||||
return null;
|
|
||||||
|
|
||||||
for (ModTableEntry iteration : itemTableEntryList) {
|
|
||||||
if (iteration == null)
|
|
||||||
continue;
|
|
||||||
if (roll >= iteration.minRoll && roll <= iteration.maxRoll)
|
if (roll >= iteration.minRoll && roll <= iteration.maxRoll)
|
||||||
modTableEntry = iteration;
|
modTableEntry = iteration;
|
||||||
}
|
}
|
||||||
|
|||||||
+514
-187
File diff suppressed because it is too large
Load Diff
@@ -13,7 +13,7 @@ public class MobAIThread implements Runnable{
|
|||||||
public static int AI_DROP_AGGRO_RANGE = 60;
|
public static int AI_DROP_AGGRO_RANGE = 60;
|
||||||
public static int AI_PULSE_MOB_THRESHOLD = 200;
|
public static int AI_PULSE_MOB_THRESHOLD = 200;
|
||||||
public static int AI_PATROL_DIVISOR = 15;
|
public static int AI_PATROL_DIVISOR = 15;
|
||||||
public static float AI_CAST_FREQUENCY = 1.0f;
|
public static float AI_CAST_FREQUENCY;
|
||||||
// Thread constructor
|
// Thread constructor
|
||||||
|
|
||||||
public MobAIThread() {
|
public MobAIThread() {
|
||||||
@@ -28,20 +28,28 @@ public class MobAIThread implements Runnable{
|
|||||||
AI_BASE_AGGRO_RANGE = (int)(60 * Float.parseFloat(ConfigManager.MB_AI_AGGRO_RANGE.getValue()));
|
AI_BASE_AGGRO_RANGE = (int)(60 * Float.parseFloat(ConfigManager.MB_AI_AGGRO_RANGE.getValue()));
|
||||||
while (true) {
|
while (true) {
|
||||||
for (Zone zone : ZoneManager.getAllZones()) {
|
for (Zone zone : ZoneManager.getAllZones()) {
|
||||||
|
if (zone != null && zone.zoneMobSet != null) {
|
||||||
|
synchronized (zone.zoneMobSet) {
|
||||||
for (Mob mob : zone.zoneMobSet) {
|
for (Mob mob : zone.zoneMobSet) {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (mob != null)
|
if (mob != null) {
|
||||||
MobAI.DetermineAction(mob);
|
MobAI.DetermineAction(mob);
|
||||||
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Logger.error("Mob: " + mob.getName() + " UUID: " + mob.getObjectUUID() + " ERROR: " + e);
|
Logger.error("Error processing Mob [Name: {}, UUID: {}]", mob.getName(), mob.getObjectUUID(), e);
|
||||||
e.printStackTrace();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
try {
|
||||||
|
Thread.sleep(100);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
Logger.error("AI Thread interrupted", e);
|
||||||
|
Thread.currentThread().interrupt();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
public static void startAIThread() {
|
public static void startAIThread() {
|
||||||
Thread aiThread;
|
Thread aiThread;
|
||||||
aiThread = new Thread(new MobAIThread());
|
aiThread = new Thread(new MobAIThread());
|
||||||
|
|||||||
@@ -13,6 +13,9 @@ import engine.objects.Mob;
|
|||||||
import engine.objects.Zone;
|
import engine.objects.Zone;
|
||||||
import org.pmw.tinylog.Logger;
|
import org.pmw.tinylog.Logger;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Thread blocks until MagicBane dispatch messages are
|
* Thread blocks until MagicBane dispatch messages are
|
||||||
* enqueued then processes them in FIFO order. The collection
|
* enqueued then processes them in FIFO order. The collection
|
||||||
@@ -25,41 +28,49 @@ import org.pmw.tinylog.Logger;
|
|||||||
|
|
||||||
public class MobRespawnThread implements Runnable {
|
public class MobRespawnThread implements Runnable {
|
||||||
|
|
||||||
|
private volatile boolean running = true;
|
||||||
|
private static final long RESPAWN_INTERVAL = 100; // Configurable interval
|
||||||
|
|
||||||
public MobRespawnThread() {
|
public MobRespawnThread() {
|
||||||
Logger.info(" MobRespawnThread thread has started!");
|
Logger.info("MobRespawnThread initialized.");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
|
while (running) {
|
||||||
while (true) {
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
for (Zone zone : ZoneManager.getAllZones()) {
|
Collection<Zone> zones = ZoneManager.getAllZones();
|
||||||
|
if (zones != null) {
|
||||||
if (zone.respawnQue.isEmpty() == false && zone.lastRespawn + 100 < System.currentTimeMillis()) {
|
for (Zone zone : zones) {
|
||||||
|
synchronized (zone) { // Optional: Synchronize on zone
|
||||||
|
if (!zone.respawnQue.isEmpty() &&
|
||||||
|
zone.lastRespawn + RESPAWN_INTERVAL < System.currentTimeMillis()) {
|
||||||
|
|
||||||
Mob respawner = zone.respawnQue.iterator().next();
|
Mob respawner = zone.respawnQue.iterator().next();
|
||||||
|
if (respawner != null) {
|
||||||
if (respawner == null)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
respawner.respawn();
|
respawner.respawn();
|
||||||
zone.respawnQue.remove(respawner);
|
zone.respawnQue.remove(respawner);
|
||||||
zone.lastRespawn = System.currentTimeMillis();
|
zone.lastRespawn = System.currentTimeMillis();
|
||||||
|
Thread.sleep(100);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Thread.sleep(100); // Prevent busy-waiting
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Logger.error(e);
|
Logger.error("Error in MobRespawnThread", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Logger.info("MobRespawnThread stopped.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void stop() {
|
||||||
|
running = false;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
public static void startRespawnThread() {
|
public static void startRespawnThread() {
|
||||||
Thread respawnThread;
|
Thread respawnThread = new Thread(new MobRespawnThread());
|
||||||
respawnThread = new Thread(new MobRespawnThread());
|
|
||||||
respawnThread.setName("respawnThread");
|
respawnThread.setName("respawnThread");
|
||||||
respawnThread.start();
|
respawnThread.start();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,20 +12,13 @@ package engine.mobileAI.utilities;
|
|||||||
import engine.Enum.*;
|
import engine.Enum.*;
|
||||||
import engine.gameManager.ChatManager;
|
import engine.gameManager.ChatManager;
|
||||||
import engine.gameManager.CombatManager;
|
import engine.gameManager.CombatManager;
|
||||||
import engine.gameManager.PowersManager;
|
|
||||||
import engine.math.Vector3fImmutable;
|
import engine.math.Vector3fImmutable;
|
||||||
import engine.mobileAI.MobAI;
|
|
||||||
import engine.mobileAI.Threads.MobAIThread;
|
|
||||||
import engine.net.DispatchMessage;
|
import engine.net.DispatchMessage;
|
||||||
import engine.net.client.msg.PerformActionMsg;
|
|
||||||
import engine.net.client.msg.TargetedActionMsg;
|
import engine.net.client.msg.TargetedActionMsg;
|
||||||
import engine.objects.*;
|
import engine.objects.*;
|
||||||
import engine.powers.ActionsBase;
|
|
||||||
import engine.powers.PowersBase;
|
|
||||||
import engine.server.MBServerStatics;
|
import engine.server.MBServerStatics;
|
||||||
import org.pmw.tinylog.Logger;
|
import org.pmw.tinylog.Logger;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.concurrent.ThreadLocalRandom;
|
import java.util.concurrent.ThreadLocalRandom;
|
||||||
|
|
||||||
import static engine.math.FastMath.sqr;
|
import static engine.math.FastMath.sqr;
|
||||||
@@ -55,7 +48,7 @@ public class CombatUtilities {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static boolean inRange2D(AbstractWorldObject entity1, AbstractWorldObject entity2, double range) {
|
public static boolean inRange2D(AbstractWorldObject entity1, AbstractWorldObject entity2, double range) {
|
||||||
return entity1.getLoc().distanceSquared2D(entity2.getLoc()) < range * range;
|
return entity1.getLoc().distance2D(entity2.getLoc()) < range;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void swingIsBlock(Mob agent, AbstractWorldObject target, int animation) {
|
public static void swingIsBlock(Mob agent, AbstractWorldObject target, int animation) {
|
||||||
@@ -146,37 +139,26 @@ public class CombatUtilities {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static boolean triggerDefense(Mob agent, AbstractWorldObject target) {
|
public static boolean triggerDefense(Mob agent, AbstractWorldObject target) {
|
||||||
int defenseScore = 0;
|
int defense = 0;
|
||||||
int attackScore = agent.getAtrHandOne();
|
int atr = agent.mobBase.getAtr();
|
||||||
|
if(agent.getBonuses() != null){
|
||||||
|
atr += agent.getBonuses().getFloat(ModType.OCV,SourceType.None);
|
||||||
|
atr *= 1 + agent.getBonuses().getFloatPercentAll(ModType.OCV,SourceType.None);
|
||||||
|
}
|
||||||
switch (target.getObjectType()) {
|
switch (target.getObjectType()) {
|
||||||
case PlayerCharacter:
|
case PlayerCharacter:
|
||||||
defenseScore = ((AbstractCharacter) target).getDefenseRating();
|
defense = ((AbstractCharacter) target).getDefenseRating();
|
||||||
break;
|
break;
|
||||||
case Mob:
|
case Mob:
|
||||||
|
|
||||||
Mob mob = (Mob) target;
|
Mob mob = (Mob) target;
|
||||||
if (mob.isSiege())
|
if (mob.isSiege())
|
||||||
defenseScore = attackScore;
|
defense = atr;
|
||||||
break;
|
break;
|
||||||
case Building:
|
case Building:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
return !CombatManager.LandHit(atr,defense);
|
||||||
int hitChance;
|
|
||||||
if (attackScore > defenseScore || defenseScore == 0)
|
|
||||||
hitChance = 94;
|
|
||||||
else if (attackScore == defenseScore && target.getObjectType() == GameObjectType.Mob)
|
|
||||||
hitChance = 10;
|
|
||||||
else {
|
|
||||||
float dif = attackScore / defenseScore;
|
|
||||||
if (dif <= 0.8f)
|
|
||||||
hitChance = 4;
|
|
||||||
else
|
|
||||||
hitChance = ((int) (450 * (dif - 0.8f)) + 4);
|
|
||||||
if (target.getObjectType() == GameObjectType.Building)
|
|
||||||
hitChance = 100;
|
|
||||||
}
|
|
||||||
return ThreadLocalRandom.current().nextInt(100) > hitChance;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean triggerBlock(Mob agent, AbstractWorldObject ac) {
|
public static boolean triggerBlock(Mob agent, AbstractWorldObject ac) {
|
||||||
@@ -274,12 +256,12 @@ public class CombatUtilities {
|
|||||||
if (agent.getEquip().get(1) != null && agent.getEquip().get(2) != null && agent.getEquip().get(2).getItemBase().isShield() == false) {
|
if (agent.getEquip().get(1) != null && agent.getEquip().get(2) != null && agent.getEquip().get(2).getItemBase().isShield() == false) {
|
||||||
//mob is duel wielding and should conduct an attack for each hand
|
//mob is duel wielding and should conduct an attack for each hand
|
||||||
ItemBase weapon1 = agent.getEquip().get(1).getItemBase();
|
ItemBase weapon1 = agent.getEquip().get(1).getItemBase();
|
||||||
double range1 = getMaxDmg(weapon1.getMinDamage(), agent, weapon1) - getMinDmg(weapon1.getMinDamage(), agent, weapon1);
|
double range1 = getMaxDmg(agent) - getMinDmg(agent);
|
||||||
double damage1 = getMinDmg(weapon1.getMinDamage(), agent, weapon1) + ((ThreadLocalRandom.current().nextFloat() * range1) + (ThreadLocalRandom.current().nextFloat() * range1)) / 2;
|
double damage1 = getMinDmg(agent) + ((ThreadLocalRandom.current().nextFloat() * range1) + (ThreadLocalRandom.current().nextFloat() * range1)) / 2;
|
||||||
swingIsDamage(agent, target, (float) damage1, CombatManager.getSwingAnimation(weapon1, null, true));
|
swingIsDamage(agent, target, (float) damage1, CombatManager.getSwingAnimation(weapon1, null, true));
|
||||||
ItemBase weapon2 = agent.getEquip().get(2).getItemBase();
|
ItemBase weapon2 = agent.getEquip().get(2).getItemBase();
|
||||||
double range2 = getMaxDmg(weapon2.getMinDamage(), agent, weapon2) - getMinDmg(weapon2.getMinDamage(), agent, weapon2);
|
double range2 = getMaxDmg(agent) - getMinDmg(agent);
|
||||||
double damage2 = getMinDmg(weapon2.getMinDamage(), agent, weapon2) + ((ThreadLocalRandom.current().nextFloat() * range2) + (ThreadLocalRandom.current().nextFloat() * range2)) / 2;
|
double damage2 = getMinDmg(agent) + ((ThreadLocalRandom.current().nextFloat() * range2) + (ThreadLocalRandom.current().nextFloat() * range2)) / 2;
|
||||||
swingIsDamage(agent, target, (float) damage2, CombatManager.getSwingAnimation(weapon1, null, false));
|
swingIsDamage(agent, target, (float) damage2, CombatManager.getSwingAnimation(weapon1, null, false));
|
||||||
} else {
|
} else {
|
||||||
swingIsDamage(agent, target, determineDamage(agent), anim);
|
swingIsDamage(agent, target, determineDamage(agent), anim);
|
||||||
@@ -311,6 +293,7 @@ public class CombatUtilities {
|
|||||||
if (targetMob.isSiege())
|
if (targetMob.isSiege())
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static float determineDamage(Mob agent) {
|
public static float determineDamage(Mob agent) {
|
||||||
@@ -328,9 +311,9 @@ public class CombatUtilities {
|
|||||||
float damage = 0;
|
float damage = 0;
|
||||||
|
|
||||||
DamageType dt = getDamageType(agent);
|
DamageType dt = getDamageType(agent);
|
||||||
if ((agent.agentType.equals(AIAgentType.PET)) == true || agent.isPet() == true || agent.isNecroPet() == true) {
|
if (agent.BehaviourType.equals(MobBehaviourType.Pet1)) {
|
||||||
damage = calculatePetDamage(agent);
|
damage = calculateMobDamage(agent);
|
||||||
} else if (agent.isPlayerGuard() == true) {
|
} else if (agent.isPlayerGuard()) {
|
||||||
//damage = calculateGuardDamage(agent);
|
//damage = calculateGuardDamage(agent);
|
||||||
damage = calculateMobDamage(agent);
|
damage = calculateMobDamage(agent);
|
||||||
} else if (agent.getLevel() > 80) {
|
} else if (agent.getLevel() > 80) {
|
||||||
@@ -370,8 +353,8 @@ public class CombatUtilities {
|
|||||||
float min = 40;
|
float min = 40;
|
||||||
float max = 60;
|
float max = 60;
|
||||||
float dmgMultiplier = 1 + agent.getBonuses().getFloatPercentAll(ModType.MeleeDamageModifier, SourceType.None);
|
float dmgMultiplier = 1 + agent.getBonuses().getFloatPercentAll(ModType.MeleeDamageModifier, SourceType.None);
|
||||||
double minDmg = getMinDmg(min, agent, null);
|
double minDmg = getMinDmg(agent);
|
||||||
double maxDmg = getMaxDmg(max, agent, null);
|
double maxDmg = getMaxDmg(agent);
|
||||||
dmgMultiplier += agent.getLevel() * 0.1f;
|
dmgMultiplier += agent.getLevel() * 0.1f;
|
||||||
range = (float) (maxDmg - minDmg);
|
range = (float) (maxDmg - minDmg);
|
||||||
damage = min + ((ThreadLocalRandom.current().nextFloat() * range) + (ThreadLocalRandom.current().nextFloat() * range)) / 2;
|
damage = min + ((ThreadLocalRandom.current().nextFloat() * range) + (ThreadLocalRandom.current().nextFloat() * range)) / 2;
|
||||||
@@ -387,8 +370,8 @@ public class CombatUtilities {
|
|||||||
|
|
||||||
double minDmg = weapon.getMinDamage();
|
double minDmg = weapon.getMinDamage();
|
||||||
double maxDmg = weapon.getMaxDamage();
|
double maxDmg = weapon.getMaxDamage();
|
||||||
double min = getMinDmg(minDmg, agent, weapon);
|
double min = getMinDmg(agent);
|
||||||
double max = getMaxDmg(maxDmg, agent, weapon);
|
double max = getMaxDmg(agent);
|
||||||
|
|
||||||
DamageType dt = weapon.getDamageType();
|
DamageType dt = weapon.getDamageType();
|
||||||
|
|
||||||
@@ -429,299 +412,48 @@ public class CombatUtilities {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static int calculateMobDamage(Mob agent) {
|
public static int calculateMobDamage(Mob agent) {
|
||||||
ItemBase weapon = null;
|
double minDmg = getMinDmg(agent);
|
||||||
double minDmg;
|
double maxDmg = getMaxDmg(agent);
|
||||||
double maxDmg;
|
DamageType dt = getDamageType(agent);
|
||||||
DamageType dt;
|
|
||||||
|
|
||||||
//main hand or offhand damage
|
|
||||||
|
|
||||||
if (agent.getEquip().get(1) != null)
|
|
||||||
weapon = agent.getEquip().get(1).getItemBase();
|
|
||||||
else if (agent.getEquip().get(2) != null)
|
|
||||||
weapon = agent.getEquip().get(2).getItemBase();
|
|
||||||
|
|
||||||
if (weapon != null) {
|
|
||||||
minDmg = getMinDmg(weapon.getMinDamage(), agent, weapon);
|
|
||||||
maxDmg = getMaxDmg(weapon.getMaxDamage(), agent, weapon);
|
|
||||||
dt = weapon.getDamageType();
|
|
||||||
} else {
|
|
||||||
minDmg = agent.getMobBase().getDamageMin();
|
|
||||||
maxDmg = agent.getMobBase().getDamageMax();
|
|
||||||
dt = DamageType.Crush;
|
|
||||||
}
|
|
||||||
|
|
||||||
AbstractWorldObject target = agent.getCombatTarget();
|
AbstractWorldObject target = agent.getCombatTarget();
|
||||||
|
|
||||||
float dmgMultiplier = 1 + agent.getBonuses().getFloatPercentAll(ModType.MeleeDamageModifier, SourceType.None);
|
double damage = ThreadLocalRandom.current().nextInt((int)minDmg,(int)maxDmg + 1);
|
||||||
double range = maxDmg - minDmg;
|
|
||||||
double damage = minDmg + ((ThreadLocalRandom.current().nextFloat() * range) + (ThreadLocalRandom.current().nextFloat() * range)) / 2;
|
|
||||||
|
|
||||||
if (AbstractWorldObject.IsAbstractCharacter(target))
|
if (AbstractWorldObject.IsAbstractCharacter(target))
|
||||||
if (((AbstractCharacter) target).isSit())
|
if (((AbstractCharacter) target).isSit())
|
||||||
damage *= 2.5f; //increase damage if sitting
|
damage *= 2.5f; //increase damage if sitting
|
||||||
if (AbstractWorldObject.IsAbstractCharacter(target))
|
if (AbstractWorldObject.IsAbstractCharacter(target))
|
||||||
return (int) (((AbstractCharacter) target).getResists().getResistedDamage(agent, (AbstractCharacter) target, dt, (float) damage, 0) * dmgMultiplier);
|
return (int) (((AbstractCharacter) target).getResists().getResistedDamage(agent, (AbstractCharacter) target, dt, (float) damage, 0));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static double getMinDmg(double min, Mob agent, ItemBase weapon) {
|
public static double getMinDmg(Mob agent) {
|
||||||
|
if(agent.getEquip() != null){
|
||||||
int primary = agent.getStatStrCurrent();
|
if(agent.getEquip().get(ItemSlotType.RHELD) != null){
|
||||||
int secondary = agent.getStatDexCurrent();
|
return agent.minDamageHandOne;
|
||||||
int focusLevel = 0;
|
}else if(agent.getEquip().get(ItemSlotType.LHELD) != null){
|
||||||
int masteryLevel = 0;
|
return agent.getMinDamageHandTwo();
|
||||||
|
|
||||||
if (weapon != null) {
|
|
||||||
if (weapon.isStrBased() == true) {
|
|
||||||
primary = agent.getStatStrCurrent();
|
|
||||||
secondary = agent.getStatDexCurrent();
|
|
||||||
}else{
|
}else{
|
||||||
primary = agent.getStatDexCurrent();
|
return agent.minDamageHandOne;
|
||||||
secondary = agent.getStatStrCurrent();
|
|
||||||
if (agent.getSkills().containsKey(weapon.getSkillRequired())) {
|
|
||||||
focusLevel = (int) agent.getSkills().get(weapon.getSkillRequired()).getModifiedAmount();
|
|
||||||
}
|
|
||||||
if (agent.getSkills().containsKey(weapon.getMastery())) {
|
|
||||||
masteryLevel = (int) agent.getSkills().get(weapon.getMastery()).getModifiedAmount();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return min * (pow(0.0048 * primary + .049 * (primary - 0.75), 0.5) + pow(0.0066 * secondary + 0.064 * (secondary - 0.75), 0.5) + +0.01 * (focusLevel + masteryLevel));
|
|
||||||
}
|
|
||||||
return agent.getMinDamageHandOne();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static double getMaxDmg(double max, Mob agent, ItemBase weapon) {
|
|
||||||
|
|
||||||
int primary = agent.getStatStrCurrent();
|
|
||||||
int secondary = agent.getStatDexCurrent();
|
|
||||||
int focusLevel = 0;
|
|
||||||
int masteryLevel = 0;
|
|
||||||
|
|
||||||
if (weapon != null) {
|
|
||||||
|
|
||||||
if (weapon.isStrBased() == true) {
|
|
||||||
primary = agent.getStatStrCurrent();
|
|
||||||
secondary = agent.getStatDexCurrent();
|
|
||||||
} else {
|
|
||||||
primary = agent.getStatDexCurrent();
|
|
||||||
secondary = agent.getStatStrCurrent();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (agent.getSkills().containsKey(weapon.getSkillRequired()))
|
|
||||||
focusLevel = (int) agent.getSkills().get(weapon.getSkillRequired()).getModifiedAmount();
|
|
||||||
|
|
||||||
if (agent.getSkills().containsKey(weapon.getSkillRequired()))
|
|
||||||
masteryLevel = (int) agent.getSkills().get(weapon.getMastery()).getModifiedAmount();
|
|
||||||
|
|
||||||
return max * (pow(0.0124 * primary + 0.118 * (primary - 0.75), 0.5) + pow(0.0022 * secondary + 0.028 * (secondary - 0.75), 0.5) + 0.0075 * (focusLevel + masteryLevel));
|
|
||||||
}
|
|
||||||
return agent.getMaxDamageHandOne();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean MobCast(Mob mob) {
|
|
||||||
|
|
||||||
try {
|
|
||||||
// Method picks a random spell from a mobile's list of powers
|
|
||||||
// and casts it on the current target (or itself). Validation
|
|
||||||
// (including empty lists) is done previously within canCast();
|
|
||||||
|
|
||||||
ArrayList<Integer> powerTokens;
|
|
||||||
ArrayList<Integer> purgeTokens;
|
|
||||||
AbstractCharacter target = (AbstractCharacter) mob.getCombatTarget();
|
|
||||||
|
|
||||||
if (mob.behaviourType.callsForHelp)
|
|
||||||
MobAI.MobCallForHelp(mob);
|
|
||||||
|
|
||||||
// Generate a list of tokens from the mob powers for this mobile.
|
|
||||||
|
|
||||||
powerTokens = new ArrayList<>(mob.mobPowers.keySet());
|
|
||||||
purgeTokens = new ArrayList<>();
|
|
||||||
|
|
||||||
// If player has this effect on them currently then remove
|
|
||||||
// this token from our list.
|
|
||||||
|
|
||||||
for (int powerToken : powerTokens) {
|
|
||||||
|
|
||||||
PowersBase powerBase = PowersManager.getPowerByToken(powerToken);
|
|
||||||
|
|
||||||
for (ActionsBase actionBase : powerBase.getActions()) {
|
|
||||||
|
|
||||||
String stackType = actionBase.stackType;
|
|
||||||
|
|
||||||
if (target.getEffects() != null && target.getEffects().containsKey(stackType))
|
|
||||||
purgeTokens.add(powerToken);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
powerTokens.removeAll(purgeTokens);
|
|
||||||
|
|
||||||
// Sanity check
|
|
||||||
|
|
||||||
if (powerTokens.isEmpty())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// Pick random spell from our list of powers
|
|
||||||
|
|
||||||
int powerToken = powerTokens.get(ThreadLocalRandom.current().nextInt(powerTokens.size()));
|
|
||||||
int powerRank = mob.mobPowers.get(powerToken);
|
|
||||||
|
|
||||||
PowersBase mobPower = PowersManager.getPowerByToken(powerToken);
|
|
||||||
|
|
||||||
//check for hit-roll
|
|
||||||
|
|
||||||
if (mobPower.requiresHitRoll)
|
|
||||||
if (triggerDefense(mob, mob.getCombatTarget()))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// Cast the spell
|
|
||||||
|
|
||||||
if (inRange2D(mob, mob.getCombatTarget(), mobPower.getRange())) {
|
|
||||||
|
|
||||||
PerformActionMsg msg;
|
|
||||||
|
|
||||||
if (!mobPower.isHarmful() || mobPower.targetSelf) {
|
|
||||||
PowersManager.useMobPower(mob, mob, mobPower, powerRank);
|
|
||||||
msg = PowersManager.createPowerMsg(mobPower, powerRank, mob, mob);
|
|
||||||
} else {
|
|
||||||
PowersManager.useMobPower(mob, target, mobPower, powerRank);
|
|
||||||
msg = PowersManager.createPowerMsg(mobPower, powerRank, mob, target);
|
|
||||||
}
|
|
||||||
|
|
||||||
msg.setUnknown04(2);
|
|
||||||
|
|
||||||
PowersManager.finishUseMobPower(msg, mob, 0, 0);
|
|
||||||
long randomCooldown = (long)((ThreadLocalRandom.current().nextInt(10,15) * 1000L) * MobAIThread.AI_CAST_FREQUENCY);
|
|
||||||
|
|
||||||
mob.nextCastTime = System.currentTimeMillis() + randomCooldown;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: MobCast" + " " + e.getMessage());
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean GuardCast(Mob mob) {
|
|
||||||
|
|
||||||
try {
|
|
||||||
// Method picks a random spell from a mobile's list of powers
|
|
||||||
// and casts it on the current target (or itself). Validation
|
|
||||||
// (including empty lists) is done previously within canCast();
|
|
||||||
|
|
||||||
ArrayList<Integer> powerTokens;
|
|
||||||
ArrayList<Integer> purgeTokens;
|
|
||||||
AbstractCharacter target = (AbstractCharacter) mob.getCombatTarget();
|
|
||||||
|
|
||||||
if (mob.behaviourType.callsForHelp)
|
|
||||||
MobAI.MobCallForHelp(mob);
|
|
||||||
|
|
||||||
// Generate a list of tokens from the mob powers for this mobile.
|
|
||||||
|
|
||||||
powerTokens = new ArrayList<>(mob.mobPowers.keySet());
|
|
||||||
purgeTokens = new ArrayList<>();
|
|
||||||
|
|
||||||
// If player has this effect on them currently then remove
|
|
||||||
// this token from our list.
|
|
||||||
|
|
||||||
for (int powerToken : powerTokens) {
|
|
||||||
|
|
||||||
PowersBase powerBase = PowersManager.getPowerByToken(powerToken);
|
|
||||||
|
|
||||||
for (ActionsBase actionBase : powerBase.getActions()) {
|
|
||||||
|
|
||||||
String stackType = actionBase.stackType;
|
|
||||||
|
|
||||||
if (target.getEffects() != null && target.getEffects().containsKey(stackType))
|
|
||||||
purgeTokens.add(powerToken);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
powerTokens.removeAll(purgeTokens);
|
|
||||||
|
|
||||||
// Sanity check
|
|
||||||
|
|
||||||
if (powerTokens.isEmpty())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
int powerToken;
|
|
||||||
int nukeRoll = ThreadLocalRandom.current().nextInt(1,100);
|
|
||||||
|
|
||||||
if (nukeRoll < 55) {
|
|
||||||
|
|
||||||
//use direct damage spell
|
|
||||||
powerToken = powerTokens.get(powerTokens.size() - 1);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
//use random spell
|
|
||||||
powerToken = powerTokens.get(ThreadLocalRandom.current().nextInt(powerTokens.size()));
|
|
||||||
}
|
|
||||||
|
|
||||||
int powerRank = 1;
|
|
||||||
|
|
||||||
switch(mob.getRank()){
|
|
||||||
case 1:
|
|
||||||
powerRank = 10;
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
powerRank = 15;
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
powerRank = 20;
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
powerRank = 25;
|
|
||||||
break;
|
|
||||||
case 5:
|
|
||||||
powerRank = 30;
|
|
||||||
break;
|
|
||||||
case 6:
|
|
||||||
powerRank = 35;
|
|
||||||
break;
|
|
||||||
case 7:
|
|
||||||
powerRank = 40;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
PowersBase mobPower = PowersManager.getPowerByToken(powerToken);
|
|
||||||
|
|
||||||
//check for hit-roll
|
|
||||||
|
|
||||||
if (mobPower.requiresHitRoll)
|
|
||||||
if (triggerDefense(mob, mob.getCombatTarget()))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// Cast the spell
|
|
||||||
|
|
||||||
if (inRange2D(mob, mob.getCombatTarget(), mobPower.getRange())) {
|
|
||||||
|
|
||||||
PerformActionMsg msg;
|
|
||||||
|
|
||||||
if (!mobPower.isHarmful() || mobPower.targetSelf) {
|
|
||||||
|
|
||||||
if (mobPower.category.equals("DISPEL")) {
|
|
||||||
PowersManager.useMobPower(mob, target, mobPower, powerRank);
|
|
||||||
msg = PowersManager.createPowerMsg(mobPower, powerRank, mob, target);
|
|
||||||
} else {
|
|
||||||
PowersManager.useMobPower(mob, mob, mobPower, powerRank);
|
|
||||||
msg = PowersManager.createPowerMsg(mobPower, powerRank, mob, mob);
|
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
PowersManager.useMobPower(mob, target, mobPower, powerRank);
|
return agent.minDamageHandOne;
|
||||||
msg = PowersManager.createPowerMsg(mobPower, powerRank, mob, target);
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
msg.setUnknown04(2);
|
public static double getMaxDmg(Mob agent) {
|
||||||
|
if(agent.getEquip() != null){
|
||||||
|
if(agent.getEquip().get(ItemSlotType.RHELD) != null){
|
||||||
|
return agent.maxDamageHandOne;
|
||||||
|
}else if(agent.getEquip().get(ItemSlotType.LHELD) != null){
|
||||||
|
return agent.getMaxDamageHandTwo();
|
||||||
|
}else{
|
||||||
|
return agent.maxDamageHandOne;
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
return agent.maxDamageHandOne;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
PowersManager.finishUseMobPower(msg, mob, 0, 0);
|
|
||||||
|
|
||||||
long randomCooldown = (long)((ThreadLocalRandom.current().nextInt(10,15) * 1000L) * MobAIThread.AI_CAST_FREQUENCY);
|
|
||||||
mob.nextCastTime = System.currentTimeMillis() + randomCooldown;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: MobCast" + " " + e.getMessage());
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,10 +13,10 @@ import engine.Enum;
|
|||||||
import engine.Enum.GameObjectType;
|
import engine.Enum.GameObjectType;
|
||||||
import engine.Enum.ModType;
|
import engine.Enum.ModType;
|
||||||
import engine.Enum.SourceType;
|
import engine.Enum.SourceType;
|
||||||
|
import engine.mobileAI.Threads.MobAIThread;
|
||||||
import engine.exception.MsgSendException;
|
import engine.exception.MsgSendException;
|
||||||
import engine.gameManager.MovementManager;
|
import engine.gameManager.MovementManager;
|
||||||
import engine.math.Vector3fImmutable;
|
import engine.math.Vector3fImmutable;
|
||||||
import engine.mobileAI.Threads.MobAIThread;
|
|
||||||
import engine.net.client.msg.MoveToPointMsg;
|
import engine.net.client.msg.MoveToPointMsg;
|
||||||
import engine.objects.*;
|
import engine.objects.*;
|
||||||
import org.pmw.tinylog.Logger;
|
import org.pmw.tinylog.Logger;
|
||||||
@@ -38,7 +38,7 @@ public class MovementUtilities {
|
|||||||
if (agent.getContract() != null)
|
if (agent.getContract() != null)
|
||||||
guardCaptain = agent;
|
guardCaptain = agent;
|
||||||
else
|
else
|
||||||
guardCaptain = (Mob) agent.guardCaptain;
|
guardCaptain = (Mob) agent.npcOwner;
|
||||||
|
|
||||||
if (guardCaptain != null) {
|
if (guardCaptain != null) {
|
||||||
Building barracks = guardCaptain.building;
|
Building barracks = guardCaptain.building;
|
||||||
@@ -98,25 +98,60 @@ public class MovementUtilities {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean inRangeDropAggro(Mob agent, AbstractCharacter target) {
|
public static boolean outOfAggroRange(Mob agent, AbstractCharacter target) {
|
||||||
|
|
||||||
Vector3fImmutable sl = agent.getLoc();
|
Vector3fImmutable sl = agent.getLoc();
|
||||||
Vector3fImmutable tl = target.getLoc();
|
Vector3fImmutable tl = target.getLoc();
|
||||||
|
|
||||||
float distanceSquaredToTarget = sl.distanceSquared2D(tl) - sqr(agent.calcHitBox() + target.calcHitBox()); //distance to center of target
|
float disSq = sl.distanceSquared(tl);
|
||||||
|
|
||||||
float range = agent.getRange() + 150;
|
float range = agent.getRange() + 150;
|
||||||
|
|
||||||
|
|
||||||
|
//float distanceSquaredToTarget = sl.distanceSquared2D(tl) - sqr(agent.calcHitBox() + target.calcHitBox()); //distance to center of target
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (range > 200)
|
if (range > 200)
|
||||||
range = 200;
|
range = 200;
|
||||||
|
|
||||||
|
|
||||||
return distanceSquaredToTarget < sqr(range);
|
return disSq > (range * range);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Vector3fImmutable GetMoveLocation(Mob aiAgent, AbstractCharacter aggroTarget) {
|
||||||
|
|
||||||
|
// Player isnt moving and neither is mob. Just return
|
||||||
|
// the mobile's current location. Ain't goin nowhere!
|
||||||
|
// *** Refactor: Check to ensure methods calling us
|
||||||
|
// all don't sent move messages when not moving.
|
||||||
|
|
||||||
|
if ((aggroTarget.isMoving() == false))
|
||||||
|
return aggroTarget.getLoc();
|
||||||
|
|
||||||
|
if (aggroTarget.getEndLoc().x != 0) {
|
||||||
|
|
||||||
|
float aggroTargetDistanceSquared = aggroTarget.getLoc().distanceSquared2D(aggroTarget.getEndLoc());
|
||||||
|
float aiAgentDistanceSquared = aiAgent.getLoc().distanceSquared2D(aggroTarget.getEndLoc());
|
||||||
|
|
||||||
|
if (aiAgentDistanceSquared >= aggroTargetDistanceSquared)
|
||||||
|
return aggroTarget.getEndLoc();
|
||||||
|
else {
|
||||||
|
float distanceToMove = sqrt(aggroTargetDistanceSquared + aiAgentDistanceSquared) * .5f;
|
||||||
|
|
||||||
|
return aggroTarget.getFaceDir().scaleAdd(distanceToMove, aggroTarget.getLoc());
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// One of us is moving so let's calculate our destination loc for this
|
||||||
|
// simulation frame. We will simply project our position onto the
|
||||||
|
// character's movement vector and return the closest point.
|
||||||
|
|
||||||
|
return aiAgent.getLoc().ClosestPointOnLine(aggroTarget.getLoc(), aggroTarget.getEndLoc());
|
||||||
|
}
|
||||||
|
|
||||||
public static void moveToLocation(Mob agent, Vector3fImmutable newLocation, float offset) {
|
public static void moveToLocation(Mob agent, Vector3fImmutable newLocation, float offset) {
|
||||||
agent.resetLastSetLocUpdate();
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
//don't move farther than 30 units from player.
|
//don't move farther than 30 units from player.
|
||||||
@@ -141,8 +176,32 @@ public class MovementUtilities {
|
|||||||
return (agent.isAlive() && !agent.getBonuses().getBool(ModType.Stunned, SourceType.None) && !agent.getBonuses().getBool(ModType.CannotMove, SourceType.None));
|
return (agent.isAlive() && !agent.getBonuses().getBool(ModType.Stunned, SourceType.None) && !agent.getBonuses().getBool(ModType.CannotMove, SourceType.None));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Vector3fImmutable randomPatrolLocation(Mob agent, Vector3fImmutable center, float radius) {
|
||||||
|
|
||||||
|
//Determing where I want to move.
|
||||||
|
return new Vector3fImmutable((center.x - radius) + ((ThreadLocalRandom.current().nextFloat() + .1f * 2) * radius),
|
||||||
|
center.y,
|
||||||
|
(center.z - radius) + ((ThreadLocalRandom.current().nextFloat() + .1f * 2) * radius));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Long estimateMovementTime(Mob agent) {
|
||||||
|
if (agent.getEndLoc().x == 0 && agent.getEndLoc().y == 0)
|
||||||
|
return 0L;
|
||||||
|
|
||||||
|
return (long) ((agent.getLoc().distance2D(agent.getEndLoc()) * 1000) / agent.getSpeed());
|
||||||
|
}
|
||||||
|
|
||||||
public static void aiMove(Mob agent, Vector3fImmutable vect, boolean isWalking) {
|
public static void aiMove(Mob agent, Vector3fImmutable vect, boolean isWalking) {
|
||||||
|
|
||||||
|
//update our walk/run state.
|
||||||
|
if (isWalking && !agent.isWalk()) {
|
||||||
|
agent.setWalkMode(true);
|
||||||
|
MovementManager.sendRWSSMsg(agent);
|
||||||
|
} else if (!isWalking && agent.isWalk()) {
|
||||||
|
agent.setWalkMode(false);
|
||||||
|
MovementManager.sendRWSSMsg(agent);
|
||||||
|
}
|
||||||
|
|
||||||
MoveToPointMsg msg = new MoveToPointMsg();
|
MoveToPointMsg msg = new MoveToPointMsg();
|
||||||
|
|
||||||
|
|
||||||
@@ -218,4 +277,23 @@ public class MovementUtilities {
|
|||||||
return character.getLoc();
|
return character.getLoc();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean updateMovementToCharacter(Mob aiAgent, AbstractCharacter aggroTarget) {
|
||||||
|
|
||||||
|
if (aiAgent.destination.equals(Vector3fImmutable.ZERO))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (!aiAgent.isMoving())
|
||||||
|
return true;
|
||||||
|
|
||||||
|
|
||||||
|
if (aggroTarget.isMoving()) {
|
||||||
|
return !aiAgent.destination.equals(aggroTarget.getEndLoc()) && !aiAgent.destination.equals(aggroTarget.getLoc());
|
||||||
|
} else {
|
||||||
|
if (aiAgent.destination.equals(aggroTarget.getLoc()))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,6 +13,8 @@ import engine.exception.FactoryBuildException;
|
|||||||
import engine.gameManager.ChatManager;
|
import engine.gameManager.ChatManager;
|
||||||
import engine.net.client.ClientConnection;
|
import engine.net.client.ClientConnection;
|
||||||
import engine.net.client.Protocol;
|
import engine.net.client.Protocol;
|
||||||
|
import engine.net.client.msg.ErrorPopupMsg;
|
||||||
|
import engine.net.client.msg.PlaceAssetMsg;
|
||||||
import engine.objects.PlayerCharacter;
|
import engine.objects.PlayerCharacter;
|
||||||
import engine.server.MBServerStatics;
|
import engine.server.MBServerStatics;
|
||||||
import org.joda.time.DateTime;
|
import org.joda.time.DateTime;
|
||||||
@@ -94,11 +96,9 @@ public class NetMsgFactory {
|
|||||||
if (origin instanceof ClientConnection) {
|
if (origin instanceof ClientConnection) {
|
||||||
PlayerCharacter player = ((ClientConnection) origin).getPlayerCharacter();
|
PlayerCharacter player = ((ClientConnection) origin).getPlayerCharacter();
|
||||||
if (player != null) {
|
if (player != null) {
|
||||||
// if (MBServerStatics.worldServerName.equals("Grief"))
|
|
||||||
Logger.error("Invalid protocol msg for player " + player.getFirstName() + " : " + opcode + " lastopcode: " + origin.lastProtocol.name() + " Error Code : " + errorCode);
|
Logger.error("Invalid protocol msg for player " + player.getFirstName() + " : " + opcode + " lastopcode: " + origin.lastProtocol.name() + " Error Code : " + errorCode);
|
||||||
} else
|
PlaceAssetMsg.sendPlaceAssetError(player.getClientConnection(), 1, "Please Report What You Just Did. Ref Code: " + opcode);
|
||||||
Logger.error("PROTOCOL ERROR: Player: " + ((ClientConnection) origin).getPlayerCharacter().getName() + " Account: " + ((ClientConnection) origin).getPlayerCharacter().getAccount().getUname() + "Invalid protocol msg : " + opcode + " lastopcode: " + origin.lastProtocol.name() + " Error Code : " + errorCode);
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
|
|||||||
@@ -227,10 +227,10 @@ public class ClientConnection extends AbstractConnection {
|
|||||||
SessionManager.remSession(
|
SessionManager.remSession(
|
||||||
SessionManager.getSession(sessionID));
|
SessionManager.getSession(sessionID));
|
||||||
} catch (NullPointerException e) {
|
} catch (NullPointerException e) {
|
||||||
Logger
|
//Logger
|
||||||
.error(
|
//.error(
|
||||||
"Tried to remove improperly initialized session. Skipping." +
|
//"Tried to remove improperly initialized session. Skipping." +
|
||||||
e);
|
//e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,6 @@
|
|||||||
|
|
||||||
package engine.net.client;
|
package engine.net.client;
|
||||||
|
|
||||||
import engine.Enum;
|
|
||||||
import engine.Enum.*;
|
import engine.Enum.*;
|
||||||
import engine.InterestManagement.WorldGrid;
|
import engine.InterestManagement.WorldGrid;
|
||||||
import engine.exception.MsgSendException;
|
import engine.exception.MsgSendException;
|
||||||
@@ -86,7 +85,7 @@ public class ClientMessagePump implements NetMsgHandler {
|
|||||||
if (pc == null)
|
if (pc == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
pc.update();
|
pc.update(false);
|
||||||
if (msg.getSpeed() == 2)
|
if (msg.getSpeed() == 2)
|
||||||
pc.setWalkMode(false);
|
pc.setWalkMode(false);
|
||||||
else
|
else
|
||||||
@@ -115,7 +114,7 @@ public class ClientMessagePump implements NetMsgHandler {
|
|||||||
if (pc == null)
|
if (pc == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
pc.update();
|
pc.update(false);
|
||||||
|
|
||||||
pc.setSit(msg.toggleSitStand());
|
pc.setSit(msg.toggleSitStand());
|
||||||
|
|
||||||
@@ -123,7 +122,6 @@ public class ClientMessagePump implements NetMsgHandler {
|
|||||||
if (pc.isSit()) {
|
if (pc.isSit()) {
|
||||||
pc.setCombat(false);
|
pc.setCombat(false);
|
||||||
pc.cancelOnSit();
|
pc.cancelOnSit();
|
||||||
pc.stopMovement(pc.loc);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
UpdateStateMsg rwss = new UpdateStateMsg();
|
UpdateStateMsg rwss = new UpdateStateMsg();
|
||||||
@@ -224,11 +222,6 @@ public class ClientMessagePump implements NetMsgHandler {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(msg.getSlotNumber() == 11 && pc.getRaceID() == 1999){
|
|
||||||
forceTransferFromEquipToInventory(msg, origin, "Saetor cannot wear shoes.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
int uuid = msg.getUUID();
|
int uuid = msg.getUUID();
|
||||||
int slot = msg.getSlotNumber();
|
int slot = msg.getSlotNumber();
|
||||||
//System.out.println("loading to slot: " + slot);
|
//System.out.println("loading to slot: " + slot);
|
||||||
@@ -561,28 +554,32 @@ public class ClientMessagePump implements NetMsgHandler {
|
|||||||
if (i == null)
|
if (i == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if(i.getItemBaseID() == 7)
|
|
||||||
return; //cant delete gold
|
|
||||||
|
|
||||||
if (!itemManager.doesCharOwnThisItem(i.getObjectUUID()))
|
if (!itemManager.doesCharOwnThisItem(i.getObjectUUID()))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!itemManager.inventoryContains(i))
|
if (!itemManager.inventoryContains(i))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if(i.getItemBaseID() == 980066)
|
//cannot delete gold
|
||||||
|
if(i.getItemBaseID() == 7)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (i.canDestroy) {
|
if (i.isCanDestroy()) {
|
||||||
int value = i.getItemBase().value;
|
int goldValue = i.getBaseValue();
|
||||||
if (i.getItemBase().isRune())
|
if (i.getItemBase().isRune())
|
||||||
value = 500000;
|
goldValue = 500000;
|
||||||
if(sourcePlayer.getCharItemManager().getGoldInventory().getNumOfItems() + value > 10000000){
|
|
||||||
|
if (i.getItemBaseID() == 980066)
|
||||||
|
goldValue = 0;
|
||||||
|
|
||||||
|
if(itemManager.getGoldInventory().getNumOfItems() + goldValue > 10000000)
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
if (itemManager.delete(i) == true) {
|
if (itemManager.delete(i)) {
|
||||||
sourcePlayer.getCharItemManager().addGoldToInventory(value,false);
|
if (goldValue > 0)
|
||||||
sourcePlayer.getCharItemManager().updateInventory();
|
itemManager.addGoldToInventory(goldValue, false);
|
||||||
|
|
||||||
|
itemManager.updateInventory();
|
||||||
Dispatch dispatch = Dispatch.borrow(sourcePlayer, msg);
|
Dispatch dispatch = Dispatch.borrow(sourcePlayer, msg);
|
||||||
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
||||||
}
|
}
|
||||||
@@ -675,6 +672,8 @@ public class ClientMessagePump implements NetMsgHandler {
|
|||||||
JobScheduler.getInstance().scheduleJob(new RefreshGroupJob(sourcePlayer), MBServerStatics.LOAD_OBJECT_DELAY);
|
JobScheduler.getInstance().scheduleJob(new RefreshGroupJob(sourcePlayer), MBServerStatics.LOAD_OBJECT_DELAY);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private static void lootWindowRequest(LootWindowRequestMsg msg, ClientConnection origin) throws MsgSendException {
|
private static void lootWindowRequest(LootWindowRequestMsg msg, ClientConnection origin) throws MsgSendException {
|
||||||
|
|
||||||
PlayerCharacter pc = SessionManager.getPlayerCharacter(origin);
|
PlayerCharacter pc = SessionManager.getPlayerCharacter(origin);
|
||||||
@@ -1264,6 +1263,8 @@ public class ClientMessagePump implements NetMsgHandler {
|
|||||||
|
|
||||||
|
|
||||||
cost = sell.getBaseValue();
|
cost = sell.getBaseValue();
|
||||||
|
if(sell.getItemBaseID() == 980066)
|
||||||
|
cost = 0;
|
||||||
|
|
||||||
//apply damaged value reduction
|
//apply damaged value reduction
|
||||||
float durabilityCurrent = sell.getDurabilityCurrent();
|
float durabilityCurrent = sell.getDurabilityCurrent();
|
||||||
@@ -1368,6 +1369,8 @@ public class ClientMessagePump implements NetMsgHandler {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
// test within talking range
|
// test within talking range
|
||||||
|
if(npc.isInSafeZone())
|
||||||
|
npc.sellPercent = 0;
|
||||||
|
|
||||||
if (sourcePlayer.getLoc().distanceSquared2D(npc.getLoc()) > MBServerStatics.NPC_TALK_RANGE * MBServerStatics.NPC_TALK_RANGE) {
|
if (sourcePlayer.getLoc().distanceSquared2D(npc.getLoc()) > MBServerStatics.NPC_TALK_RANGE * MBServerStatics.NPC_TALK_RANGE) {
|
||||||
ErrorPopupMsg.sendErrorPopup(sourcePlayer, 14);
|
ErrorPopupMsg.sendErrorPopup(sourcePlayer, 14);
|
||||||
@@ -1399,6 +1402,12 @@ public class ClientMessagePump implements NetMsgHandler {
|
|||||||
Item buy = null;
|
Item buy = null;
|
||||||
if (msg.getItemType() == GameObjectType.MobEquipment.ordinal()) {
|
if (msg.getItemType() == GameObjectType.MobEquipment.ordinal()) {
|
||||||
ArrayList<MobEquipment> sellInventory = npc.getContract().getSellInventory();
|
ArrayList<MobEquipment> sellInventory = npc.getContract().getSellInventory();
|
||||||
|
//if(npc.contract.getObjectUUID() == 890){ // default steward
|
||||||
|
// sellInventory = npc.getSellInventorySteward();
|
||||||
|
//}
|
||||||
|
//if(npc.contract.getObjectUUID() == 889){ // default builder
|
||||||
|
// sellInventory = npc.getSellInventoryBuilder();
|
||||||
|
//}
|
||||||
if (sellInventory == null) {
|
if (sellInventory == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -1412,19 +1421,33 @@ public class ClientMessagePump implements NetMsgHandler {
|
|||||||
if (!itemMan.hasRoomInventory(ib.getWeight())) {
|
if (!itemMan.hasRoomInventory(ib.getWeight())) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
int cost = me.magicValue;
|
int cost = me.getMagicValue();
|
||||||
if(npc.getContractID() == 1201 && me.getItemBase().getName().equals("Prospector"))
|
|
||||||
cost = 50;
|
|
||||||
float bargain = sourcePlayer.getBargain();
|
float bargain = sourcePlayer.getBargain();
|
||||||
float profit = npc.getSellPercent(sourcePlayer) - bargain;
|
switch(npc.getContractID()){
|
||||||
if(me.getItemBase().getType().equals(ItemType.POTION))
|
case 1201:
|
||||||
profit -= 1.0f;
|
cost = ItemBase.getDiscPrice(ib.getUUID());
|
||||||
if (profit < 1)
|
bargain = 0;
|
||||||
profit = 1;
|
break;
|
||||||
if(npc.getContractID() == 900){
|
case 1202:
|
||||||
|
cost = ItemBase.getStatPrice(ib.getUUID());
|
||||||
|
bargain = 0;
|
||||||
|
break;
|
||||||
|
case 900:
|
||||||
cost = Warehouse.getCostForResource(ib.getUUID()) * Warehouse.getSellStackSize(ib.getUUID());
|
cost = Warehouse.getCostForResource(ib.getUUID()) * Warehouse.getSellStackSize(ib.getUUID());
|
||||||
|
bargain = 0;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
float profit;
|
||||||
|
|
||||||
|
if(npc.isInSafeZone())
|
||||||
|
profit = 0;
|
||||||
|
else
|
||||||
|
profit = npc.getSellPercent(sourcePlayer) - bargain;
|
||||||
|
|
||||||
|
|
||||||
|
if(profit > 0)
|
||||||
cost *= profit;
|
cost *= profit;
|
||||||
|
|
||||||
if (gold.getNumOfItems() - cost < 0) {
|
if (gold.getNumOfItems() - cost < 0) {
|
||||||
//dont' have enough goldItem exit!
|
//dont' have enough goldItem exit!
|
||||||
// chatMan.chatSystemInfo(pc, "" + "You dont have enough gold.");
|
// chatMan.chatSystemInfo(pc, "" + "You dont have enough gold.");
|
||||||
@@ -1437,16 +1460,17 @@ public class ClientMessagePump implements NetMsgHandler {
|
|||||||
if (b != null && (b.getStrongboxValue() + buildingDeposit) > b.getMaxGold() && !b.isOwnerIsNPC()) {
|
if (b != null && (b.getStrongboxValue() + buildingDeposit) > b.getMaxGold() && !b.isOwnerIsNPC()) {
|
||||||
ErrorPopupMsg.sendErrorPopup(sourcePlayer, 206);
|
ErrorPopupMsg.sendErrorPopup(sourcePlayer, 206);
|
||||||
return;
|
return;
|
||||||
}
|
}if(npc.getContractID() == 1502041){
|
||||||
if (!itemMan.buyFromNPC(b, cost, buildingDeposit)) {
|
me.fromNoob = true;
|
||||||
|
} else if (!itemMan.buyFromNPC(b, cost, buildingDeposit)) {
|
||||||
// chatMan.chatSystemInfo(pc, "" + "You Failed to buy the item.");
|
// chatMan.chatSystemInfo(pc, "" + "You Failed to buy the item.");
|
||||||
ChatManager.chatSystemError(sourcePlayer, "Failed To Buy Item");
|
ChatManager.chatSystemError(sourcePlayer, "Failed To Buy Item");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(me.getItemBase().getType().equals(ItemType.RESOURCE) && npc.getContractID() == 900){
|
if(me.getItemBase().getType().equals(ItemType.RESOURCE) && npc.getContractID() == 900){
|
||||||
handleResourcePurchase(me,itemMan,npc,buy,sourcePlayer,ib);
|
handleResourcePurchase(me,itemMan,sourcePlayer,ib);
|
||||||
}else {
|
}else {
|
||||||
buy = Item.createItemForPlayer(sourcePlayer, ib);
|
buy = Item.createItemForPlayer(sourcePlayer, ib, me.fromNoob);
|
||||||
if (buy != null) {
|
if (buy != null) {
|
||||||
me.transferEnchants(buy);
|
me.transferEnchants(buy);
|
||||||
itemMan.addItemToInventory(buy);
|
itemMan.addItemToInventory(buy);
|
||||||
@@ -1560,7 +1584,7 @@ public class ClientMessagePump implements NetMsgHandler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void handleResourcePurchase(MobEquipment me, CharacterItemManager itemMan, NPC npc, Item buy, PlayerCharacter sourcePlayer, ItemBase ib){
|
public static void handleResourcePurchase(MobEquipment me, CharacterItemManager itemMan, PlayerCharacter sourcePlayer, ItemBase ib){
|
||||||
boolean stacked = false;
|
boolean stacked = false;
|
||||||
int buystack = Warehouse.getSellStackSize(me.getItemBase().getUUID());
|
int buystack = Warehouse.getSellStackSize(me.getItemBase().getUUID());
|
||||||
for(Item item : itemMan.getInventory()){
|
for(Item item : itemMan.getInventory()){
|
||||||
@@ -1580,7 +1604,7 @@ public class ClientMessagePump implements NetMsgHandler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(!stacked){
|
if(!stacked){
|
||||||
buy = Item.createItemForPlayer(sourcePlayer, ib);
|
Item buy = Item.createItemForPlayer(sourcePlayer, ib, false);
|
||||||
if (buy != null) {
|
if (buy != null) {
|
||||||
me.transferEnchants(buy);
|
me.transferEnchants(buy);
|
||||||
itemMan.addItemToInventory(buy);
|
itemMan.addItemToInventory(buy);
|
||||||
@@ -1590,6 +1614,7 @@ public class ClientMessagePump implements NetMsgHandler {
|
|||||||
}
|
}
|
||||||
itemMan.updateInventory();
|
itemMan.updateInventory();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void Repair(RepairMsg msg, ClientConnection origin) {
|
private static void Repair(RepairMsg msg, ClientConnection origin) {
|
||||||
|
|
||||||
PlayerCharacter player = SessionManager.getPlayerCharacter(origin);
|
PlayerCharacter player = SessionManager.getPlayerCharacter(origin);
|
||||||
@@ -1632,8 +1657,8 @@ public class ClientMessagePump implements NetMsgHandler {
|
|||||||
if (toRepair == null)
|
if (toRepair == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
//if (toRepair.getItemBase().isGlass())
|
if (toRepair.getItemBase().isGlass())
|
||||||
// return;
|
return;
|
||||||
|
|
||||||
//make sure item is in player's inventory or equipment
|
//make sure item is in player's inventory or equipment
|
||||||
if (!itemMan.inventoryContains(toRepair) && !itemMan.equippedContains(toRepair))
|
if (!itemMan.inventoryContains(toRepair) && !itemMan.equippedContains(toRepair))
|
||||||
@@ -1647,20 +1672,21 @@ public class ClientMessagePump implements NetMsgHandler {
|
|||||||
max *= (1 + (durMod * 0.01f));
|
max *= (1 + (durMod * 0.01f));
|
||||||
if (dur >= max || dur < 1) {
|
if (dur >= max || dur < 1) {
|
||||||
//redundancy message to clear item from window in client
|
//redundancy message to clear item from window in client
|
||||||
|
if (!DbManager.ItemQueries.SET_DURABILITY(toRepair, dur))
|
||||||
|
return;
|
||||||
toRepair.setDurabilityCurrent(max);
|
toRepair.setDurabilityCurrent(max);
|
||||||
msg.setupRepairAck(max - dur);
|
msg.setupRepairAck(max - dur);
|
||||||
dispatch = Dispatch.borrow(player, msg);
|
dispatch = Dispatch.borrow(player, msg);
|
||||||
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
//TODO get cost to repair
|
|
||||||
int cost = (int) ((max - dur) * 80.1);
|
|
||||||
|
|
||||||
//glass costs 3x as much to repair
|
|
||||||
if (toRepair.getItemBase().isGlass()){
|
|
||||||
cost *= 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
int pointsToRepair = max - dur;
|
||||||
|
double damageRatio = (double)1.0d - (toRepair.getDurabilityMax() - toRepair.getDurabilityCurrent()) / toRepair.getDurabilityMax();
|
||||||
|
int modifiedValue = (int)(damageRatio * toRepair.getMagicValue());
|
||||||
|
int costPerPoint = modifiedValue / toRepair.getDurabilityMax();
|
||||||
|
int modifiedRepairCost = (int)(pointsToRepair * costPerPoint)+ npc.getSpecialPrice();
|
||||||
|
int cost = (int)(modifiedRepairCost * 1 + npc.buyPercent) + npc.getSpecialPrice();
|
||||||
Building b = (!npc.isStatic()) ? npc.getBuilding() : null;
|
Building b = (!npc.isStatic()) ? npc.getBuilding() : null;
|
||||||
|
|
||||||
if (b != null)
|
if (b != null)
|
||||||
@@ -1895,22 +1921,9 @@ public class ClientMessagePump implements NetMsgHandler {
|
|||||||
break;
|
break;
|
||||||
case LEAVEREQUEST:
|
case LEAVEREQUEST:
|
||||||
origin.disconnect();
|
origin.disconnect();
|
||||||
ArrayList<PlayerCharacter> sameMachine = new ArrayList<>();
|
|
||||||
for (PlayerCharacter pc : SessionManager.getAllActivePlayers()) {
|
|
||||||
if(origin.machineID.equals(pc.getClientConnection().machineID))
|
|
||||||
sameMachine.add(pc);
|
|
||||||
}
|
|
||||||
if(sameMachine.isEmpty() == false){
|
|
||||||
if(sameMachine.get(0) != null) {
|
|
||||||
sameMachine.get(0).isBoxed = false;
|
|
||||||
sameMachine.get(0).removeEffectBySource(EffectSourceType.DeathShroud,41,true);
|
|
||||||
ChatManager.chatSystemInfo(sameMachine.get(0), "You Are No Longer Flagged 'Boxed'");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case POWER:
|
case POWER:
|
||||||
PowersManager.usePower((PerformActionMsg) msg, origin, false);
|
PowersManager.usePower((PerformActionMsg) msg, origin, false);
|
||||||
//PowersManager.static_power_que.add(new PowersManager.PowerQueObject((PerformActionMsg) msg, origin, false));
|
|
||||||
break;
|
break;
|
||||||
case REQUESTMELEEATTACK:
|
case REQUESTMELEEATTACK:
|
||||||
CombatManager.setAttackTarget((AttackCmdMsg) msg, origin);
|
CombatManager.setAttackTarget((AttackCmdMsg) msg, origin);
|
||||||
|
|||||||
@@ -57,21 +57,6 @@ public class ActivateNPCMsgHandler extends AbstractClientMsgHandler {
|
|||||||
|
|
||||||
if (contract.canSlotinBuilding(building))
|
if (contract.canSlotinBuilding(building))
|
||||||
ItemLists.add(hirelings);
|
ItemLists.add(hirelings);
|
||||||
|
|
||||||
if(building.getBlueprint().getBuildingGroup().equals(Enum.BuildingGroup.TOL)){
|
|
||||||
if(contract.getContractID() == 899)//alchemist
|
|
||||||
ItemLists.add(hirelings);
|
|
||||||
|
|
||||||
if(contract.getContractID() == 866)//banker
|
|
||||||
ItemLists.add(hirelings);
|
|
||||||
|
|
||||||
if(contract.getContractID() == 865)//siege engineer
|
|
||||||
ItemLists.add(hirelings);
|
|
||||||
}
|
|
||||||
if(building.getBlueprint().getBuildingGroup().equals(Enum.BuildingGroup.SIEGETENT)){
|
|
||||||
if(contract.getContractID() == 865)//siege engineer
|
|
||||||
ItemLists.add(hirelings);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -93,20 +78,13 @@ public class ActivateNPCMsgHandler extends AbstractClientMsgHandler {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (building.getBlueprint().getSlotsForRank(building.getRank()) == building.getHirelings().size())
|
if (building.getBlueprint().getMaxSlots() == building.getHirelings().size() && building.getRank() != 8)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
Item contractItem = Item.getFromCache(msg.getContractItem());
|
Item contractItem = Item.getFromCache(msg.getContractItem());
|
||||||
|
|
||||||
if (contractItem == null)
|
if (contractItem == null)
|
||||||
return false;
|
return false;
|
||||||
if (msg.getContractItem() == 850) {//runemaster
|
|
||||||
for (AbstractCharacter abs : building.getHirelings().keySet()) {
|
|
||||||
NPC npc = (NPC) abs;
|
|
||||||
if (npc.contract.getContractID() == 850)
|
|
||||||
return false; //can only have 1 runemaster
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!player.getCharItemManager().doesCharOwnThisItem(contractItem.getObjectUUID())) {
|
if (!player.getCharItemManager().doesCharOwnThisItem(contractItem.getObjectUUID())) {
|
||||||
Logger.error(player.getName() + "has attempted to place Hireling : " + contractItem.getName() + "without a valid contract!");
|
Logger.error(player.getName() + "has attempted to place Hireling : " + contractItem.getName() + "without a valid contract!");
|
||||||
@@ -126,33 +104,10 @@ public class ActivateNPCMsgHandler extends AbstractClientMsgHandler {
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Check if contract can be slotted in this building
|
// Check if contract can be slotted in this building
|
||||||
//Logger.error("inserting contract: " + contract.getContractID());
|
|
||||||
if (contract.canSlotinBuilding(building) == false) {
|
|
||||||
boolean override = false;
|
|
||||||
if (building.getBlueprint().getBuildingGroup().equals(Enum.BuildingGroup.TOL)) {
|
|
||||||
if (contract.getContractID() == 899)//alchemist
|
|
||||||
override = true;
|
|
||||||
|
|
||||||
if (contract.getContractID() == 866)//banker
|
if (contract.canSlotinBuilding(building) == false)
|
||||||
override = true;
|
|
||||||
|
|
||||||
if (contract.getContractID() == 865)//siege engineer
|
|
||||||
override = true;
|
|
||||||
}
|
|
||||||
if (building.getBlueprint().getBuildingGroup().equals(Enum.BuildingGroup.SIEGETENT)) {
|
|
||||||
if (contract.getContractID() == 865)//siege engineer
|
|
||||||
override = true;
|
|
||||||
}
|
|
||||||
if(building.getBlueprint().getBuildingGroup().equals(Enum.BuildingGroup.SIEGETENT)){
|
|
||||||
if(contract.getContractID() == 865)//siege engineer
|
|
||||||
override = true;
|
|
||||||
}
|
|
||||||
if(override == false) {
|
|
||||||
Logger.error("failed at override with contract: " + contract.getContractID());
|
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
}
|
|
||||||
//Logger.error("override successful: " + contract.getContractID());
|
|
||||||
if (!BuildingManager.addHireling(building, player, zone, contract, contractItem))
|
if (!BuildingManager.addHireling(building, player, zone, contract, contractItem))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ public class ArcLoginNotifyMsgHandler extends AbstractClientMsgHandler {
|
|||||||
GroupManager.RefreshOthersGroupList(player);
|
GroupManager.RefreshOthersGroupList(player);
|
||||||
}
|
}
|
||||||
|
|
||||||
player.enteredWorld = true;
|
player.setEnteredWorld(true);
|
||||||
// Set player active
|
// Set player active
|
||||||
player.resetRegenUpdateTime();
|
player.resetRegenUpdateTime();
|
||||||
player.setActive(true);
|
player.setActive(true);
|
||||||
@@ -66,9 +66,6 @@ public class ArcLoginNotifyMsgHandler extends AbstractClientMsgHandler {
|
|||||||
// Send Guild, Nation and IC MOTD
|
// Send Guild, Nation and IC MOTD
|
||||||
GuildManager.enterWorldMOTD(player);
|
GuildManager.enterWorldMOTD(player);
|
||||||
ChatManager.sendSystemMessage(player, ConfigManager.MB_WORLD_GREETING.getValue());
|
ChatManager.sendSystemMessage(player, ConfigManager.MB_WORLD_GREETING.getValue());
|
||||||
ChatManager.sendSystemMessage(player, "Gold Drop Rate: " + ConfigManager.MB_NORMAL_GOLD_RATE.getValue());
|
|
||||||
ChatManager.sendSystemMessage(player, "Loot Drop Rate: " + ConfigManager.MB_NORMAL_DROP_RATE.getValue());
|
|
||||||
ChatManager.sendSystemMessage(player, "Experience Rate: " + ConfigManager.MB_NORMAL_EXP_RATE.getValue());
|
|
||||||
|
|
||||||
// Send branch string if available from ConfigManager.
|
// Send branch string if available from ConfigManager.
|
||||||
|
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import engine.objects.GuildStatusController;
|
|||||||
import engine.objects.Mine;
|
import engine.objects.Mine;
|
||||||
import engine.objects.PlayerCharacter;
|
import engine.objects.PlayerCharacter;
|
||||||
import engine.objects.Resource;
|
import engine.objects.Resource;
|
||||||
|
import org.pmw.tinylog.Logger;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @Author:
|
* @Author:
|
||||||
@@ -35,26 +36,28 @@ public class ArcMineChangeProductionMsgHandler extends AbstractClientMsgHandler
|
|||||||
|
|
||||||
//TODO verify this against the warehouse?
|
//TODO verify this against the warehouse?
|
||||||
|
|
||||||
if (GuildStatusController.isInnerCouncil(playerCharacter.getGuildStatus()) == false) // is this only GL?
|
if (!GuildStatusController.isInnerCouncil(playerCharacter.getGuildStatus())) // is this only GL?
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
Mine mine = Mine.getMine(changeProductionMsg.getMineID());
|
Mine mine = Mine.getMine(changeProductionMsg.getMineID());
|
||||||
|
|
||||||
if (mine == null)
|
if (mine == null) {
|
||||||
|
Logger.error("Player Character: " + playerCharacter.getName() + " Tried To Change Mine: " + changeProductionMsg.getMineID() + " and Mine was Null");
|
||||||
return true;
|
return true;
|
||||||
|
}
|
||||||
//make sure mine belongs to guild
|
//make sure mine belongs to guild
|
||||||
|
|
||||||
if (mine.getOwningGuild().isEmptyGuild() ||
|
if (mine.getOwningGuild().isEmptyGuild() || mine.getOwningGuild().getObjectUUID() != playerCharacter.getGuild().getObjectUUID())
|
||||||
mine.getOwningGuild().getObjectUUID() != playerCharacter.getGuild().getObjectUUID())
|
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
//make sure valid resource
|
//make sure valid resource
|
||||||
|
|
||||||
Resource resource = Resource.resourceByHash.get(changeProductionMsg.getResourceHash());
|
Resource resource = Resource.resourceByHash.get(changeProductionMsg.getResourceHash());
|
||||||
|
|
||||||
if (resource == null)
|
if (resource == null) {
|
||||||
|
Logger.error("Player Character: " + playerCharacter.getName() + " Tried To Change Mine: " + changeProductionMsg.getMineID() + " and Resource was Null");
|
||||||
return true;
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
//update resource
|
//update resource
|
||||||
|
|
||||||
|
|||||||
@@ -14,17 +14,18 @@ import engine.Enum.GuildHistoryType;
|
|||||||
import engine.exception.MsgSendException;
|
import engine.exception.MsgSendException;
|
||||||
import engine.gameManager.ChatManager;
|
import engine.gameManager.ChatManager;
|
||||||
import engine.gameManager.DbManager;
|
import engine.gameManager.DbManager;
|
||||||
import engine.gameManager.GroupManager;
|
|
||||||
import engine.gameManager.SessionManager;
|
import engine.gameManager.SessionManager;
|
||||||
import engine.net.Dispatch;
|
import engine.net.Dispatch;
|
||||||
import engine.net.DispatchMessage;
|
import engine.net.DispatchMessage;
|
||||||
import engine.net.client.ClientConnection;
|
import engine.net.client.ClientConnection;
|
||||||
import engine.net.client.msg.ClientNetMsg;
|
import engine.net.client.msg.ClientNetMsg;
|
||||||
import engine.net.client.msg.ErrorPopupMsg;
|
import engine.net.client.msg.ErrorPopupMsg;
|
||||||
import engine.net.client.msg.group.GroupUpdateMsg;
|
|
||||||
import engine.net.client.msg.guild.BanishUnbanishMsg;
|
import engine.net.client.msg.guild.BanishUnbanishMsg;
|
||||||
import engine.net.client.msg.guild.GuildListMsg;
|
import engine.net.client.msg.guild.GuildListMsg;
|
||||||
import engine.objects.*;
|
import engine.objects.Guild;
|
||||||
|
import engine.objects.GuildHistory;
|
||||||
|
import engine.objects.GuildStatusController;
|
||||||
|
import engine.objects.PlayerCharacter;
|
||||||
import org.joda.time.DateTime;
|
import org.joda.time.DateTime;
|
||||||
|
|
||||||
public class BanishUnbanishHandler extends AbstractClientMsgHandler {
|
public class BanishUnbanishHandler extends AbstractClientMsgHandler {
|
||||||
@@ -115,20 +116,6 @@ public class BanishUnbanishHandler extends AbstractClientMsgHandler {
|
|||||||
GuildListMsg guildListMsg = new GuildListMsg(guild);
|
GuildListMsg guildListMsg = new GuildListMsg(guild);
|
||||||
dispatch = Dispatch.borrow(source, guildListMsg);
|
dispatch = Dispatch.borrow(source, guildListMsg);
|
||||||
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);
|
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);
|
||||||
if(GroupManager.getGroup(target) != null) {
|
|
||||||
Group group = GroupManager.getGroup(target);
|
|
||||||
group.removeGroupMember(PlayerCharacter.getPlayerCharacter(target));
|
|
||||||
GroupManager.removeFromGroups(PlayerCharacter.getPlayerCharacter(target));
|
|
||||||
GroupUpdateMsg gim;
|
|
||||||
gim = new GroupUpdateMsg();
|
|
||||||
gim.setGroup(group);
|
|
||||||
gim.setMessageType(3);
|
|
||||||
gim.setPlayer(PlayerCharacter.getPlayerCharacter(target));
|
|
||||||
group.sendUpdate(gim);
|
|
||||||
|
|
||||||
String text = PlayerCharacter.getPlayerCharacter(target).getFirstName() + " has left your group.";
|
|
||||||
ChatManager.chatGroupInfo(source, text);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
ErrorPopupMsg.sendErrorPopup(source, 103); // You may not banish this char
|
ErrorPopupMsg.sendErrorPopup(source, 103); // You may not banish this char
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
|
|
||||||
package engine.net.client.handlers;
|
package engine.net.client.handlers;
|
||||||
|
|
||||||
|
import engine.Enum;
|
||||||
import engine.Enum.DispatchChannel;
|
import engine.Enum.DispatchChannel;
|
||||||
import engine.exception.MsgSendException;
|
import engine.exception.MsgSendException;
|
||||||
import engine.net.DispatchMessage;
|
import engine.net.DispatchMessage;
|
||||||
@@ -42,18 +43,24 @@ public class ChangeAltitudeHandler extends AbstractClientMsgHandler {
|
|||||||
if (!AbstractCharacter.CanFly(pc))
|
if (!AbstractCharacter.CanFly(pc))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
if(pc.getBonuses().getBool(Enum.ModType.Stunned, Enum.SourceType.None))
|
||||||
|
return false;
|
||||||
|
|
||||||
if (pc.isSwimming())
|
if (pc.isSwimming())
|
||||||
return false;
|
return false;
|
||||||
if (pc.region != null && !pc.region.isOutside())
|
if (pc.region != null && !pc.region.isOutside())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
|
||||||
// Find out if we already have an altitude timer running and if so
|
// Find out if we already have an altitude timer running and if so
|
||||||
// do not process more alt change requests
|
// do not process more alt change requests
|
||||||
|
|
||||||
|
pc.updateFlight();
|
||||||
|
|
||||||
if (pc.getTakeOffTime() != 0)
|
if (pc.getTakeOffTime() != 0)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
pc.setTakeOffTime(System.currentTimeMillis());
|
||||||
|
|
||||||
|
|
||||||
// remove all movement timers and jobs
|
// remove all movement timers and jobs
|
||||||
//TODO: test if they can fly
|
//TODO: test if they can fly
|
||||||
@@ -67,7 +74,7 @@ public class ChangeAltitudeHandler extends AbstractClientMsgHandler {
|
|||||||
if (pc.getAltitude() == 0 && !msg.up())
|
if (pc.getAltitude() == 0 && !msg.up())
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
pc.update();
|
pc.update(false);
|
||||||
pc.stopMovement(pc.getLoc());
|
pc.stopMovement(pc.getLoc());
|
||||||
msg.setStartAlt(pc.getAltitude());
|
msg.setStartAlt(pc.getAltitude());
|
||||||
if (msg.up()) {
|
if (msg.up()) {
|
||||||
@@ -132,7 +139,7 @@ public class ChangeAltitudeHandler extends AbstractClientMsgHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (msg.up()) {
|
if (msg.up()) {
|
||||||
pc.update();
|
pc.update(false);
|
||||||
pc.setDesiredAltitude(targetAlt);
|
pc.setDesiredAltitude(targetAlt);
|
||||||
pc.setTakeOffTime(System.currentTimeMillis());
|
pc.setTakeOffTime(System.currentTimeMillis());
|
||||||
} else {
|
} else {
|
||||||
@@ -158,7 +165,7 @@ public class ChangeAltitudeHandler extends AbstractClientMsgHandler {
|
|||||||
} else
|
} else
|
||||||
pc.setDesiredAltitude(targetAlt);
|
pc.setDesiredAltitude(targetAlt);
|
||||||
|
|
||||||
pc.update();
|
pc.update(false);
|
||||||
|
|
||||||
|
|
||||||
pc.setTakeOffTime(System.currentTimeMillis());
|
pc.setTakeOffTime(System.currentTimeMillis());
|
||||||
|
|||||||
@@ -61,6 +61,15 @@ public class CityDataHandler extends AbstractClientMsgHandler {
|
|||||||
dispatch = Dispatch.borrow(playerCharacter, cityDataMsg);
|
dispatch = Dispatch.borrow(playerCharacter, cityDataMsg);
|
||||||
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
||||||
|
|
||||||
|
// If the hotZone has changed then update the client's map accordingly.
|
||||||
|
|
||||||
|
if (playerCharacter.getTimestamps().containsKey("hotzoneupdate") && playerCharacter.getTimeStamp("hotzoneupdate") <= ZoneManager.hotZoneLastUpdate.toEpochMilli() && ZoneManager.hotZone != null) {
|
||||||
|
HotzoneChangeMsg hotzoneChangeMsg = new HotzoneChangeMsg(Enum.GameObjectType.Zone.ordinal(), ZoneManager.hotZone.getObjectUUID());
|
||||||
|
dispatch = Dispatch.borrow(playerCharacter, hotzoneChangeMsg);
|
||||||
|
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
||||||
|
playerCharacter.setTimeStamp("hotzoneupdate", System.currentTimeMillis() - 100);
|
||||||
|
}
|
||||||
|
|
||||||
// Serialize the realms for this map
|
// Serialize the realms for this map
|
||||||
|
|
||||||
WorldRealmMsg worldRealmMsg = new WorldRealmMsg();
|
WorldRealmMsg worldRealmMsg = new WorldRealmMsg();
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ public class DestroyBuildingHandler extends AbstractClientMsgHandler {
|
|||||||
if (city != null)
|
if (city != null)
|
||||||
bane = city.getBane();
|
bane = city.getBane();
|
||||||
|
|
||||||
if (bane != null) {
|
if (bane != null){// && bane.getSiegePhase() == Enum.SiegePhase.WAR) {
|
||||||
ErrorPopupMsg.sendErrorPopup(pc, 171);
|
ErrorPopupMsg.sendErrorPopup(pc, 171);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -71,12 +71,9 @@ public class DestroyBuildingHandler extends AbstractClientMsgHandler {
|
|||||||
if (blueprint.getBuildingGroup() == BuildingGroup.TOL)
|
if (blueprint.getBuildingGroup() == BuildingGroup.TOL)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
// destorying a shrine will yield a rubble pile for looting
|
// Can't destroy a shrine
|
||||||
if (blueprint.getBuildingGroup() == BuildingGroup.SHRINE) {
|
if (blueprint.getBuildingGroup() == BuildingGroup.SHRINE)
|
||||||
building.modifyHealth(-building.getHealth(), origin.getPlayerCharacter());
|
|
||||||
building.destroyOrDerank(origin.getPlayerCharacter());
|
|
||||||
return true;
|
return true;
|
||||||
}
|
|
||||||
|
|
||||||
// Cannot destroy mines outside of normal mine mechanics
|
// Cannot destroy mines outside of normal mine mechanics
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ import engine.net.client.msg.ClientNetMsg;
|
|||||||
import engine.net.client.msg.group.GroupInviteMsg;
|
import engine.net.client.msg.group.GroupInviteMsg;
|
||||||
import engine.net.client.msg.group.GroupUpdateMsg;
|
import engine.net.client.msg.group.GroupUpdateMsg;
|
||||||
import engine.objects.Group;
|
import engine.objects.Group;
|
||||||
import engine.objects.Guild;
|
|
||||||
import engine.objects.PlayerCharacter;
|
import engine.objects.PlayerCharacter;
|
||||||
|
|
||||||
public class GroupInviteHandler extends AbstractClientMsgHandler {
|
public class GroupInviteHandler extends AbstractClientMsgHandler {
|
||||||
@@ -104,12 +103,6 @@ public class GroupInviteHandler extends AbstractClientMsgHandler {
|
|||||||
if (target.isIgnoringPlayer(source))
|
if (target.isIgnoringPlayer(source))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if(source.getGuild().getNation().equals(target.getGuild().getNation()) == false)
|
|
||||||
return false; // cannot group outside of nation
|
|
||||||
|
|
||||||
if(source.getGuild().getNation().equals(target.getGuild().getNation()) && source.getGuild().getNation().equals(Guild.getErrantGuild()))
|
|
||||||
if(source.getGuild().equals(target.getGuild()) == false)
|
|
||||||
return false; // cannot group as an errant guild with other errant guilds
|
|
||||||
|
|
||||||
// dont block invites to people already in a group and
|
// dont block invites to people already in a group and
|
||||||
// dont check for pending invites, the client does it
|
// dont check for pending invites, the client does it
|
||||||
|
|||||||
@@ -102,7 +102,7 @@ public class GroupInviteResponseHandler extends AbstractClientMsgHandler {
|
|||||||
|
|
||||||
// Run Keyclone Audit
|
// Run Keyclone Audit
|
||||||
|
|
||||||
KEYCLONEAUDIT.audit(player, group);
|
//KEYCLONEAUDIT.audit(player, group);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ public class HirelingServiceMsgHandler extends AbstractClientMsgHandler {
|
|||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
|
||||||
npc.setRepairCost(msg.repairCost);
|
npc.setSpecialPrice(msg.repairCost);
|
||||||
ManageNPCMsg outMsg = new ManageNPCMsg(npc);
|
ManageNPCMsg outMsg = new ManageNPCMsg(npc);
|
||||||
Dispatch dispatch = Dispatch.borrow(player, msg);
|
Dispatch dispatch = Dispatch.borrow(player, msg);
|
||||||
|
|
||||||
|
|||||||
@@ -25,8 +25,6 @@ import engine.objects.Guild;
|
|||||||
import engine.objects.GuildStatusController;
|
import engine.objects.GuildStatusController;
|
||||||
import engine.objects.PlayerCharacter;
|
import engine.objects.PlayerCharacter;
|
||||||
|
|
||||||
import static engine.objects.Bane.getBaneByAttackerGuild;
|
|
||||||
|
|
||||||
public class InviteToSubHandler extends AbstractClientMsgHandler {
|
public class InviteToSubHandler extends AbstractClientMsgHandler {
|
||||||
|
|
||||||
public InviteToSubHandler() {
|
public InviteToSubHandler() {
|
||||||
@@ -97,25 +95,6 @@ public class InviteToSubHandler extends AbstractClientMsgHandler {
|
|||||||
if (sourceGuild.equals(targetGuild))
|
if (sourceGuild.equals(targetGuild))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if(sourceGuild.getNation().getOwnedCity().getBane() != null)
|
|
||||||
return true; // cannot invite guilds to sub if you are baned
|
|
||||||
|
|
||||||
if(sourceGuild.getNation().getSubGuildList() != null){
|
|
||||||
for(Guild subGuild : sourceGuild.getNation().getSubGuildList()){
|
|
||||||
if(subGuild.getOwnedCity() != null)
|
|
||||||
if(subGuild.getOwnedCity().getBane() != null)
|
|
||||||
return true;//cannot invite guilds to sub if any tree in your nation has a bane on it
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(targetGuild.getOwnedCity() != null)
|
|
||||||
if(targetGuild.getOwnedCity().getBane() != null)
|
|
||||||
return true; // cannot be subbed if you have a bane placed on you
|
|
||||||
|
|
||||||
|
|
||||||
if(getBaneByAttackerGuild(targetGuild) != null)
|
|
||||||
return true; // cannot sub to a nation if they have a bane placed
|
|
||||||
|
|
||||||
//target must be GL or IC
|
//target must be GL or IC
|
||||||
|
|
||||||
if (GuildStatusController.isInnerCouncil(target.getGuildStatus()) == false && GuildStatusController.isGuildLeader(target.getGuildStatus()) == false) {
|
if (GuildStatusController.isInnerCouncil(target.getGuildStatus()) == false && GuildStatusController.isGuildLeader(target.getGuildStatus()) == false) {
|
||||||
|
|||||||
@@ -360,6 +360,11 @@ public class ItemProductionMsgHandler extends AbstractClientMsgHandler {
|
|||||||
targetItem.recycle(vendor);
|
targetItem.recycle(vendor);
|
||||||
vendor.removeItemFromForge(targetItem);
|
vendor.removeItemFromForge(targetItem);
|
||||||
|
|
||||||
|
//refund the gold for cancelled item
|
||||||
|
if(vendor.building.getStrongboxValue() + targetItem.getItemBase().getBaseValue() < 15000000){
|
||||||
|
vendor.building.setStrongboxValue(vendor.building.getStrongboxValue() + targetItem.getItemBase().getBaseValue());
|
||||||
|
}
|
||||||
|
|
||||||
// Refresh vendor's inventory to client
|
// Refresh vendor's inventory to client
|
||||||
|
|
||||||
outMsg = new ManageNPCMsg(vendor);
|
outMsg = new ManageNPCMsg(vendor);
|
||||||
|
|||||||
@@ -12,15 +12,16 @@ package engine.net.client.handlers;
|
|||||||
import engine.Enum.GuildHistoryType;
|
import engine.Enum.GuildHistoryType;
|
||||||
import engine.exception.MsgSendException;
|
import engine.exception.MsgSendException;
|
||||||
import engine.gameManager.ChatManager;
|
import engine.gameManager.ChatManager;
|
||||||
import engine.gameManager.GroupManager;
|
|
||||||
import engine.gameManager.SessionManager;
|
import engine.gameManager.SessionManager;
|
||||||
import engine.net.Dispatch;
|
import engine.net.Dispatch;
|
||||||
import engine.net.DispatchMessage;
|
import engine.net.DispatchMessage;
|
||||||
import engine.net.client.ClientConnection;
|
import engine.net.client.ClientConnection;
|
||||||
import engine.net.client.msg.ClientNetMsg;
|
import engine.net.client.msg.ClientNetMsg;
|
||||||
import engine.net.client.msg.group.GroupUpdateMsg;
|
|
||||||
import engine.net.client.msg.guild.LeaveGuildMsg;
|
import engine.net.client.msg.guild.LeaveGuildMsg;
|
||||||
import engine.objects.*;
|
import engine.objects.Guild;
|
||||||
|
import engine.objects.GuildStatusController;
|
||||||
|
import engine.objects.Mine;
|
||||||
|
import engine.objects.PlayerCharacter;
|
||||||
|
|
||||||
public class LeaveGuildHandler extends AbstractClientMsgHandler {
|
public class LeaveGuildHandler extends AbstractClientMsgHandler {
|
||||||
|
|
||||||
@@ -60,21 +61,6 @@ public class LeaveGuildHandler extends AbstractClientMsgHandler {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(GroupManager.getGroup(playerCharacter) != null) {
|
|
||||||
Group group = GroupManager.getGroup(playerCharacter);
|
|
||||||
group.removeGroupMember(playerCharacter);
|
|
||||||
GroupManager.removeFromGroups(playerCharacter);
|
|
||||||
GroupUpdateMsg gim;
|
|
||||||
gim = new GroupUpdateMsg();
|
|
||||||
gim.setGroup(group);
|
|
||||||
gim.setMessageType(3);
|
|
||||||
gim.setPlayer(playerCharacter);
|
|
||||||
group.sendUpdate(gim);
|
|
||||||
|
|
||||||
String text = playerCharacter.getFirstName() + " has left your group.";
|
|
||||||
ChatManager.chatGroupInfo(playerCharacter, text);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Send left guild message to rest of guild
|
// Send left guild message to rest of guild
|
||||||
ChatManager.chatGuildInfo(oldGuild, playerCharacter.getFirstName() + " has left the guild.");
|
ChatManager.chatGuildInfo(oldGuild, playerCharacter.getFirstName() + " has left the guild.");
|
||||||
|
|
||||||
|
|||||||
@@ -62,16 +62,23 @@ public class MOTDEditHandler extends AbstractClientMsgHandler {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (type == 1) // Guild MOTD
|
if (type == 1) { // Guild MOTD
|
||||||
msg.setMessage(guild.getMOTD());
|
msg.setMessage(guild.getMOTD());
|
||||||
else if (type == 3) // IC MOTD
|
guild.updateDatabase();
|
||||||
|
}else if (type == 3) { // IC MOTD
|
||||||
msg.setMessage(guild.getICMOTD());
|
msg.setMessage(guild.getICMOTD());
|
||||||
else if (type == 0) { // Nation MOTD
|
guild.updateDatabase();
|
||||||
|
}else if (type == 0) { // Nation MOTD
|
||||||
Guild nation = guild.getNation();
|
Guild nation = guild.getNation();
|
||||||
if (nation == null || !nation.isNation()) {
|
if (nation == null || !nation.isNation()) {
|
||||||
ErrorPopupMsg.sendErrorMsg(playerCharacter, "You do not have such authority!");
|
ErrorPopupMsg.sendErrorMsg(playerCharacter, "You do not have such authority!");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
nation.setNMOTD(msg.getMessage());
|
||||||
|
nation.updateDatabase();
|
||||||
|
for(Guild sub : nation.getSubGuildList()){
|
||||||
|
sub.setNMOTD(nation.getNMOTD());
|
||||||
|
}
|
||||||
msg.setMessage(nation.getMOTD());
|
msg.setMessage(nation.getMOTD());
|
||||||
}
|
}
|
||||||
dispatch = Dispatch.borrow(playerCharacter, msg);
|
dispatch = Dispatch.borrow(playerCharacter, msg);
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ import engine.Enum.DispatchChannel;
|
|||||||
import engine.Enum.GameObjectType;
|
import engine.Enum.GameObjectType;
|
||||||
import engine.exception.MsgSendException;
|
import engine.exception.MsgSendException;
|
||||||
import engine.gameManager.BuildingManager;
|
import engine.gameManager.BuildingManager;
|
||||||
import engine.gameManager.DbManager;
|
|
||||||
import engine.gameManager.SessionManager;
|
import engine.gameManager.SessionManager;
|
||||||
import engine.gameManager.ZoneManager;
|
import engine.gameManager.ZoneManager;
|
||||||
import engine.math.Bounds;
|
import engine.math.Bounds;
|
||||||
@@ -63,6 +62,7 @@ public class ManageCityAssetMsgHandler extends AbstractClientMsgHandler {
|
|||||||
Building building;
|
Building building;
|
||||||
|
|
||||||
msg = (ManageCityAssetsMsg) baseMsg;
|
msg = (ManageCityAssetsMsg) baseMsg;
|
||||||
|
|
||||||
player = SessionManager.getPlayerCharacter(origin);
|
player = SessionManager.getPlayerCharacter(origin);
|
||||||
|
|
||||||
if (player == null)
|
if (player == null)
|
||||||
@@ -72,21 +72,34 @@ public class ManageCityAssetMsgHandler extends AbstractClientMsgHandler {
|
|||||||
|
|
||||||
if (building == null) {
|
if (building == null) {
|
||||||
if (msg.actionType == 14) {
|
if (msg.actionType == 14) {
|
||||||
|
|
||||||
Zone zone = ZoneManager.findSmallestZone(player.getLoc());
|
Zone zone = ZoneManager.findSmallestZone(player.getLoc());
|
||||||
|
|
||||||
if (!zone.isPlayerCity()) {
|
if (!zone.isPlayerCity()) {
|
||||||
ErrorPopupMsg.sendErrorMsg(player, "Unable to find city to command.");
|
ErrorPopupMsg.sendErrorMsg(player, "Unable to find city to command.");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
City city = City.GetCityFromCache(zone.getPlayerCityUUID());
|
City city = City.GetCityFromCache(zone.getPlayerCityUUID());
|
||||||
if (city == null || !city.getGuild().equals(player.getGuild()) ||
|
|
||||||
(!GuildStatusController.isInnerCouncil(player.getGuildStatus()) &&
|
if (city == null) {
|
||||||
!GuildStatusController.isGuildLeader(player.getGuildStatus()))) {
|
ErrorPopupMsg.sendErrorMsg(player, "Unable to find city to command.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!city.getGuild().equals(player.getGuild())) {
|
||||||
ErrorPopupMsg.sendErrorMsg(player, "You are not in the correct guild to command this city.");
|
ErrorPopupMsg.sendErrorMsg(player, "You are not in the correct guild to command this city.");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!GuildStatusController.isInnerCouncil(player.getGuildStatus()) && !GuildStatusController.isGuildLeader(player.getGuildStatus())) {
|
||||||
|
ErrorPopupMsg.sendErrorMsg(player, "You must be an Inner Council or Guild leader to access city commands.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
ManageCityAssetsMsg mca = new ManageCityAssetsMsg(player, building);
|
ManageCityAssetsMsg mca = new ManageCityAssetsMsg(player, building);
|
||||||
mca.actionType = 15;
|
mca.actionType = 15;
|
||||||
DispatchMessage.dispatchMsgDispatch(Dispatch.borrow(player, mca), DispatchChannel.SECONDARY);
|
Dispatch dispatch = Dispatch.borrow(player, mca);
|
||||||
|
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -98,18 +111,20 @@ public class ManageCityAssetMsgHandler extends AbstractClientMsgHandler {
|
|||||||
outMsg.setTargetType(building.getObjectType().ordinal());
|
outMsg.setTargetType(building.getObjectType().ordinal());
|
||||||
outMsg.setTargetID(building.getObjectUUID());
|
outMsg.setTargetID(building.getObjectUUID());
|
||||||
outMsg.setAssetName(building.getName());
|
outMsg.setAssetName(building.getName());
|
||||||
DispatchMessage.dispatchMsgDispatch(Dispatch.borrow(player, outMsg), DispatchChannel.SECONDARY);
|
Dispatch dispatch = Dispatch.borrow(player, outMsg);
|
||||||
|
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (msg.actionType) {
|
if (msg.actionType == 2 || msg.actionType == 22) {
|
||||||
case 2:
|
|
||||||
case 22:
|
|
||||||
if (building.getBlueprint() != null && building.getBlueprint().getBuildingGroup() == engine.Enum.BuildingGroup.BANESTONE) {
|
if (building.getBlueprint() != null && building.getBlueprint().getBuildingGroup() == engine.Enum.BuildingGroup.BANESTONE) {
|
||||||
|
|
||||||
outMsg.actionType = 18;
|
outMsg.actionType = 18;
|
||||||
outMsg.setTargetType(building.getObjectType().ordinal());
|
outMsg.setTargetType(building.getObjectType().ordinal());
|
||||||
outMsg.setTargetID(building.getObjectUUID());
|
outMsg.setTargetID(building.getObjectUUID());
|
||||||
} else if (BuildingManager.playerCanManage(player, building)) {
|
|
||||||
|
} else if (BuildingManager.playerCanManage(player, building)) { //TODO allow Friends list.
|
||||||
configWindowState(player, building, outMsg);
|
configWindowState(player, building, outMsg);
|
||||||
outMsg.actionType = 3;
|
outMsg.actionType = 3;
|
||||||
outMsg.setTargetType(building.getObjectType().ordinal());
|
outMsg.setTargetType(building.getObjectType().ordinal());
|
||||||
@@ -117,58 +132,95 @@ public class ManageCityAssetMsgHandler extends AbstractClientMsgHandler {
|
|||||||
outMsg.setTargetType3(building.getObjectType().ordinal());
|
outMsg.setTargetType3(building.getObjectType().ordinal());
|
||||||
outMsg.setTargetID3(building.getObjectUUID());
|
outMsg.setTargetID3(building.getObjectUUID());
|
||||||
outMsg.setUnknown54(1);
|
outMsg.setUnknown54(1);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// Handle other cases
|
|
||||||
|
if (building.getBlueprintUUID() != 0)
|
||||||
|
switch (building.getBlueprint().getBuildingGroup()) {
|
||||||
|
case SHRINE:
|
||||||
if (building.getRank() == -1) {
|
if (building.getRank() == -1) {
|
||||||
if (!Bounds.collide(player.getLoc(), building)) {
|
if (!Bounds.collide(player.getLoc(), building)) {
|
||||||
ErrorPopupMsg.sendErrorPopup(player, 64);
|
ErrorPopupMsg.sendErrorPopup(player, 64);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
switch (building.getBlueprint().getBuildingGroup()) {
|
|
||||||
case SHRINE:
|
|
||||||
Shrine shrine = Shrine.shrinesByBuildingUUID.get(building.getObjectUUID());
|
Shrine shrine = Shrine.shrinesByBuildingUUID.get(building.getObjectUUID());
|
||||||
if (shrine == null || shrine.getFavors() == 0) {
|
|
||||||
|
if (shrine == null)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (shrine.getFavors() == 0) {
|
||||||
ErrorPopupMsg.sendErrorPopup(player, 166); // There is no more favor in this shrine to loot
|
ErrorPopupMsg.sendErrorPopup(player, 166); // There is no more favor in this shrine to loot
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
//loot elan stones
|
|
||||||
MobLoot elanStones = new MobLoot(player,ItemBase.getItemBase(1705032),1,false);
|
BuildingManager.lootBuilding(player, building);
|
||||||
Item promotedItem = elanStones.promoteToItem(player);
|
|
||||||
promotedItem.setNumOfItems(shrine.getFavors());
|
|
||||||
player.getCharItemManager().addItemToInventory(promotedItem);
|
|
||||||
DbManager.ItemQueries.UPDATE_NUM_ITEMS(promotedItem,promotedItem.getNumOfItems());
|
|
||||||
player.getCharItemManager().updateInventory();
|
|
||||||
shrine.setFavors(0);
|
|
||||||
break;
|
|
||||||
case WAREHOUSE:
|
|
||||||
Warehouse warehouse = Warehouse.warehouseByBuildingUUID.get(building.getObjectUUID());
|
|
||||||
if (warehouse == null || warehouse.isEmpty()) {
|
|
||||||
ErrorPopupMsg.sendErrorPopup(player, 167); // no more resources.
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case WAREHOUSE:
|
||||||
|
//TODO check
|
||||||
|
if (building.getRank() == -1) {
|
||||||
|
if (!Bounds.collide(player.getLoc(), building)) {
|
||||||
|
ErrorPopupMsg.sendErrorPopup(player, 64);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
Warehouse warehouse = Warehouse.warehouseByBuildingUUID.get(building.getObjectUUID());
|
||||||
|
|
||||||
|
if (warehouse == null)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (warehouse.isEmpty()) {
|
||||||
|
ErrorPopupMsg.sendErrorPopup(player, 167); // no more resources.
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
BuildingManager.lootBuilding(player, building);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (building.getRank() == -1)
|
||||||
|
return true;
|
||||||
|
|
||||||
AbstractCharacter owner = building.getOwner();
|
AbstractCharacter owner = building.getOwner();
|
||||||
|
|
||||||
|
//no owner, send building info
|
||||||
if (owner == null) {
|
if (owner == null) {
|
||||||
msg.actionType = 4;
|
msg.actionType = 4;
|
||||||
DispatchMessage.dispatchMsgDispatch(Dispatch.borrow(player, msg), DispatchChannel.SECONDARY);
|
|
||||||
} else {
|
Dispatch dispatch = Dispatch.borrow(player, msg);
|
||||||
|
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
outMsg.actionType = 4;
|
outMsg.actionType = 4;
|
||||||
outMsg.setTargetType(building.getObjectType().ordinal());
|
outMsg.setTargetType(building.getObjectType().ordinal());
|
||||||
outMsg.setTargetID(building.getObjectUUID());
|
outMsg.setTargetID(building.getObjectUUID());
|
||||||
outMsg.setAssetName(building.getName());
|
outMsg.setAssetName(building.getName());
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
Dispatch dispatch = Dispatch.borrow(player, outMsg);
|
||||||
DispatchMessage.dispatchMsgDispatch(Dispatch.borrow(player, outMsg), DispatchChannel.SECONDARY);
|
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
||||||
return true;
|
return true;
|
||||||
case 13:
|
}
|
||||||
|
|
||||||
|
if (msg.actionType == 13) {
|
||||||
outMsg.actionType = 13;
|
outMsg.actionType = 13;
|
||||||
DispatchMessage.dispatchMsgDispatch(Dispatch.borrow(player, outMsg), DispatchChannel.SECONDARY);
|
Dispatch dispatch = Dispatch.borrow(player, outMsg);
|
||||||
|
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
||||||
return true;
|
return true;
|
||||||
case 5:
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//Rename Building.
|
||||||
|
|
||||||
|
if (msg.actionType == 5) {
|
||||||
|
|
||||||
|
//TODO we need to check names before allowing
|
||||||
building.setName(msg.getAssetName());
|
building.setName(msg.getAssetName());
|
||||||
configWindowState(player, building, outMsg);
|
configWindowState(player, building, outMsg);
|
||||||
|
|
||||||
outMsg.actionType = 3;
|
outMsg.actionType = 3;
|
||||||
outMsg.setTargetType(building.getObjectType().ordinal());
|
outMsg.setTargetType(building.getObjectType().ordinal());
|
||||||
outMsg.setTargetID(building.getObjectUUID());
|
outMsg.setTargetID(building.getObjectUUID());
|
||||||
@@ -176,36 +228,49 @@ public class ManageCityAssetMsgHandler extends AbstractClientMsgHandler {
|
|||||||
outMsg.setTargetID3(building.getObjectUUID());
|
outMsg.setTargetID3(building.getObjectUUID());
|
||||||
outMsg.setAssetName1(building.getName());
|
outMsg.setAssetName1(building.getName());
|
||||||
outMsg.setUnknown54(1);
|
outMsg.setUnknown54(1);
|
||||||
DispatchMessage.dispatchMsgDispatch(Dispatch.borrow(player, outMsg), DispatchChannel.SECONDARY);
|
|
||||||
|
Dispatch dispatch = Dispatch.borrow(player, outMsg);
|
||||||
|
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
case 14:
|
|
||||||
ManageCityAssetsMsg mca = new ManageCityAssetsMsg(player, building);
|
//TOL, update city name also
|
||||||
mca.actionType = 15;
|
//TODO update city and zone in database
|
||||||
DispatchMessage.dispatchMsgDispatch(Dispatch.borrow(player, mca), DispatchChannel.SECONDARY);
|
//TODO update city map data in game server
|
||||||
return true;
|
|
||||||
case 20:
|
|
||||||
// Handle case 20
|
|
||||||
return handleCase20(player, outMsg, building, msg, origin);
|
|
||||||
default:
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean handleCase20(PlayerCharacter player, ManageCityAssetsMsg outMsg, Building building, ManageCityAssetsMsg msg, ClientConnection origin) throws MsgSendException {
|
if (msg.actionType == 14) {
|
||||||
|
ManageCityAssetsMsg mca = new ManageCityAssetsMsg(player, building);
|
||||||
|
mca.actionType = 15;
|
||||||
|
Dispatch dispatch = Dispatch.borrow(player, mca);
|
||||||
|
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (msg.actionType == 20) {
|
||||||
|
|
||||||
Zone baneZone = building.getParentZone();
|
Zone baneZone = building.getParentZone();
|
||||||
|
|
||||||
if (baneZone == null)
|
if (baneZone == null)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
City banedCity = City.getCity(baneZone.getPlayerCityUUID());
|
City banedCity = City.getCity(baneZone.getPlayerCityUUID());
|
||||||
|
|
||||||
if (banedCity == null)
|
if (banedCity == null)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
Bane bane = banedCity.getBane();
|
Bane bane = banedCity.getBane();
|
||||||
if (bane == null || bane.getLiveDate() != null || player.getGuild() != banedCity.getGuild() || !GuildStatusController.isInnerCouncil(player.getGuildStatus()))
|
|
||||||
|
if (bane == null || bane.getLiveDate() != null || player.getGuild() != banedCity.getGuild() || GuildStatusController.isInnerCouncil(player.getGuildStatus()) == false)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
int baneHour = msg.getBaneHour();
|
int baneHour = msg.getBaneHour();
|
||||||
|
|
||||||
if (baneHour < 16 || baneHour > 24) {
|
if (baneHour < 16 || baneHour > 24) {
|
||||||
PlaceAssetMsg.sendPlaceAssetError(origin, 1, "A Serious error has occurred. Please post details for to ensure transaction integrity");
|
PlaceAssetMsg.sendPlaceAssetError(origin, 1, "A Serious error has occurred. Please post details for to ensure transaction integrity");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
DateTime baneLive = new DateTime(bane.getPlacementDate());
|
DateTime baneLive = new DateTime(bane.getPlacementDate());
|
||||||
baneLive = baneHour == 24 ? baneLive.plusDays(3) : baneLive.plusDays(2);
|
baneLive = baneHour == 24 ? baneLive.plusDays(3) : baneLive.plusDays(2);
|
||||||
baneLive = baneHour == 24 ? baneLive.hourOfDay().setCopy(0) : baneLive.hourOfDay().setCopy(baneHour);
|
baneLive = baneHour == 24 ? baneLive.hourOfDay().setCopy(0) : baneLive.hourOfDay().setCopy(baneHour);
|
||||||
@@ -213,10 +278,13 @@ public class ManageCityAssetMsgHandler extends AbstractClientMsgHandler {
|
|||||||
baneLive = baneLive.secondOfMinute().setCopy(1);
|
baneLive = baneLive.secondOfMinute().setCopy(1);
|
||||||
bane.setLiveDate(baneLive);
|
bane.setLiveDate(baneLive);
|
||||||
outMsg.actionType = 18;
|
outMsg.actionType = 18;
|
||||||
DispatchMessage.dispatchMsgDispatch(Dispatch.borrow(player, outMsg), DispatchChannel.SECONDARY);
|
|
||||||
|
Dispatch dispatch = Dispatch.borrow(player, outMsg);
|
||||||
|
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void configWindowState(PlayerCharacter player, Building building, ManageCityAssetsMsg manageCityAssetsMsg) {
|
public void configWindowState(PlayerCharacter player, Building building, ManageCityAssetsMsg manageCityAssetsMsg) {
|
||||||
|
|
||||||
@@ -226,7 +294,7 @@ public class ManageCityAssetMsgHandler extends AbstractClientMsgHandler {
|
|||||||
|
|
||||||
// Owner is obviously allowed to upgrade his own buildings
|
// Owner is obviously allowed to upgrade his own buildings
|
||||||
|
|
||||||
if (building.getOwner() != null && building.getOwner().equals(player)) {
|
if (building.getOwner().equals(player)) {
|
||||||
|
|
||||||
// Players cannot destroy or transfer a TOL.
|
// Players cannot destroy or transfer a TOL.
|
||||||
|
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ import engine.powers.PowersBase;
|
|||||||
import engine.server.MBServerStatics;
|
import engine.server.MBServerStatics;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @Author:
|
* @Author:
|
||||||
@@ -105,7 +106,7 @@ public class MerchantMsgHandler extends AbstractClientMsgHandler {
|
|||||||
|
|
||||||
// Validate player can obtain blessing
|
// Validate player can obtain blessing
|
||||||
|
|
||||||
if (GuildStatusController.isGuildLeader(player.getGuildStatus()) == false) {
|
if (!GuildStatusController.isGuildLeader(player.getGuildStatus())) {
|
||||||
ErrorPopupMsg.sendErrorPopup(player, 173); // You must be the leader of a guild to receive a blessing
|
ErrorPopupMsg.sendErrorPopup(player, 173); // You must be the leader of a guild to receive a blessing
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -126,12 +127,12 @@ public class MerchantMsgHandler extends AbstractClientMsgHandler {
|
|||||||
|
|
||||||
realm = RealmMap.getRealmForCity(city);
|
realm = RealmMap.getRealmForCity(city);
|
||||||
|
|
||||||
if (realm.getCanBeClaimed() == false) {
|
if (!realm.getCanBeClaimed()) {
|
||||||
ErrorPopupMsg.sendErrorPopup(player, 180); // This territory cannot be ruled by anyone
|
ErrorPopupMsg.sendErrorPopup(player, 180); // This territory cannot be ruled by anyone
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (realm.isRuled() == true) {
|
if (realm.isRuled()) {
|
||||||
ErrorPopupMsg.sendErrorPopup(player, 178); // This territory is already claimed
|
ErrorPopupMsg.sendErrorPopup(player, 178); // This territory is already claimed
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -142,12 +143,12 @@ public class MerchantMsgHandler extends AbstractClientMsgHandler {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void requestBoon(MerchantMsg msg, ClientConnection origin, PlayerCharacter player, NPC npc) {
|
private static void requestBoon(PlayerCharacter player, NPC npc) {
|
||||||
|
|
||||||
Building shrineBuilding;
|
Building shrineBuilding;
|
||||||
Shrine shrine;
|
Shrine shrine;
|
||||||
|
|
||||||
if (npc.getGuild().getNation() != player.getGuild().getNation())
|
if (!npc.getGuild().getNation().equals(player.getGuild().getNation()))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
shrineBuilding = npc.getBuilding();
|
shrineBuilding = npc.getBuilding();
|
||||||
@@ -155,7 +156,7 @@ public class MerchantMsgHandler extends AbstractClientMsgHandler {
|
|||||||
if (shrineBuilding == null)
|
if (shrineBuilding == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (shrineBuilding.getBlueprint() != null && shrineBuilding.getBlueprint().getBuildingGroup() != engine.Enum.BuildingGroup.SHRINE)
|
if (shrineBuilding.getBlueprint() != null && !shrineBuilding.getBlueprint().getBuildingGroup().equals(engine.Enum.BuildingGroup.SHRINE))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (shrineBuilding.getRank() == -1)
|
if (shrineBuilding.getRank() == -1)
|
||||||
@@ -171,12 +172,10 @@ public class MerchantMsgHandler extends AbstractClientMsgHandler {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
//already haz boon.
|
if (player.containsEffect(shrine.getShrineType().getPowerToken())) {
|
||||||
|
//remove old boon to apply new one, allows boon refreshing
|
||||||
//if (player.containsEffect(shrine.getShrineType().getPowerToken())) {
|
player.effects.remove(PowersManager.getPowerByToken(shrine.getShrineType().getPowerToken()).name);
|
||||||
// ErrorPopupMsg.sendErrorPopup(player, 199);
|
}
|
||||||
// return;
|
|
||||||
//}
|
|
||||||
|
|
||||||
if (!Shrine.canTakeFavor(player, shrine))
|
if (!Shrine.canTakeFavor(player, shrine))
|
||||||
return;
|
return;
|
||||||
@@ -191,14 +190,31 @@ public class MerchantMsgHandler extends AbstractClientMsgHandler {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(shrinePower.getName().equals("Boon: Nephilim"))
|
int trains = 0;
|
||||||
shrinePower.name = "Boon: Chaos";
|
switch(npc.getRank()){
|
||||||
|
case 1:
|
||||||
|
trains = 10;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
trains = 15;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
trains = 20;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
trains = 25;
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
trains = 30;
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
trains = 35;
|
||||||
|
break;
|
||||||
|
case 7:
|
||||||
|
trains = 40;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
int trains = 5 * npc.getRank() + 5;//40 - (rank * 10);
|
|
||||||
if (trains < 0)
|
|
||||||
trains = 0;
|
|
||||||
|
|
||||||
//System.out.println(trains);
|
|
||||||
PowersManager.applyPower(player, player, player.getLoc(), shrinePower.getToken(), trains, false);
|
PowersManager.applyPower(player, player, player.getLoc(), shrinePower.getToken(), trains, false);
|
||||||
ChatManager.chatGuildInfo(player.getGuild(), player.getName() + " has recieved a boon costing " + 1 + " point of favor.");
|
ChatManager.chatGuildInfo(player.getGuild(), player.getName() + " has recieved a boon costing " + 1 + " point of favor.");
|
||||||
shrineBuilding.addEffectBit(1000000 << 2);
|
shrineBuilding.addEffectBit(1000000 << 2);
|
||||||
@@ -258,9 +274,31 @@ public class MerchantMsgHandler extends AbstractClientMsgHandler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (targetCity == null)
|
if (targetCity == null){
|
||||||
|
Mine mineTele = null;
|
||||||
|
for(Mine mine : Mine.getMinesToTeleportTo(player)){
|
||||||
|
if(mine.getObjectUUID() == msg.getCityID()){
|
||||||
|
mineTele = mine;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(mineTele == null){
|
||||||
return;
|
return;
|
||||||
|
}else {
|
||||||
|
int time = MBServerStatics.TELEPORT_TIME_IN_SECONDS;
|
||||||
|
msg.setTeleportTime(time);
|
||||||
|
Building tower = Mine.getTower(mineTele);
|
||||||
|
if (tower == null)
|
||||||
|
return;
|
||||||
|
Vector3fImmutable teleportLoc = Vector3fImmutable.getRandomPointOnCircle(tower.getLoc(), 10);
|
||||||
|
ChatManager.chatSystemInfo(player, "You Will Teleport To " + mineTele.getParentZone().getParent().getName() + "'s Mine In " + time + " Seconds.");
|
||||||
|
if (time > 0) {
|
||||||
|
//TODO add timer to teleport
|
||||||
|
TeleportJob tj = new TeleportJob(player, npc, teleportLoc, origin, true);
|
||||||
|
JobScheduler.getInstance().scheduleJob(tj, time * 1000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
//finish porting to a city
|
||||||
//verify level required to teleport or repledge
|
//verify level required to teleport or repledge
|
||||||
|
|
||||||
Guild toGuild = targetCity.getGuild();
|
Guild toGuild = targetCity.getGuild();
|
||||||
@@ -314,6 +352,9 @@ public class MerchantMsgHandler extends AbstractClientMsgHandler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
private static PowersBase getPowerforHermit(NPC npc) {
|
private static PowersBase getPowerforHermit(NPC npc) {
|
||||||
|
|
||||||
int contractID;
|
int contractID;
|
||||||
@@ -418,7 +459,7 @@ public class MerchantMsgHandler extends AbstractClientMsgHandler {
|
|||||||
if (isHermit(npc))
|
if (isHermit(npc))
|
||||||
requestHermitBlessing(msg, origin, player, npc);
|
requestHermitBlessing(msg, origin, player, npc);
|
||||||
else
|
else
|
||||||
requestBoon(msg, origin, player, npc);
|
requestBoon(player, npc);
|
||||||
break;
|
break;
|
||||||
case 15:
|
case 15:
|
||||||
LeaderboardMessage lbm = new LeaderboardMessage();
|
LeaderboardMessage lbm = new LeaderboardMessage();
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import engine.gameManager.BuildingManager;
|
|||||||
import engine.gameManager.DbManager;
|
import engine.gameManager.DbManager;
|
||||||
import engine.gameManager.NPCManager;
|
import engine.gameManager.NPCManager;
|
||||||
import engine.gameManager.SessionManager;
|
import engine.gameManager.SessionManager;
|
||||||
|
import engine.math.Vector3fImmutable;
|
||||||
import engine.net.Dispatch;
|
import engine.net.Dispatch;
|
||||||
import engine.net.DispatchMessage;
|
import engine.net.DispatchMessage;
|
||||||
import engine.net.client.ClientConnection;
|
import engine.net.client.ClientConnection;
|
||||||
@@ -41,6 +42,7 @@ public class MinionTrainingMsgHandler extends AbstractClientMsgHandler {
|
|||||||
|
|
||||||
if (player == null)
|
if (player == null)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (minionMsg.getNpcType() == Enum.GameObjectType.NPC.ordinal()) {
|
if (minionMsg.getNpcType() == Enum.GameObjectType.NPC.ordinal()) {
|
||||||
|
|
||||||
NPC npc = NPC.getFromCache(minionMsg.getNpcID());
|
NPC npc = NPC.getFromCache(minionMsg.getNpcID());
|
||||||
@@ -61,10 +63,10 @@ public class MinionTrainingMsgHandler extends AbstractClientMsgHandler {
|
|||||||
|
|
||||||
Mob toRemove = Mob.getFromCache(minionMsg.getUUID());
|
Mob toRemove = Mob.getFromCache(minionMsg.getUUID());
|
||||||
|
|
||||||
if (!npc.siegeMinionMap.containsKey(toRemove))
|
if (!npc.getSiegeMinionMap().containsKey(toRemove))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
npc.siegeMinionMap.remove(toRemove);
|
npc.getSiegeMinionMap().remove(toRemove);
|
||||||
|
|
||||||
WorldGrid.RemoveWorldObject(toRemove);
|
WorldGrid.RemoveWorldObject(toRemove);
|
||||||
|
|
||||||
@@ -72,19 +74,15 @@ public class MinionTrainingMsgHandler extends AbstractClientMsgHandler {
|
|||||||
toRemove.getParentZone().zoneMobSet.remove(toRemove);
|
toRemove.getParentZone().zoneMobSet.remove(toRemove);
|
||||||
|
|
||||||
DbManager.removeFromCache(toRemove);
|
DbManager.removeFromCache(toRemove);
|
||||||
|
PlayerCharacter petOwner = toRemove.getOwner();
|
||||||
if(toRemove.guardCaptain.getObjectType().equals(Enum.GameObjectType.PlayerCharacter)) {
|
|
||||||
PlayerCharacter petOwner = (PlayerCharacter) toRemove.guardCaptain;
|
|
||||||
|
|
||||||
if (petOwner != null) {
|
if (petOwner != null) {
|
||||||
petOwner.setPet(null);
|
petOwner.setPet(null);
|
||||||
|
toRemove.setOwner(null);
|
||||||
toRemove.guardCaptain = null;
|
|
||||||
PetMsg petMsg = new PetMsg(5, null);
|
PetMsg petMsg = new PetMsg(5, null);
|
||||||
Dispatch dispatch = Dispatch.borrow(petOwner, petMsg);
|
Dispatch dispatch = Dispatch.borrow(petOwner, petMsg);
|
||||||
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// we Found the move to remove, lets break the for loop so it doesnt look for more.
|
// we Found the move to remove, lets break the for loop so it doesnt look for more.
|
||||||
|
|
||||||
@@ -117,7 +115,7 @@ public class MinionTrainingMsgHandler extends AbstractClientMsgHandler {
|
|||||||
if (npc.getContractID() == 842)
|
if (npc.getContractID() == 842)
|
||||||
maxSlots = 1;
|
maxSlots = 1;
|
||||||
|
|
||||||
if (npc.siegeMinionMap.size() == maxSlots)
|
if (npc.getSiegeMinionMap().size() == maxSlots)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
int mobBase;
|
int mobBase;
|
||||||
@@ -148,10 +146,42 @@ public class MinionTrainingMsgHandler extends AbstractClientMsgHandler {
|
|||||||
if (mobBase == 0)
|
if (mobBase == 0)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
Mob siegeMob = Mob.createSiegeMinion(npc, mobBase);
|
Mob siegeMob = Mob.createSiegeMob(npc, mobBase, npc.getGuild(), zone, b.getLoc(), (short) 1);
|
||||||
|
|
||||||
if (siegeMob == null)
|
if (siegeMob == null)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
if (siegeMob != null) {
|
||||||
|
|
||||||
|
siegeMob.setSpawnTime(60 * 15);
|
||||||
|
Building building = BuildingManager.getBuilding(((MinionTrainingMessage) baseMsg).getBuildingID());
|
||||||
|
|
||||||
|
siegeMob.building = building;
|
||||||
|
siegeMob.parentZone = zone;
|
||||||
|
|
||||||
|
// Slot siege minion
|
||||||
|
// Can be either corner tower or bulwark.
|
||||||
|
|
||||||
|
int slot;
|
||||||
|
|
||||||
|
if (building.getBlueprint().getBuildingGroup().equals(Enum.BuildingGroup.ARTYTOWER))
|
||||||
|
slot = 2;
|
||||||
|
else
|
||||||
|
slot = ((NPC) siegeMob.npcOwner).getSiegeMinionMap().get(siegeMob) + 1; // First slot is for the captain
|
||||||
|
|
||||||
|
BuildingLocation slotLocation = BuildingManager._slotLocations.get(building.meshUUID).get(slot);
|
||||||
|
siegeMob.bindLoc = building.getLoc().add(slotLocation.getLocation());
|
||||||
|
|
||||||
|
// Rotate slot position by the building rotation
|
||||||
|
|
||||||
|
siegeMob.bindLoc = Vector3fImmutable.rotateAroundPoint(building.getLoc(), siegeMob.bindLoc, building.getBounds().getQuaternion().angleY);
|
||||||
|
|
||||||
|
siegeMob.loc = new Vector3fImmutable(siegeMob.bindLoc);
|
||||||
|
siegeMob.endLoc = new Vector3fImmutable(siegeMob.bindLoc);
|
||||||
|
|
||||||
|
zone.zoneMobSet.add(siegeMob);
|
||||||
|
siegeMob.setLoc(siegeMob.bindLoc);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ManageNPCMsg mnm = new ManageNPCMsg(npc);
|
ManageNPCMsg mnm = new ManageNPCMsg(npc);
|
||||||
@@ -198,14 +228,11 @@ public class MinionTrainingMsgHandler extends AbstractClientMsgHandler {
|
|||||||
toRemove.getParentZone().zoneMobSet.remove(toRemove);
|
toRemove.getParentZone().zoneMobSet.remove(toRemove);
|
||||||
|
|
||||||
DbManager.removeFromCache(toRemove);
|
DbManager.removeFromCache(toRemove);
|
||||||
|
PlayerCharacter petOwner = toRemove.getOwner();
|
||||||
|
|
||||||
PlayerCharacter petOwner = (PlayerCharacter) toRemove.guardCaptain;
|
|
||||||
|
|
||||||
if (petOwner != null) {
|
if (petOwner != null) {
|
||||||
petOwner.setPet(null);
|
petOwner.setPet(null);
|
||||||
|
toRemove.setOwner(null);
|
||||||
toRemove.guardCaptain = null;
|
|
||||||
PetMsg petMsg = new PetMsg(5, null);
|
PetMsg petMsg = new PetMsg(5, null);
|
||||||
Dispatch dispatch = Dispatch.borrow(petOwner, petMsg);
|
Dispatch dispatch = Dispatch.borrow(petOwner, petMsg);
|
||||||
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
||||||
@@ -271,12 +298,12 @@ public class MinionTrainingMsgHandler extends AbstractClientMsgHandler {
|
|||||||
|
|
||||||
String pirateName = NPCManager.getPirateName(mobBase);
|
String pirateName = NPCManager.getPirateName(mobBase);
|
||||||
|
|
||||||
Mob toCreate = Mob.createGuardMinion(npc, npc.getLevel(), pirateName);
|
if (!DbManager.MobQueries.ADD_TO_GUARDS(npc.getObjectUUID(), mobBase, pirateName, npc.getSiegeMinionMap().size() + 1))
|
||||||
|
|
||||||
if (toCreate == null)
|
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (!DbManager.MobQueries.ADD_TO_GUARDS(npc.getObjectUUID(), mobBase, pirateName, npc.getSiegeMinionMap().size() + 1))
|
Mob toCreate = Mob.createGuardMob(npc, npc.getGuild(), zone, building.getLoc(), npc.getLevel(), pirateName);
|
||||||
|
|
||||||
|
if (toCreate == null)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (toCreate != null) {
|
if (toCreate != null) {
|
||||||
|
|||||||
@@ -195,9 +195,7 @@ public class ObjectActionMsgHandler extends AbstractClientMsgHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
hPMod = (building.getMaxHitPoints() * Realm.getRealmHealthMod(city));
|
hPMod = (building.getMaxHitPoints() * Realm.getRealmHealthMod(city));
|
||||||
float percentOfHealth = building.getCurrentHitpoints() / building.getHealthMax();
|
|
||||||
building.setMaxHitPoints(building.getMaxHitPoints() + hPMod);
|
building.setMaxHitPoints(building.getMaxHitPoints() + hPMod);
|
||||||
building.setCurrentHitPoints(building.getMaxHitPoints() * percentOfHealth);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -423,33 +421,12 @@ public class ObjectActionMsgHandler extends AbstractClientMsgHandler {
|
|||||||
itemMan.consume(item);
|
itemMan.consume(item);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
//ANNIVERSERY GIFT
|
|
||||||
case 31:
|
case 31:
|
||||||
// *** Disabled for now: Needs bootyset created
|
|
||||||
|
|
||||||
//if (ib.getUUID() == 971012) {
|
|
||||||
// int random = ThreadLocalRandom.current().nextInt(ItemBase.AnniverseryGifts.size());
|
|
||||||
// int annyID = ItemBase.AnniverseryGifts.get(random);
|
|
||||||
|
|
||||||
// ItemBase annyIB = ItemBase.getItemBase(annyID);
|
|
||||||
// if (annyIB != null) {
|
|
||||||
// Item gift = MobLoot.createItemForPlayer(player, annyIB);
|
|
||||||
// if (gift != null) {
|
|
||||||
// itemMan.addItemToInventory(gift);
|
|
||||||
// itemMan.consume(item);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// break;
|
|
||||||
//}
|
|
||||||
int i = 0;
|
|
||||||
if(i != 0) {
|
|
||||||
LootManager.peddleFate(player,item);
|
LootManager.peddleFate(player,item);
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 30: //water bucket
|
case 30: //water bucket
|
||||||
case 8: //potions, tears of saedron
|
case 8: //potions, tears of saedron
|
||||||
|
|
||||||
case 5: //runes, petition, warrant, scrolls
|
case 5: //runes, petition, warrant, scrolls
|
||||||
if (uuid > 3000 && uuid < 3050) { //Discipline Runes
|
if (uuid > 3000 && uuid < 3050) { //Discipline Runes
|
||||||
if (ApplyRuneMsg.applyRune(uuid, origin, player)) {
|
if (ApplyRuneMsg.applyRune(uuid, origin, player)) {
|
||||||
@@ -466,7 +443,12 @@ public class ObjectActionMsgHandler extends AbstractClientMsgHandler {
|
|||||||
itemMan.consume(item);
|
itemMan.consume(item);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
} else if (uuid > 252122 && uuid < 252128) { //mastery runes
|
} else if (uuid > 252122 && uuid < 252137) { //blood runes
|
||||||
|
if (ApplyRuneMsg.applyRune(uuid, origin, player)) {
|
||||||
|
itemMan.consume(item);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
} else if (uuid > 252128 && uuid < 252128) { //mastery runes
|
||||||
if (ApplyRuneMsg.applyRune(uuid, origin, player)) {
|
if (ApplyRuneMsg.applyRune(uuid, origin, player)) {
|
||||||
itemMan.consume(item);
|
itemMan.consume(item);
|
||||||
}
|
}
|
||||||
@@ -532,7 +514,6 @@ public class ObjectActionMsgHandler extends AbstractClientMsgHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Send piss bucket animation
|
// Send piss bucket animation
|
||||||
|
|
||||||
VisualUpdateMessage vum = new VisualUpdateMessage(player, 16323);
|
VisualUpdateMessage vum = new VisualUpdateMessage(player, 16323);
|
||||||
vum.configure();
|
vum.configure();
|
||||||
DispatchMessage.sendToAllInRange(player, vum);
|
DispatchMessage.sendToAllInRange(player, vum);
|
||||||
@@ -542,16 +523,14 @@ public class ObjectActionMsgHandler extends AbstractClientMsgHandler {
|
|||||||
PowersManager.applyPower(player, target, Vector3fImmutable.ZERO, ib.getUseID(), ib.getUseAmount(), true);
|
PowersManager.applyPower(player, target, Vector3fImmutable.ZERO, ib.getUseID(), ib.getUseAmount(), true);
|
||||||
|
|
||||||
itemMan.consume(item);
|
itemMan.consume(item);
|
||||||
} else if(ib.getUUID() > 252128 && ib.getUUID() < 252568){
|
|
||||||
if (ApplyRuneMsg.applyRune(uuid, origin, player)) {
|
|
||||||
itemMan.consume(item);
|
|
||||||
}
|
|
||||||
} else //just remove the item at this point
|
} else //just remove the item at this point
|
||||||
itemMan.consume(item);
|
itemMan.consume(item);
|
||||||
|
|
||||||
dispatch = Dispatch.borrow(player, msg);
|
dispatch = Dispatch.borrow(player, msg);
|
||||||
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);
|
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);
|
||||||
|
if(!item.getItemBase().getType().equals(ItemType.POTION)) {
|
||||||
player.cancelOnSpell();
|
player.cancelOnSpell();
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default: //shouldn't be here, consume item
|
default: //shouldn't be here, consume item
|
||||||
dispatch = Dispatch.borrow(player, msg);
|
dispatch = Dispatch.borrow(player, msg);
|
||||||
|
|||||||
@@ -44,13 +44,6 @@ public class OpenFriendsCondemnListMsgHandler extends AbstractClientMsgHandler {
|
|||||||
return true;
|
return true;
|
||||||
|
|
||||||
msg = (OpenFriendsCondemnListMsg) baseMsg;
|
msg = (OpenFriendsCondemnListMsg) baseMsg;
|
||||||
|
|
||||||
sourceBuilding = BuildingManager.getBuildingFromCache(msg.getBuildingID());
|
|
||||||
|
|
||||||
if(sourceBuilding != null && sourceBuilding.getBlueprint().getBuildingGroup().equals(Enum.BuildingGroup.TOL)){
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
openFriendsCondemnListMsg = new OpenFriendsCondemnListMsg(msg);
|
openFriendsCondemnListMsg = new OpenFriendsCondemnListMsg(msg);
|
||||||
friendListType = Enum.FriendListType.getListTypeByID(msg.getMessageType());
|
friendListType = Enum.FriendListType.getListTypeByID(msg.getMessageType());
|
||||||
|
|
||||||
|
|||||||
@@ -212,6 +212,10 @@ public class OrderNPCMsgHandler extends AbstractClientMsgHandler {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (AbstractCharacter guard : building.getHirelings().keySet()) {
|
||||||
|
if (guard.getObjectType() == GameObjectType.Mob)
|
||||||
|
((Mob) guard).setPatrolPointIndex(0);
|
||||||
|
}
|
||||||
} else if (building.getPatrolPoints() != null)
|
} else if (building.getPatrolPoints() != null)
|
||||||
ClearPatrolPoints(building.getObjectUUID());
|
ClearPatrolPoints(building.getObjectUUID());
|
||||||
|
|
||||||
@@ -219,6 +223,10 @@ public class OrderNPCMsgHandler extends AbstractClientMsgHandler {
|
|||||||
AddSentryPoints(building.getObjectUUID(), orderNpcMsg.getSentryPoints());
|
AddSentryPoints(building.getObjectUUID(), orderNpcMsg.getSentryPoints());
|
||||||
} else if (building.getSentryPoints() != null)
|
} else if (building.getSentryPoints() != null)
|
||||||
ClearSentryPoints(building.getObjectUUID());
|
ClearSentryPoints(building.getObjectUUID());
|
||||||
|
|
||||||
|
// Dispatch dispatch = Dispatch.borrow(pc, msg);
|
||||||
|
// DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void processUpgradeNPC(PlayerCharacter player, AbstractCharacter abstractCharacter) {
|
private static void processUpgradeNPC(PlayerCharacter player, AbstractCharacter abstractCharacter) {
|
||||||
@@ -533,7 +541,7 @@ public class OrderNPCMsgHandler extends AbstractClientMsgHandler {
|
|||||||
|
|
||||||
} else if (orderNPCMsg.getObjectType() == GameObjectType.Mob.ordinal()) {
|
} else if (orderNPCMsg.getObjectType() == GameObjectType.Mob.ordinal()) {
|
||||||
|
|
||||||
mob = Mob.getMob(orderNPCMsg.getNpcUUID());
|
mob = Mob.getFromCacheDBID(orderNPCMsg.getNpcUUID());
|
||||||
|
|
||||||
if (mob == null)
|
if (mob == null)
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -412,9 +412,6 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler {
|
|||||||
break;
|
break;
|
||||||
if (!playerCharacter.getCharItemManager().doesCharOwnThisItem(contract.getObjectUUID()))
|
if (!playerCharacter.getCharItemManager().doesCharOwnThisItem(contract.getObjectUUID()))
|
||||||
break;
|
break;
|
||||||
if(contract.getItemBaseID() == 1035){//saetor shrine override
|
|
||||||
msg.getFirstPlacementInfo().setBlueprintUUID(1720000);
|
|
||||||
}
|
|
||||||
buildingCreated = placeShrine(playerCharacter, origin, msg);
|
buildingCreated = placeShrine(playerCharacter, origin, msg);
|
||||||
break;
|
break;
|
||||||
case BARRACK:
|
case BARRACK:
|
||||||
@@ -803,7 +800,7 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler {
|
|||||||
|
|
||||||
treeObject.setObjectTypeMask(MBServerStatics.MASK_BUILDING);
|
treeObject.setObjectTypeMask(MBServerStatics.MASK_BUILDING);
|
||||||
treeObject.setParentZone(zoneObject);
|
treeObject.setParentZone(zoneObject);
|
||||||
MaintenanceManager.setMaintDateTime(treeObject, LocalDateTime.now().plusDays(14));
|
MaintenanceManager.setMaintDateTime(treeObject, LocalDateTime.now().plusDays(7));
|
||||||
|
|
||||||
// Update guild binds and tags
|
// Update guild binds and tags
|
||||||
//load the new city on the clients
|
//load the new city on the clients
|
||||||
@@ -1151,6 +1148,15 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler {
|
|||||||
wallPiece.setProtectionState(ProtectionState.PROTECTED);
|
wallPiece.setProtectionState(ProtectionState.PROTECTED);
|
||||||
PlaceAssetMsg.sendPlaceAssetConfirmWall(origin, serverZone);
|
PlaceAssetMsg.sendPlaceAssetConfirmWall(origin, serverZone);
|
||||||
|
|
||||||
|
//walls in R8 city are immediately granted extra HP by 10%
|
||||||
|
if(cityObject.getTOL().getRank() == 8) {
|
||||||
|
if (wallPiece.getBlueprint() != null && wallPiece.getBlueprint().getBuildingGroup() != null && wallPiece.getBlueprint().isWallPiece()) {
|
||||||
|
float currentHealthRatio = wallPiece.getCurrentHitpoints() / wallPiece.healthMax;
|
||||||
|
float newMax = wallPiece.healthMax * 1.1f;
|
||||||
|
wallPiece.setMaxHitPoints(newMax);
|
||||||
|
wallPiece.setHealth(wallPiece.healthMax * currentHealthRatio);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Deduct gold from character's inventory
|
// Deduct gold from character's inventory
|
||||||
@@ -1213,7 +1219,7 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler {
|
|||||||
private boolean createShrine(PlayerCharacter player, PlacementInfo buildingInfo, Zone currentZone) {
|
private boolean createShrine(PlayerCharacter player, PlacementInfo buildingInfo, Zone currentZone) {
|
||||||
|
|
||||||
Blueprint blueprint;
|
Blueprint blueprint;
|
||||||
Building newMesh = null;
|
Building newMesh;
|
||||||
Shrine newShrine;
|
Shrine newShrine;
|
||||||
City city;
|
City city;
|
||||||
ShrineType shrineType;
|
ShrineType shrineType;
|
||||||
@@ -1274,9 +1280,6 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(blueprint.getName().equals("Nephilim Shrine ") && newMesh != null){
|
|
||||||
newMesh.setName("Chaos Shrine");
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ public class RequestEnterWorldHandler extends AbstractClientMsgHandler {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
player.enteredWorld = false;
|
player.setEnteredWorld(false);
|
||||||
|
|
||||||
Account acc = SessionManager.getAccount(origin);
|
Account acc = SessionManager.getAccount(origin);
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import engine.Enum;
|
|||||||
import engine.InterestManagement.RealmMap;
|
import engine.InterestManagement.RealmMap;
|
||||||
import engine.exception.MsgSendException;
|
import engine.exception.MsgSendException;
|
||||||
import engine.gameManager.BuildingManager;
|
import engine.gameManager.BuildingManager;
|
||||||
import engine.gameManager.ChatManager;
|
|
||||||
import engine.net.Dispatch;
|
import engine.net.Dispatch;
|
||||||
import engine.net.DispatchMessage;
|
import engine.net.DispatchMessage;
|
||||||
import engine.net.client.ClientConnection;
|
import engine.net.client.ClientConnection;
|
||||||
@@ -132,15 +131,15 @@ public class TaxCityMsgHandler extends AbstractClientMsgHandler {
|
|||||||
TaxCityMsg msg;
|
TaxCityMsg msg;
|
||||||
|
|
||||||
player = origin.getPlayerCharacter();
|
player = origin.getPlayerCharacter();
|
||||||
ChatManager.chatSystemInfo(player,"Taxing has been disabled");
|
|
||||||
return false;
|
|
||||||
|
|
||||||
//msg = (TaxCityMsg) baseMsg;
|
|
||||||
|
|
||||||
|
msg = (TaxCityMsg) baseMsg;
|
||||||
|
|
||||||
|
//realm taxing disabled
|
||||||
//ViewTaxes(msg, player);
|
//ViewTaxes(msg, player);
|
||||||
|
|
||||||
|
|
||||||
//return true;
|
return true;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -66,8 +66,6 @@ public class UpgradeAssetMsgHandler extends AbstractClientMsgHandler {
|
|||||||
Logger.error("Attempt to upgrade null building by " + player.getName());
|
Logger.error("Attempt to upgrade null building by " + player.getName());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if(buildingToRank.getBlueprint().getBuildingGroup().equals(Enum.BuildingGroup.WAREHOUSE))
|
|
||||||
return true;
|
|
||||||
|
|
||||||
// Early exit for building that is already ranking
|
// Early exit for building that is already ranking
|
||||||
|
|
||||||
|
|||||||
@@ -71,10 +71,8 @@ public class ApplyRuneMsg extends ClientNetMsg {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static boolean applyRune(int runeID, ClientConnection origin, PlayerCharacter playerCharacter) {
|
public static boolean applyRune(int runeID, ClientConnection origin, PlayerCharacter playerCharacter) {
|
||||||
|
|
||||||
RuneBase rb = RuneBase.getRuneBase(runeID);
|
RuneBase rb = RuneBase.getRuneBase(runeID);
|
||||||
Dispatch dispatch;
|
Dispatch dispatch;
|
||||||
|
|
||||||
if (playerCharacter == null || origin == null || rb == null) {
|
if (playerCharacter == null || origin == null || rb == null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -83,7 +81,6 @@ public class ApplyRuneMsg extends ClientNetMsg {
|
|||||||
ConcurrentHashMap<Integer, Boolean> races = rb.getRace();
|
ConcurrentHashMap<Integer, Boolean> races = rb.getRace();
|
||||||
if(runeID != 3007 && runeID != 3014) {//bounty hunter and huntsman
|
if(runeID != 3007 && runeID != 3014) {//bounty hunter and huntsman
|
||||||
if (races.size() > 0) {
|
if (races.size() > 0) {
|
||||||
|
|
||||||
boolean valid = false;
|
boolean valid = false;
|
||||||
for (int validID : races.keySet()) {
|
for (int validID : races.keySet()) {
|
||||||
if (validID == raceID) {
|
if (validID == raceID) {
|
||||||
@@ -94,20 +91,42 @@ public class ApplyRuneMsg extends ClientNetMsg {
|
|||||||
if(runeID == 3040)
|
if(runeID == 3040)
|
||||||
valid = true;
|
valid = true;
|
||||||
|
|
||||||
if(runeID == 2514 && raceID == 1999)
|
if(runeID == 3049)
|
||||||
valid = true;
|
valid = true;
|
||||||
|
|
||||||
if(runeID == 3036 && raceID == 1999)
|
if(raceID == 1999){
|
||||||
|
switch(runeID){
|
||||||
|
case 2514:
|
||||||
|
case 3036:
|
||||||
|
case 3033:
|
||||||
|
case 3001:
|
||||||
|
case 3002:
|
||||||
|
case 3003:
|
||||||
|
case 3004:
|
||||||
|
case 3008:
|
||||||
|
case 3009:
|
||||||
|
case 3013:
|
||||||
|
case 3016:
|
||||||
|
case 3017:
|
||||||
|
case 3018:
|
||||||
|
case 3020:
|
||||||
|
case 3021:
|
||||||
|
case 3030:
|
||||||
|
case 3031:
|
||||||
|
case 3037:
|
||||||
|
case 3045:
|
||||||
|
case 3046:
|
||||||
|
case 3047:
|
||||||
|
case 3048:
|
||||||
|
case 3049:
|
||||||
valid = true;
|
valid = true;
|
||||||
|
break;
|
||||||
if(runeID == 3033 && raceID == 1999)
|
}
|
||||||
valid = true;
|
}
|
||||||
|
|
||||||
if (!valid) {
|
if (!valid) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//Check base class is met
|
//Check base class is met
|
||||||
ConcurrentHashMap<Integer, Boolean> baseClasses = rb.getBaseClass();
|
ConcurrentHashMap<Integer, Boolean> baseClasses = rb.getBaseClass();
|
||||||
if (baseClasses.size() > 0) {
|
if (baseClasses.size() > 0) {
|
||||||
@@ -119,28 +138,25 @@ public class ApplyRuneMsg extends ClientNetMsg {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(runeID == 3040)
|
if(runeID == 3040)
|
||||||
valid = true;
|
valid = true;
|
||||||
|
|
||||||
if(runeID == 3036 && raceID == 1999)
|
if(runeID == 3036 && raceID == 1999)
|
||||||
valid = true;
|
valid = true;
|
||||||
|
|
||||||
if(runeID == 3033 && raceID == 1999)
|
if(runeID == 3033 && raceID == 1999)
|
||||||
valid = true;
|
valid = true;
|
||||||
|
|
||||||
if(runeID == 3035 && baseClassID == 2501)
|
if(runeID == 3035 && baseClassID == 2501)
|
||||||
valid = true;
|
valid = true;
|
||||||
|
if(runeID == 3028 && baseClassID == 2501 && playerCharacter.getRace().getName().contains("Irekei"))
|
||||||
|
valid = true;
|
||||||
if (!valid) {
|
if (!valid) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//Check promotion class is met
|
//Check promotion class is met
|
||||||
ConcurrentHashMap<Integer, Boolean> promotionClasses = rb.getPromotionClass();
|
ConcurrentHashMap<Integer, Boolean> promotionClasses = rb.getPromotionClass();
|
||||||
if (promotionClasses.size() > 0) {
|
if (promotionClasses.size() > 0) {
|
||||||
int promotionClassID = playerCharacter.getPromotionClassID();
|
int promotionClassID = playerCharacter.getPromotionClassID();
|
||||||
|
int baseClassID = playerCharacter.getBaseClassID();
|
||||||
boolean valid = false;
|
boolean valid = false;
|
||||||
for (int validID : promotionClasses.keySet()) {
|
for (int validID : promotionClasses.keySet()) {
|
||||||
if (validID == promotionClassID) {
|
if (validID == promotionClassID) {
|
||||||
@@ -148,19 +164,18 @@ public class ApplyRuneMsg extends ClientNetMsg {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(runeID == 3040)
|
if(runeID == 3040)
|
||||||
valid = true;
|
valid = true;
|
||||||
|
|
||||||
if(runeID == 3004 && (playerCharacter.getPromotionClassID() == 2505 || playerCharacter.getPromotionClassID() == 2510))
|
if(runeID == 3004 && (playerCharacter.getPromotionClassID() == 2505 || playerCharacter.getPromotionClassID() == 2510))
|
||||||
valid = true;
|
valid = true;
|
||||||
|
|
||||||
if(runeID == 3036 && raceID == 1999)
|
if(runeID == 3036 && raceID == 1999)
|
||||||
valid = true;
|
valid = true;
|
||||||
|
|
||||||
if(runeID == 3033 && raceID == 1999)
|
if(runeID == 3033 && raceID == 1999)
|
||||||
valid = true;
|
valid = true;
|
||||||
|
if(runeID == 3028 && (raceID == 2013 || raceID == 2014) && playerCharacter.getBaseClassID() == 2501)
|
||||||
|
valid = true;
|
||||||
|
if(runeID == 3035 && baseClassID == 2501)
|
||||||
|
valid = true;
|
||||||
if (!valid) {
|
if (!valid) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -183,12 +198,11 @@ public class ApplyRuneMsg extends ClientNetMsg {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int discCount = 0;
|
int discCount = 0;
|
||||||
for (CharacterRune cr : runes) {
|
for (CharacterRune cr : runes) {
|
||||||
int runeBaseID = cr.getRuneBaseID();
|
int runeBaseID = cr.getRuneBaseID();
|
||||||
//count number of discipline runes
|
//count number of discipline runes
|
||||||
if (runeBaseID > 3000 && runeBaseID < 3049) {
|
if(isDiscipline(runeBaseID)){
|
||||||
discCount++;
|
discCount++;
|
||||||
}
|
}
|
||||||
//see if rune is already applied
|
//see if rune is already applied
|
||||||
@@ -196,22 +210,18 @@ public class ApplyRuneMsg extends ClientNetMsg {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//Check level is met
|
//Check level is met
|
||||||
if (playerCharacter.getLevel() < rb.getLevelRequired()) {
|
if (playerCharacter.getLevel() < rb.getLevelRequired()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
int strTotal = 0;
|
int strTotal = 0;
|
||||||
int dexTotal = 0;
|
int dexTotal = 0;
|
||||||
int conTotal = 0;
|
int conTotal = 0;
|
||||||
int intTotal = 0;
|
int intTotal = 0;
|
||||||
int spiTotal = 0;
|
int spiTotal = 0;
|
||||||
int cost = 0;
|
int cost = 0;
|
||||||
|
|
||||||
//Check any attributes are met
|
//Check any attributes are met
|
||||||
ArrayList<RuneBaseAttribute> attrs = rb.getAttrs();
|
ArrayList<RuneBaseAttribute> attrs = rb.getAttrs();
|
||||||
|
|
||||||
if (rb.getAttrs() != null)
|
if (rb.getAttrs() != null)
|
||||||
for (RuneBaseAttribute rba : attrs) {
|
for (RuneBaseAttribute rba : attrs) {
|
||||||
int attrID = rba.getAttributeID();
|
int attrID = rba.getAttributeID();
|
||||||
@@ -224,10 +234,12 @@ public class ApplyRuneMsg extends ClientNetMsg {
|
|||||||
case "Born of the Gwendannen":
|
case "Born of the Gwendannen":
|
||||||
case "Born of the Invorri":
|
case "Born of the Invorri":
|
||||||
case "Born of the Irydnu":
|
case "Born of the Irydnu":
|
||||||
|
case "Scion of the Dar Khelegeur":
|
||||||
|
case "Scion of the Gwaridorn":
|
||||||
|
case "Scion of the Twathedilion":
|
||||||
mod = 0;
|
mod = 0;
|
||||||
}
|
}
|
||||||
if (mod > playerCharacter.getUnusedStatPoints()) {
|
if (mod > playerCharacter.getUnusedStatPoints()) {
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
cost = mod;
|
cost = mod;
|
||||||
@@ -279,12 +291,11 @@ public class ApplyRuneMsg extends ClientNetMsg {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//Check if max number runes already reached
|
//Check if max number runes already reached
|
||||||
if (runes.size() > 12) {
|
if (runes.size() > 12) {
|
||||||
|
ChatManager.chatSystemInfo(playerCharacter,"You Have Too Many Runes Applied");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (rb.getName()) {
|
switch (rb.getName()) {
|
||||||
case "Born of the Ethyri":
|
case "Born of the Ethyri":
|
||||||
case "Born of the Taripontor":
|
case "Born of the Taripontor":
|
||||||
@@ -303,22 +314,45 @@ public class ApplyRuneMsg extends ClientNetMsg {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
case "Scion of the Dar Khelegeur":
|
||||||
|
case "Scion of the Gwaridorn":
|
||||||
|
case "Scion of the Twathedilion":
|
||||||
|
for (CharacterRune charRune : playerCharacter.getRunes()) {
|
||||||
|
RuneBase rb2 = charRune.getRuneBase();
|
||||||
|
switch (rb2.getName()) {
|
||||||
|
case "Scion of the Dar Khelegeur":
|
||||||
|
case "Scion of the Gwaridorn":
|
||||||
|
case "Scion of the Twathedilion":
|
||||||
|
ChatManager.chatSystemError(playerCharacter, "You Have Already Applied A Blood Rune");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
//if discipline, check number applied
|
//if discipline, check number applied
|
||||||
|
int discAllowed = 0;
|
||||||
if (isDiscipline(runeID)) {
|
if (isDiscipline(runeID)) {
|
||||||
//if(playerCharacter.getLevel() == 80)
|
switch(playerCharacter.getRank()){
|
||||||
discCount -= 1; // level 80 characters get an extra disc rune
|
case 1:
|
||||||
if (playerCharacter.getLevel() < 70) {
|
discAllowed = 0;
|
||||||
if (discCount > 2) {
|
break;
|
||||||
return false;
|
case 2:
|
||||||
}
|
case 3:
|
||||||
} else {
|
case 4:
|
||||||
if (discCount > 3) {
|
case 5:
|
||||||
return false;
|
case 6:
|
||||||
}
|
discAllowed = 3;
|
||||||
}
|
break;
|
||||||
|
case 7:
|
||||||
|
case 8:
|
||||||
|
discAllowed = 5;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(discCount >= discAllowed)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
//Everything succeeded. Let's apply the rune
|
//Everything succeeded. Let's apply the rune
|
||||||
//Attempt add rune to database
|
//Attempt add rune to database
|
||||||
CharacterRune runeWithoutID = new CharacterRune(rb, playerCharacter.getObjectUUID());
|
CharacterRune runeWithoutID = new CharacterRune(rb, playerCharacter.getObjectUUID());
|
||||||
@@ -332,7 +366,6 @@ public class ApplyRuneMsg extends ClientNetMsg {
|
|||||||
if (cr == null) {
|
if (cr == null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
//remove any overridden runes from player
|
//remove any overridden runes from player
|
||||||
ArrayList<Integer> overwrite = rb.getOverwrite();
|
ArrayList<Integer> overwrite = rb.getOverwrite();
|
||||||
CharacterRune toRemove = null;
|
CharacterRune toRemove = null;
|
||||||
@@ -341,13 +374,10 @@ public class ApplyRuneMsg extends ClientNetMsg {
|
|||||||
toRemove = playerCharacter.removeRune(overwriteID);
|
toRemove = playerCharacter.removeRune(overwriteID);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//add rune to player
|
//add rune to player
|
||||||
playerCharacter.addRune(cr);
|
playerCharacter.addRune(cr);
|
||||||
|
|
||||||
// recalculate all bonuses/formulas/skills/powers
|
// recalculate all bonuses/formulas/skills/powers
|
||||||
playerCharacter.recalculate();
|
playerCharacter.recalculate();
|
||||||
|
|
||||||
//if overwriting a stat rune, add any amount granted from previous rune.
|
//if overwriting a stat rune, add any amount granted from previous rune.
|
||||||
if (toRemove != null) {
|
if (toRemove != null) {
|
||||||
RuneBase rbs = toRemove.getRuneBase();
|
RuneBase rbs = toRemove.getRuneBase();
|
||||||
@@ -373,7 +403,6 @@ public class ApplyRuneMsg extends ClientNetMsg {
|
|||||||
if (dif > 0 && spiTotal < (int) playerCharacter.statSpiMax) {
|
if (dif > 0 && spiTotal < (int) playerCharacter.statSpiMax) {
|
||||||
playerCharacter.addSpi(dif);
|
playerCharacter.addSpi(dif);
|
||||||
}
|
}
|
||||||
|
|
||||||
// recalculate all bonuses/formulas/skills/powers
|
// recalculate all bonuses/formulas/skills/powers
|
||||||
playerCharacter.recalculate();
|
playerCharacter.recalculate();
|
||||||
}
|
}
|
||||||
@@ -384,6 +413,9 @@ public class ApplyRuneMsg extends ClientNetMsg {
|
|||||||
case "Born of the Gwendannen":
|
case "Born of the Gwendannen":
|
||||||
case "Born of the Invorri":
|
case "Born of the Invorri":
|
||||||
case "Born of the Irydnu":
|
case "Born of the Irydnu":
|
||||||
|
case "Scion of the Dar Khelegeur":
|
||||||
|
case "Scion of the Gwaridorn":
|
||||||
|
case "Scion of the Twathedilion":
|
||||||
cost = 0;
|
cost = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -392,19 +424,14 @@ public class ApplyRuneMsg extends ClientNetMsg {
|
|||||||
dispatch = Dispatch.borrow(playerCharacter, msm);
|
dispatch = Dispatch.borrow(playerCharacter, msm);
|
||||||
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);
|
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);
|
||||||
}
|
}
|
||||||
|
|
||||||
//send apply rune message to client
|
//send apply rune message to client
|
||||||
ApplyRuneMsg arm = new ApplyRuneMsg(playerCharacter.getObjectType().ordinal(), playerCharacter.getObjectUUID(), runeID, cr.getObjectType().ordinal(), cr.getObjectUUID(), false);
|
ApplyRuneMsg arm = new ApplyRuneMsg(playerCharacter.getObjectType().ordinal(), playerCharacter.getObjectUUID(), runeID, cr.getObjectType().ordinal(), cr.getObjectUUID(), false);
|
||||||
dispatch = Dispatch.borrow(playerCharacter, arm);
|
dispatch = Dispatch.borrow(playerCharacter, arm);
|
||||||
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);
|
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);
|
||||||
|
|
||||||
|
|
||||||
//alert them of success
|
//alert them of success
|
||||||
ErrorPopupMsg.sendErrorPopup(playerCharacter, 160);
|
ErrorPopupMsg.sendErrorPopup(playerCharacter, 160);
|
||||||
|
|
||||||
//reapply bonuses
|
//reapply bonuses
|
||||||
playerCharacter.applyBonuses();
|
playerCharacter.applyBonuses();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -112,6 +112,12 @@ public class BuyFromNPCWindowMsg extends ClientNetMsg {
|
|||||||
|
|
||||||
if (contract != null)
|
if (contract != null)
|
||||||
sellInventory = contract.getSellInventory();
|
sellInventory = contract.getSellInventory();
|
||||||
|
//if(npc.contract.getObjectUUID() == 890){ // default steward
|
||||||
|
// sellInventory = npc.getSellInventorySteward();
|
||||||
|
// }
|
||||||
|
//if(npc.contract.getObjectUUID() == 889){ // default builder
|
||||||
|
// sellInventory = npc.getSellInventoryBuilder();
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
if (man != null)
|
if (man != null)
|
||||||
|
|||||||
@@ -87,11 +87,7 @@ public class CityDataMsg extends ClientNetMsg {
|
|||||||
temp.putInt(cityList.size());
|
temp.putInt(cityList.size());
|
||||||
|
|
||||||
for (City city : cityList)
|
for (City city : cityList)
|
||||||
try {
|
|
||||||
City.serializeForClientMsg(city, temp);
|
City.serializeForClientMsg(city, temp);
|
||||||
}catch(Exception e){
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
temp.put((byte) 0); // PAD
|
temp.put((byte) 0); // PAD
|
||||||
|
|
||||||
// Serialize runegates
|
// Serialize runegates
|
||||||
@@ -108,8 +104,10 @@ public class CityDataMsg extends ClientNetMsg {
|
|||||||
}
|
}
|
||||||
|
|
||||||
temp.putInt(mineList.size());
|
temp.putInt(mineList.size());
|
||||||
for (Mine mine : mineList)
|
for (Mine mine : mineList) {
|
||||||
|
if(mine.getParentZone() != null && !mine.getParentZone().isContinent())
|
||||||
Mine.serializeForClientMsg(mine, temp);
|
Mine.serializeForClientMsg(mine, temp);
|
||||||
|
}
|
||||||
temp.put((byte) 0); // PAD
|
temp.put((byte) 0); // PAD
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -182,8 +180,10 @@ public class CityDataMsg extends ClientNetMsg {
|
|||||||
}
|
}
|
||||||
|
|
||||||
writer.putInt(mineList.size());
|
writer.putInt(mineList.size());
|
||||||
for (Mine mine : mineList)
|
for (Mine mine : mineList) {
|
||||||
|
if(mine.getParentZone() != null && !mine.getParentZone().isContinent())
|
||||||
Mine.serializeForClientMsg(mine, writer);
|
Mine.serializeForClientMsg(mine, writer);
|
||||||
|
}
|
||||||
} else
|
} else
|
||||||
writer.putInt(0);
|
writer.putInt(0);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
|||||||
@@ -9,7 +9,6 @@
|
|||||||
|
|
||||||
package engine.net.client.msg;
|
package engine.net.client.msg;
|
||||||
|
|
||||||
import engine.Enum;
|
|
||||||
import engine.Enum.GameObjectType;
|
import engine.Enum.GameObjectType;
|
||||||
import engine.net.AbstractConnection;
|
import engine.net.AbstractConnection;
|
||||||
import engine.net.ByteBufferReader;
|
import engine.net.ByteBufferReader;
|
||||||
@@ -43,8 +42,8 @@ public class CityZoneMsg extends ClientNetMsg {
|
|||||||
this.locY = locY;
|
this.locY = locY;
|
||||||
this.locZ = locZ;
|
this.locZ = locZ;
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.radiusX = Enum.CityBoundsType.ZONE.extents;
|
this.radiusX = radiusX;
|
||||||
this.radiusZ = Enum.CityBoundsType.ZONE.extents;
|
this.radiusZ = radiusZ;
|
||||||
this.unknown01 = 0;
|
this.unknown01 = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,6 @@
|
|||||||
|
|
||||||
package engine.net.client.msg;
|
package engine.net.client.msg;
|
||||||
|
|
||||||
import engine.Enum;
|
|
||||||
import engine.Enum.*;
|
import engine.Enum.*;
|
||||||
import engine.gameManager.BuildingManager;
|
import engine.gameManager.BuildingManager;
|
||||||
import engine.gameManager.ZoneManager;
|
import engine.gameManager.ZoneManager;
|
||||||
@@ -276,7 +275,7 @@ public class ManageCityAssetsMsg extends ClientNetMsg {
|
|||||||
|
|
||||||
writer.putString(npcHire.getName());
|
writer.putString(npcHire.getName());
|
||||||
writer.putInt(1);
|
writer.putInt(1);
|
||||||
writer.putInt(Blueprint.getNpcMaintCost(npcHire.getRank()));
|
writer.putInt(0);
|
||||||
if (npcHire.getObjectType() == GameObjectType.NPC)
|
if (npcHire.getObjectType() == GameObjectType.NPC)
|
||||||
writer.putInt(((NPC) npcHire).getContract().getIconID()); // Was 60
|
writer.putInt(((NPC) npcHire).getContract().getIconID()); // Was 60
|
||||||
else if (npcHire.getObjectType() == GameObjectType.Mob) {
|
else if (npcHire.getObjectType() == GameObjectType.Mob) {
|
||||||
@@ -393,9 +392,9 @@ public class ManageCityAssetsMsg extends ClientNetMsg {
|
|||||||
writer.putInt(bane.getSiegePhase().ordinal()); //1 challenge //2 standoff //3 war
|
writer.putInt(bane.getSiegePhase().ordinal()); //1 challenge //2 standoff //3 war
|
||||||
writer.put((byte) 0);
|
writer.put((byte) 0);
|
||||||
|
|
||||||
if (!bane.isAccepted() && this.assetManager.getGuild() == banedCity.getGuild() && GuildStatusController.isInnerCouncil(this.assetManager.getGuildStatus()))
|
//if (!bane.isAccepted() && this.assetManager.getGuild() == banedCity.getGuild() && GuildStatusController.isInnerCouncil(this.assetManager.getGuildStatus()))
|
||||||
writer.put((byte) 1); //canSetTime
|
// writer.put((byte) 1); //canSetTime
|
||||||
else
|
//else
|
||||||
writer.put((byte) 0);
|
writer.put((byte) 0);
|
||||||
|
|
||||||
DateTime placedOn = bane.getLiveDate();
|
DateTime placedOn = bane.getLiveDate();
|
||||||
@@ -486,36 +485,19 @@ public class ManageCityAssetsMsg extends ClientNetMsg {
|
|||||||
|
|
||||||
writer.putInt(building.getRank());
|
writer.putInt(building.getRank());
|
||||||
|
|
||||||
// Maintenance costs include resource if
|
|
||||||
// this structure is an R8 tree
|
|
||||||
|
|
||||||
if (building.getRank() == 8)
|
|
||||||
writer.putInt(5); // Resources included
|
|
||||||
else
|
|
||||||
writer.putInt(1); // Gold only
|
writer.putInt(1); // Gold only
|
||||||
|
|
||||||
writer.putInt(2308551); //Gold
|
writer.putInt(2308551); //Gold
|
||||||
if (building.getBlueprint() == null)
|
if (building.getBlueprint() == null)
|
||||||
writer.putInt(0);
|
writer.putInt(0);
|
||||||
else
|
else
|
||||||
writer.putInt(building.getBlueprint().getMaintCost(building.getRank())); // maint cost
|
writer.putInt(building.getBlueprint().getMaintCost()); // maint cost
|
||||||
|
|
||||||
if (building.getRank() == 8) {
|
|
||||||
writer.putInt(74856115); // Stone
|
|
||||||
writer.putInt(1500); // maint cost
|
|
||||||
writer.putInt(-1603256692); // Lumber
|
|
||||||
writer.putInt(1500); // maint cost
|
|
||||||
writer.putInt(-1596311545); // Galvor
|
|
||||||
writer.putInt(5); // maint cost
|
|
||||||
writer.putInt(1532478436); // Wormwood
|
|
||||||
writer.putInt(5); // maint cost
|
|
||||||
}
|
|
||||||
|
|
||||||
LocalDateTime maintDate = building.maintDateTime;
|
LocalDateTime maintDate = building.maintDateTime;
|
||||||
|
|
||||||
if (maintDate == null)
|
if (maintDate == null)
|
||||||
maintDate = LocalDateTime.now();
|
maintDate = LocalDateTime.now();
|
||||||
writer.putLocalDateTime(LocalDateTime.now()); // current time
|
writer.putLocalDateTime(maintDate); // current time
|
||||||
|
|
||||||
// utc offset?
|
// utc offset?
|
||||||
writer.putInt((int) java.time.Duration.between(LocalDateTime.now(), maintDate).getSeconds()); // Seconds to maint date
|
writer.putInt((int) java.time.Duration.between(LocalDateTime.now(), maintDate).getSeconds()); // Seconds to maint date
|
||||||
@@ -531,9 +513,6 @@ public class ManageCityAssetsMsg extends ClientNetMsg {
|
|||||||
this.upgradeCost = Integer.MAX_VALUE;
|
this.upgradeCost = Integer.MAX_VALUE;
|
||||||
else if (building.getRank() == building.getBlueprint().getMaxRank())
|
else if (building.getRank() == building.getBlueprint().getMaxRank())
|
||||||
this.upgradeCost = Integer.MAX_VALUE;
|
this.upgradeCost = Integer.MAX_VALUE;
|
||||||
else
|
|
||||||
if(building.getBlueprint().getBuildingGroup().equals(Enum.BuildingGroup.WAREHOUSE))
|
|
||||||
this.upgradeCost = Integer.MAX_VALUE;
|
|
||||||
else
|
else
|
||||||
this.upgradeCost = building.getBlueprint().getRankCost(Math.min(building.getRank() + 1, 7));
|
this.upgradeCost = building.getBlueprint().getRankCost(Math.min(building.getRank() + 1, 7));
|
||||||
|
|
||||||
|
|||||||
@@ -343,7 +343,7 @@ public class ManageNPCMsg extends ClientNetMsg {
|
|||||||
writer.putInt(0); //runemaster list
|
writer.putInt(0); //runemaster list
|
||||||
|
|
||||||
//artillery captain list
|
//artillery captain list
|
||||||
ConcurrentHashMap<Mob, Integer> siegeMinions = npc.siegeMinionMap;
|
ConcurrentHashMap<Mob, Integer> siegeMinions = npc.getSiegeMinionMap();
|
||||||
writer.putInt(1 + siegeMinions.size());
|
writer.putInt(1 + siegeMinions.size());
|
||||||
serializeBulwarkList(writer, 1); //Trebuchet
|
serializeBulwarkList(writer, 1); //Trebuchet
|
||||||
//serializeBulwarkList(writer, 2); //Ballista
|
//serializeBulwarkList(writer, 2); //Ballista
|
||||||
@@ -366,7 +366,7 @@ public class ManageNPCMsg extends ClientNetMsg {
|
|||||||
long timeLife = upgradeTime - curTime;
|
long timeLife = upgradeTime - curTime;
|
||||||
|
|
||||||
if (upgradeTime * 1000 > System.currentTimeMillis()) {
|
if (upgradeTime * 1000 > System.currentTimeMillis()) {
|
||||||
if (mob.guardCaptain.isAlive()) {
|
if (mob.npcOwner.isAlive()) {
|
||||||
writer.put((byte) 0);//shows respawning timer
|
writer.put((byte) 0);//shows respawning timer
|
||||||
writer.putInt(mob.spawnTime);
|
writer.putInt(mob.spawnTime);
|
||||||
writer.putInt(mob.spawnTime);
|
writer.putInt(mob.spawnTime);
|
||||||
@@ -503,7 +503,7 @@ public class ManageNPCMsg extends ClientNetMsg {
|
|||||||
writer.putInt(0);
|
writer.putInt(0);
|
||||||
writer.putString("Repair items");
|
writer.putString("Repair items");
|
||||||
writer.putString("percent");
|
writer.putString("percent");
|
||||||
writer.putInt(npc.getRepairCost()); //cost for repair
|
writer.putInt(npc.getSpecialPrice()); //cost for repair
|
||||||
writer.putInt(0);
|
writer.putInt(0);
|
||||||
|
|
||||||
ArrayList<Integer> modPrefixList = npc.getModTypeTable();
|
ArrayList<Integer> modPrefixList = npc.getModTypeTable();
|
||||||
@@ -557,7 +557,7 @@ public class ManageNPCMsg extends ClientNetMsg {
|
|||||||
|
|
||||||
} else if (this.targetType == GameObjectType.Mob.ordinal()) {
|
} else if (this.targetType == GameObjectType.Mob.ordinal()) {
|
||||||
|
|
||||||
mobA = Mob.getMob(this.targetID);
|
mobA = Mob.getFromCacheDBID(this.targetID);
|
||||||
|
|
||||||
if (mobA == null) {
|
if (mobA == null) {
|
||||||
Logger.error("Missing Mob of ID " + this.targetID);
|
Logger.error("Missing Mob of ID " + this.targetID);
|
||||||
@@ -689,7 +689,7 @@ public class ManageNPCMsg extends ClientNetMsg {
|
|||||||
long timeLife = upgradeTime - curTime;
|
long timeLife = upgradeTime - curTime;
|
||||||
|
|
||||||
if (upgradeTime * 1000 > System.currentTimeMillis()) {
|
if (upgradeTime * 1000 > System.currentTimeMillis()) {
|
||||||
if (mob.guardCaptain.isAlive()) {
|
if (mob.npcOwner.isAlive()) {
|
||||||
writer.put((byte) 0);//shows respawning timer
|
writer.put((byte) 0);//shows respawning timer
|
||||||
writer.putInt(mob.spawnTime);
|
writer.putInt(mob.spawnTime);
|
||||||
writer.putInt(mob.spawnTime);
|
writer.putInt(mob.spawnTime);
|
||||||
|
|||||||
@@ -601,9 +601,6 @@ public class PlaceAssetMsg extends ClientNetMsg {
|
|||||||
public int getBlueprintUUID() {
|
public int getBlueprintUUID() {
|
||||||
return this.blueprintUUID;
|
return this.blueprintUUID;
|
||||||
}
|
}
|
||||||
public void setBlueprintUUID(int id) {
|
|
||||||
this.blueprintUUID = id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Vector3fImmutable getLoc() {
|
public Vector3fImmutable getLoc() {
|
||||||
return this.loc;
|
return this.loc;
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user