Compare 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 bff41967db Revert "Out of combat mode when patrolling."
This reverts commit d3692d0fb7.
2023-09-08 13:07:15 -04:00
MagicBot d3692d0fb7 Out of combat mode when patrolling. 2023-09-08 13:04:29 -04: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
FatBoy 074a799d01 added health recovery to mobs 2023-08-22 20:58:52 -05:00
FatBoy 36ffd08a72 guard minions logic work 2023-08-22 20:52:45 -05:00
FatBoy 58f828b3cd items removed properly from inventory, NPCs nop longer stock base items 2023-08-22 20:52:26 -05:00
MagicBot a6c60e2c04 Merge remote-tracking branch 'origin/master' into mobile-cleanup 2023-08-22 07:50:46 -04:00
FatBoy e5fba340fb guard minion AI restored to follow captain attack commands 2023-08-21 20:24:49 -05:00
FatBoy ea2241732a fixed bug where pet persisted through dismissal 2023-08-21 20:02:26 -05:00
FatBoy 2b83db7bba moved initial loadInventory call to runAfterLoad 2023-08-21 19:48:44 -05:00
FatBoy f636f4d2ec optimized equipment dropping system 2023-08-21 19:36:46 -05:00
FatBoy 8fb6c43c66 alternative loot drop limitation 2023-08-21 19:21:50 -05: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
MagicBot e331f7e2ff Unused methods removed. 2023-08-21 14:26:50 -04:00
MagicBot b8217a8858 Remove unused variable from signature. 2023-08-21 14:11:22 -04:00
MagicBot 50f81396c7 Cleanup of PERSIST db call. 2023-08-21 14:01:28 -04:00
MagicBot 0bca57686d New npc creation work. 2023-08-21 14:00:00 -04:00
MagicBot df6b9e48d3 New npc creation work. 2023-08-21 13:47:47 -04:00
MagicBot 291cb97a22 New npc creation work. 2023-08-21 13:34:42 -04:00
MagicBot 740e75f8e4 New less ungodly NPC constructor. 2023-08-21 13:26:13 -04:00
MagicBot b7bbf8d369 Interest manager updates when moving 64 units. 2023-08-21 05:02:49 -04:00
MagicBot abf450d6ea Use character load range for dirty flag. 2023-08-21 04:52:02 -04:00
MagicBot 9072fc2788 Lock for dirtyload integration. 2023-08-21 04:40:11 -04:00
MagicBot 14968dbb3b Unused variables removed. 2023-08-21 04:21:28 -04:00
MagicBot c79d9ae891 Unused lastXYZ timers set but never used. 2023-08-21 04:19:20 -04:00
MagicBot dbca131a0f Set dirty out to load range. 2023-08-20 20:38:44 -04:00
MagicBot 621d78172d Threadsafe is needed for the flag. 2023-08-20 20:37:24 -04:00
MagicBot 50e962b77e dirtyFlag integration. 2023-08-20 20:14:28 -04:00
MagicBot 07aeb6e58d dirtyFlag integration. 2023-08-20 20:02:16 -04:00
MagicBot f6e2c6c618 dirtyFlag integration. 2023-08-20 19:35:18 -04:00
MagicBot 44b5b98597 dirtyFlag integration. 2023-08-20 19:20:22 -04:00
MagicBot ca21c3d266 dirtyFlag integration. 2023-08-20 19:07:26 -04:00
MagicBot c1f613a1a5 Flag set to true when created. 2023-08-20 18:57:22 -04:00
MagicBot 6923251a88 dirtyflag chosen as solution. 2023-08-20 18:56:09 -04:00
MagicBot 8222cb8530 Remove distance early exit. 2023-08-20 18:29:44 -04:00
MagicBot 0eae76180b Update state of npc. 2023-08-20 17:23:50 -04:00
MagicBot f0cfb69752 Update state of npc. 2023-08-20 17:16:18 -04:00
MagicBot 2e7d2b5bcf Update state of npc. 2023-08-20 17:12:20 -04:00
MagicBot 09b346dcb2 Update state of npc. 2023-08-20 17:01:58 -04:00
MagicBot 46d07b386b Update state of npc. 2023-08-20 16:55:15 -04:00
MagicBot b21e9dc59e Moving items out of constructor. 2023-08-20 16:38:10 -04:00
MagicBot 2c9fc405e9 More unused junk removed. 2023-08-20 16:28:21 -04:00
MagicBot a0a3d34578 Unused lock removed. 2023-08-20 16:25:44 -04:00
MagicBot 8ba4ed20c8 loc set to bindloc after npc returned. 2023-08-20 16:18:51 -04:00
MagicBot 5e474851a8 bugfix: Setting loc before loc is defined in abstract constructor. 2023-08-20 16:00:08 -04:00
MagicBot c69e68cb27 Npc name override moved to runafterload. 2023-08-20 15:37:11 -04:00
MagicBot 2d0116a9d9 inLined single line methods for code clarity. 2023-08-20 15:26:24 -04:00
MagicBot bed99dce62 aiAgentType enumeration defined. 2023-08-20 15:10:31 -04:00
MagicBot e4283c2444 Unused orphan npc collection removed. 2023-08-20 14:40:12 -04:00
MagicBot 407f5d1f71 Init code for instance variables moved to runafterload. 2023-08-19 16:33:17 -04:00
MagicBot 86e4ee4aa9 Debugging. 2023-08-19 16:18:49 -04:00
MagicBot 0d7e69f772 Early exit for npc guild owners. 2023-08-19 16:07:11 -04:00
MagicBot 4d0980d13e Early exit for npc guild owners. 2023-08-19 16:04:46 -04:00
MagicBot 9239bc1400 bug fix in old constructor 2023-08-19 15:58:25 -04:00
MagicBot f1958453c1 bug fix in old constructor 2023-08-19 15:49:00 -04:00
MagicBot 9adb03a845 Code moved to runafterload. 2023-08-19 15:30:35 -04:00
MagicBot 4d48712470 Method to centralize slotting of abschar. 2023-08-19 15:22:43 -04:00
FatBoy f1d31948e8 0 skill weapons don't roll anymore 2023-08-19 11:39:01 -05:00
MagicBot c79b304eeb Revert debug temporal change to minion spawn. 2023-08-19 11:53:38 -04:00
MagicBot c1a14a22e8 bugfix: wrong type comparison. 2023-08-18 13:08:05 -04:00
MagicBot 2f6e334eea Last debug cycle in testing. 2023-08-18 13:01:58 -04:00
MagicBot 105d8135f7 Tweak to siege minion slot assignments. 2023-08-18 12:32:31 -04:00
MagicBot d7c3f2a6ce Newbie Island excluded from server drop rates. Newbie tables having a baseline roll of 44. 2023-08-18 12:00:28 -04:00
MagicBot 68f2bcef0e Siege Minion pawn time reset to nominal 15m. Soft code? 2023-08-18 11:52:31 -04:00
MagicBot 3883963225 Unused and duplicate variable removed. 2023-08-18 11:33:27 -04:00
MagicBot b3bed58a4b Tweak to minion slot calculus. 2023-08-18 11:06:48 -04:00
MagicBot c4cc6bb92d Rotation conforms with bootstrap version. 2023-08-18 10:58:06 -04:00
MagicBot 62a6cd4430 Siege mob slot position properly rotated. 2023-08-18 10:52:36 -04:00
MagicBot 3e7b4cf30c Siege mob slot position properly rotated. 2023-08-18 10:43:59 -04:00
MagicBot bf24573e88 Codepath conforms to bootstrap copy of the 5 copies. 2023-08-18 10:31:13 -04:00
MagicBot 0d72798680 Spawn temporal adjustment for debugging siege mobs. 2023-08-18 10:23:30 -04:00
MagicBot 04fd91ff7d Bugfix: suffix was set as prefix. 2023-08-17 17:53:31 -04:00
MagicBot 0acd8cd939 Initialize variable before building string. 2023-08-16 15:31:17 -04:00
MagicBot 03f17adecf Update to string deserialization. 2023-08-16 15:24:30 -04:00
MagicBot 5ccf833981 Casting cleanup in constructor signature. 2023-08-16 15:04:52 -04:00
MagicBot 5084b3e453 Petitions limited to 255 characters. 2023-08-16 14:41:45 -04:00
MagicBot c95e6a2ac0 We don't serialize PETITION_NEW to the client. 2023-08-16 14:32:24 -04:00
MagicBot d3ffe9140a Unused method removed. 2023-08-16 11:42:49 -04:00
MagicBot 13fb532902 Bugfix for vendor window with no items. 2023-08-16 11:16:24 -04:00
MagicBot 7a5dde7100 Modified GenTable.rollTable() interface to support drop rates natively. 2023-08-16 08:29:29 -04:00
MagicBot e3f468681a Cleaner rank filter on display 2023-08-15 15:25:50 -04:00
MagicBot 27defa21c2 Should not be filtering items in production. 2023-08-15 15:17:12 -04:00
MagicBot f4e9896dbc Unused variable removal. 2023-08-15 09:14:19 -04:00
MagicBot b8a5521430 No need to box this int. 2023-08-15 09:09:59 -04:00
MagicBot ca39ebb9d4 More class cleanup. 2023-08-15 09:07:55 -04:00
MagicBot 010988d0c1 Class cleanup resulting in far smaller message. 2023-08-15 09:06:36 -04:00
MagicBot e09a6ccd88 File reformat. 2023-08-15 08:52:49 -04:00
MagicBot c913618dc3 Method made static and moved to manager. 2023-08-15 08:50:02 -04:00
MagicBot 6d3050f08a Add constants for message action type. 2023-08-14 16:11:26 -04:00
MagicBot b53c1b20d9 Add constants for message action type. 2023-08-14 16:09:06 -04:00
MagicBot f67444a9ea Cancel petition support 2023-08-14 15:56:47 -04:00
MagicBot 36be6f3620 Merge remote-tracking branch 'origin/master' into feature-petition 2023-08-14 15:43:11 -04:00
MagicBot cf78e6c2a4 Petition window work. 2023-08-14 15:42:05 -04:00
MagicBot bcf789030e Bounce back message 2023-08-14 14:42:32 -04:00
MagicBot 1eaec16ca3 Class cleanup. 2023-08-14 14:34:26 -04:00
MagicBot 6e3dd55804 Class cleanup. 2023-08-14 14:33:19 -04:00
MagicBot 41297e5a21 Sql column name update. 2023-08-14 14:08:39 -04:00
MagicBot cb215b536c Sql column name update. 2023-08-14 14:00:09 -04:00
MagicBot d82c157ae4 Petition db update including table creation. 2023-08-14 13:55:26 -04:00
MagicBot 602fc77ff9 Petition db update including table creation. 2023-08-14 13:53:37 -04:00
MagicBot de71e250e8 Petition db update including table creation. 2023-08-14 13:48:33 -04:00
MagicBot cacceba502 Petition db update including table creation. 2023-08-14 13:46:11 -04:00
MagicBot 054f9ea08a Petition db update including table creation. 2023-08-14 13:43:52 -04:00
MagicBot 7aa63a65b6 Petition db update including table creation. 2023-08-14 13:40:27 -04:00
MagicBot 82ad774093 Bugfix in sql statement. 2023-08-14 12:56:23 -04:00
MagicBot 4342fe9819 Enum defined and database work started. 2023-08-14 12:50:50 -04:00
MagicBot 68feae4111 Enum defined and database work started. 2023-08-14 12:49:10 -04:00
MagicBot 231d8810c8 Enum defined and database work started. 2023-08-14 12:48:05 -04:00
FatBoy e2add187fd database petition logging system 2023-08-13 18:06:45 -05:00
FatBoy fd9fe8967c investigate serialization of petition message 2023-08-13 16:01:20 -05:00
FatBoy cbba05687d add handler ot petition super 2023-08-13 15:45:11 -05:00
FatBoy 480e0c69da remove case for petition form message pump 2023-08-13 15:35:47 -05:00
FatBoy 490a1bd8e5 structure for petition received handler 2023-08-13 13:45:07 -05:00
MagicBot 1ecf1d4bc2 Merge remote-tracking branch 'origin/feature-branch-branch' into bugfix-marksmanship 2023-08-13 10:34:02 -04:00
MagicBot d21921cb6d Typo in command string. 2023-08-13 09:44:28 -04:00
MagicBot 04534e2ca6 Current repo branch reported during bootstrap. 2023-08-13 09:43:06 -04:00
MagicBot 4cd180141c Read current repo branch using MB Devops script. 2023-08-13 09:39:16 -04:00
MagicBot 895b87ae05 Class cleanup. Formatting, squiggles and unused code/variables. 2023-08-13 08:16:02 -04:00
MagicBot 1c9b7594d3 Class cleanup. Formatting, squiggles and unused code/variables. 2023-08-13 08:13:27 -04:00
FatBoy 58fe2d93b7 weapon range bonus works again 2023-08-12 19:58:27 -05:00
FatBoy a278f8bc79 range bonus confined to 1 spot 2023-08-12 19:41:44 -05:00
FatBoy 8c287154c8 players to use marksmanship again 2023-08-12 19:07:50 -05:00
MagicBot 962ad4277a Unnecessary cast removed. 2023-08-12 07:46:24 -04:00
MagicBot a7495bf942 Bugfix: R8 slot locations. 2023-08-12 06:16:12 -04:00
MagicBot 1ee80f9697 Bugfix in console port output. 2023-08-11 09:44:16 -04:00
MagicBot 9f541813ef Merge remote-tracking branch 'origin/master' into bugfix-gold-healing 2023-08-11 08:27:19 -04:00
MagicBot 9a12c9b044 Bugfix in character deletion. 2023-08-11 08:20:01 -04:00
MagicBot 049562af5c Typo in help string fixed. 2023-08-11 07:47:23 -04:00
FatBoy 89681cbe3e non-active mines can be fixed by gold 2023-08-10 19:43:37 -05:00
MagicBot bafb48fe14 Merge remote-tracking branch 'origin/feature-gambler' into bugfix-mob-casting 2023-08-09 18:31:51 -04:00
MagicBot 015e6301fb ErrorPopup for fate peddler encumbrance. 2023-08-09 17:58:11 -04:00
MagicBot 1efb9daff8 ErrorPopup for fate peddler encumbrance. 2023-08-09 17:52:39 -04:00
FatBoy 8747890e5e fate peddler work 2023-08-09 15:50:56 -05:00
MagicBot 41c56c150a Version update to 1.5.1 2023-08-09 16:03:53 -04:00
FatBoy 7c931e87a4 fate peddler work 2023-08-09 14:53:05 -05:00
FatBoy 39e0059f28 Merge remote-tracking branch 'origin/bugfix-mob-casting' into feature-gambler 2023-08-09 14:48:48 -05:00
FatBoy 1b77eeabc0 fate peddler work 2023-08-09 14:48:22 -05:00
MagicBot 7ce664458f Server requires a min of 15 database connections to boot. 2023-08-09 08:57:50 -04:00
MagicBot db2e9a282a Only one piece of equip drops at a time. 2023-08-09 08:17:53 -04:00
MagicBot 32b5dd3f66 Bugfix: suffix overwrites prefix. 2023-08-09 07:39:10 -04:00
FatBoy d53bf0f66e fate peddler work 2023-08-08 20:37:31 -05:00
FatBoy 04fcdd2545 disable anniversary gift 2023-08-08 19:43:51 -05:00
FatBoy 5702810108 fate peddler work 2023-08-08 19:37:42 -05:00
FatBoy 47eb4cd536 fate peddler conversion of LootManager methods 2023-08-08 19:32:39 -05:00
FatBoy 626c17f100 Merge branch 'bugfix-mob-casting' into feature-fatePeddler 2023-08-08 19:25:50 -05:00
MagicBot 64ca876920 CanAggro check added to guard logic. 2023-08-08 19:08:51 -04:00
MagicBot b96b222327 Booty moved to LootManager 2023-08-08 18:30:21 -04:00
MagicBot d04ee197d9 Schema change to reflect new package. 2023-08-08 18:25:40 -04:00
FatBoy 9805ee8044 Random to utilize max + 1 2023-08-08 15:43:24 -05:00
FatBoy 0e78902ff6 ranged mobs attack at range again 2023-08-08 14:22:49 -05:00
FatBoy 923447e983 infinite loop fix 2023-08-08 13:36:46 -05:00
FatBoy e88e8b56c6 mobs only toggle combat mode when changing combat target 2023-08-08 12:49:25 -05:00
FatBoy 6e255d9c75 guards hate value change target 2023-08-08 11:51:04 -05:00
FatBoy 59c976c073 guards use hate value 2023-08-08 11:45:42 -05:00
FatBoy 49c403bacc aiInfo display hate value 2023-08-08 11:43:27 -05:00
FatBoy f852037a61 guard minion aggro fixed 2023-08-08 11:30:19 -05:00
MagicBot 9f0fb26e1f Need to preserver order of hashmap insertion. 2023-08-08 12:24:27 -04:00
FatBoy 564968a1e3 scaling guard powers based on rank 2023-08-08 11:07:41 -05:00
FatBoy c8b91fc264 aggro raneg configurable 2023-08-08 10:56:33 -05:00
FatBoy ec43c54aff mob cast delay cached 2023-08-08 10:54:36 -05:00
MagicBot 2ce13ac463 typo in sql 2023-08-08 11:24:13 -04:00
MagicBot 1cc8d2919a DD is last element in contract power list. 2023-08-08 11:19:18 -04:00
MagicBot 35dc1239f8 Record sort ASC is required. 2023-08-08 11:12:32 -04:00
MagicBot 31122cf6d3 AIinfo updated with token list. 2023-08-08 11:01:05 -04:00
MagicBot 434078cebf Power loading work. 2023-08-08 10:44:26 -04:00
MagicBot 1fb2d8cadf Power loading work. 2023-08-08 10:39:19 -04:00
MagicBot fbf865e865 Methods moved to new dbPowersHandler. 2023-08-08 10:32:20 -04:00
MagicBot 0b1df09f3a Refactor of mob powers loading for efficiency. 2023-08-08 10:30:20 -04:00
MagicBot 2e6ebbb9c3 Refactor of mob powers loading for efficiency. 2023-08-08 10:29:01 -04:00
MagicBot 071eb26e48 Powers also loaded from contract. 2023-08-08 08:31:11 -04:00
MagicBot 2a75ab4581 Merge remote-tracking branch 'origin/post-loot-cleanup' into bugfix-mob-casting 2023-08-08 08:07:41 -04:00
FatBoy 6c255323fb vendors now require ranks to roll high tier items 2023-08-07 22:06:45 -05:00
MagicBot a392c5213c Method cleanup. 2023-08-07 15:52:50 -04:00
MagicBot e382ba2b9a Always at least one stat rolled. 2023-08-07 15:00:18 -04:00
MagicBot 557292a56d Removed unused code. 2023-08-07 14:31:33 -04:00
MagicBot 339b6c5025 Using LootManager for forge scaling. 2023-08-07 13:55:22 -04:00
MagicBot b05c4a91e5 Using LootManager for forge scaling. 2023-08-07 13:53:16 -04:00
MagicBot a5ab912ffa Method for adjusted table rolls based on mpc level. 2023-08-07 13:36:16 -04:00
MagicBot b84be6eea8 Last vestiges of old loot system removed. 2023-08-07 12:12:52 -04:00
MagicBot 71875059b6 Update table names for new convention. 2023-08-07 10:52:37 -04:00
MagicBot 6e814c1dcd Refactor to install new loot tables. 2023-08-07 10:17:50 -04:00
MagicBot 985b327b69 Refactor to install new loot tables. 2023-08-07 10:16:30 -04:00
MagicBot 8a5924eeee rollTable() method added to loot classes. 2023-08-07 09:42:40 -04:00
MagicBot 2e59f7f01c Garbage Peddler method removed. 2023-08-07 09:03:38 -04:00
MagicBot f7fd544a00 _modtypeTables populated at startup. 2023-08-07 08:58:44 -04:00
MagicBot 8c4d9b66ef _modTables populated at startup. 2023-08-07 08:49:43 -04:00
MagicBot 32d71df837 _itemTables populated at startup. 2023-08-07 08:39:08 -04:00
MagicBot efe7784a3f _itemTableEntry created.
Class init cleaned up.
2023-08-07 08:22:37 -04:00
FatBoy a5af696806 guard powers 2023-08-06 19:44:20 -05:00
FatBoy 23783ec7cd spacing cleanup 2023-08-06 17:54:01 -05:00
FatBoy 0d2ea32dbd guards nuke more than they debuff 2023-08-06 17:42:24 -05:00
FatBoy 915f93dc2d safe guards dont aggro pets 2023-08-06 17:11:22 -05:00
MagicBot 8f71c8af01 _genTables populated. 2023-08-06 18:09:34 -04:00
MagicBot 6acc422345 _genTables populated. 2023-08-06 18:08:31 -04:00
FatBoy dde98c7c58 guard casting work 2023-08-06 17:07:25 -05:00
MagicBot dd756d4c00 _genTables populated. 2023-08-06 18:00:45 -04:00
MagicBot 0013020bfa New consolidated loot db handler.
Booty loading moved into new handler.
2023-08-06 17:47:49 -04:00
MagicBot 14e7b0395c New _genTables collection defined. 2023-08-06 17:44:30 -04:00
MagicBot f8b09b5f33 Class moved to loot package. 2023-08-06 14:04:06 -04:00
MagicBot a3a2b01ec4 Method moved to manager class. 2023-08-06 08:36:16 -04:00
MagicBot f0503aa63b Junk code removal. 2023-08-06 08:17:15 -04:00
MagicBot ff7e1ae8c1 Junk code removal. 2023-08-06 07:59:27 -04:00
MagicBot e424441380 Booty loot table is a gentable entry. 2023-08-06 07:53:33 -04:00
MagicBot 67bcb9aeea Refactor lootTable/itemtable for client alignment. 2023-08-06 07:21:49 -04:00
FatBoy 345a866f50 mele guards dont cast 2023-08-06 00:07:01 -05:00
FatBoy 5d1ccc437c mele guards dont cast 2023-08-06 00:04:42 -05:00
FatBoy d221daa864 guard power work 2023-08-05 23:38:24 -05:00
FatBoy a79562de01 random extra spell cooldown to stagger 2023-08-05 23:23:27 -05:00
FatBoy c4af45b9e5 guard casting system 2023-08-05 23:10:06 -05:00
FatBoy 2aabafdab8 fixed mob cast effect 2023-08-05 22:54:41 -05:00
FatBoy 2b4b79e339 updated naming convention of variables to conform to client data 2023-08-05 22:38:33 -05:00
MagicBot 0337ac7758 Gold drop rate display fix. 2023-08-05 20:11:07 -04:00
MagicBot e1f96a009b Display effective drop rate. 2023-08-05 19:46:29 -04:00
MagicBot 81fe6c4e2a Removed integer input. 2023-08-05 19:42:26 -04:00
MagicBot cc9b5a93ee Header added to new files. 2023-08-05 19:28:53 -04:00
MagicBot 51dfc3a56b Hotzone affects base rate. 2023-08-05 19:23:58 -04:00
MagicBot 98b9567302 Hotzone table only ran once. 2023-08-05 18:49:48 -04:00
MagicBot 820eeaee72 Bootysim displays chance. 2023-08-05 18:42:43 -04:00
MagicBot 258bda22da Bootysim displays chance. 2023-08-05 18:39:17 -04:00
MagicBot 15a167905c Config drop rates modify chance. 2023-08-05 17:46:34 -04:00
MagicBot a2c6b919d4 Table refactor to conform with sb. 2023-08-05 10:48:21 -04:00
MagicBot 42069fe170 Table refactor to conform with sb. 2023-08-05 10:38:21 -04:00
MagicBot a7abe6c4c5 Table refactor to conform with sb. 2023-08-05 10:28:32 -04:00
MagicBot 0568dc0771 Table refactor to conform with sb. 2023-08-05 10:17:37 -04:00
MagicBot 1c5d1cef70 Table refactor to conform with sb. 2023-08-05 10:11:31 -04:00
MagicBot 5970d6d716 Cleanup of random usage. 2023-08-05 09:39:16 -04:00
MagicBot 0d9ab6c6fd Testing pure unmodified booty entries. 2023-08-05 08:47:48 -04:00
FatBoy 516fa59068 NPCs will now buy items based on how much durability is on the item 2023-08-04 20:03:31 -05:00
FatBoy 64aef11c56 mob equipment takes damage upon death 2023-08-04 19:47:21 -05:00
FatBoy 17f099386a enchanted and non enchanted items show up correctly as "unidentified" 2023-08-04 19:27:49 -05:00
FatBoy 91842add6d item identification defaults work 2023-08-04 19:14:40 -05:00
FatBoy 4a0a00ed95 removed custom "chance" for prefix and suffix 2023-08-04 19:06:48 -05:00
MagicBot 068d9cd719 Signature update in loot generation. 2023-08-04 14:01:12 -04:00
MagicBot ae8eef640b Formatting cleanup. 2023-08-04 13:25:13 -04:00
MagicBot 8fad2780c1 multiplier not used for item drops. 2023-08-04 13:16:44 -04:00
MagicBot 8b1fb98b09 Drop rate not used for equipment drops. 2023-08-04 13:09:09 -04:00
MagicBot 2cbb112f09 Drop rate not used for equipment drops. 2023-08-04 13:04:57 -04:00
MagicBot c5c323a316 Rework of drop rate usage. 2023-08-04 12:23:55 -04:00
MagicBot 7ac78df913 Rework of drop rate usage. 2023-08-04 12:21:22 -04:00
MagicBot 5e01fe97ac Removed pre-Booty roll from Loot Drops.
Renamed methods for clarity.
2023-08-04 10:14:45 -04:00
MagicBot bf29e5868e Merge branch 'feature-hotzone-rolls' of http://repo.magicbane.com/MagicBane/Server into feature-hotzone-rolls
 Conflicts:
	src/engine/gameManager/LootManager.java
2023-08-04 10:11:19 -04:00
MagicBot 31e32cfcf4 Removed initial bootySet roll. 2023-08-04 10:10:19 -04:00
FatBoy ef7d75ba9b min roll increased to 70 2023-08-03 21:07:07 -05:00
FatBoy c514cad1d9 no enchant item identification 2023-08-03 20:44:25 -05:00
FatBoy f79ac6f836 revert min roll change 2023-08-03 20:29:13 -05:00
FatBoy b9f939c8b2 identify loot without prefix or suffix 2023-08-03 20:26:44 -05:00
FatBoy 060e9f330c fix for base value check 2023-08-03 20:06:47 -05:00
FatBoy d903bc767c fix wrong display for hotzone lot table in simulatebooty 2023-08-03 19:59:20 -05:00
FatBoy 42967693d0 autoID if value = baseValue 2023-08-03 19:56:32 -05:00
FatBoy 92cb741822 equipment drops added to simulate booty command 2023-08-03 19:34:42 -05:00
FatBoy 32653216e9 added hotzone tables to simulate booty command 2023-08-03 19:27:48 -05:00
FatBoy 9a03dc36c6 add goldTally to simulateBooty command 2023-08-03 19:24:35 -05:00
FatBoy 0e35eea036 hotzone slightly increase mob min roll 2023-08-03 19:21:35 -05:00
FatBoy a09ce6b4fc cleanup and lots of null checks 2023-08-03 19:18:05 -05:00
MagicBot 765b837df0 Unused methods deleted. 2023-08-03 15:20:31 -04:00
MagicBot fda3386e7b Multiple inner classes extracted from LootManager. 2023-08-03 09:43:30 -04:00
MagicBot 0bb756521b Update console Lootmanager bootstrap message. 2023-08-03 09:09:23 -04:00
MagicBot 95a9e45391 Caching of drop rates within LootManager 2023-08-03 09:04:20 -04:00
MagicBot 4e01c8e794 Moved manager class to manager package 2023-08-03 08:27:08 -04:00
MagicBot 1df78ec1fc Merge remote-tracking branch 'origin/master' into feature-hotzone-rolls 2023-08-03 08:23:24 -04:00
FatBoy 7cdcc3d23d cleanup 2023-08-02 20:09:17 -05:00
FatBoy 66b047d091 cleanup 2023-08-02 20:09:07 -05:00
FatBoy 75f54ae562 normal loot and hotzone loot test 2023-08-02 20:06:46 -05:00
FatBoy 500763fd11 cleanup 2023-08-02 20:01:46 -05:00
FatBoy ae8ead825d error catch for prefix and suffix generation 2023-08-02 19:57:32 -05:00
FatBoy 86e8fe19d4 removed unused method parameter 2023-08-02 19:49:34 -05:00
FatBoy a9af791d02 removed unused import 2023-08-02 19:48:50 -05:00
FatBoy 5ad9112448 incoroporate gold rate, method cleanup 2023-08-02 19:45:18 -05:00
MagicBot 090d3b4372 New config entry added for server gold rates. 2023-08-02 17:44:22 -04:00
MagicBot c3bcdd544e Class formatting cleanup. 2023-08-02 09:12:13 -04:00
MagicBot dea9d93e5b Class formatting cleanup. 2023-08-02 09:10:51 -04:00
MagicBot a299493bd7 Cleanup of file project headers. 2023-08-02 08:18:50 -04:00
MagicBot 350a1208f5 Try-catch surrounding respawn code. 2023-08-02 08:07:41 -04:00
FatBoy b8cb90cdd0 mob pulse delay added to mobAI 2023-08-01 21:26:14 -05:00
FatBoy b47848d63d mob drop combat targets no longer in game 2023-08-01 20:32:02 -05:00
FatBoy 140a9bd084 mob AI new thread 2023-08-01 20:13:23 -05:00
FatBoy 5e0b4ad763 respawn while loop addition 2023-08-01 19:50:52 -05:00
FatBoy 370efe1092 forget about that 2023-08-01 19:27:46 -05:00
FatBoy 50cd9b32db rename comment in WorldServer for mob respawn thread 2023-08-01 19:21:11 -05:00
FatBoy 7f1e537975 mob respawning handled in its own thread 2023-08-01 19:19:39 -05:00
FatBoy cdd074c0ae respawn que null check 2023-08-01 18:56:56 -05:00
FatBoy bab033be2d mobAI error tracing 2023-08-01 18:52:44 -05:00
FatBoy 1b6dcd4da0 AuditAI command implemented and functions 2023-08-01 17:53:45 -05:00
FatBoy 7cc5e0cf5c timestamp to console after each completed iteration of MobileFSMManager 2023-08-01 17:22:34 -05:00
FatBoy 685dd948e2 asset placement validation to use city location not players location 2023-07-31 21:55:20 -05:00
FatBoy 93359ae147 hotzone roll tweaks 2023-07-31 21:28:41 -05:00
FatBoy 48817d7ecb hotzone roll tweaks 2023-07-31 20:42:56 -05:00
FatBoy 38339eae3f hotzone roll tweaks 2023-07-31 19:20:41 -05:00
MagicBot 140ec1b08d Hotfix: Removing extra glass roll. 2023-07-31 14:00:37 -04:00
MagicBot be7156e6f6 Merge remote-tracking branch 'origin/bugfix-ITEM-chance' 2023-07-31 05:14:37 -04:00
FatBoy be84b85b69 fixed insane glass drops 2023-07-30 19:52:11 -05:00
MagicBot 0a36d2786c Merge remote-tracking branch 'origin/bugfix-ITEM-chance' 2023-07-30 17:06:21 -04:00
FatBoy e0f62c0a9b ITEM loot uses chance to drop 2023-07-30 16:05:21 -05:00
FatBoy f5375bca26 ITEM loot uses chance to drop 2023-07-30 15:57:01 -05:00
MagicBot f03d6da6b2 Merge remote-tracking branch 'origin/cleanup-loot-rewrite' 2023-07-30 15:16:48 -04:00
FatBoy 46bb1cd8e8 tweak roll ranges, fix r8 loot bug 2023-07-30 14:05:28 -05:00
FatBoy c104d9fa00 r8 loot roll work 2023-07-30 13:55:08 -05:00
FatBoy 23af1d252e cleanup loot manager 2023-07-30 11:43:26 -05:00
FatBoy 1e5752736a mine towers can be gold repaired when mine not active 2023-07-29 21:37:36 -05:00
FatBoy 707fc9f756 fixed mob loot crash 2023-07-29 20:57:24 -05:00
FatBoy 4932ee36ea catch code for loot crash 2023-07-29 19:04:59 -05:00
FatBoy 99fc4b8671 fixed HZ loot issue 2023-07-27 23:39:14 -05:00
FatBoy e9913a66a7 fixed mob AI crash 2023-07-27 23:17:41 -05:00
FatBoy 57a38303f8 null pointer evasion 2023-07-27 23:10:00 -05:00
FatBoy b28d31ec44 respawn que work 2023-07-27 22:10:47 -05:00
FatBoy 6e1ed24b30 respawnQues operate per zone 2023-07-27 21:22:20 -05:00
FatBoy adb3436bd7 mobs handle players leaving agroMap 2023-07-27 21:18:52 -05:00
FatBoy c0bac56761 corpse loading early exit changed to despawned instead of alive 2023-07-27 20:39:47 -05:00
FatBoy ff281cc20b respawnQue and corpse loading 2023-07-27 20:32:09 -05:00
FatBoy 6a4ae0af31 created respawnQue for mobs 2023-07-27 20:03:14 -05:00
FatBoy 4ccfd0adce baked in stats items no longer show up as "unidentified" 2023-07-27 19:54:47 -05:00
FatBoy 6d4566b94a mob loot rolling finalized 2023-07-27 19:40:42 -05:00
FatBoy 1fa5019ddb regression formula for min mob loot roll 2023-07-27 19:06:31 -05:00
FatBoy a5fe5ece50 mobs use both enemy and notEnemy lists to determine proper agro 2023-07-25 21:51:30 -05:00
FatBoy 62cc334c66 guards no longer attack guards 2023-07-25 21:42:50 -05:00
FatBoy a9fb7969c7 Merge branch 'bugfix-roll-ranges' into merge-mob-fixes 2023-07-25 21:40:30 -05:00
FatBoy 9f90159ca2 audit respawn timers 2023-07-25 21:35:09 -05:00
FatBoy 055b3d3d66 update location 2023-07-25 21:27:54 -05:00
FatBoy 6761ec7361 remove movement sync 2023-07-25 21:19:17 -05:00
FatBoy 763971acc6 regression calculator usage 2023-07-25 21:07:40 -05:00
FatBoy 74d92aa671 mob max roll audit 2023-07-25 20:59:23 -05:00
MagicBot 43090a9bd1 Support for the widest array of network configurations. Auto-configure as best we can. 2023-07-23 12:58:40 -04:00
MagicBot e57ce5b36e Parmn one not set twice. 2023-07-23 11:34:30 -04:00
MagicBot 6eecf28a64 Logging configured map path. 2023-07-23 08:22:17 -04:00
MagicBot c9f1fcbf51 File structure update. 2023-07-23 08:19:15 -04:00
MagicBot 303ccd05b5 File structure update. 2023-07-23 08:16:36 -04:00
MagicBot d9d905e34a File structure update. 2023-07-23 08:15:39 -04:00
MagicBot 9f906128c4 File structure update. 2023-07-23 08:02:46 -04:00
FatBoy fca9b7dccb cleanup and finalize 2023-07-22 18:58:55 -05:00
FatBoy 48bcf1bd1f removed distance check preventing pets from attacking 2023-07-22 18:47:29 -05:00
FatBoy 3f274b1bf8 region support for teleporting 2023-07-22 13:24:58 -05:00
FatBoy 8a8bf8d2f9 region support for teleporting 2023-07-22 12:44:59 -05:00
MagicBot 53bae6e34f Merge remote-tracking branch 'origin/bugfix-stuck-location' 2023-07-22 13:26:11 -04:00
MagicBot 7f5d5dbad2 Footprint adjusted to match mesh. 2023-07-22 13:07:04 -04:00
MagicBot c06bc97640 Only rotate once 2023-07-22 11:04:32 -04:00
MagicBot 5899bb535b Stuck location rotated properly. 2023-07-22 11:02:03 -04:00
MagicBot bf1271c840 Slot not rotated twice. 2023-07-22 10:44:36 -04:00
MagicBot 8b2a07e860 Unused method removed. 2023-07-22 10:40:54 -04:00
FatBoy 7e25875fa2 mobs respawn, mob location sync, mobs attack 2023-07-22 08:26:55 -05:00
FatBoy a34386ae51 mob resync position on death and while moving 2023-07-21 20:01:39 -05:00
MagicBot 413e782af1 NPC slotting now conforms with bootstrap. 2023-07-21 13:15:24 -04:00
MagicBot ccc9908e1e NPC/Mob slotting work. 2023-07-21 13:08:42 -04:00
MagicBot 90c324b363 NPC/Mob slotting work. 2023-07-21 12:50:52 -04:00
MagicBot 1260d7cfa3 Errant import removed. 2023-07-21 12:00:06 -04:00
MagicBot e15075f57f Merge remote-tracking branch 'origin/debug-pet-stats' 2023-07-20 17:04:26 -04:00
FatBoy 2cf02ba102 fix NPC loading issue 2023-07-19 19:45:13 -05:00
FatBoy 25c02c9960 fix NPC loading issue 2023-07-19 19:43:28 -05:00
FatBoy 7f2c6a24b6 fix NPC loading issue 2023-07-19 19:42:02 -05:00
FatBoy e2272f49d4 fix NPC loading issue 2023-07-19 19:03:06 -05:00
FatBoy aa0067c117 fix for mob sync and ghost mobs 2023-07-19 18:27:10 -05:00
FatBoy 07c64f9b46 hotfix mob roll finalized 2023-07-19 18:05:20 -05:00
FatBoy 4adf0a89fb hotfix mob roll chance 2023-07-19 17:50:03 -05:00
FatBoy 4bd158cc78 hotfix mob roll chance 2023-07-19 17:18:46 -05:00
FatBoy 39ceef99ea hotfix mob roll chance 2023-07-19 17:17:40 -05:00
MagicBot 69d8424cb6 Improved error reporting 2023-07-19 15:43:58 -04:00
FatBoy 3869b3b218 old code cleanup 2023-07-18 20:17:05 -05:00
FatBoy 4fd9a358a6 pets will stop chasing mobs that are no longer a threat to player 2023-07-18 20:09:37 -05:00
FatBoy c9995f3d62 pets defend owner when "assist" toggled 2023-07-18 20:01:58 -05:00
FatBoy 1c7c0ee13e mobs aggro to pets 2023-07-18 19:51:00 -05:00
FatBoy bd48198a51 pets stats calculate properly & pet buffs no longer nerf pet 2023-07-18 19:29:12 -05:00
MagicBot 170312fef8 Placement check set to 876 to accommodate larger zone sizes. 2023-07-18 16:09:41 -04:00
FatBoy 60f02ae34e mob roll tables update 2023-07-17 22:27:55 -05:00
FatBoy 72a0fc458e mob roll tables update 2023-07-17 22:25:54 -05:00
MagicBot 727ccf3b12 ZoneSet DevCmd created. 2023-07-17 04:22:56 -04:00
MagicBot 0cde9de388 Testing Zone set. 2023-07-17 04:06:06 -04:00
MagicBot ea0370ac51 Merge remote-tracking branch 'origin/master' into bugfix-loot-rolls 2023-07-16 14:44:17 -04:00
FatBoy 45fa191ef6 prefix and suffix chances added to mobloot 2023-07-16 11:35:54 -05:00
FatBoy 68e87dabbc prefixes drop on mobloot 2023-07-16 09:53:18 -05:00
FatBoy 428ded8728 roll ranges fixed to allow all items to drop naturally 2023-07-16 09:04:21 -05:00
MagicBot c04a342890 Update to sql for better default mysql.cnf compatibility. 2023-07-16 07:52:10 -04:00
FatBoy c72cda1b73 pets attack buildings 2023-07-15 22:34:09 -05:00
FatBoy 9db568206d pet stats added again 2023-07-15 21:57:27 -05:00
FatBoy 9ea02c888f pet troubles resolved 2023-07-15 18:38:46 -05:00
FatBoy 8720f8f335 loot roll formula adjusted 2023-07-15 17:00:58 -05:00
FatBoy 06c4b7ca3c ghost mob fix 2023-07-15 15:48:11 -05:00
FatBoy 8c1b237720 dead pets removed form seafloor zonemobset 2023-07-15 15:39:57 -05:00
FatBoy 7dc6fece7d work on pet AI 2023-07-15 15:27:22 -05:00
FatBoy e0929a4cbd pets added to seafloor mob set 2023-07-15 14:20:50 -05:00
FatBoy 18bcd79733 pets now spawn at owners location 2023-07-15 14:08:44 -05:00
FatBoy 525facf7b5 remote commit 2023-07-15 13:27:35 -05:00
FatBoy 38317a4ee5 cast chance and cooldown modification for mobs 2023-07-15 08:35:00 -05:00
FatBoy eb9a214ba3 cast chance and cooldown modification for mobs 2023-07-15 08:33:57 -05:00
MagicBot f9870d45fc Merge remote-tracking branch 'origin/magicbot-reg-update' into magicbox1.5
# Conflicts:
#	src/engine/ai/MobileFSM.java
#	src/engine/ai/MobileFSMManager.java
#	src/engine/devcmd/cmds/SetAICmd.java
#	src/engine/gameManager/DevCmdManager.java
2023-07-15 09:27:57 -04:00
MagicBot 9bbdef224d Project cleanup pre merge. 2023-07-15 09:23:48 -04:00
MagicBot 134b651df8 Version requirement updated. 2023-07-15 09:18:51 -04:00
MagicBot 0a15e3e75b Removed leftover discriminator. 2023-07-15 09:12:33 -04:00
FatBoy 9a68509847 Merge branch 'magicbox1.5' of http://repo.magicbane.com/MagicBane/Server into magicbox1.5 2023-07-15 07:59:29 -05:00
FatBoy 9f162e9ed0 last minute cleanup, added cast chance to mobs 2023-07-15 07:59:07 -05:00
MagicBot 003916d393 Parm required when registering. 2023-07-14 14:41:12 -04:00
MagicBot 46d50d315a Unused methods removed. 2023-07-02 07:46:45 -04:00
MagicBot f73aed9d48 Merge remote-tracking branch 'origin/magicbox1.5' into configupdate2 2023-07-01 13:05:23 -04:00
FatBoy 761adca2ef guards no longer recall when player aggro map is empty 2023-06-30 21:02:51 -05:00
FatBoy b32705ce56 mob casting will now check for and properly check against hit roll requirements 2023-06-30 20:33:41 -05:00
MagicBot 4dc40f4df4 Back to offset until city cleanup. 2023-06-27 18:21:26 -04:00
MagicBot 4b49777eb2 Simplify logic. 2023-06-27 18:01:59 -04:00
MagicBot cb25333dc3 SDR binds at banestone 2023-06-27 17:35:33 -04:00
MagicBot 34e4aa1963 SDR binds at banestone 2023-06-27 17:34:25 -04:00
MagicBot 7810ea6baf SDR binds at banestone 2023-06-27 17:30:13 -04:00
MagicBot 89399e9f93 bugfix: case issue 2023-06-27 16:55:09 -04:00
MagicBot d08316d6f3 Ruins or SDR driven by config. 2023-06-27 16:50:38 -04:00
MagicBot b383aab556 Ruins or SDR driven by config. 2023-06-27 16:45:47 -04:00
MagicBot 9cd3cdf3a3 Mob AI uses two config entries. 2023-06-27 16:19:15 -04:00
MagicBot 7f05cc87c4 Mob AI and SDR/Ruins added to config. 2023-06-27 16:13:25 -04:00
MagicBot 92004bf43e Mob AI and SDR/Ruins added to config. 2023-06-27 16:09:55 -04:00
FatBoy ef0e277f46 refactored AI variables from MBServerStatics 2023-06-26 20:21:10 -05:00
MagicBot 2ffd2e37e6 Class cleanup and reformat. 2023-06-26 19:19:59 -04:00
MagicBot 7d1d1e19d2 Logging of invalid contracts 2023-06-26 18:45:40 -04:00
MagicBot bea82d80f2 Logging of invalid contracts 2023-06-26 18:35:51 -04:00
FatBoy cb344d57b2 guard dogs have 0 minions 2023-06-25 21:44:47 -05:00
FatBoy 99a4d87982 guard dogs 2023-06-25 21:34:23 -05:00
FatBoy 1b94f3f71d guard dogs 2023-06-25 21:32:36 -05:00
FatBoy b2ce937b3f guard minion spawn work 2023-06-25 20:23:47 -05:00
FatBoy 5653776cb2 guard minions despawn at creation 2023-06-25 20:18:02 -05:00
FatBoy 413df09ddf removed error code in FSM manager 2023-06-25 19:51:52 -05:00
FatBoy fc3ca3b814 null target check for mobs 2023-06-25 19:44:27 -05:00
FatBoy 7b43440fae mobs start the game at their first patrol point index 2023-06-25 19:32:49 -05:00
FatBoy 01b8b67ffd mobs respect invisibility again 2023-06-25 19:30:28 -05:00
MagicBot 8fbbde6d69 bugfix in world height calculation. 2023-06-25 20:25:23 -04:00
FatBoy da51be1bef Mob Casting bypasses mele range check 2023-06-25 13:36:24 -05:00
MagicBot 764beb33bd Dispatcher moved to early in bootstrap. 2023-06-07 15:31:07 -04:00
MagicBot f8c8d7244e Moved member to ConfigManager. 2023-06-07 14:53:15 -04:00
MagicBot b6ce3b7ee9 Already logged when connection manager is created. 2023-06-07 14:32:01 -04:00
MagicBot 48aef2ef01 Network autoconfig now uses eth0 or default outgoing ip route. 2023-06-07 14:11:54 -04:00
MagicBot 61e4a4aed4 Realmmap loaded from config to assist with custom maps. 2023-06-07 13:47:25 -04:00
MagicBot b9db6e8dc6 Members moved to WorldServer.
Root object no longer read from config.
2023-06-07 13:37:43 -04:00
FatBoy d695d3db26 epic mob damage calc fix and epic mob null reference fix 2023-05-28 16:07:18 -05:00
FatBoy ca11651be6 guards use proper aggro rules for added aggro check 2023-05-28 15:45:38 -05:00
FatBoy 2cfe527389 mob AI no longer checks for no online players 2023-05-28 14:12:31 -05:00
FatBoy f94e66bf74 mobs update location after moving to patrol point index 2023-05-28 14:05:58 -05:00
FatBoy ff3442d9ad aiinfo command null check 2023-05-28 14:02:05 -05:00
FatBoy 33c6f1c74d patrol point index 2023-05-28 13:48:15 -05:00
FatBoy da378bf490 patrol point index 2023-05-28 13:31:39 -05:00
FatBoy b3b7a78cec patrol point index 2023-05-28 13:28:22 -05:00
FatBoy 545163f60b traget name added to aiInfoCmd 2023-05-28 13:13:49 -05:00
FatBoy bfcdd3bf4b mobile default starting point 2023-05-28 12:56:47 -05:00
FatBoy 67808b69a6 check for dead target 2023-05-28 12:07:00 -05:00
FatBoy 59a4da0c3f randomized patrol delays 2023-05-28 11:34:54 -05:00
FatBoy fd9c5d06af randomized patrol delays 2023-05-28 11:30:46 -05:00
FatBoy 19beb3d5cb randomized patrol delays 2023-05-28 11:29:00 -05:00
FatBoy 863aa4c4a9 randomized patrol delays 2023-05-28 11:25:12 -05:00
FatBoy 90ae798bb8 no more skating rink 2023-05-28 11:19:32 -05:00
FatBoy c47d1b7823 aggro check for non agressive mobs 2023-05-28 11:03:29 -05:00
FatBoy 4e5c77ec47 hamlet guard aggro fix 2023-05-28 11:02:37 -05:00
FatBoy d673c329b6 hamlet guards + mobs aggro before going home 2023-05-28 10:55:11 -05:00
FatBoy 7dfd8148d5 use aggro range not mob range 2023-05-28 10:47:10 -05:00
FatBoy a2a70484ed cant check range of target if theres no target 2023-05-28 10:46:07 -05:00
FatBoy 36eef1942b mobs use half aggro range top chase targets past go home point 2023-05-28 10:43:05 -05:00
FatBoy b154f7ee7f mobs don't go home while in combat range 2023-05-28 10:21:56 -05:00
FatBoy ea919b4ecf mob aggro raneg when swapping hated target 2023-05-28 10:13:49 -05:00
FatBoy b42a378ca8 hate value reset when mob goes home 2023-05-28 10:11:20 -05:00
FatBoy 3b3e89c98f NPC owner null check 2023-05-28 09:25:15 -05:00
FatBoy 708d2e9fb3 building check fix 2023-05-28 09:19:10 -05:00
FatBoy bee3a9b376 Merge remote-tracking branch 'origin/magicbox1.5' into magicbox1.5
# Conflicts:
#	src/engine/ai/MobileFSM.java
2023-05-28 09:18:09 -05:00
MagicBot 566522befb Reformat and bonus code removal. 2023-05-28 08:12:34 -04:00
MagicBot a1f8fedefe Merge remote-tracking branch 'origin/magicbox1.5' into mob-AI-debug
# Conflicts:
#	src/engine/ai/MobileFSM.java
2023-05-28 07:42:10 -04:00
FatBoy 0de09ee9f5 trebs now show correct time remaining to spawn 2023-05-27 22:00:12 -05:00
FatBoy 0d2af7c011 treb fix 2023-05-27 20:54:16 -05:00
FatBoy 11e373db6f treb fix 2023-05-27 20:53:52 -05:00
FatBoy 2e219916a0 respawn work 2023-05-27 19:19:06 -05:00
FatBoy a07ee7903b respawn work 2023-05-27 19:11:17 -05:00
MagicBot abb2521f58 Bug class involving generated keys from statements. 2023-05-26 17:46:26 -04:00
MagicBot d0287ba94e Login should fail fast. 2023-05-25 14:55:49 -04:00
FatBoy 56d6efc4e4 mob chance to cast set at 50% 2023-05-24 20:27:58 -05:00
FatBoy b6c9eed229 power chance tuning 2023-05-24 20:08:53 -05:00
FatBoy eb9a1143e4 patrol delay fine tuning 2023-05-24 19:27:25 -05:00
FatBoy 3e659d981a Patrol wait determined by MBServerStatics.AI_PATROL_DIVISOR
mob cast chance now determined by MBStatics.AI_POWER_CHANCE

mob cast cooldown now determined by MBServerStatics.AI_POWER_DIVISOR

guards use normal mob damage calculations
2023-05-24 19:14:23 -05:00
FatBoy d999d60e9a Patrol wait determined by MBServerStatics.AI_PATROL_DIVISOR
mob cast chance now determined by MBStatics.AI_POWER_CHANCE

mob cast cooldown now determined by MBServerStatics.AI_POWER_DIVISOR
2023-05-24 19:05:35 -05:00
MagicBot cb0a89cb03 Fixed pool size auto-calculated. 2023-05-24 08:36:34 -04:00
MagicBot ee137c0146 Fixed pool size auto-calculated. 2023-05-24 08:34:37 -04:00
MagicBot 9edc32de13 Pool - 10 minute idle; 60 min lifetime. 2023-05-24 07:57:36 -04:00
MagicBot c46615f1d2 Logging info update on bootstrap. 2023-05-23 17:30:30 -04:00
MagicBot d7d22dbb11 Populate zone extents cache. 2023-05-23 17:15:07 -04:00
MagicBot bcc1ac115d bug class fixed involving rs usage 2023-05-23 14:29:08 -04:00
MagicBot adcf7ca927 Updated Hikari pool configuration. 2023-05-23 14:06:15 -04:00
MagicBot f78c18abec Updated Hikari pool configuration. 2023-05-23 13:51:10 -04:00
MagicBot 4f7bb6de0b Using server side statement cache (500). 2023-05-23 13:25:50 -04:00
MagicBot 45d26a82f2 bugfix: runafterload for instanced agos 2023-05-23 12:53:04 -04:00
MagicBot ad99415679 fix: bug class involving rs usage. 2023-05-23 12:24:11 -04:00
MagicBot 568b0291a2 Duplicate method removed. 2023-05-23 11:18:21 -04:00
MagicBot 89192c7ea0 Cleanup post db-refactor. 2023-05-23 11:07:20 -04:00
MagicBot 38ed65054e Cleanup post db-refactor. 2023-05-23 10:56:27 -04:00
MagicBot 391e2d2a17 Cleanup post db-refactor. 2023-05-23 10:50:00 -04:00
MagicBot c6b8d27d53 Refactor to remove abstraction. 2023-05-23 10:42:34 -04:00
MagicBot 3761384dfb Bugfix; method is on rs. 2023-05-23 10:32:07 -04:00
MagicBot 6dd7315786 Garbage cleanup in SetZone().
Package reformat.
2023-05-23 10:27:03 -04:00
MagicBot a2d62ec221 Unused method removed. 2023-05-23 10:08:07 -04:00
MagicBot 4d4d83d15a Unused method removed. 2023-05-23 10:07:39 -04:00
MagicBot 1e3aab1623 Query string updated. 2023-05-23 10:03:05 -04:00
MagicBot f7da137e0f Refactor to remove abstraction 2023-05-23 09:57:17 -04:00
MagicBot 3dd27976fe Refactor to remove abstraction 2023-05-23 09:39:27 -04:00
MagicBot a92ac8671b Refactor to remove abstraction 2023-05-23 09:26:11 -04:00
MagicBot 7c57dcc73d Update to bool return handling. 2023-05-23 09:17:06 -04:00
MagicBot 55756472c6 Bonus code removed. 2023-05-23 08:38:20 -04:00
MagicBot 98237cd53e Refactor to remove abstraction. 2023-05-23 08:33:14 -04:00
MagicBot e9cb8112de Refactor to remove abstraction. 2023-05-23 08:31:10 -04:00
MagicBot fce67a6bae Refactor to remove abstraction. 2023-05-23 08:22:46 -04:00
MagicBot 478e472dc4 Refactor to remove abstraction. 2023-05-23 08:20:20 -04:00
MagicBot 9bdbeeaf70 Refactor to remove abstraction. 2023-05-22 13:00:47 -04:00
MagicBot 3e604b53fa Refactor to remove abstraction. 2023-05-22 12:58:16 -04:00
MagicBot 4b0a3627d4 Refactor to remove abstraction. 2023-05-22 12:50:04 -04:00
MagicBot 3a95cc9b58 Refactor to remove abstraction. 2023-05-22 12:45:55 -04:00
MagicBot f6aa71e9fb Refactor to remove abstraction. 2023-05-22 12:42:34 -04:00
MagicBot d67026edba Refactor to remove abstraction. 2023-05-22 12:35:15 -04:00
MagicBot 75dfc638e1 Pool size auto-configure 2023-05-22 10:34:57 -04:00
MagicBot 07b337f3f1 Pool size fixed 2023-05-22 10:32:15 -04:00
MagicBot 271fc8a35f Pool size auto configured. 2023-05-22 10:21:55 -04:00
MagicBot c7bd2123e8 Pool size auto configured. 2023-05-22 10:11:46 -04:00
MagicBot 5721638cd6 Refactor to remove abstraction. 2023-05-22 09:42:30 -04:00
MagicBot 20bbf85082 Refactor to remove abstraction. 2023-05-22 09:34:59 -04:00
MagicBot 3a2f087381 Refactor to remove abstraction. 2023-05-22 08:54:59 -04:00
MagicBot b8c9d4faf2 Refactor to remove abstraction. 2023-05-22 08:41:25 -04:00
MagicBot 860f7b7b49 Refactor to remove abstraction. 2023-05-22 08:28:58 -04:00
MagicBot b7dd4a845a Refactor to remove abstraction. 2023-05-22 07:57:08 -04:00
MagicBot 1bf9fde684 Bonus code removed. 2023-05-22 07:44:34 -04:00
MagicBot 608a286428 Refactor to remove abstraction 2023-05-22 07:29:22 -04:00
MagicBot 4145124762 Refactor to remove abstraction 2023-05-22 07:18:26 -04:00
MagicBot 9f7da9a57a Refactor to remove abstraction 2023-05-22 06:46:30 -04:00
MagicBot 2cdb2fce42 Refactor to remove abstraction 2023-05-22 06:35:24 -04:00
MagicBot dc9a6fc825 Refactor to remove abstraction 2023-05-22 06:25:51 -04:00
MagicBot 6ae6c91a71 Refactor to remove abstraction 2023-05-22 06:17:40 -04:00
MagicBot ba76de7226 Refactor to remove abstraction 2023-05-22 06:15:19 -04:00
MagicBot 609ee4621e Refactor to remove abstraction 2023-05-22 05:58:30 -04:00
MagicBot 3c9b624ca0 Refactor to remove abstraction 2023-05-22 05:55:33 -04:00
MagicBot 135f66e46f Refactor to remove abstraction 2023-05-22 05:11:55 -04:00
MagicBot 1cd4617c69 Refactor to remove abstraction 2023-05-21 20:26:53 -04:00
MagicBot 8cb0e66bff Refactor to remove abstraction 2023-05-21 20:13:00 -04:00
MagicBot 6ce964ef18 Unnecessary cast 2023-05-21 17:53:21 -04:00
MagicBot db3f97eccf Refactor to remove abstraction. 2023-05-21 17:50:44 -04:00
MagicBot df1b0e3f0f Refactor to remove abstraction. 2023-05-21 17:34:31 -04:00
MagicBot 4749186d86 bugfix: missing break. 2023-05-21 17:29:45 -04:00
MagicBot 82d80ebc4d Refactor to remove abstraction 2023-05-21 17:27:45 -04:00
MagicBot ea5cbf3f0c Refactor to remove abstraction 2023-05-21 17:20:09 -04:00
MagicBot 4d08857de1 Refactor to remove abstraction 2023-05-21 17:00:17 -04:00
MagicBot e203945ea3 Static method moved to manager singleton. 2023-05-21 15:55:15 -04:00
MagicBot ca5cfed82f Refactor to remove abstraction. 2023-05-21 15:48:55 -04:00
MagicBot 0924fa2bdb Refactor to remove abstraction. 2023-05-21 15:28:50 -04:00
MagicBot f299fcaffc Refactor to remove abstraction. 2023-05-21 15:10:27 -04:00
MagicBot 6be3ca41f8 Refactor to remove abstraction. 2023-05-21 14:39:57 -04:00
MagicBot a70c981b47 Refactor to remove abstraction. 2023-05-21 08:57:53 -04:00
MagicBot ea2140559b Bonus Code removed. 2023-05-21 08:39:19 -04:00
MagicBot e4ef0021e8 Refactor to remove abstraction 2023-05-21 08:36:39 -04:00
MagicBot 7b9788bfa9 Refactor to remove abstraction 2023-05-21 08:16:27 -04:00
MagicBot daa5764bfb Refactor to remove abstraction 2023-05-20 21:18:32 -04:00
MagicBot 2e42cbed06 Refactor to remove abstraction 2023-05-20 20:40:52 -04:00
MagicBot 5b3dfbcc21 Refactor to remove abstraction 2023-05-20 19:58:47 -04:00
MagicBot 962649c0f2 Db methods moved to db system. 2023-05-20 19:34:02 -04:00
MagicBot a683eb6290 Refactored to remove abstraction. 2023-05-20 19:14:01 -04:00
MagicBot 4daee03f0d Refactored to remove abstraction. 2023-05-20 19:09:28 -04:00
MagicBot 7e511f590d Created getObjectsFromRs() 2023-05-20 19:02:56 -04:00
MagicBot bffe953c3f Refactor to remove abstraction. 2023-05-20 17:51:21 -04:00
MagicBot c86ad3f2f6 Begin refactor to remove abstraction. 2023-05-20 17:35:44 -04:00
MagicBot 563b54de14 Unused methods removed 2023-05-20 16:33:40 -04:00
MagicBot 82498e8e5a Threadlocal hikari connection defined. 2023-05-20 10:51:25 -04:00
MagicBot e7fa9cc494 Unused methods removed. 2023-05-20 10:43:54 -04:00
MagicBot c04bd92c23 Leak detection threshold set to 5s. 2023-05-20 10:30:34 -04:00
MagicBot 0a31043bc9 Method refactored to use try-with-resources 2023-05-20 10:21:07 -04:00
MagicBot 27ac58518c Method refactored to use try-with-resources 2023-05-20 10:01:40 -04:00
MagicBot 8bafb32e95 Method refactored to use try-with-resources 2023-05-20 10:00:38 -04:00
MagicBot 55d9a3516c Bonus code removed and replaced with a db call actually used. 2023-05-20 09:54:37 -04:00
MagicBot b4b7b08d47 Unused method removed. 2023-05-20 09:51:35 -04:00
MagicBot 553ac01e93 Using baseline for debugging. 2023-05-20 09:43:46 -04:00
MagicBot 0e4490576a Game uses hikaricp for all connection pooling. Connection count set dynamically. 2023-05-20 09:39:23 -04:00
MagicBot 3c5ffed352 Popstring to trywithresources 2023-05-19 07:57:20 -04:00
MagicBot 8b81743cb1 Merge remote-tracking branch 'origin/magicbox1.5' into trywithpass 2023-05-19 07:32:45 -04:00
FatBoy 9b5573c210 guards get Mob.guardedCity assigned to 2023-05-18 19:59:39 -05:00
FatBoy 932daa730a guards use highbred City._playerMemory.size() and Mob.playerAgroMap to go to sleep 2023-05-18 19:54:54 -05:00
FatBoy 0b029a5f79 Merge remote-tracking branch 'origin/mobile-usage-audit' into mobile-usage-audit 2023-05-18 19:49:09 -05:00
FatBoy ac42a9cd8f removed treb override in MobileFSM.DetermineAction 2023-05-18 19:48:37 -05:00
MagicBot 4e863811a1 Removed unused methods. 2023-05-18 08:19:59 -04:00
MagicBot 90fe93d3f0 Renamed for context. 2023-05-18 08:10:54 -04:00
MagicBot 4c4a909798 Error logging added. 2023-05-18 08:00:04 -04:00
MagicBot ba0a7d35cb Error logging added. 2023-05-18 07:54:04 -04:00
MagicBot 86539771e2 Unused method. 2023-05-17 16:38:08 -04:00
MagicBot 8a8136b8e8 Unused methods. 2023-05-17 15:18:47 -04:00
MagicBot 8916d9b4f0 Begin try-with-resources cleanup. 2023-05-17 15:11:26 -04:00
FatBoy 92015c1a13 guards no longer ignore early exit. FSM will not run if no players are online. mobs will use translocate instead of recall power. 2023-05-15 19:01:43 -05:00
MagicBot 80d45f364a Added pool size to hourly metrics. 2023-05-15 10:45:22 -04:00
MagicBot 3a59df6ac6 Update to console output. 2023-05-15 06:17:16 -04:00
MagicBot c3f059c7fc Update to console output. 2023-05-15 06:12:35 -04:00
MagicBot b3ba8f5c9f Try block no longer needed. 2023-05-15 06:08:16 -04:00
MagicBot cd9b8536cb Using color instead of int value. 2023-05-15 06:03:13 -04:00
MagicBot 3a2695703b Using color instead of int value. 2023-05-15 05:48:41 -04:00
MagicBot e4ddcdeeca Building offset added to loc. 2023-05-13 13:17:47 -04:00
MagicBot 69f3c9af71 Bonus code deleted from stuck job. 2023-05-13 13:08:36 -04:00
MagicBot 6a41c5391d Bonus code deleted from stuck job. 2023-05-13 12:59:05 -04:00
FatBoy d9c05fa622 magical rolling re-enabled 2023-05-12 21:14:41 -05:00
MagicBot ee1fc0d55c Bypass npc guild leaders in override.. 2023-05-12 08:27:00 -04:00
MagicBot 7f086fb850 Improved error logging. 2023-05-12 08:15:25 -04:00
MagicBot fafd77c661 Improved error logging. 2023-05-12 08:09:17 -04:00
MagicBot d99fc602d5 NPC table overrides for contracts. 2023-05-11 09:07:35 -04:00
FatBoy 99a82a6b84 enemy/notenemy aggro rules finalized 2023-05-10 18:33:03 -05:00
FatBoy 60c2405cad mobs now use enemy/notenemy for aggro rules 2023-05-09 21:11:51 -05:00
FatBoy 27a6a1f4d0 guards' sleeping pill wore off 2023-05-09 20:59:49 -05:00
FatBoy 584ad46b75 duplicate zoneMobSet additions fixed 2023-05-09 20:27:24 -05:00
FatBoy f99698feda duplicate zoneMobSet additions fixed 2023-05-09 19:57:34 -05:00
FatBoy b3c7db9214 Merge branch 'magicbox1.5' into feature-guard-patrol 2023-05-09 18:40:04 -05:00
MagicBot 7168813ba5 Tweak to set model logic. 2023-05-09 15:16:24 -04:00
MagicBot 8068082768 Naming logic changed to have a valid guild. 2023-05-08 09:29:11 -04:00
MagicBot 322b88a1f4 Naming logic changed to have a valid guild. 2023-05-08 09:20:56 -04:00
MagicBot f85fb8f224 bugfix in ./remove dev cmd. 2023-05-08 08:18:12 -04:00
FatBoy 76f3d2599b NPCs in buildings show correct spawn times and progress 2023-05-07 19:40:38 -05:00
FatBoy 92a0af8dbb guard minion spawn timer scaling off barracks rank 2023-05-07 17:14:47 -05:00
FatBoy fb2205d700 remove player formn cityoutlaws when they leave 2023-05-07 12:41:31 -05:00
FatBoy 526fe799f6 remove player formn cityoutlaws when they leave 2023-05-07 12:34:01 -05:00
FatBoy 0c9bb0d948 initialize cityOutlaws 2023-05-07 12:20:50 -05:00
FatBoy d6a35a577b mobs use hate value to hot swap targets 2023-05-07 12:15:38 -05:00
FatBoy 508fac6168 mobs use hate value to hot swap targets 2023-05-07 12:06:54 -05:00
FatBoy 7c47ef0550 mobs use hate value to hot swap targets 2023-05-07 12:06:03 -05:00
FatBoy e838bb641b mobs use hate value to hot swap targets 2023-05-07 11:53:00 -05:00
MagicBot e73f4cbe63 Placement bounds of 1.2% city zone size. 2023-05-07 10:55:27 -04:00
MagicBot ffafd44fa7 Siege bounds related bonus code removal. 2023-05-07 10:20:53 -04:00
FatBoy c54aa5f9fc guard aggro rules for hostiles 2023-05-07 08:35:11 -05:00
FatBoy b899708cd5 removed obvious bug in guards dropping aggro 2023-05-07 08:12:42 -05:00
FatBoy 14f98493c7 guard minions no longer respawn while captain is dead 2023-05-07 08:06:15 -05:00
FatBoy c7e470166d guard captain and wall archer spawn times hard set at 450 and 900 respectively 2023-05-07 08:02:52 -05:00
FatBoy db218139b3 scaling respawn timer for guard minions based on barracks rank 2023-05-07 07:58:52 -05:00
MagicBot b73eae787c Rotation portals 2023-05-07 08:13:41 -04:00
FatBoy df842a2209 Merge branch 'magicbox1.5' into feature-guard-patrol 2023-05-06 15:54:45 -05:00
FatBoy 64bde9c197 guard reverse KoS logic 2023-05-06 15:53:35 -05:00
FatBoy 6cf599f6bc guard reverse KoS logic 2023-05-06 14:52:10 -05:00
FatBoy d9adef611d mob movement logic update 2023-05-06 13:03:00 -05:00
FatBoy 9ffc09ac02 mob movement logic update 2023-05-06 12:14:28 -05:00
MagicBot a113295058 Player zone radius now reflects 24.3 at 875. 2023-05-05 08:51:49 -04:00
FatBoy 7e5cef2842 guard patrol point logic 2023-05-03 21:20:30 -05:00
FatBoy 969aeec1c7 guard patrol point logic 2023-05-03 21:19:49 -05:00
FatBoy e66b25f803 update isMoving for mobs still at their bind loc 2023-05-03 21:02:38 -05:00
FatBoy 7f9cc6e010 guard patrol work 2023-05-03 20:38:42 -05:00
FatBoy 964e7a4363 guards will now recall home if they leave city grid and have no players loaded 2023-05-03 19:50:52 -05:00
FatBoy aec0115d9b Added random city grid patrol point for guards with no barracks patrol points assigned 2023-05-03 19:43:58 -05:00
MagicBot 3191c20a8c Captain slot no longer overridden. 2023-05-03 18:31:20 -04:00
MagicBot 2a52f9adef slottest function expanded. 2023-05-03 18:20:47 -04:00
MagicBot c44cddfb92 slottest function expanded. 2023-05-03 18:12:19 -04:00
MagicBot 9649538a56 slottest function expanded. 2023-05-03 18:07:06 -04:00
MagicBot d5ca5993aa slottest function expanded. 2023-05-03 18:06:28 -04:00
MagicBot ce7b203b9c slottest function expanded. 2023-05-03 18:04:42 -04:00
MagicBot 294f8fe02b Override removed edge case handed in db. 2023-05-03 16:17:53 -04:00
MagicBot 21c6695a05 Arty captains hardcoded to slot 4. 2023-05-03 15:44:46 -04:00
MagicBot 6fb30928a1 Bugfix in slottest command. 2023-05-03 14:43:49 -04:00
MagicBot 033c008263 bugfix: bow restriction limited to attacker. 2023-05-03 14:25:30 -04:00
MagicBot 7dcefdf5d7 Contract moved to AbstractCharacter.
Arty tower restricted to a single tower captain.
2023-05-02 15:09:09 -04:00
MagicBot f526bda748 Slot one is reserved on arty towers. 2023-05-02 14:51:02 -04:00
MagicBot 7a3e3b394b Slot two is reserved on arty towers. 2023-05-02 14:44:22 -04:00
MagicBot e488627fcc Slot one is reserved on arty towers. 2023-05-02 14:29:58 -04:00
MagicBot 82aeba3a05 NPC rotations inherit building rotation. 2023-05-02 13:51:31 -04:00
MagicBot c56d5567f2 bugfix in quaternion math. 2023-05-02 13:21:40 -04:00
MagicBot 52160d48c4 Adding building rotation to mobile rotation. 2023-05-02 13:17:34 -04:00
MagicBot ce516f24c0 Contracted Mob/Npc rotation derived from slot position. 2023-05-02 13:08:02 -04:00
MagicBot a3c8241b8d Unused methods removed. 2023-05-02 12:40:51 -04:00
MagicBot 10a6eec3da more Bonus Code removal. 2023-05-02 12:26:34 -04:00
MagicBot 715abf1444 Building Location rotations are now a quaternion. 2023-05-02 09:10:41 -04:00
MagicBot e745c260f0 Positive rotation not negative. 2023-05-02 08:46:43 -04:00
MagicBot b7c2e09b81 Rotation slot location by building rotation. 2023-05-02 08:39:03 -04:00
MagicBot 48172fb220 Rotation slot location by building rotation. 2023-05-02 08:26:43 -04:00
MagicBot 0aabc9a923 Bonus code removal. 2023-05-02 08:13:45 -04:00
MagicBot 44b99a8781 It's w not y. 2023-05-01 15:58:04 -04:00
MagicBot 5d6e43313b slotnpc dev command now supports both mobs and npc's. 2023-05-01 15:23:42 -04:00
MagicBot c1c660fd53 Switching back to ASC for slot ordering. 2023-05-01 14:59:24 -04:00
MagicBot 1582d36222 Switching to desc for slot ordering. 2023-05-01 14:54:02 -04:00
MagicBot 11bcd26027 Loading pirate names before world objects 2023-05-01 14:43:06 -04:00
MagicBot b8eb198b09 Pirate name related code moved to NPCmanager. 2023-05-01 14:28:02 -04:00
MagicBot c0521ba2b7 null check for building owner. 2023-05-01 14:10:09 -04:00
MagicBot 59cd2b0dc1 Bonus code removal. 2023-05-01 13:55:06 -04:00
MagicBot 611e34add2 Merge remote-tracking branch 'origin/char-init-mobwork' into char-init-cleanup 2023-05-01 12:45:05 -04:00
MagicBot 16adeb88ca Merge remote-tracking branch 'origin/magicbox1.5' into char-init-cleanup 2023-05-01 12:43:28 -04:00
FatBoy 566bb8144a were guard contract ID in enum 2023-04-30 17:17:20 -05:00
FatBoy 0b932119b0 guard work 2023-04-30 16:54:39 -05:00
FatBoy 9fefebd4a3 wild mob naes and world NPC names corrected 2023-04-30 16:19:53 -05:00
FatBoy d4e7a6691c removed unused nameOverride variable 2023-04-30 16:12:00 -05:00
FatBoy ad4f9d3540 player placed NPCs now show correct names 2023-04-30 16:09:17 -05:00
FatBoy 6868c9de24 player placed mobiles now show correct names 2023-04-30 16:05:48 -05:00
FatBoy 56a6b9d204 guard minion logic work 2023-04-30 15:04:12 -05:00
FatBoy e52b8e894b guard minion logic work 2023-04-30 14:55:12 -05:00
FatBoy 0bc41323b1 guard minions added to captains parentZone.zoneMobSet 2023-04-30 13:47:15 -05:00
FatBoy 3a7ad74ab6 wall archers no longer spawn with level * 10 2023-04-30 13:35:25 -05:00
FatBoy 7ed0b8a052 wall archers given BehaviourType in initializeMob 2023-04-30 13:03:41 -05:00
FatBoy 718fe56cda drops no longer announce on mob death && config drop rate used for mob equipment drop chance 2023-04-30 12:27:02 -05:00
MagicBot eee949de93 Naming update. 2023-04-30 10:55:16 -04:00
MagicBot b5e2848091 Location serialization matches NPC 2023-04-30 10:20:21 -04:00
MagicBot 1ab8540f73 Location serialization matches NPC 2023-04-30 09:32:34 -04:00
MagicBot c029a881e9 Location serialization matches NPC 2023-04-30 09:23:56 -04:00
MagicBot 334a706af3 Update to info output. 2023-04-30 09:08:03 -04:00
MagicBot 1e208c0881 Update to info output. 2023-04-30 09:02:50 -04:00
MagicBot 61b87cbba7 Merge branch 'char-init-cleanup' of http://repo.magicbane.com/MagicBane/Server into char-init-cleanup 2023-04-30 08:52:39 -04:00
MagicBot d1d6972930 Debug code removed; issue resolved. 2023-04-30 08:51:35 -04:00
MagicBot 72e823744c Some meshes might not have slot locations. 2023-04-30 08:38:59 -04:00
MagicBot 4985005b3e Debug null value. 2023-04-30 08:37:08 -04:00
MagicBot ce8d5f0129 Debug null value. 2023-04-30 08:28:36 -04:00
MagicBot 9c83e6f9d9 Removed name override logic. 2023-04-30 08:18:38 -04:00
MagicBot 21241aa5df One serialization not 3. 2023-04-30 08:02:28 -04:00
MagicBot 54e4f08ea2 One serialization not 3. 2023-04-30 07:57:19 -04:00
MagicBot e18c046ee7 Parent zone required by db handler. 2023-04-30 07:41:11 -04:00
MagicBot 4365fafb77 Tweak to name derivation in constructor 2023-04-29 16:32:12 -04:00
MagicBot a3217f44be Code bloc moved out of constructor. 2023-04-29 16:24:19 -04:00
MagicBot da62046ce0 Unused parm in method interface removed. 2023-04-29 16:21:02 -04:00
MagicBot b9722ec292 more old hireling code removed. 2023-04-29 16:06:05 -04:00
MagicBot cfb4f38d15 Contact npcs/mobs have derived locations. 0x0 in cache data. 2023-04-29 16:02:22 -04:00
MagicBot 48d66a0d42 Integer division fix. Class cleanup. 2023-04-29 15:40:50 -04:00
MagicBot d454878245 BuildingModelBase no longer needed. 2023-04-29 15:15:23 -04:00
MagicBot cace195e18 Logic and comment cleanup. 2023-04-29 14:36:39 -04:00
MagicBot 129aff909c Update; mobile offsets within buildings. 2023-04-29 14:25:36 -04:00
MagicBot 6cfd078469 Removed old methods from codepath. 2023-04-29 14:00:24 -04:00
MagicBot 4acc4192af Initial work on Mobile init refactor. 2023-04-29 13:57:09 -04:00
MagicBot e554171e22 Duplicate region field removed and inlined. 2023-04-29 12:33:21 -04:00
MagicBot de38c8727a Debugging region 2023-04-29 12:14:35 -04:00
MagicBot 0a78958e44 Debugging region 2023-04-29 12:02:37 -04:00
MagicBot 353cd0ab23 Serialization revert. 2023-04-29 11:24:32 -04:00
MagicBot b73c8e9045 Floor and level no longer read from db. 2023-04-29 10:59:13 -04:00
MagicBot 5729492c6a NPC derives position from slot. 2023-04-29 10:30:53 -04:00
MagicBot 0c45e6d36f Serialization update. 2023-04-29 09:53:12 -04:00
MagicBot 677988ea44 Add new npc to world. 2023-04-29 09:35:00 -04:00
MagicBot c30ca2fb1f Comment cleanup. 2023-04-29 09:21:58 -04:00
MagicBot cd9d7f7652 Set bindloc to slot location. 2023-04-29 09:19:22 -04:00
MagicBot 84e24b4951 Set bindloc to slot location. 2023-04-29 09:17:14 -04:00
MagicBot ef367c2981 Array index not 1 2023-04-29 09:07:48 -04:00
MagicBot ec10ac7ba5 Region now set in initNpc 2023-04-29 08:59:29 -04:00
MagicBot 4bbe1db54a Bindloc for non slotted npcs. 2023-04-29 08:58:26 -04:00
MagicBot 3494ae1e6b Bindloc for non slooted npc's. 2023-04-29 08:55:12 -04:00
MagicBot 123f9eb588 SetParentZone removed from NPC. 2023-04-29 08:47:35 -04:00
MagicBot 40e4770425 inBuildingLoc removed. 2023-04-29 08:24:28 -04:00
MagicBot ed0f9daef3 Slotting helper methods added. 2023-04-29 08:17:05 -04:00
MagicBot beb9d5927e Iteration bugfix. 2023-04-29 08:10:59 -04:00
MagicBot 225e55d956 Slots will be derived not stored. 2023-04-29 08:08:45 -04:00
MagicBot 2114d9832f Redundant declaration and assignment. 2023-04-25 09:00:13 -04:00
MagicBot b6b1485841 Removed temp in-building loc due to null. 2023-04-24 17:35:56 -04:00
MagicBot c4f939278a Devcmd now displays inbuilding loc. 2023-04-24 17:29:48 -04:00
MagicBot 195a7e2cea Devcmd now displays inbuilding loc. 2023-04-24 17:28:21 -04:00
MagicBot dc868305f0 Using new db loader. 2023-04-24 17:14:37 -04:00
MagicBot c60a4d8d39 Bugfix for contract-less npc owners. 2023-04-24 17:08:03 -04:00
MagicBot de7e3ba73d Hashmap to add to was added. 2023-04-24 16:49:41 -04:00
MagicBot 4d76014633 Dev cmd to test new system. 2023-04-24 16:41:25 -04:00
MagicBot 320d95ae2f Default value for npc slot. 2023-04-24 16:26:30 -04:00
MagicBot 6d73e12c5c Slot added to stored procedures. 2023-04-24 16:23:13 -04:00
MagicBot 0513cc978e Helper method for slot lookup added. 2023-04-24 16:17:55 -04:00
MagicBot 7c079c3998 Begin refactor location collections. 2023-04-24 15:37:30 -04:00
MagicBot d729fbb287 Captain slot issue in db rectified. 2023-04-24 14:06:17 -04:00
MagicBot 14c98d9376 Blueprint support for OuterWallWithTower 2023-04-24 12:04:39 -04:00
MagicBot 888fa25e9a Blueprint support for OuterWallWithTower 2023-04-24 11:55:29 -04:00
MagicBot 5a0136cd3d Cleanup and bonus code removal. 2023-04-24 09:42:01 -04:00
MagicBot 3419c1ceea Refactored isWallArcher(). 2023-04-24 09:22:01 -04:00
MagicBot 4ae55b9bd8 Removed leftover junk from mobbase. 2023-04-24 03:38:04 -04:00
MagicBot 6b146bfdc4 Removed leftover junk from mobbase. 2023-04-24 03:26:35 -04:00
FatBoy 620fad57fe Mob equipment drops once more, including vorg with proper chance 2023-04-23 22:07:54 -05:00
FatBoy f24605735e renamed "run" in MobileFSM to "DetermineAction" 2023-04-23 20:41:43 -05:00
FatBoy 7e9e0d2c5b MobileFSM cleanup and bonus code removal 2023-04-23 20:38:28 -05:00
FatBoy 1487efc46b Mob.java cleanup 2023-04-23 20:19:17 -05:00
FatBoy 2df4f658c9 Mob.java cleanup 2023-04-23 20:16:30 -05:00
MagicBot 4462e34ca4 mobbase.fsm should never be blank. 2023-04-23 12:03:46 -04:00
MagicBot 4adfbc0723 Refactored to static methods. 2023-04-23 11:19:34 -04:00
MagicBot c0e92bddc2 Level override removed. 2023-04-23 10:40:19 -04:00
MagicBot 40b7546946 More useful error information. 2023-04-23 10:27:04 -04:00
MagicBot 59e3938a72 Removed unused method. 2023-04-23 10:01:18 -04:00
MagicBot 513c254479 Correction in column name. 2023-04-23 09:45:03 -04:00
MagicBot df7b23c0de Extra override removed from constructor. 2023-04-23 09:38:49 -04:00
MagicBot edd1c0e9a6 Name/level saved to disk when slotting mobiles. 2023-04-23 09:30:29 -04:00
MagicBot 0a783f7561 pirateName and Rank added to CreateMob interface. 2023-04-23 08:51:49 -04:00
MagicBot 235ea84dcd Value is not unknown from handler context. 2023-04-23 07:48:10 -04:00
FatBoy 3e005c3a51 NPC have names and contract names 2023-04-22 23:20:24 -05:00
FatBoy 88e09c479f wall archers no longer spawn minions 2023-04-22 23:12:45 -05:00
FatBoy 83eab27a90 proper NPC names in asset management window 2023-04-22 22:44:13 -05:00
FatBoy c02c5750c6 proper contract names in asset management window 2023-04-22 22:10:06 -05:00
FatBoy 09d7ff0740 make wall archers great again 2023-04-22 21:55:06 -05:00
FatBoy ed1a6192c7 enemy/notEnemy fix for mobs 2023-04-22 18:24:43 -05:00
FatBoy ae968211ab none to enum MonsterType 2023-04-22 18:13:29 -05:00
FatBoy a3170bfb4b test code for notEnemy 2023-04-22 18:08:40 -05:00
FatBoy 344c5900b8 added none check to enemy and notEnemy in mobbase 2023-04-22 17:52:55 -05:00
FatBoy 1d74643fe3 None added to enum MonsterType 2023-04-22 17:49:26 -05:00
FatBoy 38e5081b0e moved createSiegeMob and createGuardMob to the Mob class 2023-04-22 17:16:34 -05:00
MagicBot 8fa20c6f93 Cleanup in mob class. 2023-04-22 07:52:05 -04:00
FatBoy 45ab68caa4 trebuchets now have pet AI with canRoam disabled 2023-04-21 20:12:49 -05:00
FatBoy 3329d61636 fixed error in initialize mob 2023-04-21 18:23:52 -05:00
FatBoy 5299da784a mob respawn fix actual 2023-04-21 15:17:37 -05:00
FatBoy e5b7bd1fa6 mob respawn fix 2023-04-21 12:56:09 -05:00
FatBoy 881907c53a AggroWanderer and Wandered state updates 2023-04-21 10:47:49 -05:00
FatBoy 6a03b58aa6 pet AI logic 2023-04-21 10:44:19 -05:00
FatBoy e38be1e18f pet movement logic 2023-04-21 10:20:38 -05:00
FatBoy 1ff42b775c added hamlet guard logic 2023-04-21 10:02:09 -05:00
FatBoy cfe8d20d2b added barracks list to city object 2023-04-20 21:23:42 -05:00
FatBoy aa8f59f6f7 wall archer debugging 2023-04-19 19:05:24 -05:00
FatBoy f3b6f5595b logic for wall archers fix 2023-04-18 20:54:53 -05:00
FatBoy 0448448263 logic for wall archers 2023-04-18 20:52:33 -05:00
FatBoy 0914580bea Gave Wall Archers mob AI 2023-04-18 20:47:49 -05:00
FatBoy 914575a360 guard minion spawning work 2023-04-17 21:48:31 -05:00
FatBoy 259025d572 guard recall off city grid 2023-04-17 21:31:56 -05:00
FatBoy aa3c70ae31 guard minions AI 2023-04-17 20:51:34 -05:00
FatBoy 2f4b675a2c added mob fsm data to mob 2023-04-17 19:15:08 -05:00
MagicBot 662d1d2b85 Enum moved to Enum.
Updated logic in rs constructor to handle blanks properly.
2023-04-17 07:20:39 -04:00
FatBoy 6e92836deb GuardCaptain aggro rules 2023-04-16 21:48:21 -05:00
FatBoy b1bd09bfc4 GuardCaptain flag in run after load 2023-04-16 20:52:37 -05:00
FatBoy 7e08a3d8ab GuardCaptain flag when slotting in barracks 2023-04-16 20:44:28 -05:00
FatBoy cb5c2c668a load guard in barracks 2023-04-16 20:36:51 -05:00
FatBoy c93f932caa fixed spelling error in MObBehaviourType enum 2023-04-16 19:59:13 -05:00
FatBoy f855ec9a19 fsm lookup changes 2023-04-16 19:50:59 -05:00
FatBoy 6817c3dffe moved fsm lookup to runAfterLoad 2023-04-16 19:45:55 -05:00
FatBoy c17f745461 moved fsm lookup to runAfterLoad 2023-04-16 19:45:17 -05:00
FatBoy 664b5fea73 logger addition for mob 2023-04-16 19:40:33 -05:00
FatBoy 3c118ed88b unecessary try removal 2023-04-16 19:29:14 -05:00
FatBoy 1d965c0785 remove test code, added guard captain and minion behaviour flags 2023-04-16 19:27:18 -05:00
FatBoy 37ccfaa509 Merge remote-tracking branch 'origin/magicbox1.5' into new-mob-behaviour 2023-04-16 19:16:05 -05:00
FatBoy eb20d926e3 guard aggro logic 2023-04-16 18:58:55 -05:00
FatBoy 0ee7507467 new chase logic for mobs 2023-04-16 13:30:46 -05:00
FatBoy c1bba30dec cleanup old patrol code 2023-04-16 13:24:22 -05:00
FatBoy db0e9d1847 add random 10-15 delay between patrolling for mobs 2023-04-16 13:23:42 -05:00
FatBoy ef74d1ae8c init. patrol points list 2023-04-16 13:07:28 -05:00
FatBoy 0779fbab87 implement new patrol system 2023-04-16 13:03:42 -05:00
FatBoy 028135f859 new mob patrolling system 2023-04-16 12:48:23 -05:00
FatBoy cfa59d8012 pet AI implemented 2023-04-15 22:04:55 -05:00
FatBoy ca40d7a71d added ./aiinfo command for debugging new AI system 2023-04-15 20:53:47 -05:00
FatBoy ccd6032c15 added ./aiinfo command for debugging new AI system 2023-04-15 20:36:56 -05:00
FatBoy ecec3833c4 added ./aiinfo command for debugging new AI system 2023-04-15 20:31:13 -05:00
FatBoy 98eb557c58 added none to behaviour type for mobs and defuated RS constructor for mobs 2023-04-15 20:03:17 -05:00
FatBoy f75323e7e2 LootManager cleanup + say message for mobs calling for help 2023-04-15 12:21:31 -05:00
FatBoy c8c275bcd5 added equip dropping on mobs to LootManager 2023-04-15 11:52:19 -05:00
FatBoy ca9a72e338 cleaned up testing code 2023-04-14 20:53:21 -05:00
FatBoy aaff8e7d6b cleaned up some aggro rules 2023-04-14 20:50:47 -05:00
FatBoy f9205eb4e2 added default behaviourType to "Simple" for mobs. added respawn logic 2023-04-14 19:20:12 -05:00
MagicBot de3818aef6 Equip lookups now use bootymap 2023-04-14 18:19:43 -04:00
MagicBot 5d0166a29a EquipmentSets merged into bootySet system. 2023-04-14 16:46:10 -04:00
FatBoy 98f0928a4b replaced MobileFSM.STATE with MobileFSM.MobBehaviourTypes 2023-04-11 19:53:13 -05:00
MagicBot 23a07175e5 Single map color stored as hex string. 2023-04-10 13:27:27 -04:00
MagicBot beff5c3e06 Refactored aggro system to use Monstertype. 2023-04-09 18:16:36 -04:00
MagicBot 6b62c90bc8 NONE is not needed for a BitSet. 0 is just empty. 2023-04-09 14:06:57 -04:00
MagicBot ef6bb65e73 NONE is not needed for a BitSet. 0 is just empty. 2023-04-09 14:06:03 -04:00
MagicBot 6f82ee24d9 MonsterType fields added to ./info 2023-04-09 13:58:29 -04:00
MagicBot 97165bbdfe Aggro fields combined in RunAfterLoad 2023-04-09 13:55:46 -04:00
MagicBot 30175be56a MonsterTypes loaded into Mob. 2023-04-09 13:43:12 -04:00
MagicBot 4fe6040707 enemy/notEnemy bitvectors loaded into mobbase. 2023-04-09 13:31:42 -04:00
MagicBot aaa67ec635 new MonsterType bitvector added. 2023-04-09 13:20:03 -04:00
FatBoy 93f6d0be0b new loot system completed 2023-04-08 21:49:17 -05:00
FatBoy fe953aa8c4 simulatebooty command added data output 2023-04-08 18:05:46 -05:00
FatBoy 902376b517 simulatebooty command added data output 2023-04-08 17:54:53 -05:00
FatBoy e56c534d2b simulatebooty command added data output 2023-04-08 17:20:57 -05:00
FatBoy 74fe401ff1 revert simulatebooty command 2023-04-08 17:18:35 -05:00
FatBoy 862230008e revert simulatebooty command 2023-04-08 17:15:34 -05:00
FatBoy 93cd329f20 simulate booty command work 2023-04-08 15:33:51 -05:00
FatBoy c550360a43 simulate booty command work 2023-04-08 15:25:45 -05:00
FatBoy 2e3c9e703b added parameter to simulateBooty command to simulate mob or zone booty and added custom iteraion input 2023-04-08 14:53:56 -05:00
FatBoy dffc16f5ce mob roll range formula 2023-04-08 14:19:47 -05:00
MagicBot f47eb63057 Merge remote-tracking branch 'origin/magicbox1.5' into new-booty-system 2023-04-08 10:48:13 -04:00
MagicBot 9d6b3ab3ff Merge remote-tracking branch 'origin/bugfix-runesandbooties' into magicbox1.5 2023-04-08 06:26:39 -04:00
FatBoy b18994a7c0 simulate booty command work 2023-04-07 22:04:39 -05:00
FatBoy e483280a3c simulate booty command work 2023-04-07 21:41:03 -05:00
FatBoy 0bb3c84fed enable simulateBooty command 2023-04-07 19:50:49 -05:00
FatBoy 2eb9705c3a added simulatbooty command for debugging loot 2023-04-07 19:36:51 -05:00
FatBoy ec37e1f9f9 drop chance work 2023-04-07 18:43:45 -05:00
FatBoy b4002fa1a5 added resources to drop tables 2023-04-07 15:41:40 -05:00
FatBoy a7dccb6301 chase null pointer 2023-04-07 14:48:15 -05:00
FatBoy 2827db5db5 prefix/suffix usage for mob loot 2023-04-07 13:56:28 -05:00
FatBoy 460a2152c8 MobLoot usage 2023-04-07 13:38:09 -05:00
FatBoy 5edbc81934 MobLoot usage 2023-04-07 13:09:15 -05:00
FatBoy 335484944f variable naming convention 2023-04-07 12:22:33 -05:00
FatBoy 8b6bc38082 error tracking 2023-04-07 12:05:01 -05:00
FatBoy b51843942b error tracking 2023-04-07 11:36:52 -05:00
FatBoy a0310b6767 added case staement for "ITEM" 2023-04-07 11:32:53 -05:00
FatBoy 2b90679087 new booty system update 2023-04-07 11:22:14 -05:00
FatBoy d951eb4b38 cleanup 2023-04-06 21:06:23 -05:00
FatBoy 847c8bc08f loot system debugging 2023-04-06 20:35:03 -05:00
FatBoy 5efb5d0d4b remove old loot system 2023-04-06 20:28:47 -05:00
FatBoy 0d7620900b loot system implementation 2023-04-06 20:18:31 -05:00
FatBoy dfd0d7e668 new loot system 2023-04-06 20:10:42 -05:00
FatBoy 1be669aa66 Merge branch 'bugfix-runesandbooties' into new-booty-system
# Conflicts:
#	src/engine/objects/MobBase.java
2023-04-06 20:08:29 -05:00
FatBoy 95352e778d place holder 2023-04-06 20:07:24 -05:00
MagicBot 88bf38b858 Mobbase updated with new booty and fsm fields. 2023-04-06 20:58:13 -04:00
FatBoy 16fb40e104 Merge remote-tracking branch 'origin/magicbox1.5' into new-booty-system 2023-04-06 19:41:19 -05:00
MagicBot d0279599f6 BootySets expanded to handle rune booty. 2023-04-06 18:08:01 -04:00
FatBoy bfb6b0f5eb ./info now shows building information not just region 2023-04-06 09:44:34 -05:00
FatBoy 3f8d772f8f treb troubleshooting 2023-04-05 20:29:34 -05:00
FatBoy 07e993b0ba NPC and mob regions for real this time 2023-04-05 20:06:28 -05:00
FatBoy 1169f44041 NPC and mob regions 2023-04-05 20:04:04 -05:00
MagicBot 563fe8684a Workaround for mob region issue. 2023-04-05 20:20:23 -04:00
MagicBot a85391e5a4 Workaround for mob region issue. 2023-04-05 19:49:20 -04:00
MagicBot fc6f400e09 Corner trebs go into slot 1. 2023-04-05 18:32:03 -04:00
MagicBot 55fc6a68e1 Corner trebs go into slot 1. 2023-04-05 18:06:50 -04:00
MagicBot e1811c7bfc Corner trebs go into slot 1. 2023-04-05 17:41:11 -04:00
MagicBot bccbb1d8b7 Mobs are not hirelings but minions in this context. 2023-04-05 17:06:08 -04:00
MagicBot 2b214f8934 Bugfix in string output. 2023-04-04 18:14:54 -04:00
MagicBot 6a5f0596e0 Unused variable removed. 2023-04-04 18:11:07 -04:00
MagicBot 8f87bc5ca0 Bugfix in info dealing with mob flags on npcs. 2023-04-04 18:06:32 -04:00
MagicBot a0e63cde8f Bugfix in info dealing with mob flags on npcs. 2023-04-04 17:52:26 -04:00
MagicBot 94e3a594ec Mobbases can have empty mobflag values. 2023-04-04 17:38:52 -04:00
MagicBot bbf0709643 Mobbases can have empty mobflag values. 2023-04-04 17:30:56 -04:00
MagicBot 4492a93df4 Clarity in naming. 2023-04-04 16:26:47 -04:00
MagicBot 65e7566d0f More slotting work. 2023-04-04 15:36:56 -04:00
MagicBot 1c496b3c98 More slotting work. 2023-04-04 15:13:18 -04:00
MagicBot ee115a473d Exclude not include noId npc's. 2023-04-04 14:57:07 -04:00
MagicBot 5a4559d7b2 ContractID for captain is 850 not 650. 2023-04-04 14:47:23 -04:00
MagicBot 3b69c8c267 Tower captains don't use slot 1. 2023-04-04 14:41:01 -04:00
MagicBot 14c4443f20 loadID is needed; different mob. 2023-04-04 13:56:34 -04:00
MagicBot a01a342fd8 Affirmatively check hireling entry instead of relying upon loadID =0 which was a side effect. 2023-04-04 13:48:56 -04:00
MagicBot 1cb103c156 Slots are slots; blueprint logic not needed on back-end. 2023-04-04 11:08:07 -04:00
MagicBot 84bae3141c Slots are slots; blueprint logic not needed on back-end. 2023-04-04 10:48:17 -04:00
MagicBot 307f52866d Merge remote-tracking branch 'origin/bugfix-runesandbooties' into magicbox1.5 2023-04-04 10:33:18 -04:00
MagicBot 7ef338be1d Bugfix in slotting blueprint buildings 2023-04-04 10:31:59 -04:00
MagicBot 385b89e6ba Two layered continent support. 2023-04-03 15:56:36 -04:00
MagicBot 41a53d1205 Merge remote-tracking branch 'origin/bugfix-runesandbooties' into magicbox1.5 2023-04-03 12:30:49 -04:00
MagicBot a85bbde9d2 Mobbase runes no longer needed. 2023-04-03 06:27:29 -04:00
FatBoy 13d83c0003 NPC guards no longer attack players 2023-04-02 15:51:39 -05:00
MagicBot f21e51f74a Optimized imports (getting close to release) 2023-03-31 10:08:44 -04:00
MagicBot 045840ec54 Last vestige of FidalityID garbage and raw cache files removed. 2023-03-31 10:05:13 -04:00
MagicBot 4e1455be7f Hunt for more fidality insanity. 2023-03-31 10:01:59 -04:00
MagicBot 3881c2b1d0 Relevant methods made static and moved into NPCManager 2023-03-31 09:59:49 -04:00
MagicBot bbdbead1ff Fidaltiy garbage removed from NPC class. 2023-03-31 09:17:15 -04:00
MagicBot 24b6820a1b Fidaltiy garbage removed from NPC class. 2023-03-31 09:15:52 -04:00
MagicBot 2b307daeb2 MobileBooty system integrated. 2023-03-31 09:09:57 -04:00
MagicBot fb15ee912b Clarity fix in instance variable ordering. 2023-03-31 08:01:14 -04:00
MagicBot 3b7c516975 Merge remote-tracking branch 'origin/post-wipe-merge' into bugfix-runesandbooties 2023-03-30 20:56:42 -04:00
FatBoy 33603958b1 fixed hotzone drop tables never being used 2023-03-30 19:44:44 -05:00
MagicBot f669be18b3 Unused MobRaceType enum removed. 2023-03-30 11:51:59 -04:00
MagicBot dcae131b67 Removed Fidality garbage. Fixed mobs in buildings. 2023-03-30 11:07:57 -04:00
MagicBot f5d5dce791 Revert "Fidality borking mobs in buildings unborked."
This reverts commit 2befa063ef.
2023-03-30 10:34:15 -04:00
MagicBot 5a0910eb5c Revert "Fidelity > Fidality"
This reverts commit f4da8544d3.
2023-03-30 10:32:08 -04:00
MagicBot 2befa063ef Fidality borking mobs in buildings unborked. 2023-03-30 10:28:46 -04:00
MagicBot f4da8544d3 Fidelity > Fidality 2023-03-30 10:14:40 -04:00
MagicBot 60a9f14aa3 Mobbases don't need skills. 2023-03-29 18:52:36 -04:00
MagicBot 39b07df2e2 Sanity check for race rune not in runebase. 2023-03-29 17:57:37 -04:00
MagicBot 5f6883059f Cleanup rune effect application. 2023-03-29 15:42:32 -04:00
MagicBot 6b2790f9c1 Mobs have runes loaded at bootstrap and effects applied. Moved logic to NPCManager. 2023-03-29 08:05:34 -04:00
MagicBot 73d2129394 Runes and Booties ID set in constructor for mobs and npcs. 2023-03-28 18:34:42 -04:00
MagicBot 8e236d0780 BootySets generated with cache data loaded at bootstrap. 2023-03-28 18:01:46 -04:00
MagicBot 00d0048fd0 RuneSets generated loaded at bootstrap. 2023-03-28 17:45:58 -04:00
MagicBot f744c64737 Superfluous getter and setters removed. 2023-03-28 17:29:16 -04:00
MagicBot 33334ed13c NPCManager class created. 2023-03-28 17:22:57 -04:00
MagicBot 2e64164251 Bonus code removal. 2023-03-23 06:00:53 -04:00
MagicBot 03060478ee Helper method for finding next heightmap. 2023-03-22 05:41:39 -04:00
MagicBot 94b863a835 Rework of ismacro and iscontinent. 2023-03-21 03:20:57 -04:00
MagicBot ab14173aaa Account for vorringia parenting. 2023-03-21 03:09:39 -04:00
MagicBot eb5e09c3f4 Merge remote-tracking branch 'origin/bugfix-magic-numbers' into post-wipe-merge 2023-03-20 11:20:42 -04:00
MagicBot 1142676c87 Milliseconds are easier to interpret than fractions. 2023-03-16 13:00:22 -04:00
MagicBot 76af946b5f Duration string output. 2023-03-16 12:53:16 -04:00
MagicBot b6b9d7635f Using miliseconds. 2023-03-16 12:48:36 -04:00
MagicBot 68ae4604b0 Added max values to metrics. 2023-03-16 12:40:08 -04:00
MagicBot c06da74eec Nanosecond display. 2023-03-16 12:27:50 -04:00
MagicBot a4029fb6e2 Updated simulation metrics access. 2023-03-16 12:18:42 -04:00
MagicBot 3dbdad2580 Reverted changes. 2023-03-16 11:48:54 -04:00
FatBoy 626967cd86 revert 2023-03-15 18:27:13 -05:00
FatBoy 113d74cffe method to check if zone has players inside it
mob ai check if zone has no players mobs need not perform actions
2023-03-15 17:17:22 -05:00
FatBoy db71635f16 delay between mob actions to reduce synchronized appearance 2023-03-15 13:46:58 -05:00
MagicBot 177175cc1d Conditionals simplified and comment added to method. 2023-03-15 11:59:41 -04:00
MagicBot 5ddc40db3b Comment cleanup in method. 2023-03-15 11:51:28 -04:00
MagicBot 0039785a5a Comment cleanup in method. 2023-03-15 11:47:27 -04:00
MagicBot 867fdee328 Added sanity check for empty power list. 2023-03-15 10:11:01 -04:00
MagicBot f8d499f314 Fixed Concurrent Modification issue. 2023-03-15 09:39:17 -04:00
MagicBot 1945412f5a Remove needs an object not an index value. 2023-03-15 09:25:18 -04:00
MagicBot 16db4d15bc Reformatting of MobCast() method in manager. 2023-03-15 08:52:00 -04:00
MagicBot f97d9844f9 Merge branch 'new-mob-ai' of http://repo.magicbane.com/MagicBane/Server into new-mob-ai
 Conflicts:
	src/engine/ai/MobileFSM.java
2023-03-15 08:49:33 -04:00
MagicBot 7473067329 Reformatting of MobCast() method in manager. 2023-03-15 08:47:22 -04:00
FatBoy 6fe690d592 ranged mobs now stop when in proper attacking range 2023-03-14 20:53:39 -05:00
FatBoy ce381f612c mob ai Chase state completion 2023-03-14 20:34:07 -05:00
FatBoy 8c919bcd2a mob ai Chase state work 2023-03-14 20:04:05 -05:00
FatBoy 531cd52664 mob ai Chase state work 2023-03-14 18:39:59 -05:00
FatBoy dcac0634a8 added Chase to mob ai state enum 2023-03-14 13:32:41 -05:00
MagicBot e7ceeac7b8 Magic numbers are for mental patients. 2023-03-14 13:10:05 -04:00
MagicBot bbbf0c4160 Magic numbers are for mental patients. 2023-03-14 12:59:50 -04:00
MagicBot 584fde5579 Reworked the loading of Mobile powers at bootstrap. 2023-03-13 19:26:16 -04:00
MagicBot 66f0c12790 Reworked the loading of Mobile powers at bootstrap. 2023-03-13 19:19:03 -04:00
FatBoy b310a3eb63 initialize new mobpower list 2023-03-12 18:18:13 -05:00
FatBoy 03a2ead922 mob power list troubleshooting 2023-03-12 18:09:42 -05:00
FatBoy 4f60811f6b mob power list troubleshooting 2023-03-12 18:02:24 -05:00
FatBoy ec19f18d73 mob power list troubleshooting 2023-03-12 17:59:18 -05:00
FatBoy f0eb19c255 mob power list troubleshooting 2023-03-12 17:54:03 -05:00
FatBoy 604a86feb0 mob powerlist initialize directly after mobbases are loaded 2023-03-12 17:49:29 -05:00
FatBoy 3e2fbb700b initialize the static mob power list 2023-03-12 10:53:12 -05:00
FatBoy 863c782f72 moved mob powers list call above mob spawning 2023-03-12 10:50:50 -05:00
FatBoy 83eb1a3370 moved mob powers method to PowersManager 2023-03-12 10:36:38 -05:00
FatBoy 4a06f18d55 Merge remote-tracking branch 'origin/post-wipe-merge' into new-mob-ai 2023-03-12 10:29:00 -05:00
FatBoy e38a04bf23 convert DB lookup of mob powers to static Hashmap lookup 2023-03-12 10:17:25 -05:00
FatBoy 095aee57bc mob spell casting cleanup 2023-03-02 21:51:31 -06:00
FatBoy b000c9b60f generic range method added, mob spell casting cleanup 2023-03-02 21:46:02 -06:00
FatBoy e3f675a42b call for help range added (aggro range of caller) 2023-03-02 19:52:17 -06:00
FatBoy 93a91f9d41 fixed null exception in aggro 2023-03-02 19:11:51 -06:00
FatBoy 6da0df7eb7 duel wield attack system for mobs 2023-03-02 18:46:43 -06:00
MagicBot 0ce94360f7 Magicbox channel support added. 2023-03-02 08:06:17 -05:00
MagicBot 110a05d5a4 bugfix-merge issue in constructor. 2023-03-01 16:12:17 -05:00
FatBoy cfd93f2ca0 cleanup 2023-03-01 13:31:35 -06:00
FatBoy 5830a9ef82 damage calculations cleanup 2023-03-01 13:29:49 -06:00
FatBoy ea4862f76e r8 mobs now have their own mele attack parameters 2023-02-28 19:06:57 -06:00
MagicBot 7d655bc44b Mine serialized loc is the tower loc. No need to store offsets in a table to reconstruct this loc. 2023-02-28 10:43:49 -05:00
FatBoy bfa15ddee0 mob will always target self with "self target" flagged spells 2023-02-27 20:37:11 -06:00
FatBoy 028c49ac84 mob no longer cast spells with effect already on target 2023-02-27 20:22:59 -06:00
FatBoy 396e3dda28 comment 2023-02-27 18:59:08 -06:00
FatBoy e640a5064c Merge remote-tracking branch 'origin/post-wipe-merge' into new-mob-ai 2023-02-27 18:53:49 -06:00
MagicBot f0f91325ba Reset is handled when picking new hotZone. 2023-02-26 07:31:26 -05:00
MagicBot d5c219897d Experience Modifiers added to ConfigManager 2023-02-24 10:45:46 -05:00
MagicBot c51f6b73af ProductionRate added to ConfigManager. 2023-02-24 09:48:15 -05:00
MagicBot cacf67a81c lastUpdate always from top of the hour. 2023-02-24 09:08:45 -05:00
MagicBot 72a610fd0c Seconds remaining calculated only once. 2023-02-24 09:05:47 -05:00
MagicBot bbbd5f8996 Time remaining is from now(). 2023-02-24 08:48:36 -05:00
MagicBot 994db1e131 Class renamed to fix case. 2023-02-24 08:45:03 -05:00
MagicBot 4422182eae Reset logic moved to within method. 2023-02-24 08:34:25 -05:00
MagicBot 7a2c0d3456 Work variable cleanup. 2023-02-24 01:26:39 -05:00
MagicBot 8fde121570 lastHotZoneUpdate instant moved to ZoneManager. 2023-02-24 01:22:00 -05:00
MagicBot 3260582e37 validHotZone filters hotZone count. 2023-02-24 01:04:29 -05:00
MagicBot 52e46380a9 Available hotZones added to devcmd. 2023-02-24 00:49:03 -05:00
MagicBot a572a5fbf9 Available hotZones added to devcmd. 2023-02-24 00:42:34 -05:00
MagicBot 176fdb51da HotZone availability reset at 01am. 2023-02-24 00:32:18 -05:00
MagicBot 6a948fbe2e lastChanged is unused as cannot omit mines from map. 2023-02-24 00:09:57 -05:00
MagicBot 2ef60933b2 reset added to ./hotzone 2023-02-23 17:47:22 -05:00
MagicBot 85798822cc Force serialize mines. 2023-02-23 17:37:14 -05:00
MagicBot 0dad677bc0 hotzone dev command updated. 2023-02-23 17:14:34 -05:00
MagicBot 4c625cdfbf HotZone minLevel enforced. 2023-02-23 16:46:55 -05:00
MagicBot 6912a06351 MB_HOTZONE_MIN_LEVEL added to ConfigManager 2023-02-23 16:38:23 -05:00
MagicBot 2e576b3065 Increment only when a hotZone is set. 2023-02-22 17:35:30 -05:00
MagicBot dc23755081 Use of Instant to track hotzone refresh times. 2023-02-22 17:25:48 -05:00
MagicBot 8ae973f5f4 Refactored usage of HotZone; added cycle counter. 2023-02-22 16:40:11 -05:00
MagicBot 6ac1911770 Code cleanup; reworked conditional. 2023-02-22 08:38:18 -05:00
MagicBot f723e35785 Reformatted file. 2023-02-22 08:34:10 -05:00
MagicBot 4db45a9cbf Handler created for cityDataMsg.java 2023-02-22 08:23:13 -05:00
MagicBot d9125566f7 Drop rates are set by ConfigManager 2023-02-19 08:39:28 -05:00
MagicBot 70ca0a1df3 Refactored caching of drop rates. Whittling away at MBServerStatics. 2023-02-19 08:25:58 -05:00
MagicBot 3fd2f519eb Merge remote-tracking branch 'origin/post-wipe-merge' into bugfix-config-manager 2023-02-19 07:53:03 -05:00
MagicBot 5af1687f19 Maintenance hour and bot/game version config entries removed. 2023-02-19 07:48:50 -05:00
FatBoy 10cd3636f7 hotzone cleanup 2023-02-18 15:04:34 -06:00
FatBoy 38e25bf132 hotzone duration config, non repeating hotzones 2023-02-18 14:30:15 -06:00
FatBoy ffe0ecd488 name change 2023-02-18 14:02:35 -06:00
FatBoy 61df76c80a mines default to not be claimed at hour 1400 2023-02-18 13:58:49 -06:00
FatBoy 82249a6d6d drop rates calculated via magicbane.conf on server boot 2023-02-18 13:53:27 -06:00
FatBoy ecaf56f647 maintenance to run on specific day of week only 2023-02-18 10:54:11 -06:00
MagicBot 8dc647fb4f Bugfix: empty guild not errant 2023-02-18 09:30:39 -05:00
MagicBot 7b16c55dc6 Teleport to the target gate. 2023-02-15 13:49:34 -05:00
MagicBot f1a652122c Portals configured in the runegate constructor. 2023-02-15 13:38:13 -05:00
MagicBot 1e0738594a More than one row in result set is needed. 2023-02-15 13:10:08 -05:00
MagicBot eac2e3f42b Portal array list now filled at bootstrap. 2023-02-15 12:29:38 -05:00
MagicBot 2c0a46e652 Runegates and portals now loaded from database. 2023-02-15 12:12:30 -05:00
MagicBot 9fa83fc359 PortalType defined to supply offset and effect bitflag for Runegates. 2023-02-15 09:18:02 -05:00
MagicBot 97948caa48 Merge remote-tracking branch 'origin/post-wipe-merge' into feature-db-agnostic-realms 2023-02-11 14:15:31 -05:00
MagicBot 9ff4d7c6dc bugfix: Prior claims are no longer released when claiming a new mine. 2023-02-11 13:29:12 -05:00
MagicBot cbe82bb95a Output cleanup in ./realminfo. 2023-02-11 07:11:00 -05:00
MagicBot 6ad4d87487 Merge remote-tracking branch 'origin/post-wipe-merge' into feature-db-agnostic-realms 2023-02-10 08:56:37 -05:00
MagicBot 6c138a1515 Bugfix: effects without associated powers on login. 2023-02-10 08:49:24 -05:00
FatBoy b8be399df7 mob AI testing 2023-02-08 20:37:31 -06:00
FatBoy 2462cc13dd guard static power load correct placement 2023-02-08 20:09:56 -06:00
FatBoy eddedbee5b guard static power load 2023-02-08 19:39:52 -06:00
FatBoy 58c4ece887 10 second delay min between casts & mobs no longer cast beneficial spells on players 2023-02-08 19:38:35 -06:00
MagicBot f64c059f26 Color map built after realms loaded. 2023-02-08 09:27:46 -05:00
MagicBot 5cfb451041 Realms refactored to pull map color from database not hardcoded enum. 2023-02-08 09:09:54 -05:00
FatBoy 8e457abe6d mage guards once again have powers 2023-02-07 21:41:48 -06:00
FatBoy d837af7c33 static powers update 2023-02-07 20:57:56 -06:00
MagicBot abd8697d56 Testing realm renumbering 2023-02-07 11:13:55 -05:00
FatBoy 77b3213e79 spire effects extend to siege bounds 2023-02-04 21:44:16 -06:00
FatBoy 7817b4cd49 destroyed BoW no longer count towards total available assets 2023-02-04 21:43:53 -06:00
FatBoy ce02a1ea65 mob mele damage formula update 2023-02-04 21:26:04 -06:00
FatBoy 15580f478f mob casting logic upgrade 2023-02-02 20:34:25 -06:00
FatBoy b2ad7e0478 mob casting logic upgrade 2023-02-02 19:44:23 -06:00
FatBoy 642cb3fdcf Durability cleanup 2023-01-31 08:34:45 -05:00
MagicBot a0b805698e Merge remote-tracking branch 'origin/bugfix-armorpiercing' into post-wipe-merge 2023-01-31 07:56:30 -05:00
MagicBot 879516632b Merge remote-tracking branch 'origin/bugfix-durability-enchantments' into post-wipe-merge 2023-01-31 07:56:20 -05:00
FatBoy 8e692ea21e Durability repair fix 2023-01-29 19:06:54 -06:00
FatBoy 727309a706 finalized cleanup 2023-01-29 15:10:37 -06:00
FatBoy c0e3fcffd1 finalized cleanup 2023-01-28 18:06:51 -06:00
FatBoy 61bdda7886 combat to include armor piercing calculation 2023-01-28 17:57:40 -06:00
FatBoy 50c2972f99 server now accounts for durabilty enchants 2023-01-28 15:36:10 -06:00
FatBoy f98eaa4d6b fixed boon stat application 2023-01-28 12:11:24 -06:00
FatBoy cf801ed7f6 added check for double mines 2023-01-28 10:50:44 -06:00
FatBoy b2fd5990af added check for double mines 2023-01-27 00:02:05 -06:00
MagicBot ab8ee542c6 Hotpatch for shroudbourne hot issue. 2023-01-22 23:52:16 -05:00
MagicBot 3cf6f28d83 Only returning inactive mines in list. 2023-01-21 14:59:37 -05:00
MagicBot e31f320b45 Comment and clarity cleanup. 2023-01-21 12:52:52 -05:00
MagicBot fa0cfa5191 More context in method names. 2023-01-21 12:27:33 -05:00
MagicBot d425050387 Resetting tracking variables when a mine tower is destroyed. 2023-01-21 11:58:08 -05:00
MagicBot 39f3e4ed2c Mine window methods moved to HourlyJobThread and made static. 2023-01-21 11:11:34 -05:00
MagicBot 1ed51c8e02 Lambda syntax sugar 2023-01-21 10:54:51 -05:00
MagicBot 663aafb4c8 Removed leftover code from message pump. 2023-01-21 10:13:00 -05:00
MagicBot b90b8ca422 Protocol handler created for ArcMineChangeProductionMsg. 2023-01-21 10:11:28 -05:00
MagicBot 0e3fdcd8c2 Audit class moved to correct package. 2023-01-21 10:04:34 -05:00
MagicBot 36cb532b20 Handler created for ArcOwnedMinesListHandler. 2023-01-21 09:47:53 -05:00
MagicBot 3cec1b4466 Class cleanup. 2023-01-21 09:39:53 -05:00
MagicBot 825f41e469 rename method to isEmptyGuild() so as not to confuse with GuildState. 2023-01-21 09:28:30 -05:00
MagicBot 2fac480117 Shrines now decay at midnight not every reboot. 2023-01-21 08:53:57 -05:00
MagicBot 2c3aa6e7e5 Cleanup of restriction logic. 2023-01-21 08:42:43 -05:00
MagicBot 78f7503558 Changing your WOO outside the NA window is allowed. 2023-01-21 08:28:16 -05:00
MagicBot 6a1b461735 Refactor WOO change timer mechanics to use the same system as the mine claims. Moved both resets to the hourly job. 2023-01-21 08:18:40 -05:00
MagicBot de41702914 Protocol handler created for ArcMineWindowAvailableTimeMsg. 2023-01-21 07:24:50 -05:00
MagicBot 21cf22f4cf Sanity check added for slider. 2023-01-20 14:28:29 -05:00
MagicBot 7539505956 Mine claims released upon death. 2023-01-20 13:54:36 -05:00
MagicBot c6e0680583 Mine claims released when leaving world. 2023-01-20 13:45:46 -05:00
MagicBot 4a946b6b3a Mine claims released when leaving guild. 2023-01-20 13:38:54 -05:00
MagicBot 0719fa9953 No warehouse PopUp feedback. 2023-01-20 13:35:57 -05:00
MagicBot 14adea8b2e Null check added to releaseAllMines. 2023-01-20 12:41:44 -05:00
MagicBot 3ec16d04d6 Prior claims are released upon a new claim. 2023-01-20 12:18:11 -05:00
MagicBot 1c228df4a8 Revert method refactor. 2023-01-20 11:24:37 -05:00
MagicBot 592caa40ea Serializing nation mine times. 2023-01-20 10:34:57 -05:00
MagicBot 20dba75602 Mine limits based upon nation tree rank. 2023-01-20 10:17:34 -05:00
MagicBot c82a414567 Serialization tweak. 2023-01-20 08:38:13 -05:00
MagicBot 1c9e22d964 Mine.wasClaimed added to ./info dev command. 2023-01-20 08:31:20 -05:00
MagicBot f7f71ef7cf DevCmd and class name should match. 2023-01-20 08:29:45 -05:00
MagicBot 1a7003ce59 Serialized mine open time adjusted if the mine was claimed during this cycle. 2023-01-20 08:12:53 -05:00
MagicBot 889e969c44 Mine cycle is reset at 01:00hrs. 2023-01-20 08:06:14 -05:00
MagicBot f51bfc6d2b Mines can only be claimed once a cycle. 2023-01-20 07:57:42 -05:00
MagicBot 715fdeec9e Merged the two errant guild methods. 2023-01-20 07:54:00 -05:00
MagicBot c57ae6d916 Removal of session tracking. 2023-01-20 07:50:37 -05:00
MagicBot bc1fc5748c Mine windows are set by the nation's WOO. 2023-01-19 17:41:38 -05:00
MagicBot ad9908fda1 Nation cannot be errant. 2023-01-19 17:34:45 -05:00
MagicBot cbd9021cfa Setting last claimer properly during claim. 2023-01-19 17:32:11 -05:00
MagicBot 49af4b8920 Update to system mine claim message. 2023-01-19 17:00:27 -05:00
MagicBot 9442bb1d39 Debugging code removed. 2023-01-19 16:49:36 -05:00
MagicBot efa504a714 Debugging isErrant() 2023-01-19 16:38:39 -05:00
MagicBot ea34418f2d Cleanup of duplicate errant guild definitions. 2023-01-19 16:22:37 -05:00
MagicBot 8ff0216243 Opening mines at the end of bootstrap. 2023-01-19 16:12:18 -05:00
MagicBot 332c860def Errant mines active at startup. 2023-01-19 15:50:49 -05:00
MagicBot 038cac8aed Errant mines active at startup. 2023-01-19 15:45:13 -05:00
MagicBot 00877279bc Errant mines active at startup. 2023-01-19 15:43:19 -05:00
MagicBot da073feb08 Errant mines active at startup. 2023-01-19 15:42:18 -05:00
MagicBot adae9a9ce1 Errant mines active at startup. 2023-01-19 15:39:49 -05:00
MagicBot 53a6b09099 Accessor level change 2023-01-19 15:22:12 -05:00
MagicBot e78d1f4ac4 OwningGuild should be set to errant not null. 2023-01-19 14:43:08 -05:00
MagicBot 11e5439e1d Set owner to null when invalid claim occurs. 2023-01-19 14:15:43 -05:00
MagicBot 78cdb6967a Message when claiming mine succeeds. 2023-01-19 14:09:15 -05:00
MagicBot 79d05f1fb2 Serialize current time for all active mines regardless of claim status. 2023-01-19 13:59:52 -05:00
MagicBot 2a140a6ce1 Serialize current time for all active mines regardless of claim status. 2023-01-19 13:57:43 -05:00
MagicBot a2bdfcc031 Cleanup of logic. 2023-01-19 13:47:11 -05:00
MagicBot 0f2ca3e62e Cleanup of logic. 2023-01-19 13:46:33 -05:00
MagicBot 55e6ca2d41 Error message when claiming a mine fails. 2023-01-19 13:36:16 -05:00
MagicBot 837c2fa1f9 Consolidating handling of different session. 2023-01-19 13:27:26 -05:00
MagicBot c596aa5a01 Unused variable removed. 2023-01-19 12:55:17 -05:00
MagicBot af38dd8fb9 Should not be sending messages to players here. 2023-01-19 12:48:54 -05:00
MagicBot dab9097680 Must wait for a mine window to close to change your guild's WOO to it. 2023-01-19 12:41:32 -05:00
MagicBot 04fc0d6815 Removed Bonus code 2023-01-19 12:36:01 -05:00
MagicBot 4eb1350c3b Rename for clarity 2023-01-19 12:21:29 -05:00
MagicBot 9e7cbdc2d3 bugfix: guilds cannot be null only errant. 2023-01-19 12:19:37 -05:00
MagicBot c89b60221e Extracted open/close logic to method. Run at startup. 2023-01-19 11:21:08 -05:00
MagicBot b88a10d509 Removed vestigial db handler method. 2023-01-19 10:50:22 -05:00
MagicBot 6672f750d9 Initial refactor: deleted all old code and replaced with something sensible. Driven from the guild's mine hour instead of calculating dates. 2023-01-19 10:38:49 -05:00
MagicBot 5ff4703b14 Background thread to monitor admin events. 2023-01-16 06:35:06 -05:00
MagicBot 87dfc968aa Updated admin events to read 2023-01-16 06:24:24 -05:00
MagicBot fba041db5e Method created to send Admin Log Updates to users. 2023-01-16 06:13:44 -05:00
MagicBot cad78c55bd Typo in enum 2023-01-16 06:00:43 -05:00
MagicBot 0c4187faeb ADMINLOG added to ConfigManager 2023-01-16 05:54:08 -05:00
MagicBot c2a84ed31b Starting work on output of admin log. 2023-01-16 05:50:59 -05:00
MagicBot b6506ac3f1 Starting work on output of admin log. 2023-01-16 05:41:31 -05:00
MagicBot 920fcd4b8e Generic ChatChannelHandler created. 2023-01-16 05:28:35 -05:00
MagicBot c59c0629a7 Generic ChatChannelHandler created. 2023-01-16 05:23:31 -05:00
MagicBot 8fbd408fb4 Admin log channel created. 2023-01-16 05:19:02 -05:00
MagicBot 4e6411e555 Merge remote-tracking branch 'origin/post-wipe-merge' into MagicBot-adminlog 2023-01-16 05:11:51 -05:00
MagicBot d70305b0b6 Merge branch 'bugfix-siege-asset-placement' into post-wipe-merge
# Conflicts:
#	src/engine/net/client/handlers/PlaceAssetMsgHandler.java
2023-01-15 23:45:12 -05:00
MagicBot 0469754d5d Bugfix: needs city parent not current zone to pick up siege bounds. 2023-01-15 13:00:26 -05:00
MagicBot 7cb0e5f6b2 Retrieve Admin Log events from database as a map. 2023-01-15 11:29:24 -05:00
MagicBot cec70b3b64 Tweak of column names and Event Strings. 2023-01-15 10:55:16 -05:00
MagicBot 21ff024bf8 Admin login events captured. 2023-01-15 10:34:56 -05:00
MagicBot 3f700f57a7 Admin command usages logged to database. 2023-01-15 10:01:11 -05:00
MagicBot 68294baae6 Cleanup of scope issue when creating city objects. 2023-01-15 08:57:54 -05:00
MagicBot 526c078978 Collision check extracted to method. 2023-01-15 08:31:56 -05:00
MagicBot f3fee3140a Move siege validation out of the generic ValidateBuildingPlacement method. 2023-01-15 08:18:23 -05:00
FatBoy e0af139b24 deed no longer is taken after failed placement 2023-01-14 18:56:43 -06:00
FatBoy 313c13c588 corrected error message ID numbers 2023-01-14 18:36:51 -06:00
MagicBot 8ef5cb4e22 Rework of validation checks. 2023-01-14 16:31:58 -05:00
MagicBot 2643be456e Moved validation check to before asset creation. 2023-01-14 15:34:23 -05:00
MagicBot 29c6d6cd8e Counter scope issue resolved. 2023-01-14 15:23:02 -05:00
MagicBot c84fb60177 Errant import removed. 2023-01-14 15:08:18 -05:00
MagicBot d8dad9f087 Extract siege limits validation method. 2023-01-14 15:07:35 -05:00
MagicBot 45f94c736a Excess whitespace. 2023-01-14 14:29:33 -05:00
MagicBot 7a670ffdbf Appropriate error messages for BOW limits. 2023-01-14 13:35:37 -05:00
FatBoy 325c8b8254 siege asset placement reliant on attcker/defender maximums 2023-01-14 11:57:30 -06:00
MagicBot 90335355b7 Less verbose error message 2023-01-13 15:07:53 -05:00
MagicBot 4c10e01539 Reset time calculation updated. 2023-01-13 14:37:53 -05:00
MagicBot a76534f0af Mesh set properly when errant mine loaded. 2023-01-13 14:34:04 -05:00
MagicBot a06420eae3 Early exit for errant mines at bootstrap. Wtb method extract. 2023-01-13 14:19:01 -05:00
MagicBot 48d435f2c1 Early exit for errant mines. 2023-01-13 14:12:22 -05:00
MagicBot 43380962cc Early exit for errant mines. 2023-01-13 14:04:14 -05:00
MagicBot 14247715fd Removed unused EffectiveDate 2023-01-13 13:50:52 -05:00
MagicBot 7282868eac Errant mines are errant. 2023-01-13 12:09:30 -05:00
MagicBot b30e35f465 Refresh mine when destroyed. 2023-01-13 11:52:50 -05:00
MagicBot d9352b6d34 Refresh mine when destroyed. 2023-01-13 11:46:26 -05:00
MagicBot 26dcccad81 Errant mines now change owner in database. 2023-01-13 11:24:41 -05:00
MagicBot d0cf94dbf9 HandleEndMineWindow will bump the date for us. 2023-01-13 09:13:53 -05:00
MagicBot f61bb925f8 Cleanup of NextMindWindow logic. 2023-01-13 09:01:38 -05:00
MagicBot 5929d5dd56 Cleanup of NextMindWindow logic. 2023-01-13 08:43:20 -05:00
MagicBot 5a19507f53 Merge remote-tracking branch 'origin/refinement-fix' into post-wipe-merge 2023-01-13 08:25:34 -05:00
MagicBot 5c3ea2c4c3 Merge remote-tracking branch 'origin/world-announcements' into post-wipe-merge 2023-01-13 08:25:19 -05:00
FatBoy 1fef5e7c05 refund points from lost spells 2023-01-12 21:44:52 -06:00
FatBoy 743e1f150d refund points from lost spells 2023-01-12 21:35:29 -06:00
FatBoy 7c983d04a3 refine stat point check 2023-01-12 20:35:25 -06:00
FatBoy 73edd8d932 discipline and godly drop messages added 2023-01-11 21:58:24 -06:00
FatBoy cd0e31f39d discipline and godly drop messages added 2023-01-11 21:02:18 -06:00
MagicBot 9e6c96a487 Merge remote-tracking branch 'origin/refinement-fix' into post-wipe-merge 2023-01-11 21:29:03 -05:00
FatBoy 523e83a49c Merge remote-tracking branch 'origin/post-wipe-merge' into refinement-fix 2023-01-11 20:10:42 -06:00
FatBoy c9972962d1 check for powers needing skill 2023-01-11 19:52:38 -06:00
MagicBot 4b8e0cb041 Bump old opendate during reboot to current +1 when mine window has passed. 2023-01-11 16:27:01 -05:00
MagicBot 3ec985e3d9 bugfix: window should not end for a mine not opened. 2023-01-11 15:00:52 -05:00
MagicBot af7d801388 bugfix: not overriding mine open date on boot. 2023-01-10 12:27:54 -05:00
MagicBot 98470d4b1a Added help for #dev subcommands 2023-01-10 08:51:00 -05:00
MagicBot 81b7259423 Added remote console output. 2023-01-10 08:34:11 -05:00
MagicBot d6a505fd00 Added lastout sub command. 2023-01-09 10:22:35 -05:00
MagicBot a71bf4330b Redirecting output via the shell. 2023-01-09 10:12:45 -05:00
MagicBot 72cbcb13fc Change to response string after exec() 2023-01-09 10:09:43 -05:00
MagicBot 8904fb8828 Removed file redirect; better to do that within the shell. 2023-01-09 10:06:37 -05:00
MagicBot 93b33ce37e Capturing output of remote exec() to file. 2023-01-09 09:58:51 -05:00
MagicBot 9ce06da271 Capturing output of remote exec() to file. 2023-01-09 09:43:03 -05:00
MagicBot a460a201e1 Logging string contains exec command. 2023-01-09 09:07:40 -05:00
MagicBot 1493d3ad45 Support for more than one argument. 2023-01-09 02:01:29 -05:00
MagicBot ee676a08ea Better logging and error reporting. 2023-01-09 01:59:18 -05:00
MagicBot 0c87410018 Using ProcessBuilding instead of exec() 2023-01-09 01:47:59 -05:00
MagicBot 9268fa8b01 Using ProcessBuilding instead of exec() 2023-01-09 01:39:14 -05:00
MagicBot eea13b22a0 Using ProcessBuilding instead of exec() 2023-01-09 01:32:57 -05:00
MagicBot fe87253a86 Fixed argument passing to unix runtime. 2023-01-09 01:22:11 -05:00
MagicBot 701bf85c8b Fixed argument passing to unix runtime. 2023-01-09 01:14:54 -05:00
MagicBot d4d24c9443 Fixed argument passing to unix runtime. 2023-01-09 01:11:27 -05:00
MagicBot 23f44f1fb8 Command name is restart not reboot. 2023-01-09 01:01:43 -05:00
MagicBot 9a2503b9c3 Merge remote-tracking branch 'origin/MagicBot_DevCmds' into post-wipe-merge 2023-01-09 00:44:08 -05:00
MagicBot 825d1897cb Removal of vestigial string restriction.
Command renamed to #dev
2023-01-08 17:18:57 -05:00
MagicBot c002eec8bd Consolidated all into one command #dev. 2023-01-08 12:44:16 -05:00
MagicBot 0fd5d09e3e Command added to remote build on Dev server. 2023-01-08 12:27:40 -05:00
MagicBot e9850a51bc Merge remote-tracking branch 'origin/minetime_bugfix' into post-wipe-merge 2023-01-08 07:07:12 -05:00
MagicBot df09b6e38b Removed 30 lines of logic that had no business in a result set constructor. 2023-01-07 13:49:31 -05:00
MagicBot 52d3d8ee3a Not adding an extraneous day each reboot. 2023-01-07 13:26:47 -05:00
MagicBot 7bc09d86bd Saving WOO timer to database for reboot persist. 2023-01-07 12:31:22 -05:00
MagicBot 860d4d9b31 Bugfix: setting lastwoocheck field after update. 2023-01-07 11:31:41 -05:00
MagicBot 4b5ce5bdb1 15hr WOO restriction check added. 2023-01-07 11:22:38 -05:00
MagicBot 302358e31c Storing lastWooEditTime for guilds in obj_guild table. Requires Schema Change. 2023-01-07 11:03:07 -05:00
MagicBot 83b514a05f Class cleanup. 2023-01-07 10:35:00 -05:00
MagicBot 2f22b3b91b Protocol Handler created for ArcMineWindowChangeMsg 2023-01-07 09:44:51 -05:00
MagicBot f979a7b694 Merge remote-tracking branch 'origin/nation-sub-limits' into post-wipe-merge 2023-01-07 09:01:39 -05:00
MagicBot 78be9bfd4f Merge remote-tracking branch 'origin/sale-item-value' into post-wipe-merge 2023-01-07 09:01:29 -05:00
FatBoy 5f0803eec4 nation sub limits added 2023-01-01 21:56:49 -06:00
FatBoy 6cf7b88025 NPCs buy at base cost only 2023-01-01 15:53:05 -06:00
FatBoy d3e05ec247 subs limited to cap rank 2023-01-01 15:48:17 -06:00
MagicBot 5853dc802d Merge pull request 'Fix for weaponspeed effect modifier.' (#19) from EffectModifierFix into master
Reviewed-on: http://repo.magicbane.com/MagicBane/Server/pulls/19
2022-12-30 13:13:15 +00:00
MagicBot a35c5ef3cc Fix for weaponspeed effect modifier. 2022-12-30 07:39:23 -05:00
MagicBot dfd6beb988 Merge pull request 'bugfix-flightfix' (#18) from bugfix-flightfix into master
Reviewed-on: http://repo.magicbane.com/MagicBane/Server/pulls/18
2022-08-28 11:43:42 +00:00
MagicBot ebeda7d7ba Players grounded properly when losing flight. 2022-08-27 17:14:50 -04:00
MagicBot 5fe518f8a1 Players grounded properly when losing flight. 2022-08-27 16:44:05 -04:00
MagicBot ab82529a4b Players grounded properly when losing flight. 2022-08-27 16:31:07 -04:00
MagicBot 9988863a85 Merge pull request 'treb-range-fix' (#17) from treb-range-fix into master
Reviewed-on: http://repo.magicbane.com/MagicBane/Server/pulls/17
2022-08-24 12:22:20 +00:00
MagicBot 8a3c3d7571 Merge branch 'master' into treb-range-fix 2022-08-24 12:22:09 +00:00
MagicBot 3ae1c2ebb2 Merge pull request 'fixed mob ATR' (#16) from mob-atr-fix into master
Reviewed-on: http://repo.magicbane.com/MagicBane/Server/pulls/16
2022-08-24 12:21:25 +00:00
FatBoy 5ab4eb5b32 run siege minion after load 2022-08-23 15:03:35 -05:00
FatBoy 09d0046baf run siege minion after load 2022-08-23 14:59:27 -05:00
FatBoy 865c50f984 fixed trebs 2022-08-23 14:25:24 -05:00
FatBoy f0b80f8eb3 fixed mob ATR 2022-08-15 18:21:34 -05:00
MagicBot 77aa14b7da SDR added to magic bucket numbers. 2022-08-04 16:10:06 -04:00
MagicBot e6af752c6d Hotfix: bane null check order. 2022-07-27 08:56:45 -04:00
MagicBot 2436579752 Merge pull request 'release-1.3' (#13) from release-1.3 into master
Reviewed-on: http://repo.magicbane.com/MagicBane/Server/pulls/13
2022-07-13 17:55:55 +00:00
MagicBot aef34d434a README update. 2022-07-13 13:49:28 -04:00
FatBoy 2922fdf623 changed mob casting rate from 1/3 to 1/10 2022-06-26 20:07:18 -05:00
FatBoy 3f35df3916 fixed crashing bug form my own mistake 2022-06-26 20:04:14 -05:00
FatBoy e79a907f3b mobs no longer always hit, mob powers now send power message in chat window 2022-06-26 20:01:05 -05:00
MagicBot 45ab56e98d More detail when missing a config entry. 2022-06-26 11:05:37 -04:00
MagicBot 246bfe59cb More detail when missing a config entry. 2022-06-26 10:47:08 -04:00
MagicBot afa74ba6fe Optimized imports. 2022-06-23 18:25:45 -04:00
MagicBot 02ed3ff778 Removed unused imports. 2022-06-23 15:51:37 -04:00
MagicBot 14d1c7ccbb Merge branch 'update-config' into release-1.3 2022-06-23 15:48:14 -04:00
MagicBot 0f5b0493b9 Merge remote-tracking branch 'origin/pet-guard-damage-fix' into release-1.3 2022-06-23 15:47:52 -04:00
MagicBot efab188ebd Merge remote-tracking branch 'origin/flight-fix-cleanup' into release-1.3 2022-06-23 15:47:32 -04:00
MagicBot eaaa5bf717 Merge branch 'enter-siege-bounds' into release-1.3 2022-06-23 15:47:16 -04:00
FatBoy 4812068982 changed onEnter for city to refernce siege bounds 2022-06-12 13:53:33 -05:00
FatBoy 3189ac0d56 mob powers now scale based on their level 2022-06-09 18:55:16 -05:00
FatBoy f8a9262fc5 changed location of mob power lookup 2022-06-09 18:22:30 -05:00
FatBoy 9ce7e1c5ca mobs and guards can cast their power sets 2022-06-08 21:09:59 -05:00
FatBoy 2e5c05d932 work on mob casting 2022-06-08 19:56:09 -05:00
FatBoy 56ad9d7907 changed max pet damage scale 2022-06-07 20:30:02 -05:00
FatBoy 65840e89b6 scaled damage range for pets to be based on level 2022-06-07 20:27:45 -05:00
FatBoy 69c78fa5a6 added power casting for pets who have DB entires 2022-06-07 20:24:11 -05:00
FatBoy 3c610a8564 Fix to mob/guard static power lookup 2022-06-06 19:21:39 -05:00
MagicBot 4f2954041d Removed unused code. 2022-06-06 04:48:04 -04:00
MagicBot 24d96f24b2 Moving Fname regex to config 2022-06-06 04:28:44 -04:00
MagicBot ad4678ab3c Version info pulled from config. 2022-06-06 03:26:34 -04:00
MagicBot d5d957a910 bugfix: ignore case with boolean config values. 2022-06-06 03:21:27 -04:00
MagicBot d89cd97eb6 Missing config suggests outdated MagicBox. 2022-06-06 03:13:07 -04:00
FatBoy 16e4f3fa7a fix to abandoning tree as nation check 2022-06-05 21:14:10 -05:00
FatBoy 657cc0cf9e Cannot Abandon Tree if You Own a Bane : Cannot Abandon Tree if you are a nation 2022-06-05 20:55:57 -05:00
FatBoy 45234d24ca stupid error fixed (!=) 2022-06-05 17:36:30 -05:00
FatBoy cd55105b28 spire effects extend to siege bounds 2022-06-05 17:27:40 -05:00
FatBoy d9b5544894 added message to player trying to delete asset during active siege 2022-06-05 17:12:56 -05:00
FatBoy a62617324d added message to player trying to delete asset during active siege 2022-06-05 17:03:44 -05:00
FatBoy 8665011457 can no longer delete building during active bane 2022-06-05 16:56:54 -05:00
MagicBot 18bf19502f Spire effects reach to siege bounds. 2022-06-05 17:02:44 -04:00
MagicBot 168a4f2a17 24.3 placement ruleset.
512/576/1040 grid/zone/siege
2022-06-05 16:56:01 -04:00
MagicBot d3f77d10c5 Flight fix re-enabled. 2022-06-04 13:45:09 -04:00
MagicBot bf87894f8c Removed flight job bonus code. 2022-06-04 13:30:35 -04:00
MagicBot 59cebf9e9b Auditmobs hashset for to deleted as it was being populated once a second but never used. 2022-06-03 12:28:56 -04:00
FatBoy 87e18351be moved flight check to MovementManager 2022-06-03 08:42:08 -05:00
FatBoy 94bc41ab9d added flight check 2022-06-02 21:01:18 -05:00
FatBoy c795238231 Changed if/else tunnel to switch 2022-06-02 20:39:52 -05:00
Bardiel 43c32ce329 Merge pull request 'Added equipsets for naked guards' (#10) from guard-equipsets into master
Reviewed-on: http://repo.magicbane.com/MagicBane/Server/pulls/10
2022-06-01 21:54:22 +00:00
Bardiel 4f60640ddf Equipment Set for Forest Mage guard added
Equipment Set for Templar guard added
Equipment Set for Aracoix Magister guard added
2022-06-01 13:58:23 -07:00
Bardiel f87d39b51c Equipment Set for Forest Mage guard added 2022-06-01 13:33:24 -07:00
MagicBot 0475cc1e66 Merge pull request 'bugfix-citysizing' (#7) from bugfix-citysizing into master
Reviewed-on: http://repo.magicbane.com/MagicBane/Server/pulls/7
2022-05-22 13:07:27 +00:00
MagicBot 79702eab1a Merge branch 'master' into bugfix-citysizing 2022-05-22 13:07:09 +00:00
MagicBot 261e3a6c49 Merge pull request 'Bugfix for damage absorbers.' (#6) from bugfix-absorber into master
Reviewed-on: http://repo.magicbane.com/MagicBane/Server/pulls/6
2022-05-22 13:04:37 +00:00
MagicBot e8b7d63a59 Bugfix for damage absorbers. 2022-05-13 15:25:04 -04:00
MagicBot 638985d332 Revert grid sizing to 576/640 per 2018 commit. 2022-05-13 13:38:52 -04:00
MagicBot 894427af72 Using original MB values when sizing city terraform. 2022-05-12 15:33:43 -04:00
MagicBot e6bbb53ac8 bugfix: Channel ID update. 2022-05-11 15:37:46 -04:00
MagicBot cb279a5d5a bugfix: Pass MB_WORLD_PORT to isPortInUse() 2022-05-10 11:56:06 -04:00
MagicBot 2af224c90f bugfix: MagicBot needs to autodetect public ip for #status to work. 2022-05-10 11:41:45 -04:00
MagicBot 8faec41487 Merge pull request 'bugfix-MagicBoxlocalhost' (#3) from bugfix-MagicBoxlocalhost into master
Reviewed-on: http://repo.magicbane.com/MagicBane/Server/pulls/3
2022-05-03 16:43:47 +00:00
MagicBot 93a8274b7b Merge branch 'master' into bugfix-MagicBoxlocalhost 2022-05-03 16:43:28 +00:00
MagicBot d8fd03b287 Merge pull request 'Fixes issue where max allowed keyclones was hardcoded and not pulled from the config.' (#2) from bugfix-keycloneAudit into master
Reviewed-on: http://repo.magicbane.com/MagicBane/Server/pulls/2
2022-05-03 16:40:16 +00:00
MagicBot 3c7e1827f2 Merge branch 'master' into bugfix-keycloneAudit 2022-05-03 16:39:57 +00:00
MagicBot 24057e6412 Logging when network autoconfig occurs 2022-05-03 12:23:45 -04:00
MagicBot a59dbdc4e1 Fixes bug where public_addr was autoconfigured irrespective of not being 0.0.0.0 2022-05-03 12:02:05 -04:00
MagicBot 8105544894 Update 'README.md' 2022-05-02 18:07:53 +00:00
MagicBot 3456e14d04 Fixes issue where max allowed keyclones was hardcoded and not pulled from the config. 2022-05-02 07:35:15 -04:00
MagicBot c45491a3d2 Merge pull request 'Feature-AutoRegister' (#1) from Feature-AutoRegister into master
Reviewed-on: http://repo.magicbane.com/MagicBane/Server/pulls/1
2022-04-30 18:54:04 +00:00
MagicBot 4205ebe384 SQL caretfix 2022-04-30 14:42:09 -04:00
MagicBot 890f9ad49d SQL caretfix 2022-04-30 14:38:57 -04:00
MagicBot bf3517ebb3 More logging 2022-04-30 14:30:47 -04:00
MagicBot 459d61b20a Autoregister plugged in. 2022-04-30 14:19:33 -04:00
MagicBot 0beb75c9fb Handler added to create single account 2022-04-30 14:11:35 -04:00
MagicBot 2997e5bda2 Feature needs a new configuration entry. 2022-04-30 14:05:05 -04:00
MagicBot a6d5240a66 Update 'README.md' 2022-04-30 17:41:09 +00:00
MagicBot e1b3fa0438 Update 'README.md'
Added info about scan-when-commit pain.
2022-04-30 17:39:37 +00:00
MagicBot bb2bdce93b Update 'README.md'
Edit to README
2022-04-30 13:44:03 +00:00
MagicBot bbfdde57a3 Initial Repository Push 2022-04-30 09:41:17 -04:00
MagicBot d4eef9097a Update to README.md and LICENSE 2022-04-30 09:36:18 -04:00
MagicBot d8a90902b5 Initial commit 2022-04-30 13:11:10 +00:00
182 changed files with 4922 additions and 14825 deletions
-8203
View File
File diff suppressed because one or more lines are too long
+46 -14
View File
@@ -139,8 +139,8 @@ public class Enum {
HALFGIANTMALE(2010, MonsterType.HalfGiant, RunSpeed.STANDARD, CharacterSex.MALE, 1.15f),
HUMANMALE(2011, MonsterType.Human, RunSpeed.STANDARD, CharacterSex.MALE, 1),
HUMANFEMALE(2012, MonsterType.Human, RunSpeed.STANDARD, CharacterSex.FEMALE, 1),
IREKEIMALE(2013, MonsterType.Irekei, RunSpeed.STANDARD, CharacterSex.MALE, 1.1f),
IREKEIFEMALE(2014, MonsterType.Irekei, RunSpeed.STANDARD, CharacterSex.FEMALE, 1.1f),
IREKEIMALE(2013, MonsterType.Irekei, RunSpeed.IREKEI, CharacterSex.MALE, 1.1f),
IREKEIFEMALE(2014, MonsterType.Irekei, RunSpeed.IREKEI, CharacterSex.FEMALE, 1.1f),
SHADEMALE(2015, MonsterType.Shade, RunSpeed.STANDARD, CharacterSex.MALE, 1),
SHADEFEMALE(2016, MonsterType.Shade, RunSpeed.STANDARD, CharacterSex.FEMALE, 1),
MINOMALE(2017, MonsterType.Minotaur, RunSpeed.MINOTAUR, CharacterSex.MALE, 1.3f),
@@ -152,7 +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<>();
@@ -208,6 +210,7 @@ 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),
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;
@@ -960,7 +963,17 @@ public class Enum {
SourceType returnMod;
if (modName.isEmpty())
return SourceType.None;
switch(modName) {
case "Piercing":
modName = "Pierce";
break;
case "Crushing":
modName = "Crush";
break;
case "Slashing":
modName = "Slash";
break;
}
try {
returnMod = SourceType.valueOf(modName.replace(",", ""));
} catch (Exception e) {
@@ -1652,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 {
@@ -2307,8 +2338,8 @@ public class Enum {
public enum CityBoundsType {
GRID(640),
ZONE(875),
PLACEMENT(876);
ZONE(680),
PLACEMENT(681);
public final float extents;
@@ -2822,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),
@@ -2847,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),
@@ -2857,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;
@@ -2880,6 +2910,8 @@ public class Enum {
MOBILE,
PET,
CHARMED,
SIEGEENGINE,
GUARD;
}
}
@@ -25,6 +25,7 @@ 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;
@@ -109,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);
@@ -210,7 +211,7 @@ public enum InterestManager implements Runnable {
if (origin == null)
continue;
if (!playerCharacter.isEnteredWorld())
if (!playerCharacter.enteredWorld)
continue;
if (playerCharacter.getTeleportLock().readLock().tryLock()) {
@@ -467,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());
@@ -480,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);
@@ -524,6 +525,7 @@ public enum InterestManager implements Runnable {
player.setDirtyLoad(true);
updateStaticList(player, origin);
updateMobileList(player, origin);
BoxTracker.addPlayer(origin.machineID,player);
}
@@ -73,6 +73,14 @@ public class dbBlueprintHandler extends dbHandlerBase {
Blueprint._meshLookup.putIfAbsent(thisBlueprint.getMeshForRank(3), thisBlueprint);
Blueprint._meshLookup.putIfAbsent(thisBlueprint.getMeshForRank(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;
@@ -63,6 +63,9 @@ public abstract class dbHandlerBase {
} else {
AbstractGameObject toAdd = localClass.getConstructor(ResultSet.class).newInstance(rs);
DbManager.addToCache(toAdd);
if(toAdd.getObjectType().equals(GameObjectType.Zone) && rs.getInt("canLoad") == 0){
continue;
}
objectList.add((T) toAdd);
if (toAdd != null && toAdd instanceof AbstractWorldObject)
+66 -2
View File
@@ -28,10 +28,67 @@ public class dbItemBaseHandler extends dbHandlerBase {
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()) {
@@ -87,12 +144,19 @@ 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());
}
+24 -2
View File
@@ -135,7 +135,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){
return true;
}
} catch (SQLException e) {
Logger.error(e);
@@ -350,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);
@@ -496,4 +504,18 @@ public class dbItemHandler extends dbHandlerBase {
return false;
}
}
public boolean UPDATE_NUM_ITEMS(final Item item, int newValue) {
if (item.getItemBase().getType().equals(ItemType.GOLD))
return false;
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_item` SET `item_numberOfItems`=? WHERE `UID`=?")) {
preparedStatement.setInt(1, newValue);
preparedStatement.setLong(2, item.getObjectUUID());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
return false;
}
}
}
+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;
@@ -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,
+21 -18
View File
@@ -13,6 +13,7 @@ import engine.Enum.GameObjectType;
import engine.InterestManagement.WorldGrid;
import engine.devcmd.AbstractDevCmd;
import engine.gameManager.*;
import engine.math.Vector3fImmutable;
import engine.objects.*;
import org.pmw.tinylog.Logger;
@@ -70,28 +71,30 @@ public class AddNPCCmd extends AbstractDevCmd {
throwbackError(pc, "Failed to find zone to place npc in.");
return;
}
Building building = null;
if (target != null)
if (target.getObjectType() == GameObjectType.Building) {
Building parentBuilding = (Building) target;
BuildingManager.addHirelingForWorld(parentBuilding, pc, parentBuilding.getLoc(), parentBuilding.getParentZone(), contract, level);
return;
building = (Building)target;
}
NPC npc = NPC.createNPC(name, contractID,
pc.getLoc(), null, zone, (short) level, null);
if (npc != null) {
WorldGrid.addObject(npc, pc);
ChatManager.chatSayInfo(pc,
"NPC with ID " + npc.getDBID() + " added");
this.setResult(String.valueOf(npc.getDBID()));
} else {
throwbackError(pc, "Failed to create npc of contract type "
+ contractID);
Logger.error(
"Failed to create npc of contract type " + contractID);
NPC created;
Guild guild = null;
Vector3fImmutable loc;
if(building != null){
guild = building.getGuild();
loc = building.loc;
} else{
loc = pc.loc;
}
created = NPC.createNPC(name, contractID, loc, guild, zone, (short)level, building);
created.bindLoc = loc;
if(building != null) {
created.buildingUUID = building.getObjectUUID();
created.building = building;
NPCManager.slotCharacterInBuilding(created);
}
created.setLoc(created.bindLoc);
created.updateDatabase();
throwbackInfo(pc, "Created NPC with UUID: " + created.getObjectUUID());
}
@Override
+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));
}
/**
+8 -5
View File
@@ -280,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;
@@ -336,8 +336,9 @@ public class InfoCmd extends AbstractDevCmd {
output += "Swimming : " + targetPC.isSwimming();
output += newline;
output += "isMoving : " + targetPC.isMoving();
output += "isMoving : " + targetPC.isMoving() + newline;
output += "Zerg Multiplier: " + targetPC.ZergMultiplier + newline;
output += "isBoxed: " + targetPC.isBoxed + newline;
break;
case NPC:
@@ -440,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;
@@ -523,7 +526,7 @@ 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;
}
+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 -3
View File
@@ -16,7 +16,6 @@ import engine.objects.AbstractGameObject;
import engine.objects.Building;
import engine.objects.Mine;
import engine.objects.PlayerCharacter;
import engine.workthreads.HourlyJobThread;
/**
*
@@ -41,10 +40,10 @@ public class MineActiveCmd extends AbstractDevCmd {
String trigger = args[0];
switch (trigger) {
case "true":
HourlyJobThread.mineWindowOpen(mine);
Mine.mineWindowOpen(mine);
break;
case "false":
HourlyJobThread.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();
@@ -9,6 +9,7 @@
package engine.devcmd.cmds;
import engine.Enum;
import engine.devcmd.AbstractDevCmd;
import engine.objects.*;
@@ -55,6 +56,7 @@ 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;
@@ -72,6 +74,11 @@ public class PrintStatsCmd extends AbstractDevCmd {
out += "Main Hand: atr: " + tar.getAtrHandOne() + ", damage: " + tar.getMinDamageHandOne() + " to " + tar.getMaxDamageHandOne() + ", speed: " + tar.getSpeedHandOne() + newline;
out += "Off Hand: atr: " + tar.getAtrHandTwo() + ", damage: " + tar.getMinDamageHandTwo() + " to " + tar.getMaxDamageHandTwo() + ", speed: " + tar.getSpeedHandTwo() + newline;
out += "isAlive: " + tar.isAlive() + ", Combat: " + tar.isCombat() + newline;
out += "Health Regen: " + tar.getRegenModifier(Enum.ModType.HealthRecoverRate) + newline;
out += "Stamina Regen: " + tar.getRegenModifier(Enum.ModType.StaminaRecoverRate) + newline;
out += "Mana Regen: " + tar.getRegenModifier(Enum.ModType.ManaRecoverRate) + newline;
out += "Zerg Multiplier: " + tar.ZergMultiplier + newline;
throwbackInfo(pc, out);
}
+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 > 75) {
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-75";
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 -3
View File
@@ -1,10 +1,12 @@
package engine.devcmd.cmds;
import engine.Enum;
import engine.devcmd.AbstractDevCmd;
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;
@@ -26,7 +28,9 @@ public class SimulateBootyCmd extends AbstractDevCmd {
String output;
output = "Booty Simulation:" + newline;
if(target.getObjectType().equals(Enum.GameObjectType.Mob) == false){
return;//ugh what?
}
Mob mob = (Mob) target;
output += "Name: " + mob.getName() + newline;
output += "Special Loot:" + newline;
@@ -51,7 +55,7 @@ public class SimulateBootyCmd extends AbstractDevCmd {
int failures = 0;
int goldAmount = 0;
for (int i = 0; i < 100; ++i) {
for (int i = 0; i < 10000; ++i) {
try {
mob.loadInventory();
@@ -79,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()) {
@@ -131,8 +142,17 @@ public class SimulateBootyCmd extends AbstractDevCmd {
}
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;
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();
+26 -15
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;
if (mob.guardedCity != null)
output += "Patrolling: " + mob.guardedCity.getCityName() + newline;
output += "Powers:" + newline;
for (int token : mob.mobPowers.keySet())
output += token + newline;
output += PowersManager.getPowerByToken(token).getName() + newline;
output += "Race type: " + MobBase.mobbase_race_types.get(mob.getMobBaseID());
throwbackInfo(playerCharacter, output);
throwbackInfo(playerCharacter, "Race Types: " + MobBase.mobbase_race_types.size());
}
@Override
+72
View File
@@ -0,0 +1,72 @@
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
// Magicbane Emulator Project © 2013 - 2022
// www.magicbane.com
package engine.devcmd.cmds;
import engine.Enum.GameObjectType;
import engine.InterestManagement.WorldGrid;
import engine.devcmd.AbstractDevCmd;
import engine.gameManager.*;
import engine.objects.*;
import org.pmw.tinylog.Logger;
/**
* @author Eighty
*/
public class setProfit extends AbstractDevCmd {
public setProfit() {
super("setprofit");
}
@Override
protected void _doCmd(PlayerCharacter pc, String[] words,
AbstractGameObject target) {
if (words.length < 2) {
this.sendUsage(pc);
return;
}
float updateValue;
try {
updateValue = Float.parseFloat(words[1]);
} catch (NumberFormatException e) {
throwbackError(pc,
"Failed to parse supplied contractID or level to an Integer.");
return; // NaN
}
if(target.getObjectType().equals(GameObjectType.NPC) == false){
return;
}
NPC npc = (NPC)target;
if(words[0].toLowerCase().equals("buy")){
npc.buyPercent = updateValue;
npc.updateDatabase();
return;
}
if(words[0].toLowerCase().equals("sell")){
npc.sellPercent = updateValue;
npc.updateDatabase();
return;
}
}
@Override
protected String _getHelpString() {
return "Sets profit margin of targeted NPC";
}
@Override
protected String _getUsageString() {
return "' /setprofit buy/sell VALUE(1.0)'";
}
}
@@ -1,87 +0,0 @@
# Account Handler Documentation
## Overview
This document describes the database relationships and interactions for the `dbAccountHandler` class. The account handler manages user authentication and account-related data in the Magicbane emulator system.
## Handler Class
**File:** `src/engine/db/handlers/dbAccountHandler.java`
**Class:** `dbAccountHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Account Table
- **Table Name:** `obj_account`
- **Description:** Core account information including login credentials, status, and account details
- **Columns:**
- UID (Primary Key)
- username
- password
- email
- accountStatus
- lastLogin
- creationDate
- isBanned
- banReason
- isDeleted
- deletedDate
### Related Tables
| Table Name | Description | Relationship |
|------------|-------------|--------------|
| `obj_account_wipe` | Account wipe history records | AccountID → obj_account.UID |
| `dyn_login_history` | Login attempt and session history | AccountID → obj_account.UID |
## Key Queries
### Get Account by ID
```sql
SELECT * FROM `obj_account` WHERE `UID`=?
```
**File:** `dbAccountHandler.java`, Line ~60
### Get Account by Username
```sql
SELECT * FROM `obj_account` WHERE `username`=?
```
**File:** `dbAccountHandler.java`, Line ~85
### Create New Account
```sql
INSERT INTO `obj_account` (`username`, `password`, `email`, `accountStatus`, `creationDate`) VALUES (?, ?, ?, ?, ?)
```
**File:** `dbAccountHandler.java`, Line ~105
### Update Account Status
```sql
UPDATE `obj_account` SET `accountStatus`=?, `lastLogin`=? WHERE `UID`=?
```
**File:** `dbAccountHandler.java`, Line ~132
### Check Username Availability
```sql
SELECT `username` FROM `obj_account` WHERE `username`=?
```
**File:** `dbAccountHandler.java`, Line ~158
## Relationships
1. **Account to Character:** One-to-many (via `obj_character.accountID` field)
2. **Account to Account Wipe History:** One-to-many (via `obj_account_wipe.AccountID`)
3. **Account to Login History:** One-to-many (via `dyn_login_history.AccountID`)
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `username` | `obj_account.username` | Unique account username |
| `password` | `obj_account.password` | Encrypted password |
| `email` | `obj_account.email` | Account email address |
| `accountStatus` | `obj_account.accountStatus` | Current account status |
| `lastLogin` | `obj_account.lastLogin` | Timestamp of last login |
| `creationDate` | `obj_account.creationDate` | Account creation date |
| `isBanned` | `obj_account.isBanned` | Boolean flag for banned status |
| `banReason` | `obj_account.banReason` | Reason for ban |
| `isDeleted` | `obj_account.isDeleted` | Boolean flag for deleted status |
| `deletedDate` | `obj_account.deletedDate` | Timestamp of deletion |
@@ -1,63 +0,0 @@
# dbBaneHandler Documentation
## Overview
This document describes the database relationships and interactions for the `dbBaneHandler` class. The bane handler manages special objects in cities that have specific properties and behaviors, including their ownership, location, and time-based effects.
## Handler Class
**File:** `src/engine/db/handlers/dbBaneHandler.java`
**Class:** `dbBaneHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Bane Table
- **Table Name:** `dyn_banes`
- **Description:** Stores information about bane objects placed in cities, including their owner, location, and time-based properties
- **Columns:**
- cityUUID (Primary Key)
- ownerUUID
- stoneUUID
- placementDate
- liveDate
## Key Queries
### CREATE_BANE
```sql
INSERT INTO `dyn_banes` (`cityUUID`, `ownerUUID`, `stoneUUID`, `placementDate`) VALUES(?,?,?,?)
```
**File:** `dbBaneHandler.java`, Line ~17
### LOAD_BANE
```sql
SELECT * FROM `dyn_banes` WHERE `dyn_banes`.`cityUUID` = ?
```
**File:** `dbBaneHandler.java`, Line ~30
### SET_BANE_TIME
```sql
UPDATE `dyn_banes` SET `liveDate`=? WHERE `cityUUID`=?
```
**File:** `dbBaneHandler.java`, Line ~45
### REMOVE_BANE
```sql
DELETE FROM `dyn_banes` WHERE `cityUUID` = ?
```
**File:** `dbBaneHandler.java`, Line ~57
## Relationships
1. **Bane to City:** One-to-one relationship via cityUUID (primary key) referencing obj_city.UID
2. **Bane to Owner:** Many-to-one relationship via ownerUUID referencing obj_character.UID
3. **Bane to Stone:** Many-to-one relationship via stoneUUID referencing obj_building.UID
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `cityUUID` | `dyn_banes.cityUUID` | Unique identifier for the city where bane is placed |
| `ownerUUID` | `dyn_banes.ownerUUID` | Character UID of the owner of this bane |
| `stoneUUID` | `dyn_banes.stoneUUID` | Building UID of the stone used to create this bane |
| `placementDate` | `dyn_banes.placementDate` | Timestamp when bane was placed |
| `liveDate` | `dyn_banes.liveDate` | Timestamp for when bane becomes active |
@@ -1,73 +0,0 @@
# dbBaseClassHandler Documentation
## Overview
The `dbBaseClassHandler` is responsible for managing base class data in the Magicbane database. Base classes represent fundamental character classifications that define core attributes and capabilities. This handler manages retrieval of base class information, including fetching specific base classes by ID, retrieving base classes associated with a particular race, and getting all available base classes.
## Database Table Structure
### Table: `static_rune_baseclass`
| Column Name | Data Type | Nullable | Key | Description |
|-------------|-----------|----------|-----|-------------|
| ID | int unsigned | NO | PRIMARY | Unique identifier for the base class |
| name | varchar(45) | NO | | Name of the base class |
| description | varchar(200) | NO | | Description of the base class |
| strMod | tinyint | NO | | Strength modifier for this base class |
| dexMod | tinyint | NO | | Dexterity modifier for this base class |
| conMod | tinyint | NO | | Constitution modifier for this base class |
| intMod | tinyint | NO | | Intelligence modifier for this base class |
| wisMod | tinyint | NO | | Wisdom modifier for this base class |
| chaMod | tinyint | NO | | Charisma modifier for this base class |
| healthMod | tinyint | NO | | Health modifier for this base class |
| manaMod | tinyint | NO | | Mana modifier for this base class |
| staminaMod | tinyint | NO | | Stamina modifier for this base class |
### Table: `static_rune_racebaseclass`
| Column Name | Data Type | Nullable | Key | Description |
|-------------|-----------|----------|-----|-------------|
| ID | int unsigned | NO | PRIMARY | Unique identifier for the relationship |
| RaceID | int unsigned | NO | FOREIGN KEY | Reference to race in `static_rune_race` |
| BaseClassID | int unsigned | NO | FOREIGN KEY | Reference to base class in `static_rune_baseclass` |
## Java Field to Database Column Mapping
| Java Field | Database Column | Type | Description |
|------------|-----------------|------|-------------|
| baseClass.getId() | ID | int unsigned | Base class unique identifier |
| baseClass.getName() | name | varchar(45) | Base class name |
| baseClass.getDescription() | description | varchar(200) | Base class description |
| baseClass.getStrMod() | strMod | tinyint | Strength modifier |
| baseClass.getDexMod() | dexMod | tinyint | Dexterity modifier |
| baseClass.getConMod() | conMod | tinyint | Constitution modifier |
| baseClass.getIntMod() | intMod | tinyint | Intelligence modifier |
| baseClass.getWisMod() | wisMod | tinyint | Wisdom modifier |
| baseClass.getChaMod() | chaMod | tinyint | Charisma modifier |
| baseClass.getHealthMod() | healthMod | tinyint | Health modifier |
| baseClass.getManaMod() | manaMod | tinyint | Mana modifier |
| baseClass.getStaminaMod() | staminaMod | tinyint | Stamina modifier |
## Key Queries
### GET_BASE_CLASS
- **Query**: `SELECT * FROM \`static_rune_baseclass\` WHERE \`ID\`=?`
- **Parameter**: id (base class ID)
- **Note**: Fixed from original bug - was selecting from obj_account table instead of static_rune_baseclass
### GET_BASECLASS_FOR_RACE
- **Query**: `SELECT b.* FROM \`static_rune_baseclass\` b, \`static_rune_racebaseclass\` r WHERE b.\`ID\` = r.\`BaseClassID\` && r.\`RaceID\` = ?`
- **Parameter**: id (race ID)
### GET_ALL_BASE_CLASSES
- **Query**: `SELECT * FROM \`static_rune_baseclass\`;`
- **Note**: Returns all base classes from the static table
## Relationships
### Foreign Key Relationships
- `static_rune_racebaseclass.BaseClassID` references `static_rune_baseclass.ID`
- `static_rune_racebaseclass.RaceID` references `static_rune_race.ID`
### Associated Objects
- **BaseClass**: Core character classification data
- **Race**: Associated races that can use specific base classes (via `static_rune_racebaseclass`)
@@ -1,119 +0,0 @@
# dbBlueprintHandler Documentation
## Overview
The `dbBlueprintHandler` is responsible for managing building blueprint data and door number mappings in the Magicbane database. This handler loads blueprint information used for building construction and handles door mesh-to-number mappings.
## Database Table Structure
### Table: `static_building_blueprint`
| Column Name | Data Type | Nullable | Key | Description |
|-------------|-----------|----------|-----|-------------|
| Rank0UUID | bigint unsigned | NO | PRIMARY | Unique identifier for the blueprint (rank 0) |
| MeshName | varchar(100) | NO | | Name of the mesh used for the building |
| BuildingGroup | enum | NO | | Group classification of the building type |
| MaintGroup | varchar(45) | YES | | Maintenance group associated with the building |
| Rank1UUID | bigint unsigned | YES | | UUID for rank 1 upgrade |
| Rank2UUID | bigint unsigned | YES | | UUID for rank 2 upgrade |
| Rank3UUID | bigint unsigned | YES | | UUID for rank 3 upgrade |
| Rank4UUID | bigint unsigned | YES | | UUID for rank 4 upgrade |
| Rank5UUID | bigint unsigned | YES | | UUID for rank 5 upgrade |
| Rank6UUID | bigint unsigned | YES | | UUID for rank 6 upgrade |
| Rank7UUID | bigint unsigned | YES | | UUID for rank 7 upgrade |
| UpgradeCost | int | YES | | Cost to upgrade the building |
| UpgradeTime | int | YES | | Time required to upgrade the building |
| MaxHP | int | YES | | Maximum hit points of the building |
| MaxGold | int | YES | | Maximum gold storage capacity |
| MaxLevel | int | YES | | Maximum level for this building |
| MaxRank | int | YES | | Maximum rank for this building |
| MinLevel | int | YES | | Minimum level required to build |
| Scale | float | YES | | Scale factor for the building mesh |
| SizeX | float | YES | | X dimension size |
| SizeY | float | YES | | Y dimension size |
| SizeZ | float | YES | | Z dimension size |
| DoorCount | int | YES | | Number of doors in this building |
| MaxDoorCount | int | YES | | Maximum number of doors allowed |
| IsWall | tinyint(1) | YES | | Flag indicating if building is a wall |
| IsGate | tinyint(1) | YES | | Flag indicating if building is a gate |
| IsTower | tinyint(1) | YES | | Flag indicating if building is a tower |
| IsKeep | tinyint(1) | YES | | Flag indicating if building is a keep |
| IsFortress | tinyint(1) | YES | | Flag indicating if building is a fortress |
| IsCastle | tinyint(1) | YES | | Flag indicating if building is a castle |
| IsBarracks | tinyint(1) | YES | | Flag indicating if building is barracks |
| IsChurch | tinyint(1) | YES | | Flag indicating if building is a church |
| IsForge | tinyint(1) | YES | | Flag indicating if building is a forge |
| IsSpire | tinyint(1) | YES | | Flag indicating if building is a spire |
| IsShrine | tinyint(1) | YES | | Flag indicating if building is a shrine |
| IsRunegate | tinyint(1) | YES | | Flag indicating if building is a runegate |
| IsMine | tinyint(1) | YES | | Flag indicating if building is a mine |
| IsWarehouse | tinyint(1) | YES | | Flag indicating if building is a warehouse |
### Table: `static_building_doors`
| Column Name | Data Type | Nullable | Key | Description |
|-------------|-----------|----------|-----|-------------|
| doorMeshUUID | int | NO | PRIMARY | Unique identifier for the door mesh |
| doorNumber | int | NO | | Door number associated with this mesh |
## Java Field to Database Column Mapping
| Java Field | Database Column | Type | Description |
|------------|-----------------|------|-------------|
| blueprint.getBlueprintUUID() | Rank0UUID | bigint unsigned | Blueprint unique identifier |
| blueprint.getMeshName() | MeshName | varchar(100) | Name of the building mesh |
| blueprint.getBuildingGroup() | BuildingGroup | enum | Group classification of the building |
| blueprint.getMaintGroup() | MaintGroup | varchar(45) | Maintenance group for this building |
| blueprint.getRank1UUID() | Rank1UUID | bigint unsigned | UUID for rank 1 upgrade |
| blueprint.getRank2UUID() | Rank2UUID | bigint unsigned | UUID for rank 2 upgrade |
| blueprint.getRank3UUID() | Rank3UUID | bigint unsigned | UUID for rank 3 upgrade |
| blueprint.getRank4UUID() | Rank4UUID | bigint unsigned | UUID for rank 4 upgrade |
| blueprint.getRank5UUID() | Rank5UUID | bigint unsigned | UUID for rank 5 upgrade |
| blueprint.getRank6UUID() | Rank6UUID | bigint unsigned | UUID for rank 6 upgrade |
| blueprint.getRank7UUID() | Rank7UUID | bigint unsigned | UUID for rank 7 upgrade |
| blueprint.getUpgradeCost() | UpgradeCost | int | Cost to upgrade the building |
| blueprint.getUpgradeTime() | UpgradeTime | int | Time required to upgrade |
| blueprint.getMaxHP() | MaxHP | int | Maximum hit points |
| blueprint.getMaxGold() | MaxGold | int | Maximum gold storage |
| blueprint.getMaxLevel() | MaxLevel | int | Maximum level for this building |
| blueprint.getMaxRank() | MaxRank | int | Maximum rank |
| blueprint.getMinLevel() | MinLevel | int | Minimum level required |
| blueprint.getScale() | Scale | float | Scale factor for mesh |
| blueprint.getSizeX() | SizeX | float | X dimension size |
| blueprint.getSizeY() | SizeY | float | Y dimension size |
| blueprint.getSizeZ() | SizeZ | float | Z dimension size |
| blueprint.getDoorCount() | DoorCount | int | Number of doors |
| blueprint.getMaxDoorCount() | MaxDoorCount | int | Maximum number of doors |
| blueprint.getIsWall() | IsWall | tinyint(1) | Wall flag |
| blueprint.getIsGate() | IsGate | tinyint(1) | Gate flag |
| blueprint.getIsTower() | IsTower | tinyint(1) | Tower flag |
| blueprint.getIsKeep() | IsKeep | tinyint(1) | Keep flag |
| blueprint.getIsFortress() | IsFortress | tinyint(1) | Fortress flag |
| blueprint.getIsCastle() | IsCastle | tinyint(1) | Castle flag |
| blueprint.getIsBarracks() | IsBarracks | tinyint(1) | Barracks flag |
| blueprint.getIsChurch() | IsChurch | tinyint(1) | Church flag |
| blueprint.getIsForge() | IsForge | tinyint(1) | Forge flag |
| blueprint.getIsSpire() | IsSpire | tinyint(1) | Spire flag |
| blueprint.getIsShrine() | IsShrine | tinyint(1) | Shrine flag |
| blueprint.getIsRunegate() | IsRunegate | tinyint(1) | Runegate flag |
| blueprint.getIsMine() | IsMine | tinyint(1) | Mine flag |
| blueprint.getIsWarehouse() | IsWarehouse | tinyint(1) | Warehouse flag |
## Key Queries
### LOAD_ALL_DOOR_NUMBERS
- **Query**: `SELECT * FROM static_building_doors ORDER BY doorMeshUUID ASC`
- **Note**: Loads all door mesh-to-number mappings for building doors
### LOAD_ALL_BLUEPRINTS
- **Query**: `SELECT * FROM static_building_blueprint`
- **Note**: Loads all blueprint definitions for buildings
## Relationships
### Foreign Key Relationships
- None explicitly defined in the handler code (these are likely static lookup tables)
### Associated Objects
- **Blueprint**: Building construction data with mesh information and upgrade paths
- **Door**: Door mesh mappings used for building construction
@@ -1,43 +0,0 @@
# Boon Handler Documentation
## Overview
This document describes the database relationships and interactions for the `dbBoonHandler` class. The boon system in Magicbane is used to manage item bonuses and enhancements that are associated with specific item bases.
## Handler Class
**File:** `src/engine/db/handlers/dbBoonHandler.java`
**Class:** `dbBoonHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Boon Table
- **Table Name:** `static_item_boons`
- **Description:** Contains information about boons (bonuses/enhancements) that can be applied to item bases
- **Columns:**
- UID (Primary Key)
- itemBaseID (Foreign Key to obj_itembase)
- boonType
- boonValue
- boonLevel
## Key Queries
### Get Boon Amounts for Item Base
```sql
SELECT * FROM `static_item_boons` WHERE `itemBaseID` = ?
```
**File:** `dbBoonHandler.java`, Line ~28
## Relationships
1. **Item Base to Boons:** One-to-many relationship where each item base can have multiple boons associated with it
- Foreign key: `static_item_boons.itemBaseID` references `obj_itembase.UID`
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `itemBaseID` | `static_item_boons.itemBaseID` | References the item base this boon belongs to |
| `boonType` | `static_item_boons.boonType` | Type of boon (e.g., damage, defense) |
| `boonValue` | `static_item_boons.boonValue` | Value of the boon |
| `boonLevel` | `static_item_boons.boonLevel` | Level of the boon |
@@ -1,98 +0,0 @@
# Building Handler Documentation
## Overview
This document describes the database relationships and interactions for the `dbBuildingHandler` class. The building handler manages all aspects of building objects in Magicbane, including creation, modification, deletion, and various properties like health, protection state, and ownership.
## Handler Class
**File:** `src/engine/db/handlers/dbBuildingHandler.java`
**Class:** `dbBuildingHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Building Table
- **Table Name:** `obj_building`
- **Description:** Core building information including location, mesh, health, and ownership details
- **Columns:**
- UID (Primary Key)
- parent (Foreign Key to obj_zone)
- ownerUUID (Foreign Key to obj_character)
- name
- meshUUID (Foreign Key to static_building_mesh)
- locX, locY, locZ (Location coordinates)
- meshScale
- currentHP
- protectionState
- currentGold
- rank
- upgradeDate
- blueprintUUID (Foreign Key to static_building_blueprint)
- w, rotY (Rotation data)
- isDeleted
### Related Tables
| Table Name | Description | Relationship |
|------------|-------------|--------------|
| `dyn_building_friendslist` | Stores friends that can access this building | BuildingID → obj_building.UID |
| `dyn_building_condemnedlist` | Stores characters/guilds marked as condemned for this building | BuildingID → obj_building.UID |
| `dyn_building_patrolpoints` | Stores patrol points for building guards | BuildingID → obj_building.UID |
| `dyn_building_regions` | Stores region information for buildings | BuildingID → obj_building.UID |
## Key Queries
### Create Building (Stored Procedure)
```sql
CALL `building_CREATE`(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
```
**File:** `dbBuildingHandler.java`, Line ~38
### Get All Buildings for Zone
```sql
SELECT * FROM `obj_building` WHERE `parent` = ?
```
**File:** `dbBuildingHandler.java`, Line ~91
### Get Building by UUID
```sql
SELECT * FROM `obj_building` WHERE `UID` = ?
```
**File:** `dbBuildingHandler.java`, Line ~110
### Get Building by Mesh
```sql
SELECT * FROM `obj_building` WHERE `meshUUID` = ?
```
**File:** `dbBuildingHandler.java`, Line ~135
## Relationships
1. **Building to Zone:** Many-to-one relationship through `obj_building.parent` field
2. **Building to Owner:** Many-to-one relationship through `obj_building.ownerUUID` field (references obj_character.UID)
3. **Building to Blueprint:** Many-to-one relationship through `obj_building.blueprintUUID` field (references static_building_blueprint.Rank0UUID)
4. **Building to Mesh:** Many-to-one relationship through `obj_building.meshUUID` field (references static_building_mesh.UID)
5. **Building to Friends List:** One-to-many relationship through `dyn_building_friendslist.BuildingID`
6. **Building to Condemned List:** One-to-many relationship through `dyn_building_condemnedlist.BuildingID`
7. **Building to Patrol Points:** One-to-many relationship through `dyn_building_patrolpoints.BuildingID`
8. **Building to Regions:** One-to-many relationship through `dyn_building_regions.BuildingID`
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `parent` | `obj_building.parent` | Zone parent ID |
| `ownerUUID` | `obj_building.ownerUUID` | Owner character UID |
| `name` | `obj_building.name` | Building name |
| `meshUUID` | `obj_building.meshUUID` | Mesh identifier |
| `locX` | `obj_building.locX` | X coordinate |
| `locY` | `obj_building.locY` | Y coordinate |
| `locZ` | `obj_building.locZ` | Z coordinate |
| `meshScale` | `obj_building.meshScale` | Scale of mesh |
| `currentHP` | `obj_building.currentHP` | Current health points |
| `protectionState` | `obj_building.protectionState` | Protection state |
| `currentGold` | `obj_building.currentGold` | Current gold amount |
| `rank` | `obj_building.rank` | Building rank |
| `upgradeDate` | `obj_building.upgradeDate` | Upgrade timestamp |
| `blueprintUUID` | `obj_building.blueprintUUID` | Blueprint identifier |
| `w` | `obj_building.w` | Rotation data |
| `rotY` | `obj_building.rotY` | Y rotation angle |
@@ -1,61 +0,0 @@
# Building Location Handler Documentation
## Overview
This document describes the database relationships and interactions for the `dbBuildingLocationHandler` class. This handler manages building location data, specifically loading locations for buildings based on type and slot.
## Handler Class
**File:** `src/engine/db/handlers/dbBuildingLocationHandler.java`
**Class:** `dbBuildingLocationHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Table
- **Table Name:** `static_building_location`
- **Description:** Stores location data for building components including position and rotation information
- **Columns:**
- ID (Primary Key)
- BuildingID
- type
- slot
- unknown
- locX
- locY
- locZ
- w
- rotX
- rotY
- rotZ
## Key Queries
### Load Building Locations
```sql
SELECT `ID`, `BuildingID`, `type`, `slot`, `unknown`, `locX`, `locY`, `locZ`, `w`, `rotX`, `rotY`, `rotZ`
FROM static_building_location
WHERE type = 6 OR type = 8
GROUP BY buildingID, slot
ORDER BY buildingID, slot ASC;
```
**File:** `dbBuildingLocationHandler.java`, Line ~17
## Relationships
1. **Building Location to Building:** Many-to-one relationship via `BuildingID` field referencing `obj_building.UID`
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `id` | `static_building_location.ID` | Unique identifier |
| `buildingID` | `static_building_location.BuildingID` | Reference to building |
| `type` | `static_building_location.type` | Location type |
| `slot` | `static_building_location.slot` | Slot number |
| `unknown` | `static_building_location.unknown` | Unknown field |
| `locX` | `static_building_location.locX` | X coordinate |
| `locY` | `static_building_location.locY` | Y coordinate |
| `locZ` | `static_building_location.locZ` | Z coordinate |
| `w` | `static_building_location.w` | W rotation value |
| `rotX` | `static_building_location.rotX` | X rotation |
| `rotY` | `static_building_location.rotY` | Y rotation |
| `rotZ` | `static_building_location.rotZ` | Z rotation |
@@ -1,77 +0,0 @@
# dbCSSessionHandler Documentation
## Overview
This document describes the database relationships and interactions for the `dbCSSessionHandler` class. The session handler manages user login sessions, tracking account activity, character associations, and session-based authentication.
## Handler Class
**File:** `src/engine/db/handlers/dbCSSessionHandler.java`
**Class:** `dbCSSessionHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Session Table
- **Table Name:** `dyn_cs_session`
- **Description:** Stores information about active and inactive user sessions, including account associations and character details
- **Columns:**
- UID (Primary Key)
- accountID
- characterID
- sessionKey
- lastLoginDate
- lastLogoutDate
### Related Tables
| Table Name | Description | Relationship |
|------------|-------------|--------------|
| `obj_account` | Accounts associated with sessions | accountID → obj_account.UID |
| `obj_character` | Characters associated with sessions | characterID → obj_character.UID |
## Key Queries
### Create Session
```sql
INSERT INTO `dyn_cs_session` (`accountID`, `characterID`, `sessionKey`, `lastLoginDate`) VALUES(?,?,?,?)
```
**File:** `dbCSSessionHandler.java`, Line ~35
### Load Session by Account
```sql
SELECT * FROM `dyn_cs_session` WHERE `accountID` = ?
```
**File:** `dbCSSessionHandler.java`, Line ~50
### Load Session by Character
```sql
SELECT * FROM `dyn_cs_session` WHERE `characterID` = ?
```
**File:** `dbCSSessionHandler.java`, Line ~65
### Update Session Last Login
```sql
UPDATE `dyn_cs_session` SET `lastLoginDate`=? WHERE `UID`=?
```
**File:** `dbCSSessionHandler.java`, Line ~80
### Update Session Last Logout
```sql
UPDATE `dyn_cs_session` SET `lastLogoutDate`=? WHERE `UID`=?
```
**File:** `dbCSSessionHandler.java`, Line ~95
## Relationships
1. **Session to Account:** Many-to-one relationship via accountID field referencing obj_account.UID
2. **Session to Character:** Many-to-one relationship via characterID field referencing obj_character.UID
3. **Session to Login History:** One-to-many relationship via session UID (via dyn_login_history table)
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `accountID` | `dyn_cs_session.accountID` | Account UID associated with this session |
| `characterID` | `dyn_cs_session.characterID` | Character UID associated with this session |
| `sessionKey` | `dyn_cs_session.sessionKey` | Session identifier for authentication |
| `lastLoginDate` | `dyn_cs_session.lastLoginDate` | Timestamp of last login |
| `lastLogoutDate` | `dyn_cs_session.lastLogoutDate` | Timestamp of last logout |
@@ -1,71 +0,0 @@
# Character Power Handler Documentation
## Overview
This document describes the database relationships and interactions for the `dbCharacterPowerHandler` class. This handler manages character power data, including adding, deleting, retrieving, and updating character powers.
## Handler Class
**File:** `src/engine/db/handlers/dbCharacterPowerHandler.java`
**Class:** `dbCharacterPowerHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Table
- **Table Name:** `dyn_character_power`
- **Description:** Stores dynamic power information for characters including power token, character ID, and training levels
- **Columns:**
- UID (Primary Key)
- CharacterID
- powersBaseToken
- trains
## Key Queries
### Add Character Power
```sql
INSERT INTO `dyn_character_power` (`CharacterID`, `powersBaseToken`, `trains`) VALUES (?, ?, ?);
```
**File:** `dbCharacterPowerHandler.java`, Line ~20
### Delete Character Power
```sql
DELETE FROM `dyn_character_power` WHERE `UID` = ?
```
**File:** `dbCharacterPowerHandler.java`, Line ~41
### Get Character Power by ID
```sql
SELECT * FROM `dyn_character_power` WHERE `UID` = ?
```
**File:** `dbCharacterPowerHandler.java`, Line ~57
### Get All Powers for Character
```sql
SELECT * FROM `dyn_character_power` WHERE CharacterID = ?
```
**File:** `dbCharacterPowerHandler.java`, Line ~76
### Update Trains
```sql
UPDATE `dyn_character_power` SET `trains`=? WHERE `UID`=?
```
**File:** `dbCharacterPowerHandler.java`, Line ~98
### Update Database
```sql
UPDATE `dyn_character_power` SET `PowersBaseToken`=?, `CharacterID`=?, `trains`=? WHERE `UID`=?
```
**File:** `dbCharacterPowerHandler.java`, Line ~115
## Relationships
1. **Character Power to Character:** Many-to-one relationship via `CharacterID` field referencing `obj_character.UID`
2. **Character Power to Power Base:** Many-to-one relationship via `powersBaseToken` field referencing `static_powers_base.token`
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `characterID` | `dyn_character_power.CharacterID` | Reference to character |
| `powerToken` | `dyn_character_power.powersBaseToken` | Reference to power base |
| `trains` | `dyn_character_power.trains` | Training level |
@@ -1,63 +0,0 @@
# Character Rune Handler Documentation
## Overview
This document describes the database relationships and interactions for the `dbCharacterRuneHandler` class. This handler manages character rune data, including adding, retrieving, deleting, and updating character runes.
## Handler Class
**File:** `src/engine/db/handlers/dbCharacterRuneHandler.java`
**Class:** `dbCharacterRuneHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Table
- **Table Name:** `dyn_character_rune`
- **Description:** Stores dynamic rune information for characters including character ID and rune base ID
- **Columns:**
- UID (Primary Key)
- CharacterID
- RuneBaseID
## Key Queries
### Add Character Rune
```sql
INSERT INTO `dyn_character_rune` (`CharacterID`, `RuneBaseID`) VALUES (?, ?);
```
**File:** `dbCharacterRuneHandler.java`, Line ~20
### Get Character Rune by ID
```sql
SELECT * FROM `dyn_character_rune` WHERE `UID`=?
```
**File:** `dbCharacterRuneHandler.java`, Line ~43
### Delete Character Rune
```sql
DELETE FROM `dyn_character_rune` WHERE `UID`=?;
```
**File:** `dbCharacterRuneHandler.java`, Line ~61
### Get All Runes for Character
```sql
SELECT * FROM `dyn_character_rune` WHERE `CharacterID` = ?
```
**File:** `dbCharacterRuneHandler.java`, Line ~74
### Update Database
```sql
UPDATE `dyn_character_rune` SET `CharacterID`=?, `RuneBaseID`=? WHERE `UID` = ?
```
**File:** `dbCharacterRuneHandler.java`, Line ~91
## Relationships
1. **Character Rune to Character:** Many-to-one relationship via `CharacterID` field referencing `obj_character.UID`
2. **Character Rune to Rune Base:** Many-to-one relationship via `RuneBaseID` field referencing `static_rune_base.ID`
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `playerID` | `dyn_character_rune.CharacterID` | Reference to character |
| `runeBaseID` | `dyn_character_rune.RuneBaseID` | Reference to rune base |
@@ -1,71 +0,0 @@
# Character Skill Handler Documentation
## Overview
This document describes the database relationships and interactions for the `dbCharacterSkillHandler` class. This handler manages character skill data, including adding, deleting, retrieving, and updating character skills.
## Handler Class
**File:** `src/engine/db/handlers/dbCharacterSkillHandler.java`
**Class:** `dbCharacterSkillHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Table
- **Table Name:** `dyn_character_skill`
- **Description:** Stores dynamic skill information for characters including skill base ID, character ID, and training levels
- **Columns:**
- UID (Primary Key)
- CharacterID
- skillsBaseID
- trains
## Key Queries
### Add Skill
```sql
INSERT INTO `dyn_character_skill` (`CharacterID`, `skillsBaseID`, `trains`) VALUES (?, ?, ?);
```
**File:** `dbCharacterSkillHandler.java`, Line ~20
### Delete Skill
```sql
DELETE FROM `dyn_character_skill` WHERE `UID` = ?
```
**File:** `dbCharacterSkillHandler.java`, Line ~43
### Get Skill by ID
```sql
SELECT * FROM `dyn_character_skill` WHERE `UID` = ?
```
**File:** `dbCharacterSkillHandler.java`, Line ~59
### Get All Skills for Character
```sql
SELECT * FROM `dyn_character_skill` WHERE `CharacterID` = ?
```
**File:** `dbCharacterSkillHandler.java`, Line ~80
### Update Trains
```sql
UPDATE `dyn_character_skill` SET `trains`=? WHERE `UID` = ?
```
**File:** `dbCharacterSkillHandler.java`, Line ~104
### Update Database
```sql
UPDATE `dyn_character_skill` SET `skillsBaseID`=?, `CharacterID`=?, `trains`=? WHERE `UID`=?
```
**File:** `dbCharacterSkillHandler.java`, Line ~123
## Relationships
1. **Character Skill to Character:** Many-to-one relationship via `CharacterID` field referencing `obj_character.UID`
2. **Character Skill to Skill Base:** Many-to-one relationship via `skillsBaseID` field referencing `static_skills_base.ID`
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `characterID` | `dyn_character_skill.CharacterID` | Reference to character |
| `skillBaseID` | `dyn_character_skill.skillsBaseID` | Reference to skill base |
| `trains` | `dyn_character_skill.trains` | Training level |
@@ -1,97 +0,0 @@
# City Handler Documentation
## Overview
This document describes the database relationships and interactions for the `dbCityHandler` class. The city handler manages city-related data including city creation, zone information, and building structures within the Magicbane emulator system.
## Handler Class
**File:** `src/engine/db/handlers/dbCityHandler.java`
**Class:** `dbCityHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main City Table
- **Table Name:** `obj_city`
- **Description:** Core city information including name, motto, and metadata
- **Columns:**
- UID (Primary Key)
- name
- motto
- treeOfLifeUUID
- established
- realmTaxDate
- population
- siegesWithstood
- isNpc
- isCapital
- isNoobIsle
- bindX
- bindZ
- bindRadius
- radiusType
- forceRename
- open
- hash
### Related Tables
| Table Name | Description | Relationship |
|------------|-------------|--------------|
| `obj_zone` | Zone information within cities | CityID → obj_city.UID |
| `obj_building` | Building information within zones | ZoneID → obj_zone.UID |
| `object` | Base object table that links to obj_city | UID → obj_city.UID |
## Key Queries
### Load City Data
```sql
SELECT * FROM `object` o
JOIN `obj_city` c ON o.`UID` = c.`UID`
WHERE o.`type` = 'city' AND o.`parent` = ?
```
**File:** `dbCityHandler.java`, Line ~45
### Load Zones for City
```sql
SELECT * FROM `object` o
JOIN `obj_zone` z ON o.`UID` = z.`UID`
WHERE o.`type` = 'zone' AND o.`parent` = ?
```
**File:** `dbCityHandler.java`, Line ~60
### Load Buildings for Zone
```sql
SELECT * FROM `object` o
JOIN `obj_building` b ON o.`UID` = b.`UID`
WHERE o.`type` = 'building' AND o.`parent` = ?
```
**File:** `dbCityHandler.java`, Line ~75
### Create New City
```sql
CALL `city_CREATE`(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
```
**File:** `dbCityHandler.java`, Line ~90
## Relationships
1. **City to Object:** One-to-one (City is a type of object)
2. **Zone to City:** Many-to-one (Multiple zones per city)
3. **Building to Zone:** Many-to-one (Multiple buildings per zone)
4. **City to Zones:** One-to-many (via `obj_zone.parent` field)
5. **Zone to Buildings:** One-to-many (via `obj_building.parent` field)
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `name` | `obj_city.name` | City name |
| `motto` | `obj_city.motto` | City motto |
| `established` | `obj_city.established` | Date established |
| `population` | `obj_city.population` | Population count |
| `isNpc` | `obj_city.isNpc` | NPC flag |
| `bindX` | `obj_city.bindX` | X binding coordinate |
| `bindZ` | `obj_city.bindZ` | Z binding coordinate |
| `bindRadius` | `obj_city.bindRadius` | Binding radius |
| `isCapital` | `obj_city.isCapital` | Capital city flag |
| `isNoobIsle` | `obj_city.isNoobIsle` | Noob island flag |
@@ -1,82 +0,0 @@
# Contract Handler Documentation
## Overview
This document describes the database relationships and interactions for the `dbContractHandler` class. This handler manages contract data for NPCs, including loading contracts, their inventory sets, and sell lists.
## Handler Class
**File:** `src/engine/db/handlers/dbContractHandler.java`
**Class:** `dbContractHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Table
- **Table Name:** `static_npc_contract`
- **Description:** Stores static contract information for NPCs including contract ID, name, mob base ID, class ID, vendor dialog, and icon ID
- **Columns:**
- ID (Primary Key)
- contractID
- name
- mobbaseID
- classID
- vendorDialog
- iconID
- allowedBuildingTypeID
### Related Tables
| Table Name | Description | Relationship |
|------------|-------------|--------------|
| `static_npc_inventoryset` | Stores inventory items for contracts | inventorySet → static_npc_contract.inventorySet |
| `static_npc_contract_selltype` | Stores sell type information for contracts | contractID → static_npc_contract.ID |
## Key Queries
### Get Contract by ID
```sql
SELECT * FROM `static_npc_contract` WHERE `ID` = ?
```
**File:** `dbContractHandler.java`, Line ~17
### Load Contract Inventory
```sql
SELECT * FROM `static_npc_inventoryset` WHERE `inventorySet` = ?;
```
**File:** `dbContractHandler.java`, Line ~43
### Load Sell List for Contract
```sql
SELECT * FROM `static_npc_contract_selltype` WHERE `contractID` = ?;
```
**File:** `dbContractHandler.java`, Line ~65
### Update Allowed Buildings
```sql
UPDATE `static_npc_contract` SET `allowedBuildingTypeID`=? WHERE `contractID`=?
```
**File:** `dbContractHandler.java`, Line ~87
### Update Database
```sql
UPDATE `static_npc_contract` SET `contractID`=?, `name`=?, `mobbaseID`=?, `classID`=?, vendorDialog=?, iconID=?, allowedBuildingTypeID=? WHERE `ID`=?
```
**File:** `dbContractHandler.java`, Line ~100
## Relationships
1. **Contract to Mob Base:** Many-to-one relationship via `mobbaseID` field referencing `obj_mobbase.ID`
2. **Contract to Vendor Dialog:** Many-to-one relationship via `vendorDialog` field referencing `obj_vendor_dialog.UID`
3. **Contract to Inventory Set:** One-to-many relationship via `inventorySet` field
4. **Contract to Sell Types:** One-to-many relationship via `contractID` field
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `contractID` | `static_npc_contract.contractID` | Contract identifier |
| `name` | `static_npc_contract.name` | Contract name |
| `mobbaseID` | `static_npc_contract.mobbaseID` | Reference to mob base |
| `classID` | `static_npc_contract.classID` | Class identifier |
| `vendorDialogID` | `static_npc_contract.vendorDialog` | Reference to vendor dialog |
| `iconID` | `static_npc_contract.iconID` | Icon identifier |
| `allowedBuildings` | `static_npc_contract.allowedBuildingTypeID` | Allowed building types |
@@ -1,57 +0,0 @@
# dbEffectsBaseHandler Documentation
## Overview
This document describes the database relationships and interactions for the `dbEffectsBaseHandler` class. This handler manages static data about power effects in Magicbane, including their base properties and modifiers.
## Handler Class
**File:** `src/engine/db/handlers/dbEffectsBaseHandler.java`
**Class:** `dbEffectsBaseHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Effect Base Table
- **Table Name:** `static_power_effectbase`
- **Description:** Core table containing base information about power effects, including names and types
- **Columns:**
- IDString (Primary Key)
- name
- description
- effectType
### Modifier Tables
| Table Name | Description | Relationship |
|------------|-------------|--------------|
| `static_power_effectmod` | Stores modifier properties for effects | EffectBaseID → static_power_effectbase.IDString |
## Key Queries
### Get All Effects Base
```sql
SELECT * FROM static_power_effectbase ORDER BY `IDString` DESC
```
**File:** `dbEffectsBaseHandler.java`, Line ~25
### Get Effect Modifiers
```sql
SELECT * FROM static_power_effectmod WHERE `effectBaseID` = ?
```
**File:** `dbEffectsBaseHandler.java`, Line ~40
## Relationships
1. **Effect Base to Modifiers:** One-to-many relationship via effectBaseID field in static_power_effectmod referencing static_power_effectbase.IDString
2. **Effect Base to Resources Cost:** Many-to-many relationship through static_power_effectcost table
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `IDString` | `static_power_effectbase.IDString` | Unique identifier for the effect |
| `name` | `static_power_effectbase.name` | Display name of the effect |
| `description` | `static_power_effectbase.description` | Description of the effect |
| `effectType` | `static_power_effectbase.effectType` | Type of effect |
| `modType` | `static_power_effectmod.modType` | Modifier type for effect modifiers |
| `modValue` | `static_power_effectmod.modValue` | Value of the modifier |
| `other fields...` | Various columns | Other properties related to effects and modifiers |
@@ -1,40 +0,0 @@
# dbEffectsResourceCostHandler Documentation
## Overview
This document describes the database relationships and interactions for the `dbEffectsResourceCostHandler` class. This handler manages the resource costs associated with power effects, including mana, health, and other resource types required to use specific powers.
## Handler Class
**File:** `src/engine/db/handlers/dbEffectsResourceCostHandler.java`
**Class:** `dbEffectsResourceCostHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Resource Cost Table
- **Table Name:** `static_power_effectcost`
- **Description:** Stores resource cost information for power effects, defining what resources are required to use specific effects
- **Columns:**
- IDString (Primary Key)
- resourceType
- resourceAmount
## Key Queries
### Get Resource Cost by Effect ID
```sql
SELECT * FROM static_power_effectcost WHERE `IDString` = ?
```
**File:** `dbEffectsResourceCostHandler.java`, Line ~25
## Relationships
1. **Effect Cost to Effect Base:** Many-to-one relationship via IDString field referencing static_power_effectbase.IDString
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `idString` | `static_power_effectcost.IDString` | Unique identifier linking to effect base |
| `resourceType` | `static_power_effectcost.resourceType` | Type of resource required (mana, health, etc.) |
| `resourceAmount` | `static_power_effectcost.resourceAmount` | Amount of resource required |
| `other fields...` | Various columns | Other properties related to resource costs |
@@ -1,46 +0,0 @@
# dbEnchantmentHandler Documentation
## Overview
This document describes the database relationships and interactions for the `dbEnchantmentHandler` class. This handler manages item enchantments, which are special properties applied to items that modify their attributes or provide additional abilities.
## Handler Class
**File:** `src/engine/db/handlers/dbEnchantmentHandler.java`
**Class:** `dbEnchantmentHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Enchantment Table
- **Table Name:** `dyn_item_enchantment`
- **Description:** Stores enchantment information for items, including the type of power action and rank level
- **Columns:**
- itemID (Primary Key)
- powerAction
- rank
## Key Queries
### Get Enchantments by Item ID
```sql
SELECT * FROM dyn_item_enchantment WHERE `itemID` = ?
```
**File:** `dbEnchantmentHandler.java`, Line ~25
### Save Enchantment
```sql
INSERT INTO `dyn_item_enchantment` (`itemID`, `powerAction`, `rank`) VALUES(?,?,?)
```
**File:** `dbEnchantmentHandler.java`, Line ~40
## Relationships
1. **Enchantment to Item:** Many-to-one relationship via itemID field referencing obj_item.UID
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `itemID` | `dyn_item_enchantment.itemID` | Unique identifier for the item |
| `powerAction` | `dyn_item_enchantment.powerAction` | The power action associated with the enchantment |
| `rank` | `dyn_item_enchantment.rank` | The rank or strength level of the enchantment |
| `other fields...` | Various columns | Other properties related to item enchantments |
@@ -1,118 +0,0 @@
# Guild Handler Documentation
## Overview
This document describes the database relationships and interactions for the `dbGuildHandler` class. The guild system in Magicbane is complex, involving multiple related tables for managing guilds, their history, alliances, enemies, and member management.
## Handler Class
**File:** `src/engine/db/handlers/dbGuildHandler.java`
**Class:** `dbGuildHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Guild Table
- **Table Name:** `obj_guild`
- **Description:** Core guild information including name, leader, tags, charter, and ownership details
- **Columns:**
- UID (Primary Key)
- name
- leaderUID
- backgroundColor01
- backgroundColor02
- symbolColor
- backgroundDesign
- symbol
- charter
- leadershipType
- motto
- ownedCity
### Related Tables
| Table Name | Description | Relationship |
|------------|-------------|--------------|
| `dyn_character_guildhistory` | Tracks character's guild membership history | CharacterID → obj_character.UID, GuildID → obj_guild.UID |
| `dyn_guild_allianceenemylist` | Stores alliance/enemy relationships between guilds | GuildID → obj_guild.UID, OtherGuildID → obj_guild.UID |
| `dyn_guild_banishlist` | Lists characters banned from guilds | GuildID → obj_guild.UID, CharacterID → obj_character.UID |
| `dyn_guild_characterkoslist` | Stores characters marked as KOS (Kill on Sight) for guilds | GuildID → obj_guild.UID, KOSCharacterID → obj_character.UID |
| `dyn_guild_guildkoslist` | Stores guilds marked as KOS for other guilds | GuildID → obj_guild.UID, KOSGuildID → obj_guild.UID |
| `object` | Base object table that links to obj_guild | UID → obj_guild.UID |
## Key Queries
### Get Guild by ID
```sql
SELECT `obj_guild`.*, `object`.`parent`
FROM `obj_guild`
INNER JOIN `object` ON `object`.`UID` = `obj_guild`.`UID`
WHERE `object`.`UID`=?
```
**File:** `dbGuildHandler.java`, Line ~450
### Get Guild History of Player
```sql
SELECT g.* FROM `obj_guild` g, `dyn_character_guildhistory` l
WHERE g.`UID` = l.`GuildID` && l.`CharacterID` = ?
```
**File:** `dbGuildHandler.java`, Line ~200
### Get Guild Allies
```sql
SELECT g.* FROM `obj_guild` g, `dyn_guild_allianceenemylist` l
WHERE l.isAlliance = 1 && l.OtherGuildID = g.UID && l.GuildID=?
```
**File:** `dbGuildHandler.java`, Line ~230
### Get Guild Enemies
```sql
SELECT g.* FROM `obj_guild` g, `dyn_guild_allianceenemylist` l
WHERE l.isAlliance = 0 && l.OtherGuildID = g.UID && l.GuildID=?
```
**File:** `dbGuildHandler.java`, Line ~253
### Get Guild KOS Characters
```sql
SELECT c.* FROM `obj_character` c, `dyn_guild_characterkoslist` l
WHERE c.`char_isActive` = 1 && l.`KOSCharacterID` = c.`UID` && l.`GuildID`=?
```
**File:** `dbGuildHandler.java`, Line ~273
### Get Guild KOS Guilds
```sql
SELECT g.* FROM `obj_guild` g, `dyn_guild_guildkoslist` l
WHERE l.KOSGuildID = g.UID && l.GuildID = ?
```
**File:** `dbGuildHandler.java`, Line ~295
### Save Guild (Stored Procedure)
```sql
CALL `guild_CREATE`(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
```
**File:** `dbGuildHandler.java`, Line ~483
## Relationships
1. **Guild to Character:** Many-to-many through `obj_character.guildUID` field
2. **Guild to Guild History:** One-to-many (via `dyn_character_guildhistory.GuildID`)
3. **Guild to Alliances/Enemies:** Many-to-many (via `dyn_guild_allianceenemylist`)
4. **Guild to Bans List:** One-to-many (via `dyn_guild_banishlist.GuildID`)
5. **Guild to KOS Characters:** One-to-many (via `dyn_guild_characterkoslist.GuildID`)
6. **Guild to KOS Guilds:** One-to-many (via `dyn_guild_guildkoslist.GuildID`)
7. **Guild to Sub-Guilds:** Parent-child relationship via `object.parent` field
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `name` | `obj_guild.name` | Guild name |
| `leaderUID` | `obj_guild.leaderUID` | Leader character UID |
| `backgroundColor01` | `obj_guild.backgroundColor01` | First background color |
| `backgroundColor02` | `obj_guild.backgroundColor02` | Second background color |
| `symbolColor` | `obj_guild.symbolColor` | Symbol color |
| `backgroundDesign` | `obj_guild.backgroundDesign` | Background design ID |
| `symbol` | `obj_guild.symbol` | Guild symbol ID |
| `charter` | `obj_guild.charter` | Charter information |
| `leadershipType` | `obj_guild.leadershipType` | Leadership type |
| `motto` | `obj_guild.motto` | Guild motto |
| `ownedCity` | `obj_guild.ownedCity` | Owned city ID |
@@ -1,42 +0,0 @@
# dbHeightMapHandler Documentation
## Overview
This document describes the database relationships and interactions for the `dbHeightMapHandler` class. This handler manages height map data for zones, which is used to determine terrain elevation in the game world.
## Handler Class
**File:** `src/engine/db/handlers/dbHeightMapHandler.java`
**Class:** `dbHeightMapHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Height Map Table
- **Table Name:** `static_zone_heightmap`
- **Description:** Stores raw height map data for zones, representing terrain elevation information
- **Columns:**
- zoneLoadID (Primary Key)
- heightMapData
- width
- height
## Key Queries
### Get Height Map by Zone Load ID
```sql
SELECT * FROM static_zone_heightmap WHERE `zoneLoadID` = ?
```
**File:** `dbHeightMapHandler.java`, Line ~25
## Relationships
1. **Height Map to Zone:** Many-to-one relationship via zoneLoadID field referencing static_zone_load.zoneLoadID
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `zoneLoadID` | `static_zone_heightmap.zoneLoadID` | Unique identifier for the zone |
| `heightMapData` | `static_zone_heightmap.heightMapData` | Raw height map data for terrain elevation |
| `width` | `static_zone_size.width` | Width dimension of the zone |
| `height` | `static_zone_size.height` | Height dimension of the zone |
| `other fields...` | Various columns | Other properties related to height maps |
@@ -1,71 +0,0 @@
# dbItemBaseHandler Documentation
## Overview
This document describes the database relationships and interactions for the `dbItemBaseHandler` class. This handler manages static item base data, including item properties, stats, and appearance information.
## Handler Class
**File:** `src/engine/db/handlers/dbItemBaseHandler.java`
**Class:** `dbItemBaseHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Item Base Table
- **Table Name:** `static_itembase`
- **Description:** Core table storing base properties of items, including names, descriptions, and appearance settings
- **Columns:**
- UID (Primary Key)
- name
- description
- itemClass
- icon
- mesh
### Related Tables
| Table Name | Description | Relationship |
|------------|-------------|--------------|
| `static_item_bakedinstat` | Stores stat information for items | ItemBaseID → static_itembase.UID |
| `static_itembase_animations` | Stores animation settings for items | ItemBaseID → static_itembase.UID |
## Key Queries
### Get Item Base by UID
```sql
SELECT * FROM static_itembase WHERE `UID` = ?
```
**File:** `dbItemBaseHandler.java`, Line ~25
### Get Item Stats
```sql
SELECT * FROM static_item_bakedinstat WHERE `itemBaseID` = ?
```
**File:** `dbItemBaseHandler.java`, Line ~40
### Get Item Animations
```sql
SELECT * FROM static_itembase_animations WHERE `itemBaseID` = ?
```
**File:** `dbItemBaseHandler.java`, Line ~55
## Relationships
1. **Item Base to Stats:** One-to-many relationship via itemBaseID field in static_item_bakedinstat referencing static_itembase.UID
2. **Item Base to Animations:** One-to-many relationship via itemBaseID field in static_itembase_animations referencing static_itembase.UID
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `UID` | `static_itembase.UID` | Unique identifier for the item |
| `name` | `static_itembase.name` | Name of the item |
| `description` | `static_itembase.description` | Description of the item |
| `itemClass` | `static_itembase.itemClass` | Class of the item |
| `icon` | `static_itembase.icon` | Icon identifier for the item |
| `mesh` | `static_itembase.mesh` | Mesh identifier for the item |
| `fromUse` | `static_item_bakedinstat.fromUse` | Flag indicating if stat is from use |
| `animation` | `static_itembase_animations.animation` | Animation associated with the item |
| `rightHand` | `static_itembase_animations.rightHand` | Flag indicating right hand animation |
| `runeSet` | `static_npc_runeSet.runeSet` | NPC rune set identifier |
| `runeBase` | `static_npc_runeSet.runeBase` | Base rune identifier |
| `other fields...` | Various columns | Other properties related to item base data |
@@ -1,64 +0,0 @@
# dbItemHandler Documentation
## Overview
This document describes the database relationships and interactions for the `dbItemHandler` class. This handler manages item data in players' inventories, including item properties, location information, and ownership details.
## Handler Class
**File:** `src/engine/db/handlers/dbItemHandler.java`
**Class:** `dbItemHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Item Table
- **Table Name:** `obj_item`
- **Description:** Stores information about items in player inventories, including location, ownership, and attributes
- **Columns:**
- UID (Primary Key)
- ownerUID
- containerID
- itemBaseID
- item_container
- equipSlot
- flags
- customName
## Key Queries
### Get Item by UID
```sql
SELECT * FROM obj_item WHERE `UID` = ?
```
**File:** `dbItemHandler.java`, Line ~25
### Save Item
```sql
INSERT INTO `obj_item` (`ownerUID`, `containerID`, `itemBaseID`, `item_container`, `equipSlot`, `flags`, `customName`) VALUES(?,?,?,?,?,?,?)
```
**File:** `dbItemHandler.java`, Line ~40
### Get Items by Owner
```sql
SELECT * FROM obj_item WHERE `ownerUID` = ?
```
**File:** `dbItemHandler.java`, Line ~55
## Relationships
1. **Item to Owner:** Many-to-one relationship via ownerUID field referencing obj_character.UID
2. **Item to Container:** Many-to-one relationship via containerID field referencing obj_container.UID
3. **Item to Item Base:** Many-to-one relationship via itemBaseID field referencing static_itembase.UID
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `UID` | `obj_item.UID` | Unique identifier for the item |
| `ownerUID` | `obj_item.ownerUID` | UID of the character who owns this item |
| `containerID` | `obj_item.containerID` | Container ID where item is stored |
| `itemBaseID` | `obj_item.itemBaseID` | UID of the base item definition |
| `item_container` | `obj_item.item_container` | Container type (inventory, equip, bank, etc.) |
| `equipSlot` | `obj_item.equipSlot` | Slot where item is equipped |
| `flags` | `obj_item.flags` | Item flags for special properties |
| `customName` | `obj_item.customName` | Custom name of the item |
| `other fields...` | Various columns | Other item-specific properties |
@@ -1,54 +0,0 @@
# dbKitHandler Documentation
## Overview
This document describes the database relationships and interactions for the `dbKitHandler` class. The kit handler manages static data about game kits, which are predefined sets of items or abilities that players can obtain or use in the game.
## Handler Class
**File:** `src/engine/db/handlers/dbKitHandler.java`
**Class:** `dbKitHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Kit Table
- **Table Name:** `static_rune_validkit`
- **Description:** Stores information about valid kits available in the game, including their properties and restrictions
- **Columns:**
- UID (Primary Key)
- kitName
- description
- raceRestriction
- classRestriction
- itemLimit
- isAvailable
## Key Queries
### GET_ALL_KITS
```sql
SELECT * FROM `static_rune_validkit`
```
**File:** `dbKitHandler.java`, Line ~29
### GET_KIT_BY_NAME
```sql
SELECT * FROM `static_rune_validkit` WHERE `kitName`=?
```
**File:** `dbKitHandler.java`, Line ~45
## Relationships
1. **Kit to Race Restrictions:** Many-to-many relationship through raceRestriction field
2. **Kit to Class Restrictions:** Many-to-many relationship through classRestriction field
3. **Kit to Items:** One-to-many relationship via itemLimit referencing items in the game
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `kitName` | `static_rune_validkit.kitName` | Unique name identifier for the kit |
| `description` | `static_rune_validkit.description` | Description of the kit's purpose and benefits |
| `raceRestriction` | `static_rune_validkit.raceRestriction` | Race restriction for the kit |
| `classRestriction` | `static_rune_validkit.classRestriction` | Class restriction for the kit |
| `itemLimit` | `static_rune_validkit.itemLimit` | Maximum number of items allowed in this kit |
| `isAvailable` | `static_rune_validkit.isAvailable` | Boolean flag indicating if kit is currently available |
@@ -1,91 +0,0 @@
# dbLootHandler Documentation
## Overview
This document describes the database relationships and interactions for the `dbLootHandler` class. The loot handler manages static loot tables and item generation data used in the game's loot system, including general tables, item tables, modifier tables, and booty sets.
## Handler Class
**File:** `src/engine/db/handlers/dbLootHandler.java`
**Class:** `dbLootHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Tables
- **Table Name:** `static_loot_gen`
- **Description:** Stores general loot table entries for item generation
- **Columns:**
- genTable (Primary Key)
- itemID
- weight
- minLevel
- maxLevel
### Related Tables
| Table Name | Description | Relationship |
|------------|-------------|--------------|
| `static_loot_item` | Stores item-specific loot table entries | One-to-many with genTable |
| `static_loot_mod` | Stores modifier information for loot items | One-to-many with modTable |
| `static_loot_modtype` | Defines modifier types used in loot systems | One-to-many with modType |
| `static_loot_bootySet` | Stores booty set definitions for loot generation | One-to-many with bootySet |
## Key Queries
### LOAD_GEN_ITEM_TABLES
```sql
SELECT * FROM `static_loot_gen`
```
**File:** `dbLootHandler.java`, Line ~32
### LOAD_ITEM_TABLES
```sql
SELECT * FROM `static_loot_item`
```
**File:** `dbLootHandler.java`, Line ~64
### LOAD_MOD_TABLES
```sql
SELECT * FROM `static_loot_mod`
```
**File:** `dbLootHandler.java`, Line ~96
### LOAD_MOD_TYPE_TABLES
```sql
SELECT * FROM `static_loot_modtype`
```
**File:** `dbLootHandler.java`, Line ~128
### LOAD_BOOTY_TABLES
```sql
SELECT * FROM static_loot_bootySet
```
**File:** `dbLootHandler.java`, Line ~160
### LOAD_ENCHANT_VALUES
```sql
SELECT `IDString`, `minMod` FROM `static_power_effectmod` WHERE `modType` = ?
```
**File:** `dbLootHandler.java`, Line ~192
## Relationships
1. **Loot Generation Tables:** The main loot tables are related through the genTable, itemTable, and modTable fields to form a hierarchical loot generation system
2. **Item Tables:** Connected to general tables through itemID fields for specific item definitions
3. **Modifier Tables:** Linked through modTable and modType fields for modifier definitions
4. **Booty Sets:** Connected through bootySet field for specific booty set configurations
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `genTableID` | `static_loot_gen.genTable` | Unique identifier for the loot table |
| `itemID` | `static_loot_gen.itemID` | Item ID for this loot entry |
| `weight` | `static_loot_gen.weight` | Weight for random selection |
| `minLevel` | `static_loot_gen.minLevel` | Minimum level requirement |
| `maxLevel` | `static_loot_gen.maxLevel` | Maximum level requirement |
| `itemTableID` | `static_loot_item.itemTable` | Item table identifier |
| `modTableID` | `static_loot_mod.modTable` | Modifier table identifier |
| `modTypeID` | `static_loot_modtype.modType` | Modifier type identifier |
| `bootySetID` | `static_loot_bootySet.bootySet` | Booty set identifier |
| `IDString` | `static_power_effectmod.IDString` | ID string for effect modifiers |
| `minMod` | `static_power_effectmod.minMod` | Minimum modifier value |
@@ -1,49 +0,0 @@
# dbMenuHandler Documentation
## Overview
This document describes the database relationships and interactions for the `dbMenuHandler` class. The menu handler manages NPC menu options and their associated data, providing functionality to retrieve menu options based on menu IDs.
## Handler Class
**File:** `src/engine/db/handlers/dbMenuHandler.java`
**Class:** `dbMenuHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Table
- **Table Name:** `static_npc_menuoption`
- **Description:** Stores NPC menu option data including text, actions, and relationships to parent menus
- **Columns:**
- menuID (Primary Key)
- optionText
- actionType
- actionValue
- nextMenuID
- conditionType
- conditionValue
## Key Queries
### GET_MENU_OPTIONS
```sql
SELECT * FROM `static_npc_menuoption` WHERE menuID = ?
```
**File:** `dbMenuHandler.java`, Line ~25
## Relationships
1. **Menu Options to Menu:** One-to-many relationship via menuID field referencing parent menu structure
2. **Menu Options to Next Menu:** Many-to-one relationship via nextMenuID field for navigation between menus
3. **Menu Options to Conditions:** Zero-to-many relationship via conditionType and conditionValue fields for dynamic menu display
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `menuID` | `static_npc_menuoption.menuID` | Unique identifier for the parent menu |
| `optionText` | `static_npc_menuoption.optionText` | Text displayed for this menu option |
| `actionType` | `static_npc_menuoption.actionType` | Type of action to perform when selected |
| `actionValue` | `static_npc_menuoption.actionValue` | Value associated with the action |
| `nextMenuID` | `static_npc_menuoption.nextMenuID` | ID of the menu to navigate to when selected |
| `conditionType` | `static_npc_menuoption.conditionType` | Type of condition for displaying this option |
| `conditionValue` | `static_npc_menuoption.conditionValue` | Value associated with the condition |
@@ -1,83 +0,0 @@
# dbMineHandler Documentation
## Overview
This document describes the database relationships and interactions for the `dbMineHandler` class. The mine handler manages mine objects and their properties, including ownership, resource types, production types, and flags for various mine behaviors.
## Handler Class
**File:** `src/engine/db/handlers/dbMineHandler.java`
**Class:** `dbMineHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Table
- **Table Name:** `obj_mine`
- **Description:** Stores mine-specific data including owner, resource type, production type, and flags
- **Columns:**
- UID (Primary Key)
- mine_ownerUID
- mine_resource
- mine_type
- flags
### Related Tables
| Table Name | Description | Relationship |
|------------|-------------|--------------|
| `obj_building` | Base building data for mines | One-to-one with obj_mine via UID |
| `object` | Generic object data including parent relationships | One-to-one with obj_mine via UID |
## Key Queries
### GET_MINE
```sql
SELECT `obj_building`.*, `object`.`parent` FROM `object` INNER JOIN `obj_building` ON `obj_building`.`UID` = `object`.`UID` WHERE `object`.`UID` = ?
```
**File:** `dbMineHandler.java`, Line ~25
### GET_ALL_MINES_FOR_SERVER
```sql
SELECT `obj_mine`.*, `object`.`parent` FROM `object` INNER JOIN `obj_mine` ON `obj_mine`.`UID` = `object`.`UID`
```
**File:** `dbMineHandler.java`, Line ~43
### CHANGE_OWNER
```sql
UPDATE `obj_mine` SET `mine_ownerUID`=? WHERE `UID`=?
```
**File:** `dbMineHandler.java`, Line ~57
### CHANGE_RESOURCE
```sql
UPDATE `obj_mine` SET `mine_resource`=? WHERE `UID`=?
```
**File:** `dbMineHandler.java`, Line ~71
### CHANGE_TYPE
```sql
UPDATE `obj_mine` SET `mine_type`=? WHERE `UID`=?
```
**File:** `dbMineHandler.java`, Line ~85
### SET_FLAGS
```sql
UPDATE `obj_mine` SET `flags`=? WHERE `UID`=?
```
**File:** `dbMineHandler.java`, Line ~99
## Relationships
1. **Mine to Building:** One-to-one relationship via UID field (mine data extends building data)
2. **Mine to Owner:** Many-to-one relationship via mine_ownerUID referencing obj_character.UID
3. **Mine to Resource:** Many-to-one relationship via mine_resource field linking to resource definitions
4. **Mine to Parent Object:** One-to-one relationship through object table for parent-child hierarchies
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `mine_ownerUID` | `obj_mine.mine_ownerUID` | Character UID of the mine owner |
| `mine_resource` | `obj_mine.mine_resource` | Resource type being mined |
| `mine_type` | `obj_mine.mine_type` | Production type of the mine |
| `flags` | `obj_mine.flags` | Bit flags for mine properties |
| `UID` | `obj_mine.UID` | Unique identifier for the mine object |
@@ -1,66 +0,0 @@
# dbMobBaseHandler Documentation
## Overview
This document describes the database relationships and interactions for the `dbMobBaseHandler` class. This handler manages static data about mob (monster) base properties in Magicbane, including their characteristics, stats, and behaviors.
## Handler Class
**File:** `src/engine/db/handlers/dbMobBaseHandler.java`
**Class:** `dbMobBaseHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Mob Base Table
- **Table Name:** `static_mob_base`
- **Description:** Core table storing base properties of mobs, including names, descriptions, and basic characteristics
- **Columns:**
- UID (Primary Key)
- name
- description
- mobType
- level
- health
### Related Tables
| Table Name | Description | Relationship |
|------------|-------------|--------------|
| `static_mob_stats` | Stores stat information for mobs | MobBaseID → static_mob_base.UID |
| `static_mob_loot` | Stores loot information for mobs | MobBaseID → static_mob_base.UID |
## Key Queries
### Get Mob Base by UID
```sql
SELECT * FROM static_mob_base WHERE `UID` = ?
```
**File:** `dbMobBaseHandler.java`, Line ~25
### Get Mob Stats
```sql
SELECT * FROM static_mob_stats WHERE `mobBaseID` = ?
```
**File:** `dbMobBaseHandler.java`, Line ~40
### Get Mob Loot
```sql
SELECT * FROM static_mob_loot WHERE `mobBaseID` = ?
```
**File:** `dbMobBaseHandler.java`, Line ~55
## Relationships
1. **Mob Base to Stats:** One-to-many relationship via mobBaseID field in static_mob_stats referencing static_mob_base.UID
2. **Mob Base to Loot:** One-to-many relationship via mobBaseID field in static_mob_loot referencing static_mob_base.UID
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `UID` | `static_mob_base.UID` | Unique identifier for the mob |
| `name` | `static_mob_base.name` | Name of the mob |
| `description` | `static_mob_base.description` | Description of the mob |
| `mobType` | `static_mob_base.mobType` | Type of mob |
| `level` | `static_mob_base.level` | Level of the mob |
| `health` | `static_mob_base.health` | Base health of the mob |
| `other fields...` | Various columns | Other properties related to mob base data |
@@ -1,70 +0,0 @@
# dbMobHandler Documentation
## Overview
This document describes the database relationships and interactions for the `dbMobHandler` class. This handler manages dynamic mob data in the game world, including their current state, location, and behavior.
## Handler Class
**File:** `src/engine/db/handlers/dbMobHandler.java`
**Class:** `dbMobHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Mob Table
- **Table Name:** `dyn_mob`
- **Description:** Stores current state information for mobs in the game world, including location, health, and status
- **Columns:**
- UID (Primary Key)
- mobBaseID
- zoneUUID
- x
- y
- z
- health
- isAlive
### Related Tables
| Table Name | Description | Relationship |
|------------|-------------|--------------|
| `obj_character` | Characters that may interact with mobs | OwnerUID → obj_character.UID |
## Key Queries
### Get Mob by UID
```sql
SELECT * FROM dyn_mob WHERE `UID` = ?
```
**File:** `dbMobHandler.java`, Line ~25
### Save Mob
```sql
INSERT INTO `dyn_mob` (`mobBaseID`, `zoneUUID`, `x`, `y`, `z`, `health`, `isAlive`) VALUES(?,?,?,?,?,?,?)
```
**File:** `dbMobHandler.java`, Line ~40
### Get Mobs by Zone
```sql
SELECT * FROM dyn_mob WHERE `zoneUUID` = ?
```
**File:** `dbMobHandler.java`, Line ~55
## Relationships
1. **Mob to Mob Base:** Many-to-one relationship via mobBaseID field referencing static_mob_base.UID
2. **Mob to Zone:** Many-to-one relationship via zoneUUID field referencing obj_zone.UID
3. **Mob to Owner:** Many-to-one relationship via ownerUID field referencing obj_character.UID (if applicable)
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `UID` | `dyn_mob.UID` | Unique identifier for the mob |
| `mobBaseID` | `dyn_mob.mobBaseID` | UID of the base mob definition |
| `zoneUUID` | `dyn_mob.zoneUUID` | Zone where the mob is located |
| `x` | `dyn_mob.x` | X coordinate of mob position |
| `y` | `dyn_mob.y` | Y coordinate of mob position |
| `z` | `dyn_mob.z` | Z coordinate of mob position |
| `health` | `dyn_mob.health` | Current health of the mob |
| `isAlive` | `dyn_mob.isAlive` | Flag indicating if mob is alive |
| `other fields...` | Various columns | Other properties related to mob state |
@@ -1,71 +0,0 @@
# dbNPCHandler Documentation
## Overview
This document describes the database relationships and interactions for the `dbNPCHandler` class. This handler manages non-player character (NPC) data, including their base properties, current state, and behaviors in the game world.
## Handler Class
**File:** `src/engine/db/handlers/dbNPCHandler.java`
**Class:** `dbNPCHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main NPC Table
- **Table Name:** `dyn_npc`
- **Description:** Stores current state information for NPCs, including location, health, and behavior flags
- **Columns:**
- UID (Primary Key)
- npcBaseID
- zoneUUID
- x
- y
- z
- health
- isAlive
- behavior
### Related Tables
| Table Name | Description | Relationship |
|------------|-------------|--------------|
| `static_npc_base` | Base properties of NPCs | npcBaseID → static_npc_base.UID |
## Key Queries
### Get NPC by UID
```sql
SELECT * FROM dyn_npc WHERE `UID` = ?
```
**File:** `dbNPCHandler.java`, Line ~25
### Save NPC
```sql
INSERT INTO `dyn_npc` (`npcBaseID`, `zoneUUID`, `x`, `y`, `z`, `health`, `isAlive`, `behavior`) VALUES(?,?,?,?,?,?,?,?)
```
**File:** `dbNPCHandler.java`, Line ~40
### Get NPCs by Zone
```sql
SELECT * FROM dyn_npc WHERE `zoneUUID` = ?
```
**File:** `dbNPCHandler.java`, Line ~55
## Relationships
1. **NPC to NPC Base:** Many-to-one relationship via npcBaseID field referencing static_npc_base.UID
2. **NPC to Zone:** Many-to-one relationship via zoneUUID field referencing obj_zone.UID
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `UID` | `dyn_npc.UID` | Unique identifier for the NPC |
| `npcBaseID` | `dyn_npc.npcBaseID` | UID of the base NPC definition |
| `zoneUUID` | `dyn_npc.zoneUUID` | Zone where the NPC is located |
| `x` | `dyn_npc.x` | X coordinate of NPC position |
| `y` | `dyn_npc.y` | Y coordinate of NPC position |
| `z` | `dyn_npc.z` | Z coordinate of NPC position |
| `health` | `dyn_npc.health` | Current health of the NPC |
| `isAlive` | `dyn_npc.isAlive` | Flag indicating if NPC is alive |
| `behavior` | `dyn_npc.behavior` | Behavior type or state of the NPC |
| `other fields...` | Various columns | Other properties related to NPC state |
@@ -1,72 +0,0 @@
# dbPetitionHandler Documentation
## Overview
This document describes the database relationships and interactions for the `dbPetitionHandler` class. This handler manages player petitions, which are requests or complaints submitted by players to game administrators.
## Handler Class
**File:** `src/engine/db/handlers/dbPetitionHandler.java`
**Class:** `dbPetitionHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Petition Table
- **Table Name:** `dyn_petition`
- **Description:** Stores information about player petitions, including submission details, status, and resolution
- **Columns:**
- UID (Primary Key)
- characterID
- petitionType
- description
- status
- submittedDate
- resolvedDate
### Related Tables
| Table Name | Description | Relationship |
|------------|-------------|--------------|
| `obj_character` | Characters who submitted petitions | characterID → obj_character.UID |
## Key Queries
### Get Petition by UID
```sql
SELECT * FROM dyn_petition WHERE `UID` = ?
```
**File:** `dbPetitionHandler.java`, Line ~25
### Save Petition
```sql
INSERT INTO `dyn_petition` (`characterID`, `petitionType`, `description`, `status`, `submittedDate`) VALUES(?,?,?,?,?)
```
**File:** `dbPetitionHandler.java`, Line ~40
### Get Petitions by Character
```sql
SELECT * FROM dyn_petition WHERE `characterID` = ?
```
**File:** `dbPetitionHandler.java`, Line ~55
### Update Petition Status
```sql
UPDATE `dyn_petition` SET `status`=?, `resolvedDate`=? WHERE `UID`=?
```
**File:** `dbPetitionHandler.java`, Line ~70
## Relationships
1. **Petition to Character:** Many-to-one relationship via characterID field referencing obj_character.UID
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `UID` | `dyn_petition.UID` | Unique identifier for the petition |
| `characterID` | `dyn_petition.characterID` | UID of the character who submitted the petition |
| `petitionType` | `dyn_petition.petitionType` | Type or category of the petition |
| `description` | `dyn_petition.description` | Description of the petition |
| `status` | `dyn_petition.status` | Current status of the petition (open, in progress, resolved) |
| `submittedDate` | `dyn_petition.submittedDate` | Timestamp when petition was submitted |
| `resolvedDate` | `dyn_petition.resolvedDate` | Timestamp when petition was resolved |
| `other fields...` | Various columns | Other properties related to petition data |
@@ -1,149 +0,0 @@
# Player Character Handler Documentation
## Overview
This document describes the database relationships and interactions for the `dbPlayerCharacterHandler` class. The player character handler manages all aspects of character data including creation, updates, and retrieval operations within the Magicbane emulator system.
## Handler Class
**File:** `src/engine/db/handlers/dbPlayerCharacterHandler.java`
**Class:** `dbPlayerCharacterHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Character Table
- **Table Name:** `obj_character`
- **Description:** Core character information including attributes, stats, and personal details
- **Columns:**
- UID (Primary Key)
- char_firstname
- char_lastname
- char_isActive
- char_raceID
- char_baseClassID
- char_promotionClassID
- char_strMod
- char_dexMod
- char_conMod
- char_intMod
- char_spiMod
- char_experience
- char_skinColor
- char_hairColor
- char_hairStyle
- char_beardColor
- char_beardStyle
- char_bindBuilding
- guildUID
- guild_isInnerCouncil
- guild_isRecruiter
- guild_isTaxCollector
- guild_isFullMember
- guild_title
- anniversery
- hash
### Related Tables
| Table Name | Description | Relationship |
|------------|-------------|--------------|
| `dyn_character_ignore` | Stores character ignore lists for players | accountUID → obj_account.UID |
| `dyn_character_friends` | Manages friendship relationships between characters | CharacterID → obj_character.UID |
| `dyn_character_guildhistory` | Tracks character's guild membership history | CharacterID → obj_character.UID, GuildID → obj_guild.UID |
| `dyn_character_heraldy` | Stores heraldry information for characters | CharacterID → obj_character.UID |
| `dyn_character_killmap` | Records kill statistics for characters | CharacterID → obj_character.UID |
| `dyn_character_murdermap` | Tracks murder statistics for characters | CharacterID → obj_character.UID |
| `dyn_character_power` | Manages character powers/abilities | CharacterID → obj_character.UID |
| `dyn_character_rune` | Stores rune information for characters | CharacterID → obj_character.UID |
| `dyn_character_skill` | Manages character skills and training | CharacterID → obj_character.UID |
## Key Queries
### Create New Character
```sql
CALL `character_CREATE`(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
```
**File:** `dbPlayerCharacterHandler.java`, Line ~35
### Get Characters for Account
```sql
SELECT `obj_character`.*, `object`.`parent` FROM `object` INNER JOIN `obj_character` ON `obj_character`.`UID` = `object`.`UID` WHERE `object`.`parent`=? && `obj_character`.`char_isActive`='1';
```
**File:** `dbPlayerCharacterHandler.java`, Line ~109
### Get All Active Characters
```sql
SELECT `obj_character`.*, `object`.`parent` FROM `object` INNER JOIN `obj_character` ON `obj_character`.`UID` = `object`.`UID` WHERE `obj_character`.`char_isActive`='1';
```
**File:** `dbPlayerCharacterHandler.java`, Line ~127
### Get Character by UID
```sql
SELECT `obj_character`.*, `object`.`parent` FROM `object` INNER JOIN `obj_character` ON `obj_character`.`UID` = `object`.`UID` WHERE `object`.`UID` = ?
```
**File:** `dbPlayerCharacterHandler.java`, Line ~185
### Get Character by Name
```sql
SELECT `char_firstname` FROM `obj_character` WHERE `char_isActive`=1 && `char_firstname`=?
```
**File:** `dbPlayerCharacterHandler.java`, Line ~203
### Update Character Name
```sql
UPDATE `obj_character` SET `char_firstname`=?, `char_lastname`=? WHERE `char_firstname`=? AND `char_isActive`='1'
```
**File:** `dbPlayerCharacterHandler.java`, Line ~222
### Set Character Ignore List
```sql
INSERT INTO `dyn_character_ignore` (`accountUID`, `ignoringUID`, `characterName`) VALUES (?, ?, ?)
```
**File:** `dbPlayerCharacterHandler.java`, Line ~83
### Get Character Ignore List
```sql
SELECT * FROM `dyn_character_ignore` WHERE `accountUID` = ?
```
**File:** `dbPlayerCharacterHandler.java`, Line ~151
## Relationships
1. **Character to Account:** Many-to-one (via `obj_character.parent` field referencing `obj_account.UID`)
2. **Character to Guild:** Many-to-one (via `obj_character.guildUID` field)
3. **Character to Ignore List:** One-to-many (via `dyn_character_ignore.accountUID`)
4. **Character to Friends List:** One-to-many (via `dyn_character_friends.CharacterID`)
5. **Character to Guild History:** One-to-many (via `dyn_character_guildhistory.CharacterID`)
6. **Character to Heraldry:** One-to-one (via `dyn_character_heraldy.CharacterID`)
7. **Character to Skills:** One-to-many (via `dyn_character_skill.CharacterID`)
8. **Character to Powers:** One-to-many (via `dyn_character_power.CharacterID`)
9. **Character to Runes:** One-to-many (via `dyn_character_rune.CharacterID`)
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `firstName` | `obj_character.char_firstname` | Character's first name |
| `lastName` | `obj_character.char_lastname` | Character's last name |
| `isActive` | `obj_character.char_isActive` | Boolean flag for active status |
| `race` | `obj_character.char_raceID` | Race identifier |
| `baseClass` | `obj_character.char_baseClassID` | Base class identifier |
| `promotionClass` | `obj_character.char_promotionClassID` | Promotion class identifier |
| `strMod` | `obj_character.char_strMod` | Strength modifier |
| `dexMod` | `obj_character.char_dexMod` | Dexterity modifier |
| `conMod` | `obj_character.char_conMod` | Constitution modifier |
| `intMod` | `obj_character.char_intMod` | Intelligence modifier |
| `spiMod` | `obj_character.char_spiMod` | Spirit modifier |
| `exp` | `obj_character.char_experience` | Experience points |
| `skinColor` | `obj_character.char_skinColor` | Skin color value |
| `hairColor` | `obj_character.char_hairColor` | Hair color value |
| `hairStyle` | `obj_character.char_hairStyle` | Hair style identifier |
| `beardColor` | `obj_character.char_beardColor` | Beard color value |
| `beardStyle` | `obj_character.char_beardStyle` | Beard style identifier |
| `bindBuilding` | `obj_character.char_bindBuilding` | Bind building UID |
| `guildUID` | `obj_character.guildUID` | Guild identifier |
| `isInnerCouncil` | `obj_character.guild_isInnerCouncil` | Inner council status |
| `isRecruiter` | `obj_character.guild_isRecruiter` | Recruiter status |
| `isTaxCollector` | `obj_character.guild_isTaxCollector` | Tax collector status |
| `isFullMember` | `obj_character.guild_isFullMember` | Full member status |
| `guildTitle` | `obj_character.guild_title` | Guild title identifier |
| `anniversery` | `obj_character.anniversery` | Anniversary flag |
@@ -1,81 +0,0 @@
# Power Handler Documentation
## Overview
This document describes the database relationships and interactions for the `dbPowerHandler` class. The power handler manages game powers and abilities that characters can possess and use in the Magicbane emulator system.
## Handler Class
**File:** `src/engine/db/handlers/dbPowerHandler.java`
**Class:** `dbPowerHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Table(s)
- **Table Name:** `obj_power`
- **Description:** Core power information including name, description, and activation properties
- **Columns:**
- UID (Primary Key)
- name
- description
- powerType
- activationType
- cooldownTime
- duration
- maxLevel
- cost
- iconID
### Related Tables
| Table Name | Description | Relationship |
|------------|-------------|--------------|
| `obj_character_power` | Tracks character-specific power levels and status | CharacterID → obj_character.UID, PowerID → obj_power.UID |
| `static_power_requirement` | Stores requirements for unlocking powers | PowerID → obj_power.UID |
## Key Queries
### Get Power by ID
```sql
SELECT * FROM `obj_power` WHERE `UID`=?
```
**File:** `dbPowerHandler.java`, Line ~60
### Get Character's Powers
```sql
SELECT p.*, cp.level, cp.isUnlocked
FROM `obj_power` p
INNER JOIN `obj_character_power` cp ON p.`UID` = cp.`PowerID`
WHERE cp.`CharacterID`=?
```
**File:** `dbPowerHandler.java`, Line ~85
### Get Power Requirements
```sql
SELECT * FROM `static_power_requirement` WHERE `PowerID`=?
```
**File:** `dbPowerHandler.java`, Line ~120
## Relationships
1. **Power to Character:** Many-to-many through `obj_character_power` table
2. **Power to Requirements:** One-to-many (via `static_power_requirement.PowerID`)
3. **Power to Static Data:** Power definitions are stored in static tables
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `name` | `obj_power.name` | Power name |
| `description` | `obj_power.description` | Power description |
| `powerType` | `obj_power.powerType` | Type of power (active, passive) |
| `activationType` | `obj_power.activationType` | How the power is activated |
| `cooldownTime` | `obj_power.cooldownTime` | Cooldown period in seconds |
| `duration` | `obj_power.duration` | Duration of power effect |
| `maxLevel` | `obj_power.maxLevel` | Maximum level for this power |
| `cost` | `obj_power.cost` | Resource cost to use power |
| `iconID` | `obj_power.iconID` | Icon identifier for UI display |
## Notes
- The power system is designed to support both active and passive abilities
- Power requirements are stored separately to allow flexible unlocking mechanisms
- Character-specific power data is tracked in the `obj_character_power` table
@@ -1,77 +0,0 @@
# Promotion Class Handler Documentation
## Overview
This document describes the database relationships and interactions for the `dbPromotionClassHandler` class. The promotion class handler manages character class promotions and advancement systems in the Magicbane emulator.
## Handler Class
**File:** `src/engine/db/handlers/dbPromotionClassHandler.java`
**Class:** `dbPromotionClassHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Table(s)
- **Table Name:** `obj_promotionclass`
- **Description:** Core promotion class information including name, requirements, and advancement paths
- **Columns:**
- UID (Primary Key)
- name
- description
- baseClassID
- requiredLevel
- requiredItems
- statBonuses
- skillBonus
### Related Tables
| Table Name | Description | Relationship |
|------------|-------------|--------------|
| `obj_character_promotionclass` | Tracks character-specific promotion class status | CharacterID → obj_character.UID, PromotionClassID → obj_promotionclass.UID |
| `static_promotion_requirement` | Stores requirements for class promotions | PromotionClassID → obj_promotionclass.UID |
## Key Queries
### Get Promotion Class by ID
```sql
SELECT * FROM `obj_promotionclass` WHERE `UID`=?
```
**File:** `dbPromotionClassHandler.java`, Line ~60
### Get Character's Promotion Classes
```sql
SELECT pc.*, cpc.isUnlocked
FROM `obj_promotionclass` pc
INNER JOIN `obj_character_promotionclass` cpc ON pc.`UID` = cpc.`PromotionClassID`
WHERE cpc.`CharacterID`=?
```
**File:** `dbPromotionClassHandler.java`, Line ~85
### Get Promotion Requirements
```sql
SELECT * FROM `static_promotion_requirement` WHERE `PromotionClassID`=?
```
**File:** `dbPromotionClassHandler.java`, Line ~120
## Relationships
1. **Promotion Class to Character:** Many-to-many through `obj_character_promotionclass` table
2. **Promotion Class to Requirements:** One-to-many (via `static_promotion_requirement.PromotionClassID`)
3. **Promotion Class to Base Class:** Many-to-one relationship via baseClassID
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `name` | `obj_promotionclass.name` | Promotion class name |
| `description` | `obj_promotionclass.description` | Description of the promotion class |
| `baseClassID` | `obj_promotionclass.baseClassID` | Reference to base class |
| `requiredLevel` | `obj_promotionclass.requiredLevel` | Level required for promotion |
| `requiredItems` | `obj_promotionclass.requiredItems` | Items required for promotion |
| `statBonuses` | `obj_promotionclass.statBonuses` | Stat bonuses granted |
| `skillBonus` | `obj_promotionclass.skillBonus` | Skill bonuses granted |
## Notes
- Promotion classes are tied to base classes and provide advancement paths for characters
- The system supports both unlocked and locked promotion classes
- Requirements are stored separately to allow flexible advancement mechanics
@@ -1,45 +0,0 @@
# Race Handler Documentation
## Overview
This document describes the database relationships and interactions for the `dbRaceHandler` class. The race handler manages race-related data including beard colors and styles for different races in the Magicbane emulator.
## Handler Class
**File:** `src/engine/db/handlers/dbRaceHandler.java`
**Class:** `dbRaceHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Race-related Tables
- **Table Name:** `static_rune_racebeardcolor`
- **Description:** Stores beard color information for different races
- **Columns:**
- RaceID (Foreign Key)
- color
## Key Queries
### Get Beard Colors for Race
```sql
SELECT `color` FROM `static_rune_racebeardcolor` WHERE `RaceID` = ?
```
**File:** `dbRaceHandler.java`, Line ~25
### Get Beard Styles for Race
```sql
SELECT `style` FROM `static_rune_racebeardstyle` WHERE `RaceID` = ?
```
**File:** `dbRaceHandler.java`, Line ~40
## Relationships
1. **Race to Beard Colors:** One-to-many (via `static_rune_racebeardcolor.RaceID`)
2. **Race to Beard Styles:** One-to-many (via `static_rune_racebeardstyle.RaceID`)
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `RaceID` | `static_rune_racebeardcolor.RaceID` | Foreign key to race |
| `color` | `static_rune_racebeardcolor.color` | Beard color value |
@@ -1,78 +0,0 @@
# Realm Handler Documentation
## Overview
This document describes the database relationships and interactions for the `dbRealmHandler` class. The realm handler manages different game realms or worlds within the Magicbane emulator system.
## Handler Class
**File:** `src/engine/db/handlers/dbRealmHandler.java`
**Class:** `dbRealmHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Table(s)
- **Table Name:** `obj_realm`
- **Description:** Core realm information including name, status, and configuration settings
- **Columns:**
- UID (Primary Key)
- name
- description
- status
- maxPlayers
- serverIP
- serverPort
- isPublic
- creationDate
### Related Tables
| Table Name | Description | Relationship |
|------------|-------------|--------------|
| `dyn_realm_playerlist` | Tracks active players in each realm | RealmID → obj_realm.UID, CharacterID → obj_character.UID |
| `obj_realm_config` | Configuration settings for each realm | RealmID → obj_realm.UID |
## Key Queries
### Get Realm by ID
```sql
SELECT * FROM `obj_realm` WHERE `UID`=?
```
**File:** `dbRealmHandler.java`, Line ~60
### Get All Active Realms
```sql
SELECT * FROM `obj_realm` WHERE `status`='active'
```
**File:** `dbRealmHandler.java`, Line ~85
### Get Realm Players
```sql
SELECT c.* FROM `obj_character` c
INNER JOIN `dyn_realm_playerlist` rpl ON c.`UID` = rpl.`CharacterID`
WHERE rpl.`RealmID`=?
```
**File:** `dbRealmHandler.java`, Line ~120
## Relationships
1. **Realm to Character:** Many-to-many through `dyn_realm_playerlist` table
2. **Realm to Configuration:** One-to-one (via `obj_realm_config.RealmID`)
3. **Realm to Player Status:** Real-time tracking of active players
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `name` | `obj_realm.name` | Realm name |
| `description` | `obj_realm.description` | Description of the realm |
| `status` | `obj_realm.status` | Current status (active, inactive) |
| `maxPlayers` | `obj_realm.maxPlayers` | Maximum number of players allowed |
| `serverIP` | `obj_realm.serverIP` | Server IP address |
| `serverPort` | `obj_realm.serverPort` | Server port number |
| `isPublic` | `obj_realm.isPublic` | Whether realm is publicly accessible |
| `creationDate` | `obj_realm.creationDate` | When the realm was created |
## Notes
- Realms represent different game worlds or instances
- Players can move between realms based on configuration
- The system tracks real-time player presence in each realm
@@ -1,69 +0,0 @@
# Resist Handler Documentation
## Overview
This document describes the database relationships and interactions for the `dbResistHandler` class. The resist handler manages character resistance values against various damage types and effects in the Magicbane emulator system.
## Handler Class
**File:** `src/engine/db/handlers/dbResistHandler.java`
**Class:** `dbResistHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Table(s)
- **Table Name:** `obj_resist`
- **Description:** Core resistance information including damage type and resistance values
- **Columns:**
- UID (Primary Key)
- resistType
- value
- description
### Related Tables
| Table Name | Description | Relationship |
|------------|-------------|--------------|
| `obj_character_resist` | Tracks character-specific resistance values | CharacterID → obj_character.UID, ResistID → obj_resist.UID |
| `static_resist_type` | Static definitions of resistance types | ResistTypeID → obj_resist.UID |
## Key Queries
### Get Resist by ID
```sql
SELECT * FROM `obj_resist` WHERE `UID`=?
```
**File:** `dbResistHandler.java`, Line ~60
### Get Character's Resistances
```sql
SELECT r.*, cr.value as characterValue
FROM `obj_resist` r
INNER JOIN `obj_character_resist` cr ON r.`UID` = cr.`ResistID`
WHERE cr.`CharacterID`=?
```
**File:** `dbResistHandler.java`, Line ~85
### Get Resist by Type
```sql
SELECT * FROM `obj_resist` WHERE `resistType`=?
```
**File:** `dbResistHandler.java`, Line ~120
## Relationships
1. **Resist to Character:** Many-to-many through `obj_character_resist` table
2. **Resist to Static Types:** One-to-many (via `static_resist_type.ResistTypeID`)
3. **Resist to Damage Types:** Direct mapping to game damage types
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `resistType` | `obj_resist.resistType` | Type of resistance (fire, ice, etc.) |
| `value` | `obj_resist.value` | Resistance value |
| `description` | `obj_resist.description` | Description of the resistance type |
## Notes
- Resistances are applied to various damage types in combat
- Character-specific resistances can be modified through equipment or abilities
- The system supports multiple resistance types for comprehensive damage mitigation
@@ -1,77 +0,0 @@
# Rune Base Attribute Handler Documentation
## Overview
This document describes the database relationships and interactions for the `dbRuneBaseAttributeHandler` class. The rune base attribute handler manages the fundamental attributes and properties of rune base items in the Magicbane emulator system.
## Handler Class
**File:** `src/engine/db/handlers/dbRuneBaseAttributeHandler.java`
**Class:** `dbRuneBaseAttributeHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Table(s)
- **Table Name:** `obj_runebaseattribute`
- **Description:** Core rune base attribute information including name, description, and property values
- **Columns:**
- UID (Primary Key)
- name
- description
- attributeType
- minValue
- maxValue
- defaultValue
- isStackable
### Related Tables
| Table Name | Description | Relationship |
|------------|-------------|--------------|
| `obj_rune_baseattribute` | Links rune base items to their attributes | RuneBaseID → obj_runebase.UID, AttributeID → obj_runebaseattribute.UID |
| `static_rune_attribute_type` | Static definitions of attribute types | AttributeTypeID → obj_runebaseattribute.UID |
## Key Queries
### Get Rune Base Attribute by ID
```sql
SELECT * FROM `obj_runebaseattribute` WHERE `UID`=?
```
**File:** `dbRuneBaseAttributeHandler.java`, Line ~60
### Get Attributes for Rune Base
```sql
SELECT rba.*, rbaa.attributeValue
FROM `obj_runebaseattribute` rba
INNER JOIN `obj_rune_baseattribute` rbaa ON rba.`UID` = rbaa.`AttributeID`
WHERE rbaa.`RuneBaseID`=?
```
**File:** `dbRuneBaseAttributeHandler.java`, Line ~85
### Get Attribute by Type
```sql
SELECT * FROM `obj_runebaseattribute` WHERE `attributeType`=?
```
**File:** `dbRuneBaseAttributeHandler.java`, Line ~120
## Relationships
1. **Rune Base Attribute to Rune Base:** Many-to-many through `obj_rune_baseattribute` table
2. **Rune Base Attribute to Static Types:** One-to-many (via `static_rune_attribute_type.AttributeTypeID`)
3. **Attribute to Property Values:** Defines the range and default values for each attribute
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `name` | `obj_runebaseattribute.name` | Attribute name |
| `description` | `obj_runebaseattribute.description` | Description of the attribute |
| `attributeType` | `obj_runebaseattribute.attributeType` | Type of attribute (stat, effect, etc.) |
| `minValue` | `obj_runebaseattribute.minValue` | Minimum value allowed |
| `maxValue` | `obj_runebaseattribute.maxValue` | Maximum value allowed |
| `defaultValue` | `obj_runebaseattribute.defaultValue` | Default value for the attribute |
| `isStackable` | `obj_runebaseattribute.isStackable` | Whether the attribute can stack |
## Notes
- Rune base attributes define the core properties of rune items
- Attributes can be applied to different rune base types
- The system supports both fixed and variable attribute values
@@ -1,77 +0,0 @@
# Rune Base Effect Handler Documentation
## Overview
This document describes the database relationships and interactions for the `dbRuneBaseEffectHandler` class. The rune base effect handler manages the effects and abilities that rune base items can provide in the Magicbane emulator system.
## Handler Class
**File:** `src/engine/db/handlers/dbRuneBaseEffectHandler.java`
**Class:** `dbRuneBaseEffectHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Table(s)
- **Table Name:** `obj_runebaseeffect`
- **Description:** Core rune base effect information including name, description, and activation properties
- **Columns:**
- UID (Primary Key)
- name
- description
- effectType
- activationType
- duration
- cooldownTime
- powerValue
### Related Tables
| Table Name | Description | Relationship |
|------------|-------------|--------------|
| `obj_rune_baseeffect` | Links rune base items to their effects | RuneBaseID → obj_runebase.UID, EffectID → obj_runebaseeffect.UID |
| `static_rune_effect_type` | Static definitions of effect types | EffectTypeID → obj_runebaseeffect.UID |
## Key Queries
### Get Rune Base Effect by ID
```sql
SELECT * FROM `obj_runebaseeffect` WHERE `UID`=?
```
**File:** `dbRuneBaseEffectHandler.java`, Line ~60
### Get Effects for Rune Base
```sql
SELECT rbe.*, rba.effectValue
FROM `obj_runebaseeffect` rbe
INNER JOIN `obj_rune_baseeffect` rba ON rbe.`UID` = rba.`EffectID`
WHERE rba.`RuneBaseID`=?
```
**File:** `dbRuneBaseEffectHandler.java`, Line ~85
### Get Effect by Type
```sql
SELECT * FROM `obj_runebaseeffect` WHERE `effectType`=?
```
**File:** `dbRuneBaseEffectHandler.java`, Line ~120
## Relationships
1. **Rune Base Effect to Rune Base:** Many-to-many through `obj_rune_baseeffect` table
2. **Rune Base Effect to Static Types:** One-to-many (via `static_rune_effect_type.EffectTypeID`)
3. **Effect to Activation Properties:** Defines how effects are triggered and applied
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `name` | `obj_runebaseeffect.name` | Effect name |
| `description` | `obj_runebaseeffect.description` | Description of the effect |
| `effectType` | `obj_runebaseeffect.effectType` | Type of effect (damage, healing, buff, etc.) |
| `activationType` | `obj_runebaseeffect.activationType` | How the effect is activated |
| `duration` | `obj_runebaseeffect.duration` | Duration of effect in seconds |
| `cooldownTime` | `obj_runebaseeffect.cooldownTime` | Cooldown period between activations |
| `powerValue` | `obj_runebaseeffect.powerValue` | Strength or power value of the effect |
## Notes
- Rune base effects define the abilities and powers that runes can provide
- Effects have various activation methods (passive, active, triggered)
- The system supports duration-based and cooldown-based effects
@@ -1,76 +0,0 @@
# Rune Base Handler Documentation
## Overview
This document describes the database relationships and interactions for the `dbRuneBaseHandler` class. The rune base handler manages the base definitions and properties of rune items in the Magicbane emulator system.
## Handler Class
**File:** `src/engine/db/handlers/dbRuneBaseHandler.java`
**Class:** `dbRuneBaseHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Table(s)
- **Table Name:** `obj_runebase`
- **Description:** Core rune base item information including name, description, and basic properties
- **Columns:**
- UID (Primary Key)
- name
- description
- itemType
- rarity
- iconID
- value
- weight
### Related Tables
| Table Name | Description | Relationship |
|------------|-------------|--------------|
| `obj_rune_baseattribute` | Links rune base items to their attributes | RuneBaseID → obj_runebase.UID, AttributeID → obj_runebaseattribute.UID |
| `obj_rune_baseeffect` | Links rune base items to their effects | RuneBaseID → obj_runebase.UID, EffectID → obj_runebaseeffect.UID |
| `static_rune_type` | Static definitions of rune types | RuneTypeID → obj_runebase.UID |
## Key Queries
### Get Rune Base by ID
```sql
SELECT * FROM `obj_runebase` WHERE `UID`=?
```
**File:** `dbRuneBaseHandler.java`, Line ~60
### Get All Rune Bases
```sql
SELECT * FROM `obj_runebase`
```
**File:** `dbRuneBaseHandler.java`, Line ~85
### Get Rune Base by Type
```sql
SELECT * FROM `obj_runebase` WHERE `itemType`=?
```
**File:** `dbRuneBaseHandler.java`, Line ~120
## Relationships
1. **Rune Base to Attributes:** Many-to-many through `obj_rune_baseattribute` table
2. **Rune Base to Effects:** Many-to-many through `obj_rune_baseeffect` table
3. **Rune Base to Static Types:** One-to-many (via `static_rune_type.RuneTypeID`)
4. **Rune Base to Item Properties:** Defines the core characteristics of rune items
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `name` | `obj_runebase.name` | Rune base name |
| `description` | `obj_runebase.description` | Description of the rune |
| `itemType` | `obj_runebase.itemType` | Type of rune (weapon, armor, etc.) |
| `rarity` | `obj_runebase.rarity` | Rarity level of the rune |
| `iconID` | `obj_runebase.iconID` | Icon identifier for UI display |
| `value` | `obj_runebase.value` | Value or worth of the rune |
| `weight` | `obj_runebase.weight` | Weight of the rune item |
## Notes
- Rune bases define the fundamental properties of all rune items in the game
- Each rune base can have multiple attributes and effects associated with it
- The system supports various rune types with different characteristics
@@ -1,78 +0,0 @@
# Runegate Handler Documentation
## Overview
This document describes the database relationships and interactions for the `dbRunegateHandler` class. The runegate handler manages runegate structures and their properties in the Magicbane emulator system.
## Handler Class
**File:** `src/engine/db/handlers/dbRunegateHandler.java`
**Class:** `dbRunegateHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Table(s)
- **Table Name:** `obj_runegate`
- **Description:** Core runegate information including location, properties, and activation status
- **Columns:**
- UID (Primary Key)
- name
- description
- locationX
- locationY
- locationZ
- isActive
- activationTime
- cooldownPeriod
- destinationRealmID
### Related Tables
| Table Name | Description | Relationship |
|------------|-------------|--------------|
| `obj_runegate_connection` | Links runegates to their destinations | SourceRunegateID → obj_runegate.UID, DestinationRunegateID → obj_runegate.UID |
| `dyn_runegate_usage` | Tracks usage history of runegates | RunegateID → obj_runegate.UID, CharacterID → obj_character.UID |
## Key Queries
### Get Runegate by ID
```sql
SELECT * FROM `obj_runegate` WHERE `UID`=?
```
**File:** `dbRunegateHandler.java`, Line ~60
### Get Active Runegates
```sql
SELECT * FROM `obj_runegate` WHERE `isActive`=1
```
**File:** `dbRunegateHandler.java`, Line ~85
### Get Runegate by Location
```sql
SELECT * FROM `obj_runegate` WHERE `locationX`=? AND `locationY`=? AND `locationZ`=?
```
**File:** `dbRunegateHandler.java`, Line ~120
## Relationships
1. **Runegate to Connections:** Many-to-many through `obj_runegate_connection` table
2. **Runegate to Usage History:** One-to-many (via `dyn_runegate_usage.RunegateID`)
3. **Runegate to Destination Realms:** Links runegates to different game realms
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `name` | `obj_runegate.name` | Runegate name |
| `description` | `obj_runegate.description` | Description of the runegate |
| `locationX` | `obj_runegate.locationX` | X coordinate of runegate location |
| `locationY` | `obj_runegate.locationY` | Y coordinate of runegate location |
| `locationZ` | `obj_runegate.locationZ` | Z coordinate of runegate location |
| `isActive` | `obj_runegate.isActive` | Whether the runegate is currently active |
| `activationTime` | `obj_runegate.activationTime` | Time when runegate was last activated |
| `cooldownPeriod` | `obj_runegate.cooldownPeriod` | Cooldown period between uses |
| `destinationRealmID` | `obj_runegate.destinationRealmID` | Realm ID for destination |
## Notes
- Runegates function as teleportation devices in the game world
- They can connect to other runegates in different locations or realms
- The system tracks usage history for balance and maintenance purposes
@@ -1,78 +0,0 @@
# Shrine Handler Documentation
## Overview
This document describes the database relationships and interactions for the `dbShrineHandler` class. The shrine handler manages shrine structures and their properties in the Magicbane emulator system.
## Handler Class
**File:** `src/engine/db/handlers/dbShrineHandler.java`
**Class:** `dbShrineHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Table(s)
- **Table Name:** `obj_shrine`
- **Description:** Core shrine information including location, properties, and effects
- **Columns:**
- UID (Primary Key)
- name
- description
- locationX
- locationY
- locationZ
- shrineType
- isActive
- effectDuration
- effectPower
### Related Tables
| Table Name | Description | Relationship |
|------------|-------------|--------------|
| `obj_shrine_effect` | Defines effects provided by shrines | ShrineID → obj_shrine.UID, EffectID → obj_shrineeffect.UID |
| `dyn_shrine_usage` | Tracks usage history of shrines | ShrineID → obj_shrine.UID, CharacterID → obj_character.UID |
## Key Queries
### Get Shrine by ID
```sql
SELECT * FROM `obj_shrine` WHERE `UID`=?
```
**File:** `dbShrineHandler.java`, Line ~60
### Get Active Shrines
```sql
SELECT * FROM `obj_shrine` WHERE `isActive`=1
```
**File:** `dbShrineHandler.java`, Line ~85
### Get Shrine by Location
```sql
SELECT * FROM `obj_shrine` WHERE `locationX`=? AND `locationY`=? AND `locationZ`=?
```
**File:** `dbShrineHandler.java`, Line ~120
## Relationships
1. **Shrine to Effects:** Many-to-many through `obj_shrine_effect` table
2. **Shrine to Usage History:** One-to-many (via `dyn_shrine_usage.ShrineID`)
3. **Shrine to Shrine Types:** Different types of shrines with different effects
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `name` | `obj_shrine.name` | Shrine name |
| `description` | `obj_shrine.description` | Description of the shrine |
| `locationX` | `obj_shrine.locationX` | X coordinate of shrine location |
| `locationY` | `obj_shrine.locationY` | Y coordinate of shrine location |
| `locationZ` | `obj_shrine.locationZ` | Z coordinate of shrine location |
| `shrineType` | `obj_shrine.shrineType` | Type of shrine (healing, buff, etc.) |
| `isActive` | `obj_shrine.isActive` | Whether the shrine is currently active |
| `effectDuration` | `obj_shrine.effectDuration` | Duration of shrine effects |
| `effectPower` | `obj_shrine.effectPower` | Power level of shrine effects |
## Notes
- Shrines provide various beneficial effects to players who interact with them
- They can be healing shrines, buff shrines, or other special effect shrines
- The system tracks usage history for balance and maintenance purposes
@@ -1,81 +0,0 @@
# Skill Base Handler Documentation
## Overview
This document describes the database relationships and interactions for the `dbSkillBaseHandler` class. The skill base handler manages the fundamental definitions and properties of skills in the Magicbane emulator system.
## Handler Class
**File:** `src/engine/db/handlers/dbSkillBaseHandler.java`
**Class:** `dbSkillBaseHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Table(s)
- **Table Name:** `obj_skillbase`
- **Description:** Core skill base information including name, description, and activation properties
- **Columns:**
- UID (Primary Key)
- name
- description
- skillType
- activationType
- cooldownTime
- duration
- maxLevel
- cost
- iconID
### Related Tables
| Table Name | Description | Relationship |
|------------|-------------|--------------|
| `obj_character_skill` | Tracks character-specific skill levels and status | CharacterID → obj_character.UID, SkillID → obj_skillbase.UID |
| `static_skill_requirement` | Stores requirements for unlocking skills | SkillID → obj_skillbase.UID |
## Key Queries
### Get Skill Base by ID
```sql
SELECT * FROM `obj_skillbase` WHERE `UID`=?
```
**File:** `dbSkillBaseHandler.java`, Line ~60
### Get Character's Skills
```sql
SELECT s.*, cs.level, cs.isUnlocked
FROM `obj_skillbase` s
INNER JOIN `obj_character_skill` cs ON s.`UID` = cs.`SkillID`
WHERE cs.`CharacterID`=?
```
**File:** `dbSkillBaseHandler.java`, Line ~85
### Get Skill Requirements
```sql
SELECT * FROM `static_skill_requirement` WHERE `SkillID`=?
```
**File:** `dbSkillBaseHandler.java`, Line ~120
## Relationships
1. **Skill Base to Character:** Many-to-many through `obj_character_skill` table
2. **Skill Base to Requirements:** One-to-many (via `static_skill_requirement.SkillID`)
3. **Skill Base to Static Data:** Skill definitions are stored in static tables
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `name` | `obj_skillbase.name` | Skill name |
| `description` | `obj_skillbase.description` | Skill description |
| `skillType` | `obj_skillbase.skillType` | Type of skill (attack, defense, support) |
| `activationType` | `obj_skillbase.activationType` | How the skill is activated |
| `cooldownTime` | `obj_skillbase.cooldownTime` | Cooldown period in seconds |
| `duration` | `obj_skillbase.duration` | Duration of skill effect |
| `maxLevel` | `obj_skillbase.maxLevel` | Maximum level for this skill |
| `cost` | `obj_skillbase.cost` | Resource cost to use skill |
| `iconID` | `obj_skillbase.iconID` | Icon identifier for UI display |
## Notes
- Skill bases define the core properties of all skills in the game
- Skills can be activated in various ways (instant, channeling, etc.)
- The system supports both unlocked and locked skill progression
@@ -1,75 +0,0 @@
# Skill Requirement Handler Documentation
## Overview
This document describes the database relationships and interactions for the `dbSkillReqHandler` class. The skill requirement handler manages the prerequisites and conditions needed to unlock or use various skills in the Magicbane emulator system.
## Handler Class
**File:** `src/engine/db/handlers/dbSkillReqHandler.java`
**Class:** `dbSkillReqHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Table(s)
- **Table Name:** `static_skill_requirement`
- **Description:** Core skill requirement information including type, value, and conditions
- **Columns:**
- UID (Primary Key)
- skillID
- requirementType
- requirementValue
- prerequisiteSkillID
- prerequisiteLevel
- prerequisiteStat
### Related Tables
| Table Name | Description | Relationship |
|------------|-------------|--------------|
| `obj_skillbase` | Links to the skill that has requirements | SkillID → obj_skillbase.UID |
| `obj_character_skill` | Tracks character-specific skill status | CharacterID → obj_character.UID, SkillID → obj_skillbase.UID |
## Key Queries
### Get Skill Requirements by Skill ID
```sql
SELECT * FROM `static_skill_requirement` WHERE `skillID`=?
```
**File:** `dbSkillReqHandler.java`, Line ~60
### Get Specific Requirement by ID
```sql
SELECT * FROM `static_skill_requirement` WHERE `UID`=?
```
**File:** `dbSkillReqHandler.java`, Line ~85
### Get Requirements for Character Skill
```sql
SELECT sr.*, cs.level as characterLevel
FROM `static_skill_requirement` sr
LEFT JOIN `obj_character_skill` cs ON sr.`prerequisiteSkillID` = cs.`SkillID`
WHERE sr.`skillID`=?
```
**File:** `dbSkillReqHandler.java`, Line ~120
## Relationships
1. **Skill Requirement to Skill Base:** Many-to-one (via `skillID` → obj_skillbase.UID)
2. **Skill Requirement to Prerequisite Skills:** Many-to-one (via `prerequisiteSkillID` → obj_skillbase.UID)
3. **Skill Requirement to Character Skills:** One-to-many through character skill tracking
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `skillID` | `static_skill_requirement.skillID` | Reference to the skill that requires this condition |
| `requirementType` | `static_skill_requirement.requirementType` | Type of requirement (level, skill, stat) |
| `requirementValue` | `static_skill_requirement.requirementValue` | Value needed for requirement |
| `prerequisiteSkillID` | `static_skill_requirement.prerequisiteSkillID` | Prerequisite skill ID if applicable |
| `prerequisiteLevel` | `static_skill_requirement.prerequisiteLevel` | Required level of prerequisite skill |
| `prerequisiteStat` | `static_skill_requirement.prerequisiteStat` | Required stat value if applicable |
## Notes
- Skill requirements define the conditions needed to unlock or use skills
- Requirements can be based on character level, other skills, or specific stats
- The system supports complex requirement chains for advanced skill trees
@@ -1,72 +0,0 @@
# Vendor Dialog Handler Documentation
## Overview
This document describes the database relationships and interactions for the `dbVendorDialogHandler` class. The vendor dialog handler manages the dialog systems and interaction options for NPC vendors in the Magicbane emulator system.
## Handler Class
**File:** `src/engine/db/handlers/dbVendorDialogHandler.java`
**Class:** `dbVendorDialogHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Table(s)
- **Table Name:** `static_npc_dialog`
- **Description:** Core vendor dialog information including text, options, and responses
- **Columns:**
- UID (Primary Key)
- npcID
- dialogText
- responseType
- nextDialogID
- isFinal
- triggerEvent
### Related Tables
| Table Name | Description | Relationship |
|------------|-------------|--------------|
| `static_npc_dialog_option` | Defines available options for each dialog | DialogID → static_npc_dialog.UID |
| `obj_npc` | Links to the NPC that has this dialog system | npcID → obj_npc.UID |
## Key Queries
### Get Dialog by ID
```sql
SELECT * FROM `static_npc_dialog` WHERE `UID`=?
```
**File:** `dbVendorDialogHandler.java`, Line ~60
### Get Dialog Options for Dialog
```sql
SELECT * FROM `static_npc_dialog_option` WHERE `dialogID`=?
```
**File:** `dbVendorDialogHandler.java`, Line ~85
### Get Initial Dialog for NPC
```sql
SELECT * FROM `static_npc_dialog` WHERE `npcID`=? AND `nextDialogID` IS NULL
```
**File:** `dbVendorDialogHandler.java`, Line ~120
## Relationships
1. **Dialog to Options:** One-to-many (via `dialogID` → static_npc_dialog.UID)
2. **Dialog to NPC:** Many-to-one (via `npcID` → obj_npc.UID)
3. **Dialog to Next Dialog:** Chain of dialog progression through `nextDialogID`
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `npcID` | `static_npc_dialog.npcID` | Reference to the NPC this dialog belongs to |
| `dialogText` | `static_npc_dialog.dialogText` | Text displayed in the dialog |
| `responseType` | `static_npc_dialog.responseType` | Type of response expected (buy, sell, quest) |
| `nextDialogID` | `static_npc_dialog.nextDialogID` | ID of next dialog in sequence |
| `isFinal` | `static_npc_dialog.isFinal` | Whether this is the final dialog in chain |
| `triggerEvent` | `static_npc_dialog.triggerEvent` | Event that triggers this dialog |
## Notes
- Vendor dialogs provide interactive communication with NPCs
- Dialog systems support branching conversations and quest progression
- The system handles complex dialog chains with multiple options and outcomes
@@ -1,83 +0,0 @@
# Warehouse Handler Documentation
## Overview
This document describes the database relationships and interactions for the `dbWarehouseHandler` class. The warehouse handler manages storage systems and inventory management for characters in the Magicbane emulator system.
## Handler Class
**File:** `src/engine/db/handlers/dbWarehouseHandler.java`
**Class:** `dbWarehouseHandler`
**Extends:** `dbHandlerBase`
## Database Tables
### Main Table(s)
- **Table Name:** `obj_warehouse`
- **Description:** Core warehouse information including storage capacity and location
- **Columns:**
- UID (Primary Key)
- name
- description
- characterID
- storageCapacity
- currentStorage
- locationX
- locationY
- locationZ
- isPublic
### Related Tables
| Table Name | Description | Relationship |
|------------|-------------|--------------|
| `obj_warehouse_item` | Tracks items stored in warehouses | WarehouseID → obj_warehouse.UID, ItemID → obj_item.UID |
| `obj_character_warehouse` | Links characters to their warehouse access | CharacterID → obj_character.UID, WarehouseID → obj_warehouse.UID |
## Key Queries
### Get Warehouse by ID
```sql
SELECT * FROM `obj_warehouse` WHERE `UID`=?
```
**File:** `dbWarehouseHandler.java`, Line ~60
### Get Character's Warehouses
```sql
SELECT w.* FROM `obj_warehouse` w
INNER JOIN `obj_character_warehouse` cw ON w.`UID` = cw.`WarehouseID`
WHERE cw.`CharacterID`=?
```
**File:** `dbWarehouseHandler.java`, Line ~85
### Get Warehouse Items
```sql
SELECT i.*, wi.quantity
FROM `obj_item` i
INNER JOIN `obj_warehouse_item` wi ON i.`UID` = wi.`ItemID`
WHERE wi.`WarehouseID`=?
```
**File:** `dbWarehouseHandler.java`, Line ~120
## Relationships
1. **Warehouse to Items:** Many-to-many through `obj_warehouse_item` table
2. **Warehouse to Characters:** Many-to-many through `obj_character_warehouse` table
3. **Warehouse to Storage Capacity:** Tracks current and maximum storage limits
## Java Field to Database Column Mappings
| Java Field | Database Column | Notes |
|------------|-----------------|-------|
| `name` | `obj_warehouse.name` | Warehouse name |
| `description` | `obj_warehouse.description` | Description of the warehouse |
| `characterID` | `obj_warehouse.characterID` | Character who owns this warehouse |
| `storageCapacity` | `obj_warehouse.storageCapacity` | Maximum storage capacity |
| `currentStorage` | `obj_warehouse.currentStorage` | Current amount of stored items |
| `locationX` | `obj_warehouse.locationX` | X coordinate of warehouse location |
| `locationY` | `obj_warehouse.locationY` | Y coordinate of warehouse location |
| `locationZ` | `obj_warehouse.locationZ` | Z coordinate of warehouse location |
| `isPublic` | `obj_warehouse.isPublic` | Whether the warehouse is publicly accessible |
## Notes
- Warehouses provide extended storage for character inventories
- Multiple characters can access shared warehouses
- The system tracks both storage capacity and current usage
@@ -1,201 +0,0 @@
# Magicbane Database Handler Documentation Index
This index provides an overview of all database handler documentation files created for the Magicbane emulator project.
## Available Documentation Files
1. **dbAccountHandler_Documentation.md**
- Documents account management functionality including authentication and account status tracking
- Covers `obj_account` table and its relationships to character objects
2. **dbCityHandler_Documentation.md**
- Documents city management functionality including city creation, zones, and buildings
- Covers `obj_city`, `obj_zone`, and `obj_building` tables
3. **dbPlayerCharacterHandler_Documentation.md**
- Describes player character handling including creation, updates, and retrieval operations
- Covers `obj_character` table and related dynamic tables
4. **dbRaceHandler_Documentation.md**
- Describes race-related data handling for beard colors and styles
- Focuses on static race data tables
5. **dbGuildHandler_Documentation.md**
- Describes the complex guild system with relationships to history, alliances, enemies, and member management
- Covers multiple related tables including `obj_guild`, `dyn_character_guildhistory`, `dyn_guild_allianceenemylist`, etc.
6. **dbBaneHandler_Documentation.md**
- Documents bane management functionality for city-based special objects
- Covers `dyn_banes` table and its relationships to cities, players, and buildings
7. **dbCSSessionHandler_Documentation.md**
- Documents client session management including session creation, retrieval, updating, and deletion
- Covers `dyn_session` table and its relationships to accounts and characters
8. **dbKitHandler_Documentation.md**
- Documents kit management functionality for static kit data
- Covers `static_rune_validkit` table and its relationships to races, classes, and items
9. **dbLootHandler_Documentation.md**
- Documents loot system functionality including general tables, item tables, modifier tables, and booty sets
- Covers `static_loot_gen`, `static_loot_item`, `static_loot_mod`, `static_loot_modtype`, and `static_loot_bootySet` tables
10. **dbMenuHandler_Documentation.md**
- Documents NPC menu option handling including retrieval of menu options by menu ID
- Covers `static_npc_menuoption` table
11. **dbContractHandler_Documentation.md**
- Documents contract management functionality for player contracts and quest tracking
- Covers `dyn_contract` table and its relationships to characters and quests
12. **dbEffectsBaseHandler_Documentation.md**
- Documents effect base data handling including effect types, categories, and properties
- Covers `static_effect_base` table and related lookup tables
13. **dbEffectsResourceCostHandler_Documentation.md**
- Documents resource cost handling for game effects and abilities
- Covers `static_effect_resourcecost` table and its relationships to effects and resources
14. **dbEnchantmentHandler_Documentation.md**
- Documents enchantment management functionality for item enhancements
- Covers `dyn_enchantment` table and related data structures
15. **dbHeightMapHandler_Documentation.md**
- Documents height map data handling for terrain and elevation information
- Covers `static_heightmap` table and its spatial data relationships
16. **dbItemBaseHandler_Documentation.md**
- Documents base item data handling including item properties, types, and categories
- Covers `static_item_base` table and related lookup tables
17. **dbItemHandler_Documentation.md**
- Documents item management functionality for player inventory and items
- Covers `dyn_item` table and its relationships to characters and locations
18. **dbMineHandler_Documentation.md**
- Documents mine management functionality including resource extraction and mining operations
- Covers `dyn_mine` table and related mining data structures
19. **dbMobBaseHandler_Documentation.md**
- Documents base mob data handling including mob types, stats, and behaviors
- Covers `static_mob_base` table and related lookup tables
20. **dbMobHandler_Documentation.md**
- Documents mob management functionality for NPC creatures and monster behavior
- Covers `dyn_mob` table and its relationships to zones and character data
21. **dbNPCHandler_Documentation.md**
- Documents NPC handling including conversation systems and NPC properties
- Covers `dyn_npc` table and related interaction data
22. **dbPetitionHandler_Documentation.md**
- Documents petition management functionality for player support requests
- Covers `dyn_petition` table and its relationships to accounts and characters
23. **dbPowerHandler_Documentation.md**
- Documents power handling including character abilities, skills, and power systems
- Covers `static_power_base`, `dyn_character_power`, and related tables
24. **dbPromotionClassHandler_Documentation.md**
- Documents promotion class handling for character advancement and class changes
- Covers `static_promotion_class` table and related data structures
25. **dbRealmHandler_Documentation.md**
- Documents realm management functionality including realm data and server information
- Covers `obj_realm` table and its relationships to accounts and characters
26. **dbResistHandler_Documentation.md**
- Documents resistance handling for character stats and damage mitigation
- Covers `static_resist` table and related resistance data structures
27. **dbRuneBaseAttributeHandler_Documentation.md**
- Documents rune base attribute handling for magical properties and modifiers
- Covers `static_rune_baseattribute` table and related lookup tables
28. **dbRuneBaseEffectHandler_Documentation.md**
- Documents rune base effect handling including effect types and properties
- Covers `static_rune_baseeffect` table and related data structures
29. **dbRuneBaseHandler_Documentation.md**
- Documents rune base data handling for rune creation and properties
- Covers `static_rune_base` table and related lookup tables
30. **dbRunegateHandler_Documentation.md**
- Documents runegate management functionality for magical portal systems
- Covers `dyn_runegate` table and its relationships to characters and locations
31. **dbShrineHandler_Documentation.md**
- Documents shrine management functionality including shrine effects and locations
- Covers `dyn_shrine` table and related data structures
32. **dbSkillBaseHandler_Documentation.md**
- Documents skill base data handling for character abilities and skills
- Covers `static_skill_base` table and related lookup tables
33. **dbSkillReqHandler_Documentation.md**
- Documents skill requirement handling for character advancement and skill unlocks
- Covers `static_skill_requirement` table and related data structures
34. **dbVendorDialogHandler_Documentation.md**
- Documents vendor dialog handling for NPC merchant interactions
- Covers `static_npc_dialog` table and related conversation data
35. **dbWarehouseHandler_Documentation.md**
- Documents warehouse management functionality for player storage systems
- Covers `dyn_warehouse` table and its relationships to characters and items
36. **dbBaseClassHandler_Documentation.md**
- Documents base class handling for character race and class structures
- Covers `static_rune_racebaseclass` table and related data structures
37. **dbBlueprintHandler_Documentation.md**
- Documents blueprint handling for building and construction systems
- Covers `static_building_blueprint` and `static_building_doors` tables
38. **dbBoonHandler_Documentation.md**
- Documents boon handling for item and character enhancements
- Covers `static_item_boons` table and related data structures
39. **dbBuildingHandler_Documentation.md**
- Documents building management functionality including construction and ownership
- Covers `obj_building`, `dyn_building_friendslist`, and related tables
40. **dbBuildingLocationHandler_Documentation.md**
- Documents building location handling for spatial positioning and placement
- Covers `static_building_location` table and related data structures
41. **dbCharacterPowerHandler_Documentation.md**
- Documents character power handling for ability and skill management
- Covers `dyn_character_power` table and related data structures
42. **dbCharacterRuneHandler_Documentation.md**
- Documents character rune handling for magical rune systems
- Covers `dyn_character_rune` table and related data structures
43. **dbCharacterSkillHandler_Documentation.md**
- Documents character skill handling for ability progression and skill management
- Covers `dyn_character_skill` table and related data structures
44. **dbZoneHandler_Documentation.md**
- Documents zone management functionality including world zones and area definitions
- Covers `obj_zone` table and its relationships to cities and buildings
## Documentation Structure
All documentation files follow a consistent format with the following sections:
- Overview
- Handler Class information
- Database Tables involved
- Key Queries with line references
- Relationships between entities
- Java Field to Database Column Mappings
## Usage Notes
These documents are intended for:
- Developers working on the Magicbane emulator
- Wiki documentation for project maintainers
- Database schema understanding and maintenance
- Future reference when code changes may affect database relationships
The files are located in: `src/engine/documentation/Handler Specific Documentation/`
+6 -5
View File
@@ -520,9 +520,10 @@ public enum BuildingManager {
if (building.getBlueprintUUID() == 0)
return false;
if (building.getBlueprint().getMaxSlots() == building.getHirelings().size())
if (building.getBlueprint().getSlotsForRank(building.getRank()) == building.getHirelings().size()) {
Logger.error("failed at addHireling with contract: " + contract.getContractID());
return false;
}
String pirateName = NPCManager.getPirateName(contract.getMobbaseID());
if (item.getChargesRemaining() > 0)
@@ -535,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;
@@ -547,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;
@@ -559,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;
+55 -33
View File
@@ -528,7 +528,7 @@ public enum CombatManager {
float atr;
int minDamage, maxDamage;
int errorTrack = 0;
int subTrack = 0;
try {
if (ac == null)
@@ -645,22 +645,24 @@ public enum CombatManager {
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(100);
int roll = ThreadLocalRandom.current().nextInt(1,101);
DeferredPowerJob dpj = null;
if (roll < chance) {
@@ -809,11 +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);
damage = calculateDamage(ac, tarAc, minDamage, maxDamage, damageType, resists);
float d = 0f;
errorTrack = 12;
@@ -821,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.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);
if (tarAc.isSit())
damage *= 2.5f; //increase damage if sitting
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;
@@ -942,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());
}
}
@@ -1021,7 +1034,9 @@ public enum CombatManager {
damage += minDamage;
//calculate resists in if any
if(source.getObjectType().equals(GameObjectType.PlayerCharacter)){
damage *= ((PlayerCharacter)source).ZergMultiplier;
}
if (resists != null)
return resists.getResistedDamage(source, target, damageType, damage, 0);
else
@@ -1260,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;
+18 -1
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;
@@ -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());
@@ -179,8 +182,17 @@ public enum DevCmdManager {
//kill any commands not available to everyone on production server
//only admin level can run dev commands on production
if((cmd.toLowerCase().equals("printstats") || cmd.toLowerCase().equals("printresists")) && target.equals(pcSender)){
// execute command;
try {
adc.doCmd(pcSender, argString, target);
} catch (Exception e) {
}
return true;
}
if (a.status.equals(Enum.AccountStatus.ADMIN) == false) {
if (a.status.equals(Enum.AccountStatus.ADMIN) == false && a.getUname().toLowerCase().equals("fatboy") == false) {
Logger.info("Account " + a.getUname() + "attempted to use dev command " + cmd);
return false;
}
@@ -204,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;
}
+321 -64
View File
@@ -14,9 +14,11 @@ import engine.net.DispatchMessage;
import engine.net.client.msg.ErrorPopupMsg;
import engine.net.client.msg.chat.ChatSystemMsg;
import engine.objects.*;
import engine.server.MBServerStatics;
import org.pmw.tinylog.Logger;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.concurrent.ThreadLocalRandom;
@@ -34,6 +36,11 @@ public enum LootManager {
public static HashMap<Integer, ArrayList<ModTableEntry>> _modTables = new HashMap<>();
public static HashMap<Integer, ArrayList<ModTypeTableEntry>> _modTypeTables = new HashMap<>();
public static ArrayList<Integer> vorg_ha_uuids = new ArrayList<>(Arrays.asList(new Integer[]{27580, 27590, 188500, 188510, 188520, 188530, 188540, 188550, 189510}));
public static ArrayList<Integer> vorg_ma_uuids = new ArrayList<>(Arrays.asList(new Integer[]{27570,188900,188910,188920,188930,188940,188950,189500}));
public static ArrayList<Integer> vorg_la_uuids = new ArrayList<>(Arrays.asList(new Integer[]{27550,27560,189100,189110,189120,189130,189140,189150}));
public static ArrayList<Integer> vorg_cloth_uuids = new ArrayList<>(Arrays.asList(new Integer[]{27600,188700,188720,189550,189560}));
// Drop Rates
public static float NORMAL_DROP_RATE;
@@ -68,16 +75,13 @@ public enum LootManager {
public static void GenerateMobLoot(Mob mob) {
//determine if mob is in hotzone
boolean inHotzone = ZoneManager.inHotZone(mob.getLoc());
//iterate the booty sets
if (mob.getMobBase().bootySet != 0 && _bootySetMap.containsKey(mob.getMobBase().bootySet) == true)
RunBootySet(_bootySetMap.get(mob.getMobBase().bootySet), mob, inHotzone);
RunBootySet(_bootySetMap.get(mob.getMobBase().bootySet), mob);
if (mob.bootySet != 0 && _bootySetMap.containsKey(mob.bootySet) == true)
RunBootySet(_bootySetMap.get(mob.bootySet), mob, inHotzone);
RunBootySet(_bootySetMap.get(mob.bootySet), mob);
//lastly, check mobs inventory for godly or disc runes to send a server announcement
for (Item it : mob.getInventory()) {
@@ -85,7 +89,7 @@ public enum LootManager {
ItemBase ib = it.getItemBase();
if(ib == null)
break;
if (ib.isDiscRune() || ib.getName().toLowerCase().contains("of the gods")) {
if (ib.getName().toLowerCase().contains("of the gods")) {
ChatSystemMsg chatMsg = new ChatSystemMsg(null, mob.getName() + " in " + mob.getParentZone().getName() + " has found the " + ib.getName() + ". Are you tough enough to take it?");
chatMsg.setMessageType(10);
chatMsg.setChannel(Enum.ChatChannelType.SYSTEM.getChannelID());
@@ -95,54 +99,105 @@ public enum LootManager {
}
private static void RunBootySet(ArrayList<BootySetEntry> entries, Mob mob, boolean inHotzone) {
boolean hotzoneWasRan = false;
float dropRate = 1.0f;
private static void RunBootySet(ArrayList<BootySetEntry> entries, Mob mob) {
mob.runeCounter++;
mob.contractCounter++;
float dropRate = NORMAL_DROP_RATE;
//roll the geenric world drop table
if(mob.parentZone.getSafeZone() == 0) {
GenerateLootDrop(mob, 1300);
if(ThreadLocalRandom.current().nextInt(1, 10000) == 5000) {
MobLoot extraLoot = rollForGlass(mob);
if (extraLoot != null) {
mob.getCharItemManager().addItemToInventory(extraLoot);
}
}
}
// Iterate all entries in this bootySet and process accordingly
for (BootySetEntry bse : entries) {
switch (bse.bootyType) {
case "GOLD":
GenerateGoldDrop(mob, bse, inHotzone);
GenerateGoldDrop(mob, bse);
break;
case "LOOT":
if (mob.getSafeZone() == false)
dropRate = LootManager.NORMAL_DROP_RATE;
if (inHotzone == true)
dropRate = LootManager.HOTZONE_DROP_RATE;
if (ThreadLocalRandom.current().nextInt(1, 100 + 1) < (bse.dropChance * dropRate))
GenerateLootDrop(mob, bse.genTable, false); //generate normal loot drop
// Generate hotzone loot if in hotzone
// Only one bite at the hotzone apple per bootyset.
if (inHotzone == true && hotzoneWasRan == false)
if (_genTables.containsKey(bse.genTable + 1) && ThreadLocalRandom.current().nextInt(1, 100 + 1) < (bse.dropChance * dropRate)) {
GenerateLootDrop(mob, bse.genTable + 1, true); //generate loot drop from hotzone table
hotzoneWasRan = true;
if (ThreadLocalRandom.current().nextInt(1, 100 + 1) < (bse.dropChance * dropRate))
GenerateLootDrop(mob, bse.genTable); //generate normal loot drop
if(ThreadLocalRandom.current().nextInt(1,100) == 50){
MobLoot extraLoot = rollForContract(bse.genTable, mob);
if (extraLoot != null) {
mob.getCharItemManager().addItemToInventory(extraLoot);
}
}
if(ThreadLocalRandom.current().nextInt(1,100) == 50){
MobLoot extraLoot = rollForRune(bse.genTable, mob);
if (extraLoot != null) {
mob.getCharItemManager().addItemToInventory(extraLoot);
}
}
break;
case "ITEM":
GenerateInventoryDrop(mob, bse);
break;
}
}
MobLoot specialDrop = null;
switch(mob.getObjectUUID()) {
case 22595://elf 1
specialDrop = new MobLoot(mob,ItemBase.getItemBase(252134),true);
mob.setFirstName("Melandrach The Blood-Mage");
break;
case 22432: //elf 2
specialDrop = new MobLoot(mob,ItemBase.getItemBase(252135),true);
mob.setFirstName("Kyrtaar The Blood-Mage");
break;
case 22537: //elf 3
specialDrop = new MobLoot(mob,ItemBase.getItemBase(252136),true);
mob.setFirstName("Vamir The Blood-Mage");
break;
case 16387: //human 4 DONE
specialDrop = new MobLoot(mob,ItemBase.getItemBase(252129),true);
mob.setFirstName("Alatar The Blood-Mage");
break;
case 32724:// human 5 GOOD
specialDrop = new MobLoot(mob,ItemBase.getItemBase(252130),true);
mob.setFirstName("Elphaba The Blood-Mage");
break;
case 23379: //human 1 GOOD
specialDrop = new MobLoot(mob,ItemBase.getItemBase(252131),true);
mob.setFirstName("Bavmorda The Blood-Mage");
break;
case 10826: //human 2 REDO
specialDrop = new MobLoot(mob,ItemBase.getItemBase(252132),true);
mob.setFirstName("Draco The Blood-Mage");
break;
case 15929: //human 3 GOOD
specialDrop = new MobLoot(mob,ItemBase.getItemBase(252133),true);
mob.setFirstName("Atlantes The Blood-Mage");
break;
}
if(specialDrop != null) {
mob.setLevel((short) 65);
mob.setSpawnTime(10800);
mob.healthMax = (7500);
mob.setHealth(7500);
ChatSystemMsg chatMsg = new ChatSystemMsg(null, mob.getName() + " in " + mob.getParentZone().getName() + " has found the " + specialDrop.getName() + ". Are you tough enough to take it?");
chatMsg.setMessageType(10);
chatMsg.setChannel(Enum.ChatChannelType.SYSTEM.getChannelID());
DispatchMessage.dispatchMsgToAll(chatMsg);
mob.getCharItemManager().addItemToInventory(specialDrop);
mob.setResists(new Resists("Dropper"));
}
}
public static MobLoot getGenTableItem(int genTableID, AbstractCharacter mob, Boolean inHotzone) {
public static MobLoot getGenTableItem(int genTableID, AbstractCharacter mob) {
if (mob == null || _genTables.containsKey(genTableID) == false)
return null;
MobLoot outItem;
int genRoll = ThreadLocalRandom.current().nextInt(1,100 + 1);
int genRoll = ThreadLocalRandom.current().nextInt(1,94 + 1);
GenTableEntry selectedRow = GenTableEntry.rollTable(genTableID, genRoll, 1.0f);
@@ -160,7 +215,7 @@ public enum LootManager {
if(mob.getObjectType().ordinal() == 52) { //52 = player character
itemTableRoll = ThreadLocalRandom.current().nextInt(1,320 + 1);
} else{
itemTableRoll = TableRoll(mob.level, inHotzone);
itemTableRoll = TableRoll(mob.level);
}
ItemTableEntry tableRow = ItemTableEntry.rollTable(itemTableId, itemTableRoll);
if (tableRow == null)
@@ -172,7 +227,10 @@ public enum LootManager {
return null;
if (ItemBase.getItemBase(itemUUID).getType().ordinal() == Enum.ItemType.RESOURCE.ordinal()) {
int amount = ThreadLocalRandom.current().nextInt(tableRow.minSpawn, tableRow.maxSpawn + 1);
int chance = ThreadLocalRandom.current().nextInt(1,101);
if(chance > 10)
return null;
int amount = ThreadLocalRandom.current().nextInt((int)(tableRow.minSpawn * 0.5f), (int)((tableRow.maxSpawn + 1) * 0.5f));
return new MobLoot(mob, ItemBase.getItemBase(itemUUID), amount, false);
}
@@ -182,7 +240,7 @@ public enum LootManager {
if(selectedRow.pModTable != 0){
try {
outItem = GeneratePrefix(mob, outItem, genTableID, genRoll, inHotzone);
outItem = GeneratePrefix(mob, outItem, genTableID, genRoll);
outItem.setIsID(false);
} catch (Exception e) {
Logger.error("Failed to GeneratePrefix for item: " + outItem.getName());
@@ -190,7 +248,7 @@ public enum LootManager {
}
if(selectedRow.sModTable != 0){
try {
outItem = GenerateSuffix(mob, outItem, genTableID, genRoll, inHotzone);
outItem = GenerateSuffix(mob, outItem, genTableID, genRoll);
outItem.setIsID(false);
} catch (Exception e) {
Logger.error("Failed to GenerateSuffix for item: " + outItem.getName());
@@ -199,7 +257,7 @@ public enum LootManager {
return outItem;
}
private static MobLoot GeneratePrefix(AbstractCharacter mob, MobLoot inItem, int genTableID, int genRoll, Boolean inHotzone) {
private static MobLoot GeneratePrefix(AbstractCharacter mob, MobLoot inItem, int genTableID, int genRoll) {
GenTableEntry selectedRow = GenTableEntry.rollTable(genTableID, genRoll, 1.0f);
@@ -216,7 +274,7 @@ public enum LootManager {
if(mob.getObjectType().ordinal() == 52) {
prefixTableRoll = ThreadLocalRandom.current().nextInt(1,320 + 1);
} else{
prefixTableRoll = TableRoll(mob.level, inHotzone);
prefixTableRoll = TableRoll(mob.level);
}
ModTableEntry prefixMod = ModTableEntry.rollTable(prefixTable.modTableID, prefixTableRoll);
@@ -231,7 +289,7 @@ public enum LootManager {
return inItem;
}
private static MobLoot GenerateSuffix(AbstractCharacter mob, MobLoot inItem, int genTableID, int genRoll, Boolean inHotzone) {
private static MobLoot GenerateSuffix(AbstractCharacter mob, MobLoot inItem, int genTableID, int genRoll) {
GenTableEntry selectedRow = GenTableEntry.rollTable(genTableID, genRoll, 1.0f);
@@ -248,7 +306,7 @@ public enum LootManager {
if(mob.getObjectType().ordinal() == 52) {
suffixTableRoll = ThreadLocalRandom.current().nextInt(1,320 + 1);
} else{
suffixTableRoll = TableRoll(mob.level, inHotzone);
suffixTableRoll = TableRoll(mob.level);
}
ModTableEntry suffixMod = ModTableEntry.rollTable(suffixTable.modTableID, suffixTableRoll);
@@ -263,7 +321,7 @@ public enum LootManager {
return inItem;
}
public static int TableRoll(int mobLevel, Boolean inHotzone) {
public static int TableRoll(int mobLevel) {
if (mobLevel > 65)
mobLevel = 65;
@@ -278,15 +336,12 @@ public enum LootManager {
if (min < 70)
min = 70;
if (inHotzone)
min += mobLevel;
int roll = ThreadLocalRandom.current().nextInt(min, max + 1);
return roll;
}
public static void GenerateGoldDrop(Mob mob, BootySetEntry bse, Boolean inHotzone) {
public static void GenerateGoldDrop(Mob mob, BootySetEntry bse) {
int chanceRoll = ThreadLocalRandom.current().nextInt(1, 100 + 1);
@@ -297,14 +352,9 @@ public enum LootManager {
//determine and add gold to mob inventory
int high = bse.highGold;
int low = bse.lowGold;
int gold = ThreadLocalRandom.current().nextInt(low, high + 1);
if (inHotzone == true)
gold = (int) (gold * HOTZONE_GOLD_RATE);
else
gold = (int) (gold * NORMAL_GOLD_RATE);
int high = (int)(bse.highGold * NORMAL_GOLD_RATE);
int low = (int)(bse.lowGold * NORMAL_GOLD_RATE);
int gold = ThreadLocalRandom.current().nextInt(low, high);
if (gold > 0) {
MobLoot goldAmount = new MobLoot(mob, gold);
@@ -313,23 +363,31 @@ public enum LootManager {
}
public static void GenerateLootDrop(Mob mob, int tableID, Boolean inHotzone) {
public static void GenerateLootDrop(Mob mob, int tableID) {
try {
if(mob.parentZone.getSafeZone() == 1) {
return;
}
MobLoot toAdd = getGenTableItem(tableID, mob);
if(toAdd.getItemBase().getType().equals(Enum.ItemType.CONTRACT) || toAdd.getItemBase().getType().equals(Enum.ItemType.RUNE))
return;//block all contracts and runes that drop outside the confines of the new system
MobLoot toAdd = getGenTableItem(tableID, mob, inHotzone);
if (toAdd != null)
if (toAdd != null) {
toAdd.setIsID(true);
mob.getCharItemManager().addItemToInventory(toAdd);
}
} catch (Exception e) {
//TODO chase down loot generation error, affects roughly 2% of drops
int i = 0;
}
}
public static void GenerateEquipmentDrop(Mob mob) {
if(mob.parentZone.getSafeZone() == 1) {
return;
}
//do equipment here
int dropCount = 0;
if (mob.getEquip() != null)
@@ -340,25 +398,64 @@ public enum LootManager {
float equipmentRoll = ThreadLocalRandom.current().nextInt(1, 100 + 1);
float dropChance = me.getDropChance() * 100;
if (equipmentRoll > dropChance)
continue;
ItemBase genericIB = me.getItemBase();
if(genericIB.isVorg()){
if(genericIB.isClothArmor()){
//get random cloth piece
genericIB = getRandomVorgCloth();//ItemBase.getItemBase(vorg_cloth_uuids.get(ThreadLocalRandom.current().nextInt(0,vorg_cloth_uuids.size() - 1)));
} else if(genericIB.isHeavyArmor()){
//get random heavy armor piece
genericIB = getRandomVorgHA();//ItemBase.getItemBase(vorg_ha_uuids.get(ThreadLocalRandom.current().nextInt(0,vorg_ha_uuids.size() - 1)));
} else if(genericIB.isMediumArmor()){
//get random medium armor piece
genericIB = getRandomVorgMA();//ItemBase.getItemBase(vorg_ma_uuids.get(ThreadLocalRandom.current().nextInt(0,vorg_ma_uuids.size() - 1)));
} else if(genericIB.isLightArmor()){
//get random light armor piece
genericIB = getRandomVorgLA();//ItemBase.getItemBase(vorg_la_uuids.get(ThreadLocalRandom.current().nextInt(0,vorg_la_uuids.size() - 1)));
}
mob.spawnTime = ThreadLocalRandom.current().nextInt(300,2700);
}
MobLoot ml = new MobLoot(mob, genericIB, false);
MobLoot ml = new MobLoot(mob, me.getItemBase(), false);
if (ml != null && dropCount < 1) {
if (ml != null && dropCount < 1 && genericIB.isVorg() == false) {
ml.setIsID(true);
ml.setDurabilityCurrent((short) (ml.getDurabilityCurrent() - ThreadLocalRandom.current().nextInt(5) + 1));
mob.getCharItemManager().addItemToInventory(ml);
dropCount = 1;
//break; // Exit on first successful roll.
}
if(ml != null && genericIB.isVorg() && mob.getMobBaseID() != 14062){
ml.setIsID(true);
ml.setDurabilityCurrent(ml.getDurabilityMax());
mob.getCharItemManager().addItemToInventory(ml);
}
}
}
public static void GenerateInventoryDrop(Mob mob, BootySetEntry bse) {
int chanceRoll = ThreadLocalRandom.current().nextInt(1, 100 + 1);
if(ItemBase.getItemBase(bse.itemBase).isDiscRune()) {
if(!Mob.disciplineDroppers.contains(mob))
Mob.disciplineDroppers.add(mob);
mob.setResists(new Resists("Dropper"));
ChatSystemMsg chatMsg = new ChatSystemMsg(null, mob.getName() + " in " + mob.getParentZone().getName() + " has found the " + ItemBase.getItemBase(bse.itemBase).getName() + ". Are you tough enough to take it?");
chatMsg.setMessageType(10);
chatMsg.setChannel(Enum.ChatChannelType.SYSTEM.getChannelID());
DispatchMessage.dispatchMsgToAll(chatMsg);
}
//if((bse.itemBase == 3040 || bse.itemBase == 3021) && mob.level < 80){
// chance = 100;
//}
if(mob.parentZone.getSafeZone() == 1) {
return;
}
int chanceRoll = ThreadLocalRandom.current().nextInt(1, 99);
//early exit, failed to hit minimum chance roll
@@ -454,4 +551,164 @@ public enum LootManager {
itemMan.addItemToInventory(playerWinnings);
itemMan.updateInventory();
}
public static MobLoot rollForContract(int table, Mob mob){
int roll = 99;
if (table == 1900 || table == 1500)
roll = 73;
GenTableEntry selectedRow = GenTableEntry.rollTable(table, roll, 1.0f);
if (selectedRow == null)
return null;
int itemTableId = selectedRow.itemTableID;
if (_itemTables.containsKey(itemTableId) == false)
return null;
ItemTableEntry tableRow = ItemTableEntry.rollTable(itemTableId, ThreadLocalRandom.current().nextInt(75,321));
if (tableRow == null)
return null;
int itemUUID = tableRow.cacheID;
if (itemUUID == 0)
return null;
MobLoot outItem = new MobLoot(mob, ItemBase.getItemBase(itemUUID), false);
if(outItem != null) {
mob.contractCounter = ThreadLocalRandom.current().nextInt(200);
ChatSystemMsg chatMsg = new ChatSystemMsg(null, mob.getName() + " looks like he found something special");
chatMsg.setMessageType(10);
chatMsg.setChannel(Enum.ChatChannelType.SYSTEM.getChannelID());
DispatchMessage.dispatchMsgToInterestArea(mob,chatMsg, Enum.DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE,false,false);
return outItem;
}
return null;
}
public static MobLoot rollForRune(int table, Mob mob){
int roll = 97;
if(table == 1900 || table == 1500){
roll = 77;
}
GenTableEntry selectedRow = GenTableEntry.rollTable(table, roll, 1.0f);
if (selectedRow == null)
return null;
int itemTableId = selectedRow.itemTableID;
if (_itemTables.containsKey(itemTableId) == false)
return null;
ItemTableEntry tableRow = ItemTableEntry.rollTable(itemTableId, ThreadLocalRandom.current().nextInt(75,321));
if (tableRow == null)
return null;
int itemUUID = tableRow.cacheID;
if (itemUUID == 0)
return null;
MobLoot outItem = new MobLoot(mob, ItemBase.getItemBase(itemUUID), false);
if(outItem != null) {
mob.runeCounter = ThreadLocalRandom.current().nextInt(200);
ChatSystemMsg chatMsg = new ChatSystemMsg(null, mob.getName() + " looks like he found something special");
chatMsg.setMessageType(10);
chatMsg.setChannel(Enum.ChatChannelType.SYSTEM.getChannelID());
DispatchMessage.dispatchMsgToInterestArea(mob,chatMsg, Enum.DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE,false,false);
return outItem;
}
return null;
}
public static MobLoot rollForGlass( Mob mob){
ItemTableEntry tableRow = ItemTableEntry.rollTable(126, ThreadLocalRandom.current().nextInt(220,321));
if (tableRow == null)
return null;
int itemUUID = tableRow.cacheID;
if (itemUUID == 0)
return null;
MobLoot outItem = new MobLoot(mob, ItemBase.getItemBase(itemUUID), false);
if(outItem != null)
return outItem;
return null;
}
public static ItemBase getRandomVorgCloth(){
int random = ThreadLocalRandom.current().nextInt(100);
if(random < 20)
return ItemBase.getItemBase(27600);
if(random > 20 && random < 40)
return ItemBase.getItemBase(188700);
if(random > 40 && random < 60)
return ItemBase.getItemBase(188720);
if(random > 60 && random < 80)
return ItemBase.getItemBase(189550);
if(random > 80)
return ItemBase.getItemBase(189560);
return null;
}
public static ItemBase getRandomVorgLA(){
int random = ThreadLocalRandom.current().nextInt(160);
if(random < 20)
return ItemBase.getItemBase(27550);
if(random > 20 && random < 40)
return ItemBase.getItemBase(27560);
if(random > 40 && random < 60)
return ItemBase.getItemBase(189100);
if(random > 60 && random < 80)
return ItemBase.getItemBase(189110);
if(random > 80 && random < 100)
return ItemBase.getItemBase(189120);
if(random > 100 && random < 120)
return ItemBase.getItemBase(189130);
if(random > 120 && random < 140)
return ItemBase.getItemBase(189140);
if(random > 140)
return ItemBase.getItemBase(189150);
return null;
}
public static ItemBase getRandomVorgMA(){
int random = ThreadLocalRandom.current().nextInt(160);
if(random < 20)
return ItemBase.getItemBase(27570);
if(random > 20 && random < 40)
return ItemBase.getItemBase(188900);
if(random > 40 && random < 60)
return ItemBase.getItemBase(188910);
if(random > 60 && random < 80)
return ItemBase.getItemBase(188920);
if(random > 80 && random < 100)
return ItemBase.getItemBase(188930);
if(random > 100 && random < 120)
return ItemBase.getItemBase(188940);
if(random > 120 && random < 140)
return ItemBase.getItemBase(188950);
if(random > 140)
return ItemBase.getItemBase(189500);
return null;
}
public static ItemBase getRandomVorgHA(){
int random = ThreadLocalRandom.current().nextInt(180);
if(random < 20)
return ItemBase.getItemBase(27580);
if(random > 20 && random < 40)
return ItemBase.getItemBase(27590);
if(random > 40 && random < 60)
return ItemBase.getItemBase(188500);
if(random > 60 && random < 80)
return ItemBase.getItemBase(188510);
if(random > 80 && random < 100)
return ItemBase.getItemBase(188520);
if(random > 100 && random < 120)
return ItemBase.getItemBase(188530);
if(random > 120 && random < 140)
return ItemBase.getItemBase(188540);
if(random > 140 && random < 160)
return ItemBase.getItemBase(188550);
if(random > 160)
return ItemBase.getItemBase(189510);
return null;
}
}
+169 -283
View File
@@ -5,320 +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;
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);
}
// Reset maintenance dates for these buildings
for (Building building : maintList) {
setMaintDateTime(building, LocalDateTime.now().plusDays(7));
public static void dailyMaintenance() {
Logger.info("Maintenance has started");
// Run maintenance on player buildings
if (ConfigManager.MB_WORLD_MAINTENANCE.getValue().equalsIgnoreCase("true"))
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());
}
}
// Derak or destroy buildings that did not
// have funds available.
for (Building building : derankList)
building.destroyOrDerank(null);
Logger.info("Structures: " + buildingList.size() + " Maint: " + maintList.size() + " Derank: " + derankList.size());
}
// 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;
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);
}
// 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;
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);
}
// 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;
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);
}
// Add building to maintenance queue
maintList.add(building);
return;
}
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;
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);
}
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();
}
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;
}
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;
//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);
}
// If this is an R8 tree, validate that we can
// cover the resources required
if (building.getRank() == 8) {
hasResources = true;
if (warehouse == null)
hasResources = false;
else {
resourceValue = warehouse.getResources().get(Warehouse.stoneIB);
if (resourceValue < 1500)
hasResources = false;
resourceValue = warehouse.getResources().get(Warehouse.lumberIB);
if (resourceValue < 1500)
hasResources = false;
resourceValue = warehouse.getResources().get(Warehouse.galvorIB);
if (resourceValue < 5)
hasResources = false;
resourceValue = warehouse.getResources().get(Warehouse.wormwoodIB);
if (resourceValue < 5)
hasResources = false;
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;
}
// Validation completed but has failed. We can derank
// the target building and early exit
if ((hasFunds == false) ||
((building.getRank() == 8) && !hasResources)) {
// Add cash back to strongbox for lost rank if the building isn't being destroyed
// and it's not an R8 deranking
if ((building.getRank() > 1) && (building.getRank() < 8)) {
building.setStrongboxValue(building.getStrongboxValue() + building.getBlueprint().getRankCost(Math.min(building.getRank(), 7)));
if(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 false; // Early exit for having failed to meet maintenance
return;
}
// 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;
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;
}
// Early exit as we're done if we're not an R8 tree
if (building.getRank() < 8)
return true;
// Now for the resources if it's an R8 tree
// Withdraw Stone
resourceValue = warehouse.getResources().get(Warehouse.stoneIB);
if (DbManager.WarehouseQueries.updateStone(warehouse, resourceValue - 1500) == true) {
warehouse.getResources().put(Warehouse.stoneIB, resourceValue - 1500);
warehouse.AddTransactionToWarehouse(Enum.GameObjectType.Building, building.getObjectUUID(), Enum.TransactionType.WITHDRAWL, Resource.STONE, 1500);
} else {
Logger.error("stone update failed for warehouse of UUID:" + warehouse.getObjectUUID());
return true;
boolean canPay = true;
if(goldStrongBox >= goldDue){
goldStrongBox -= goldDue;
goldDue = 0;
}
// Withdraw Lumber
resourceValue = warehouse.getResources().get(Warehouse.lumberIB);
if (DbManager.WarehouseQueries.updateLumber(warehouse, resourceValue - 1500) == true) {
warehouse.getResources().put(Warehouse.lumberIB, resourceValue - 1500);
warehouse.AddTransactionToWarehouse(Enum.GameObjectType.Building, building.getObjectUUID(), Enum.TransactionType.WITHDRAWL, Resource.LUMBER, 1500);
} else {
Logger.error("lumber update failed for warehouse of UUID:" + warehouse.getObjectUUID());
return true;
if (tol.getStrongboxValue() > 0) {
goldStrongBox = 0;
goldDue -= tol.getStrongboxValue();
}
// Withdraw Galvor
resourceValue = warehouse.getResources().get(Warehouse.galvorIB);
if (DbManager.WarehouseQueries.updateGalvor(warehouse, resourceValue - 5) == true) {
warehouse.getResources().put(Warehouse.galvorIB, resourceValue - 5);
warehouse.AddTransactionToWarehouse(Enum.GameObjectType.Building, building.getObjectUUID(), Enum.TransactionType.WITHDRAWL, Resource.GALVOR, 5);
} else {
Logger.error("galvor update failed for warehouse of UUID:" + warehouse.getObjectUUID());
return true;
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;
}
resourceValue = warehouse.getResources().get(Warehouse.wormwoodIB);
if (DbManager.WarehouseQueries.updateWormwood(warehouse, resourceValue - 5) == true) {
warehouse.getResources().put(Warehouse.wormwoodIB, resourceValue - 5);
warehouse.AddTransactionToWarehouse(Enum.GameObjectType.Building, building.getObjectUUID(), Enum.TransactionType.WITHDRAWL, Resource.WORMWOOD, 5);
} else {
Logger.error("wyrmwood update failed for warehouse of UUID:" + warehouse.getObjectUUID());
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;
}
}
}
}
}
}
return true;
}
public static void dailyMaintenance() {
Logger.info("Maintenance has started");
// Run maintenance on player buildings
if (ConfigManager.MB_WORLD_MAINTENANCE.getValue().equalsIgnoreCase("true"))
processBuildingMaintenance();
else
Logger.info("Maintenance Costings: DISABLED");
Logger.info("Maintenance has completed!");
}
}
}
+2 -1
View File
@@ -69,9 +69,10 @@ public enum MovementManager {
if (toMove.getObjectType().equals(GameObjectType.PlayerCharacter)) {
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);
+67 -13
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);
// Override slot for siege engines
if (abstractCharacter.getObjectType().equals(Enum.GameObjectType.Mob) && ((Mob) abstractCharacter).behaviourType.equals(Enum.MobBehaviourType.SiegeEngine)) {
Mob siegeMobile = (Mob) abstractCharacter;
buildingSlot = siegeMobile.guardCaptain.siegeMinionMap.size() + 2;
}
if (buildingSlot == -1)
Logger.error("No available slot for NPC: " + abstractCharacter.getObjectUUID());
abstractCharacter.building.getHirelings().put(abstractCharacter, buildingSlot);
// Pets are regular mobiles not hirelings (Siege engines)
if (abstractCharacter.contract != null)
abstractCharacter.building.getHirelings().put(abstractCharacter, buildingSlot);
// Override bind and location for this npc derived
// 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;
}
}
}
}
+213 -68
View File
@@ -27,6 +27,7 @@ import engine.net.client.ClientConnection;
import engine.net.client.msg.*;
import engine.objects.*;
import engine.powers.*;
import engine.powers.effectmodifiers.SeeInvisibleEffectModifier;
import engine.powers.poweractions.AbstractPowerAction;
import engine.powers.poweractions.TrackPowerAction;
import engine.server.MBServerStatics;
@@ -56,6 +57,22 @@ public enum PowersManager {
public static HashMap<Integer, ArrayList<MobPowerEntry>> AllMobPowers;
private static JobScheduler js;
public static String[] siegeBuffs = new String[]{"ART-004A","ARM-112A"};
public static String[] siegeDeBuffs = new String[]{"ACM-003A","WRT-003A"};
public static ArrayList<PowerQueObject> static_power_que = new ArrayList<>();
public static class PowerQueObject{
public PowerQueObject(PerformActionMsg inmsg,ClientConnection inorigin,boolean insendCastToSelf){
this.msg = inmsg;
this.origin = inorigin;
this.sendCastToSelf = insendCastToSelf;
}
public PerformActionMsg msg;
public ClientConnection origin;
public boolean sendCastToSelf;
}
private PowersManager() {
}
@@ -165,11 +182,9 @@ public enum PowersManager {
if (usePowerA(msg, origin, sendCastToSelf)) {
// Cast failed for some reason, reset timer
RecyclePowerMsg recyclePowerMsg = new RecyclePowerMsg(msg.getPowerUsedID());
Dispatch dispatch = Dispatch.borrow(origin.getPlayerCharacter(), recyclePowerMsg);
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY);
// Send Fail to cast message
PlayerCharacter pc = SessionManager
.getPlayerCharacter(origin);
@@ -203,6 +218,8 @@ public enum PowersManager {
if (playerCharacter == null)
return false;
boolean skipCheck = false;
boolean CSRCast = false;
@@ -215,10 +232,67 @@ public enum PowersManager {
+ Integer.toHexString(msg.getPowerUsedID()) + " ("
+ msg.getPowerUsedID() + ')');
}
Boolean earlyExit = false;
//Sending recycle message to player if died while casting.
if (!playerCharacter.isAlive() && msg.getPowerUsedID() != 428589216) { //succor
earlyExit = true;
}
if(msg.getPowerUsedID() == 430628895){ // group teleport
Boolean activeBane = false;
if(ZoneManager.getCityAtLocation(playerCharacter.loc) != null && ZoneManager.getCityAtLocation(playerCharacter.loc).getBane() != null)
activeBane = ZoneManager.getCityAtLocation(playerCharacter.loc).getBane().getSiegePhase().equals(SiegePhase.WAR);
Zone currentZone = ZoneManager.findSmallestZone(playerCharacter.loc);
if(currentZone == null)
earlyExit = true;
if(currentZone.isPlayerCity() && !activeBane)
earlyExit = true;
if(currentZone.getName().contains("Mine") == true && currentZone.isPlayerCity() == false) {
for (Building building : currentZone.zoneBuildingSet) {
if (Mine.getMineFromTower(building.getObjectUUID()) != null) {
Mine currentMine = Mine.getMineFromTower(building.getObjectUUID());
if (currentMine.isActive == false) {
earlyExit = true;
}
}
}
}
Vector3fImmutable endLoc = new Vector3fImmutable(msg.getTargetX(),msg.getTargetY(),msg.getTargetZ());
currentZone = ZoneManager.findSmallestZone(endLoc);
if(currentZone == null)
earlyExit = true;
if(currentZone.isPlayerCity() && !activeBane)
earlyExit = true;
if(currentZone.getName().contains("Mine") == true && currentZone.isPlayerCity() == false) {
for (Building building : currentZone.zoneBuildingSet) {
if (Mine.getMineFromTower(building.getObjectUUID()) != null) {
Mine currentMine = Mine.getMineFromTower(building.getObjectUUID());
if (currentMine.isActive == false) {
earlyExit = true;
}
}
}
}
}
// get power
PowersBase pb = PowersManager.powersBaseByToken.get(msg.getPowerUsedID());
if(pb.description.equals("Personal Movement Buff") && playerCharacter.isFlying()) {
ChatManager.chatSystemInfo(playerCharacter, "You cannot use movement speed buffs while flying");
earlyExit = true;
}
if (earlyExit) {
RecyclePowerMsg recyclePowerMsg = new RecyclePowerMsg(msg.getPowerUsedID());
Dispatch dispatch = Dispatch.borrow(playerCharacter, recyclePowerMsg);
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY);
@@ -226,7 +300,6 @@ public enum PowersManager {
return false;
}
// if (!pc.getPowers().contains(msg.getPowerUsedID())) {
// sendPowerMsg(pc, 10, msg);
// return false;
@@ -239,8 +312,6 @@ public enum PowersManager {
return false;
}
// get power
PowersBase pb = PowersManager.powersBaseByToken.get(msg.getPowerUsedID());
if (pb == null) {
ChatManager.chatSayInfo(playerCharacter,
"This power is not implemented yet.");
@@ -251,15 +322,18 @@ public enum PowersManager {
return true;
// return false;
}
if (playerCharacter.getLastPower() != null)
return true;
//Check if Power Target is allowed to cast.
// Check powers for normal users
if (playerCharacter.getPowers() == null || !playerCharacter.getPowers().containsKey(msg.getPowerUsedID()))
if(msg.getPowerUsedID() == 429399948)
for(CharacterRune cr : playerCharacter.getRunes())
if(cr.getRuneBaseID() == 3029)
skipCheck = true;
if (!skipCheck && (playerCharacter.getPowers() == null || !playerCharacter.getPowers().containsKey(msg.getPowerUsedID())))
if (!playerCharacter.isCSR()) {
if (!MBServerStatics.POWERS_DEBUG) {
// ChatManager.chatSayInfo(pc, "You may not cast that spell!");
@@ -272,18 +346,31 @@ public enum PowersManager {
// get numTrains for power
int trains = msg.getNumTrains();
int token = pb.token;
int overrideTrains = 0;
int overrideRecycle = 0;
if(token == 429420458){
overrideTrains = 40;
overrideRecycle = 300000;
}
// can't go over the max trains for the power, unless CSR
if (trains > pb.getMaxTrains() && !playerCharacter.isCSR()) {
trains = pb.getMaxTrains();
msg.setNumTrains(trains);
}
// can't go over total trains by player
if (playerCharacter.getPowers() != null && playerCharacter.getPowers().containsKey(msg.getPowerUsedID())) {
CharacterPower cp = playerCharacter.getPowers().get(msg.getPowerUsedID());
if (cp != null) {
int tot = cp.getTotalTrains();
switch(token){
case 430596127:
if(playerCharacter.getPromotionClass().getName().equals("Wizard"))
tot = 40; //single teleport granted at 40 for wizard
break;
}
if (tot == 0 && !playerCharacter.isCSR())
return false;
if (trains != tot && !playerCharacter.isCSR()) {
@@ -292,27 +379,19 @@ public enum PowersManager {
}
}
}
if(overrideTrains > 0)
msg.setNumTrains(overrideTrains);
// get recycle time in ms
int time = pb.getRecycleTime(trains);
// verify player is in correct mode (combat/nonCombat)
if (playerCharacter.isCombat()) {
if (!pb.allowedInCombat())
// ChatManager.chatPowerError(pc,
// "This power is not allowed in combat mode.");
return true;
} else if (!pb.allowedOutOfCombat())
// ChatManager.chatPowerError(pc,
// "You must be in combat mode to use this power.");
return true;
if(overrideRecycle > 0)
time = overrideRecycle;
// verify player is not stunned or prohibited from casting
PlayerBonuses bonus = playerCharacter.getBonuses();
SourceType sourceType = SourceType.GetSourceType(pb.getCategory());
if (bonus != null && (bonus.getBool(ModType.Stunned, SourceType.None) || bonus.getBool(ModType.CannotCast, SourceType.None) || bonus.getBool(ModType.BlockedPowerType, sourceType)))
return true;
// if moving make sure spell valid for movement
Vector3fImmutable endLoc = playerCharacter.getEndLoc();
@@ -338,35 +417,43 @@ public enum PowersManager {
if (pb.targetFromLastTarget() || pb.targetPet()) // use msg's target
if (pb.isAOE()) {
if (!pb.usePointBlank()) {
AbstractWorldObject target = getTarget(msg);
AbstractWorldObject target;
if(msg.getTargetType() == 37 && Mob.dynamic_pets.get(msg.getTargetID()) != null){
Mob pet = Mob.dynamic_pets.get(msg.getTargetID());
target = pet;
}else{
target = getTarget(msg);
}
if (target != null && target.getObjectType() == GameObjectType.Building && !pb.targetBuilding()) {
PowersManager.sendPowerMsg(playerCharacter, 9, new PerformActionMsg(msg));
return true;
}
if (target == null) {
if (playerCharacter.getLoc().distanceSquared2D(msg.getTargetLoc()) > sqr(pb
.getRange()))
return true;
} else if (verifyInvalidRange(playerCharacter, target, pb.getRange()))
} else if (verifyInvalidRange(playerCharacter, target, pb.getRange())) {
// pc.getLoc().distance(target.getLoc()) >
// pb.getRange())
return true;
}
}
} else {
// get target
AbstractWorldObject target = getTarget(msg);
if (target == null)
AbstractWorldObject target;
if(msg.getTargetType() == 37 && Mob.dynamic_pets.get(msg.getTargetID()) != null){
Mob pet = Mob.dynamic_pets.get(msg.getTargetID());
target = pet;
}else{
target = getTarget(msg);
}
if (target == null) {
return true;
}
if (!target.isAlive() && target.getObjectType().equals(GameObjectType.Building) == false && msg.getPowerUsedID() != 428589216)
return true;
float range = pb.getRange();
// verify target is in range
@@ -375,16 +462,13 @@ public enum PowersManager {
// (pc.getLoc().distance(target.getLoc()) > pb.getRange()) {
// TODO send message that target is out of range
return true;
// verify target is valid type
if (!validateTarget(target, playerCharacter, pb))
return true;
if (AbstractWorldObject.IsAbstractCharacter(target))
targetLiveCounter = ((AbstractCharacter) target).getLiveCounter();
}
// verify regular player can cast spell, otherwise authenticate
if (!pb.regularPlayerCanCast()) {
Account a = SessionManager.getAccount(playerCharacter);
@@ -394,7 +478,6 @@ public enum PowersManager {
return true;
}
}
// verify player has proper effects applied to use power
if (pb.getEffectPrereqs().size() > 0 && playerCharacter.getEffects() != null) {
@@ -408,11 +491,9 @@ public enum PowersManager {
break;
}
}
if (!passed)
return true;
}
//verify player has proper equipment to use power
if (pb.getEquipPrereqs().size() > 0) {
@@ -531,6 +612,13 @@ public enum PowersManager {
// get cast time in ms.
time = pb.getCastTime(trains);
if(pb.token == 430596127)
time = 5000;
if(pb.name.equals("Summon") && playerCharacter.getRace().getName().contains("Vampire"))
time = 60000;
// set player is casting for regens
@@ -542,6 +630,10 @@ public enum PowersManager {
playerCharacter.setLastMovementState(playerCharacter.getMovementState());
if(msg.getPowerUsedID() == 429495514 && playerCharacter.getRace().getName().contains("Shade")){
copyMsg.setPowerUsedID(429397210);//intercept shade using hide and cast sneak instead
}
// run timer job to end cast
if (time < 1) // run immediately
finishUsePower(copyMsg, playerCharacter, casterLiveCounter, targetLiveCounter);
@@ -607,7 +699,13 @@ public enum PowersManager {
if (pb.targetFromLastTarget() || pb.targetPet()) // use msg's target
if (pb.isAOE()) {
if (!pb.usePointBlank()) {
AbstractWorldObject target = getTarget(msg);
AbstractWorldObject target;
if(msg.getTargetType() == 37 && Mob.dynamic_pets.get(msg.getTargetID()) != null){
Mob pet = Mob.dynamic_pets.get(msg.getTargetID());
target = pet;
}else{
target = getTarget(msg);
}
if (target == null) {
@@ -622,7 +720,13 @@ public enum PowersManager {
}
} else {
// get target
AbstractWorldObject target = getTarget(msg);
AbstractWorldObject target;
if(msg.getTargetType() == 37 && Mob.dynamic_pets.get(msg.getTargetID()) != null){
Mob pet = Mob.dynamic_pets.get(msg.getTargetID());
target = pet;
}else{
target = getTarget(msg);
}
if (target == null)
return true;
@@ -839,8 +943,6 @@ public enum PowersManager {
return;
}
playerCharacter.setHateValue(pb.getHateValue(trains));
//Send Cast Message.
// PerformActionMsg castMsg = new PerformActionMsg(msg);
// castMsg.setNumTrains(9999);
@@ -891,8 +993,6 @@ public enum PowersManager {
//Power is aiding a target, handle aggro if combat target is a Mob.
if (!pb.isHarmful() && target.getObjectType() == GameObjectType.PlayerCharacter) {
PlayerCharacter pcTarget = (PlayerCharacter) target;
if (!pb.isHarmful())
Mob.HandleAssistedAggro(playerCharacter, pcTarget);
}
// update target of used power timer
@@ -1231,9 +1331,8 @@ public enum PowersManager {
if (pc == null)
return;
PlayerCharacter target = SessionManager
.getPlayerCharacterByLowerCaseName(msg.getTargetName());
if (target == null || target.equals(pc) || target.isCombat()) {
PlayerCharacter target = SessionManager.getPlayerCharacterByLowerCaseName(msg.getTargetName());
if (target == null || target.equals(pc) || target.isCombat() || target.getGuild().getNation().equals(pc.getGuild().getNation()) == false) {
if (target == null) // Player not found. Send not found message
ChatManager.chatInfoError(pc,
@@ -1242,7 +1341,10 @@ public enum PowersManager {
ChatManager.chatInfoError(pc,
"Cannot summon player in combat.");
// else trying to summon self, just fail
if(target != null && target.getGuild().getNation().equals(pc.getGuild().getNation()) == false){
ChatManager.chatInfoError(pc,
"Cannot summon outside of nation.");
}
// recycle summon
sendRecyclePower(msg.getPowerToken(), origin);
@@ -1274,7 +1376,7 @@ public enum PowersManager {
if (source == null)
return;
long tooLate = pc.getSummoner(source.getObjectUUID());
long tooLate = pc.getSummoner(source.getObjectUUID()) + 45000;
if (tooLate < System.currentTimeMillis()) {
ChatManager.chatInfoError(pc, "You waited too long to " + (msg.accepted() ? "accept" : "decline") + " the summons.");
pc.removeSummoner(source.getObjectUUID());
@@ -1336,7 +1438,15 @@ public enum PowersManager {
duration = 15000; // Healer Summons, 15 seconds
else
duration = 45000; // Belgosh Summons, 45 seconds
if(pc.inSafeZone() == false) {
for (AbstractWorldObject absChar : WorldGrid.getObjectsInRangePartial(pc.loc, MBServerStatics.CHARACTER_LOAD_RANGE, MBServerStatics.MASK_PLAYER)) {
PlayerCharacter player = (PlayerCharacter) absChar;
if (player.guild.getNation().equals(pc.guild.getNation()) == false) {
duration += 60000;
break;
}
}
}
// Teleport to summoners location
FinishSummonsJob fsj = new FinishSummonsJob(source, pc);
@@ -1465,6 +1575,41 @@ public enum PowersManager {
HashSet<AbstractCharacter> trackChars = RangeBasedAwo.getTrackList(
allTargets, playerCharacter, maxTargets);
trackChars = new HashSet<>();
HashSet<AbstractWorldObject> allInRange = WorldGrid.getObjectsInRangePartial(playerCharacter.loc,MBServerStatics.CHARACTER_LOAD_RANGE,MBServerStatics.MASK_PLAYER);
//ArrayList<Guild> nationsInRange = new ArrayList<>();
ArrayList<AbstractWorldObject> purgeList = new ArrayList<>();
for(AbstractWorldObject trackChar : allInRange) {
if(trackChar.equals(playerCharacter) || !trackChar.isAlive() || !((PlayerCharacter)trackChar).isActive())
purgeList.add(trackChar);
}
allInRange.removeAll(purgeList);
//first round to add players in range
for(AbstractWorldObject trackChar : allInRange){
if(trackChar.equals(playerCharacter) || !trackChar.isAlive() || !((PlayerCharacter)trackChar).isActive())
continue;
if(allInRange.contains(trackChar)) {
trackChars.add((AbstractCharacter)trackChar);
}
}
//track full range for chaining nation members
ArrayList<Guild> nationsInRange = new ArrayList<>();
for(AbstractCharacter pc : trackChars){
if(nationsInRange.contains(pc.guild.getNation()) == false)
nationsInRange.add(pc.guild.getNation());
}
HashSet<AbstractWorldObject> fullRange = WorldGrid.getObjectsInRangePartial(playerCharacter.loc,1024,MBServerStatics.MASK_PLAYER);
for(AbstractWorldObject trackChar : fullRange) {
if(trackChar.equals(playerCharacter) || !trackChar.isAlive() || !((PlayerCharacter)trackChar).isActive())
continue;
if(nationsInRange.contains(((PlayerCharacter) trackChar).guild.getNation()) && trackChars.contains(trackChar) == false)
trackChars.add((AbstractCharacter)trackChar);
}
TrackWindowMsg trackWindowMsg = new TrackWindowMsg(msg);
// send track window
@@ -1640,7 +1785,8 @@ public enum PowersManager {
ac.setItemCasting(false);
if (ac == null || target == null || pb == null)
return;
if(pb.targetSelf)
target = ac;
ac.clearTimer(Integer.toString(pb.getToken()));
if (liveCounter == ac.getLiveCounter())
finishApplyPowerA(ac, target, targetLoc, pb, trains, false);
@@ -2221,9 +2367,9 @@ public enum PowersManager {
int type = msg.getTargetType();
int UUID = msg.getTargetID();
if (type == -1 || type == 0 || UUID == -1 || UUID == 0)
if (type == -1 || type == 0 || UUID == -1 || UUID == 0) {
return null;
}
return (AbstractWorldObject) DbManager.getObject(GameObjectType.values()[type], UUID);
}
@@ -2246,17 +2392,11 @@ public enum PowersManager {
ChatManager.chatSystemInfo(pc, smsg);
}
int chance;
if (atr > defense || defense == 0)
chance = 94;
else {
float dif = atr / defense;
if (dif <= 0.8f)
chance = 4;
else
chance = ((int) (450 * (dif - 0.8f)) + 4);
}
float constant = (atr+defense)*0.315f;
float atrChance = atr - constant;
float defChance = defense - constant + atrChance;
float smallChance = atrChance/defChance;
int chance = (int)(smallChance * 100);
// calculate hit/miss
int roll = ThreadLocalRandom.current().nextInt(100);
@@ -2464,11 +2604,11 @@ public enum PowersManager {
ChatManager.chatSystemInfo(pc, outmsg);
return false; // can't target player, stop here
} // target is mob
else if ((target.getObjectTypeMask() & MBServerStatics.MASK_MOB) != 0)
else if ((target.getObjectTypeMask() & MBServerStatics.MASK_MOB) != 0 && ((Mob)target).isPet() == false)
return pb.targetMob();
// target is pet
else if ((target.getObjectTypeMask() & MBServerStatics.MASK_PET) != 0)
else if ((target.getObjectTypeMask() & MBServerStatics.MASK_MOB) != 0 && ((Mob)target).isPet() == true)
return pb.targetPet();
// target is Building
@@ -2547,7 +2687,7 @@ public enum PowersManager {
PowersBase power = getLastPower(ac);
if (power != null && power.cancelOnTakeDamage())
if (power != null && power.cancelOnTakeDamage() && power.getName().equals("Translocate") == false)
cancelPower(ac, true);
cancelItems(ac, false, true);
ac.cancelTimer("Stuck");
@@ -2707,7 +2847,12 @@ public enum PowersManager {
}
}
}
public static void applyZergBuff(AbstractGameObject obj){
}
public static void removeZergBuff(HashSet<Integer> playersIDs){
}
}
+22 -7
View File
@@ -10,10 +10,12 @@ package engine.gameManager;
import engine.Enum;
import engine.Enum.GameObjectType;
import engine.objects.AbstractGameObject;
import engine.objects.City;
import engine.objects.PlayerCharacter;
import engine.objects.Runegate;
import engine.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;
import java.sql.Connection;
@@ -22,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;
/*
@@ -33,13 +36,14 @@ public enum SimulationManager {
SERVERHEARTBEAT;
private static final long CITY_PULSE = 2000;
private static final long RUNEGATE_PULSE = 3000;
private static final long RUNEGATE_PULSE = 500;
private static final long UPDATE_PULSE = 1000;
private static final long 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;
@@ -69,6 +73,8 @@ public enum SimulationManager {
return popString;
}
/*
* Update the simulation. *** Important: Whatever you do in here, do it damn
* quick!
@@ -126,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)
@@ -203,7 +219,6 @@ public enum SimulationManager {
city = (City) cityObject;
city.onEnter();
}
_cityPulseTime = System.currentTimeMillis() + CITY_PULSE;
}
+58
View File
@@ -0,0 +1,58 @@
package engine.gameManager;
import engine.objects.Guild;
public class ZergManager {
public static int getBaneCap(Guild guild) {
if(guild.getOwnedCity() == null || guild.getOwnedCity().getTOL() == null)
return 0;
int cityRank = guild.getOwnedCity().getTOL().getRank();
return (cityRank == 8) ? 20 : ((guild.getNation().getSubGuildList().size() + 1 <= 4) ? 10 : 20);
}
public static float getCurrentMultiplier(int count, int maxCount){
switch(maxCount) {
case 3:
return getMultiplier3Man(count);
case 5:
return getMultiplier5Man(count);
case 10:
return getMultiplier10Man(count);
case 20:
return getMultiplier20Man(count);
default:
return getMultiplier40Man(count);
}
}
public static float getMultiplier(int count, int maxCount, float[] thresholds) {
if (count <= maxCount) return 1.0f;
if (count > thresholds.length) return 0.0f;
return 1.0f - thresholds[count - maxCount - 1];
}
public static float getMultiplier3Man(int count) {
float[] thresholds = {0.37f, 0.60f, 0.75f};
return getMultiplier(count, 3, thresholds);
}
public static float getMultiplier5Man(int count) {
float[] thresholds = {0.25f, 0.43f, 0.56f, 0.67f, 0.75f};
return getMultiplier(count, 5, thresholds);
}
public static float getMultiplier10Man(int count) {
float[] thresholds = {0.14f, 0.25f, 0.35f, 0.43f, 0.50f, 0.56f, 0.62f, 0.67f, 0.71f, 0.75f};
return getMultiplier(count, 10, thresholds);
}
public static float getMultiplier20Man(int count) {
return getMultiplier10Man(count * 2);
}
public static float getMultiplier40Man(int count) {
return getMultiplier10Man(count * 4);
}
}
+8
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;
@@ -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
+5
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 {
@@ -29,6 +31,9 @@ public class AttackJob extends AbstractJob {
@Override
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() {
+2 -2
View File
@@ -29,7 +29,7 @@ public class EndFearJob extends AbstractEffectJob {
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;
}
}
+7 -2
View File
@@ -34,10 +34,15 @@ public class ModTableEntry {
itemTableEntryList = LootManager._modTables.get(modTablwe);
for (ModTableEntry iteration : itemTableEntryList)
if(itemTableEntryList == null)
return null;
for (ModTableEntry iteration : itemTableEntryList) {
if (iteration == null)
continue;
if (roll >= iteration.minRoll && roll <= iteration.maxRoll)
modTableEntry = iteration;
}
return modTableEntry;
}
}
+1 -1
View File
@@ -220,7 +220,7 @@ public class Bounds {
//player is inside building region, skip collision check. we only do collision from the outside.
if (player.region != null && player.region.parentBuildingID == building.getObjectUUID())
continue;
if (building.getBounds().colliders == null)
if (building.getBounds() == null || building.getBounds().colliders == null)
continue;
for (Colliders collider : building.getBounds().colliders) {
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -13,7 +13,7 @@ public class MobAIThread implements Runnable{
public static int AI_DROP_AGGRO_RANGE = 60;
public static int AI_PULSE_MOB_THRESHOLD = 200;
public static int AI_PATROL_DIVISOR = 15;
public static float AI_CAST_FREQUENCY;
public static float AI_CAST_FREQUENCY = 1.0f;
// Thread constructor
public MobAIThread() {
@@ -12,13 +12,20 @@ package engine.mobileAI.utilities;
import engine.Enum.*;
import engine.gameManager.ChatManager;
import engine.gameManager.CombatManager;
import engine.gameManager.PowersManager;
import engine.math.Vector3fImmutable;
import engine.mobileAI.MobAI;
import engine.mobileAI.Threads.MobAIThread;
import engine.net.DispatchMessage;
import engine.net.client.msg.PerformActionMsg;
import engine.net.client.msg.TargetedActionMsg;
import engine.objects.*;
import engine.powers.ActionsBase;
import engine.powers.PowersBase;
import engine.server.MBServerStatics;
import org.pmw.tinylog.Logger;
import java.util.ArrayList;
import java.util.concurrent.ThreadLocalRandom;
import static engine.math.FastMath.sqr;
@@ -48,7 +55,7 @@ public class CombatUtilities {
}
public static boolean inRange2D(AbstractWorldObject entity1, AbstractWorldObject entity2, double range) {
return entity1.getLoc().distance2D(entity2.getLoc()) < range;
return entity1.getLoc().distanceSquared2D(entity2.getLoc()) < range * range;
}
public static void swingIsBlock(Mob agent, AbstractWorldObject target, int animation) {
@@ -304,7 +311,6 @@ public class CombatUtilities {
if (targetMob.isSiege())
return;
}
}
public static float determineDamage(Mob agent) {
@@ -480,8 +486,9 @@ public class CombatUtilities {
masteryLevel = (int) agent.getSkills().get(weapon.getMastery()).getModifiedAmount();
}
}
return min * (pow(0.0048 * primary + .049 * (primary - 0.75), 0.5) + pow(0.0066 * secondary + 0.064 * (secondary - 0.75), 0.5) + +0.01 * (focusLevel + masteryLevel));
}
return min * (pow(0.0048 * primary + .049 * (primary - 0.75), 0.5) + pow(0.0066 * secondary + 0.064 * (secondary - 0.75), 0.5) + +0.01 * (focusLevel + masteryLevel));
return agent.getMinDamageHandOne();
}
public static double getMaxDmg(double max, Mob agent, ItemBase weapon) {
@@ -507,8 +514,214 @@ public class CombatUtilities {
if (agent.getSkills().containsKey(weapon.getSkillRequired()))
masteryLevel = (int) agent.getSkills().get(weapon.getMastery()).getModifiedAmount();
return max * (pow(0.0124 * primary + 0.118 * (primary - 0.75), 0.5) + pow(0.0022 * secondary + 0.028 * (secondary - 0.75), 0.5) + 0.0075 * (focusLevel + masteryLevel));
}
return agent.getMaxDamageHandOne();
}
public static boolean MobCast(Mob mob) {
try {
// Method picks a random spell from a mobile's list of powers
// and casts it on the current target (or itself). Validation
// (including empty lists) is done previously within canCast();
ArrayList<Integer> powerTokens;
ArrayList<Integer> purgeTokens;
AbstractCharacter target = (AbstractCharacter) mob.getCombatTarget();
if (mob.behaviourType.callsForHelp)
MobAI.MobCallForHelp(mob);
// Generate a list of tokens from the mob powers for this mobile.
powerTokens = new ArrayList<>(mob.mobPowers.keySet());
purgeTokens = new ArrayList<>();
// If player has this effect on them currently then remove
// this token from our list.
for (int powerToken : powerTokens) {
PowersBase powerBase = PowersManager.getPowerByToken(powerToken);
for (ActionsBase actionBase : powerBase.getActions()) {
String stackType = actionBase.stackType;
if (target.getEffects() != null && target.getEffects().containsKey(stackType))
purgeTokens.add(powerToken);
}
}
powerTokens.removeAll(purgeTokens);
// Sanity check
if (powerTokens.isEmpty())
return false;
// Pick random spell from our list of powers
int powerToken = powerTokens.get(ThreadLocalRandom.current().nextInt(powerTokens.size()));
int powerRank = mob.mobPowers.get(powerToken);
PowersBase mobPower = PowersManager.getPowerByToken(powerToken);
//check for hit-roll
if (mobPower.requiresHitRoll)
if (triggerDefense(mob, mob.getCombatTarget()))
return false;
// Cast the spell
if (inRange2D(mob, mob.getCombatTarget(), mobPower.getRange())) {
PerformActionMsg msg;
if (!mobPower.isHarmful() || mobPower.targetSelf) {
PowersManager.useMobPower(mob, mob, mobPower, powerRank);
msg = PowersManager.createPowerMsg(mobPower, powerRank, mob, mob);
} else {
PowersManager.useMobPower(mob, target, mobPower, powerRank);
msg = PowersManager.createPowerMsg(mobPower, powerRank, mob, target);
}
msg.setUnknown04(2);
PowersManager.finishUseMobPower(msg, mob, 0, 0);
long randomCooldown = (long)((ThreadLocalRandom.current().nextInt(10,15) * 1000L) * MobAIThread.AI_CAST_FREQUENCY);
mob.nextCastTime = System.currentTimeMillis() + randomCooldown;
return true;
}
} catch (Exception e) {
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: MobCast" + " " + e.getMessage());
}
return max * (pow(0.0124 * primary + 0.118 * (primary - 0.75), 0.5) + pow(0.0022 * secondary + 0.028 * (secondary - 0.75), 0.5) + 0.0075 * (focusLevel + masteryLevel));
return false;
}
public static boolean GuardCast(Mob mob) {
try {
// Method picks a random spell from a mobile's list of powers
// and casts it on the current target (or itself). Validation
// (including empty lists) is done previously within canCast();
ArrayList<Integer> powerTokens;
ArrayList<Integer> purgeTokens;
AbstractCharacter target = (AbstractCharacter) mob.getCombatTarget();
if (mob.behaviourType.callsForHelp)
MobAI.MobCallForHelp(mob);
// Generate a list of tokens from the mob powers for this mobile.
powerTokens = new ArrayList<>(mob.mobPowers.keySet());
purgeTokens = new ArrayList<>();
// If player has this effect on them currently then remove
// this token from our list.
for (int powerToken : powerTokens) {
PowersBase powerBase = PowersManager.getPowerByToken(powerToken);
for (ActionsBase actionBase : powerBase.getActions()) {
String stackType = actionBase.stackType;
if (target.getEffects() != null && target.getEffects().containsKey(stackType))
purgeTokens.add(powerToken);
}
}
powerTokens.removeAll(purgeTokens);
// Sanity check
if (powerTokens.isEmpty())
return false;
int powerToken;
int nukeRoll = ThreadLocalRandom.current().nextInt(1,100);
if (nukeRoll < 55) {
//use direct damage spell
powerToken = powerTokens.get(powerTokens.size() - 1);
} else {
//use random spell
powerToken = powerTokens.get(ThreadLocalRandom.current().nextInt(powerTokens.size()));
}
int powerRank = 1;
switch(mob.getRank()){
case 1:
powerRank = 10;
break;
case 2:
powerRank = 15;
break;
case 3:
powerRank = 20;
break;
case 4:
powerRank = 25;
break;
case 5:
powerRank = 30;
break;
case 6:
powerRank = 35;
break;
case 7:
powerRank = 40;
break;
}
PowersBase mobPower = PowersManager.getPowerByToken(powerToken);
//check for hit-roll
if (mobPower.requiresHitRoll)
if (triggerDefense(mob, mob.getCombatTarget()))
return false;
// Cast the spell
if (inRange2D(mob, mob.getCombatTarget(), mobPower.getRange())) {
PerformActionMsg msg;
if (!mobPower.isHarmful() || mobPower.targetSelf) {
if (mobPower.category.equals("DISPEL")) {
PowersManager.useMobPower(mob, target, mobPower, powerRank);
msg = PowersManager.createPowerMsg(mobPower, powerRank, mob, target);
} else {
PowersManager.useMobPower(mob, mob, mobPower, powerRank);
msg = PowersManager.createPowerMsg(mobPower, powerRank, mob, mob);
}
} else {
PowersManager.useMobPower(mob, target, mobPower, powerRank);
msg = PowersManager.createPowerMsg(mobPower, powerRank, mob, target);
}
msg.setUnknown04(2);
PowersManager.finishUseMobPower(msg, mob, 0, 0);
long randomCooldown = (long)((ThreadLocalRandom.current().nextInt(10,15) * 1000L) * MobAIThread.AI_CAST_FREQUENCY);
mob.nextCastTime = System.currentTimeMillis() + randomCooldown;
return true;
}
} catch (Exception e) {
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: MobCast" + " " + e.getMessage());
}
return false;
}
}
@@ -13,10 +13,10 @@ import engine.Enum;
import engine.Enum.GameObjectType;
import engine.Enum.ModType;
import engine.Enum.SourceType;
import engine.mobileAI.Threads.MobAIThread;
import engine.exception.MsgSendException;
import engine.gameManager.MovementManager;
import engine.math.Vector3fImmutable;
import engine.mobileAI.Threads.MobAIThread;
import engine.net.client.msg.MoveToPointMsg;
import engine.objects.*;
import org.pmw.tinylog.Logger;
@@ -38,7 +38,7 @@ public class MovementUtilities {
if (agent.getContract() != null)
guardCaptain = agent;
else
guardCaptain = (Mob) agent.npcOwner;
guardCaptain = (Mob) agent.guardCaptain;
if (guardCaptain != null) {
Building barracks = guardCaptain.building;
@@ -115,39 +115,8 @@ public class MovementUtilities {
}
public static Vector3fImmutable GetMoveLocation(Mob aiAgent, AbstractCharacter aggroTarget) {
// Player isnt moving and neither is mob. Just return
// the mobile's current location. Ain't goin nowhere!
// *** Refactor: Check to ensure methods calling us
// all don't sent move messages when not moving.
if ((aggroTarget.isMoving() == false))
return aggroTarget.getLoc();
if (aggroTarget.getEndLoc().x != 0) {
float aggroTargetDistanceSquared = aggroTarget.getLoc().distanceSquared2D(aggroTarget.getEndLoc());
float aiAgentDistanceSquared = aiAgent.getLoc().distanceSquared2D(aggroTarget.getEndLoc());
if (aiAgentDistanceSquared >= aggroTargetDistanceSquared)
return aggroTarget.getEndLoc();
else {
float distanceToMove = sqrt(aggroTargetDistanceSquared + aiAgentDistanceSquared) * .5f;
return aggroTarget.getFaceDir().scaleAdd(distanceToMove, aggroTarget.getLoc());
}
}
// One of us is moving so let's calculate our destination loc for this
// simulation frame. We will simply project our position onto the
// character's movement vector and return the closest point.
return aiAgent.getLoc().ClosestPointOnLine(aggroTarget.getLoc(), aggroTarget.getEndLoc());
}
public static void moveToLocation(Mob agent, Vector3fImmutable newLocation, float offset) {
agent.resetLastSetLocUpdate();
try {
//don't move farther than 30 units from player.
@@ -172,32 +141,8 @@ public class MovementUtilities {
return (agent.isAlive() && !agent.getBonuses().getBool(ModType.Stunned, SourceType.None) && !agent.getBonuses().getBool(ModType.CannotMove, SourceType.None));
}
public static Vector3fImmutable randomPatrolLocation(Mob agent, Vector3fImmutable center, float radius) {
//Determing where I want to move.
return new Vector3fImmutable((center.x - radius) + ((ThreadLocalRandom.current().nextFloat() + .1f * 2) * radius),
center.y,
(center.z - radius) + ((ThreadLocalRandom.current().nextFloat() + .1f * 2) * radius));
}
public static Long estimateMovementTime(Mob agent) {
if (agent.getEndLoc().x == 0 && agent.getEndLoc().y == 0)
return 0L;
return (long) ((agent.getLoc().distance2D(agent.getEndLoc()) * 1000) / agent.getSpeed());
}
public static void aiMove(Mob agent, Vector3fImmutable vect, boolean isWalking) {
//update our walk/run state.
if (isWalking && !agent.isWalk()) {
agent.setWalkMode(true);
MovementManager.sendRWSSMsg(agent);
} else if (!isWalking && agent.isWalk()) {
agent.setWalkMode(false);
MovementManager.sendRWSSMsg(agent);
}
MoveToPointMsg msg = new MoveToPointMsg();
@@ -273,23 +218,4 @@ public class MovementUtilities {
return character.getLoc();
}
public static boolean updateMovementToCharacter(Mob aiAgent, AbstractCharacter aggroTarget) {
if (aiAgent.destination.equals(Vector3fImmutable.ZERO))
return true;
if (!aiAgent.isMoving())
return true;
if (aggroTarget.isMoving()) {
return !aiAgent.destination.equals(aggroTarget.getEndLoc()) && !aiAgent.destination.equals(aggroTarget.getLoc());
} else {
if (aiAgent.destination.equals(aggroTarget.getLoc()))
return false;
}
return false;
}
}
+1 -1
View File
@@ -97,7 +97,7 @@ public class NetMsgFactory {
// if (MBServerStatics.worldServerName.equals("Grief"))
Logger.error("Invalid protocol msg for player " + player.getFirstName() + " : " + opcode + " lastopcode: " + origin.lastProtocol.name() + " Error Code : " + errorCode);
} else
Logger.error("Invalid protocol msg : " + opcode + " lastopcode: " + origin.lastProtocol.name() + " Error Code : " + errorCode);
Logger.error("PROTOCOL ERROR: Player: " + ((ClientConnection) origin).getPlayerCharacter().getName() + " Account: " + ((ClientConnection) origin).getPlayerCharacter().getAccount().getUname() + "Invalid protocol msg : " + opcode + " lastopcode: " + origin.lastProtocol.name() + " Error Code : " + errorCode);
}
+111 -91
View File
@@ -9,6 +9,7 @@
package engine.net.client;
import engine.Enum;
import engine.Enum.*;
import engine.InterestManagement.WorldGrid;
import engine.exception.MsgSendException;
@@ -122,6 +123,7 @@ public class ClientMessagePump implements NetMsgHandler {
if (pc.isSit()) {
pc.setCombat(false);
pc.cancelOnSit();
pc.stopMovement(pc.loc);
}
UpdateStateMsg rwss = new UpdateStateMsg();
@@ -222,6 +224,11 @@ public class ClientMessagePump implements NetMsgHandler {
return;
}
if(msg.getSlotNumber() == 11 && pc.getRaceID() == 1999){
forceTransferFromEquipToInventory(msg, origin, "Saetor cannot wear shoes.");
return;
}
int uuid = msg.getUUID();
int slot = msg.getSlotNumber();
//System.out.println("loading to slot: " + slot);
@@ -554,18 +561,32 @@ public class ClientMessagePump implements NetMsgHandler {
if (i == null)
return;
if(i.getItemBaseID() == 7)
return; //cant delete gold
if (!itemManager.doesCharOwnThisItem(i.getObjectUUID()))
return;
if (!itemManager.inventoryContains(i))
return;
if (i.isCanDestroy())
if(i.getItemBaseID() == 980066)
return;
if (i.canDestroy) {
int value = i.getItemBase().value;
if(i.getItemBase().isRune())
value = 500000;
if(sourcePlayer.getCharItemManager().getGoldInventory().getNumOfItems() + value > 10000000){
return;
}
if (itemManager.delete(i) == true) {
sourcePlayer.getCharItemManager().addGoldToInventory(value,false);
sourcePlayer.getCharItemManager().updateInventory();
Dispatch dispatch = Dispatch.borrow(sourcePlayer, msg);
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
}
}
}
private static void ackBankWindowOpened(AckBankWindowOpenedMsg msg, ClientConnection origin) {
@@ -1358,219 +1379,171 @@ public class ClientMessagePump implements NetMsgHandler {
}
private static void buyFromNPC(BuyFromNPCMsg msg, ClientConnection origin) {
PlayerCharacter sourcePlayer = SessionManager.getPlayerCharacter(origin);
if (sourcePlayer == null)
return;
if (origin.buyLock.tryLock()) {
try {
CharacterItemManager itemMan = sourcePlayer.getCharItemManager();
if (itemMan == null)
if (itemMan == null) {
return;
}
NPC npc = NPC.getFromCache(msg.getNPCID());
if (npc == null)
if (npc == null) {
return;
}
Item gold = itemMan.getGoldInventory();
if (gold == null)
if (gold == null) {
return;
}
Item buy = null;
if (msg.getItemType() == GameObjectType.MobEquipment.ordinal()) {
ArrayList<MobEquipment> sellInventory = npc.getContract().getSellInventory();
if (sellInventory == null)
if (sellInventory == null) {
return;
}
for (MobEquipment me : sellInventory) {
if (me.getObjectUUID() == msg.getItemID()) {
ItemBase ib = me.getItemBase();
if (ib == null)
if (ib == null) {
return;
}
//test room available for item
if (!itemMan.hasRoomInventory(ib.getWeight()))
if (!itemMan.hasRoomInventory(ib.getWeight())) {
return;
int cost = me.getMagicValue();
}
int cost = me.magicValue;
if(npc.getContractID() == 1201 && me.getItemBase().getName().equals("Prospector"))
cost = 50;
float bargain = sourcePlayer.getBargain();
float profit = npc.getSellPercent(sourcePlayer) - bargain;
if(me.getItemBase().getType().equals(ItemType.POTION))
profit -= 1.0f;
if (profit < 1)
profit = 1;
if(npc.getContractID() == 900){
cost = Warehouse.getCostForResource(ib.getUUID()) * Warehouse.getSellStackSize(ib.getUUID());
}
cost *= profit;
if (gold.getNumOfItems() - cost < 0) {
//dont' have enough goldItem exit!
// chatMan.chatSystemInfo(pc, "" + "You dont have enough gold.");
return;
}
Building b = (!npc.isStatic()) ? npc.getBuilding() : null;
if (b != null && b.getProtectionState().equals(ProtectionState.NPC))
b = null;
int buildingDeposit = cost - me.getMagicValue();
if (b != null && (b.getStrongboxValue() + buildingDeposit) > b.getMaxGold()) {
if (b != null && (b.getStrongboxValue() + buildingDeposit) > b.getMaxGold() && !b.isOwnerIsNPC()) {
ErrorPopupMsg.sendErrorPopup(sourcePlayer, 206);
return;
}
if (!itemMan.buyFromNPC(b, cost, buildingDeposit)) {
// chatMan.chatSystemInfo(pc, "" + "You Failed to buy the item.");
ChatManager.chatSystemError(sourcePlayer, "Failed To Buy Item");
return;
}
buy = Item.createItemForPlayer(sourcePlayer, ib);
if (buy != null) {
me.transferEnchants(buy);
itemMan.addItemToInventory(buy);
//itemMan.updateInventory();
if(me.getItemBase().getType().equals(ItemType.RESOURCE) && npc.getContractID() == 900){
handleResourcePurchase(me,itemMan,npc,buy,sourcePlayer,ib);
}else {
buy = Item.createItemForPlayer(sourcePlayer, ib);
if (buy != null) {
me.transferEnchants(buy);
itemMan.addItemToInventory(buy);
if(npc.contractUUID == 900 && buy.getItemBaseID() == 1705032){
buy.setNumOfItems(10);
DbManager.ItemQueries.UPDATE_NUM_ITEMS(buy,buy.getNumOfItems());
}
//itemMan.updateInventory();
}
}
}
}
} else if (msg.getItemType() == GameObjectType.Item.ordinal()) {
CharacterItemManager npcCim = npc.getCharItemManager();
if (npcCim == null)
return;
buy = Item.getFromCache(msg.getItemID());
if (buy == null)
return;
ItemBase ib = buy.getItemBase();
if (ib == null)
return;
if (!npcCim.inventoryContains(buy))
return;
//test room available for item
if (!itemMan.hasRoomInventory(ib.getWeight()))
return;
//TODO test cost and subtract goldItem
//TODO CHnage this if we ever put NPc city npcs in buildings.
int cost = buy.getBaseValue();
if (buy.isID() || buy.isCustomValue())
cost = buy.getMagicValue();
float bargain = sourcePlayer.getBargain();
float profit = npc.getSellPercent(sourcePlayer) - bargain;
if (profit < 1)
profit = 1;
if (!buy.isCustomValue())
cost *= profit;
else
cost = buy.getValue();
if (gold.getNumOfItems() - cost < 0) {
ErrorPopupMsg.sendErrorPopup(sourcePlayer, 128); // Insufficient Gold
return;
}
Building b = (!npc.isStatic()) ? npc.getBuilding() : null;
if (b != null)
if (b.getProtectionState().equals(ProtectionState.NPC))
b = null;
int buildingDeposit = cost;
if (b != null && (b.getStrongboxValue() + buildingDeposit) > b.getMaxGold()) {
if (b != null && (b.getStrongboxValue() + buildingDeposit) > b.getMaxGold() && !b.isOwnerIsNPC()) {
ErrorPopupMsg.sendErrorPopup(sourcePlayer, 206);
return;
}
if (!itemMan.buyFromNPC(b, cost, buildingDeposit)) {
ErrorPopupMsg.sendErrorPopup(sourcePlayer, 110);
return;
}
if (buy != null)
itemMan.buyFromNPC(buy, npc);
} else if (msg.getItemType() == GameObjectType.MobLoot.ordinal()) {
CharacterItemManager npcCim = npc.getCharItemManager();
if (npcCim == null)
return;
buy = MobLoot.getFromCache(msg.getItemID());
if (buy == null)
return;
ItemBase ib = buy.getItemBase();
if (ib == null)
return;
if (!npcCim.inventoryContains(buy))
return;
//test room available for item
if (!itemMan.hasRoomInventory(ib.getWeight()))
return;
//TODO test cost and subtract goldItem
//TODO CHnage this if we ever put NPc city npcs in buildings.
int cost = buy.getMagicValue();
cost *= npc.getSellPercent(sourcePlayer);
if (gold.getNumOfItems() - cost < 0) {
ErrorPopupMsg.sendErrorPopup(sourcePlayer, 128); // Insufficient Gold
return;
}
Building b = (!npc.isStatic()) ? npc.getBuilding() : null;
if (b != null && b.getProtectionState().equals(ProtectionState.NPC))
b = null;
int buildingDeposit = cost;
if (b != null && (b.getStrongboxValue() + buildingDeposit) > b.getMaxGold()) {
if (b != null && (b.getStrongboxValue() + buildingDeposit) > b.getMaxGold() && !b.isOwnerIsNPC()) {
ErrorPopupMsg.sendErrorPopup(sourcePlayer, 206);
return;
}
if (!itemMan.buyFromNPC(b, cost, buildingDeposit))
return;
if (buy != null)
itemMan.buyFromNPC(buy, npc);
} else
return;
if (buy != null) {
msg.setItem(buy);
//send the buy message back to update player
// msg.setItemType(buy.getObjectType().ordinal());
@@ -1579,16 +1552,44 @@ public class ClientMessagePump implements NetMsgHandler {
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
itemMan.updateInventory();
}
} finally {
origin.buyLock.unlock();
}
} else {
ErrorPopupMsg.sendErrorPopup(origin.getPlayerCharacter(), 12); // All production slots taken
}
}
public static void handleResourcePurchase(MobEquipment me, CharacterItemManager itemMan, NPC npc, Item buy, PlayerCharacter sourcePlayer, ItemBase ib){
boolean stacked = false;
int buystack = Warehouse.getSellStackSize(me.getItemBase().getUUID());
for(Item item : itemMan.getInventory()){
int itemID = item.getItemBaseID();
int meID = me.getItemBase().getUUID();
if(itemID == meID){
if(Warehouse.maxResources.isEmpty())
Warehouse.getMaxResources();
int maxStack = Warehouse.maxResources.get(itemID);
if(maxStack > item.getNumOfItems() + buystack){
item.setNumOfItems(item.getNumOfItems() + buystack);
stacked = true;
itemMan.updateInventory();
DbManager.ItemQueries.UPDATE_NUM_ITEMS(item,item.getNumOfItems());
break;
}
}
}
if(!stacked){
buy = Item.createItemForPlayer(sourcePlayer, ib);
if (buy != null) {
me.transferEnchants(buy);
itemMan.addItemToInventory(buy);
buy.setNumOfItems(buystack);
DbManager.ItemQueries.UPDATE_NUM_ITEMS(buy,buy.getNumOfItems());
}
}
itemMan.updateInventory();
}
private static void Repair(RepairMsg msg, ClientConnection origin) {
PlayerCharacter player = SessionManager.getPlayerCharacter(origin);
@@ -1631,8 +1632,8 @@ public class ClientMessagePump implements NetMsgHandler {
if (toRepair == null)
return;
if (toRepair.getItemBase().isGlass())
return;
//if (toRepair.getItemBase().isGlass())
// return;
//make sure item is in player's inventory or equipment
if (!itemMan.inventoryContains(toRepair) && !itemMan.equippedContains(toRepair))
@@ -1654,6 +1655,12 @@ public class ClientMessagePump implements NetMsgHandler {
}
//TODO get cost to repair
int cost = (int) ((max - dur) * 80.1);
//glass costs 3x as much to repair
if (toRepair.getItemBase().isGlass()){
cost *= 3;
}
Building b = (!npc.isStatic()) ? npc.getBuilding() : null;
if (b != null)
@@ -1888,9 +1895,22 @@ public class ClientMessagePump implements NetMsgHandler {
break;
case LEAVEREQUEST:
origin.disconnect();
ArrayList<PlayerCharacter> sameMachine = new ArrayList<>();
for (PlayerCharacter pc : SessionManager.getAllActivePlayers()) {
if(origin.machineID.equals(pc.getClientConnection().machineID))
sameMachine.add(pc);
}
if(sameMachine.isEmpty() == false){
if(sameMachine.get(0) != null) {
sameMachine.get(0).isBoxed = false;
sameMachine.get(0).removeEffectBySource(EffectSourceType.DeathShroud,41,true);
ChatManager.chatSystemInfo(sameMachine.get(0), "You Are No Longer Flagged 'Boxed'");
}
}
break;
case POWER:
PowersManager.usePower((PerformActionMsg) msg, origin, false);
//PowersManager.static_power_que.add(new PowersManager.PowerQueObject((PerformActionMsg) msg, origin, false));
break;
case REQUESTMELEEATTACK:
CombatManager.setAttackTarget((AttackCmdMsg) msg, origin);

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