Compare commits

..

958 Commits

Author SHA1 Message Date
FatBoy a7c3662463 fixed build error 2024-06-08 19:12:56 -05:00
FatBoy 909e04b8d1 update inventory after resource purchase 2024-06-08 19:07:55 -05:00
FatBoy a7d1dc5fd0 Merge branch 'lakebane-old' into lakebane-master
# Conflicts:
#	src/engine/gameManager/LootManager.java
2024-06-08 19:06:15 -05:00
FatBoy 2f87fd9812 r8 gains 25% resource mine production bonus 2024-06-08 19:04:42 -05:00
FatBoy c696bd368e gold amount no longer reduced for mine production 2024-06-08 19:04:42 -05:00
FatBoy 7716d82adb mines named correctly 2024-06-08 19:04:42 -05:00
FatBoy 66804d5704 resource purchasing 2024-06-08 19:04:40 -05:00
FatBoy 02aafc9274 resource purchasing 2024-06-08 19:04:39 -05:00
FatBoy 2ef0d4305c divide by 0 error 2024-06-08 19:04:39 -05:00
FatBoy 972c99a146 server to sell elans at correct costs 2024-06-08 19:04:39 -05:00
FatBoy ad9d27c6ee server to sell resources at correct costs 2024-06-08 19:04:39 -05:00
FatBoy e1d11d5d94 server to sell resources at correct costs 2024-06-08 19:04:39 -05:00
FatBoy ca78a3b581 resource merchant to price resources correctly 2024-06-08 19:04:39 -05:00
FatBoy bcaa5d42ff resource merchant to sell items correctly 2024-06-08 19:04:37 -05:00
FatBoy 6dad14ae57 reimplement resource merchant with 5mil stacks 2024-06-08 19:04:33 -05:00
FatBoy 6e465248b1 drop rates adjusted again again third time 2024-06-08 19:04:30 -05:00
FatBoy 7c106d5d34 drop rates adjusted again again third time 2024-06-08 19:04:30 -05:00
FatBoy 8135ef8e9c drop rates adjusted again again third time 2024-06-08 19:04:30 -05:00
FatBoy db2d6a4bf3 drop rates adjusted again again 2024-06-08 19:04:30 -05:00
FatBoy bb0a3b8b5b drop rates adjusted again 2024-06-08 19:04:30 -05:00
FatBoy 0145a7264d updated maintenance system 2024-06-08 19:04:28 -05:00
FatBoy 6eec56adb4 rune and contract drop rate 2024-06-08 19:04:27 -05:00
FatBoy 01662aae07 mine close crash bug 2024-06-08 19:04:27 -05:00
FatBoy 72d73883a4 catch process mine window logic 2024-06-08 19:04:27 -05:00
FatBoy 9c64dbb70c SIXTH AFTER ROLLBACK: mob rune and contract drop annouces local 2024-06-08 19:04:27 -05:00
FatBoy 9408602c9c FIFTH AFTER ROLLBACK: mob rune and contract work updated correctly 2024-06-08 19:04:27 -05:00
FatBoy 58cf778ce4 FOURTH AFTER ROLLBACK: error catching for attempt ot upgrade warehouses 2024-06-08 19:04:27 -05:00
FatBoy 885b612bd6 THIRD AFTER ROLLBACK: contract and rune and glass drop rates adjusted properly 2024-06-08 19:04:25 -05:00
FatBoy bf69045b0b SECOND AFTER ROLLBACK: serialize MineTimes correctly 2024-06-08 19:04:22 -05:00
FatBoy 8b03fbc15b FIRST AFTER ROLLBACK: reintroduce mines 2024-06-08 19:04:17 -05:00
FatBoy 3c23a070df glass repairable for 3x base repair costs 2024-06-08 19:03:11 -05:00
FatBoy c14cc98ca2 mines reset claimability at 3am CST 2024-06-08 18:58:46 -05:00
FatBoy c326008112 drop rates adjusted again again third time 2024-06-05 19:51:14 -05:00
FatBoy 90facabc7b drop rates adjusted again again third time 2024-06-05 19:45:59 -05:00
FatBoy 6e26a8cfcf drop rates adjusted again again third time 2024-06-05 19:20:03 -05:00
FatBoy 4b1ab35a36 drop rates adjusted again again 2024-06-05 19:02:28 -05:00
FatBoy d733afef58 drop rates adjusted again 2024-06-05 18:56:16 -05:00
FatBoy f30a02a6d5 updated maintenance system 2024-06-05 10:56:27 -05:00
FatBoy b255b1c9f4 rune and contract drop rate 2024-06-05 10:41:14 -05:00
FatBoy 6151a9e650 mine close crash bug 2024-06-04 08:56:06 -05:00
FatBoy 0f7ef9f56b city data msg catch 2024-06-03 19:51:06 -05:00
FatBoy 6d68d048b0 catch process mine window logic 2024-06-03 19:47:23 -05:00
FatBoy 8ccdbf8cc9 SIXTH AFTER ROLLBACK: mob rune and contract drop annouces local 2024-06-03 19:25:54 -05:00
FatBoy 1798a8f170 FIFTH AFTER ROLLBACK: mob rune and contract work updated correctly 2024-06-02 22:02:19 -05:00
FatBoy 737da1bf14 FOURTH AFTER ROLLBACK: error catching for attempt ot upgrade warehouses 2024-06-02 21:55:31 -05:00
FatBoy 45eb0776d6 THIRD AFTER ROLLBACK: contract and rune and glass drop rates adjusted properly 2024-06-02 16:24:55 -05:00
FatBoy f4346b97f7 SECOND AFTER ROLLBACK: serialize MineTimes correctly 2024-06-02 15:58:26 -05:00
FatBoy cf6f684f5e FIRST AFTER ROLLBACK: reintroduce mines 2024-06-02 15:50:21 -05:00
FatBoy a8e3cfa8f7 new mine handling system 2024-05-29 20:51:48 -05:00
FatBoy 0028b7be69 pet msg toggle handling 2024-05-29 20:31:53 -05:00
FatBoy 3f11996b40 box limits resolved 2024-05-29 19:48:35 -05:00
FatBoy 779f5bbb5b null resolution 2024-05-29 19:28:37 -05:00
FatBoy 37c89e6073 Box Tracker 2024-05-29 19:27:10 -05:00
FatBoy 83499816eb Box Tracker 2024-05-29 19:25:45 -05:00
FatBoy 0eb8da855d maintenance resolution 2024-05-29 19:16:03 -05:00
FatBoy 36fb3f12b1 30 second delay to zerg mechanic running 2024-05-29 18:53:06 -05:00
FatBoy ba642e049e null check fix 2024-05-28 23:52:59 -05:00
FatBoy 98835cad90 revert boxflag 2024-05-28 23:39:39 -05:00
FatBoy 4d9600a8bf box flag checker 2024-05-28 22:28:20 -05:00
FatBoy 4089f72d8f box flag checker 2024-05-28 22:23:40 -05:00
FatBoy ead86efcf6 box flag checker 2024-05-28 22:10:35 -05:00
FatBoy ae01a421de box flag checker 2024-05-28 21:52:59 -05:00
FatBoy 469662f732 box flag checker 2024-05-28 21:52:15 -05:00
FatBoy 8b9bc474b4 box flag checker 2024-05-28 21:37:03 -05:00
FatBoy 3815f9df8e box flag checker 2024-05-28 21:30:54 -05:00
FatBoy 6313182c4f mine window processing 2024-05-28 21:28:06 -05:00
FatBoy 40bff54838 box flag situation looked into 2024-05-28 21:24:53 -05:00
FatBoy 2b1299ec4a ZergMultiplier fix 2024-05-28 21:07:38 -05:00
FatBoy 0955dff7aa city map serialization fix 2024-05-28 21:01:47 -05:00
FatBoy 2b18765781 elan stones sell 10 for 1 mil from resource vendor 2024-05-28 20:39:08 -05:00
FatBoy c55f67a977 resource vendor now sells in stack sizes of 500k purchase 2024-05-28 20:24:59 -05:00
FatBoy 730467828c rune price ceiling adjustment 2024-05-28 20:02:02 -05:00
FatBoy ad05f0d7bc gold from mines no longer produces at half value 2024-05-28 19:41:38 -05:00
FatBoy c922d9c532 recall scroll set to 20 seconds 2024-05-28 19:39:16 -05:00
FatBoy ed4d186b10 can no longer PVE to level 76 2024-05-28 19:38:22 -05:00
FatBoy de1bc375ca forced hourly rune and contract drops 2024-05-27 22:22:08 -05:00
FatBoy 1c48b28d4e maintenance fix 2024-05-27 22:04:55 -05:00
FatBoy 0318459ff1 disc rune announcements 2024-05-27 21:45:06 -05:00
FatBoy 4bdc207c37 maintenance completed 2024-05-27 21:36:26 -05:00
FatBoy ba537d7b00 invisible cities on map logging 2024-05-27 21:25:11 -05:00
FatBoy a0164d5abb invisible cities on map logging 2024-05-27 21:23:28 -05:00
FatBoy eec5861944 invisible cities on map logging 2024-05-27 21:14:27 -05:00
FatBoy 094a7a9498 new maintenance completed 2024-05-27 21:00:53 -05:00
FatBoy d93892df6c new maintenance completed 2024-05-27 20:55:51 -05:00
FatBoy 81150642f0 new maintenance completed 2024-05-27 20:51:08 -05:00
FatBoy 7fb5ccf4f1 new maintenance completed 2024-05-27 20:48:40 -05:00
FatBoy ab1e69a6ef maintenance rewrite - needs completeing for r8 2024-05-27 19:16:00 -05:00
FatBoy 2d2832caf9 public variable 2024-05-27 18:36:50 -05:00
FatBoy 5dee08d3ce Merge branch 'lakebane-mines' into lakebane-master
# Conflicts:
#	src/engine/gameManager/CombatManager.java
#	src/engine/mobileAI/utilities/MovementUtilities.java
#	src/engine/net/client/ClientMessagePump.java
#	src/engine/net/client/msg/VendorDialogMsg.java
#	src/engine/objects/CharacterItemManager.java
#	src/engine/objects/Mine.java
#	src/engine/objects/PlayerCharacter.java
#	src/engine/objects/Warehouse.java
2024-05-27 18:36:07 -05:00
FatBoy 75b68c0a8c disc spawn timers corrected 2024-05-26 22:43:03 -05:00
FatBoy a9f006936b yet another attempt at mines 2024-05-26 20:05:28 -05:00
FatBoy 917fddceeb yet another attempt at mines 2024-05-26 20:01:06 -05:00
FatBoy a2da8f3861 yet another attempt at mines 2024-05-26 16:42:13 -05:00
FatBoy b1b2912092 yet another attempt at mines 2024-05-26 16:36:40 -05:00
FatBoy 3bcda38bb7 destroy and remove form cache and DB all buildinsg within city when its being destroyed 2024-05-25 22:29:31 -05:00
FatBoy 918a797f34 timezone updated 2024-05-25 22:13:14 -05:00
FatBoy ba9238a49a new mines system 2024-05-23 19:16:23 -05:00
FatBoy bd5061a7e8 new mines system 2024-05-23 18:14:17 -05:00
FatBoy 270301c35b new mines system 2024-05-23 18:07:39 -05:00
FatBoy ffcaf0e063 new mines system 2024-05-23 18:01:59 -05:00
FatBoy 6e7633828f new mines system 2024-05-23 18:01:02 -05:00
FatBoy 3aac2410b0 new mines system 2024-05-23 17:56:54 -05:00
FatBoy c90378e3f0 delay mine checks to 1 minute intervals 2024-05-22 20:33:03 -05:00
FatBoy 4734f23805 check if mines are active before spamming them to open 2024-05-22 20:27:27 -05:00
FatBoy 47503de748 system to open and close mines 2024-05-22 20:23:19 -05:00
FatBoy 8ab2805e39 xp and range fix 2024-05-22 06:45:32 -05:00
FatBoy 1d703b08a2 xp and range fix 2024-05-22 06:43:51 -05:00
FatBoy a660457883 cannot get XP from the same character in PVP more than once per reboot 2024-05-21 21:49:05 -05:00
FatBoy 4ca81b019b everyone gets an extra disc 2024-05-21 21:39:23 -05:00
FatBoy 5f16b40092 PVP experience only after level 75 2024-05-21 21:20:19 -05:00
FatBoy 0d7beb5a5a PVP experience only after level 75 2024-05-21 20:43:21 -05:00
FatBoy b66e1c1f93 setlevel command goes to 80 now 2024-05-21 20:20:35 -05:00
FatBoy f1e8384af0 mines will start again 2024-05-21 20:19:19 -05:00
FatBoy c9dcb82c45 removed leadership cap 2024-05-21 20:12:03 -05:00
FatBoy c2c946165c scaling XP gains for groups 2024-05-21 20:11:03 -05:00
FatBoy ffd65b3641 mob range min set to 6 2024-05-21 17:42:19 -05:00
FatBoy ba2084ceb0 level 80 characters get a 5th disc rune 2024-05-21 17:40:52 -05:00
FatBoy 34ec123702 level cap increased to 80 Experience altered 2024-05-21 17:28:57 -05:00
FatBoy 7c36325905 level cap increased to 80 Experience altered 2024-05-21 17:20:18 -05:00
FatBoy 915f182d79 level cap increased to 80 2024-05-21 17:12:35 -05:00
FatBoy fb1d6a3248 auto update NPC slot location and reload on mesh change for buildings 2024-05-21 17:01:23 -05:00
FatBoy 6d16eccc24 shrines can be looted once destroyed 2024-05-21 16:41:28 -05:00
FatBoy fa5cdae17e shrine delete button causes rubble pile 2024-05-21 16:11:35 -05:00
FatBoy b46eb8639d capturing city will cede all buildinsg to conquerer 2024-05-21 14:34:17 -05:00
FatBoy 58916c35c7 shrines can be destroyed 2024-05-21 14:26:57 -05:00
FatBoy f80d50f95e buildings cannot be deleted if the city is under siege 2024-05-21 14:23:59 -05:00
FatBoy 77f2e413c9 Mine time and cap changes 2024-05-21 14:20:33 -05:00
FatBoy 5e84ee8b11 pet run/walk determined by owner 2024-05-21 14:16:03 -05:00
FatBoy b6a9a0c813 detection of using /tar 2024-05-20 21:26:39 -05:00
FatBoy f7e6307d66 Mine optimization 2024-05-20 21:19:53 -05:00
FatBoy 1359417b40 databse update for stacked resources 2024-05-20 14:23:16 -05:00
FatBoy 85077a5e56 databse update for stacked resources 2024-05-20 14:22:06 -05:00
FatBoy 366815f1f9 databse update for stacked resources 2024-05-20 14:11:29 -05:00
FatBoy 2ca51d6a83 merchant resource stacking 2024-05-20 14:07:30 -05:00
FatBoy b7ebb728e2 attempted warehouse delay issue resolution 2024-05-20 13:35:49 -05:00
FatBoy 023057668a attempted warehouse delay issue resolution 2024-05-20 13:34:03 -05:00
FatBoy a11b590573 revert deposit change 2024-05-20 11:26:02 -05:00
FatBoy 353d211a04 PC cleanup 2024-05-20 11:15:38 -05:00
FatBoy c792e49fdc added 30 second delay to Enrollment Officer 2024-05-20 11:14:24 -05:00
FatBoy f8e99a84b1 optimized ManageCityAssetMsgHandler 2024-05-20 11:01:28 -05:00
FatBoy b28c157a5c Revert "optimized deleting items"
This reverts commit 0ac7a1a7fa.
2024-05-20 10:46:43 -05:00
FatBoy 85717a1880 Revert "optimized looting system"
This reverts commit 7745ef6949.
2024-05-20 10:46:37 -05:00
FatBoy 0ac7a1a7fa optimized deleting items 2024-05-20 10:30:37 -05:00
FatBoy 7745ef6949 optimized looting system 2024-05-20 10:07:04 -05:00
FatBoy 40078df067 optimized 2024-05-20 00:03:04 -05:00
FatBoy bb28d38735 mob AI aggro cleanup 2024-05-19 07:19:32 -05:00
FatBoy 7bd6e3a149 mob AI message cleanup 2024-05-19 07:13:56 -05:00
FatBoy 72faafedfe resource merchant 2024-05-19 06:40:20 -05:00
FatBoy e560c07aba track chaining for same nations 2024-05-19 06:39:59 -05:00
FatBoy 742232166e prospector cost reduced to 500k on disc merchant 2024-05-19 06:39:55 -05:00
FatBoy 910a5d9e3c prospector costs 500k 2024-05-19 06:39:51 -05:00
FatBoy a943a5a51d update saetor stats 2024-05-19 06:39:43 -05:00
FatBoy e3a278e090 moving in the air with movebuff will result in immediate ground 2024-05-19 06:39:20 -05:00
FatBoy 5959209081 fly work 2024-05-19 06:39:09 -05:00
FatBoy e222cb3543 zerg multiplier application work 2024-05-19 06:38:56 -05:00
FatBoy a4efe199c6 saetor starting runes added 2024-05-19 06:35:03 -05:00
FatBoy fa5ac4fea3 euro mines time changed up by 4 hours 2024-05-19 06:34:51 -05:00
FatBoy f28c887b92 inline method 2024-05-18 14:58:52 -05:00
FatBoy c1331efe38 add is alive check to box refresh 2024-05-18 12:26:17 -05:00
FatBoy b113b55703 optimisation 2024-05-18 11:50:06 -05:00
FatBoy 560466e3ef null check 2024-05-18 10:55:06 -05:00
FatBoy 0457287905 fixed ballad of beregund the bold 2024-05-18 10:25:55 -05:00
FatBoy db7e9276b1 fixed ballad of beregund the bold 2024-05-18 10:22:17 -05:00
FatBoy a14057b9df resource stacking optimized location 2024-05-18 08:44:04 -05:00
FatBoy 0a3624e503 5 second delay for switching boxes 2024-05-18 00:24:41 -05:00
FatBoy 45048b2b4e box check only every 10 seconds 2024-05-18 00:08:58 -05:00
FatBoy 27550293d6 box check only every 10 seconds 2024-05-17 23:57:03 -05:00
FatBoy 422cf10eea box check only every 10 seconds 2024-05-17 23:56:46 -05:00
FatBoy c412336257 box check only every 5 seconds 2024-05-17 23:38:53 -05:00
FatBoy c8bea0d1ce resource merchant 2024-05-17 23:14:15 -05:00
FatBoy e66a8459c0 flash message can be more than one word 2024-05-17 19:28:24 -05:00
FatBoy 817067d242 flash message can be more than one word 2024-05-17 19:03:50 -05:00
FatBoy 942288cee2 mob resists 2024-05-17 18:19:24 -05:00
FatBoy 8d633adbb3 disc dropper resists 2024-05-17 18:11:37 -05:00
FatBoy a821f7f7e4 r8 resists 2024-05-17 18:07:24 -05:00
FatBoy 0581cab5cb mob resists 2024-05-17 17:49:54 -05:00
FatBoy 6ee1c02e08 mob resists 2024-05-17 17:45:19 -05:00
FatBoy 8379b48332 mob resists 2024-05-17 17:34:42 -05:00
FatBoy e2ae758e36 bank refresh 2024-05-17 17:31:37 -05:00
FatBoy 8f1855fb3f bank refresh 2024-05-17 17:29:22 -05:00
FatBoy e15164bcb2 Boxed Flag 2024-05-17 17:23:49 -05:00
FatBoy 836fa4f8dc Boxed Flag 2024-05-17 17:22:06 -05:00
FatBoy fe7f4dc3ca stealth breaking when attacking 2024-05-17 17:07:58 -05:00
FatBoy 19402bf06f stealth breaking when attacking 2024-05-17 17:06:43 -05:00
FatBoy bed49c0230 stealth breaking when attacking 2024-05-17 17:05:21 -05:00
FatBoy 9c79dca2c5 weird range check issue resolved 2024-05-17 16:55:30 -05:00
FatBoy 3820d179c6 better protocol error tracking 2024-05-16 19:37:55 -05:00
FatBoy 6e1db9489a track chaining for same nations 2024-05-15 21:43:29 -05:00
FatBoy 8227db92c8 prospector cost reduced to 500k on disc merchant 2024-05-15 21:32:01 -05:00
FatBoy 06309daae6 prospector costs 500k 2024-05-15 21:21:35 -05:00
FatBoy 49e5be959f spells that target self now default to self target 2024-05-15 20:55:58 -05:00
FatBoy 74a22d4cf5 update saetor stats 2024-05-15 20:42:28 -05:00
FatBoy 3f827cebd8 boxed characters now get recurring travel stance effect 2024-05-15 20:23:39 -05:00
FatBoy ae734cbb0a mob AI work 2024-05-15 20:09:46 -05:00
FatBoy bde3e54fd4 mob AI work 2024-05-15 20:05:18 -05:00
FatBoy fa5144c932 mob AI work 2024-05-15 20:03:20 -05:00
FatBoy de08d0d210 mob AI work 2024-05-15 20:03:03 -05:00
FatBoy 79a9bfd606 fix banks 2024-05-15 19:55:42 -05:00
FatBoy 491519216c moving in the air with movebuff will result in immediate ground 2024-05-15 17:43:13 -05:00
FatBoy 048c4dfb1b fly work 2024-05-15 17:33:14 -05:00
FatBoy d14144cdf3 zerg multiplier application work 2024-05-15 17:00:16 -05:00
FatBoy d610bccdee 5 second delay forced between warehouse transactions 2024-05-15 16:46:00 -05:00
FatBoy 39f7be99b0 gold dupe prevention 2024-05-15 16:29:23 -05:00
FatBoy 01aa226c62 transfer item to vault fixed 2024-05-15 16:00:53 -05:00
FatBoy 87bd67b0f5 saetor starting runes added 2024-05-15 15:54:19 -05:00
FatBoy 70edd4c19c euro mines time changed up by 4 hours 2024-05-15 15:50:23 -05:00
FatBoy 6c86da0719 looting auto stacks resources 2024-05-14 22:11:53 -05:00
FatBoy 84cc435a2b trading auto stacks resources 2024-05-14 22:09:05 -05:00
FatBoy 5e61ef26e1 stack resources completed 2024-05-14 22:03:45 -05:00
FatBoy 9e85c1e361 stack resources 2024-05-14 21:55:20 -05:00
FatBoy 3d80a03e1e Resource Auto Stacking 2024-05-13 18:18:51 -05:00
FatBoy 15136518a3 Resource Auto Stacking 2024-05-13 18:12:30 -05:00
FatBoy b8abe94a8c Resource Auto Stacking 2024-05-13 17:47:00 -05:00
FatBoy f2e4e8062e cant inventory junk more than 10 mil 2024-05-13 16:29:10 -05:00
FatBoy feaa38ee98 mine caps 2024-05-12 21:51:00 -05:00
FatBoy 6f453ab5c4 discs junkable 2024-05-12 21:45:41 -05:00
FatBoy af839c108c runes and contracts drop rate increased by 3x 2024-05-12 21:07:42 -05:00
FatBoy 8bac27f0fc mine cap sizes 2024-05-12 20:47:26 -05:00
FatBoy bfb257c410 trainer buildings granted 3 slots at r1 2024-05-12 20:46:49 -05:00
FatBoy 3be694275d removed 20 man mines 2024-05-12 20:36:38 -05:00
FatBoy f885560e52 trainer upgrade cost reduced to 25% 2024-05-12 20:23:30 -05:00
FatBoy a8a9cdb0f1 mob resist issue 2024-05-12 17:03:29 -05:00
FatBoy 210cc94dac mob resist issue 2024-05-12 16:56:41 -05:00
FatBoy bf503c0be0 mob resist issue 2024-05-12 16:54:05 -05:00
FatBoy 24c16e6cf1 mob resist issue 2024-05-12 16:51:49 -05:00
FatBoy a6fb7ec0a0 mob resist issue 2024-05-12 16:49:10 -05:00
FatBoy cb9197013e mob resist issue 2024-05-12 16:45:45 -05:00
FatBoy e1584161c9 mob resist issue 2024-05-12 16:44:37 -05:00
FatBoy 0c85c1d289 mob resist issue 2024-05-12 16:44:19 -05:00
FatBoy ead9683b98 mob resist issue 2024-05-12 16:41:15 -05:00
FatBoy c29d6f548e mob resist issue 2024-05-12 16:40:55 -05:00
FatBoy 5822cb1ab4 mob resist issue 2024-05-12 16:40:00 -05:00
FatBoy 371d077320 mob resist issue 2024-05-12 16:38:32 -05:00
FatBoy 984c4d205a mob resist issue 2024-05-12 16:32:41 -05:00
FatBoy 8cc92e9792 mob resist issue 2024-05-12 16:31:29 -05:00
FatBoy c1ea68aa41 mob resist issue 2024-05-12 16:21:07 -05:00
FatBoy 324851a8ab mob resist issue 2024-05-12 16:20:17 -05:00
FatBoy cd512100a2 mob resist issue 2024-05-12 16:13:11 -05:00
FatBoy a0e78d8add mob resist issue 2024-05-12 16:12:26 -05:00
FatBoy f02d79c65e mob resist issue 2024-05-12 16:11:10 -05:00
FatBoy cfffb0c16a mob resist issue 2024-05-12 16:07:24 -05:00
FatBoy 8804a3ecd4 mob resist issue 2024-05-12 16:04:32 -05:00
FatBoy 16c84f2b30 mob resist issue 2024-05-12 15:57:44 -05:00
FatBoy 5858aabc83 mob resist issue 2024-05-11 20:30:00 -05:00
FatBoy 4b81a5c435 mob resist issue 2024-05-11 20:26:50 -05:00
FatBoy c1107ae98d mob resist issue 2024-05-11 20:26:02 -05:00
FatBoy c5f2464d55 mob resist issue 2024-05-11 20:21:10 -05:00
FatBoy e0beab2dc5 mob resist issue 2024-05-11 20:10:24 -05:00
FatBoy bcbeacd60e mob resist issue 2024-05-11 19:58:57 -05:00
FatBoy e39c7bebb5 mob resist issue 2024-05-11 19:13:51 -05:00
FatBoy 4e6e56350c mob resist issue 2024-05-11 18:57:20 -05:00
FatBoy a33d650738 mob resist issue 2024-05-11 18:53:06 -05:00
FatBoy 12b44e216c mob resist issue 2024-05-11 18:49:29 -05:00
FatBoy a202a0544e mob resist issue 2024-05-11 18:44:16 -05:00
FatBoy 8156f261fc mob aggro issue 2024-05-11 18:27:04 -05:00
FatBoy 283ae37919 mob aggro issue 2024-05-11 18:18:28 -05:00
FatBoy 3e30c7a01e no more dead or self track 2024-05-11 18:12:21 -05:00
FatBoy a5570e4bb5 no more dead or self track 2024-05-11 18:10:32 -05:00
FatBoy 290aec79ba pets kills are aded to kill spam 2024-05-11 18:06:03 -05:00
FatBoy 1378bc8030 attempting to fly with movement buff will ground you 2024-05-11 17:59:13 -05:00
FatBoy bd536961e2 removal group guil refreshes group windows 2024-05-11 17:43:34 -05:00
FatBoy 17aee68575 2x xp for solo players without a group 2024-05-11 17:38:49 -05:00
FatBoy a97f4e6da6 conc pots cant be deleted 2024-05-11 17:27:20 -05:00
FatBoy 2274a9e16e Hamlet Guards Immune To All 2024-05-11 17:22:34 -05:00
FatBoy 1caa704b6a removed BOXED text from flag 2024-05-11 17:14:39 -05:00
FatBoy 1bb4e17ead Boxed Title 2024-05-10 18:31:17 -05:00
FatBoy d84b214fd3 Boxed Title 2024-05-10 18:28:30 -05:00
FatBoy 4440ed1f0d Boxed Title 2024-05-10 18:23:35 -05:00
FatBoy f0ad1b730c Boxed Title 2024-05-10 18:18:22 -05:00
FatBoy d968c4eca4 Boxed Title 2024-05-10 18:12:51 -05:00
FatBoy 38816f25bb refiner? 2024-05-10 18:06:03 -05:00
FatBoy 58f5bf05e0 refiner? 2024-05-10 17:59:14 -05:00
FatBoy 78d9e3d6fc Blood rue dropper update 2024-05-10 17:13:44 -05:00
FatBoy d1c07e88fc CC staff dropper 2024-05-10 16:49:33 -05:00
FatBoy dcd108e3ac dropper resists 2024-05-10 16:41:47 -05:00
FatBoy 2c2a2464ee dropper resists 2024-05-09 21:26:19 -05:00
FatBoy ee5c254de4 box check 2024-05-09 21:00:27 -05:00
FatBoy efa4ce91fa adjusted rates properly 2024-05-09 20:19:05 -05:00
FatBoy cd45f49b07 cant delete disc runes 2024-05-09 20:02:21 -05:00
FatBoy 116c9bfdfb debugging 2024-05-09 19:36:55 -05:00
FatBoy 4ec7c3c4bd cleanup 2024-05-09 19:05:54 -05:00
FatBoy 281dde533a cleanup 2024-05-09 18:56:05 -05:00
FatBoy 55b6f95696 cleanup 2024-05-08 21:58:05 -05:00
FatBoy e120ae6e18 cleanup 2024-05-08 21:49:22 -05:00
FatBoy 9e44c9475a cleanup 2024-05-08 21:42:04 -05:00
FatBoy 4d8cb339c3 errant characters recall to SDR 2024-05-05 20:26:45 -05:00
FatBoy b1dfd9a40d shade sneak recast 2024-05-05 20:13:19 -05:00
FatBoy cff6714160 remove day fo week bane placement restriction 2024-05-05 19:59:29 -05:00
FatBoy 16a9d4e5c9 blood rune check work 2024-05-04 10:14:20 -05:00
FatBoy 3189d64031 blood rune check work 2024-05-04 10:11:08 -05:00
FatBoy 5cd94234e9 blood rune check work 2024-05-04 09:53:01 -05:00
FatBoy b45b325cad human blood runes cost 0 2024-05-03 21:44:35 -05:00
FatBoy b731291e6c human blood runes cost 0 2024-05-03 21:22:27 -05:00
FatBoy c207bd14b6 human blood runes cost 0 2024-05-03 21:04:22 -05:00
FatBoy 4924133416 humans can only apply 1 Blood Rune 2024-05-03 21:03:32 -05:00
FatBoy 6769286c4a Adjust Mine Times 2024-05-03 20:56:49 -05:00
FatBoy d21bf0185b catch exceptin for missing tokens 2024-05-03 19:36:07 -05:00
FatBoy 3312ea292f healer archmage fix and saetor ranger fix 2024-05-02 20:50:41 -05:00
FatBoy c7604d0f2c Allow Saetor Rangers 2024-05-02 20:44:06 -05:00
FatBoy 1206441ab3 assorted fixes 2024-05-02 19:42:12 -05:00
FatBoy 679346383a assorted fixes 2024-05-02 19:27:07 -05:00
FatBoy e8df9ef0ea terraform update 2024-05-01 21:20:04 -05:00
FatBoy 3d683fc9a3 dropper resists 2024-05-01 21:00:26 -05:00
FatBoy fbeda13a48 dropper resists 2024-05-01 20:51:10 -05:00
FatBoy d598887f61 enable minor version checks 2024-05-01 20:45:11 -05:00
FatBoy 40372e1b35 enable minor version checks 2024-05-01 20:33:46 -05:00
FatBoy 4476c3863d disable minor version checks 2024-05-01 20:18:03 -05:00
FatBoy 08f94226ba Disc Droppers get increased stats 2024-05-01 19:15:08 -05:00
FatBoy 7eb9eca7d0 Disc Droppers get 75% resist all 2024-05-01 18:55:16 -05:00
FatBoy c43c3de18a zone loading 2024-04-30 21:08:22 -05:00
FatBoy 9e0fa541a2 zone loading 2024-04-30 20:49:18 -05:00
FatBoy 58035d0f93 zone loading 2024-04-30 20:45:29 -05:00
FatBoy 92460d455b zone loading 2024-04-30 20:44:08 -05:00
FatBoy 3c5f510969 zone loading 2024-04-30 20:30:29 -05:00
FatBoy e3c8be6102 zone loading 2024-04-30 20:25:33 -05:00
FatBoy 5f0eb266c2 zone loading 2024-04-30 20:20:08 -05:00
FatBoy c721d6d4a8 zone loading 2024-04-30 20:12:50 -05:00
FatBoy d0b716eb41 zone loading 2024-04-30 20:03:22 -05:00
FatBoy a4a375e13b zone loading 2024-04-30 19:50:27 -05:00
FatBoy c56702bd75 promoting to active duty 2024-04-30 19:44:05 -05:00
FatBoy 5c023b4c4d log machine ID 2024-04-30 19:25:57 -05:00
FatBoy 4b67cbef38 realm date time console spam fix 2024-04-30 19:08:39 -05:00
FatBoy 6cf2705013 better DS application 2024-04-30 19:01:31 -05:00
FatBoy 66bc73a2b6 harmful spells break stealth 2024-04-29 18:55:04 -05:00
FatBoy 77cfa02bea players already flagged active cannot promote to active 2024-04-29 18:51:46 -05:00
FatBoy 93773a7784 Enrollment officer no longer strips buffs 2024-04-29 18:50:09 -05:00
FatBoy 42dd2b4e68 swap active character with NPC 2024-04-28 22:33:18 -05:00
FatBoy 2aed3ef922 no longer delete gold 2024-04-28 20:30:10 -05:00
FatBoy fb6a3706cd implement bane cap sizes based on trees in nation 2024-04-28 18:59:43 -05:00
FatBoy 48e126823f players dont show up on their own track
dead or inactive players dont show up on track
2024-04-28 11:11:24 -05:00
FatBoy b3de192f0b remove name override for vorg 2024-04-27 21:13:19 -05:00
FatBoy 58d5c1969c attack range sync 2024-04-27 19:37:51 -05:00
FatBoy 950108be87 Vorg Name Override 2024-04-27 19:27:49 -05:00
FatBoy a9746b9a2b add npc command 2024-04-26 20:07:26 -05:00
FatBoy eaa287e176 add npc command 2024-04-26 19:53:35 -05:00
FatBoy 67cdf0e98a add npc command 2024-04-26 19:50:41 -05:00
FatBoy 83e2b29635 added set profit dev command 2024-04-25 22:06:17 -05:00
FatBoy c99a361ca7 added set profit dev command 2024-04-25 22:04:32 -05:00
FatBoy f53c2c5cb0 vorg fix 2024-04-24 21:43:48 -05:00
FatBoy 6680651801 disc droppers are alive at server up 2024-04-24 19:03:08 -05:00
FatBoy 66fbbada48 mines close on time 2024-04-24 18:49:18 -05:00
FatBoy ba1cb22662 runegates always open 2024-04-24 17:55:52 -05:00
FatBoy bf9be1f7f9 runegates always open 2024-04-24 17:50:50 -05:00
FatBoy bb4c1d48a4 mob desync issue 2024-04-24 14:59:38 -05:00
FatBoy b33f451285 mob desync issue 2024-04-24 14:52:06 -05:00
FatBoy f865f94806 mob desync issue 2024-04-24 14:47:55 -05:00
FatBoy baf28519c2 mine fix dor delayed closing time 2024-04-23 21:16:00 -05:00
FatBoy 4a2ef92d33 4 hour disc spawns 100% 2024-04-23 20:57:27 -05:00
FatBoy c16ea8f3dd movement sync bug squashed 2024-04-23 20:51:22 -05:00
FatBoy 882ed17b3a Pet damage scales with zerg multiplier 2024-04-23 20:05:22 -05:00
FatBoy d06c298b09 revert power que 2024-04-23 19:39:38 -05:00
FatBoy e4bad5f418 zerg mechanic work 2024-04-23 19:18:30 -05:00
FatBoy 54c0b3d7ce mine work 2024-04-23 18:50:00 -05:00
FatBoy 9d59bde22e mine pulse 2024-04-23 18:38:14 -05:00
FatBoy 47243dd48d powers thread 2024-04-23 06:24:25 -05:00
FatBoy bb6828ec8e powers thread 2024-04-23 06:23:40 -05:00
FatBoy 5d0973c2bc mines thread 2024-04-23 06:10:48 -05:00
FatBoy 4f216364a9 general cleanup 2024-04-23 05:51:10 -05:00
FatBoy c1d193ee45 reduce runegate pulse from 3 seconds to half a second 2024-04-23 05:46:38 -05:00
FatBoy 9879c1b18f various cleanups 2024-04-23 05:44:32 -05:00
FatBoy 928845a220 disc fix 2024-04-22 21:49:15 -05:00
FatBoy 3378272a19 optimize 2024-04-22 19:58:46 -05:00
FatBoy e4c4643678 dieing resets ZergMultiplier 2024-04-22 19:27:07 -05:00
FatBoy 3c1a217ac6 top of the hour disc spawns 2024-04-22 19:25:50 -05:00
FatBoy 1567b22fe4 top of the hour disc spawns 2024-04-22 19:23:08 -05:00
FatBoy 2067bbc6e1 mine closing bug 2024-04-22 19:08:34 -05:00
FatBoy 9790423139 mine closing bug 2024-04-22 18:45:10 -05:00
FatBoy d8a8c1a9a0 mine closing bug 2024-04-22 18:38:14 -05:00
FatBoy 60ab4a846e update irekei move speed 2024-04-22 06:52:27 -05:00
FatBoy 58f250fa64 mob casting temporarily disabled 2024-04-21 21:53:41 -05:00
FatBoy a160df02c4 mines fix 2024-04-21 21:33:30 -05:00
FatBoy 1fa7cbed12 vorg drop ranges 2024-04-21 21:19:46 -05:00
FatBoy d16a56a582 vorg drop ranges 2024-04-21 21:16:25 -05:00
FatBoy 69aca2c728 disc resapwn attempt 2 2024-04-21 20:05:16 -05:00
FatBoy 159960d521 saetor can take born in the country 2024-04-21 19:55:55 -05:00
FatBoy b9871a2729 blood horn and thrall can be taken on all minotaurs and saetors 2024-04-21 19:36:09 -05:00
FatBoy 18f6822cb4 fix mines auto claim when rolle dover 2024-04-21 19:23:01 -05:00
FatBoy 18731839f7 update mine times 2024-04-21 19:19:05 -05:00
FatBoy 1d2e4d5608 desert r8 cant move 2024-04-21 19:15:35 -05:00
FatBoy ef49d0cbe0 apply human and elf runes in game 2024-04-21 19:14:35 -05:00
FatBoy 9604ee4399 sundancer given Find Weakness 2024-04-21 18:30:12 -05:00
FatBoy e708bb02f5 npc buildings dont accumulate gold 2024-04-21 16:42:08 -05:00
FatBoy 73c1f97051 mob cast fix 2024-04-21 16:33:35 -05:00
FatBoy 7a445db673 zerg multiplier fix 2024-04-21 16:19:44 -05:00
FatBoy b3d65ef700 mine lag fix 2024-04-21 16:18:10 -05:00
FatBoy 7a7559dee5 NPC buildings dont run out of gold space on buildings 2024-04-21 16:01:01 -05:00
FatBoy a902ff720a NPC buildings dont run out of gold space on buildings 2024-04-21 15:58:13 -05:00
FatBoy 98cb307e09 extended summon timer now uses extended accept time 2024-04-21 15:55:38 -05:00
FatBoy 0dca6c4662 universal mines round 2 2024-04-21 15:46:29 -05:00
FatBoy c8310ec5ba universal mines round 2 2024-04-21 15:06:03 -05:00
FatBoy 961258f67a reset mine production resources 2024-04-21 14:47:17 -05:00
FatBoy 2854472ae0 fixed bug with mob cast time frequency 2024-04-21 14:45:17 -05:00
FatBoy b81f088a3a disable mob changing target based on hate value 2024-04-21 14:42:57 -05:00
FatBoy be4cbd3f6f vorg baked in stats 2024-04-21 06:19:28 -05:00
FatBoy 7eb6deb1e9 fix cast bug for mob to PC 2024-04-21 06:17:06 -05:00
FatBoy d04cad0484 adjust mines 2024-04-21 06:01:27 -05:00
FatBoy a8a21e9e40 adjust mine times 2024-04-20 11:27:12 -05:00
FatBoy 0d5ff59cb7 Revert "adjust mine times"
This reverts commit cdeebda6f8.
2024-04-20 11:27:04 -05:00
FatBoy cdeebda6f8 adjust mine times 2024-04-20 10:58:32 -05:00
FatBoy 3065f9f7eb disc droppers no longer spawn at server up 2024-04-20 10:56:56 -05:00
FatBoy e2cca6201f summon fix 2024-04-20 10:49:52 -05:00
FatBoy 1f7ea89d66 starting conc issue resolved 2024-04-20 10:40:47 -05:00
FatBoy ce3eacda48 zerg mechanic work 2024-04-20 10:16:24 -05:00
FatBoy 8a3a4645af zerg mechanic work 2024-04-20 10:09:13 -05:00
FatBoy f074fe1825 zerg mechanic work 2024-04-20 10:04:05 -05:00
FatBoy e47430e61b zerg mechanic work 2024-04-20 10:02:41 -05:00
FatBoy b2718779f8 zerg mechanic work 2024-04-20 09:52:21 -05:00
FatBoy 189d0624e7 grouping restriction update 2024-04-20 00:44:30 -05:00
FatBoy a6cfe2fb76 disc droppers dont spawn at boot 2024-04-20 00:34:16 -05:00
FatBoy fa37e1bcca disc dropper time delay 2024-04-20 00:24:47 -05:00
FatBoy 7497526bd9 boons can be refreshed 2024-04-19 16:54:55 -05:00
FatBoy b9c38d9d2b fleet of foot allowed for saetor 2024-04-19 16:49:59 -05:00
FatBoy c8ec0fe191 sitting movement sync bug squashed 2024-04-19 16:43:24 -05:00
FatBoy 1378ddcaef disable clanwarden drop 2024-04-19 16:40:24 -05:00
FatBoy 78f8331582 potion cost bug 2024-04-18 21:46:11 -05:00
FatBoy c197a385c5 mob aggro issue 2024-04-18 21:25:27 -05:00
FatBoy 2c0899982c mine audit 2024-04-18 20:50:15 -05:00
FatBoy 72bc753724 mine audit 2024-04-18 20:44:23 -05:00
FatBoy c43f70128a mine audit 2024-04-18 20:40:07 -05:00
FatBoy 95b23a35fc mine audit 2024-04-18 20:32:29 -05:00
FatBoy 86d0254c2f mine audit 2024-04-18 20:28:57 -05:00
FatBoy d09240d11a only start thread for mine being set to active 2024-04-18 18:43:23 -05:00
FatBoy 5da4b66f81 prinstats will now show regen rates 2024-04-18 13:36:21 -05:00
FatBoy 5247bf77fe luauptime shows boxed and active players online 2024-04-18 13:32:47 -05:00
FatBoy f8a584d000 cannot summon outside of nation 2024-04-18 13:27:01 -05:00
FatBoy 7c2915928d being banished form guild will remove you from any groups 2024-04-18 13:24:06 -05:00
FatBoy 8308ac97e3 leaving guild will remove you from groups you are in 2024-04-18 13:22:07 -05:00
FatBoy 75ea9092e2 cannot group outside of nation 2024-04-18 13:19:21 -05:00
FatBoy d60532c23f cleanup 2024-04-18 13:11:34 -05:00
FatBoy d8f1cf2087 cleanup 2024-04-18 13:07:47 -05:00
FatBoy 379dbe668c nations can only have 1 bane placed on them at a time 2024-04-18 13:04:56 -05:00
FatBoy 52a0c95002 cannot be subbed if you have a bane placed
nations can only have 1 bane placed at a time
2024-04-18 12:58:18 -05:00
FatBoy 360a393a0f cannot invite guilds to sub if you are baned
cannot invite guilds to sub if any tree in your nation has a bane on it

cannot be subbed if you have a bane placed on you
2024-04-18 12:48:04 -05:00
FatBoy 345f4e799b mines get caps 3/5/10/20 2024-04-17 21:05:48 -05:00
FatBoy ef70d7b8ed 3 man mine value assigned 2024-04-17 20:52:56 -05:00
FatBoy f98f54139a Threads for Zerg Mechanics 2024-04-17 20:46:59 -05:00
FatBoy 7e3e337de0 Threads for Zerg Mechanics 2024-04-16 19:52:41 -05:00
FatBoy 74f8f0640f 60 second vamp summon 2024-04-15 22:05:42 -05:00
FatBoy 13babb630d all runes junk for 500k 2024-04-15 21:48:11 -05:00
FatBoy cd87927241 addressed mine bug 2024-04-15 21:46:27 -05:00
FatBoy e3377d26b1 mines only open at their correct times 2024-04-15 21:37:14 -05:00
FatBoy e02dbd3632 Universal Mines 2024-04-15 21:36:03 -05:00
FatBoy 0d7c2cd288 saetor cannot wear shoes 2024-04-15 21:24:49 -05:00
FatBoy 60ba6d5b28 disc rune changes for prospector and black mask 2024-04-15 21:04:32 -05:00
FatBoy 52c3f563a2 changed heal receptivity for vamps and elves 2024-04-14 10:18:59 -05:00
FatBoy 5655aef57a 5% movespeeed increase for IREKEI 2024-04-14 10:02:22 -05:00
FatBoy 487e557ef9 blood droppers 2024-04-13 21:09:28 -05:00
FatBoy f95dd7f6f2 translocate doesnt break on take damage 2024-04-13 21:05:45 -05:00
FatBoy 4f56cacaea unarmed mob damage addressed 2024-04-13 20:57:10 -05:00
FatBoy 36f42770c8 unarmed mob damage addressed 2024-04-13 20:25:39 -05:00
FatBoy 1dfac59b8c traveler and prospector droppers 1 hour spawn timers 2024-04-13 20:22:27 -05:00
FatBoy d22b10e9ef traveler and prospector droppers 1 hour spawn timers 2024-04-13 20:21:57 -05:00
FatBoy 5cdab459bc rogue/mage druids and saetor huntress/fury 2024-04-13 20:08:18 -05:00
FatBoy f62d44d631 rogue/mage druids and saetor huntress/fury 2024-04-13 19:49:10 -05:00
FatBoy 5ee3438e42 start with conc 2024-04-12 23:00:46 -05:00
FatBoy 6b07058dd4 start with conc 2024-04-12 22:55:18 -05:00
FatBoy 1f700cda4c start with conc 2024-04-12 22:52:01 -05:00
FatBoy c5f5c33329 rune merchant cleanup 2024-04-12 22:49:22 -05:00
FatBoy f3b00a6249 rune merchant cleanup 2024-04-12 22:44:26 -05:00
FatBoy 9da4b85dd1 realm cleanup 2024-04-12 21:33:51 -05:00
FatBoy 76da1d0cbf remove lizardman 2024-04-12 21:21:24 -05:00
FatBoy dc5b05e5b5 test 2024-04-12 21:17:42 -05:00
FatBoy 8414fb0039 test 2024-04-12 21:09:38 -05:00
FatBoy 8cdd4910ca NPC buy/sell use DB values 2024-04-12 20:01:01 -05:00
FatBoy ed7e7be3e8 extra summon time doesnt affect safezones 2024-04-10 19:05:55 -05:00
FatBoy 642103b5a2 shadow mantle increased to 15 second duration 2024-04-10 19:03:49 -05:00
FatBoy 1f95abf0b2 summon time takes +1 minute if non-nation players in load range 2024-04-05 21:43:58 -05:00
FatBoy 434e64d7ba 5 second cast time for wizard single teleport 2024-04-05 21:35:08 -05:00
FatBoy 665bc25126 5 second cast time for wizard single teleport 2024-04-05 21:33:40 -05:00
FatBoy 8b01f80231 new ATR vs DEF formula for spells 2024-04-05 21:27:26 -05:00
FatBoy 7fee52c861 cannot use movement speed buffs while flying 2024-04-05 21:25:49 -05:00
FatBoy f8cf531136 condemn list options removed from ToL 2024-04-05 21:17:38 -05:00
FatBoy 936f151a72 shadowmantle duration reduced to 10 seconds 2024-04-05 21:12:18 -05:00
FatBoy 4707bb11f0 recall scrolls take double the time to execute 2024-04-05 20:58:38 -05:00
FatBoy 4de40d054b BH eyes now see GM invis 2024-04-03 21:23:40 -05:00
FatBoy af3eb1d85f contagion castable on players 2024-04-03 20:56:26 -05:00
FatBoy 2990396778 bugfix - item pricing 2024-04-03 20:36:15 -05:00
FatBoy 7f8652b477 dev commands broadcast to server 2024-04-03 20:09:46 -05:00
FatBoy afae0e63ba saetor can now take "Chaos Boon" 2024-04-02 20:23:38 -05:00
FatBoy 850d2dfea0 Nephilim Shrine renames Chaos Shrine 2024-04-02 20:01:25 -05:00
FatBoy dcc92fd89d removed non-gold drops form safehold mobs 2024-04-02 19:53:16 -05:00
FatBoy 1346f490c9 players can now use ./prinstats and ./printresists on themselves 2024-04-02 19:33:09 -05:00
FatBoy 0c1b3d1460 Group translocate not allowed outside active banes and mines 2024-04-02 19:24:38 -05:00
FatBoy d96f10b41e vorg stats finalized 2024-03-31 20:03:20 -05:00
FatBoy 595d0ba9ba hit chance issue resolved 2024-03-31 12:00:56 -05:00
FatBoy 505f8fdd90 hit chance issue resolved 2024-03-31 11:33:44 -05:00
FatBoy bd098fcb24 hit chance work 2024-03-31 11:20:18 -05:00
FatBoy dae20d5591 create saetor shrine blueprint 2024-03-28 19:45:50 -05:00
FatBoy d33de60869 create saetor shrine object 2024-03-28 19:01:16 -05:00
FatBoy 38c9612eb6 saetor skills 2024-03-27 21:08:08 -05:00
FatBoy 4035f45c4f saetor skills 2024-03-27 21:03:43 -05:00
FatBoy 39b235963a saetor skills 2024-03-27 20:53:33 -05:00
FatBoy b142cded72 saetor skills 2024-03-27 20:16:13 -05:00
FatBoy 0e7281fe6a saetor skills 2024-03-27 20:14:44 -05:00
FatBoy fe39454113 saetor skills 2024-03-27 20:12:51 -05:00
FatBoy 74cf9d16c5 saetor skills 2024-03-27 16:44:53 -05:00
FatBoy 4b2563e4a1 saetor skills 2024-03-26 13:26:18 -05:00
FatBoy 1e19e10755 saetor granted skills 2024-03-26 13:23:27 -05:00
FatBoy 0c3e072e0e Backend Saetor work 2024-03-19 20:57:07 -05:00
FatBoy aa10a4c9ac Backend Saetor work 2024-03-19 20:33:34 -05:00
FatBoy 75947db6e5 Backend Saetor work 2024-03-19 20:28:37 -05:00
FatBoy 9d28601761 Backend Saetor work 2024-03-19 19:56:29 -05:00
FatBoy e8ca4863d5 Backend Saetor work 2024-03-19 19:34:54 -05:00
FatBoy a8bfcd08cc Backend Saetor work 2024-03-19 19:12:44 -05:00
FatBoy 8ae4ded83b safe guards dont aggro players 2024-03-17 17:10:07 -05:00
FatBoy 5023d6bb73 Merge branch 'lakebane-mines' into lakebane-custom-races 2024-03-17 16:59:21 -05:00
FatBoy ca47022d88 stats alteration for custom race 2024-03-17 16:59:02 -05:00
FatBoy c304a59d95 See Invis Bug Addressed 2024-03-17 16:17:33 -05:00
FatBoy 7dfc1dea0f fortitudes handled after resist calculations 2024-03-17 16:07:15 -05:00
FatBoy 77fda6a18c altered atr vs def formula 2024-03-17 16:04:30 -05:00
FatBoy b343f4d6d7 resource dupe 2024-03-14 22:05:21 -05:00
FatBoy 77e9a4d9bf resource dupe 2024-03-14 22:00:09 -05:00
FatBoy 512aba5cd9 resource dupe 2024-03-14 21:47:27 -05:00
FatBoy 2d93e408c3 resource dupe 2024-03-14 21:43:32 -05:00
FatBoy edd7be8734 resource dupe 2024-03-14 21:29:47 -05:00
FatBoy 8c6637663d resource dupe 2024-03-14 21:22:34 -05:00
FatBoy 4cb0f28e57 resource dupe 2024-03-14 21:06:26 -05:00
FatBoy 4d21fc0353 daily reboot removal 2024-03-14 20:56:34 -05:00
FatBoy 4d28cd2b25 daily reboot 2024-03-14 20:55:33 -05:00
FatBoy 1be6884ab0 conc removal 2024-03-14 20:53:12 -05:00
FatBoy 74eff825b0 daily auto reboot 2024-03-14 20:50:17 -05:00
FatBoy 1ae1deabdc daily auto reboot 2024-03-14 20:48:38 -05:00
FatBoy 54b7bcf907 pet buffs castable again 2024-03-14 19:40:07 -05:00
FatBoy a8c768931e 2am daily reboot 2024-03-14 19:21:21 -05:00
FatBoy 71687e39c8 2am daily reboot 2024-03-14 19:20:43 -05:00
FatBoy 678e45ce6b 2am daily reboot 2024-03-14 19:20:25 -05:00
FatBoy 5bfeafe8bf fixed scourge mother vorg drops 2024-03-14 19:13:58 -05:00
FatBoy a492e833e8 disc droppers spawn 6 hours apart 2024-03-14 19:04:57 -05:00
FatBoy 92436be3f9 vorg droppers increased difficulty 2024-03-14 18:59:49 -05:00
FatBoy 8890e02981 mobs attack pets 2024-03-14 18:55:23 -05:00
FatBoy 6fe8b80c87 remove resource drop server announcement 2024-03-14 18:54:03 -05:00
FatBoy c2e0979dc3 drop rate work 2024-03-13 21:51:55 -05:00
FatBoy 6023022077 drop rate work 2024-03-13 21:23:47 -05:00
FatBoy 9a570de54c contract and rune drop work 2024-03-13 20:03:32 -05:00
FatBoy d58d8ee67c Lizardman Race Added 2024-03-11 20:39:43 -05:00
FatBoy 132addc0a9 Lizardman Race Added 2024-03-11 20:26:26 -05:00
FatBoy 8bfba1b3a5 Saetor Race Added 2024-03-11 19:23:35 -05:00
FatBoy 0d45bb5bc1 Saetor Race Added 2024-03-10 19:12:12 -05:00
FatBoy 6ea4717263 custom races 2024-03-10 18:31:19 -05:00
FatBoy 7153216f09 custom races 2024-03-10 18:27:09 -05:00
FatBoy 114ccfee9d mob aggro 2024-03-10 16:37:21 -05:00
FatBoy 23e0a0dcc7 mob aggro 2024-03-10 16:34:10 -05:00
FatBoy b2a3eb3e6e uniform disc dropper respawns 2024-03-10 16:29:12 -05:00
FatBoy 13a4ba6e0e terraformsize 2024-03-10 15:52:58 -05:00
FatBoy eaa8828a24 terraformsize 2024-03-10 15:51:02 -05:00
FatBoy 6bbe9317ac terraformsize 2024-03-10 15:49:25 -05:00
FatBoy 0c56631b92 terraformsize 2024-03-10 15:45:25 -05:00
FatBoy a81810d751 terraformsize 2024-03-10 15:44:04 -05:00
FatBoy 9c75e7defe terraformsize 2024-03-10 15:37:40 -05:00
FatBoy 6aba5be67a login crash bug 2024-03-10 13:05:50 -05:00
FatBoy 9c867ee281 login crash bug 2024-03-10 13:00:46 -05:00
FatBoy afc91e22e5 login crash bug 2024-03-10 12:48:05 -05:00
FatBoy 6dac5c7ec8 login crash bug 2024-03-09 21:47:03 -06:00
FatBoy c6c4a128a2 login crash bug 2024-03-09 21:42:56 -06:00
FatBoy 28fa81962d login crash bug 2024-03-09 21:09:52 -06:00
FatBoy 0759c56b14 login crash bug 2024-03-09 21:08:58 -06:00
FatBoy 64e6e035c1 login crash bug 2024-03-09 21:03:32 -06:00
FatBoy 31bf62a678 login crash bug 2024-03-09 21:02:06 -06:00
FatBoy a924e4c876 login crash bug 2024-03-09 21:00:12 -06:00
FatBoy 38e6bdf92d login crash bug 2024-03-09 20:53:25 -06:00
FatBoy 69dd7bcc37 login crash bug 2024-03-09 20:46:15 -06:00
FatBoy f26e8e4559 login crash bug 2024-03-09 20:43:03 -06:00
FatBoy 16e8df3daf login crash bug 2024-03-09 20:35:00 -06:00
FatBoy c98c64262b resource stacking bug 2024-03-09 20:29:35 -06:00
FatBoy a6cf68ef07 resource stacking bug 2024-03-09 20:21:32 -06:00
FatBoy 3b179a5703 resource stacking bug 2024-03-09 20:09:05 -06:00
FatBoy 0638028a59 resource stacking bug 2024-03-09 20:06:02 -06:00
FatBoy 912ebd4742 resource stacking bug 2024-03-09 19:59:21 -06:00
FatBoy c1440f8f9e resource stacking bug 2024-03-09 19:52:52 -06:00
FatBoy 8d32927241 resource stacking bug 2024-03-09 19:41:17 -06:00
FatBoy d058e7506a resource stacking bug 2024-03-09 19:19:58 -06:00
FatBoy dd548acfe1 resource stacking bug 2024-03-09 19:01:52 -06:00
FatBoy acc0c1dc46 zerg test fixes 2024-03-08 22:09:25 -06:00
FatBoy d0c74e0641 30 minute mine windows 2024-03-07 21:45:00 -06:00
FatBoy 095a26e1d9 30 minute mine windows 2024-03-07 21:30:12 -06:00
FatBoy 1cb0848690 30 minute mine windows 2024-03-07 21:23:46 -06:00
FatBoy 60a7b395e5 30 minute mine windows 2024-03-07 21:11:28 -06:00
FatBoy 09e57852f4 30 minute mine windows 2024-03-07 20:25:56 -06:00
FatBoy c2fe156680 30 minute mine windows 2024-03-07 20:24:14 -06:00
FatBoy b9545dbf76 30 minute mine windows 2024-03-07 20:13:20 -06:00
FatBoy 8ce7c09000 30 minute mine windows 2024-03-07 20:09:58 -06:00
FatBoy 9107540212 30 minute mine windows 2024-03-07 20:04:58 -06:00
FatBoy 24bc0097be 30 minute mine windows 2024-03-07 19:45:12 -06:00
FatBoy 7175f79bfe mine HP set to custom value after rebuild 2024-03-07 19:27:28 -06:00
FatBoy 230a7460cd PC null catch 2024-03-06 21:35:04 -06:00
FatBoy e172d3f2d0 Modified Vorg Boots 2024-03-06 21:31:34 -06:00
FatBoy 2e78f44640 nation chat kill messages 2024-03-06 21:27:28 -06:00
FatBoy 5c46af3c52 Bounty Hunter Eyes Fix 2024-03-06 20:51:21 -06:00
FatBoy b9ec8fd540 vorg HA fix 2024-03-06 19:47:31 -06:00
FatBoy d3bf19426c vorg HA fix 2024-03-05 20:50:46 -06:00
FatBoy 734b46d816 vorg HA fix 2024-03-05 20:39:48 -06:00
FatBoy 11310a5b64 vorg HA fix 2024-03-05 20:33:58 -06:00
FatBoy 067f8f8d89 60 second default logout timer 2024-03-03 20:11:47 -06:00
FatBoy afa9ddf89e allow BH and huntsman on all but priest 2024-03-03 20:03:35 -06:00
FatBoy a6cee850a6 allow BH and huntsman on all but priest 2024-03-02 19:16:18 -06:00
FatBoy 5f5616fd2d guards 2024-03-02 19:01:54 -06:00
FatBoy dcd37bce13 guards 2024-03-02 18:55:14 -06:00
FatBoy d438440556 guards 2024-03-02 18:49:54 -06:00
FatBoy 9f58e211a8 guards 2024-03-02 17:41:07 -06:00
FatBoy f52e67e80c guards 2024-03-02 17:28:01 -06:00
FatBoy c520263179 combat bug fix 2024-03-02 17:21:16 -06:00
FatBoy c9f246afec combat bug fix 2024-03-02 17:00:55 -06:00
FatBoy cdf7fcc54d combat bug fix 2024-03-02 16:57:18 -06:00
FatBoy 3553291d1d combat bug fix 2024-03-02 16:56:40 -06:00
FatBoy 67ce60124f combat bug fix 2024-03-02 16:50:57 -06:00
FatBoy 0e6ee13926 combat bug fix 2024-03-02 16:48:19 -06:00
FatBoy 5b0ba790b3 combat bug fix 2024-03-02 16:44:21 -06:00
FatBoy b53f2c2824 combat bug fix 2024-03-02 16:35:00 -06:00
FatBoy b9a87ba407 combat bug fix 2024-03-02 16:17:57 -06:00
FatBoy e3ed34a04b combat bug fix 2024-03-02 16:11:36 -06:00
FatBoy 6915e30eb2 combat bug fix 2024-03-02 15:55:37 -06:00
FatBoy e9c7cc8e04 combat bug fix 2024-03-02 15:52:02 -06:00
FatBoy 90feaea89e combat bug fix 2024-03-02 15:50:44 -06:00
FatBoy 174bceb49e combat bug fix 2024-03-02 15:42:07 -06:00
FatBoy e3ec8d7737 combat bug fix 2024-03-02 15:28:12 -06:00
FatBoy c44a7eafab combat bug fix 2024-03-02 15:18:59 -06:00
FatBoy 879b52c7c7 combat bug fix 2024-03-02 15:14:34 -06:00
FatBoy 1fe3f7dfb1 combat bug fix 2024-03-02 15:11:43 -06:00
FatBoy 2c8517a1e4 combat bug fix 2024-03-02 14:59:27 -06:00
FatBoy 4eff71f288 combat bug fix 2024-03-02 14:54:17 -06:00
FatBoy 349b88f142 investigate vorg LA hood drop never occurring 2024-03-01 21:25:27 -06:00
FatBoy 6b8d1e6f71 chinese mines moved earlier by 1 hour 2024-03-01 21:01:21 -06:00
FatBoy 79022f0e3e enchant stripping bug 2024-03-01 19:58:24 -06:00
FatBoy 523eb8529f enchant stripping bug 2024-03-01 19:51:09 -06:00
FatBoy 5684fb6ce1 enchant stripping bug 2024-03-01 19:44:35 -06:00
FatBoy feb23e63fe zerg mechanic overhaul 2024-03-01 19:41:34 -06:00
FatBoy ab5943e4b2 zerg mechanic overhaul 2024-03-01 19:39:03 -06:00
FatBoy 02d22f0881 Mines no longer produce hourly resources 2024-03-01 19:17:27 -06:00
FatBoy 9b555c0259 Zerg multiplier reduction method 2024-03-01 19:15:27 -06:00
FatBoy 6a4e0e32cc hard set mine windows 2024-02-29 22:06:48 -06:00
FatBoy 5713dab8cf hard set mine windows 2024-02-29 21:59:45 -06:00
FatBoy 71b7fd5c1b hard set mine windows 2024-02-29 21:51:30 -06:00
FatBoy 39e6917ae8 hard set mine windows 2024-02-29 21:49:13 -06:00
FatBoy 86c33c195c hard set mine windows 2024-02-29 21:44:48 -06:00
FatBoy ad6fca61ed hard set mine windows 2024-02-29 21:42:26 -06:00
FatBoy f2b91f875f hard set mine windows 2024-02-29 21:37:02 -06:00
FatBoy ab2b7092fd hard set mine windows 2024-02-29 21:32:39 -06:00
FatBoy d39137d900 hard set mine windows 2024-02-29 21:27:26 -06:00
FatBoy d906d49e51 hard set mine windows 2024-02-29 21:07:36 -06:00
FatBoy 54c48d398b hard set mine windows 2024-02-29 20:58:38 -06:00
FatBoy 98fe77b148 hard set mine windows 2024-02-29 20:57:14 -06:00
FatBoy 9ee3b9d7bb hard set mine windows 2024-02-29 20:48:11 -06:00
FatBoy d6dd61e9c5 pet debugging 2024-02-29 20:06:03 -06:00
FatBoy d92e5d4a45 pet debugging 2024-02-29 20:01:28 -06:00
FatBoy d065e9ffc8 pet debugging 2024-02-29 19:52:08 -06:00
FatBoy 2b63ed08b8 pet debugging 2024-02-29 19:46:01 -06:00
FatBoy 50fb0d39c5 pet debugging 2024-02-29 19:38:21 -06:00
FatBoy bb91502cb4 pet debugging 2024-02-29 19:30:47 -06:00
FatBoy 8f6e13102d pet debugging 2024-02-29 19:20:17 -06:00
FatBoy 0679ffcaec pet debugging 2024-02-29 19:17:37 -06:00
FatBoy 9ab286166e zerg multiplier debug text 2024-02-29 19:11:35 -06:00
FatBoy 0d4e8f3c9a pet buff trouble shooting 2024-02-29 19:04:06 -06:00
FatBoy 02a78d538c pet buff trouble shooting 2024-02-28 21:24:57 -06:00
FatBoy 9e74954422 pet buff trouble shooting 2024-02-28 21:20:16 -06:00
FatBoy a267382481 pet buff trouble shooting 2024-02-28 21:14:56 -06:00
FatBoy 0910b7184c pet buff trouble shooting 2024-02-28 21:05:05 -06:00
FatBoy 297fe8c7a2 pet buff trouble shooting 2024-02-28 21:01:24 -06:00
FatBoy 76405cb968 pet buff trouble shooting 2024-02-28 20:59:52 -06:00
FatBoy a38e5b478a pet buff trouble shooting 2024-02-28 20:46:36 -06:00
FatBoy 4540e5c770 castable enchants removed when being traded or banked or vaulted 2024-02-28 20:32:14 -06:00
FatBoy aef12b2bb4 tree overlap reduction 2024-02-28 20:18:21 -06:00
FatBoy a562af57e9 boon level based on votary rank 2024-02-28 20:00:41 -06:00
FatBoy 03470c699d vorg stats 2024-02-28 19:43:51 -06:00
FatBoy f777f480ad vorg stats 2024-02-28 19:35:39 -06:00
FatBoy ce542ce319 combat problem chasing 2024-02-28 18:48:17 -06:00
FatBoy 7ff879ea64 perfect conc 2024-02-25 21:43:25 -06:00
FatBoy e4274994ff combat null fix 2024-02-25 20:40:37 -06:00
FatBoy 547d222a2d test 2024-02-24 12:51:48 -06:00
FatBoy 5159afc704 bugfix: null combat target 2024-02-24 12:28:46 -06:00
FatBoy 3a771ac585 bane cap sized persist through reboots 2024-02-23 20:56:08 -06:00
FatBoy 97fcbd8608 bane mechanic for zerg measures 2024-02-23 20:47:46 -06:00
FatBoy 39aec46220 bane mechanic for zerg measures 2024-02-23 20:41:31 -06:00
FatBoy 1db30e3c6b bane mechanic for zerg measures 2024-02-23 20:36:19 -06:00
FatBoy 34cb943595 Revert "randomized mine times"
This reverts commit de3f1cf004.
2024-02-23 20:07:20 -06:00
FatBoy bef49fc720 Revert "randomized mine times"
This reverts commit 802d46d66e.
2024-02-23 20:07:11 -06:00
FatBoy 2bbdeb89ff Revert "randomized mine times"
This reverts commit 2f4287783e.
2024-02-23 20:06:59 -06:00
FatBoy 2f4287783e randomized mine times 2024-02-23 20:03:37 -06:00
FatBoy 802d46d66e randomized mine times 2024-02-23 19:46:58 -06:00
FatBoy de3f1cf004 randomized mine times 2024-02-23 19:40:37 -06:00
FatBoy 90e85d3e46 taxing removed from r8 cities 2024-02-23 18:56:59 -06:00
FatBoy 2e104741ba bounty hunter eyes see invis 2024-02-22 21:44:12 -06:00
FatBoy 6461efa1a2 modified production values 2024-02-22 21:23:47 -06:00
FatBoy 320ea7e81c planting on OB and Mael 2024-02-22 21:19:35 -06:00
FatBoy 05eb8cd961 Mine Changes 2024-02-22 21:14:22 -06:00
FatBoy 9909216e27 Mine Changes 2024-02-22 20:51:20 -06:00
FatBoy 33a369821a Mine Changes 2024-02-22 20:49:08 -06:00
FatBoy 6e93e40454 Mine Changes 2024-02-22 20:45:10 -06:00
FatBoy c14fd84d96 Resource Merchant 2024-02-22 20:11:22 -06:00
FatBoy 56c16fc06e Resource Merchant 2024-02-22 20:00:54 -06:00
FatBoy 71274d25d0 Resource Merchant 2024-02-22 19:49:15 -06:00
FatBoy 9d75116790 Resource Merchant 2024-02-22 19:48:29 -06:00
FatBoy 629fce8cff Resource Merchant 2024-02-22 19:35:05 -06:00
FatBoy 7fefd53be2 Resource Merchant 2024-02-22 19:27:14 -06:00
FatBoy 8aab20caf4 Resource Merchant 2024-02-22 19:18:24 -06:00
FatBoy 14ad0b7599 Resource Merchant 2024-02-22 19:16:59 -06:00
FatBoy 267549ce15 Resource Merchant 2024-02-22 19:15:13 -06:00
FatBoy 6e14f723da Resource Merchant 2024-02-22 19:06:25 -06:00
FatBoy 46a9dad407 Resource Merchant 2024-02-22 18:58:02 -06:00
FatBoy e89e2f51b7 Merge branch 'lakebane-zerg' into lakebane-master
# Conflicts:
#	src/engine/InterestManagement/InterestManager.java
#	src/engine/gameManager/SimulationManager.java
#	src/engine/mobileAI/MobAI.java
#	src/engine/objects/CharacterItemManager.java
#	src/engine/objects/Mine.java
#	src/engine/objects/PlayerCharacter.java
2024-02-22 18:53:48 -06:00
FatBoy 40290bdf97 test rune vendor 2024-02-20 21:13:12 -06:00
FatBoy a37e30c550 test rune vendor 2024-02-20 21:06:32 -06:00
FatBoy 0440aabd1e test rune vendor 2024-02-20 21:03:05 -06:00
FatBoy fbc408f617 test rune vendor 2024-02-20 21:01:57 -06:00
FatBoy 0f7410f55f test rune vendor 2024-02-20 20:56:37 -06:00
FatBoy f82a19f243 test rune vendor 2024-02-20 20:50:58 -06:00
FatBoy c9428d2b56 test rune vendor 2024-02-20 20:39:38 -06:00
FatBoy c4bd766156 test rune vendor 2024-02-20 19:40:47 -06:00
FatBoy 44cd8d0013 resource stacking update 2024-02-19 18:41:47 -06:00
FatBoy 84a75f6b83 resource stacking update 2024-02-19 18:39:02 -06:00
FatBoy be902cf09c loot update 2024-02-19 18:30:09 -06:00
FatBoy 0289b5087d loot update 2024-02-19 18:27:56 -06:00
FatBoy b5f36b60f7 loot update 2024-02-19 18:01:19 -06:00
FatBoy 43409d2e4b booty sim 1000 iteration 2024-02-19 17:49:32 -06:00
FatBoy 547de5033b rune and contract rate update 2024-02-19 17:42:02 -06:00
FatBoy 2c7baaf2ac rune and contract rate update 2024-02-19 17:35:19 -06:00
FatBoy 351437b46b rune and contract rate update 2024-02-19 17:25:19 -06:00
FatBoy 1e9f1685da cannot delete gold 2024-02-19 17:19:34 -06:00
FatBoy d9a03ebf93 resources auto stack when entering inventory 2024-02-19 17:16:34 -06:00
FatBoy 666e3d5479 boons become nation friendly 2024-02-19 17:02:42 -06:00
FatBoy 7efd276d52 grant conc pot when level set to 10 2024-02-18 22:13:41 -06:00
FatBoy 46826163be test mechanics removed 2024-02-18 21:49:40 -06:00
FatBoy e70b52d88c test mechanics removed 2024-02-18 21:28:39 -06:00
FatBoy 106dd87216 zerg mechanic tweak 2024-02-18 20:25:11 -06:00
FatBoy c964115c1e resource merchant work 2024-02-18 18:34:46 -06:00
FatBoy 8c022596a7 resource merchant work 2024-02-18 18:31:55 -06:00
FatBoy 2de240dd60 resource merchant work 2024-02-18 18:28:36 -06:00
FatBoy 8e8876587c resource merchant work 2024-02-18 18:25:26 -06:00
FatBoy 8f0e19a10c resource merchant work 2024-02-18 18:17:38 -06:00
FatBoy 2222a335a1 resource merchant work 2024-02-18 18:12:09 -06:00
FatBoy a7bc1d5a6a resource merchant work 2024-02-18 18:04:31 -06:00
FatBoy 0e61f0e7b8 resource merchant work 2024-02-18 17:59:25 -06:00
FatBoy 0d256c17b5 resource merchant work 2024-02-18 17:57:17 -06:00
FatBoy 571ad4b466 resource merchant work 2024-02-18 17:49:13 -06:00
FatBoy 9e7a8bef4a resource merchant work 2024-02-18 17:38:57 -06:00
FatBoy 669db7f021 resource merchant work 2024-02-18 17:36:53 -06:00
FatBoy 13513bcf2a resource merchant work 2024-02-18 17:31:09 -06:00
FatBoy 149630ef5a resource merchant work 2024-02-18 17:20:49 -06:00
FatBoy 257d864132 resource merchant work 2024-02-18 16:58:45 -06:00
FatBoy 6247332f83 resource merchant work 2024-02-18 16:46:28 -06:00
FatBoy e5d606fe8a resource merchant work 2024-02-18 16:41:54 -06:00
FatBoy dc1720b38b resource merchant added 2024-02-18 16:29:40 -06:00
FatBoy 7b5de5f3f5 runey work > profit slider 2024-02-18 16:15:24 -06:00
FatBoy 7de9bdbbe4 runey work > profit slider 2024-02-18 16:14:42 -06:00
FatBoy 88123ad99a runey work > profit slider 2024-02-18 16:07:46 -06:00
FatBoy 0437f10bf9 runey work > profit slider 2024-02-18 16:06:09 -06:00
FatBoy e93f09c184 runey work > profit slider 2024-02-18 16:04:50 -06:00
FatBoy ee60f88e62 add UUID to slottest hireling list 2024-02-18 16:00:16 -06:00
FatBoy 2d4d0f79f8 add UUID to slottest hireling list 2024-02-18 15:58:33 -06:00
FatBoy 664eb04658 adjust "runey" location 2024-02-18 15:56:14 -06:00
FatBoy 1fc9e6251e adjust "runey" location 2024-02-18 15:52:10 -06:00
FatBoy 7eba9501a6 adjust "runey" location 2024-02-18 15:39:23 -06:00
FatBoy 0eb67c83a3 stat runes junk for 500k each 2024-02-18 15:33:08 -06:00
FatBoy 6668c01185 boxed characters to have pathfinding effect applied at all times 2024-02-18 15:27:46 -06:00
FatBoy 76b89d898a added rune merchant 2024-02-18 15:21:16 -06:00
FatBoy 6a28574471 adjusted and scaled mine hitpoints 2024-02-17 21:08:58 -06:00
FatBoy 11faa98503 reduced reources drops 2024-02-17 21:01:28 -06:00
FatBoy a32ba5e262 track range changes 2024-02-17 20:31:53 -06:00
FatBoy 558b645274 erro log fix and zerg mechanic manager 2024-02-17 19:40:26 -06:00
FatBoy a1115e728c custom rates for contracts runes and glass 2024-02-17 19:14:08 -06:00
FatBoy 409f8aa847 various console error fixes 2024-02-17 18:59:44 -06:00
FatBoy 78cf95d290 zerg mechanic work 2024-02-16 23:08:33 -06:00
FatBoy 2c78e0728a Revert "Enchantment Exploring"
This reverts commit c08a93e85d.
2024-02-16 23:07:55 -06:00
FatBoy 31e56b4da6 Revert "zerg mechanic work"
This reverts commit ba3fd7215b.
2024-02-16 23:07:45 -06:00
FatBoy ba3fd7215b zerg mechanic work 2024-02-16 22:55:50 -06:00
FatBoy c08a93e85d Enchantment Exploring 2024-02-16 22:21:40 -06:00
FatBoy b63a5fa1c1 Enchantment Exploring 2024-02-15 20:16:48 -06:00
FatBoy c7494e8a9d Lore Rules 2024-02-15 19:52:09 -06:00
FatBoy f69fde8a3a all items now AutoID 2024-02-14 22:02:04 -06:00
FatBoy 05dace9194 asset windows to display correct modified maintenance 2024-02-14 21:34:43 -06:00
FatBoy ae975b7591 asset windows to display correct modified maintenance 2024-02-14 20:57:48 -06:00
FatBoy 02f376f418 inventory junking 2024-02-14 20:31:19 -06:00
FatBoy 3c2d3782c2 inventory junking 2024-02-14 20:26:29 -06:00
FatBoy daaa1d9ece inventory junking 2024-02-14 20:21:47 -06:00
FatBoy 747056bc8c replace glass drop with HZ table drop 2024-02-14 20:14:34 -06:00
FatBoy b6760d0775 new NPC for ToL support 2024-02-14 20:05:14 -06:00
FatBoy ba4ab458a0 new NPC for ToL support 2024-02-14 19:58:39 -06:00
FatBoy c04fd62e71 new NPC for ToL support 2024-02-14 19:57:03 -06:00
FatBoy 97c063661a new NPC for ToL support 2024-02-14 19:52:29 -06:00
FatBoy 62205150a7 new NPC for ToL support 2024-02-14 19:46:23 -06:00
FatBoy 9f5bdce571 new NPC for ToL support 2024-02-14 19:36:28 -06:00
FatBoy 22a0cb2474 Tol can now support 4 max slost at r7/8 2024-02-14 19:28:11 -06:00
FatBoy 96c1e34a08 Tol can now support 4 max slost at r7/8 2024-02-14 19:11:09 -06:00
FatBoy 3dc7f7c9ed remove combat/nocombat requirement form powers 2024-02-14 18:19:42 -06:00
FatBoy cd1b15834a boxshroud fixes 2024-02-14 14:06:15 -06:00
FatBoy 8a0303e0f5 boxshroud fixes 2024-02-14 14:00:23 -06:00
FatBoy aa0e993038 boxshroud fixes 2024-02-14 13:51:50 -06:00
FatBoy 3ef3a0c37c boxshroud fixes 2024-02-14 13:48:34 -06:00
FatBoy a6a2629fd5 boxshroud fixes 2024-02-14 13:42:57 -06:00
FatBoy e414304e94 boxshroud fixes 2024-02-14 13:35:10 -06:00
FatBoy f5b08c1868 mines set to 5 cap, zerg mechanic buff/debuff introduced 2024-02-14 13:27:00 -06:00
FatBoy 0bdcfe7b51 mines set to 5 cap, zerg mechanic buff/debuff introduced 2024-02-14 09:53:00 -06:00
FatBoy c640caeb54 Zerg Mechanic Completed 2024-02-12 22:06:38 -06:00
FatBoy 3d33a16d06 multiplier display 2024-02-12 20:09:26 -06:00
FatBoy f4778d4f48 multiplier display 2024-02-12 19:55:56 -06:00
FatBoy c8246ff317 multiplier display 2024-02-12 19:54:25 -06:00
FatBoy 7a3a9c6254 multiplier display 2024-02-12 19:41:54 -06:00
FatBoy 545796e297 players removed when leaving mines 2024-02-12 19:21:41 -06:00
FatBoy 6b4eff4d4c players removed when leaving mines 2024-02-12 19:09:21 -06:00
FatBoy 457ed4f4e6 mine show in system chat updated numbers 2024-02-11 23:41:24 -06:00
FatBoy 8f2847a527 Mines calculate local players by guild 2024-02-11 23:18:09 -06:00
FatBoy 7f5df22a14 mines to set random cap size at server boot 5/10/20 2024-02-11 22:48:19 -06:00
FatBoy 4fd737e3ec mines to set random cap size at server boot 5/10/20 2024-02-11 22:47:22 -06:00
FatBoy e891d353ba Vorg mobs drop random piece of set and spawn randomly between 5 and 45 minutes after death 2024-02-11 22:36:48 -06:00
FatBoy c5376d24a5 NPC 5 minute upgrades 2024-02-11 22:03:15 -06:00
FatBoy 85bf30cbdd remove DS on login when no other boxes logged in 2024-02-11 21:26:00 -06:00
FatBoy 775410b00a Revert "5 minute upgrades for NPCs"
This reverts commit de772237c9.
2024-02-11 19:31:25 -06:00
FatBoy a8275c7cc7 Revert "5 minute upgrades for NPCs"
This reverts commit 1b7be0365a.
2024-02-11 19:31:17 -06:00
FatBoy 03025e7f00 5 minute upgrades for initial placement 2024-02-11 19:10:05 -06:00
FatBoy 1b7be0365a 5 minute upgrades for NPCs 2024-02-11 18:42:02 -06:00
FatBoy de772237c9 5 minute upgrades for NPCs 2024-02-11 18:39:31 -06:00
FatBoy e60c635c39 announce rates at login 2024-02-11 18:35:55 -06:00
FatBoy 6db9f115b1 announce rates at login 2024-02-11 17:40:11 -06:00
FatBoy 3f303e1c9e tweak 2024-02-11 17:37:01 -06:00
FatBoy c0ec747e43 any mob over level 30 has a small chance to drop glass 2024-02-11 17:12:43 -06:00
FatBoy b583034b4e hotzone removed from game 2024-02-11 17:01:42 -06:00
FatBoy 3360a034b2 maintenenace only ran for ToL, 3,000,000 cost, recycling daily when payment isnt received 2024-02-11 16:59:46 -06:00
FatBoy 668df83e33 boxed character fix, safezone equipment damage fix, trade fix, creation experience fix, sub guild limits removed 2024-02-11 09:36:10 -06:00
FatBoy fa3234d0f5 xp and conc granted for noob 2024-02-07 22:09:16 -06:00
FatBoy e8973ecb6d xp and conc granted for noob 2024-02-07 22:03:12 -06:00
FatBoy 134aecf4d7 xp and conc granted for noob 2024-02-07 21:53:48 -06:00
FatBoy 08cb49f641 xp and conc granted for noob 2024-02-07 21:41:25 -06:00
FatBoy 2a06015a0e xp and conc granted for noob 2024-02-07 21:38:02 -06:00
FatBoy 4559519512 xp and conc granted for noob 2024-02-07 21:30:16 -06:00
FatBoy 42b2f886d5 xp and conc granted for noob 2024-02-07 21:26:33 -06:00
FatBoy 0ce7f64d94 xp and conc granted for noob 2024-02-07 21:21:04 -06:00
FatBoy 5fbd5ebb5c xp and conc granted for noob 2024-02-07 21:20:41 -06:00
FatBoy 8fed2d3506 xp and conc granted for noob 2024-02-07 21:11:27 -06:00
FatBoy e119f62049 xp and conc granted for noob 2024-02-07 21:10:24 -06:00
FatBoy 228b0c74a9 xp and conc granted for noob 2024-02-07 21:01:53 -06:00
FatBoy c73688de4d xp and conc granted for noob 2024-02-07 20:52:00 -06:00
FatBoy 71288d0203 death in safe zone no longer causes item damage 2024-02-07 16:30:19 -06:00
FatBoy db229dcf74 1000 unit missed spot 2024-02-07 16:04:41 -06:00
FatBoy 2e4bf0823c standard 1000 inventory weight && fixed XP rates 5x/10x 2024-02-07 15:52:42 -06:00
FatBoy d70f9f6dc3 box tweaking 2024-02-05 20:36:21 -06:00
FatBoy a9ecf76585 deathshroud application 2024-02-05 20:25:12 -06:00
FatBoy ea3c571485 deathshroud application 2024-02-05 20:20:54 -06:00
FatBoy 5840de216d deathshroud application 2024-02-05 20:19:41 -06:00
FatBoy c7d26f9dcc box limit adjustment 2024-02-05 20:10:15 -06:00
FatBoy 5287b993fa collection of players for cities and mines 2024-02-05 20:08:39 -06:00
FatBoy 33bd1a0906 characters logged in exceeding max:1 will be given PR999 death shroud 2024-02-05 19:21:25 -06:00
FatBoy 5cd86bc033 characters logged in exceeding max:1 will be given PR999 death shroud 2024-02-05 19:20:27 -06:00
MagicBot 6641651f3c Unused method removed. 2023-08-31 07:27:03 -04:00
MagicBot dbf164bfb2 bonus code removal 2023-08-30 15:47:08 -04:00
MagicBot 8a617c3008 Siege minion spawn time set to 15m. 2023-08-30 15:33:55 -04:00
FatBoy a50a2430ba hate value for chants to affect mobs in range 2023-08-29 21:49:02 -05:00
FatBoy 5c3c552288 usage of AIAgentType for default patrol points 2023-08-29 21:17:44 -05:00
FatBoy 69fdddfc71 hate value fix 2023-08-29 21:01:00 -05:00
FatBoy db5b988275 usage of AIAgentType for pet checks in run after load 2023-08-29 20:18:05 -05:00
FatBoy 4284757035 pet level set in run after load removed 2023-08-29 20:16:00 -05:00
FatBoy b93a47acc0 pet death and dismissal fix 2023-08-29 20:12:48 -05:00
MagicBot d59f9857ce Cleanup in pet minion 2023-08-28 00:56:13 -04:00
FatBoy 8ce212b74b Merge remote-tracking branch 'origin/mob-refactor2' into mob-refactor2 2023-08-27 23:53:12 -05:00
FatBoy e78aea5735 Assign patrol points added as static method to NPC manager 2023-08-27 23:52:40 -05:00
MagicBot 9a3c5c3f40 Siege minion assigned UUID. 2023-08-28 00:46:39 -04:00
FatBoy 60ca3f9c34 remove siege minion 2023-08-27 23:42:04 -05:00
FatBoy e7e740dff1 blocked player character specific block in minion training message handler 2023-08-27 23:23:17 -05:00
MagicBot 8343a98d77 Minion added to map after runafterload. 2023-08-28 00:08:35 -04:00
MagicBot 5862039a00 Minion added to map after runafterload. 2023-08-28 00:07:40 -04:00
MagicBot 8af989b75f Fix is patrol logic bloc conditional. 2023-08-27 23:55:02 -04:00
MagicBot 08d0e5ff75 Logic isn't needed here. 2023-08-27 23:32:23 -04:00
MagicBot 5196d10e5c Logic isn't needed here. 2023-08-27 23:31:32 -04:00
MagicBot 3392ec463d Removed unused methods. 2023-08-27 23:29:45 -04:00
MagicBot 33529404cf Logic fix in siege minions. 2023-08-27 23:25:44 -04:00
MagicBot 00e7a36013 Logic fix in siege minions. 2023-08-27 23:22:28 -04:00
FatBoy 3060b394ab removed siegeminion map from NPC 2023-08-27 22:10:13 -05:00
MagicBot a43d9022fe Siege engine slot override. 2023-08-27 22:57:11 -04:00
FatBoy 6abdc68ca5 removed un-needed cast to player character for pets 2023-08-27 21:46:44 -05:00
FatBoy 61c66b0e96 trebs slot in proper locations 2023-08-27 21:38:31 -05:00
FatBoy 36cc23457a optimized slot for siege engines 2023-08-27 21:26:00 -05:00
FatBoy d573b238de refactored mob get/set owner 2023-08-27 21:04:34 -05:00
FatBoy 8afe25fe85 siege minions added to arty captain minion map 2023-08-27 20:50:13 -05:00
MagicBot f80647ff0d Spawn time set to 15s for debug. 2023-08-27 21:42:58 -04:00
MagicBot 7e64cbabf8 Update to slotting logic. 2023-08-27 21:30:57 -04:00
MagicBot 14a06410ae Update to slotting logic. 2023-08-27 21:25:43 -04:00
MagicBot 85c2a4f4f0 Add all as hirelings 2023-08-27 21:20:00 -04:00
FatBoy da9e211ec7 SiegeEngine enum and logic added 2023-08-27 20:05:18 -05:00
MagicBot a81070c471 Pet level += 20 to conform to 24.3 2023-08-26 15:47:10 -04:00
MagicBot e3ad7efa4f Method renamed for new convention. 2023-08-26 15:35:42 -04:00
MagicBot a4dafd7155 Unused variable in signature. 2023-08-26 15:34:27 -04:00
MagicBot 645aec853e Bindloc not adjusted for pets. 2023-08-26 15:21:50 -04:00
MagicBot d8d5e4a3c4 Name set to default. 2023-08-26 15:19:17 -04:00
MagicBot 7a48c04057 Mobbase set properly. 2023-08-26 15:10:14 -04:00
MagicBot 64aaaa707e Behaviour type set for pets. 2023-08-26 15:00:43 -04:00
MagicBot 445d40dc5f Bonus code removed. 2023-08-26 14:59:25 -04:00
MagicBot ebdcb531f2 AI methods moved to ai class. 2023-08-26 14:54:43 -04:00
MagicBot c9cdb891d6 Cleanup of ownerNPC mess. 2023-08-26 14:52:18 -04:00
MagicBot f5c6c002a8 Unused method removed. 2023-08-26 13:53:32 -04:00
MagicBot d171c6bb9a Unused method removed. 2023-08-26 13:47:41 -04:00
MagicBot 1c81a4faed Wall archers static reverted. 2023-08-26 13:38:09 -04:00
MagicBot e7d1d5cb71 Constructor removed. 2023-08-26 12:38:54 -04:00
MagicBot 060d831d50 Comment for clarity. 2023-08-26 12:37:28 -04:00
MagicBot 316bd6dd01 Siege engines use slot system. 2023-08-26 12:35:14 -04:00
MagicBot 34081e5903 Ordinal comparison fix. 2023-08-26 12:21:47 -04:00
MagicBot e2d843b65e Signature refactor. 2023-08-26 12:03:33 -04:00
MagicBot a796f5fe4b More siege engine work. 2023-08-26 11:55:18 -04:00
MagicBot 51ee41c773 use of SiegeEngine Behaviour Type 2023-08-26 11:19:36 -04:00
MagicBot 7e5ed3efe5 sqrMagnitude not sqrRoot 2023-08-26 11:09:58 -04:00
MagicBot 8dd25ac315 Minions inherit patrol points form barracks. 2023-08-26 11:06:48 -04:00
MagicBot 1cdaa58e7a Wall archers set to static grid type. 2023-08-26 10:11:13 -04:00
MagicBot fa3aa24a3d Update to minion building/location mechanic. 2023-08-26 09:41:58 -04:00
MagicBot 091431d95b Dynamic set in all constructors. 2023-08-26 09:31:10 -04:00
MagicBot 1ecf0122ab Unused variable removed. 2023-08-26 09:29:12 -04:00
MagicBot 79980a1725 NoID constructor removed. 2023-08-26 06:45:34 -04:00
MagicBot 8badcc3f6e Refactored out redundant stat-xyz variables. 2023-08-26 06:24:05 -04:00
MagicBot 4d6e57257c Unused methods removed. 2023-08-26 06:19:03 -04:00
MagicBot a7a93b8500 Tweak to bindloc for minions. 2023-08-25 17:05:46 -04:00
MagicBot 85cc34fb4c AIinfo updated. 2023-08-25 16:57:25 -04:00
MagicBot 772a996b6e Tweak to behavior type setup. 2023-08-25 16:49:26 -04:00
MagicBot e67eff822d Propagate guardedCity. 2023-08-25 16:44:45 -04:00
MagicBot c39ed6120f Cleanup of bind/loc logic. 2023-08-25 16:19:04 -04:00
MagicBot c38f4e6543 Mask only needs be set once. 2023-08-25 16:01:18 -04:00
MagicBot 098433b697 Needs contract null check 2023-08-25 15:46:09 -04:00
MagicBot c8e20c905b Add to cache before setloc 2023-08-25 15:37:02 -04:00
MagicBot bd2446ba0a Minion uuid set pre configure 2023-08-25 15:34:47 -04:00
MagicBot c179e4aaf3 Don't override level or name for minions. 2023-08-25 15:29:42 -04:00
MagicBot 2f8de2a919 Worthless collection only used in 2 places. 2023-08-25 15:23:02 -04:00
MagicBot 338110973d Mobbase cannot be null. 2023-08-25 15:19:25 -04:00
MagicBot 3c9c4495bc playerGuard = true. 2023-08-25 15:14:33 -04:00
MagicBot 93476f782c Bind loc not overwritten. 2023-08-25 15:03:37 -04:00
MagicBot 3aec6ee578 More minion setup work. 2023-08-25 14:45:47 -04:00
MagicBot 3bca76d4c8 Setloc to spawn minion. 2023-08-25 14:38:09 -04:00
MagicBot b9d6f35aac Unused variable. 2023-08-25 14:35:02 -04:00
MagicBot 9b6959414a More flushing out minion support. 2023-08-25 14:33:43 -04:00
MagicBot 400dd6aa5e More granular error reporting. 2023-08-25 14:08:43 -04:00
MagicBot 14af2f6efd Minion spawning re-enabled for refactoring. 2023-08-25 14:01:47 -04:00
MagicBot 0a2de9e0d5 Contract handling cleanup. 2023-08-25 13:41:22 -04:00
MagicBot 89bfad78a6 Contract handling cleanup. 2023-08-25 13:31:56 -04:00
MagicBot 52486fa278 Contract handling cleanup. 2023-08-25 13:24:07 -04:00
MagicBot dc0e14eb21 AI added earlier in sequence for availability. 2023-08-25 13:07:47 -04:00
MagicBot 70278374e7 manager init moved to the top of method. 2023-08-25 12:57:21 -04:00
MagicBot ac3588c76a manager init moved to the top of method. 2023-08-25 12:54:03 -04:00
MagicBot ab335aef2a Enums are fragile. 2023-08-25 12:32:36 -04:00
MagicBot 719c855bdb Cleanup of inventoryManager usage. 2023-08-25 12:27:58 -04:00
MagicBot f283e50018 Disabled minions for now. 2023-08-25 12:18:36 -04:00
MagicBot 99b952ee28 Refactor towards new constructor. 2023-08-25 12:12:54 -04:00
MagicBot 24639b62c0 Refactor towards new constructor. 2023-08-25 12:11:50 -04:00
MagicBot 573cc531bf Refactor towards new constructor. 2023-08-25 11:59:59 -04:00
MagicBot 29e24bae93 Unused constructor removed. 2023-08-25 11:37:56 -04:00
MagicBot 22e4cc07c0 Separate pet and siege behaviour types. 2023-08-25 11:26:09 -04:00
MagicBot 9264347698 Minions inherit enemy/notenemy from captain. 2023-08-25 11:24:15 -04:00
MagicBot 579c26ac59 InitializeMob removed. 2023-08-23 13:19:57 -04:00
MagicBot ef577dd313 Removed catch to propagate error. 2023-08-23 13:03:59 -04:00
MagicBot 62c7e52487 Starting to whittle away at initmob method. 2023-08-23 13:01:36 -04:00
MagicBot 3534ac6477 Starting to whittle away at initmob method. 2023-08-23 12:48:34 -04:00
MagicBot 1738f7b311 Starting to whittle away at initmob method. 2023-08-23 12:38:46 -04:00
MagicBot eb25caec81 Object creation moved out of rs const. 2023-08-23 12:24:43 -04:00
MagicBot a6c60e2c04 Merge remote-tracking branch 'origin/master' into mobile-cleanup 2023-08-22 07:50:46 -04:00
MagicBot adafbdf6d3 Duplicate building and building ID values. 2023-08-21 17:20:57 -04:00
MagicBot 7eab14938d Exception for siege when slotting. 2023-08-21 17:11:20 -04:00
MagicBot 039e55673b Exception for siege when slotting. 2023-08-21 17:00:27 -04:00
MagicBot ec3a9b6cb4 Minions don't have contracts. 2023-08-21 16:50:15 -04:00
MagicBot 17a6494b2b Unused code. 2023-08-21 16:41:21 -04:00
MagicBot 0b05c7074f Slot all agents but true mobiles. 2023-08-21 16:37:52 -04:00
MagicBot 876ccc7cbf New constructor created. 2023-08-21 16:12:06 -04:00
MagicBot bdf14b8f24 Ordinal comparisons refactored. 2023-08-21 15:37:21 -04:00
MagicBot 43375a6f5b Only mobiles with contracts can be slotted. 2023-08-21 15:22:08 -04:00
MagicBot e00328ae13 Siege pets use slotting mechanic. 2023-08-21 15:09:10 -04:00
MagicBot 07c553294b Mobiles use new slotting mechanic. 2023-08-21 15:04:32 -04:00
224 changed files with 6509 additions and 10557 deletions
+52 -38
View File
@@ -9,13 +9,15 @@
package engine;
import ch.claude_martin.enumbitset.EnumBitSetHelper;
import engine.gameManager.BuildingManager;
import engine.gameManager.ConfigManager;
import engine.gameManager.PowersManager;
import engine.gameManager.ZoneManager;
import engine.math.Vector2f;
import engine.math.Vector3fImmutable;
import engine.objects.*;
import engine.objects.AbstractCharacter;
import engine.objects.ItemBase;
import engine.objects.Shrine;
import engine.objects.Zone;
import engine.powers.EffectsBase;
import org.pmw.tinylog.Logger;
@@ -150,7 +152,9 @@ public class Enum {
NEPHFEMALE(2026, MonsterType.Nephilim, RunSpeed.STANDARD, CharacterSex.FEMALE, 1.1f),
HALFGIANTFEMALE(2027, MonsterType.HalfGiant, RunSpeed.STANDARD, CharacterSex.FEMALE, 1.15f),
VAMPMALE(2028, MonsterType.Vampire, RunSpeed.STANDARD, CharacterSex.MALE, 1),
VAMPFEMALE(2029, MonsterType.Vampire, RunSpeed.STANDARD, CharacterSex.FEMALE, 1);
VAMPFEMALE(2029, MonsterType.Vampire, RunSpeed.STANDARD, CharacterSex.FEMALE, 1),
SAETOR(1999, MonsterType.Minotaur, RunSpeed.MINOTAUR, CharacterSex.MALE, 0.80000001f),
LIZARDMAN(1998, MonsterType.Reptile, RunSpeed.STANDARD, CharacterSex.MALE, 1.05f);
@SuppressWarnings("unchecked")
private static HashMap<Integer, RaceType> _raceTypeByID = new HashMap<>();
@@ -170,8 +174,6 @@ public class Enum {
}
public static RaceType getRaceTypebyRuneID(int runeID) {
if(runeID == 1999)
return _raceTypeByID.get(2017);
return _raceTypeByID.get(runeID);
}
@@ -208,8 +210,9 @@ public class Enum {
SENTINEL(0, 0, 0, 0, 0, 0, 0),
STANDARD(6.1900001f, 13.97f, 4.2199998f, 13.97f, 6.3299999f, 18.379999f, 6.5f),
CENTAUR(6.1900001f, 16.940001f, 5.5500002f, 16.940001f, 6.3299999f, 18.379999f, 6.5f),
MINOTAUR(6.6300001f, 15.95f, 4.2199998f, 15.95f, 6.3299999f, 18.379999f, 6.5f),
IREKEI(6.499500105f, 14.6685f, 4.2199998f, 14.6685f, 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);
private float walkStandard;
private float walkCombat;
private float runStandard;
@@ -469,14 +472,11 @@ public class Enum {
// 14001 does not have a banestone to bind at
if (ruinZone.getLoadNum() == 14001) {
if (ruinZone.getLoadNum() == 14001)
spawnLocation = Vector3fImmutable.getRandomPointOnCircle(ruinZone.getLoc(), 30);
}else {
//spawnLocation = Vector3fImmutable.getRandomPointOnCircle(ruinZone.getLoc()
//.add(new Vector3fImmutable(-196.016f, 2.812f, 203.621f)), 30);
spawnLocation = Vector3fImmutable.getRandomPointOnCircle(BuildingManager.getBuilding(27977).loc,30f);
}
else
spawnLocation = Vector3fImmutable.getRandomPointOnCircle(ruinZone.getLoc()
.add(new Vector3fImmutable(-196.016f, 2.812f, 203.621f)), 30);
}
@@ -779,7 +779,6 @@ public class Enum {
Combat,
Spires,
Snare,
Snared,
Stun,
Blind,
Root,
@@ -882,7 +881,6 @@ public class Enum {
Siege,
Slash,
Snare,
Snared,
Sorcery,
Spear,
SpearMastery,
@@ -962,21 +960,20 @@ public class Enum {
Wizardry;
public static SourceType GetSourceType(String modName) {
switch(modName){
case "Slashing":
modName = "Slash";
SourceType returnMod;
if (modName.isEmpty())
return SourceType.None;
switch(modName) {
case "Piercing":
modName = "Pierce";
break;
case "Crushing":
modName = "Crush";
break;
case "Piercing":
modName = "Pierce";
case "Slashing":
modName = "Slash";
break;
}
SourceType returnMod;
if (modName.isEmpty())
return SourceType.None;
try {
returnMod = SourceType.valueOf(modName.replace(",", ""));
} catch (Exception e) {
@@ -1032,7 +1029,6 @@ public class Enum {
Silence,
Slash,
Snare,
Snared,
Stance,
Stun,
Summon,
@@ -1157,7 +1153,6 @@ public class Enum {
SkillDebuff,
SlashResistanceDebuff,
Snare,
Snared,
StackableAttrCONBuff,
StackableAttrDEXBuff,
StackableAttrSTRBuff,
@@ -1670,6 +1665,24 @@ public class Enum {
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 {
@@ -2324,9 +2337,9 @@ public class Enum {
public enum CityBoundsType {
GRID(544),
ZONE(672),
PLACEMENT(673);
GRID(640),
ZONE(680),
PLACEMENT(681);
public final float extents;
@@ -2840,7 +2853,6 @@ public class Enum {
public enum MobBehaviourType {
None(null, false, false, false, false, false),
//Power
Power(null, false, true, true, true, false),
PowerHelpee(Power, false, true, true, false, true),
PowerHelpeeWimpy(Power, true, false, true, false, false),
@@ -2865,6 +2877,7 @@ public class Enum {
//Independent Types
SimpleStandingGuard(null, false, false, false, false, false),
Pet1(null, false, false, true, false, false),
SiegeEngine(null, false, false, false, false, false),
Simple(null, false, false, true, false, false),
Helpee(null, false, true, true, false, true),
HelpeeWimpy(null, true, false, true, false, false),
@@ -2875,13 +2888,12 @@ public class Enum {
HamletGuard(null, false, true, false, false, false),
AggroWanderer(null, false, false, true, false, false);
private static HashMap<Integer, MobBehaviourType> _behaviourTypes = new HashMap<>();
public MobBehaviourType BehaviourHelperType;
public boolean isWimpy;
public boolean isAgressive;
public boolean canRoam;
public boolean callsForHelp;
public boolean respondsToCallForHelp;
public final MobBehaviourType BehaviourHelperType;
public final boolean isWimpy;
public final boolean isAgressive;
public final boolean canRoam;
public final boolean callsForHelp;
public final boolean respondsToCallForHelp;
MobBehaviourType(MobBehaviourType helpeebehaviourType, boolean wimpy, boolean agressive, boolean canroam, boolean callsforhelp, boolean respondstocallforhelp) {
this.BehaviourHelperType = helpeebehaviourType;
@@ -2898,6 +2910,8 @@ public class Enum {
MOBILE,
PET,
CHARMED,
SIEGEENGINE,
GUARD;
}
}
@@ -19,9 +19,13 @@ import engine.net.AbstractNetMsg;
import engine.net.Dispatch;
import engine.net.DispatchMessage;
import engine.net.client.ClientConnection;
import engine.net.client.msg.*;
import engine.net.client.msg.LoadCharacterMsg;
import engine.net.client.msg.LoadStructureMsg;
import engine.net.client.msg.MoveToPointMsg;
import engine.net.client.msg.UnloadObjectsMsg;
import engine.objects.*;
import engine.server.MBServerStatics;
import engine.util.BoxTracker;
import org.pmw.tinylog.Logger;
import java.util.ArrayList;
@@ -106,7 +110,7 @@ public enum InterestManager implements Runnable {
origin.sendMsg(moveMsg);
}
public static void reloadCharacter(AbstractCharacter absChar) {
public static void reloadCharacter(AbstractCharacter absChar, boolean sendToSelf) {
UnloadObjectsMsg uom = new UnloadObjectsMsg();
uom.addObject(absChar);
@@ -207,7 +211,7 @@ public enum InterestManager implements Runnable {
if (origin == null)
continue;
if (!playerCharacter.isEnteredWorld())
if (!playerCharacter.enteredWorld)
continue;
if (playerCharacter.getTeleportLock().readLock().tryLock()) {
@@ -464,7 +468,7 @@ public enum InterestManager implements Runnable {
if (awonpc.despawned == true)
continue;
awonpc.playerAgroMap.put(player.getObjectUUID(), false);
awonpc.playerAgroMap.put(player.getObjectUUID(), 0f);
((Mob) awonpc).setCombatTarget(null);
lcm = new LoadCharacterMsg(awonpc, PlayerCharacter.hideNonAscii());
@@ -477,7 +481,7 @@ public enum InterestManager implements Runnable {
if (!awonpc.isAlive())
continue;
awonpc.playerAgroMap.put(player.getObjectUUID(), false);
awonpc.playerAgroMap.put(player.getObjectUUID(), 0f);
if ((awonpc.agentType.equals(Enum.AIAgentType.MOBILE)))
((Mob) awonpc).setCombatTarget(null);
@@ -518,10 +522,11 @@ public enum InterestManager implements Runnable {
// Update loaded upbjects lists
player.isBoxed = PlayerCharacter.checkIfBoxed(player);
player.setDirtyLoad(true);
updateStaticList(player, origin);
updateMobileList(player, origin);
BoxTracker.addPlayer(origin.machineID,player);
}
public synchronized void HandleLoadForTeleport(PlayerCharacter playerCharacter) {
+8 -158
View File
@@ -10,13 +10,17 @@
package engine.db.handlers;
import engine.gameManager.DbManager;
import engine.gameManager.ZoneManager;
import engine.math.Vector3fImmutable;
import engine.objects.*;
import engine.objects.Bane;
import engine.objects.Building;
import engine.objects.City;
import engine.objects.PlayerCharacter;
import org.joda.time.DateTime;
import org.pmw.tinylog.Logger;
import java.sql.*;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class dbBaneHandler extends dbHandlerBase {
@@ -85,139 +89,6 @@ public class dbBaneHandler extends dbHandlerBase {
return true;
}
public boolean SET_BANE_TIME_NEW(int hour, int cityUUID) {
hour += 12; // Adjust hour
try (Connection connection = DbManager.getConnection();
PreparedStatement getStatement = connection.prepareStatement("SELECT `placementDate`, `liveDate` FROM `dyn_banes` WHERE `cityUUID`=?");
PreparedStatement updateStatement = connection.prepareStatement("UPDATE `dyn_banes` SET `liveDate`=?, `time_set`=? WHERE `cityUUID`=?")) {
// Retrieve placementDate and liveDate
getStatement.setInt(1, cityUUID);
try (ResultSet rs = getStatement.executeQuery()) {
if (rs.next()) {
DateTime placementDate = new DateTime(rs.getTimestamp("placementDate").getTime());
Timestamp liveDateTimestamp = rs.getTimestamp("liveDate");
// Explicitly check if liveDate is null
DateTime toSet;
if (liveDateTimestamp == null) {
// If liveDate is null, default to placementDate
toSet = placementDate;
} else {
// If liveDate is not null, use it
DateTime liveDate = new DateTime(liveDateTimestamp.getTime());
toSet = liveDate;
}
// Adjust the time
toSet = toSet.withHourOfDay(hour).withMinuteOfHour(0).withSecondOfMinute(0).withMillisOfSecond(0);
// Update liveDate and time_set flag
updateStatement.setTimestamp(1, new java.sql.Timestamp(toSet.getMillis()));
updateStatement.setInt(2, 1); // time_set flag
updateStatement.setInt(3, cityUUID);
updateStatement.execute();
return true;
}
}
} catch (SQLException e) {
Logger.error(e);
}
return false;
}
public boolean SET_BANE_DAY_NEW(int dayOffset, int cityUUID) {
try (Connection connection = DbManager.getConnection();
PreparedStatement getStatement = connection.prepareStatement("SELECT `placementDate`, `liveDate` FROM `dyn_banes` WHERE `cityUUID`=?");
PreparedStatement updateStatement = connection.prepareStatement("UPDATE `dyn_banes` SET `liveDate`=?, `day_set`=? WHERE `cityUUID`=?")) {
// Retrieve placementDate and liveDate
getStatement.setInt(1, cityUUID);
try (ResultSet rs = getStatement.executeQuery()) {
if (rs.next()) {
DateTime placementDate = new DateTime(rs.getTimestamp("placementDate").getTime());
Timestamp liveDateTimestamp = rs.getTimestamp("liveDate");
// Explicitly check if liveDate is null
DateTime liveDate;
if (liveDateTimestamp == null) {
// If liveDate is null, default to placementDate
liveDate = placementDate;
} else {
// If liveDate is not null, use it
liveDate = new DateTime(liveDateTimestamp.getTime());
}
// Calculate the new liveDate while preserving the time component
DateTime updatedDate = placementDate.plusDays(dayOffset)
.withHourOfDay(liveDate.getHourOfDay())
.withMinuteOfHour(liveDate.getMinuteOfHour())
.withSecondOfMinute(liveDate.getSecondOfMinute())
.withMillisOfSecond(liveDate.getMillisOfSecond());
// Update liveDate and day_set flag
updateStatement.setTimestamp(1, new java.sql.Timestamp(updatedDate.getMillis()));
updateStatement.setInt(2, 1); // day_set flag
updateStatement.setInt(3, cityUUID);
updateStatement.execute();
return true;
}
}
} catch (SQLException e) {
Logger.error(e);
}
return false;
}
public boolean SET_BANE_CAP_NEW(int count, int cityUUID) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `dyn_banes` SET `cap_size`=? WHERE `cityUUID`=?")) {
preparedStatement.setInt(1, count);
preparedStatement.setLong(2, cityUUID);
preparedStatement.execute();
} catch (SQLException e) {
Logger.error(e);
return false;
}
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `dyn_banes` SET `cap_set`=? WHERE `cityUUID`=?")) {
preparedStatement.setInt(1, 1);
preparedStatement.setLong(2, cityUUID);
preparedStatement.execute();
} catch (SQLException e) {
Logger.error(e);
return false;
}
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `dyn_banes` SET `cap_size`=? WHERE `cityUUID`=?")) {
preparedStatement.setInt(1, count);
preparedStatement.setLong(2, cityUUID);
preparedStatement.execute();
} catch (SQLException e) {
Logger.error(e);
return false;
}
return true;
}
public boolean REMOVE_BANE(Bane bane) {
if (bane == null)
@@ -236,25 +107,4 @@ public class dbBaneHandler extends dbHandlerBase {
return true;
}
public DateTime getLiveDate(int cityUUID) {
try (Connection connection = DbManager.getConnection();
PreparedStatement statement = connection.prepareStatement("SELECT `liveDate` FROM `dyn_banes` WHERE `cityUUID`=?")) {
statement.setInt(1, cityUUID);
try (ResultSet rs = statement.executeQuery()) {
if (rs.next()) {
Timestamp liveDateTimestamp = rs.getTimestamp("liveDate");
if (liveDateTimestamp != null) {
return new DateTime(liveDateTimestamp.getTime());
}
}
}
} catch (SQLException e) {
Logger.error(e);
}
return null; // Return null if liveDate is not found or an error occurs
}
}
@@ -73,6 +73,14 @@ public class dbBlueprintHandler extends dbHandlerBase {
Blueprint._meshLookup.putIfAbsent(thisBlueprint.getMeshForRank(3), 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) {
@@ -14,6 +14,7 @@ import engine.gameManager.DbManager;
import engine.objects.AbstractCharacter;
import engine.objects.CharacterSkill;
import engine.objects.PlayerCharacter;
import engine.objects.SkillsBase;
import engine.server.MBServerStatics;
import org.pmw.tinylog.Logger;
+4 -10
View File
@@ -11,7 +11,10 @@ package engine.db.handlers;
import engine.Enum;
import engine.gameManager.DbManager;
import engine.objects.*;
import engine.objects.AbstractGameObject;
import engine.objects.Building;
import engine.objects.City;
import engine.objects.Zone;
import org.pmw.tinylog.Logger;
import java.sql.*;
@@ -92,16 +95,7 @@ public class dbCityHandler extends dbHandlerBase {
return objectList;
}
public Integer GET_CAPITAL_CITY_COUNT() {
int cityCount = 0;
for(Realm realm : Realm._realms.values()){
if(realm.isRuled())
cityCount ++;
}
return cityCount;
}
public ArrayList<City> GET_CITIES_BY_ZONE(final int objectUUID) {
ArrayList<City> cityList = new ArrayList<>();
+17 -39
View File
@@ -98,54 +98,32 @@ public class dbContractHandler extends dbHandlerBase {
public void LOAD_SELL_LIST_FOR_CONTRACT(final Contract contract) {
if(!contract.getName().contains("Sage")) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_npc_contract_selltype` WHERE `contractID` = ?;")) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_npc_contract_selltype` WHERE `contractID` = ?;")) {
preparedStatement.setInt(1, contract.getObjectUUID());
preparedStatement.setInt(1, contract.getObjectUUID());
ResultSet rs = preparedStatement.executeQuery();
ResultSet rs = preparedStatement.executeQuery();
while (rs.next()) {
while (rs.next()) {
int type = rs.getInt("type");
int value = rs.getInt("value");
int type = rs.getInt("type");
int value = rs.getInt("value");
switch (type) {
case 1:
contract.getBuyItemType().add(value);
break;
case 2:
contract.getBuySkillToken().add(value);
break;
case 3:
contract.getBuyUnknownToken().add(value);
break;
}
}
} catch (SQLException e) {
Logger.error(e);
}
}else{
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_npc_contract_selltype`;")) {
ResultSet rs = preparedStatement.executeQuery();
while (rs.next()) {
int value = rs.getInt("value");
if(!contract.getBuySkillToken().contains(value))
contract.getBuySkillToken().add(value);
if(!contract.getBuyItemType().contains(value))
switch (type) {
case 1:
contract.getBuyItemType().add(value);
if(!contract.getBuyUnknownToken().contains(value))
break;
case 2:
contract.getBuySkillToken().add(value);
break;
case 3:
contract.getBuyUnknownToken().add(value);
break;
}
} catch (SQLException e) {
Logger.error(e);
}
} catch (SQLException e) {
Logger.error(e);
}
}
+1 -13
View File
@@ -32,6 +32,7 @@ public abstract class dbHandlerBase {
try {
if (rs.next()) {
abstractGameObject = localClass.getConstructor(ResultSet.class).newInstance(rs);
DbManager.addToCache(abstractGameObject);
}
} catch (Exception e) {
@@ -56,23 +57,10 @@ public abstract class dbHandlerBase {
while (rs.next()) {
int id = rs.getInt(1);
try {
if (rs.getInt("capSize") == 0) {
continue;
}
}catch(Exception e){
//not a mine
}
if (DbManager.inCache(localObjectType, id)) {
objectList.add((T) DbManager.getFromCache(localObjectType, id));
} else {
try{
if(rs.getInt("mineLiveHour") == 1)
continue;
}catch(Exception e){
//not a mine
}
AbstractGameObject toAdd = localClass.getConstructor(ResultSet.class).newInstance(rs);
DbManager.addToCache(toAdd);
if(toAdd.getObjectType().equals(GameObjectType.Zone) && rs.getInt("canLoad") == 0){
+66 -26
View File
@@ -22,17 +22,73 @@ import java.util.HashMap;
public class dbItemBaseHandler extends dbHandlerBase {
public static final HashMap<Integer,Float> dexReductions = new HashMap<>();
public dbItemBaseHandler() {
}
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();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_item_bakedinstat` WHERE `itemID` = ?")) {
preparedStatement.setInt(1, itemBase.getUUID());
preparedStatement.setInt(1, itemBaseID);
ResultSet rs = preparedStatement.executeQuery();
while (rs.next()) {
@@ -46,14 +102,6 @@ public class dbItemBaseHandler extends dbHandlerBase {
}
}
public void LOAD_DEX_REDUCTION(ItemBase itemBase) {
if(dexReductions.containsKey(itemBase.getUUID())){
itemBase.dexReduction = dexReductions.get(itemBase.getUUID());
}else{
itemBase.dexReduction = 0.0f;
}
}
public void LOAD_ANIMATIONS(ItemBase itemBase) {
ArrayList<Integer> tempList = new ArrayList<>();
@@ -96,28 +144,20 @@ public class dbItemBaseHandler extends dbHandlerBase {
recordsRead++;
itemBase = new ItemBase(rs);
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) {
Logger.error(e);
}
Logger.info("read: " + recordsRead + " cached: " + ItemBase.getUUIDCache().size());
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_item_dexpenalty`")) {
ResultSet rs = preparedStatement.executeQuery();
// Check if a result was found
if (rs.next()) {
int ID = rs.getInt("ID");
float factor = rs.getInt("item_bulk_factor");
dexReductions.put(ID,factor);
}
} catch (SQLException e) {
Logger.error(e);
}
}
public HashMap<Integer, ArrayList<Integer>> LOAD_RUNES_FOR_NPC_AND_MOBS() {
+8 -4
View File
@@ -134,13 +134,13 @@ public class dbItemHandler extends dbHandlerBase {
ResultSet rs = preparedStatement.executeQuery();
if (rs.next()) {
if (rs.next())
try {
worked = rs.getBoolean("result");
}catch(Exception e){
worked = false;
return true;
}
}
} catch (SQLException e) {
Logger.error(e);
}
@@ -354,7 +354,11 @@ public class dbItemHandler extends dbHandlerBase {
ResultSet rs = preparedStatement.executeQuery();
if (rs.next())
worked = rs.getBoolean("result");
try {
worked = rs.getBoolean("result");
} catch(Exception e){
worked = true;
}
} catch (SQLException e) {
Logger.error(e);
+36 -4
View File
@@ -9,12 +9,14 @@
package engine.db.handlers;
import engine.Enum;
import engine.gameManager.BuildingManager;
import engine.gameManager.DbManager;
import engine.objects.Mine;
import engine.objects.MineProduction;
import engine.objects.Resource;
import org.pmw.tinylog.Logger;
import java.net.UnknownHostException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
@@ -32,8 +34,24 @@ public class dbMineHandler extends dbHandlerBase {
if (id == 0)
return null;
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)
return mine;
@@ -56,13 +74,27 @@ public class dbMineHandler extends dbHandlerBase {
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();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT `obj_mine`.*, `object`.`parent` FROM `object` INNER JOIN `obj_mine` ON `obj_mine`.`UID` = `object`.`UID`")) {
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM obj_mine;")) {
ResultSet rs = preparedStatement.executeQuery();
mines = getObjectsFromRs(rs, 1000);
while(rs.next()){
if(BuildingManager.getBuildingFromCache(rs.getInt("mine_buildingUID")) == null)
continue;
} catch (SQLException e) {
mines.add(new Mine(rs));
}
} catch (SQLException | UnknownHostException e) {
Logger.error(e);
}
return mines;
@@ -21,6 +21,7 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
public class dbMobBaseHandler extends dbHandlerBase {
@@ -112,6 +113,25 @@ public class dbMobBaseHandler extends dbHandlerBase {
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) {
if (mobBase.getLoadID() == 0)
+17 -22
View File
@@ -28,31 +28,26 @@ public class dbMobHandler extends dbHandlerBase {
this.localObjectType = engine.Enum.GameObjectType.valueOf(this.localClass.getSimpleName());
}
public Mob ADD_MOB(Mob toAdd) {
public Mob PERSIST(Mob toAdd) {
Mob mobile = null;
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("CALL `mob_CREATE`(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);")) {
preparedStatement.setLong(1, toAdd.getParentZoneID());
preparedStatement.setInt(2, toAdd.getMobBaseID());
preparedStatement.setInt(3, toAdd.getGuildUUID());
preparedStatement.setFloat(4, toAdd.getSpawnX());
preparedStatement.setFloat(5, toAdd.getSpawnY());
preparedStatement.setFloat(6, toAdd.getSpawnZ());
preparedStatement.setLong(1, toAdd.parentZoneUUID);
preparedStatement.setInt(2, toAdd.loadID);
preparedStatement.setInt(3, toAdd.guildUUID);
preparedStatement.setFloat(4, toAdd.bindLoc.x);
preparedStatement.setFloat(5, toAdd.bindLoc.y);
preparedStatement.setFloat(6, toAdd.bindLoc.z);
preparedStatement.setInt(7, 0);
preparedStatement.setFloat(8, toAdd.getSpawnRadius());
preparedStatement.setInt(9, toAdd.getTrueSpawnTime());
if (toAdd.getContract() != null)
preparedStatement.setInt(10, toAdd.getContract().getContractID());
else
preparedStatement.setInt(10, 0);
preparedStatement.setInt(11, toAdd.getBuildingID());
preparedStatement.setInt(12, toAdd.getLevel());
preparedStatement.setString(13, toAdd.getFirstName());
preparedStatement.setFloat(8, toAdd.spawnRadius);
preparedStatement.setInt(9, toAdd.spawnTime);
preparedStatement.setInt(10, toAdd.contractUUID);
preparedStatement.setInt(11, toAdd.buildingUUID);
preparedStatement.setInt(12, toAdd.level);
preparedStatement.setString(13, toAdd.firstName);
ResultSet rs = preparedStatement.executeQuery();
@@ -106,17 +101,17 @@ public class dbMobHandler extends dbHandlerBase {
return row_count;
}
public void LOAD_PATROL_POINTS(Mob captain) {
public void LOAD_GUARD_MINIONS(Mob guardCaptain) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `dyn_guards` WHERE `captainUID` = ?")) {
preparedStatement.setInt(1, captain.getObjectUUID());
preparedStatement.setInt(1, guardCaptain.getObjectUUID());
ResultSet rs = preparedStatement.executeQuery();
while (rs.next()) {
String name = rs.getString("name");
Mob toCreate = Mob.createGuardMob(captain, captain.getGuild(), captain.getParentZone(), captain.building.getLoc(), captain.getLevel(), name);
String minionName = rs.getString("name");
Mob toCreate = Mob.createGuardMinion(guardCaptain, guardCaptain.getLevel(), minionName);
if (toCreate == null)
return;
-38
View File
@@ -131,32 +131,6 @@ public class dbNPCHandler extends dbHandlerBase {
return npc;
}
public int BANE_COMMANDER_EXISTS(final int objectUUID) {
int uid = 0;
String query = "SELECT `UID` FROM `obj_npc` WHERE `npc_buildingID` = ? LIMIT 1;";
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement(query)) {
preparedStatement.setInt(1, objectUUID);
try (ResultSet rs = preparedStatement.executeQuery()) {
if (rs.next()) {
// Retrieve the UID column value
uid = rs.getInt("UID");
}
}
} catch (SQLException e) {
Logger.error(e);
}
return uid;
}
public int MOVE_NPC(long npcID, long parentID, float locX, float locY, float locZ) {
int rowCount;
@@ -202,18 +176,6 @@ public class dbNPCHandler extends dbHandlerBase {
return result;
}
public static void updateSpecialPricing(final NPC npc){
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE obj_npc SET specialPrice=? WHERE UID = ?")) {
preparedStatement.setInt(1, npc.getSpecialPrice());
preparedStatement.setInt(2, npc.getDBID());
preparedStatement.executeUpdate();
} catch (SQLException e) {
Logger.error(e);
}
}
public void updateDatabase(final NPC npc) {
try (Connection connection = DbManager.getConnection();
@@ -23,7 +23,25 @@ public class dbResistHandler extends dbHandlerBase {
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) {
Resists resists = null;
@@ -59,6 +59,43 @@ public class dbRuneBaseHandler extends dbHandlerBase {
rb.setLevelRequired(rs.getInt("requiredRuneID"));
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) {
@@ -143,6 +143,13 @@ public class dbSkillBaseHandler extends dbHandlerBase {
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) {
Logger.error(e);
+2 -2
View File
@@ -43,7 +43,7 @@ public class AddMobCmd extends AbstractDevCmd {
MobBase mb = (MobBase) mobbaseAGO;
int loadID = mb.getObjectUUID();
Mob mob = Mob.createMob(loadID, Vector3fImmutable.getRandomPointInCircle(pc.getLoc(), 100),
null, true, zone, null, 0, "", 1);
null, zone, null, null, "", 1);
if (mob != null) {
mob.updateDatabase();
this.setResult(String.valueOf(mob.getDBID()));
@@ -84,7 +84,7 @@ public class AddMobCmd extends AbstractDevCmd {
Mob mob = Mob.createMob(loadID, pc.getLoc(),
null, true, zone, null, 0, "", 1);
null, zone, null, null, "", 1);
if (mob != null) {
mob.updateDatabase();
ChatManager.chatSayInfo(pc,
+8
View File
@@ -32,6 +32,7 @@ public class AddNPCCmd extends AbstractDevCmd {
int contractID;
String name = "";
int level = 0;
if (words.length < 2) {
this.sendUsage(pc);
return;
@@ -39,26 +40,33 @@ public class AddNPCCmd extends AbstractDevCmd {
try {
contractID = Integer.parseInt(words[0]);
level = Integer.parseInt(words[1]);
for (int i = 2; i < words.length; i++) {
name += words[i];
if (i + 1 < words.length)
name += "";
}
} catch (NumberFormatException e) {
throwbackError(pc,
"Failed to parse supplied contractID or level to an Integer.");
return; // NaN
}
Contract contract = DbManager.ContractQueries.GET_CONTRACT(contractID);
if (contract == null || level < 1 || level > 75) {
throwbackError(pc,
"Invalid addNPC Command. Need contract ID, and level");
return; // NaN
}
// Pick a random name
if (name.isEmpty())
name = NPCManager.getPirateName(contract.getMobbaseID());
Zone zone = ZoneManager.findSmallestZone(pc.getLoc());
if (zone == null) {
throwbackError(pc, "Failed to find zone to place npc in.");
return;
+4 -15
View File
@@ -11,6 +11,7 @@ package engine.devcmd.cmds;
import engine.devcmd.AbstractDevCmd;
import engine.objects.*;
import engine.powers.EffectsBase;
public class EnchantCmd extends AbstractDevCmd {
@@ -55,21 +56,9 @@ public class EnchantCmd extends AbstractDevCmd {
this.setResult(String.valueOf(item.getObjectUUID()));
} else {
int cnt = words.length;
for (int i = 1; i < cnt; i++) {
String enchant = words[i];
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 + '.');
}
String enchant = words[1];
enchant = EffectsBase.getItemEffectsByName(enchant.toLowerCase());
item.addPermanentEnchantmentForDev(enchant, 0);
cim.updateInventory();
}
}
+1 -1
View File
@@ -30,7 +30,7 @@ public class FlashMsgCmd extends AbstractDevCmd {
this.sendUsage(pcSender);
return;
}
ChatManager.chatSystemFlash(args[0]);
ChatManager.chatSystemFlash(String.join(" ", args));
}
/**
+77
View File
@@ -0,0 +1,77 @@
// ·. · · · · .
// · ·
// · ·
//
// · · ·
// 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]";
}
}
+14 -27
View File
@@ -15,13 +15,9 @@ import engine.Enum.GameObjectType;
import engine.Enum.TargetColor;
import engine.devcmd.AbstractDevCmd;
import engine.gameManager.BuildingManager;
import engine.gameManager.PowersManager;
import engine.gameManager.SessionManager;
import engine.math.Vector3fImmutable;
import engine.objects.*;
import engine.powers.EffectsBase;
import engine.powers.PowersBase;
import engine.server.MBServerStatics;
import engine.util.StringUtils;
import java.text.DecimalFormat;
@@ -284,7 +280,7 @@ public class InfoCmd extends AbstractDevCmd {
output += newline;
output += "Inventory Weight:" + (targetPC.getCharItemManager().getInventoryWeight() + targetPC.getCharItemManager().getEquipWeight());
output += newline;
output += "Max Inventory Weight:" + ((int) targetPC.statStrBase * 3);
output += "Max Inventory Weight:" + targetPC.getInventoryCapacity();
output += newline;
output += "ALTITUDE :" + targetPC.getAltitude();
output += newline;
@@ -340,10 +336,9 @@ public class InfoCmd extends AbstractDevCmd {
output += "Swimming : " + targetPC.isSwimming();
output += newline;
output += "isMoving : " + targetPC.isMoving();
output += newline;
output += "Zerg Multiplier : " + targetPC.ZergMultiplier+ newline;
output += "Hidden : " + targetPC.getHidden();
output += "isMoving : " + targetPC.isMoving() + newline;
output += "Zerg Multiplier: " + targetPC.ZergMultiplier + newline;
output += "isBoxed: " + targetPC.isBoxed + newline;
break;
case NPC:
@@ -446,7 +441,9 @@ public class InfoCmd extends AbstractDevCmd {
output += "isSummonedPet: true";
else
output += "isSummonedPet: false";
PlayerCharacter owner = targetMob.getOwner();
PlayerCharacter owner = (PlayerCharacter) targetMob.guardCaptain;
if (owner != null)
output += " owner: " + owner.getObjectUUID();
output += newline;
@@ -498,16 +495,13 @@ public class InfoCmd extends AbstractDevCmd {
output += newline;
output += "No building found." + newline;
}
output += "Damage: " + targetMob.mobBase.getDamageMin() + " - " + targetMob.mobBase.getDamageMax() + newline;
output += "ATR: " + targetMob.mobBase.getAttackRating() + newline;
output += "DEF: " + targetMob.defenseRating + newline;
output += "RANGE: " + targetMob.getRange() + newline;
output += "Effects:" + newline;
for(MobBaseEffects mbe : targetMob.mobBase.mobbaseEffects){
EffectsBase eb = PowersManager.getEffectByToken(mbe.getToken());
output += eb.getName() + newline;
int max = (int)(4.882 * targetMob.level + 121.0);
if(max > 321){
max = 321;
}
int min = (int)(4.469 * targetMob.level - 3.469);
output += "Min Loot Roll = " + min;
output += "Max Loot Roll = " + max;
break;
case Item: //intentional passthrough
case MobLoot:
@@ -532,19 +526,12 @@ public class InfoCmd extends AbstractDevCmd {
ConcurrentHashMap<String, Effect> effects = item.getEffects();
for (String name : effects.keySet()) {
Effect eff = effects.get(name);
output += eff.getEffectsBase().getIDString();
output += eff.getEffectsBase().getIDString() + " Static:" + eff.isStatic();
output += newline;
// output += eff.getEffectToken() + (eff.bakedInStat() ? " (baked in)" : "") + newline;
}
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);
+8
View File
@@ -65,6 +65,10 @@ public class MakeItemCmd extends AbstractDevCmd {
if (item == null || !worked) {
throwbackError(pc, "DB error 2: Unable to create item.");
if(item == null)
throwbackError(pc, "Item Null");
else
throwbackError(pc, "Worked = false");
return;
}
@@ -222,6 +226,10 @@ public class MakeItemCmd extends AbstractDevCmd {
if (item == null || !worked) {
throwbackError(pc, "DB error 2: Unable to create item.");
if(item == null)
throwbackError(pc, "Item Null");
else
throwbackError(pc, "Worked = false");
return;
}
+2 -4
View File
@@ -16,8 +16,6 @@ import engine.objects.AbstractGameObject;
import engine.objects.Building;
import engine.objects.Mine;
import engine.objects.PlayerCharacter;
import engine.workthreads.HalfHourlyJobThread;
import engine.workthreads.HourlyJobThread;
/**
*
@@ -42,10 +40,10 @@ public class MineActiveCmd extends AbstractDevCmd {
String trigger = args[0];
switch (trigger) {
case "true":
HalfHourlyJobThread.mineWindowOpen(mine);
Mine.mineWindowOpen(mine);
break;
case "false":
HalfHourlyJobThread.mineWindowClose(mine);
Mine.mineWindowClose(mine);
break;
default:
this.sendUsage(pcSender);
@@ -39,6 +39,9 @@ public class PrintResistsCmd extends AbstractDevCmd {
if (mb != null)
name = mb.getFirstName();
type = "Mob";
throwbackInfo(pc, "Server resists for " + type + ' ' + name);
tar.getResists().printResistsToClient(pc);
return;
} else if (tar instanceof NPC) {
NPC npc = (NPC) tar;
Contract contract = npc.getContract();
@@ -49,8 +49,6 @@ public class PrintSkillsCmd extends AbstractDevCmd {
+ skill.getModifiedAmount() + '('
+ skill.getTotalSkillPercet() + " )");
}
//throwbackInfo(pc, "= = = = = NEW CALCULATIONS = = = = =");
// PlayerCombatStats.PrintSkillsToClient(pc);
} else
throwbackInfo(pc, "Skills not found for player");
}
+22 -29
View File
@@ -56,37 +56,30 @@ public class PrintStatsCmd extends AbstractDevCmd {
}
public void printStatsPlayer(PlayerCharacter pc, PlayerCharacter tar) {
tar.calculateMaxHealthManaStamina();
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;
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);
throwbackInfo(pc, out);
}
public void printStatsMob(PlayerCharacter pc, Mob tar) {
+2 -2
View File
@@ -59,7 +59,7 @@ public class PurgeObjectsCmd extends AbstractDevCmd {
if (npc != null) {
for (Mob mob : npc.getSiegeMinionMap().keySet()) {
for (Mob mob : npc.siegeMinionMap.keySet()) {
WorldGrid.RemoveWorldObject(mob);
WorldGrid.removeObject(mob, pc);
//Mob.getRespawnMap().remove(mob);
@@ -151,7 +151,7 @@ public class PurgeObjectsCmd extends AbstractDevCmd {
if (npc != null) {
for (Mob mob : npc.getSiegeMinionMap().keySet()) {
for (Mob mob : npc.siegeMinionMap.keySet()) {
WorldGrid.RemoveWorldObject(mob);
WorldGrid.removeObject(mob, pc);
//Mob.getRespawnMap().remove(mob);
+2 -2
View File
@@ -154,7 +154,7 @@ public class RemoveObjectCmd extends AbstractDevCmd {
mobA = (Mob) ac;
if (npc != null) {
for (Mob mob : npc.getSiegeMinionMap().keySet()) {
for (Mob mob : npc.siegeMinionMap.keySet()) {
WorldGrid.RemoveWorldObject(mob);
WorldGrid.removeObject(mob, pc);
//Mob.getRespawnMap().remove(mob);
@@ -209,7 +209,7 @@ public class RemoveObjectCmd extends AbstractDevCmd {
if (npc.building != null)
npc.building.getHirelings().remove(npc);
for (Mob mob : npc.getSiegeMinionMap().keySet()) {
for (Mob mob : npc.siegeMinionMap.keySet()) {
WorldGrid.RemoveWorldObject(mob);
WorldGrid.removeObject(mob, pc);
if (mob.getParentZone() != null)
+1 -1
View File
@@ -62,7 +62,7 @@ public class SetAdminRuneCmd extends AbstractDevCmd {
if (worked) {
ChatManager.chatSayInfo(pcSender,
"rune of ID " + runeID + " removed");
InterestManager.reloadCharacter(pcSender);
InterestManager.reloadCharacter(pcSender,false);
} else
throwbackError(pcSender, "Failed to remove the rune of type "
+ runeID);
+1 -1
View File
@@ -47,7 +47,7 @@ public class SetBaseClassCmd extends AbstractDevCmd {
this.setTarget(pc); //for logging
ChatManager.chatSayInfo(pc,
"BaseClass changed to " + classID);
InterestManager.reloadCharacter(pc);
InterestManager.reloadCharacter(pc,false);
}
+4 -3
View File
@@ -14,6 +14,7 @@ import engine.devcmd.AbstractDevCmd;
import engine.gameManager.ChatManager;
import engine.objects.AbstractGameObject;
import engine.objects.PlayerCharacter;
import engine.server.MBServerStatics;
public class SetLevelCmd extends AbstractDevCmd {
@@ -46,7 +47,7 @@ public class SetLevelCmd extends AbstractDevCmd {
this.sendUsage(pc);
return;
}
if (level < 1 || level > 80) {
if (level < 1 || level > MBServerStatics.LEVELCAP) {
this.sendHelp(pc);
return;
}
@@ -57,12 +58,12 @@ public class SetLevelCmd extends AbstractDevCmd {
tar.setLevel((short) level);
this.setTarget(tar); //for logging
ChatManager.chatSayInfo(pc, tar.getFirstName() + " level changed to " + level);
InterestManager.reloadCharacter(tar);
InterestManager.reloadCharacter(tar,false);
}
@Override
protected String _getHelpString() {
return "Sets your character's level to 'amount'. 'amount' must be between 1-80";
return "Sets your character's level to 'amount'. 'amount' must be between 1-" + MBServerStatics.LEVELCAP;
}
@Override
@@ -42,7 +42,7 @@ public class SetPromotionClassCmd extends AbstractDevCmd {
pc.setPromotionClass(classID);
ChatManager.chatSayInfo(pc,
"PromotionClass changed to " + classID);
InterestManager.reloadCharacter(pc);
InterestManager.reloadCharacter(pc,false);
this.setTarget(pc); //for logging
+1 -1
View File
@@ -57,7 +57,7 @@ public class SetRuneCmd extends AbstractDevCmd {
if (worked) {
ChatManager.chatSayInfo(pcSender,
"rune of ID " + runeID + " removed");
InterestManager.reloadCharacter(pcSender);
InterestManager.reloadCharacter(pcSender,false);
} else
throwbackError(pcSender, "Failed to remove the rune of type "
+ runeID);
+23 -71
View File
@@ -6,13 +6,12 @@ import engine.gameManager.LootManager;
import engine.gameManager.ZoneManager;
import engine.loot.BootySetEntry;
import engine.objects.*;
import org.pmw.tinylog.Logger;
import java.util.ArrayList;
import java.util.concurrent.ThreadLocalRandom;
public class SimulateBootyCmd extends AbstractDevCmd {
public int simCount = 250;
public SimulateBootyCmd() {
super("bootysim");
}
@@ -27,62 +26,11 @@ public class SimulateBootyCmd extends AbstractDevCmd {
String newline = "\r\n ";
String output;
if(target.getObjectType().equals(Enum.GameObjectType.PlayerCharacter)){
int ATR = Integer.parseInt(words[0]);
int DEF = Integer.parseInt(words[1]);
int attacks = Integer.parseInt(words[2]);
int hits = 0;
int misses = 0;
int defaultHits = 0;
int defualtMisses = 0;
float chance = (ATR-((ATR+DEF) * 0.315f)) / ((DEF-((ATR+DEF) * 0.315f)) + (ATR-((ATR+DEF) * 0.315f)));
float convertedChance = chance * 100;
output = "" + newline;
output += "DEF VS ATR SIMULATION: " + attacks + " ATTACKS SIMULATED" + newline;
output += "DEF = " + DEF + newline;
output += "ATR = " + ATR + newline;
output += "CHANCE TO LAND HIT: " + convertedChance + "%" + newline;
if(convertedChance < 5){
output += "CHANCE ADJUSTED TO 5.0%" + newline;
convertedChance = 5.0f;
}
if(convertedChance > 95){
output += "CHANCE ADJUSTED TO 95.0%" + newline;
convertedChance = 95.0f;
}
for(int i = 0; i < attacks; i++){
int roll = ThreadLocalRandom.current().nextInt(101);
if(roll <= convertedChance){
hits += 1;
}else{
misses += 1;
}
}
float totalHits = defaultHits + hits;
float totalMisses = defualtMisses + misses;
float hitPercent = Math.round(totalHits / attacks * 100);
float missPercent = Math.round(totalMisses / attacks * 100);
output += "HITS LANDED: " + (defaultHits + hits) + "(" + Math.round(hitPercent) + "%)" + newline;
output += "HITS MISSED: " + (defualtMisses + misses) + "(" + Math.round(missPercent) + "%)";
throwbackInfo(playerCharacter,output);
return;
output = "Booty Simulation:" + newline;
if(target.getObjectType().equals(Enum.GameObjectType.Mob) == false){
return;//ugh what?
}
try
{
simCount = Integer.parseInt(words[0]);
}catch(Exception e)
{
}
output = "Booty Simulation: Rolls:" + simCount + newline;
Mob mob = (Mob) target;
output += "Name: " + mob.getName() + newline;
output += "Special Loot:" + newline;
@@ -100,7 +48,6 @@ public class SimulateBootyCmd extends AbstractDevCmd {
ArrayList<Item> Resources = new ArrayList<Item>();
ArrayList<Item> Runes = new ArrayList<Item>();
ArrayList<Item> Contracts = new ArrayList<Item>();
ArrayList<Item> GuardContracts = new ArrayList<Item>();
ArrayList<Item> Offerings = new ArrayList<Item>();
ArrayList<Item> OtherDrops = new ArrayList<Item>();
ArrayList<Item> EquipmentDrops = new ArrayList<Item>();
@@ -108,17 +55,14 @@ public class SimulateBootyCmd extends AbstractDevCmd {
int failures = 0;
int goldAmount = 0;
for (int i = 0; i < simCount; ++i) {
for (int i = 0; i < 10000; ++i) {
try {
mob.loadInventory();
for (Item lootItem : mob.getCharItemManager().getInventory()) {
switch (lootItem.getItemBase().getType()) {
case CONTRACT: //CONTRACT
if(lootItem.getName().contains("Captain"))
GuardContracts.add(lootItem);
else
Contracts.add(lootItem);
Contracts.add(lootItem);
break;
case OFFERING: //OFFERING
Offerings.add(lootItem);
@@ -139,12 +83,19 @@ public class SimulateBootyCmd extends AbstractDevCmd {
goldAmount += lootItem.getNumOfItems();
break;
default:
OtherDrops.add(lootItem);
if(Warehouse.maxResources.containsKey(lootItem.getItemBaseID())){
Resources.add(lootItem);
} else {
OtherDrops.add(lootItem);
}
break;
}
}
} catch (Exception ex) {
failures++;
//throwbackError(playerCharacter,ex.getLocalizedMessage());
//Logger.error(ex.fillInStackTrace());
//return;
}
if (mob.getEquip() != null) {
for (MobEquipment me : mob.getEquip().values()) {
@@ -190,17 +141,18 @@ 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;
for(Item glass : GlassItems){
output += " " + glass.getName() + newline;
}
output += "RUNE DROPS: " + Runes.size() + newline;
for(Item rune : Runes){
output += " " + rune.getName() + newline;
}
output += "CONTRACTS DROPS: " + Contracts.size() + newline;
output += "GUARD CONTRACTS DROPS: " + GuardContracts.size() + newline;
for(Item contract : Contracts){
output += " " + contract.getName() + newline;
}
output += "RESOURCE DROPS: " + Resources.size() + newline;
output += "OFFERINGS DROPPED: " + Offerings.size() + newline;
output += "ENCHANTED ITEMS DROPPED: " + OtherDrops.size() + newline;
+1 -1
View File
@@ -71,7 +71,7 @@ public class SlotTestCmd extends AbstractDevCmd {
outString += "Hirelings List:";
for (AbstractCharacter hireling : building.getHirelings().keySet())
outString += "\r\n" + hireling.getName() + " slot : " + building.getHirelings().get(hireling);
outString += "\r\n" + hireling.getName() + "(" + hireling.getObjectUUID() + ") slot : " + building.getHirelings().get(hireling);
}
+1 -1
View File
@@ -110,7 +110,7 @@ public class SplatMobCmd extends AbstractDevCmd {
mobile = Mob.createMob(_mobileUUID,
Vector3fImmutable.getRandomPointInCircle(_currentLocation, _targetRange),
null, true, serverZone, null, 0, "", 1);
null, serverZone, null, null, "", 1);
if (mobile != null) {
mobile.updateDatabase();
+27 -16
View File
@@ -11,8 +11,10 @@ package engine.devcmd.cmds;
import engine.Enum.GameObjectType;
import engine.devcmd.AbstractDevCmd;
import engine.gameManager.PowersManager;
import engine.objects.AbstractGameObject;
import engine.objects.Mob;
import engine.objects.MobBase;
import engine.objects.PlayerCharacter;
import java.util.Map;
@@ -56,38 +58,47 @@ public class aiInfoCmd extends AbstractDevCmd {
Mob mob = (Mob) target;
output = "Mob AI Information:" + newline;
output += mob.getName() + newline;
if (mob.BehaviourType != null) {
output += "BehaviourType: " + mob.BehaviourType.toString() + newline;
if (mob.BehaviourType.BehaviourHelperType != null) {
output += "Behaviour Helper Type: " + mob.BehaviourType.BehaviourHelperType.toString() + newline;
if (mob.behaviourType != null) {
output += "BehaviourType: " + mob.behaviourType.toString() + newline;
if (mob.behaviourType.BehaviourHelperType != null) {
output += "Behaviour Helper Type: " + mob.behaviourType.BehaviourHelperType.toString() + newline;
} else {
output += "Behaviour Helper Type: NULL" + newline;
}
output += "Wimpy: " + mob.BehaviourType.isWimpy + newline;
output += "Agressive: " + mob.BehaviourType.isAgressive + newline;
output += "Can Roam: " + mob.BehaviourType.canRoam + newline;
output += "Calls For Help: " + mob.BehaviourType.callsForHelp + newline;
output += "Responds To Call For Help: " + mob.BehaviourType.respondsToCallForHelp + newline;
} else {
output += "BehaviourType: NULL" + newline;
}
output += "Wimpy: " + mob.behaviourType.isWimpy + newline;
output += "Agressive: " + mob.behaviourType.isAgressive + newline;
output += "Can Roam: " + mob.behaviourType.canRoam + newline;
output += "Calls For Help: " + mob.behaviourType.callsForHelp + newline;
output += "Responds To Call For Help: " + mob.behaviourType.respondsToCallForHelp + newline;
} else {
output += "BehaviourType: NULL" + newline;
}
output += "Aggro Range: " + mob.getAggroRange() + newline;
output += "Player Aggro Map Size: " + mob.playerAgroMap.size() + newline;
if (mob.playerAgroMap.size() > 0) {
output += "Players Loaded:" + newline;
}
for (Map.Entry<Integer, Boolean> entry : mob.playerAgroMap.entrySet()) {
output += "Player ID: " + entry.getKey() + " Hate Value: " + (PlayerCharacter.getPlayerCharacter(entry.getKey())).getHateValue() + newline;
for (Map.Entry<Integer, Float> entry : mob.playerAgroMap.entrySet()) {
output += "Player ID: " + entry.getKey() + " Hate Value: " + entry.getValue() + newline;
}
if (mob.getCombatTarget() != null)
output += "Current Target: " + mob.getCombatTarget().getName() + newline;
else
output += "Current Target: NULL" + newline;
for (int token : mob.mobPowers.keySet())
output += token + newline;
if (mob.guardedCity != null)
output += "Patrolling: " + mob.guardedCity.getCityName() + newline;
output += "Powers:" + newline;
for (int token : mob.mobPowers.keySet())
output += PowersManager.getPowerByToken(token).getName() + newline;
output += "Race type: " + MobBase.mobbase_race_types.get(mob.getMobBaseID());
throwbackInfo(playerCharacter, output);
throwbackInfo(playerCharacter, "Race Types: " + MobBase.mobbase_race_types.size());
}
@Override
@@ -9,55 +9,64 @@
package engine.devcmd.cmds;
import engine.Enum.ItemContainerType;
import engine.Enum.ItemType;
import engine.Enum.OwnerType;
import engine.Enum.GameObjectType;
import engine.InterestManagement.WorldGrid;
import engine.devcmd.AbstractDevCmd;
import engine.gameManager.ChatManager;
import engine.gameManager.DbManager;
import engine.gameManager.*;
import engine.objects.*;
import engine.powers.EffectsBase;
import java.util.ArrayList;
import org.pmw.tinylog.Logger;
/**
* @author Eighty
*/
public class GimmeCmd extends AbstractDevCmd {
public class setProfit extends AbstractDevCmd {
public GimmeCmd() {
super("gimme");
public setProfit() {
super("setprofit");
}
@Override
protected void _doCmd(PlayerCharacter pc, String[] words,
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");
if (words.length < 2) {
this.sendUsage(pc);
return;
}
float updateValue;
try {
updateValue = Float.parseFloat(words[1]);
ChatManager.chatSayInfo(pc, amt + " gold added to inventory");
if(pc.level < 75) {
pc.setLevel((short) 75);
ChatManager.chatSayInfo(pc, "Level set to 75");
} catch (NumberFormatException e) {
throwbackError(pc,
"Failed to parse supplied contractID or level to an Integer.");
return; // NaN
}
pc.getCharItemManager().updateInventory();
if(target.getObjectType().equals(GameObjectType.NPC) == false){
return;
}
NPC npc = (NPC)target;
if(words[0].toLowerCase().equals("buy")){
npc.buyPercent = updateValue;
npc.updateDatabase();
return;
}
if(words[0].toLowerCase().equals("sell")){
npc.sellPercent = updateValue;
npc.updateDatabase();
return;
}
}
@Override
protected String _getHelpString() {
return "Round up current gold in inventory to 10,000,000";
return "Sets profit margin of targeted NPC";
}
@Override
protected String _getUsageString() {
return "'./gimme";
return "' /setprofit buy/sell VALUE(1.0)'";
}
}
-168
View File
@@ -1,168 +0,0 @@
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;
}
}
+6 -40
View File
@@ -438,18 +438,6 @@ public enum BuildingManager {
public static boolean IsPlayerHostile(Building building, PlayerCharacter player) {
if(building.getBlueprint() != null && building.getBlueprint().getBuildingGroup() != null && building.getBlueprint().getBuildingGroup().equals(BuildingGroup.BANESTONE))
{
Guild playerNation = player.guild.getNation();
City banedCity = ZoneManager.getCityAtLocation(building.loc);
if(banedCity != null){
if(banedCity.getGuild().getNation().equals(playerNation)){
return false;
}else{
return true;
}
}
}
//Nation Members and Guild members are not hostile.
// if (building.getGuild() != null){
// if (pc.getGuild() != null)
@@ -532,32 +520,10 @@ public enum BuildingManager {
if (building.getBlueprintUUID() == 0)
return false;
if(building.getBlueprint().getBuildingGroup().equals(BuildingGroup.TOL)){
if(contract.getContractID() == 850) {
boolean hasRunemaster = false;
for (AbstractCharacter npc : building.getHirelings().keySet()) {
if (npc.getObjectType() != GameObjectType.NPC)
continue;
if(npc.contractUUID == 850)
hasRunemaster = true;
}
if(hasRunemaster)
return false;
}
}
int maxSlots = building.getBlueprint().getMaxSlots();
if(building.getBlueprint().getBuildingGroup() != null) {
maxSlots = building.getBlueprint().getSlotsForRank(building.getRank());
}
if (maxSlots == building.getHirelings().size())
if (building.getBlueprint().getSlotsForRank(building.getRank()) == building.getHirelings().size()) {
Logger.error("failed at addHireling with contract: " + contract.getContractID());
return false;
}
String pirateName = NPCManager.getPirateName(contract.getMobbaseID());
if (item.getChargesRemaining() > 0)
@@ -570,7 +536,7 @@ public enum BuildingManager {
if (NPC.ISWallArcher(contract)) {
mob = Mob.createMob(contract.getMobbaseID(), Vector3fImmutable.ZERO, contractOwner.getGuild(), true, zone, building, contract.getContractID(), pirateName, rank);
mob = Mob.createMob(contract.getMobbaseID(), Vector3fImmutable.ZERO, contractOwner.getGuild(), zone, building, contract, pirateName, rank);
if (mob == null)
return false;
@@ -582,7 +548,7 @@ public enum BuildingManager {
if (NPC.ISGuardCaptain(contract.getContractID())) {
mob = Mob.createMob(contract.getMobbaseID(), Vector3fImmutable.ZERO, contractOwner.getGuild(), true, zone, building, contract.getContractID(), pirateName, rank);
mob = Mob.createMob(contract.getMobbaseID(), Vector3fImmutable.ZERO, contractOwner.getGuild(), zone, building, contract, pirateName, rank);
if (mob == null)
return false;
@@ -594,7 +560,7 @@ public enum BuildingManager {
if (contract.getContractID() == 910) {
//guard dog
mob = Mob.createMob(contract.getMobbaseID(), Vector3fImmutable.ZERO, contractOwner.getGuild(), true, zone, building, contract.getContractID(), pirateName, rank);
mob = Mob.createMob(contract.getMobbaseID(), Vector3fImmutable.ZERO, contractOwner.getGuild(), zone, building, contract, pirateName, rank);
if (mob == null)
return false;
-5
View File
@@ -27,7 +27,6 @@ import engine.objects.*;
import engine.server.MBServerStatics;
import engine.server.world.WorldServer;
import engine.session.Session;
import engine.util.KeyCloneAudit;
import org.pmw.tinylog.Logger;
import java.util.ArrayList;
@@ -85,10 +84,6 @@ public enum ChatManager {
if ((checkTime > 0L) && (curMsgTime - checkTime < FLOOD_TIME_THRESHOLD))
isFlood = true;
if(KeyCloneAudit.auditChatMsg(pc,msg.getMessage())){
return;
}
switch (protocolMsg) {
case CHATSAY:
ChatManager.chatSay(pc, msg.getMessage(), isFlood);
+101 -193
View File
@@ -301,17 +301,6 @@ public enum CombatManager {
if (target == null)
return 0;
//pet to assist in attacking target
if(abstractCharacter.getObjectType().equals(GameObjectType.PlayerCharacter)){
PlayerCharacter attacker = (PlayerCharacter)abstractCharacter;
if(attacker.getPet() != null){
Mob pet = attacker.getPet();
if(pet.combatTarget == null && pet.assist)
pet.setCombatTarget(attacker.combatTarget);
}
}
//target must be valid type
if (AbstractWorldObject.IsAbstractCharacter(target)) {
@@ -494,24 +483,16 @@ public enum CombatManager {
createTimer(abstractCharacter, slot, 20, true); //2 second for no weapon
else {
int wepSpeed = (int) (wb.getSpeed());
if(abstractCharacter.getObjectType().equals(GameObjectType.PlayerCharacter)){
PlayerCharacter pc = (PlayerCharacter)abstractCharacter;
if(slot == 1){
wepSpeed = (int) pc.combatStats.attackSpeedHandOne;
}else{
wepSpeed = (int) pc.combatStats.attackSpeedHandTwo;
}
}else {
if (weapon != null && weapon.getBonusPercent(ModType.WeaponSpeed, SourceType.None) != 0f) //add weapon speed bonus
wepSpeed *= (1 + weapon.getBonus(ModType.WeaponSpeed, SourceType.None));
if (weapon != null && weapon.getBonusPercent(ModType.WeaponSpeed, SourceType.None) != 0f) //add weapon speed bonus
wepSpeed *= (1 + weapon.getBonus(ModType.WeaponSpeed, SourceType.None));
if (abstractCharacter.getBonuses() != null && abstractCharacter.getBonuses().getFloatPercentAll(ModType.AttackDelay, SourceType.None) != 0f) //add effects speed bonus
wepSpeed *= (1 + abstractCharacter.getBonuses().getFloatPercentAll(ModType.AttackDelay, SourceType.None));
if (abstractCharacter.getBonuses() != null && abstractCharacter.getBonuses().getFloatPercentAll(ModType.AttackDelay, SourceType.None) != 0f) //add effects speed bonus
wepSpeed *= (1 + abstractCharacter.getBonuses().getFloatPercentAll(ModType.AttackDelay, SourceType.None));
if (wepSpeed < 10)
wepSpeed = 10; //Old was 10, but it can be reached lower with legit buffs,effects.
if (wepSpeed < 10)
wepSpeed = 10; //Old was 10, but it can be reached lower with legit buffs,effects.
}
createTimer(abstractCharacter, slot, wepSpeed, true);
}
@@ -547,7 +528,7 @@ public enum CombatManager {
float atr;
int minDamage, maxDamage;
int errorTrack = 0;
int subTrack = 0;
try {
if (ac == null)
@@ -555,29 +536,15 @@ public enum CombatManager {
if (target == null)
return;
if(ac.getObjectType().equals(GameObjectType.PlayerCharacter)){
PlayerCharacter pc = (PlayerCharacter) ac;
pc.combatStats.calculateATR(true);
pc.combatStats.calculateATR(false);
if (mainHand) {
atr = pc.combatStats.atrHandOne;
minDamage = pc.combatStats.minDamageHandOne;
maxDamage = pc.combatStats.maxDamageHandOne;
} else {
atr = pc.combatStats.atrHandTwo;
minDamage = pc.combatStats.minDamageHandTwo;
maxDamage = pc.combatStats.maxDamageHandTwo;
}
}else {
if (mainHand) {
atr = ac.getAtrHandOne();
minDamage = ac.getMinDamageHandOne();
maxDamage = ac.getMaxDamageHandOne();
} else {
atr = ac.getAtrHandTwo();
minDamage = ac.getMinDamageHandTwo();
maxDamage = ac.getMaxDamageHandTwo();
}
if (mainHand) {
atr = ac.getAtrHandOne();
minDamage = ac.getMinDamageHandOne();
maxDamage = ac.getMaxDamageHandOne();
} else {
atr = ac.getAtrHandTwo();
minDamage = ac.getMinDamageHandTwo();
maxDamage = ac.getMaxDamageHandTwo();
}
boolean tarIsRat = false;
@@ -671,37 +638,34 @@ public enum CombatManager {
}
} else {
AbstractCharacter tar = (AbstractCharacter) target;
if(tar.getObjectType().equals(GameObjectType.PlayerCharacter)){
((PlayerCharacter)tar).combatStats.calculateDefense();
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
}
errorTrack = 4;
//Get hit chance
//int chance;
//float dif = atr - defense;
//if (dif > 100)
// chance = 94;
//else if (dif < -100)
// chance = 4;
//else
// chance = (int) ((0.45 * dif) + 49);
float constant = (atr+defense)*0.315f;
float atrChance = atr - constant;
float defChance = defense - constant + atrChance;
float smallChance = atrChance/defChance;
int chance = (int)(smallChance * 100);
errorTrack = 5;
if(chance < 5){
chance = 5;
}
if(chance > 95){
chance = 95;
}
//calculate hit/miss
int roll = ThreadLocalRandom.current().nextInt(1,101);
DeferredPowerJob dpj = null;
boolean hitLanded = LandHit((int)atr,(int)defense);
if (hitLanded) {
if (roll < chance) {
if (ac.getObjectType().equals(GameObjectType.PlayerCharacter))
updateAttackTimers((PlayerCharacter) ac, target, true);
@@ -730,13 +694,7 @@ public enum CombatManager {
PlayerBonuses bonus = ac.getBonuses();
float attackRange = getWeaponRange(wb, bonus);
if(specialCaseHitRoll(dpj.getPowerToken())) {
if(hitLanded) {
dpj.attack(target, attackRange);
}
}else{
dpj.attack(target, attackRange);
}
dpj.attack(target, attackRange);
if (dpj.getPower() != null && (dpj.getPowerToken() == -1851459567 || dpj.getPowerToken() == -1851489518))
((PlayerCharacter) ac).setWeaponPower(dpj);
@@ -751,13 +709,7 @@ public enum CombatManager {
if (dpj != null && dpj.getPower() != null && (dpj.getPowerToken() == -1851459567 || dpj.getPowerToken() == -1851489518)) {
float attackRange = getWeaponRange(wb, bonuses);
if(specialCaseHitRoll(dpj.getPowerToken())) {
if(hitLanded) {
dpj.attack(target, attackRange);
}
}else{
dpj.attack(target, attackRange);
}
dpj.attack(target, attackRange);
}
}
@@ -859,27 +811,7 @@ public enum CombatManager {
float damage;
if (wb != null)
damage = calculateDamage(ac, tarAc, minDamage, maxDamage, damageType, resists);
else
damage = calculateDamage(ac, tarAc, minDamage, maxDamage, damageType, resists);
if(weapon != null && weapon.effects != null){
float armorPierce = 0;
for(Effect eff : weapon.effects.values()){
for(AbstractEffectModifier mod : eff.getEffectModifiers()){
if(mod.modType.equals(ModType.ArmorPiercing)){
armorPierce += mod.minMod * (mod.getRamp() * eff.getTrains());
}
}
}
if(armorPierce > 0){
damage *= 1 - armorPierce;
}
}
//Resists.handleFortitude(tarAc,damageType,damage);
damage = calculateDamage(ac, tarAc, minDamage, maxDamage, damageType, resists);
float d = 0f;
errorTrack = 12;
@@ -887,27 +819,41 @@ public enum CombatManager {
//Subtract Damage from target's health
if (tarAc != null) {
if (tarAc.isSit())
damage *= 2.5f; //increase damage if sitting
if (tarAc.isSit())
damage *= 2.5f; //increase damage if sitting
if (tarAc.getObjectType() == GameObjectType.Mob) {
ac.setHateValue(damage * MBServerStatics.PLAYER_COMBAT_HATE_MODIFIER);
((Mob) tarAc).handleDirectAggro(ac);
}
if (tarAc.getHealth() > 0)
d = tarAc.modifyHealth(-damage, ac, false);
subTrack = 1;
if (tarAc.getObjectType() == GameObjectType.Mob) {
Mob mobTarget = (Mob) tarAc;
if (ac.getObjectType().equals(GameObjectType.PlayerCharacter)) {
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)
d = tarAc.modifyHealth(-damage, ac, false);
subTrack = 5;
} else if (target.getObjectType().equals(GameObjectType.Building)) {
subTrack = 6;
if (BuildingManager.getBuildingFromCache(target.getObjectUUID()) == null) {
ac.setCombatTarget(null);
subTrack = 7;
return;
}
subTrack = 8;
if (target.getHealth() > 0)
d = ((Building) target).modifyHealth(-damage, ac);
subTrack = 9;
}
errorTrack = 13;
@@ -932,18 +878,27 @@ public enum CombatManager {
if (weapon != null && tarAc != null && tarAc.isAlive()) {
if(weapon.effects != null){
for (Effect eff : weapon.effects.values()){
for(AbstractEffectModifier mod : eff.getEffectModifiers()){
if(mod.modType.equals(ModType.WeaponProc)){
ConcurrentHashMap<String, Effect> effects = weapon.getEffects();
for (Effect eff : effects.values()) {
if (eff == null)
continue;
HashSet<AbstractEffectModifier> aems = eff.getEffectModifiers();
if (aems != null) {
for (AbstractEffectModifier aem : aems) {
if (!tarAc.isAlive())
break;
if (aem instanceof WeaponProcEffectModifier) {
int procChance = ThreadLocalRandom.current().nextInt(100);
if (procChance < MBServerStatics.PROC_CHANCE) {
try {
((WeaponProcEffectModifier) mod).applyProc(ac, target);
}catch(Exception e){
Logger.error(eff.getName() + " Failed To Cast Proc");
}
}
if (procChance < MBServerStatics.PROC_CHANCE)
((WeaponProcEffectModifier) aem).applyProc(ac, target);
}
}
}
@@ -972,13 +927,7 @@ public enum CombatManager {
if (wp.requiresHitRoll() == false) {
PlayerBonuses bonus = ac.getBonuses();
float attackRange = getWeaponRange(wb, bonus);
if(specialCaseHitRoll(dpj.getPowerToken())) {
if(hitLanded) {
dpj.attack(target, attackRange);
}
}else{
dpj.attack(target, attackRange);
}
dpj.attack(target, attackRange);
} else
((PlayerCharacter) ac).setWeaponPower(null);
}
@@ -1005,7 +954,8 @@ public enum CombatManager {
ac.cancelOnAttack();
} catch (Exception e) {
Logger.error(ac.getName() + ' ' + errorTrack + ' ' + e);
Logger.error(ac.getName() + ' ' + "ErrorTrack: " + errorTrack + " ErrorSubTrack = " + subTrack + e);
Logger.error(e.getMessage());
}
}
@@ -1084,13 +1034,13 @@ public enum CombatManager {
damage += minDamage;
//calculate resists in if any
if(source.getObjectType().equals(GameObjectType.PlayerCharacter)){
damage *= ((PlayerCharacter)source).ZergMultiplier;
}
if (resists != null)
damage = resists.getResistedDamage(source, target, damageType, damage, 0);
return damage;
return resists.getResistedDamage(source, target, damageType, damage, 0);
else
return damage;
}
private static void sendPassiveDefenseMessage(AbstractCharacter source, ItemBase wb, AbstractWorldObject target, int passiveType, DeferredPowerJob dpj, boolean mainHand) {
@@ -1119,10 +1069,6 @@ public enum CombatManager {
if (eff.getPower() != null && (eff.getPower().getToken() == 429506943 || eff.getPower().getToken() == 429408639 || eff.getPower().getToken() == 429513599 || eff.getPower().getToken() == 429415295))
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);
DispatchMessage.sendToAllInRange(target, cmm);
}
@@ -1244,14 +1190,6 @@ public enum CombatManager {
private static boolean testPassive(AbstractCharacter source, AbstractCharacter target, String type) {
if(target.getBonuses() != null)
if(target.getBonuses().getBool(ModType.Stunned, SourceType.None))
return false;
if(source.getBonuses() != null)
if(source.getBonuses().getBool(ModType.IgnorePassiveDefense, SourceType.None))
return false;
float chance = target.getPassiveChance(type, source.getLevel(), true);
if (chance == 0f)
@@ -1262,7 +1200,7 @@ public enum CombatManager {
if (chance > 75f)
chance = 75f;
int roll = ThreadLocalRandom.current().nextInt(1,100);
int roll = ThreadLocalRandom.current().nextInt(100);
return roll < chance;
@@ -1314,17 +1252,14 @@ public enum CombatManager {
DispatchMessage.dispatchMsgToInterestArea(pc, rwss, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, false, false);
}
public static void toggleSit(boolean toggle, ClientConnection origin) {
private static void toggleSit(boolean toggle, ClientConnection origin) {
PlayerCharacter pc = SessionManager.getPlayerCharacter(origin);
if (pc == null)
return;
if(pc.isFlying())
pc.setSit(false);
else
pc.setSit(toggle);
pc.setSit(toggle);
UpdateStateMsg rwss = new UpdateStateMsg();
rwss.setPlayer(pc);
@@ -1340,6 +1275,13 @@ public enum CombatManager {
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);
return magnitudeSquared > range * range;
@@ -1402,13 +1344,6 @@ public enum CombatManager {
return;
retaliater.setCombatTarget(ac);
if(retaliater.isPlayerGuard && (retaliater.BehaviourType.equals(MobBehaviourType.GuardMinion) || retaliater.BehaviourType.equals(MobBehaviourType.GuardCaptain))){
for(Mob guard : retaliater.guardedCity.getParent().zoneMobSet){
if(guard.isPlayerGuard && guard.combatTarget == null){
guard.setCombatTarget(ac);
}
}
}
}
}
@@ -1440,9 +1375,9 @@ public enum CombatManager {
Resists resists = ac.getResists();
if (resists != null) {
if (resists != null)
amount = resists.getResistedDamage(target, ac, ds.getDamageType(), amount, 0);
}
total += amount;
}
@@ -1525,31 +1460,4 @@ public enum CombatManager {
((AbstractCharacter) awo).getCharItemManager().damageRandomArmor(1);
}
public static boolean LandHit(int ATR, int DEF){
//float chance = (ATR-((ATR+DEF) * 0.315f)) / ((DEF-((ATR+DEF) * 0.315f)) + (ATR-((ATR+DEF) * 0.315f)));
//float convertedChance = chance * 100;
int roll = ThreadLocalRandom.current().nextInt(101);
//if(roll <= 5)//always 5% chance to miss
// return false;
//if(roll >= 95)//always 5% chance to hit
// return true;
float chance = PlayerCombatStats.getHitChance(ATR,DEF);
return chance >= roll;
}
public static boolean specialCaseHitRoll(int powerID){
switch(powerID) {
case 563200808: // Naargal's Bite
case 563205337: // Naargal's Dart
case 563205930: // Sword of Saint Malorn
return true;
default:
return false;
}
}
}
+1 -3
View File
@@ -65,7 +65,6 @@ public enum ConfigManager {
MB_WORLD_MAINTENANCE,
MB_WORLD_GREETING,
MB_WORLD_KEYCLONE_MAX,
MB_WORLD_TESTMODE,
MB_USE_RUINS,
// Mobile AI modifiers
@@ -98,8 +97,7 @@ public enum ConfigManager {
MB_MAGICBOT_FORTOFIX,
MB_MAGICBOT_RECRUIT,
MB_MAGICBOT_MAGICBOX,
MB_MAGICBOT_ADMINLOG,
MB_WORLD_BOXLIMIT;
MB_MAGICBOT_ADMINLOG;
// Map to hold our config pulled in from the environment
// We also use the config to point to the current message pump
+18 -35
View File
@@ -11,6 +11,8 @@ package engine.gameManager;
import engine.Enum;
import engine.devcmd.AbstractDevCmd;
import engine.devcmd.cmds.*;
import engine.net.DispatchMessage;
import engine.net.client.msg.chat.ChatSystemMsg;
import engine.objects.AbstractGameObject;
import engine.objects.Account;
import engine.objects.PlayerCharacter;
@@ -79,6 +81,7 @@ public enum DevCmdManager {
DevCmdManager.registerDevCmd(new AddGoldCmd());
DevCmdManager.registerDevCmd(new ZoneInfoCmd());
DevCmdManager.registerDevCmd(new DebugMeleeSyncCmd());
DevCmdManager.registerDevCmd(new HotzoneCmd());
DevCmdManager.registerDevCmd(new MineActiveCmd());
// Dev
DevCmdManager.registerDevCmd(new ApplyStatModCmd());
@@ -102,7 +105,6 @@ public enum DevCmdManager {
DevCmdManager.registerDevCmd(new SetAdminRuneCmd());
DevCmdManager.registerDevCmd(new SetInvulCmd());
DevCmdManager.registerDevCmd(new MakeItemCmd());
DevCmdManager.registerDevCmd(new GimmeCmd());
DevCmdManager.registerDevCmd(new EnchantCmd());
DevCmdManager.registerDevCmd(new SetSubRaceCmd());
// Admin
@@ -119,6 +121,7 @@ public enum DevCmdManager {
DevCmdManager.registerDevCmd(new PurgeObjectsCmd());
DevCmdManager.registerDevCmd(new SplatMobCmd());
DevCmdManager.registerDevCmd(new SlotNpcCmd());
DevCmdManager.registerDevCmd(new setProfit());
DevCmdManager.registerDevCmd(new GateInfoCmd());
DevCmdManager.registerDevCmd(new ShowOffsetCmd());
DevCmdManager.registerDevCmd(new RealmInfoCmd());
@@ -177,44 +180,19 @@ public enum DevCmdManager {
return false;
}
if(!pcSender.getTimestamps().containsKey("DEVCOMMAND"))
pcSender.getTimestamps().put("DEVCOMMAND",System.currentTimeMillis() - 1500L);
else if(System.currentTimeMillis() - pcSender.getTimestamps().get("DEVCOMMAND") < 1000L)
return false;
//kill any commands not available to everyone on production server
//only admin level can run dev commands on production
boolean playerAllowed = false;
if(ConfigManager.MB_WORLD_TESTMODE.getValue().equals("true")) {
switch (adc.getMainCmdString()) {
case "printresists":
case "printstats":
case "printskills":
case "printpowers":
case "gimme":
case "goto":
case "teleportmode":
case "printbonuses":
playerAllowed = true;
if (!a.status.equals(Enum.AccountStatus.ADMIN))
target = pcSender;
break;
}
}else{
switch (adc.getMainCmdString()) {
case "printresists":
case "printstats":
case "printskills":
case "printpowers":
case "printbonuses":
//case "gimme":
playerAllowed = true;
if (!a.status.equals(Enum.AccountStatus.ADMIN))
target = pcSender;
break;
if((cmd.toLowerCase().equals("printstats") || cmd.toLowerCase().equals("printresists")) && target.equals(pcSender)){
// execute command;
try {
adc.doCmd(pcSender, argString, target);
} catch (Exception e) {
}
return true;
}
if (!playerAllowed && !a.status.equals(Enum.AccountStatus.ADMIN)) {
if (a.status.equals(Enum.AccountStatus.ADMIN) == false && a.getUname().toLowerCase().equals("fatboy") == false) {
Logger.info("Account " + a.getUname() + "attempted to use dev command " + cmd);
return false;
}
@@ -238,6 +216,11 @@ public enum DevCmdManager {
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;
}
File diff suppressed because it is too large Load Diff
+182 -203
View File
@@ -5,227 +5,206 @@
// · · ·
// Magicbane Emulator Project © 2013 - 2022
// www.magicbane.com
package engine.gameManager;
// Defines static methods which comprise the magicbane
// building maintenance system.
import engine.Enum;
import engine.objects.*;
import org.pmw.tinylog.Logger;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.concurrent.ConcurrentHashMap;
public enum MaintenanceManager {
MAINTENANCEMANAGER;
public static void setMaintDateTime(Building building, LocalDateTime maintDate) {
building.maintDateTime = maintDate.withHour(1).withMinute(0).withSecond(0);
building.maintDateTime = maintDate;
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() {
Logger.info("Maintenance has started");
// Run maintenance on player buildings
if (ConfigManager.MB_WORLD_MAINTENANCE.getValue().equalsIgnoreCase("true"))
processBuildingMaintenance();
processMaintenance();
else
Logger.info("Maintenance Costings: DISABLED");
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;
}
}
}
}
}
}
}
}
+7 -10
View File
@@ -67,13 +67,12 @@ public enum MovementManager {
return;
if (toMove.getObjectType().equals(GameObjectType.PlayerCharacter)) {
if (((PlayerCharacter) toMove).isCasting()) {
((PlayerCharacter) toMove).updateLocation();
((PlayerCharacter) toMove).updateMovementState();
}
if (((PlayerCharacter) toMove).isCasting())
((PlayerCharacter) toMove).update();
if(((PlayerCharacter) toMove).isFlying() && toMove.getEffects().containsKey("MoveBuff"))
PlayerCharacter.GroundPlayer(((PlayerCharacter) toMove));
}
toMove.setIsCasting(false);
toMove.setItemCasting(false);
@@ -98,7 +97,7 @@ public enum MovementManager {
if (!toMove.isMoving())
toMove.resetLastSetLocUpdate();
else
toMove.update(false);
toMove.update();
// Update movement for the player
@@ -353,7 +352,7 @@ public enum MovementManager {
ChatManager.chatSystemInfo((PlayerCharacter) ac, "Finished Alt change, setting the end location to " + ac.getEndLoc().getX() + ' ' + ac.getEndLoc().getZ() + " moving=" + ac.isMoving() + " and current location is " + curLoc.getX() + ' ' + curLoc.getZ());
//Send run/walk/sit/stand to tell the client we are flying / landing etc
ac.update(false);
ac.update();
ac.stopMovement(ac.getLoc());
if (ac.isAlive())
MovementManager.sendRWSSMsg(ac);
@@ -410,9 +409,7 @@ public enum MovementManager {
if (bonus.getBool(ModType.Stunned, SourceType.None) || bonus.getBool(ModType.CannotMove, SourceType.None))
continue;
//member.update(false);
member.updateLocation();
member.updateMovementState();
member.update();
// All checks passed, let's move the player
+69 -15
View File
@@ -23,14 +23,6 @@ public enum NPCManager {
NPC_MANAGER;
public static HashMap<Integer, ArrayList<Integer>> _runeSetMap = new HashMap<>();
public static void LoadAllRuneSets() {
_runeSetMap = DbManager.ItemBaseQueries.LOAD_RUNES_FOR_NPC_AND_MOBS();
}
public static void LoadAllBootySets() {
LootManager._bootySetMap = DbManager.LootQueries.LOAD_BOOTY_TABLES();
}
public static void applyRuneSetEffects(Mob mob) {
// Early exit
@@ -127,10 +119,12 @@ public enum NPCManager {
DbManager.removeFromCache(necroPet);
PlayerCharacter petOwner = necroPet.getOwner();
PlayerCharacter petOwner = (PlayerCharacter) necroPet.guardCaptain;
if (petOwner != null) {
necroPet.setOwner(null);
necroPet.guardCaptain = null;
petOwner.setPet(null);
if (updateOwner == false)
@@ -228,12 +222,14 @@ public enum NPCManager {
WorldGrid.removeObject(toRemove);
DbManager.removeFromCache(toRemove);
PlayerCharacter petOwner = toRemove.getOwner();
PlayerCharacter petOwner = (PlayerCharacter) toRemove.guardCaptain;
if (petOwner != null) {
petOwner.setPet(null);
toRemove.setOwner(null);
toRemove.guardCaptain = null;
PetMsg petMsg = new PetMsg(5, null);
Dispatch dispatch = Dispatch.borrow(petOwner, petMsg);
@@ -340,10 +336,19 @@ public enum NPCManager {
else
buildingSlot = BuildingManager.getAvailableSlot(abstractCharacter.building);
//if (buildingSlot == -1)
//Logger.error("No available slot for NPC: " + abstractCharacter.getObjectUUID());
// Override slot for siege engines
abstractCharacter.building.getHirelings().put(abstractCharacter, buildingSlot);
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);
// Override bind and location for this npc derived
// from BuildingManager slot location data.
@@ -370,4 +375,53 @@ public enum NPCManager {
return buildingSlot;
}
public static int getMaxMinions(Mob guardCaptain) {
int maxSlots;
switch (guardCaptain.getRank()) {
case 3:
maxSlots = 2;
break;
case 4:
case 5:
maxSlots = 3;
break;
case 6:
maxSlots = 4;
break;
case 7:
maxSlots = 5;
break;
case 1:
case 2:
default:
maxSlots = 1;
}
return maxSlots;
}
public static void AssignPatrolPoints(Mob mob) {
mob.patrolPoints = new ArrayList<>();
for (int i = 0; i < 5; ++i) {
float patrolRadius = mob.getSpawnRadius();
if (patrolRadius > 256)
patrolRadius = 256;
if (patrolRadius < 60)
patrolRadius = 60;
Vector3fImmutable newPatrolPoint = Vector3fImmutable.getRandomPointInCircle(mob.getBindLoc(), patrolRadius);
mob.patrolPoints.add(newPatrolPoint);
if (i == 1) {
mob.loc = newPatrolPoint;
mob.endLoc = newPatrolPoint;
}
}
}
}
File diff suppressed because it is too large Load Diff
+29 -29
View File
@@ -10,6 +10,11 @@ package engine.gameManager;
import engine.Enum;
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 org.pmw.tinylog.Logger;
@@ -19,6 +24,7 @@ import java.sql.ResultSet;
import java.sql.SQLException;
import java.time.Duration;
import java.time.Instant;
import java.time.LocalDateTime;
import java.util.Collection;
/*
@@ -30,13 +36,14 @@ public enum SimulationManager {
SERVERHEARTBEAT;
private static final long CITY_PULSE = 2000;
private static final long RUNEGATE_PULSE = 1000;
private static final long RUNEGATE_PULSE = 500;
private static final long UPDATE_PULSE = 1000;
private static final long FlIGHT_PULSE = 100;
public static Duration executionTime = Duration.ofNanos(1);
public static Duration executionMax = Duration.ofNanos(1);
private static SimulationManager instance = null;
private long _cityPulseTime = System.currentTimeMillis() + CITY_PULSE;
private long _minePulseTime = System.currentTimeMillis() + CITY_PULSE;
private long _runegatePulseTime = System.currentTimeMillis()
+ RUNEGATE_PULSE;
private long _updatePulseTime = System.currentTimeMillis() + UPDATE_PULSE;
@@ -66,6 +73,8 @@ public enum SimulationManager {
return popString;
}
/*
* Update the simulation. *** Important: Whatever you do in here, do it damn
* quick!
@@ -93,10 +102,13 @@ public enum SimulationManager {
}
try {
if ((_updatePulseTime != 0) && (System.currentTimeMillis() > _updatePulseTime))
if ((_updatePulseTime != 0)
&& (System.currentTimeMillis() > _updatePulseTime))
pulseUpdate();
} catch (Exception e) {
Logger.error("Fatal error in Update Pulse: DISABLED");
Logger.error(
"Fatal error in Update Pulse: DISABLED");
// _runegatePulseTime = 0;
}
try {
@@ -110,18 +122,9 @@ public enum SimulationManager {
}
try {
if ((_cityPulseTime != 0) && (System.currentTimeMillis() > _cityPulseTime)) {
try {
pulseCities();
}catch(Exception e){
}
try {
ArenaManager.pulseArenas();
}catch(Exception e){
}
}
if ((_cityPulseTime != 0)
&& (System.currentTimeMillis() > _cityPulseTime))
pulseCities();
} catch (Exception e) {
Logger.error(
"Fatal error in City Pulse: DISABLED. Error Message : "
@@ -129,7 +132,17 @@ public enum SimulationManager {
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());
if (executionTime.compareTo(executionMax) > 0)
@@ -157,11 +170,7 @@ public enum SimulationManager {
if (player == null)
continue;
try {
player.update(false);
}catch(Exception e){
}
player.update();
}
_updatePulseTime = System.currentTimeMillis() + 500;
@@ -210,12 +219,7 @@ public enum SimulationManager {
city = (City) cityObject;
city.onEnter();
}
for(Mine mine : Mine.getMines()){
if(mine != null && mine.isActive)
mine.onEnter();
}
_cityPulseTime = System.currentTimeMillis() + CITY_PULSE;
}
/*
@@ -225,10 +229,6 @@ public enum SimulationManager {
private void pulseRunegates() {
for (Runegate runegate : Runegate._runegates.values()) {
for(Portal portal : runegate._portals)
if(!portal.isActive())
portal.activate(false);
runegate.collidePortals();
}
@@ -1,347 +0,0 @@
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;
}
}
}
}
+39 -176
View File
@@ -1,195 +1,58 @@
package engine.gameManager;
import engine.objects.Guild;
public class ZergManager {
public static int getBaneCap(Guild guild) {
if(guild.getOwnedCity() == null || guild.getOwnedCity().getTOL() == null)
return 0;
int cityRank = guild.getOwnedCity().getTOL().getRank();
return (cityRank == 8) ? 20 : ((guild.getNation().getSubGuildList().size() + 1 <= 4) ? 10 : 20);
}
public static float getCurrentMultiplier(int count, int maxCount){
switch(maxCount) {
case 3: return getMultiplier3Man(count);
case 5: return getMultiplier5Man(count);
case 10: return getMultiplier10Man(count);
case 20: return getMultiplier20Man(count);
case 30: return getMultiplier30Man(count);
case 40: return getMultiplier40Man(count);
default: return 1.0f; //unlimited
case 3:
return getMultiplier3Man(count);
case 5:
return getMultiplier5Man(count);
case 10:
return getMultiplier10Man(count);
case 20:
return getMultiplier20Man(count);
default:
return getMultiplier40Man(count);
}
}
public static float getMultiplier(int count, int maxCount, float[] thresholds) {
if (count <= maxCount) return 1.0f;
if (count > thresholds.length) return 0.0f;
return 1.0f - thresholds[count - maxCount - 1];
}
public static float getMultiplier3Man(int count) {
if(count < 4)
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;
}
float[] thresholds = {0.37f, 0.60f, 0.75f};
return getMultiplier(count, 3, thresholds);
}
public static float getMultiplier5Man(int count) {
if(count < 6)
return 1.0f;
if(count > 10)
return 0.0f;
switch(count){
case 6: return 0.75f;
case 7: return 0.57f;
case 8: return 0.44f;
case 9: return 0.33f;
case 10: return 0.25f;
default: return 1.0f;
}
float[] thresholds = {0.25f, 0.43f, 0.56f, 0.67f, 0.75f};
return getMultiplier(count, 5, thresholds);
}
public static float getMultiplier10Man(int count) {
if(count < 11)
return 1.0f;
if(count > 20)
return 0.0f;
switch(count){
case 11: return 0.86f;
case 12: return 0.75f;
case 13: return 0.65f;
case 14: return 0.57f;
case 15: return 0.50f;
case 16: return 0.44f;
case 17: return 0.38f;
case 18: return 0.33f;
case 19: return 0.29f;
case 20: return 0.25f;
default: return 1.0f;
}
float[] thresholds = {0.14f, 0.25f, 0.35f, 0.43f, 0.50f, 0.56f, 0.62f, 0.67f, 0.71f, 0.75f};
return getMultiplier(count, 10, thresholds);
}
public static float getMultiplier20Man(int count) {
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;
}
return getMultiplier10Man(count * 2);
}
public static float getMultiplier30Man(int count) {
if(count < 31)
return 1.0f;
if(count > 60)
return 0.0f;
switch (count)
{
case 31: return 0.95f;
case 32: return 0.91f;
case 33: return 0.86f;
case 34: return 0.82f;
case 35: return 0.79f;
case 36: return 0.75f;
case 37: return 0.72f;
case 38: return 0.68f;
case 39: return 0.65f;
case 40: return 0.63f;
case 41: return 0.60f;
case 42: return 0.57f;
case 43: return 0.55f;
case 44: return 0.52f;
case 45: return 0.50f;
case 46: return 0.48f;
case 47: return 0.46f;
case 48: return 0.44f;
case 49: return 0.42f;
case 50: return 0.40f;
case 51: return 0.38f;
case 52: return 0.37f;
case 53: return 0.35f;
case 54: return 0.33f;
case 55: return 0.32f;
case 56: return 0.30f;
case 57: return 0.29f;
case 58: return 0.28f;
case 59: return 0.26f;
case 60: return 0.25f;
default: return 1.0f;
}
}
public static float getMultiplier40Man(int count) {
if(count < 41)
return 1.0f;
if(count > 80)
return 0.0f;
switch (count)
{
case 41: return 0.96f;
case 42: return 0.93f;
case 43: return 0.90f;
case 44: return 0.86f;
case 45: return 0.83f;
case 46: return 0.80f;
case 47: return 0.78f;
case 48: return 0.75f;
case 49: return 0.72f;
case 50: return 0.70f;
case 51: return 0.68f;
case 52: return 0.65f;
case 53: return 0.63f;
case 54: return 0.61f;
case 55: return 0.59f;
case 56: return 0.57f;
case 57: return 0.55f;
case 58: return 0.53f;
case 59: return 0.52f;
case 60: return 0.50f;
case 61: return 0.48f;
case 62: return 0.47f;
case 63: return 0.45f;
case 64: return 0.44f;
case 65: return 0.42f;
case 66: return 0.41f;
case 67: return 0.40f;
case 68: return 0.38f;
case 69: return 0.37f;
case 70: return 0.36f;
case 71: return 0.35f;
case 72: return 0.33f;
case 73: return 0.32f;
case 74: return 0.31f;
case 75: return 0.30f;
case 76: return 0.29f;
case 77: return 0.28f;
case 78: return 0.27f;
case 79: return 0.26f;
case 80: return 0.25f;
default: return 1.0f;
}
return getMultiplier10Man(count * 4);
}
}
}
+73
View File
@@ -19,12 +19,14 @@ import engine.objects.Building;
import engine.objects.City;
import engine.objects.Zone;
import engine.server.MBServerStatics;
import org.pmw.tinylog.Logger;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ThreadLocalRandom;
/*
* Class contains methods and structures which
@@ -107,6 +109,20 @@ public enum ZoneManager {
}
// Returns the number of available hotZones
// remaining in this cycle (1am)
public static int availableHotZones() {
int count = 0;
for (Zone zone : ZoneManager.macroZones)
if (ZoneManager.validHotZone(zone))
count = count + 1;
return count;
}
// Resets the availability of hotZones
// for this cycle
@@ -201,6 +217,63 @@ public enum ZoneManager {
ZoneManager.playerCityZones.add(zone);
}
public static final void generateAndSetRandomHotzone() {
Zone hotZone;
ArrayList<Integer> zoneArray = new ArrayList<>();
if (ZoneManager.macroZones.isEmpty())
return;
// Reset hotZone availability if none are left.
if (ZoneManager.availableHotZones() == 0)
ZoneManager.resetHotZones();
for (Zone zone : ZoneManager.macroZones)
if (validHotZone(zone))
zoneArray.add(zone.getObjectUUID());
int entryIndex = ThreadLocalRandom.current().nextInt(zoneArray.size());
hotZone = ZoneManager.getZoneByUUID(zoneArray.get(entryIndex));
if (hotZone == null) {
Logger.error("Hotzone is null");
return;
}
ZoneManager.setHotZone(hotZone);
}
public static final boolean validHotZone(Zone zone) {
if (zone.getSafeZone() == (byte) 1)
return false; // no safe zone hotzones// if (this.hotzone == null)
if (zone.getNodes().isEmpty())
return false;
if (zone.equals(ZoneManager.seaFloor))
return false;
//no duplicate hotZones
if (zone.hasBeenHotzone == true)
return false;
// Enforce min level
if (zone.minLvl < Integer.parseInt(ConfigManager.MB_HOTZONE_MIN_LEVEL.getValue()))
return false;
if (ZoneManager.hotZone != null)
return ZoneManager.hotZone.getObjectUUID() != zone.getObjectUUID();
return true;
}
// Converts world coordinates to coordinates local to a given zone.
public static Vector3fImmutable worldToLocal(Vector3fImmutable worldVector,
+1 -1
View File
@@ -68,7 +68,7 @@ public abstract class AbstractJob implements Runnable {
this.markStopRunTime();
}
public abstract void doJob();
protected abstract void doJob();
public void executeJob(String threadName) {
this.workerID.set(threadName);
+1 -1
View File
@@ -17,7 +17,7 @@ public abstract class AbstractScheduleJob extends AbstractJob {
}
@Override
public abstract void doJob();
protected abstract void doJob();
public void cancelJob() {
JobScheduler.getInstance().cancelScheduledJob(this);
+1 -1
View File
@@ -16,7 +16,7 @@ public class JobContainer implements Comparable<JobContainer> {
final long timeOfExecution;
final boolean noTimer;
public JobContainer(AbstractJob job, long timeOfExecution) {
JobContainer(AbstractJob job, long timeOfExecution) {
if (job == null) {
throw new IllegalArgumentException("No 'null' jobs allowed.");
}
-75
View File
@@ -1,75 +0,0 @@
package engine.job;
import engine.server.world.WorldServer;
import org.pmw.tinylog.Logger;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;
public class JobThread implements Runnable {
private final AbstractJob currentJob;
private final ReentrantLock lock = new ReentrantLock();
private static Long nextThreadPrint;
public JobThread(AbstractJob job){
this.currentJob = job;
}
@Override
public void run() {
try {
if (this.currentJob != null) {
if (lock.tryLock(5, TimeUnit.SECONDS)) { // Timeout to prevent deadlock
try {
this.currentJob.doJob();
} finally {
lock.unlock();
}
} else {
Logger.warn("JobThread could not acquire lock in time, skipping job.");
}
}
} catch (Exception e) {
Logger.error(e);
}
}
public static void startJobThread(AbstractJob job){
JobThread jobThread = new JobThread(job);
Thread thread = new Thread(jobThread);
thread.setName("JOB THREAD: " + job.getWorkerID());
thread.start();
if(JobThread.nextThreadPrint == null){
JobThread.nextThreadPrint = System.currentTimeMillis();
}else{
if(JobThread.nextThreadPrint < System.currentTimeMillis()){
JobThread.tryPrintThreads();
JobThread.nextThreadPrint = System.currentTimeMillis() + 10000L;
}
}
}
public static void tryPrintThreads(){
ThreadGroup rootGroup = Thread.currentThread().getThreadGroup();
while (rootGroup.getParent() != null) {
rootGroup = rootGroup.getParent();
}
// Estimate the number of threads
int activeThreads = rootGroup.activeCount();
// Create an array to hold the threads
Thread[] threads = new Thread[activeThreads];
// Get the active threads
rootGroup.enumerate(threads, true);
int availableThreads = Runtime.getRuntime().availableProcessors();
// Print the count
if(threads.length > 30)
Logger.info("Total threads in application: " + threads.length + " / " + availableThreads);
}
}
+3 -6
View File
@@ -58,13 +58,10 @@ public class JobWorker extends ControlledRunnable {
} else {
// execute the new job..
//this.currentJob.executeJob(this.getThreadName());
if(this.currentJob != null) {
JobThread.startJobThread(this.currentJob);
this.currentJob = null;
}
this.currentJob.executeJob(this.getThreadName());
this.currentJob = null;
}
Thread.yield();
}
return true;
}
+2 -2
View File
@@ -45,7 +45,7 @@ public abstract class AbstractEffectJob extends AbstractScheduleJob {
}
@Override
public abstract void doJob();
protected abstract void doJob();
@Override
protected abstract void _cancelJob();
@@ -117,7 +117,7 @@ public abstract class AbstractEffectJob extends AbstractScheduleJob {
}
public void endEffect() {
if (this.eb == null || this.power == null)
if (this.eb == null)
return;
this.eb.endEffect(this.source, this.target, this.trains, this.power, this);
}
+9 -1
View File
@@ -15,9 +15,13 @@ import engine.gameManager.DbManager;
import engine.job.AbstractScheduleJob;
import engine.net.DispatchMessage;
import engine.net.client.msg.chat.ChatSystemMsg;
import engine.objects.Bane;
import engine.objects.City;
import engine.workthreads.ZergMechanicThread;
import org.pmw.tinylog.Logger;
import static engine.workthreads.ZergMechanicThread.startZergThreadBane;
public class ActivateBaneJob extends AbstractScheduleJob {
private final int cityUUID;
@@ -29,7 +33,7 @@ public class ActivateBaneJob extends AbstractScheduleJob {
}
@Override
public void doJob() {
protected void doJob() {
City city;
@@ -67,6 +71,10 @@ public class ActivateBaneJob extends AbstractScheduleJob {
msg.setChannel(ChatChannelType.SYSTEM.getChannelID());
DispatchMessage.dispatchMsgToAll(msg);
if(city.getBane() != null) {
startZergThreadBane(city.getBane());
}
}
@Override
+6 -1
View File
@@ -9,9 +9,11 @@
package engine.jobs;
import engine.Enum;
import engine.gameManager.CombatManager;
import engine.job.AbstractJob;
import engine.objects.AbstractCharacter;
import engine.objects.PlayerCharacter;
public class AttackJob extends AbstractJob {
@@ -27,8 +29,11 @@ public class AttackJob extends AbstractJob {
}
@Override
public void doJob() {
protected void doJob() {
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() {
+1 -1
View File
@@ -24,7 +24,7 @@ public class BaneDefaultTimeJob extends AbstractScheduleJob {
}
@Override
public void doJob() {
protected void doJob() {
//bane already set.
if (this.bane.getLiveDate() != null) {
+1 -1
View File
@@ -97,7 +97,7 @@ public class BasicScheduledJob extends AbstractJob {
}
@Override
public void doJob() {
protected void doJob() {
if (execution == null) {
Logger.error("BasicScheduledJob executed with nothing to execute.");
return;
+1 -1
View File
@@ -22,7 +22,7 @@ public class BonusCalcJob extends AbstractJob {
}
@Override
public void doJob() {
protected void doJob() {
if (this.ac != null) {
this.ac.applyBonuses();
+1 -1
View File
@@ -22,7 +22,7 @@ public class CSessionCleanupJob extends AbstractJob {
}
@Override
public void doJob() {
protected void doJob() {
SessionManager.cSessionCleanup(secKey);
}
}
+1 -1
View File
@@ -27,7 +27,7 @@ public class ChangeAltitudeJob extends AbstractScheduleJob {
}
@Override
public void doJob() {
protected void doJob() {
if (this.ac != null)
MovementManager.finishChangeAltitude(ac, targetAlt);
}
+1 -1
View File
@@ -36,7 +36,7 @@ public class ChantJob extends AbstractEffectJob {
}
@Override
public void doJob() {
protected void doJob() {
if (this.aej == null || this.source == null || this.target == null || this.action == null || this.power == null || this.source == null || this.eb == null)
return;
PlayerBonuses bonuses = null;
+1 -1
View File
@@ -29,7 +29,7 @@ public class CloseGateJob extends AbstractScheduleJob {
}
@Override
public void doJob() {
protected void doJob() {
if (building == null) {
Logger.error("Rungate building was null");
+1 -3
View File
@@ -37,7 +37,7 @@ public class DamageOverTimeJob extends AbstractEffectJob {
}
@Override
public void doJob() {
protected void doJob() {
if (this.target.getObjectType().equals(GameObjectType.Building)
&& ((Building) this.target).isVulnerable() == false) {
_cancelJob();
@@ -60,8 +60,6 @@ public class DamageOverTimeJob extends AbstractEffectJob {
if (this.iteration < 0) {
PowersManager.finishEffectTime(this.source, this.target, this.action, this.trains);
if (AbstractWorldObject.IsAbstractCharacter(source))
eb.startEffect((AbstractCharacter) this.source, this.target, this.trains, this);
return;
}
this.skipSendEffect = true;
+1 -1
View File
@@ -28,7 +28,7 @@ public class DatabaseUpdateJob extends AbstractScheduleJob {
}
@Override
public void doJob() {
protected void doJob() {
if (this.ago == null)
return;
ago.removeDatabaseJob(this.type, false);
+1 -1
View File
@@ -29,7 +29,7 @@ public class DebugTimerJob extends AbstractScheduleJob {
}
@Override
public void doJob() {
protected void doJob() {
if (this.pc == null) {
return;
}
+1 -1
View File
@@ -37,7 +37,7 @@ public class DeferredPowerJob extends AbstractEffectJob {
}
@Override
public void doJob() {
protected void doJob() {
//Power ended with no attack, cancel weapon power boost
if (this.source != null && this.source instanceof PlayerCharacter) {
((PlayerCharacter) this.source).setWeaponPower(null);
+1 -1
View File
@@ -22,7 +22,7 @@ public class DisconnectJob extends AbstractScheduleJob {
}
@Override
public void doJob() {
protected void doJob() {
if (this.origin != null) {
this.origin.disconnect();
}
+1 -1
View File
@@ -28,7 +28,7 @@ public class DoorCloseJob extends AbstractScheduleJob {
}
@Override
public void doJob() {
protected void doJob() {
int doorNumber;
+3 -3
View File
@@ -22,14 +22,14 @@ public class EndFearJob extends AbstractEffectJob {
}
@Override
public void doJob() {
protected void doJob() {
//cancel fear for mob.
if (this.target == null || (!(this.target instanceof Mob)))
return;
((Mob) this.target).setFearedObject(null);
((Mob) this.target).fearedObject = null;
}
@Override
@@ -40,6 +40,6 @@ public class EndFearJob extends AbstractEffectJob {
if (this.target == null || (!(this.target instanceof Mob)))
return;
((Mob) this.target).setFearedObject(null);
((Mob) this.target).fearedObject = null;
}
}
+1 -1
View File
@@ -26,7 +26,7 @@ public class FinishCooldownTimeJob extends AbstractJob {
}
@Override
public void doJob() {
protected void doJob() {
PowersManager.finishCooldownTime(this.msg, this.pc);
}
}
+1 -1
View File
@@ -22,7 +22,7 @@ public class FinishEffectTimeJob extends AbstractEffectJob {
}
@Override
public void doJob() {
protected void doJob() {
PowersManager.finishEffectTime(this.source, this.target, this.action, this.trains);
}
+1 -1
View File
@@ -26,7 +26,7 @@ public class FinishRecycleTimeJob extends AbstractScheduleJob {
}
@Override
public void doJob() {
protected void doJob() {
PowersManager.finishRecycleTime(this.msg, this.pc, false);
}
+1 -1
View File
@@ -20,7 +20,7 @@ public class FinishSpireEffectJob extends AbstractEffectJob {
}
@Override
public void doJob() {
protected void doJob() {
PlayerCharacter pc = (PlayerCharacter) target;
+6 -6
View File
@@ -31,7 +31,7 @@ public class FinishSummonsJob extends AbstractScheduleJob {
}
@Override
public void doJob() {
protected void doJob() {
if (this.target == null)
return;
@@ -47,13 +47,13 @@ public class FinishSummonsJob extends AbstractScheduleJob {
return;
// cannot summon a player in combat
//if (this.target.isCombat()) {
if (this.target.isCombat()) {
// ErrorPopupMsg.sendErrorMsg(this.source, "Cannot summon player in combat.");
ErrorPopupMsg.sendErrorMsg(this.source, "Cannot summon player in combat.");
// PowersManager.finishRecycleTime(428523680, this.source, false);
// return;
//}
PowersManager.finishRecycleTime(428523680, this.source, false);
return;
}
if (this.target.getBonuses() != null && this.target.getBonuses().getBool(ModType.BlockedPowerType, SourceType.SUMMON)) {
ErrorPopupMsg.sendErrorMsg(this.target, "You have been blocked from receiving summons!");
+1 -1
View File
@@ -28,7 +28,7 @@ public class LoadEffectsJob extends AbstractJob {
}
@Override
public void doJob() {
protected void doJob() {
if (this.originToSend == null) {
return;
}
+1 -1
View File
@@ -25,7 +25,7 @@ public class LogoutCharacterJob extends AbstractScheduleJob {
}
@Override
public void doJob() {
protected void doJob() {
server.logoutCharacter(this.pc);
}
+1 -1
View File
@@ -19,7 +19,7 @@ public class NoTimeJob extends AbstractEffectJob {
}
@Override
public void doJob() {
protected void doJob() {
}
@Override
+1 -1
View File
@@ -40,7 +40,7 @@ public class PersistentAoeJob extends AbstractEffectJob {
}
@Override
public void doJob() {
protected void doJob() {
if (this.aej == null || this.source == null || this.action == null || this.power == null || this.source == null || this.eb == null)
return;
+1 -1
View File
@@ -45,7 +45,7 @@ public class RefreshGroupJob extends AbstractJob {
}
@Override
public void doJob() {
protected void doJob() {
if (this.pc == null || this.origin == null || grp == null) {
return;
+1 -1
View File
@@ -22,7 +22,7 @@ public class RemoveCorpseJob extends AbstractScheduleJob {
}
@Override
public void doJob() {
protected void doJob() {
if (this.corpse != null)
Corpse.removeCorpse(corpse, true);
+1 -1
View File
@@ -25,7 +25,7 @@ public class SiegeSpireWithdrawlJob extends AbstractScheduleJob {
}
@Override
public void doJob() {
protected void doJob() {
if (spire == null)
return;
+1 -1
View File
@@ -30,7 +30,7 @@ public class StuckJob extends AbstractScheduleJob {
}
@Override
public void doJob() {
protected void doJob() {
Vector3fImmutable stuckLoc;
Building building = null;
+1 -1
View File
@@ -27,7 +27,7 @@ public class SummonSendJob extends AbstractScheduleJob {
}
@Override
public void doJob() {
protected void doJob() {
if (this.source == null)
return;
+1 -1
View File
@@ -39,7 +39,7 @@ public class TeleportJob extends AbstractScheduleJob {
}
@Override
public void doJob() {
protected void doJob() {
if (this.pc == null || this.npc == null || this.origin == null)
return;
+1 -1
View File
@@ -35,7 +35,7 @@ public class TrackJob extends AbstractEffectJob {
}
@Override
public void doJob() {
protected void doJob() {
if (this.tpa == null || this.target == null || this.action == null || this.source == null || this.eb == null || !(this.source instanceof PlayerCharacter))
return;
+1 -1
View File
@@ -29,7 +29,7 @@ public class TransferStatOTJob extends AbstractEffectJob {
}
@Override
public void doJob() {
protected void doJob() {
if (this.dot == null || this.target == null || this.action == null || this.source == null || this.eb == null || this.action == null || this.power == null)
return;
if (!this.target.isAlive()) {
+1 -1
View File
@@ -26,7 +26,7 @@ public class UpdateGroupJob extends AbstractScheduleJob {
}
@Override
public void doJob() {
protected void doJob() {
if (this.group == null)
return;
+1 -15
View File
@@ -1,9 +1,7 @@
package engine.jobs;
import engine.gameManager.ZoneManager;
import engine.job.AbstractScheduleJob;
import engine.objects.Building;
import engine.objects.City;
import org.pmw.tinylog.Logger;
/*
@@ -22,7 +20,7 @@ public class UpgradeBuildingJob extends AbstractScheduleJob {
}
@Override
public void doJob() {
protected void doJob() {
// Must have a building to rank!
@@ -43,18 +41,6 @@ public class UpgradeBuildingJob extends AbstractScheduleJob {
rankingBuilding.setRank(rankingBuilding.getRank() + 1);
if(rankingBuilding.getBlueprint().isWallPiece()){
City cityObject = ZoneManager.getCityAtLocation(rankingBuilding.loc);
if(cityObject.getTOL().getRank() == 8) {
if (rankingBuilding.getBlueprint() != null && rankingBuilding.getBlueprint().getBuildingGroup() != null && rankingBuilding.getBlueprint().isWallPiece()) {
float currentHealthRatio = rankingBuilding.getCurrentHitpoints() / rankingBuilding.healthMax;
float newMax = rankingBuilding.healthMax * 1.1f;
rankingBuilding.setMaxHitPoints(newMax);
rankingBuilding.setHealth(rankingBuilding.healthMax * currentHealthRatio);
}
}
}
// Reload the object
+1 -1
View File
@@ -27,7 +27,7 @@ public class UpgradeNPCJob extends AbstractScheduleJob {
}
@Override
public void doJob() {
protected void doJob() {
int newRank;
+1 -1
View File
@@ -34,7 +34,7 @@ public class UseItemJob extends AbstractScheduleJob {
}
@Override
public void doJob() {
protected void doJob() {
PowersManager.finishApplyPower(ac, target, Vector3fImmutable.ZERO, pb, trains, liveCounter);
}
+1 -1
View File
@@ -35,7 +35,7 @@ public class UseMobPowerJob extends AbstractScheduleJob {
}
@Override
public void doJob() {
protected void doJob() {
PowersManager.finishUseMobPower(this.msg, this.caster, casterLiveCounter, targetLiveCounter);
}
+1 -1
View File
@@ -35,7 +35,7 @@ public class UsePowerJob extends AbstractScheduleJob {
}
@Override
public void doJob() {
protected void doJob() {
PowersManager.finishUsePower(this.msg, this.pc, casterLiveCounter, targetLiveCounter);
}

Some files were not shown because too many files have changed in this diff Show More