Compare commits

...

221 Commits

Author SHA1 Message Date
FatBoy 9965223d9b revert steward and builder sell inventory 2024-09-14 23:03:04 -05:00
FatBoy 08b99d0d3a revert steward and builder sell inventory 2024-09-14 22:50:31 -05:00
FatBoy 519a6a2b1e revert steward and builder sell inventory 2024-09-14 22:49:18 -05:00
FatBoy 524f5d470b protocol error logging 2024-09-14 22:47:24 -05:00
FatBoy 6631c6a5d7 protocol error logging 2024-09-14 22:44:26 -05:00
FatBoy 10f95fb0d9 fixed banestone roll times 2024-09-14 13:04:31 -05:00
FatBoy a315366026 disconnect after 10 minutes dead 2024-09-13 19:46:01 -05:00
FatBoy 1901c9a679 disconnect after 10 minutes dead 2024-09-13 19:44:56 -05:00
FatBoy 415ad5402f disconnect after 10 minutes dead 2024-09-13 19:44:13 -05:00
FatBoy 9a40e12dbc castable enchants removed when item leaves players immediate posession 2024-09-13 19:33:58 -05:00
FatBoy a1af663796 irekei healers get blood prophet 2024-09-13 19:21:35 -05:00
FatBoy 78b7ddb32a saetor trains undone 2024-09-13 18:22:45 -05:00
FatBoy 5e5ee4fed1 saetor trains 2024-09-13 17:57:58 -05:00
FatBoy 84c022a39b saetor trains 2024-09-13 17:54:50 -05:00
FatBoy 300741b05a saetor trains 2024-09-13 17:51:38 -05:00
FatBoy dc685a01c6 remove roots form wildkins chase 2024-09-12 21:31:12 -05:00
FatBoy 752f897a34 juiced up droppers 2024-09-12 21:26:42 -05:00
FatBoy 722cb6b1fd Revert "high str NPCs"
This reverts commit 50c095cd09.
2024-09-12 21:08:36 -05:00
FatBoy 50c095cd09 high str NPCs 2024-09-12 20:55:38 -05:00
FatBoy c23546eb46 10% cost for magical random rolls removed 2024-09-12 20:49:21 -05:00
FatBoy 36340c4e52 fixed production bug for mines 2024-09-12 20:21:11 -05:00
FatBoy a7ab38f40c can teleport to owned mines 2024-09-12 19:54:48 -05:00
FatBoy 0901c03b74 can teleport to owned mines 2024-09-12 19:47:42 -05:00
FatBoy 50817352c1 teleport to mines 2024-09-12 19:16:38 -05:00
FatBoy ee4a7447bc teleport to mines 2024-09-12 19:08:57 -05:00
FatBoy a6d3c827ad teleport to mines 2024-09-12 19:08:08 -05:00
FatBoy d4ea31b91f teleport to mines 2024-09-11 19:51:48 -05:00
FatBoy 210faaec6d refund gold for cancelled rolled items 2024-09-11 19:33:18 -05:00
FatBoy 16be9b9dae refund gold for cancelled rolled items 2024-09-11 19:21:13 -05:00
FatBoy 2b8f709182 stun grounds 2024-09-11 15:42:10 -05:00
FatBoy aec22d8563 disable keyclone audit 2024-09-11 15:33:10 -05:00
FatBoy 1996d042f0 fly speed changes finished 2024-09-10 20:26:42 -05:00
FatBoy 27b6665717 fly speed changes 2024-09-10 20:18:59 -05:00
FatBoy ce20045611 Merge remote-tracking branch 'origin/lakebane-strongholds' into lakebane-strongholds
# Conflicts:
#	src/engine/objects/PlayerCharacter.java
2024-09-10 20:17:33 -05:00
FatBoy 277f8bfd69 fly speed changes 2024-09-10 20:17:00 -05:00
FatBoy 1da2db856f fly speed completed 2024-09-10 19:23:39 -05:00
FatBoy 33dfe1389c move buff grounding 2024-09-10 17:58:41 -05:00
FatBoy 013b69405a move buff grounding 2024-09-10 17:46:35 -05:00
FatBoy ca07a53835 cast while flying 2024-09-10 17:02:21 -05:00
FatBoy bbdb6ae1f6 cast while flying 2024-09-10 17:00:28 -05:00
FatBoy 4a63222318 cast while flying 2024-09-10 16:54:57 -05:00
FatBoy 1a1c552964 cast while flying 2024-09-10 16:54:36 -05:00
FatBoy 3587dc2d75 builders sell things at proper ranks 2024-09-09 21:09:12 -05:00
FatBoy 96eb9a3ad0 builders sell things at proper ranks 2024-09-09 21:06:03 -05:00
FatBoy eaa70f43c0 stewards sell things at proper ranks 2024-09-09 20:59:56 -05:00
FatBoy a426b773d3 sage on TOL 2024-09-09 20:26:04 -05:00
FatBoy 84841edda9 r8 gets extra hireling slot 2024-09-09 20:24:36 -05:00
FatBoy d416dbe47b shade hide 2024-09-09 20:17:31 -05:00
FatBoy 7052da7e54 shade hide 2024-09-09 20:13:07 -05:00
FatBoy 8f2a2f0ba6 Rogue Druids 2024-09-08 19:17:16 -05:00
FatBoy d575ba663d displayed maintenance for r8 tree no longer shows resource required 2024-09-08 18:57:14 -05:00
FatBoy 964fe7f335 city serilizing bug 2024-09-08 18:43:47 -05:00
FatBoy d3e92d6576 city serilizing bug 2024-09-08 18:35:53 -05:00
FatBoy 9dbd6069f1 force respawn after 10 minutes dead 2024-09-08 18:23:12 -05:00
FatBoy 7ae25c9a1b can now summon in combat 2024-09-08 18:21:16 -05:00
FatBoy 689969a005 r* tree buildings acquire 10% more HP 2024-09-08 17:18:45 -05:00
FatBoy b270e1ac8d r8 maintenance flat 3 mil 2024-09-08 17:13:31 -05:00
FatBoy 95d38cea44 rogue can promote to druid 2024-09-08 17:10:57 -05:00
FatBoy 3ed0765fe5 flying while having move buff fix 2024-09-08 17:04:25 -05:00
FatBoy 0c90164c24 shade invis bug 2024-09-08 16:59:19 -05:00
FatBoy a45fa39afc random roll magic extra cost removed 2024-09-08 16:45:50 -05:00
FatBoy 8959f5e1c5 r7 votary grants PR40 boon 2024-09-08 16:41:17 -05:00
FatBoy df338ab00e fix resource vendor pricing 2024-09-07 18:34:33 -05:00
FatBoy ac7a2452d6 disable strongholds 2024-09-07 18:31:08 -05:00
FatBoy 80104e6d07 fixed login bug 2024-09-07 18:04:59 -05:00
FatBoy 8f394cd01d fixed login bug 2024-09-07 18:01:23 -05:00
FatBoy e5a32c83c5 Revert "mine production values adjusted"
This reverts commit 177f9a1ff6.
2024-09-07 17:45:32 -05:00
FatBoy 8dce20e69f Revert "adjusted hit chance formula"
This reverts commit 3428a06bb8.
2024-09-07 17:45:25 -05:00
FatBoy 3428a06bb8 adjusted hit chance formula 2024-09-07 17:38:26 -05:00
FatBoy 177f9a1ff6 mine production values adjusted 2024-09-07 17:35:50 -05:00
FatBoy 9d93944dd1 mob roll levels 2024-09-06 20:54:58 -05:00
FatBoy a4cba1a352 better roll chance for high level vendors 2024-09-06 20:28:32 -05:00
FatBoy 17b4232d80 better roll chance for high level vendors 2024-09-06 20:14:27 -05:00
FatBoy 2eb58eb719 custom hit chance formula 2024-09-05 21:30:01 -05:00
FatBoy db5a4195ad custom hit chance formula 2024-09-05 21:26:21 -05:00
FatBoy 3fb29f8e2b custom hit chance formula 2024-09-05 21:24:23 -05:00
FatBoy dacdb2cf35 stronghold mobs 2024-09-05 21:13:57 -05:00
FatBoy c8473cbe03 stronghold mobs 2024-09-05 21:12:39 -05:00
FatBoy e9edf8a7ea increase number of strongholds 2024-09-05 20:48:01 -05:00
FatBoy 5a73aa3d90 increase number of strongholds 2024-09-05 20:47:20 -05:00
FatBoy 04101c1c3e additional 60 second logout timer for players who have enemies nearby and aren't in safezone 2024-09-05 20:29:37 -05:00
FatBoy 0c9343f24d additional 60 second logout timer for players who have enemies nearby and aren't in safezone 2024-09-05 20:09:27 -05:00
FatBoy b71710871c track list construction 2024-09-05 19:57:34 -05:00
FatBoy f6df6db17b level cap increased to 80 2024-09-05 19:41:30 -05:00
FatBoy 3f8b3bc6cb PVP xp enabled 2024-09-05 19:40:25 -05:00
FatBoy 383ef27128 can use abilities while flying 2024-09-05 19:30:15 -05:00
FatBoy d8189768ae mine production cut in half 2024-09-05 19:26:22 -05:00
FatBoy a5eb2fce75 mine management to show correct production amount 2024-09-05 19:24:46 -05:00
FatBoy 1fe242a284 strip temporary item enchants when transfered 2024-09-05 19:19:34 -05:00
FatBoy a4b83ca9a0 increase resists of the droppers 2024-09-04 19:05:19 -05:00
FatBoy 2365b26c1c trainer buildinsg capped at r1 with 3 slots 2024-09-04 10:05:48 -05:00
FatBoy 8fb044f71b trainer buildinsg capped at r1 with 3 slots 2024-09-04 09:45:42 -05:00
FatBoy 5ce42475c4 force respawn after 10 minutes of unreleased corpse 2024-09-04 09:35:44 -05:00
FatBoy 57b9d31fff dropper resists 2024-09-04 09:21:07 -05:00
FatBoy 7671586cb0 terraform issue 2024-09-03 21:13:25 -05:00
FatBoy a1997e31a8 terraform issue 2024-09-03 21:11:44 -05:00
FatBoy f5478e9f64 terraform issue 2024-09-03 21:08:46 -05:00
FatBoy 06abea3576 terraform issue 2024-09-03 21:05:19 -05:00
FatBoy ae6b584a5f DS immunity fixed 2024-09-03 18:56:57 -05:00
FatBoy 9e27c69906 trainer buildings get 3 slots at r1 2024-09-01 20:20:37 -05:00
FatBoy 00afe27900 stealing from mobs works again 2024-09-01 20:13:01 -05:00
FatBoy 4e5c1a32d3 stronghold mob equipsets 2024-09-01 18:52:32 -05:00
FatBoy d4f5043a25 toughness sync issue 2024-09-01 15:20:33 -05:00
FatBoy 03a5a55974 remove NPC slot error spam onboot 2024-09-01 09:57:51 -05:00
FatBoy dbab4c1212 baked in stats null check 2024-09-01 09:51:03 -05:00
FatBoy d186a96796 non vorg droppers cannot drop vorg items 2024-09-01 09:46:25 -05:00
FatBoy 6880d014c3 elan vendor price increased to 1,000,000 2024-09-01 09:42:54 -05:00
FatBoy 6542dec358 saetors can take disc runes 2024-08-31 20:39:58 -05:00
FatBoy 1a2738c3a9 saetors can take disc runes 2024-08-31 20:37:27 -05:00
FatBoy 12118ff125 fixed saetor promotions 2024-08-31 20:30:55 -05:00
FatBoy c3a00186ff saetors allowed to take creation runes 2024-08-31 20:21:35 -05:00
FatBoy fafa777e98 saetor creation fixed 2024-08-31 20:08:19 -05:00
FatBoy d4da99f61c NPC sell% in safezone = 0 2024-08-31 19:39:19 -05:00
FatBoy bb293c0c02 BH eyes get double value for points in skill (20 points = PR40) 2024-08-31 19:35:47 -05:00
FatBoy 1e29971b3c safe NPC profits 2024-08-31 19:29:03 -05:00
FatBoy 25d70cca4f error message for flying with movement buff 2024-08-31 19:17:52 -05:00
FatBoy 362832a196 NPC safezone sell% = 0 2024-08-31 19:12:22 -05:00
FatBoy ed150a5ccd gimme command bumps level to 75 2024-08-31 19:04:52 -05:00
FatBoy d2247b66f1 safezone NPCs have 0% profit 2024-08-31 19:03:30 -05:00
FatBoy 3b58ea716c custom range for booty sim command 2024-08-31 16:28:34 -05:00
FatBoy 368e548e46 special case rolls for contracts, glass, resources and runes 2024-08-31 16:26:08 -05:00
FatBoy 6f3612d196 Elf Blood Runes Free 2024-08-31 16:01:19 -05:00
FatBoy 0f38146fcc extra stats on printstats 2024-08-30 20:48:47 -05:00
FatBoy 1a13f3f096 hit roll formula fixed 2024-08-30 20:44:22 -05:00
FatBoy 9cc102ca2a scrolls removed from form breaking 2024-08-30 20:11:30 -05:00
FatBoy 50ff4b89bf granted concnc pot fixed 2024-08-30 20:07:34 -05:00
FatBoy 9b898825ab no move buff while flying 2024-08-30 19:34:10 -05:00
FatBoy 5be9033c40 no move buff while flying 2024-08-30 19:27:19 -05:00
FatBoy 67e55ab0a0 no move buff while flying 2024-08-30 19:00:50 -05:00
FatBoy 227549bf22 no move buff while flying 2024-08-30 18:51:56 -05:00
FatBoy 19707d10a3 no move buff while flying 2024-08-30 18:50:42 -05:00
FatBoy 91565ced89 no move buff while flying 2024-08-30 18:46:05 -05:00
FatBoy 2383b00c8c mobs recall when out of range of their bind loc 2024-08-30 18:38:44 -05:00
FatBoy 405063f036 guilds MOTD now persist 2024-08-30 18:34:07 -05:00
FatBoy d2f3c6a879 potions and scrolls no longer count as casting a spell 2024-08-29 20:49:42 -05:00
FatBoy 4f759c1bd2 shade sneak 2024-08-29 20:43:10 -05:00
FatBoy 9d7f9ce7b3 no movement buffs while flying, cannot fly if you have a movement buff applied 2024-08-29 20:36:41 -05:00
FatBoy 56f3dfce92 no movement buffs while flying, cannot fly if you have a movement buff applied 2024-08-29 20:36:22 -05:00
FatBoy 9a66f18edb extra 60 seconds added to summon if enemies near and not in safezone 2024-08-29 20:21:26 -05:00
FatBoy d7270ffb84 group teleport restricted to active banes and active mines 2024-08-29 20:12:48 -05:00
FatBoy dd834a3104 cant delete buildings when baned 2024-08-29 19:44:51 -05:00
FatBoy e28ed1b882 fortitude handled after resists 2024-08-29 19:38:06 -05:00
FatBoy 2370123c72 hit roll formula added 2024-08-29 19:36:33 -05:00
FatBoy 8a5133f04b character starts with 1000 gold and a conc pot 2024-08-29 19:27:24 -05:00
FatBoy a0f874b319 cannot tax cities in realm 2024-08-27 20:58:41 -05:00
FatBoy 415d11ae33 Vorg droppers increased level and resists 2024-08-27 20:40:00 -05:00
FatBoy f93b1ce30e teleport to runegate power action fix for closest gate 2024-08-27 19:43:31 -05:00
FatBoy 9fb2e4ff1b apply rune message work 2024-08-27 19:35:25 -05:00
FatBoy 601d0f4324 special case drop rate for contracts runes and resources completed 2024-08-27 19:30:02 -05:00
FatBoy cbf7db3347 mine production issue resolved 2024-08-27 19:13:31 -05:00
FatBoy 217be1d234 Special Case rune contract and resource drops 2024-08-26 21:29:41 -05:00
FatBoy 7fabd6554d glass chance is 10/100,000 2024-08-26 21:10:25 -05:00
FatBoy d673819796 gimme command 2024-08-26 20:14:23 -05:00
FatBoy a963a331a2 mobs that spawn with no loot respawn again 2024-08-26 20:10:16 -05:00
FatBoy eda5b8995f stronghold mobs power sets 2024-08-24 20:36:04 -05:00
FatBoy d5e95eedf3 stronghold loot adjustment 2024-08-24 20:13:11 -05:00
FatBoy 032e703704 gimme command for testing 2024-08-24 19:35:17 -05:00
FatBoy ad1444f5ba level 70+ is allowed to apply a fifth disc rune 2024-08-24 19:25:31 -05:00
FatBoy a4b30b8620 level cap increased to 80 2024-08-24 19:20:12 -05:00
FatBoy 9c002c7bff updated stronghold mobs 2024-07-18 20:20:15 -05:00
FatBoy 90495a27d9 blood rune dropper issue resolved 2024-07-18 19:42:23 -05:00
FatBoy 1246fa699a blood rune boot issue 2024-07-18 19:18:51 -05:00
FatBoy 511d37f5e0 blood rune droppers moved to DB with client patch 2024-07-18 19:11:27 -05:00
FatBoy 7a03a0eaa9 noob conc pots 2024-07-17 19:43:43 -05:00
FatBoy 2f57cb613e noob conc pots 2024-07-17 19:39:38 -05:00
FatBoy e386c3078a noob conc pots 2024-07-17 19:34:42 -05:00
FatBoy 3802889834 allow applying blood runes 2024-07-17 19:12:43 -05:00
FatBoy f825b2baba negate stronghold mobs from dropping equipment 2024-07-15 20:05:36 -05:00
FatBoy 6c92abd083 present drops restricted to strongholds 2024-07-15 19:13:40 -05:00
FatBoy c652379a5f mob region lookup 2024-07-15 19:08:40 -05:00
FatBoy 61d34ab4ad hotfixes 2024-07-15 18:45:32 -05:00
FatBoy d511641410 hotfixes 2024-07-15 18:42:41 -05:00
FatBoy c8430625bf mob resists fix 2024-07-11 19:53:22 -05:00
FatBoy a418224bbb start random roll at 0 to avoid illegal argument 2024-07-11 19:41:32 -05:00
FatBoy 9e3c13dea3 generic resists added for mobs to stop crashing AI 2024-07-11 19:34:50 -05:00
FatBoy 335850f7ff stronghold epics target playe rnot self 2024-07-10 21:21:08 -05:00
FatBoy f6baf8fe83 resistance modifiers for mobs 2024-07-10 20:48:55 -05:00
FatBoy 4c9b82b649 def and ATR cuts for stronghold mobs 2024-07-10 20:40:28 -05:00
FatBoy f2570992e5 completed custom strongholds 2024-07-09 21:19:08 -05:00
FatBoy 6911d6314d epic encounter naming convention 2024-07-09 20:48:12 -05:00
FatBoy eaeea9730c epic encounter naming convention 2024-07-09 20:39:59 -05:00
FatBoy fb0790a733 epic encounter after clearing a stronghold 2024-07-09 20:28:56 -05:00
FatBoy 3230cd53e1 epic encounter after clearing a stronghold 2024-07-09 20:10:58 -05:00
FatBoy edbce067b8 epic encounter after clearing a stronghold 2024-07-09 19:48:02 -05:00
FatBoy 83877e5107 epic encounter after clearing a stronghold 2024-07-09 19:47:14 -05:00
FatBoy 3a67540212 stronghold attack messages 2024-07-09 19:31:49 -05:00
FatBoy 1a5db96023 stronghold mobs spawn 2x mines cap size 2024-07-09 19:25:52 -05:00
FatBoy ef82f9ab5b stronghold mobs no longer lose bonuses from weapon powers 2024-07-09 19:25:02 -05:00
FatBoy bf7e5c6333 stronghold guardian fix 2024-07-08 22:08:50 -05:00
FatBoy 443f0f5450 stronghold guardian fix 2024-07-08 21:58:17 -05:00
FatBoy cb1dccd630 stronghold guardian fix 2024-07-08 21:53:03 -05:00
FatBoy 2e558acbee stronghold guardian fix 2024-07-08 21:52:19 -05:00
FatBoy 74162ea54c stronghold guardian fix 2024-07-08 21:49:29 -05:00
FatBoy ccbe4fba04 stronghold guardian fix 2024-07-08 21:42:39 -05:00
FatBoy 5aeddb6166 stronghold guardian fix 2024-07-08 21:41:05 -05:00
FatBoy 49df5203ae stronghold guardian fix 2024-07-08 21:38:43 -05:00
FatBoy 0cfe801d18 stronghold guardian fix 2024-07-08 21:26:13 -05:00
FatBoy 89c01e8244 random item generation fix 2024-07-08 21:20:31 -05:00
FatBoy 6605e4dd61 update regions when changing mesh 2024-07-08 21:17:38 -05:00
FatBoy d6239de6fd delete stronghold mobs form DB when finished 2024-07-08 21:09:21 -05:00
FatBoy 99ad6f3712 delete stronghold mobs form DB when finished 2024-07-08 21:03:08 -05:00
FatBoy f3041e7549 SetLoc for stronghold mobs 2024-07-08 20:53:23 -05:00
FatBoy 1269031be3 SetLoc for stronghold mobs 2024-07-08 20:52:23 -05:00
FatBoy ce96274f28 SetLoc for stronghold mobs 2024-07-08 20:51:06 -05:00
FatBoy a9a9bd0a3d Stronghold variations 2024-07-08 20:41:16 -05:00
FatBoy 33789adadc final strongholds update 2024-07-07 21:44:20 -05:00
FatBoy 15b50a75c4 commander stats update 2024-07-07 21:42:26 -05:00
FatBoy ead34dbb1f commander powers 2024-07-07 21:32:04 -05:00
FatBoy a9b1356efa new stronghold mesh 2024-07-07 21:29:14 -05:00
FatBoy 33e105bc7b naming convention 2024-07-07 21:27:42 -05:00
FatBoy e5041147f4 added disc and rune to commander drops 2024-07-07 21:26:37 -05:00
FatBoy 576e627ad1 fixed loot generation array size bug 2024-07-07 21:16:41 -05:00
FatBoy 4059664354 stronghold loot 2024-07-07 21:14:09 -05:00
FatBoy 974c0ca7e8 force load changes meshes 2024-07-07 21:05:34 -05:00
FatBoy 8e7a7b8b6d stronghold scale set 2024-07-07 21:04:40 -05:00
FatBoy 1e3b1db905 commander location set 2024-07-07 21:04:00 -05:00
FatBoy 51c98746c4 make stronghold mobs aggro 2024-07-07 21:00:32 -05:00
FatBoy 4c21439847 serialize the stronghold mine 2024-07-07 20:53:52 -05:00
FatBoy 31385ee533 SCALING DOWN THE STRONGHOLD BUILDING 2024-07-07 20:51:01 -05:00
FatBoy bd4e34e0e1 SCALING DOWN THE STRONGHOLD BUILDING 2024-07-07 20:50:01 -05:00
FatBoy 9f591b166b Initial Stronghold Push 2024-07-07 20:44:24 -05:00
59 changed files with 2230 additions and 645 deletions
+1 -1
View File
@@ -211,7 +211,7 @@ public class Enum {
STANDARD(6.1900001f, 13.97f, 4.2199998f, 13.97f, 6.3299999f, 18.379999f, 6.5f),
CENTAUR(6.1900001f, 16.940001f, 5.5500002f, 16.940001f, 6.3299999f, 18.379999f, 6.5f),
MINOTAUR(6.6300001f, 15.95f, 4.2199998f, 15.95f, 6.3299999f, 18.379999f, 6.5f),
IREKEI(6.35f, 15.25f, 4.2199998f, 14.5f, 6.3299999f, 18.379999f, 6.5f);
IREKEI(6.1900001f, 13.97f, 4.2199998f, 13.97f, 6.3299999f, 18.379999f, 6.5f);
private float walkStandard;
private float walkCombat;
@@ -525,9 +525,11 @@ public enum InterestManager implements Runnable {
player.setDirtyLoad(true);
updateStaticList(player, origin);
updateMobileList(player, origin);
if(player.level < 10)
if(player.level < 10) {
player.setLevel((short) 10);
player.getCharItemManager().addGoldToInventory(1000,false);
player.getCharItemManager().addItemToInventory(new MobLoot(player,ItemBase.getItemBase(980066),1,false).promoteToItem(player));
}
}
public synchronized void HandleLoadForTeleport(PlayerCharacter playerCharacter) {
+4 -17
View File
@@ -11,10 +11,7 @@ package engine.db.handlers;
import engine.Enum;
import engine.gameManager.DbManager;
import engine.objects.AbstractGameObject;
import engine.objects.Building;
import engine.objects.City;
import engine.objects.Zone;
import engine.objects.*;
import org.pmw.tinylog.Logger;
import java.sql.*;
@@ -98,19 +95,9 @@ public class dbCityHandler extends dbHandlerBase {
public Integer GET_CAPITAL_CITY_COUNT() {
int cityCount = 0;
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM obj_city;")) {
ResultSet rs = preparedStatement.executeQuery();
while(rs.next()){
if(rs.getInt("isNpc") == 0)
if(DbManager.BuildingQueries.GET_BUILDINGBYUUID(rs.getInt("treeOfLifeUUID")).getRank() == 8)
cityCount++;
}
} catch (SQLException e) {
Logger.error(e);
for(Realm realm : Realm._realms.values()){
if(realm.isRuled())
cityCount ++;
}
return cityCount;
+63
View File
@@ -0,0 +1,63 @@
// ·. · · · · .
// · ·
// · ·
//
// · · ·
// Magicbane Emulator Project © 2013 - 2022
// www.magicbane.com
package engine.devcmd.cmds;
import engine.Enum.ItemContainerType;
import engine.Enum.ItemType;
import engine.Enum.OwnerType;
import engine.devcmd.AbstractDevCmd;
import engine.gameManager.ChatManager;
import engine.gameManager.DbManager;
import engine.objects.*;
import engine.powers.EffectsBase;
import java.util.ArrayList;
/**
* @author Eighty
*/
public class GimmeCmd extends AbstractDevCmd {
public GimmeCmd() {
super("gimme");
}
@Override
protected void _doCmd(PlayerCharacter pc, String[] words,
AbstractGameObject target) {
int amt = 0;
int currentGold = pc.getCharItemManager().getGoldInventory().getNumOfItems();
amt = 10000000 - currentGold;
if (!pc.getCharItemManager().addGoldToInventory(amt, true)) {
throwbackError(pc, "Failed to add gold to inventory");
return;
}
ChatManager.chatSayInfo(pc, amt + " gold added to inventory");
if(pc.level < 75) {
pc.setLevel((short) 75);
ChatManager.chatSayInfo(pc, "Level set to 75");
}
pc.getCharItemManager().updateInventory();
}
@Override
protected String _getHelpString() {
return "Round up current gold in inventory to 10,000,000";
}
@Override
protected String _getUsageString() {
return "'./gimme";
}
}
@@ -9,6 +9,7 @@
package engine.devcmd.cmds;
import engine.Enum;
import engine.devcmd.AbstractDevCmd;
import engine.objects.*;
@@ -72,6 +73,10 @@ 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 += "Move Speed: " + tar.getSpeed() + newline;
out += "Health Regen: " + tar.getRegenModifier(Enum.ModType.HealthRecoverRate) + newline;
out += "Mana Regen: " + tar.getRegenModifier(Enum.ModType.ManaRecoverRate) + newline;
out += "Stamina Regen: " + tar.getRegenModifier(Enum.ModType.StaminaRecoverRate) + newline;
throwbackInfo(pc, out);
}
+2 -2
View File
@@ -46,7 +46,7 @@ public class SetLevelCmd extends AbstractDevCmd {
this.sendUsage(pc);
return;
}
if (level < 1 || level > 75) {
if (level < 1 || level > 80) {
this.sendHelp(pc);
return;
}
@@ -62,7 +62,7 @@ public class SetLevelCmd extends AbstractDevCmd {
@Override
protected String _getHelpString() {
return "Sets your character's level to 'amount'. 'amount' must be between 1-75";
return "Sets your character's level to 'amount'. 'amount' must be between 1-80";
}
@Override
@@ -27,6 +27,14 @@ public class SimulateBootyCmd extends AbstractDevCmd {
String output;
try
{
simCount = Integer.parseInt(words[0]);
}catch(Exception e)
{
}
output = "Booty Simulation: Rolls:" + simCount + newline;
Mob mob = (Mob) target;
+25 -9
View File
@@ -646,24 +646,25 @@ public enum CombatManager {
//Get hit chance
int 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);
//if (dif > 100)
// chance = 94;
//else if (dif < -100)
// chance = 4;
//else
// chance = (int) ((0.45 * dif) + 49);
errorTrack = 5;
//calculate hit/miss
int roll = ThreadLocalRandom.current().nextInt(100);
DeferredPowerJob dpj = null;
if (roll < chance) {
if (LandHit((int)atr,(int)defense)) {
if (ac.getObjectType().equals(GameObjectType.PlayerCharacter))
updateAttackTimers((PlayerCharacter) ac, target, true);
@@ -1442,4 +1443,19 @@ public enum CombatManager {
((AbstractCharacter) awo).getCharItemManager().damageRandomArmor(1);
}
public static boolean LandHit(int atr, int defense){
int roll = ThreadLocalRandom.current().nextInt(101);
float chance = (float)((atr-((atr+defense)*0.315))/((defense-((atr+defense)*0.315))+(atr-((atr+defense)*0.315))));
int connvertedChance = (int)(chance * 100);
if(connvertedChance < 5)
connvertedChance = 5;
if(connvertedChance > 95)
connvertedChance = 95;
return connvertedChance > roll;
}
}
@@ -102,6 +102,7 @@ public enum DevCmdManager {
DevCmdManager.registerDevCmd(new SetAdminRuneCmd());
DevCmdManager.registerDevCmd(new SetInvulCmd());
DevCmdManager.registerDevCmd(new MakeItemCmd());
DevCmdManager.registerDevCmd(new GimmeCmd());
DevCmdManager.registerDevCmd(new EnchantCmd());
DevCmdManager.registerDevCmd(new SetSubRaceCmd());
// Admin
@@ -184,6 +185,8 @@ public enum DevCmdManager {
case "printstats":
case "printskills":
case "printpowers":
case "gimme":
playerAllowed = true;
if(!a.status.equals(Enum.AccountStatus.ADMIN))
target = pcSender;
break;
+309 -93
View File
@@ -77,64 +77,32 @@ public enum LootManager {
//determine if mob is in hotzone
boolean inHotzone = false;
//special blood rune droppers
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"));
if(!Mob.discDroppers.contains(mob))
Mob.AddDiscDropper(mob);
}
//iterate the booty sets
if(mob.mobBase == null || mob.getMobBaseID() == 253003){
int i = 0;
}
if (mob.getMobBase().bootySet != 0 && _bootySetMap.containsKey(mob.getMobBase().bootySet))
RunBootySet(_bootySetMap.get(mob.getMobBase().bootySet), mob, inHotzone);
if (mob.bootySet != 0 && _bootySetMap.containsKey(mob.bootySet))
if (mob.bootySet != 0 && _bootySetMap.containsKey(mob.bootySet)) {
RunBootySet(_bootySetMap.get(mob.bootySet), mob, inHotzone);
}else if(mob.bootySet != 0 && ItemBase.getItemBase(mob.bootySet) != null){
MobLoot specialDrop = null;
specialDrop = new MobLoot(mob,ItemBase.getItemBase(mob.bootySet),true);
if(specialDrop != null) {
ChatSystemMsg chatMsg = new ChatSystemMsg(null, mob.getName() + " in " + mob.getParentZone().getName() + " has found the " + specialDrop.getName() + ". Are you tough enough to take it?");
chatMsg.setMessageType(10);
chatMsg.setChannel(Enum.ChatChannelType.SYSTEM.getChannelID());
DispatchMessage.dispatchMsgToAll(chatMsg);
mob.getCharItemManager().addItemToInventory(specialDrop);
mob.setResists(new Resists("Dropper"));
if(!Mob.discDroppers.contains(mob))
Mob.AddDiscDropper(mob);
}
}
//lastly, check mobs inventory for godly or disc runes to send a server announcement
for (Item it : mob.getInventory()) {
@@ -157,22 +125,27 @@ public enum LootManager {
boolean hotzoneWasRan = false;
float dropRate;
//1 in 1,000 chance to drop glass
if(ThreadLocalRandom.current().nextInt(1,1000) == 500){
int glassID = rollRandomItem(126);
ItemBase glassItem = ItemBase.getItemBase(glassID);
if(glassItem != null) {
MobLoot toAdd = new MobLoot(mob, glassItem, false);
if(!mob.getSafeZone()) {
int specialCaseRoll = ThreadLocalRandom.current().nextInt(1, 100000);
//Special Case Contract Drop
if(specialCaseRoll < 100){
SpecialCaseResourceDrop(mob,entries);
} else if(specialCaseRoll > 100 && specialCaseRoll < 500){
SpecialCaseContractDrop(mob,entries);
}else if(specialCaseRoll > 500 && specialCaseRoll < 900){
SpecialCaseRuneDrop(mob,entries);
} else if(specialCaseRoll > 900 && specialCaseRoll < 910){
int glassID = rollRandomItem(126);
ItemBase glassItem = ItemBase.getItemBase(glassID);
if (glassItem != null) {
MobLoot toAddGlass = new MobLoot(mob, glassItem, false);
if (toAdd != null)
mob.getCharItemManager().addItemToInventory(toAdd);
if (toAddGlass != null)
mob.getCharItemManager().addItemToInventory(toAddGlass);
}
}
}
//check for special gifts 1/100 to drop present
if(ThreadLocalRandom.current().nextInt(1,25) == 15)
DropPresent(mob);
// Iterate all entries in this bootySet and process accordingly
for (BootySetEntry bse : entries) {
switch (bse.bootyType) {
@@ -209,6 +182,109 @@ public enum LootManager {
}
}
public static void SpecialCaseContractDrop(Mob mob,ArrayList<BootySetEntry> entries){
int lootTableID = 0;
for(BootySetEntry entry : entries){
if(entry.bootyType.equals("LOOT")){
lootTableID = entry.genTable;
break;
}
}
if(lootTableID == 0)
return;
int ContractTableID = 0;
for(GenTableEntry entry : _genTables.get(lootTableID)){
try {
if (ItemBase.getItemBase(_itemTables.get(entry.itemTableID).get(0).cacheID).getType().equals(Enum.ItemType.CONTRACT)) {
ContractTableID = entry.itemTableID;
break;
}
}catch(Exception e){
}
}
if(ContractTableID == 0)
return;
ItemBase ib = ItemBase.getItemBase(rollRandomItem(ContractTableID));
if(ib != null){
MobLoot toAdd = new MobLoot(mob,ib,false);
mob.getCharItemManager().addItemToInventory(toAdd);
}
}
public static void SpecialCaseRuneDrop(Mob mob,ArrayList<BootySetEntry> entries){
int lootTableID = 0;
for(BootySetEntry entry : entries){
if(entry.bootyType.equals("LOOT")){
lootTableID = entry.genTable;
break;
}
}
if(lootTableID == 0)
return;
int RuneTableID = 0;
for(GenTableEntry entry : _genTables.get(lootTableID)){
try {
if (ItemBase.getItemBase(_itemTables.get(entry.itemTableID).get(0).cacheID).getType().equals(Enum.ItemType.RUNE)) {
RuneTableID = entry.itemTableID;
break;
}
}catch(Exception e){
}
}
if(RuneTableID == 0)
return;
ItemBase ib = ItemBase.getItemBase(rollRandomItem(RuneTableID));
if(ib != null){
MobLoot toAdd = new MobLoot(mob,ib,false);
mob.getCharItemManager().addItemToInventory(toAdd);
}
}
public static void SpecialCaseResourceDrop(Mob mob,ArrayList<BootySetEntry> entries){
int lootTableID = 0;
for(BootySetEntry entry : entries){
if(entry.bootyType.equals("LOOT")){
lootTableID = entry.genTable;
break;
}
}
if(lootTableID == 0)
return;
int ResourceTableID = 0;
for(GenTableEntry entry : _genTables.get(lootTableID)){
try {
if (ItemBase.getItemBase(_itemTables.get(entry.itemTableID).get(0).cacheID).getType().equals(Enum.ItemType.RESOURCE)) {
ResourceTableID = entry.itemTableID;
break;
}
}catch(Exception e){
}
}
if(ResourceTableID == 0)
return;
ItemBase ib = ItemBase.getItemBase(rollRandomItem(ResourceTableID));
if(ib != null){
MobLoot toAdd = new MobLoot(mob,ib,false);
mob.getCharItemManager().addItemToInventory(toAdd);
}
}
public static MobLoot getGenTableItem(int genTableID, AbstractCharacter mob, Boolean inHotzone) {
if (mob == null || _genTables.containsKey(genTableID) == false)
@@ -230,11 +306,10 @@ public enum LootManager {
//gets the 1-320 roll for this mob
int itemTableRoll = 0;
int objectType = mob.getObjectType().ordinal();
if(mob.getObjectType().ordinal() == 52) { //52 = player character
itemTableRoll = ThreadLocalRandom.current().nextInt(1,320 + 1);
} else{
itemTableRoll = TableRoll(mob.level, inHotzone);
itemTableRoll = TableRoll(mob.level);
}
ItemTableEntry tableRow = ItemTableEntry.rollTable(itemTableId, itemTableRoll);
if (tableRow == null)
@@ -306,7 +381,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);
@@ -338,7 +413,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);
@@ -353,23 +428,36 @@ public enum LootManager {
return inItem;
}
public static int TableRoll(int mobLevel, Boolean inHotzone) {
public static int TableRoll(int mobLevel) {
if (mobLevel > 65)
mobLevel = 65;
int max = (int) (4.882 * mobLevel + 127.0);
if (max > 319)
max = 319;
int min = (int) (4.469 * mobLevel - 3.469);
if (min < 70)
min = 70;
if (inHotzone)
min += mobLevel;
int rank = (int)(mobLevel * 0.1f);
int min = 50;
int max = 100;
switch(rank){
case 1:
min = 200;
max = 250;
break;
case 2:
min = 210;
max = 275;
break;
case 3:
min = 220;
max = 300;
break;
case 4:
min = 230;
max = 320;
break;
case 5:
case 6:
case 7:
case 8:
min = 240;
max = 320;
break;
}
int roll = ThreadLocalRandom.current().nextInt(min, max + 1);
@@ -401,8 +489,14 @@ public enum LootManager {
public static void GenerateLootDrop(Mob mob, int tableID, Boolean inHotzone) {
MobLoot toAdd = getGenTableItem(tableID, mob, inHotzone);
if (toAdd != null) {
if(toAdd != null){
ItemBase ib = toAdd.getItemBase();
switch(ib.getType()){
case CONTRACT:
case RUNE:
case RESOURCE:
return;
}
toAdd.setIsID(true);
mob.getCharItemManager().addItemToInventory(toAdd);
}
@@ -414,6 +508,9 @@ public enum LootManager {
if (mob == null || mob.getSafeZone())
return; // no equipment to drop in safezones
if(mob.StrongholdGuardian || mob.StrongholdCommander || mob.StrongholdEpic)
return; // stronghold mobs don't drop equipment
//do equipment here
if (mob.getEquip() != null) {
boolean isVorg = false;
@@ -426,6 +523,10 @@ public enum LootManager {
if (name.contains("vorgrim legionnaire's") || name.contains("vorgrim auxiliary's") ||name.contains("bellugh nuathal") || name.contains("crimson circle"))
isVorg = true;
if(isVorg && !mob.isDropper){
continue;
}
float equipmentRoll = ThreadLocalRandom.current().nextInt(1, 100 + 1);
float dropChance = me.getDropChance() * 100;
ItemBase itemBase = me.getItemBase();
@@ -490,7 +591,7 @@ public enum LootManager {
//roll 1-100 for the gen table selection
int genRoll = ThreadLocalRandom.current().nextInt(1, 100 + 1);
int genRoll = ThreadLocalRandom.current().nextInt(94, 100) + 1;
GenTableEntry selectedRow = GenTableEntry.rollTable(tableID, genRoll, LootManager.NORMAL_DROP_RATE);
if(selectedRow == null)
@@ -654,13 +755,128 @@ public enum LootManager {
}
public static void DropPresent(Mob mob){
int random = ThreadLocalRandom.current().nextInt(ItemBase.AnniverseryGifts.size());
int presentID = ItemBase.AnniverseryGifts.get(random);
ItemBase presentBase = ItemBase.getItemBase(presentID);
if(presentBase != null){
MobLoot lootItem = new MobLoot(mob, presentBase, true);
mob.getCharItemManager().addItemToInventory(lootItem);
int random = 971049 + ThreadLocalRandom.current().nextInt(24);
if (random > 971071)
random = 971071;
ItemBase present = ItemBase.getItemBase(random);
if (present != null) {
MobLoot toAdd = new MobLoot(mob, present, true);
if (toAdd != null)
mob.getCharItemManager().addItemToInventory(toAdd);
}
}
public static void GenerateStrongholdLoot(Mob mob, boolean commander, boolean epic) {
mob.getCharItemManager().clearInventory();
int multiplier = 1;
if (commander)
multiplier = 2;
if(epic)
multiplier = 10;
int high = 125000;
int low = 50000;
int gold = ThreadLocalRandom.current().nextInt(low, high + 1) * multiplier;
if (gold > 0) {
MobLoot goldAmount = new MobLoot(mob, gold);
mob.getCharItemManager().addItemToInventory(goldAmount);
}
//present drop chance for all
if (ThreadLocalRandom.current().nextInt(100) < 35)
DropPresent(mob);
//random contract drop chance for all
if (ThreadLocalRandom.current().nextInt(100) < 40) {
int contractTableID = 250;
contractTableID += ThreadLocalRandom.current().nextInt(0, 11);
if (contractTableID > 259)
contractTableID = 659;
int id = rollRandomItem(contractTableID);
ItemBase ib = ItemBase.getItemBase(id);
if (ib != null) {
MobLoot contract = new MobLoot(mob, ib, true);
if (contract != null)
mob.getCharItemManager().addItemToInventory(contract);
}
}
//special commander drop chances
if (commander)
GenerateCommanderLoot(mob,false);
//special epic drop chances
if (epic) {
GenerateCommanderLoot(mob, true);
GenerateCommanderLoot(mob,false);
}
}
public static void GenerateCommanderLoot(Mob mob, boolean epic){
//present chance
if (ThreadLocalRandom.current().nextInt(100) < 25)
DropPresent(mob);
//present chance
if (ThreadLocalRandom.current().nextInt(100) < 25)
DropPresent(mob);
//chance for glass
if (ThreadLocalRandom.current().nextInt(100) < 75) {
int glassID = rollRandomItem(126);
ItemBase glassItem = ItemBase.getItemBase(glassID);
if (glassItem != null) {
MobLoot toAdd2 = new MobLoot(mob, glassItem, true);
if (toAdd2 != null)
mob.getCharItemManager().addItemToInventory(toAdd2);
}
}
//chance for disc
if (ThreadLocalRandom.current().nextInt(100) < 75) {
int discID = rollRandomItem(3202);
ItemBase discItem = ItemBase.getItemBase(discID);
if (discItem != null) {
MobLoot toAdd3 = new MobLoot(mob, discItem, true);
if (toAdd3 != null)
mob.getCharItemManager().addItemToInventory(toAdd3);
}
}
//chance for stat rune
if (ThreadLocalRandom.current().nextInt(100) < 75) {
int runeID = rollRandomItem(3201);
ItemBase runeItem = ItemBase.getItemBase(runeID);
if (runeItem != null) {
MobLoot toAdd4 = new MobLoot(mob, runeItem, true);
if (toAdd4 != null)
mob.getCharItemManager().addItemToInventory(toAdd4);
}
}
if(epic){
int contractTableID = 250;
contractTableID += ThreadLocalRandom.current().nextInt(0, 11);
if (contractTableID > 259)
contractTableID = 659;
int id = rollRandomItem(contractTableID);
ItemBase ib = ItemBase.getItemBase(id);
if (ib != null) {
MobLoot contract = new MobLoot(mob, ib, true);
if (contract != null)
mob.getCharItemManager().addItemToInventory(contract);
}
}
}
}
+1 -88
View File
@@ -186,43 +186,8 @@ public enum MaintenanceManager {
// If this is an R8 tree, validate that we can
// cover the resources required
if (building.getRank() == 8) {
hasResources = true;
if (warehouse == null)
hasResources = false;
else {
resourceValue = warehouse.getResources().get(Warehouse.stoneIB);
if (resourceValue < 1500)
hasResources = false;
resourceValue = warehouse.getResources().get(Warehouse.lumberIB);
if (resourceValue < 1500)
hasResources = false;
resourceValue = warehouse.getResources().get(Warehouse.galvorIB);
if (resourceValue < 5)
hasResources = false;
resourceValue = warehouse.getResources().get(Warehouse.wormwoodIB);
if (resourceValue < 5)
hasResources = false;
}
}
// Validation completed but has failed. We can derank
// the target building and early exit
if ((hasFunds == false) ||
((building.getRank() == 8) && !hasResources)) {
if (hasFunds == false) {
return false; // Early exit for having failed to meet maintenance
}
@@ -247,58 +212,6 @@ public enum MaintenanceManager {
}
}
// Early exit as we're done if we're not an R8 tree
if (building.getRank() < 8)
return true;
// Now for the resources if it's an R8 tree
// Withdraw Stone
resourceValue = warehouse.getResources().get(Warehouse.stoneIB);
if (DbManager.WarehouseQueries.updateStone(warehouse, resourceValue - 1500) == true) {
warehouse.getResources().put(Warehouse.stoneIB, resourceValue - 1500);
warehouse.AddTransactionToWarehouse(Enum.GameObjectType.Building, building.getObjectUUID(), Enum.TransactionType.WITHDRAWL, Resource.STONE, 1500);
} else {
Logger.error("stone update failed for warehouse of UUID:" + warehouse.getObjectUUID());
return true;
}
// Withdraw Lumber
resourceValue = warehouse.getResources().get(Warehouse.lumberIB);
if (DbManager.WarehouseQueries.updateLumber(warehouse, resourceValue - 1500) == true) {
warehouse.getResources().put(Warehouse.lumberIB, resourceValue - 1500);
warehouse.AddTransactionToWarehouse(Enum.GameObjectType.Building, building.getObjectUUID(), Enum.TransactionType.WITHDRAWL, Resource.LUMBER, 1500);
} else {
Logger.error("lumber update failed for warehouse of UUID:" + warehouse.getObjectUUID());
return true;
}
// Withdraw Galvor
resourceValue = warehouse.getResources().get(Warehouse.galvorIB);
if (DbManager.WarehouseQueries.updateGalvor(warehouse, resourceValue - 5) == true) {
warehouse.getResources().put(Warehouse.galvorIB, resourceValue - 5);
warehouse.AddTransactionToWarehouse(Enum.GameObjectType.Building, building.getObjectUUID(), Enum.TransactionType.WITHDRAWL, Resource.GALVOR, 5);
} else {
Logger.error("galvor update failed for warehouse of UUID:" + warehouse.getObjectUUID());
return true;
}
resourceValue = warehouse.getResources().get(Warehouse.wormwoodIB);
if (DbManager.WarehouseQueries.updateWormwood(warehouse, resourceValue - 5) == true) {
warehouse.getResources().put(Warehouse.wormwoodIB, resourceValue - 5);
warehouse.AddTransactionToWarehouse(Enum.GameObjectType.Building, building.getObjectUUID(), Enum.TransactionType.WITHDRAWL, Resource.WORMWOOD, 5);
} else {
Logger.error("wyrmwood update failed for warehouse of UUID:" + warehouse.getObjectUUID());
}
return true;
}
+2 -2
View File
@@ -340,8 +340,8 @@ public enum NPCManager {
else
buildingSlot = BuildingManager.getAvailableSlot(abstractCharacter.building);
if (buildingSlot == -1)
Logger.error("No available slot for NPC: " + abstractCharacter.getObjectUUID());
//if (buildingSlot == -1)
//Logger.error("No available slot for NPC: " + abstractCharacter.getObjectUUID());
abstractCharacter.building.getHirelings().put(abstractCharacter, buildingSlot);
+166 -37
View File
@@ -8,6 +8,7 @@
package engine.gameManager;
import com.sun.corba.se.spi.orbutil.fsm.ActionBase;
import engine.Enum.*;
import engine.InterestManagement.HeightMap;
import engine.InterestManagement.WorldGrid;
@@ -27,6 +28,7 @@ import engine.net.client.ClientConnection;
import engine.net.client.msg.*;
import engine.objects.*;
import engine.powers.*;
import engine.powers.effectmodifiers.AbstractEffectModifier;
import engine.powers.poweractions.AbstractPowerAction;
import engine.powers.poweractions.TrackPowerAction;
import engine.server.MBServerStatics;
@@ -205,6 +207,41 @@ public enum PowersManager {
boolean CSRCast = false;
if(msg.getPowerUsedID() == 430628895) {
boolean failed = false;// group teleport
City city = ZoneManager.getCityAtLocation(playerCharacter.loc);
if (city == null) {
failed = true;
}else{
Bane bane = city.getBane();
if (bane == null) {
failed = true;
}else{
if(!bane.getSiegePhase().equals(SiegePhase.WAR)){
failed = true;
}
}
}
if(failed){
//check to see if we are at an active mine
Zone zone = ZoneManager.findSmallestZone(playerCharacter.loc);
if(zone != null){
Mine mine = null;
for(Building building : zone.zoneBuildingSet){
if(building.getBlueprint().getBuildingGroup().equals(BuildingGroup.MINE)){
mine = Mine.getMineFromTower(building.getObjectUUID());
}
}
if(mine != null){
failed = !mine.isActive;
}
}
}
if(failed)
return false;
}
if (MBServerStatics.POWERS_DEBUG) {
ChatManager.chatSayInfo(
@@ -241,6 +278,7 @@ public enum PowersManager {
// get power
PowersBase pb = PowersManager.powersBaseByToken.get(msg.getPowerUsedID());
if (pb == null) {
ChatManager.chatSayInfo(playerCharacter,
"This power is not implemented yet.");
@@ -252,6 +290,35 @@ public enum PowersManager {
// return false;
}
//check for movement buffs while flying
if(playerCharacter.isFlying()) {
switch(pb.token){
case 429005674:
case 429505739:
case 431054700:
case 428005600:
case 431610080:
case 427935608:
case 427857146:
case 427988218:
case 431854842:
case 421074170:
case 429611355:
case 428955899:
case 1794395699:
case 429428796:
case 1514898036:
ChatManager.chatSystemInfo(playerCharacter, "You Cannot Fly While Having A MovementBuff");
//resync stamina
playerCharacter.setStamina(playerCharacter.getStamina(), playerCharacter);
// Update all surrounding clients.
TargetedActionMsg cmm = new TargetedActionMsg(playerCharacter);
DispatchMessage.dispatchMsgToInterestArea(playerCharacter, cmm, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false);
return true;
}
}
if (playerCharacter.getLastPower() != null)
return true;
@@ -279,6 +346,12 @@ public enum PowersManager {
msg.setNumTrains(trains);
}
switch(pb.token){
case 429420458: // BH eyes
msg.setNumTrains(msg.getNumTrains() * 2);
break;
}
// can't go over total trains by player
if (playerCharacter.getPowers() != null && playerCharacter.getPowers().containsKey(msg.getPowerUsedID())) {
CharacterPower cp = playerCharacter.getPowers().get(msg.getPowerUsedID());
@@ -370,15 +443,20 @@ public enum PowersManager {
float range = pb.getRange();
// verify target is in range
if(pb.token != 429396028) {
if (verifyInvalidRange(playerCharacter, target, range))
// (pc.getLoc().distance(target.getLoc()) > pb.getRange()) {
// TODO send message that target is out of range
return true;
// verify target is valid type
if (!validateTarget(target, playerCharacter, pb))
return true;
}else{
pb.isSpell = false;
}
if (verifyInvalidRange(playerCharacter, target, range))
// (pc.getLoc().distance(target.getLoc()) > pb.getRange()) {
// TODO send message that target is out of range
return true;
// verify target is valid type
if (!validateTarget(target, playerCharacter, pb))
return true;
if (AbstractWorldObject.IsAbstractCharacter(target))
@@ -487,7 +565,6 @@ public enum PowersManager {
// Validity checks passed, move on to casting spell
//get caster's live counter
int casterLiveCounter = playerCharacter.getLiveCounter();
// run recycle job for when cast is available again, don't bother adding the timer for CSRs
if (time > 0) {
FinishRecycleTimeJob frtj = new FinishRecycleTimeJob(playerCharacter, msg);
@@ -522,7 +599,9 @@ public enum PowersManager {
}
// update cast (use skill) fail condition
playerCharacter.cancelOnCast();
if(pb.token != 429396028) {
playerCharacter.cancelOnCast();
}
// update castSpell (use spell) fail condition if spell
if (pb.isSpell())
@@ -541,7 +620,6 @@ public enum PowersManager {
playerCharacter.setLastMovementState(playerCharacter.getMovementState());
// run timer job to end cast
if (time < 1) // run immediately
finishUsePower(copyMsg, playerCharacter, casterLiveCounter, targetLiveCounter);
@@ -706,6 +784,13 @@ public enum PowersManager {
if (playerCharacter == null || msg == null)
return;
if((msg.getPowerUsedID() == 429495514 || msg.getPowerUsedID() == 429407306) && playerCharacter.getRace().getName().toLowerCase().contains("shade")){
//msg.setPowerUsedID(407015607);
applyPower(playerCharacter,playerCharacter,playerCharacter.loc,429397210,msg.getNumTrains(),false);
}
if(msg.getPowerUsedID() == 429494441) {//wildkins chase
playerCharacter.removeEffectBySource(EffectSourceType.Root,40,true);
}
if (playerCharacter.isCasting()) {
playerCharacter.update();
playerCharacter.updateStamRegen(-100);
@@ -809,15 +894,16 @@ public enum PowersManager {
}
float range = pb.getRange() + speedRange;
if(pb.token != 429396028) {
if (verifyInvalidRange(playerCharacter, mainTarget, range)) {
if (verifyInvalidRange(playerCharacter, mainTarget, range)) {
sendPowerMsg(playerCharacter, 8, msg);
return;
sendPowerMsg(playerCharacter, 8, msg);
return;
}
// (pc.getLoc().distance(target.getLoc()) > pb.getRange()) {
// TODO send message that target is out of range
}
// (pc.getLoc().distance(target.getLoc()) > pb.getRange()) {
// TODO send message that target is out of range
}
@@ -1233,7 +1319,7 @@ public enum PowersManager {
PlayerCharacter target = SessionManager
.getPlayerCharacterByLowerCaseName(msg.getTargetName());
if (target == null || target.equals(pc) || target.isCombat()) {
if (target == null || target.equals(pc)) {
if (target == null) // Player not found. Send not found message
ChatManager.chatInfoError(pc,
@@ -1337,6 +1423,16 @@ public enum PowersManager {
else
duration = 45000; // Belgosh Summons, 45 seconds
boolean enemiesNear = false;
for(AbstractWorldObject awo : WorldGrid.getObjectsInRangePartial(pc.loc,MBServerStatics.CHARACTER_LOAD_RANGE, MBServerStatics.MASK_PLAYER)){
PlayerCharacter playerCharacter = (PlayerCharacter)awo;
if(!playerCharacter.guild.getNation().equals(pc.guild.getNation())){
enemiesNear = true;
}
}
if(enemiesNear && !pc.isInSafeZone())
duration += 60000;
// Teleport to summoners location
FinishSummonsJob fsj = new FinishSummonsJob(source, pc);
@@ -1462,8 +1558,17 @@ public enum PowersManager {
}
// create list of characters
HashSet<AbstractCharacter> trackChars = RangeBasedAwo.getTrackList(
allTargets, playerCharacter, maxTargets);
HashSet<AbstractCharacter> trackChars;
switch(msg.getPowerToken()){
case 431511776:
case 429578587:
case 429503360:
trackChars = getTrackList(playerCharacter);
break;
default:
trackChars = RangeBasedAwo.getTrackList(allTargets, playerCharacter, maxTargets);
break;
}
TrackWindowMsg trackWindowMsg = new TrackWindowMsg(msg);
@@ -1476,6 +1581,30 @@ public enum PowersManager {
}
public static HashSet<AbstractCharacter> getTrackList(PlayerCharacter tracker){
HashSet<AbstractCharacter> list = new HashSet<AbstractCharacter>();
HashSet<AbstractWorldObject> shortList = WorldGrid.getObjectsInRangePartial(tracker.loc,MBServerStatics.CHARACTER_LOAD_RANGE, MBServerStatics.MASK_PLAYER);
HashSet<AbstractWorldObject> fullList = WorldGrid.getObjectsInRangePartial(tracker.loc,1408, MBServerStatics.MASK_PLAYER);
ArrayList<Guild> guildsPresent = new ArrayList<>();
for(AbstractWorldObject awo : shortList){
PlayerCharacter pc = (PlayerCharacter)awo;
if(!guildsPresent.contains(pc.guild.getNation())){
guildsPresent.add(pc.guild.getNation());
}
}
for(AbstractWorldObject awo : fullList){
if(awo.equals(tracker))
continue;
PlayerCharacter pc = (PlayerCharacter)awo;
if(!pc.isAlive())
continue;
if(guildsPresent.contains(pc.guild.getNation()))
list.add(pc);
}
return list;
}
private static void sendRecyclePower(int token, ClientConnection origin) {
RecyclePowerMsg recyclePowerMsg = new RecyclePowerMsg(token);
@@ -2241,28 +2370,26 @@ public enum PowersManager {
defense = 0f;
// Get hit chance
if (pc.getDebug(16)) {
String smsg = "ATR: " + atr + ", Defense: " + defense;
ChatManager.chatSystemInfo(pc, smsg);
}
//if (pc.getDebug(16)) {
// String smsg = "ATR: " + atr + ", Defense: " + defense;
// ChatManager.chatSystemInfo(pc, smsg);
//}
int chance;
//int chance;
if (atr > defense || defense == 0)
chance = 94;
else {
float dif = atr / defense;
if (dif <= 0.8f)
chance = 4;
else
chance = ((int) (450 * (dif - 0.8f)) + 4);
}
//if (atr > defense || defense == 0)
// chance = 94;
//else {
// float dif = atr / defense;
// if (dif <= 0.8f)
// chance = 4;
// else
// chance = ((int) (450 * (dif - 0.8f)) + 4);
//}
// calculate hit/miss
int roll = ThreadLocalRandom.current().nextInt(100);
boolean disable = true;
if (roll < chance) {
if (CombatManager.LandHit((int)atr,(int)defense)) {
// Hit, check if dodge kicked in
if (awo instanceof AbstractCharacter) {
AbstractCharacter tarAc = (AbstractCharacter) awo;
@@ -2562,7 +2689,9 @@ public enum PowersManager {
}
public static void cancelOnStun(AbstractCharacter ac) {
if(ac.getObjectType().equals(GameObjectType.PlayerCharacter)){
PlayerCharacter.GroundPlayer((PlayerCharacter)ac);
}
}
private static PowersBase getLastPower(AbstractCharacter ac) {
@@ -0,0 +1,347 @@
package engine.gameManager;
import engine.Enum;
import engine.InterestManagement.InterestManager;
import engine.InterestManagement.WorldGrid;
import engine.math.Vector3f;
import engine.math.Vector3fImmutable;
import engine.objects.*;
import org.pmw.tinylog.Logger;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.concurrent.ThreadLocalRandom;
public class StrongholdManager {
public static void processStrongholds() {
ArrayList<Mine> mines = Mine.getMines();
//process strongholds selecting 3 randomly to become active
int count = 0;
while (count < 3) {
int random = ThreadLocalRandom.current().nextInt(1, mines.size()) - 1;
Mine mine = mines.get(random);
if (mine != null) {
if (!mine.isActive && !mine.isStronghold) {
StartStronghold(mine);
count++;
}
}
}
}
public static void StartStronghold(Mine mine){
//remove buildings
Building tower = BuildingManager.getBuilding(mine.getBuildingID());
if(tower == null)
return;
mine.isStronghold = true;
mine.strongholdMobs = new ArrayList<>();
mine.oldBuildings = new HashMap<>();
Zone mineZone = ZoneManager.findSmallestZone(tower.loc);
for(Building building : mineZone.zoneBuildingSet){
mine.oldBuildings.put(building.getObjectUUID(),building.meshUUID);
building.setMeshUUID(407650);
building.setMeshScale(new Vector3f(0,0,0));
InterestManager.setObjectDirty(building);
WorldGrid.updateObject(building);
}
//update tower to become stronghold mesh
tower.setMeshUUID(getStrongholdMeshID(mine.getParentZone()));
tower.setMeshScale(new Vector3f(1,1,1));
InterestManager.setObjectDirty(tower);
WorldGrid.updateObject(tower);
//create elite mobs
for(int i = 0; i < mine.capSize * 2; i++){
Vector3fImmutable loc = Vector3fImmutable.getRandomPointOnCircle(tower.loc,30);
MobBase guardBase = MobBase.getMobBase(getStrongholdGuardianID(tower.meshUUID));
Mob guard = Mob.createStrongholdMob(guardBase.getLoadID(), loc, Guild.getErrantGuild(),true,mineZone,null,0, guardBase.getFirstName(),65);
if(guard != null){
guard.parentZone = mine.getParentZone();
guard.bindLoc = loc;
guard.setLoc(loc);
guard.StrongholdGuardian = true;
guard.equipmentSetID = getStrongholdMobEquipSetID(guard);
guard.runAfterLoad();
guard.setLevel((short)65);
guard.setResists(new Resists("Elite"));
guard.spawnTime = 1000000000;
guard.BehaviourType = Enum.MobBehaviourType.Aggro;
mine.strongholdMobs.add(guard);
LootManager.GenerateStrongholdLoot(guard,false,false);
guard.healthMax = 12500;
guard.setHealth(guard.healthMax);
guard.maxDamageHandOne = 1550;
guard.minDamageHandOne = 750;
guard.atrHandOne = 1800;
guard.defenseRating = 2200;
guard.setFirstName("Elite Guardian");
InterestManager.setObjectDirty(guard);
WorldGrid.addObject(guard,loc.x,loc.z);
WorldGrid.updateObject(guard);
guard.stronghold = mine;
guard.mobPowers.clear();
guard.mobPowers.put(429399948,20); // find weakness
}
}
//create stronghold commander
Vector3fImmutable loc = tower.loc;
MobBase commanderBase = MobBase.getMobBase(getStrongholdCommanderID(tower.meshUUID));
Mob commander = Mob.createStrongholdMob(commanderBase.getLoadID(), loc,Guild.getErrantGuild(),true,mineZone,null,0, commanderBase.getFirstName(),75);
if(commander != null){
commander.parentZone = mine.getParentZone();
commander.bindLoc = loc;
commander.setLoc(loc);
commander.StrongholdCommander = true;
commander.equipmentSetID = getStrongholdMobEquipSetID(commander);
commander.runAfterLoad();
commander.setLevel((short)75);
commander.setResists(new Resists("Elite"));
commander.spawnTime = 1000000000;
commander.BehaviourType = Enum.MobBehaviourType.Aggro;
commander.mobPowers.clear();
commander.mobPowers.put(429032838, 40); // gravechill
commander.mobPowers.put(429757701,20); // magebolt
commander.mobPowers.put(429121388,20); // blight
commander.mobPowers.put(431566891,20); // lightning bolt
commander.mobPowers.put(428716075,20); // fire bolt
commander.mobPowers.put(429010987,20); // ice bolt
mine.strongholdMobs.add(commander);
LootManager.GenerateStrongholdLoot(commander,true, false);
commander.healthMax = 50000;
commander.setHealth(commander.healthMax);
commander.maxDamageHandOne = 3500;
commander.minDamageHandOne = 1500;
commander.atrHandOne = 3500;
commander.defenseRating = 3500;
commander.setFirstName("Guardian Commander");
InterestManager.setObjectDirty(commander);
WorldGrid.addObject(commander,loc.x,loc.z);
WorldGrid.updateObject(commander);
commander.stronghold = mine;
}
mine.isActive = true;
tower.setProtectionState(Enum.ProtectionState.PROTECTED);
tower.getBounds().setRegions(tower);
InterestManager.setObjectDirty(tower);
WorldGrid.updateObject(tower);
ChatManager.chatSystemChannel(mine.getZoneName() + "'s Stronghold Has Begun!");
Logger.info(mine.getZoneName() + "'s Stronghold Has Begun!");
}
public static void EndStronghold(Mine mine){
//restore the buildings
Building tower = BuildingManager.getBuilding(mine.getBuildingID());
if(tower == null)
return;
mine.isStronghold = false;
//get rid of the mobs
for(Mob mob : mine.strongholdMobs) {
mob.despawn();
mob.removeFromCache();
DbManager.MobQueries.DELETE_MOB(mob);
}
//restore the buildings
Zone mineZone = ZoneManager.findSmallestZone(tower.loc);
for(Building building : mineZone.zoneBuildingSet){
if(mine.oldBuildings.containsKey(building.getObjectUUID())) {
building.setMeshUUID(mine.oldBuildings.get(building.getObjectUUID()));
building.setMeshScale(new Vector3f(1, 1, 1));
InterestManager.setObjectDirty(building);
WorldGrid.updateObject(building);
}
}
//update tower to become Mine Tower again
tower.setMeshUUID(1500100);
mine.isActive = false;
tower.setProtectionState(Enum.ProtectionState.NPC);
tower.getBounds().setRegions(tower);
InterestManager.setObjectDirty(tower);
WorldGrid.updateObject(tower);
ChatManager.chatSystemChannel(mine.getZoneName() + "'s Stronghold Has Concluded!");
Logger.info(mine.getZoneName() + "'s Stronghold Has Concluded!");
}
public static int getStrongholdMeshID(Zone parent){
while(!parent.isMacroZone()){
parent = parent.getParent();
if(parent.getName().equalsIgnoreCase("seafloor")){
return 0;
}
}
switch(parent.getObjectUUID()){
case 197:
case 234:
case 178:
case 122:
return 814000; //Frost Giant Hall (ICE)
case 968:
case 951:
case 313:
case 331:
return 5001500; // Lich Queens Keep (UNDEAD)
case 785:
case 761:
case 717:
case 737:
return 1306600; // Temple of the Dragon (DESERT)
case 353:
case 371:
case 388:
case 532:
return 564600; // Undead Lord's Keep (SWAMP)
case 550:
case 508:
case 475:
case 418:
return 1326600; // elven hall
case 437:
case 491:
case 590:
case 569:
return 602400;
case 824:
case 842:
case 632:
return 1600000; // chaos temple
}
return 456100; // small stockade
}
public static int getStrongholdGuardianID(int ID){
switch(ID){
case 814000:
return 253004; // Mountain Giant Raider Axe
case 5001500:
return 253008; // Vampire Spear Warrior
case 1306600:
return 253007; // Desert Orc Warrior
case 564600:
return 253010; // Kolthoss Warrior
case 1326600:
return 253005; //elven warrior
case 602400:
return 253009; // templar missionary
case 1600000:
return 253006; // scourger
}
return 13434; // human sword and board warrior
}
public static int getStrongholdEpicID(int ID){
switch(ID){
case 814000:
return 253023; // Mountain Giant Raider Axe
case 5001500:
return 253022; // Vampire Spear Warrior
case 1306600:
return 253021; // Desert Orc Warrior
case 564600:
return 253018; // Kolthoss Warrior
case 1326600:
return 253019; //elven warrior
case 602400:
return 253024; // templar missionary
case 1600000:
return 253020; // scourger
}
return 13434; // human sword and board warrior
}
public static int getStrongholdCommanderID(int ID){
switch(ID){
case 814000:
return 253017;
case 5001500:
return 253012;
case 1306600:
return 253016; // Desert Orc Xbow
case 564600:
return 253011; // xbow kolthoss
case 1326600:
return 253013; //elven bow warrior
case 602400:
return 253015; // dune giant with xbow
case 1600000:
return 253014; // barbator
}
return 13433;
}
public static int getStrongholdMobEquipSetID(Mob mob) {
if(mob.StrongholdGuardian){
return 6327;
}else{
return 10790;
}
}
public static void CheckToEndStronghold(Mine mine) {
boolean stillAlive = false;
for (Mob mob : mine.strongholdMobs)
if (mob.isAlive())
stillAlive = true;
if (!stillAlive) {
// Epic encounter
Building tower = BuildingManager.getBuilding(mine.getBuildingID());
if (tower == null)
return;
Zone mineZone = ZoneManager.findSmallestZone(tower.loc);
Vector3fImmutable loc = tower.loc;
MobBase commanderBase = MobBase.getMobBase(getStrongholdEpicID(tower.meshUUID));
Mob commander = Mob.createStrongholdMob(commanderBase.getLoadID(), loc, Guild.getErrantGuild(), true, mineZone, null, 0, commanderBase.getFirstName(), 75);
if (commander != null) {
commander.parentZone = mine.getParentZone();
commander.bindLoc = loc;
commander.setLoc(loc);
commander.StrongholdEpic = true;
commander.equipmentSetID = getStrongholdMobEquipSetID(commander);
commander.runAfterLoad();
commander.setLevel((short) 85);
commander.setResists(new Resists("Elite"));
commander.spawnTime = 1000000000;
commander.BehaviourType = Enum.MobBehaviourType.Aggro;
commander.mobPowers.clear();
commander.mobPowers.put(429032838, 40); // gravechill
commander.mobPowers.put(429757701,40); // magebolt
commander.mobPowers.put(429121388,40); // blight
commander.mobPowers.put(431566891,40); // lightning bolt
commander.mobPowers.put(428716075,40); // fire bolt
commander.mobPowers.put(429010987,40); // ice bolt
mine.strongholdMobs.add(commander);
LootManager.GenerateStrongholdLoot(commander, true, true);
commander.healthMax = 250000;
commander.setHealth(commander.healthMax);
commander.maxDamageHandOne = 5000;
commander.minDamageHandOne = 2500;
commander.atrHandOne = 5000;
commander.defenseRating = 3500;
commander.setFirstName("Defender of " + mine.getParentZone().getParent().getName());
InterestManager.setObjectDirty(commander);
WorldGrid.addObject(commander,loc.x,loc.z);
WorldGrid.updateObject(commander);
commander.stronghold = mine;
}
}
}
}
+5 -5
View File
@@ -47,13 +47,13 @@ public class FinishSummonsJob extends AbstractScheduleJob {
return;
// cannot summon a player in combat
if (this.target.isCombat()) {
//if (this.target.isCombat()) {
ErrorPopupMsg.sendErrorMsg(this.source, "Cannot summon player in combat.");
// ErrorPopupMsg.sendErrorMsg(this.source, "Cannot summon player in combat.");
PowersManager.finishRecycleTime(428523680, this.source, false);
return;
}
// PowersManager.finishRecycleTime(428523680, this.source, false);
// return;
//}
if (this.target.getBonuses() != null && this.target.getBonuses().getBool(ModType.BlockedPowerType, SourceType.SUMMON)) {
ErrorPopupMsg.sendErrorMsg(this.target, "You have been blocked from receiving summons!");
+6 -6
View File
@@ -37,11 +37,11 @@ public class ItemTableEntry {
List<ItemTableEntry> itemTableEntryList;
itemTableEntryList = LootManager._itemTables.get(itemTable);
for (ItemTableEntry iteration : itemTableEntryList)
if (roll >= iteration.minRoll && roll <= iteration.maxRoll)
itemTableEntry = iteration;
if(itemTableEntryList != null) {
for (ItemTableEntry iteration : itemTableEntryList)
if (roll >= iteration.minRoll && roll <= iteration.maxRoll)
itemTableEntry = iteration;
}
return itemTableEntry;
}
@@ -51,7 +51,7 @@ public class ItemTableEntry {
itemTableEntryList = LootManager._itemTables.get(itemTable);
if(itemTableEntryList != null){
if(itemTableEntryList != null && itemTableEntryList.size() > 1){
id = itemTableEntryList.get(ThreadLocalRandom.current().nextInt(0,itemTableEntryList.size() - 1)).cacheID;
}
return id;
+5 -5
View File
@@ -33,11 +33,11 @@ public class ModTableEntry {
List<ModTableEntry> itemTableEntryList;
itemTableEntryList = LootManager._modTables.get(modTablwe);
for (ModTableEntry iteration : itemTableEntryList)
if (roll >= iteration.minRoll && roll <= iteration.maxRoll)
modTableEntry = iteration;
if(itemTableEntryList != null) {
for (ModTableEntry iteration : itemTableEntryList)
if (roll >= iteration.minRoll && roll <= iteration.maxRoll)
modTableEntry = iteration;
}
return modTableEntry;
}
}
+56 -40
View File
@@ -82,6 +82,16 @@ public class MobAI {
mob.updateLocation();
if(mob.StrongholdGuardian || mob.StrongholdEpic){
// attempt to ground all players in attack range
for(int i : mob.playerAgroMap.keySet()){
PlayerCharacter tar = PlayerCharacter.getFromCache(i);
if(tar != null && tar.loc.distanceSquared(mob.loc) < 80){
PowersManager.applyPower(mob,tar,tar.loc, 111111,40,false);
}
}
}
} catch (Exception e) {
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: AttackTarget" + " " + e.getMessage());
}
@@ -195,11 +205,11 @@ public class MobAI {
mob.setLastAttackTime(System.currentTimeMillis() + attackDelay);
}
if (mob.isSiege()) {
PowerProjectileMsg ppm = new PowerProjectileMsg(mob, target);
ppm.setRange(50);
DispatchMessage.dispatchMsgToInterestArea(mob, ppm, DispatchChannel.SECONDARY, MBServerStatics.CHARACTER_LOAD_RANGE, false, false);
}
//if (mob.isSiege()) {
// PowerProjectileMsg ppm = new PowerProjectileMsg(mob, target);
// ppm.setRange(50);
// DispatchMessage.dispatchMsgToInterestArea(mob, ppm, DispatchChannel.SECONDARY, MBServerStatics.CHARACTER_LOAD_RANGE, false, false);
//}
} catch (Exception e) {
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: AttackBuilding" + " " + e.getMessage());
@@ -400,7 +410,7 @@ public class MobAI {
PerformActionMsg msg;
if (!mobPower.isHarmful() || mobPower.targetSelf) {
if (!mob.StrongholdCommander && !mob.StrongholdEpic && (!mobPower.isHarmful() || mobPower.targetSelf)) {
PowersManager.useMobPower(mob, mob, mobPower, powerRank);
msg = PowersManager.createPowerMsg(mobPower, powerRank, mob, mob);
} else {
@@ -625,9 +635,6 @@ public class MobAI {
//check to send mob home for player guards to prevent exploit of dragging guards away and then teleporting
CheckToSendMobHome(mob);
return;
}
@@ -646,6 +653,9 @@ public class MobAI {
return;
}
if(mob.isPet() == false && mob.isPlayerGuard == false)
CheckToSendMobHome(mob);
if (mob.getCombatTarget() != null) {
if (mob.getCombatTarget().isAlive() == false) {
@@ -854,16 +864,14 @@ public class MobAI {
return;
}
//No items in inventory.
} else if (aiAgent.isHasLoot()) {
if (System.currentTimeMillis() > aiAgent.deathTime + MBServerStatics.DESPAWN_TIMER_ONCE_LOOTED) {
aiAgent.despawn();
aiAgent.deathTime = System.currentTimeMillis();
return;
}
//Mob never had Loot.
} else {
//Mob's Loot has been looted.
if (aiAgent.isHasLoot()) {
if (System.currentTimeMillis() > aiAgent.deathTime + MBServerStatics.DESPAWN_TIMER_ONCE_LOOTED) {
aiAgent.despawn();
aiAgent.deathTime = System.currentTimeMillis();
return;
}
//Mob never had Loot.
} else {
if (System.currentTimeMillis() > aiAgent.deathTime + MBServerStatics.DESPAWN_TIMER) {
aiAgent.despawn();
aiAgent.deathTime = System.currentTimeMillis();
@@ -871,11 +879,14 @@ public class MobAI {
}
}
}
} else if (System.currentTimeMillis() > (aiAgent.deathTime + (aiAgent.spawnTime * 1000L))) {
if(Mob.discDroppers.contains(aiAgent))
return;
if(Mob.discDroppers.contains(aiAgent))
return;
if(aiAgent.StrongholdGuardian || aiAgent.StrongholdEpic || aiAgent.StrongholdCommander)
return;
if (System.currentTimeMillis() > (aiAgent.deathTime + (aiAgent.spawnTime * 1000L))) {
if (!Zone.respawnQue.contains(aiAgent)) {
Zone.respawnQue.add(aiAgent);
}
@@ -911,12 +922,13 @@ public class MobAI {
private static void CheckToSendMobHome(Mob mob) {
if(mob.BehaviourType.equals(Enum.MobBehaviourType.Pet1)){
if(mob.loc.distanceSquared(mob.getOwner().loc) > 60 * 60)
mob.teleport(mob.getOwner().loc);
return;
}
try {
if(mob.BehaviourType.equals(Enum.MobBehaviourType.Pet1)){
if(mob.loc.distanceSquared(mob.getOwner().loc) > 60 * 60)
mob.teleport(mob.getOwner().loc);
return;
}
if (mob.BehaviourType.isAgressive) {
if (mob.isPlayerGuard()) {
@@ -947,7 +959,7 @@ public class MobAI {
}
}
}
} else if (MovementUtilities.inRangeOfBindLocation(mob) == false) {
} else if (!MovementUtilities.inRangeOfBindLocation(mob)) {
PowersBase recall = PowersManager.getPowerByToken(-1994153779);
PowersManager.useMobPower(mob, mob, recall, 40);
@@ -955,6 +967,7 @@ public class MobAI {
for (Entry playerEntry : mob.playerAgroMap.entrySet())
PlayerCharacter.getFromCache((int) playerEntry.getKey()).setHateValue(0);
mob.setCombatTarget(null);
}
} catch (Exception e) {
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: CheckToSendMobHome" + " " + e.getMessage());
@@ -1353,21 +1366,24 @@ public class MobAI {
return null;
}
public static void RecoverHealth(Mob mob){
public static void RecoverHealth(Mob mob) {
//recover health
if (mob.getTimestamps().containsKey("HEALTHRECOVERED") == false)
mob.getTimestamps().put("HEALTHRECOVERED", System.currentTimeMillis());
if (mob.isSit() && mob.getTimeStamp("HEALTHRECOVERED") < System.currentTimeMillis() + 3000)
if (mob.getHealth() < mob.getHealthMax()) {
float recoveredHealth = mob.getHealthMax() * ((1 + mob.getBonuses().getFloatPercentAll(Enum.ModType.HealthRecoverRate, Enum.SourceType.None)) * 0.01f);
mob.setHealth(mob.getHealth() + recoveredHealth);
try {
if (mob.getTimestamps().containsKey("HEALTHRECOVERED") == false)
mob.getTimestamps().put("HEALTHRECOVERED", System.currentTimeMillis());
if (mob.getHealth() > mob.getHealthMax())
mob.setHealth(mob.getHealthMax());
}
if (mob.isSit() && mob.getTimeStamp("HEALTHRECOVERED") < System.currentTimeMillis() + 3000)
if (mob.getHealth() < mob.getHealthMax()) {
float recoveredHealth = mob.getHealthMax() * ((1 + mob.getBonuses().getFloatPercentAll(Enum.ModType.HealthRecoverRate, Enum.SourceType.None)) * 0.01f);
mob.setHealth(mob.getHealth() + recoveredHealth);
mob.getTimestamps().put("HEALTHRECOVERED", System.currentTimeMillis());
if (mob.getHealth() > mob.getHealthMax())
mob.setHealth(mob.getHealthMax());
}
} catch (Exception e) {
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: RecoverHealth" + " " + e.getMessage());
}
}
}
@@ -139,37 +139,22 @@ public class CombatUtilities {
}
public static boolean triggerDefense(Mob agent, AbstractWorldObject target) {
int defenseScore = 0;
int attackScore = agent.getAtrHandOne();
int defense = 0;
int atr = agent.getAtrHandOne();
switch (target.getObjectType()) {
case PlayerCharacter:
defenseScore = ((AbstractCharacter) target).getDefenseRating();
defense = ((AbstractCharacter) target).getDefenseRating();
break;
case Mob:
Mob mob = (Mob) target;
if (mob.isSiege())
defenseScore = attackScore;
defense = atr;
break;
case Building:
return false;
}
int hitChance;
if (attackScore > defenseScore || defenseScore == 0)
hitChance = 94;
else if (attackScore == defenseScore && target.getObjectType() == GameObjectType.Mob)
hitChance = 10;
else {
float dif = attackScore / defenseScore;
if (dif <= 0.8f)
hitChance = 4;
else
hitChance = ((int) (450 * (dif - 0.8f)) + 4);
if (target.getObjectType() == GameObjectType.Building)
hitChance = 100;
}
return ThreadLocalRandom.current().nextInt(100) > hitChance;
return CombatManager.LandHit(atr,defense);
}
public static boolean triggerBlock(Mob agent, AbstractWorldObject ac) {
+4 -4
View File
@@ -13,6 +13,8 @@ import engine.exception.FactoryBuildException;
import engine.gameManager.ChatManager;
import engine.net.client.ClientConnection;
import engine.net.client.Protocol;
import engine.net.client.msg.ErrorPopupMsg;
import engine.net.client.msg.PlaceAssetMsg;
import engine.objects.PlayerCharacter;
import engine.server.MBServerStatics;
import org.joda.time.DateTime;
@@ -94,11 +96,9 @@ public class NetMsgFactory {
if (origin instanceof ClientConnection) {
PlayerCharacter player = ((ClientConnection) origin).getPlayerCharacter();
if (player != null) {
// if (MBServerStatics.worldServerName.equals("Grief"))
Logger.error("Invalid protocol msg for player " + player.getFirstName() + " : " + opcode + " lastopcode: " + origin.lastProtocol.name() + " Error Code : " + errorCode);
} else
Logger.error("Invalid protocol msg : " + opcode + " lastopcode: " + origin.lastProtocol.name() + " Error Code : " + errorCode);
PlaceAssetMsg.sendPlaceAssetError(player.getClientConnection(), 1, "Please Report What You Just Did. Ref Code: " + opcode);
}
}
return null;
+24 -18
View File
@@ -672,6 +672,8 @@ public class ClientMessagePump implements NetMsgHandler {
JobScheduler.getInstance().scheduleJob(new RefreshGroupJob(sourcePlayer), MBServerStatics.LOAD_OBJECT_DELAY);
}
private static void lootWindowRequest(LootWindowRequestMsg msg, ClientConnection origin) throws MsgSendException {
PlayerCharacter pc = SessionManager.getPlayerCharacter(origin);
@@ -1363,18 +1365,12 @@ public class ClientMessagePump implements NetMsgHandler {
NPC npc = NPC.getFromCache(msg.getNpcID());
switch(npc.getContractID()){
case 900:
case 1201:
case 1202:
npc.sellPercent = 0.0f;
break;
}
if (npc == null)
return;
// test within talking range
if(npc.isInSafeZone())
npc.sellPercent = 0;
if (sourcePlayer.getLoc().distanceSquared2D(npc.getLoc()) > MBServerStatics.NPC_TALK_RANGE * MBServerStatics.NPC_TALK_RANGE) {
ErrorPopupMsg.sendErrorPopup(sourcePlayer, 14);
@@ -1406,6 +1402,12 @@ public class ClientMessagePump implements NetMsgHandler {
Item buy = null;
if (msg.getItemType() == GameObjectType.MobEquipment.ordinal()) {
ArrayList<MobEquipment> sellInventory = npc.getContract().getSellInventory();
//if(npc.contract.getObjectUUID() == 890){ // default steward
// sellInventory = npc.getSellInventorySteward();
//}
//if(npc.contract.getObjectUUID() == 889){ // default builder
// sellInventory = npc.getSellInventoryBuilder();
//}
if (sellInventory == null) {
return;
}
@@ -1435,14 +1437,17 @@ public class ClientMessagePump implements NetMsgHandler {
bargain = 0;
break;
}
float profit = npc.getSellPercent(sourcePlayer) - bargain;
if(me.getItemBase().getType().equals(ItemType.POTION))
profit -= 1.0f;
if (profit < 1)
profit = 1;
cost *= profit;
if(npc.getContractID() == 1502041)
cost = 2;
float profit;
if(npc.isInSafeZone())
profit = 0;
else
profit = npc.getSellPercent(sourcePlayer) - bargain;
if(profit > 0)
cost *= profit;
if (gold.getNumOfItems() - cost < 0) {
//dont' have enough goldItem exit!
// chatMan.chatSystemInfo(pc, "" + "You dont have enough gold.");
@@ -1455,8 +1460,9 @@ public class ClientMessagePump implements NetMsgHandler {
if (b != null && (b.getStrongboxValue() + buildingDeposit) > b.getMaxGold() && !b.isOwnerIsNPC()) {
ErrorPopupMsg.sendErrorPopup(sourcePlayer, 206);
return;
}
if (!itemMan.buyFromNPC(b, cost, buildingDeposit)) {
}if(npc.getContractID() == 1502041){
me.fromNoob = true;
} else if (!itemMan.buyFromNPC(b, cost, buildingDeposit)) {
// chatMan.chatSystemInfo(pc, "" + "You Failed to buy the item.");
ChatManager.chatSystemError(sourcePlayer, "Failed To Buy Item");
return;
@@ -62,7 +62,7 @@ public class DestroyBuildingHandler extends AbstractClientMsgHandler {
if (city != null)
bane = city.getBane();
if (bane != null && bane.getSiegePhase() == Enum.SiegePhase.WAR) {
if (bane != null){// && bane.getSiegePhase() == Enum.SiegePhase.WAR) {
ErrorPopupMsg.sendErrorPopup(pc, 171);
return true;
}
@@ -102,7 +102,7 @@ public class GroupInviteResponseHandler extends AbstractClientMsgHandler {
// Run Keyclone Audit
KEYCLONEAUDIT.audit(player, group);
//KEYCLONEAUDIT.audit(player, group);
return true;
}
@@ -360,6 +360,11 @@ public class ItemProductionMsgHandler extends AbstractClientMsgHandler {
targetItem.recycle(vendor);
vendor.removeItemFromForge(targetItem);
//refund the gold for cancelled item
if(vendor.building.getStrongboxValue() + targetItem.getItemBase().getBaseValue() < 15000000){
vendor.building.setStrongboxValue(vendor.building.getStrongboxValue() + targetItem.getItemBase().getBaseValue());
}
// Refresh vendor's inventory to client
outMsg = new ManageNPCMsg(vendor);
@@ -62,16 +62,23 @@ public class MOTDEditHandler extends AbstractClientMsgHandler {
return true;
}
if (type == 1) // Guild MOTD
if (type == 1) { // Guild MOTD
msg.setMessage(guild.getMOTD());
else if (type == 3) // IC MOTD
guild.updateDatabase();
}else if (type == 3) { // IC MOTD
msg.setMessage(guild.getICMOTD());
else if (type == 0) { // Nation MOTD
guild.updateDatabase();
}else if (type == 0) { // Nation MOTD
Guild nation = guild.getNation();
if (nation == null || !nation.isNation()) {
ErrorPopupMsg.sendErrorMsg(playerCharacter, "You do not have such authority!");
return true;
}
nation.setNMOTD(msg.getMessage());
nation.updateDatabase();
for(Guild sub : nation.getSubGuildList()){
sub.setNMOTD(nation.getNMOTD());
}
msg.setMessage(nation.getMOTD());
}
dispatch = Dispatch.borrow(playerCharacter, msg);
@@ -193,31 +193,28 @@ public class MerchantMsgHandler extends AbstractClientMsgHandler {
int trains = 0;
switch(npc.getRank()){
case 1:
trains = 5;
break;
case 2:
trains = 10;
break;
case 3:
case 2:
trains = 15;
break;
case 4:
case 3:
trains = 20;
break;
case 5:
case 4:
trains = 25;
break;
case 6:
case 5:
trains = 30;
break;
case 7:
case 6:
trains = 35;
break;
case 7:
trains = 40;
break;
}
if(Objects.requireNonNull(shrineBuilding.getCity()).getTOL() != null && shrineBuilding.getCity().getTOL().getRank() == 8)
trains += 5;
PowersManager.applyPower(player, player, player.getLoc(), shrinePower.getToken(), trains, false);
ChatManager.chatGuildInfo(player.getGuild(), player.getName() + " has recieved a boon costing " + 1 + " point of favor.");
shrineBuilding.addEffectBit(1000000 << 2);
@@ -277,60 +274,85 @@ public class MerchantMsgHandler extends AbstractClientMsgHandler {
}
}
if (targetCity == null)
return;
//verify level required to teleport or repledge
Guild toGuild = targetCity.getGuild();
if (toGuild != null)
if (isTeleport) {
if (player.getLevel() < toGuild.getTeleportMin() || player.getLevel() > toGuild.getTeleportMax())
return;
} else if (player.getLevel() < toGuild.getRepledgeMin() || player.getLevel() > toGuild.getRepledgeMax())
if (targetCity == null){
Mine mineTele = null;
for(Mine mine : Mine.getMinesToTeleportTo(player)){
if(mine.getObjectUUID() == msg.getCityID()){
mineTele = mine;
}
}
if(mineTele == null){
return;
}else {
int time = MBServerStatics.TELEPORT_TIME_IN_SECONDS;
msg.setTeleportTime(time);
Building tower = Mine.getTower(mineTele);
if (tower == null)
return;
Vector3fImmutable teleportLoc = Vector3fImmutable.getRandomPointOnCircle(tower.getLoc(), 10);
ChatManager.chatSystemInfo(player, "You Will Teleport To " + mineTele.getParentZone().getParent().getName() + "'s Mine In " + time + " Seconds.");
if (time > 0) {
//TODO add timer to teleport
TeleportJob tj = new TeleportJob(player, npc, teleportLoc, origin, true);
JobScheduler.getInstance().scheduleJob(tj, time * 1000);
}
}
}else{
//finish porting to a city
//verify level required to teleport or repledge
boolean joinedGuild = false;
Guild toGuild = targetCity.getGuild();
//if repledge, reguild the player
if (toGuild != null)
if (isTeleport) {
if (player.getLevel() < toGuild.getTeleportMin() || player.getLevel() > toGuild.getTeleportMax())
return;
} else if (player.getLevel() < toGuild.getRepledgeMin() || player.getLevel() > toGuild.getRepledgeMax())
return;
if (!isTeleport)
joinedGuild = GuildManager.joinGuild(player, targetCity.getGuild(), targetCity.getObjectUUID(), GuildHistoryType.JOIN);
boolean joinedGuild = false;
int time;
//if repledge, reguild the player
if (!isTeleport) //repledge
time = MBServerStatics.REPLEDGE_TIME_IN_SECONDS;
else
time = MBServerStatics.TELEPORT_TIME_IN_SECONDS;
if (!isTeleport)
joinedGuild = GuildManager.joinGuild(player, targetCity.getGuild(), targetCity.getObjectUUID(), GuildHistoryType.JOIN);
//resend message
msg.setTeleportTime(time);
int time;
if ((!isTeleport && joinedGuild) || (isTeleport)) {
if (!isTeleport) //repledge
time = MBServerStatics.REPLEDGE_TIME_IN_SECONDS;
else
time = MBServerStatics.TELEPORT_TIME_IN_SECONDS;
dispatch = Dispatch.borrow(player, msg);
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);
//resend message
msg.setTeleportTime(time);
if ((!isTeleport && joinedGuild) || (isTeleport)) {
dispatch = Dispatch.borrow(player, msg);
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);
}
//teleport player to city
Vector3fImmutable teleportLoc;
if (targetCity.getTOL().getRank() == 8)
teleportLoc = targetCity.getTOL().getStuckLocation();
else
teleportLoc = Vector3fImmutable.getRandomPointOnCircle(targetCity.getTOL().getLoc(), MBServerStatics.TREE_TELEPORT_RADIUS);
if (time > 0) {
//TODO add timer to teleport
TeleportJob tj = new TeleportJob(player, npc, teleportLoc, origin, true);
JobScheduler.getInstance().scheduleJob(tj, time * 1000);
} else if (joinedGuild) {
player.teleport(teleportLoc);
player.setSafeMode();
}
}
//teleport player to city
Vector3fImmutable teleportLoc;
if (targetCity.getTOL().getRank() == 8)
teleportLoc = targetCity.getTOL().getStuckLocation();
else
teleportLoc = Vector3fImmutable.getRandomPointOnCircle(targetCity.getTOL().getLoc(), MBServerStatics.TREE_TELEPORT_RADIUS);
if (time > 0) {
//TODO add timer to teleport
TeleportJob tj = new TeleportJob(player, npc, teleportLoc, origin, true);
JobScheduler.getInstance().scheduleJob(tj, time * 1000);
} else if (joinedGuild) {
player.teleport(teleportLoc);
player.setSafeMode();
}
}
private static PowersBase getPowerforHermit(NPC npc) {
@@ -443,7 +443,12 @@ public class ObjectActionMsgHandler extends AbstractClientMsgHandler {
itemMan.consume(item);
}
break;
} else if (uuid > 252122 && uuid < 252128) { //mastery runes
} else if (uuid > 252122 && uuid < 252137) { //blood runes
if (ApplyRuneMsg.applyRune(uuid, origin, player)) {
itemMan.consume(item);
}
break;
} else if (uuid > 252128 && uuid < 252128) { //mastery runes
if (ApplyRuneMsg.applyRune(uuid, origin, player)) {
itemMan.consume(item);
}
@@ -523,7 +528,9 @@ public class ObjectActionMsgHandler extends AbstractClientMsgHandler {
dispatch = Dispatch.borrow(player, msg);
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);
player.cancelOnSpell();
if(!item.getItemBase().getType().equals(ItemType.POTION)) {
player.cancelOnSpell();
}
break;
default: //shouldn't be here, consume item
dispatch = Dispatch.borrow(player, msg);
@@ -135,7 +135,8 @@ public class TaxCityMsgHandler extends AbstractClientMsgHandler {
msg = (TaxCityMsg) baseMsg;
ViewTaxes(msg, player);
//realm taxing disabled
//ViewTaxes(msg, player);
return true;
+71 -15
View File
@@ -90,12 +90,39 @@ public class ApplyRuneMsg extends ClientNetMsg {
}
if(runeID == 3040)
valid = true;
if(runeID == 2514 && raceID == 1999)
valid = true;
if(runeID == 3036 && raceID == 1999)
valid = true;
if(runeID == 3033 && raceID == 1999)
if(runeID == 3049)
valid = true;
if(raceID == 1999){
switch(runeID){
case 2514:
case 3036:
case 3033:
case 3001:
case 3002:
case 3003:
case 3004:
case 3008:
case 3009:
case 3013:
case 3016:
case 3017:
case 3018:
case 3020:
case 3021:
case 3030:
case 3031:
case 3037:
case 3045:
case 3046:
case 3047:
case 3048:
case 3049:
valid = true;
break;
}
}
if (!valid) {
return false;
}
@@ -142,6 +169,8 @@ public class ApplyRuneMsg extends ClientNetMsg {
valid = true;
if(runeID == 3033 && raceID == 1999)
valid = true;
if(runeID == 3028 && (raceID == 2013 || raceID == 2014) && playerCharacter.getBaseClassID() == 2501)
valid = true;
if (!valid) {
return false;
}
@@ -200,6 +229,9 @@ public class ApplyRuneMsg extends ClientNetMsg {
case "Born of the Gwendannen":
case "Born of the Invorri":
case "Born of the Irydnu":
case "Scion of the Dar Khelegeur":
case "Scion of the Gwaridorn":
case "Scion of the Twathedilion":
mod = 0;
}
if (mod > playerCharacter.getUnusedStatPoints()) {
@@ -256,6 +288,7 @@ public class ApplyRuneMsg extends ClientNetMsg {
}
//Check if max number runes already reached
if (runes.size() > 12) {
ChatManager.chatSystemInfo(playerCharacter,"You Have Too Many Runes Applied");
return false;
}
switch (rb.getName()) {
@@ -276,19 +309,39 @@ public class ApplyRuneMsg extends ClientNetMsg {
return false;
}
}
break;
case "Scion of the Dar Khelegeur":
case "Scion of the Gwaridorn":
case "Scion of the Twathedilion":
for (CharacterRune charRune : playerCharacter.getRunes()) {
RuneBase rb2 = charRune.getRuneBase();
switch (rb2.getName()) {
case "Scion of the Dar Khelegeur":
case "Scion of the Gwaridorn":
case "Scion of the Twathedilion":
ChatManager.chatSystemError(playerCharacter, "You Have Already Applied A Blood Rune");
return false;
}
}
break;
}
//if discipline, check number applied
if (isDiscipline(runeID)) {
//if(playerCharacter.getLevel() == 80)
discCount -= 1; // level 80 characters get an extra disc rune
if (playerCharacter.getLevel() < 70) {
if (discCount > 2) {
return false;
}
} else {
if (discCount > 3) {
return false;
}
switch(playerCharacter.getRank()){
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
if(discCount > 3)
return false;
break;
case 7:
case 8:
if(discCount > 5)
return false;
break;
}
}
//Everything succeeded. Let's apply the rune
@@ -351,6 +404,9 @@ public class ApplyRuneMsg extends ClientNetMsg {
case "Born of the Gwendannen":
case "Born of the Invorri":
case "Born of the Irydnu":
case "Scion of the Dar Khelegeur":
case "Scion of the Gwaridorn":
case "Scion of the Twathedilion":
cost = 0;
break;
}
@@ -112,6 +112,12 @@ public class BuyFromNPCWindowMsg extends ClientNetMsg {
if (contract != null)
sellInventory = contract.getSellInventory();
//if(npc.contract.getObjectUUID() == 890){ // default steward
// sellInventory = npc.getSellInventorySteward();
// }
//if(npc.contract.getObjectUUID() == 889){ // default builder
// sellInventory = npc.getSellInventoryBuilder();
// }
}
if (man != null)
@@ -485,13 +485,7 @@ public class ManageCityAssetsMsg extends ClientNetMsg {
writer.putInt(building.getRank());
// Maintenance costs include resource if
// this structure is an R8 tree
if (building.getRank() == 8)
writer.putInt(5); // Resources included
else
writer.putInt(1); // Gold only
writer.putInt(1); // Gold only
writer.putInt(2308551); //Gold
if (building.getBlueprint() == null)
@@ -499,17 +493,6 @@ public class ManageCityAssetsMsg extends ClientNetMsg {
else
writer.putInt(building.getBlueprint().getMaintCost()); // maint cost
if (building.getRank() == 8) {
writer.putInt(74856115); // Stone
writer.putInt(1500); // maint cost
writer.putInt(-1603256692); // Lumber
writer.putInt(1500); // maint cost
writer.putInt(-1596311545); // Galvor
writer.putInt(5); // maint cost
writer.putInt(1532478436); // Wormwood
writer.putInt(5); // maint cost
}
LocalDateTime maintDate = building.maintDateTime;
if (maintDate == null)
@@ -16,7 +16,9 @@ import engine.net.ByteBufferReader;
import engine.net.ByteBufferWriter;
import engine.net.client.Protocol;
import engine.objects.City;
import engine.objects.Mine;
import engine.objects.PlayerCharacter;
import org.pmw.tinylog.Logger;
import java.util.ArrayList;
@@ -24,6 +26,7 @@ import java.util.ArrayList;
public class TeleportRepledgeListMsg extends ClientNetMsg {
ArrayList<City> cities;
ArrayList<Mine> mines;
private PlayerCharacter player;
private boolean isTeleport;
@@ -77,10 +80,19 @@ public class TeleportRepledgeListMsg extends ClientNetMsg {
public void configure() {
if (isTeleport)
if (isTeleport) {
cities = City.getCitiesToTeleportTo(player);
else
try {
mines = Mine.getMinesToTeleportTo(player);
if(mines == null)
mines = new ArrayList<>();
}catch(Exception e){
Logger.error("Unable To Load Mines For Teleport: " + e.getMessage());
}
}else {
cities = City.getCitiesToRepledgeTo(player);
mines = new ArrayList<>();
}
}
/**
@@ -96,10 +108,14 @@ public class TeleportRepledgeListMsg extends ClientNetMsg {
for (int i = 0; i < 3; i++)
writer.putInt(0);
writer.putInt(cities.size());
writer.putInt(cities.size() + mines.size());
for (City city : cities)
City.serializeForClientMsg(city, writer);
for(Mine mine : mines)
Mine.serializeForClientMsgTeleport(mine, writer);
}
public PlayerCharacter getPlayer() {
+44 -12
View File
@@ -553,26 +553,58 @@ public class VendorDialogMsg extends ClientNetMsg {
// verify race valid for profession
Race race = pc.getRace();
if (race == null || !promo.isAllowedRune(race.getToken())) {
// TODO send client promotion error
return;
if(race.getRaceRuneID() == 1999) {
boolean valid = false;
switch(promoID){
case 2504:
case 2505:
case 2506:
case 2507:
case 2510:
case 2511:
case 2512:
case 2514:
case 2515:
case 2517:
case 2518:
case 2519:
case 2520:
case 2521:
valid = true;
break;
}
if(!valid)
return;
}
else {
if (race == null || !promo.isAllowedRune(race.getToken())) {
// TODO send client promotion error
return;
}
}
// verify baseclass valid for profession
BaseClass bc = pc.getBaseClass();
if (bc == null || !promo.isAllowedRune(bc.getToken())) {
if (bc == null) {
// TODO send client promotion error
return;
}
if(!promo.isAllowedRune(bc.getToken())){
if(!bc.getName().equals("Rogue") && !promo.getName().equals("Druid"))
return;
}
// verify gender
if (promoID == 2511 && pc.isMale()) // Fury
return;
if (promoID == 2512 && pc.isMale()) // Huntress
return;
if (promoID == 2517 && !pc.isMale()) // Warlock
return;
if(race.getRaceRuneID() != 1999) {
// verify gender
if (promoID == 2511 && pc.isMale()) // Fury
return;
if (promoID == 2512 && pc.isMale()) // Huntress
return;
if (promoID == 2517 && !pc.isMale()) // Warlock
return;
}
// Everything valid. Let's promote
pc.setPromotionClass(promo.getObjectUUID());
+11 -5
View File
@@ -31,6 +31,7 @@ import engine.net.ByteBufferWriter;
import engine.net.DispatchMessage;
import engine.net.client.msg.UpdateStateMsg;
import engine.powers.EffectsBase;
import engine.powers.effectmodifiers.AbstractEffectModifier;
import engine.server.MBServerStatics;
import org.pmw.tinylog.Logger;
@@ -91,17 +92,17 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
protected Resists resists = new Resists("Genric");
protected ConcurrentHashMap<String, JobContainer> timers;
protected ConcurrentHashMap<String, Long> timestamps;
protected int atrHandOne;
public int atrHandOne;
protected int atrHandTwo;
protected int minDamageHandOne;
protected int maxDamageHandOne;
public int minDamageHandOne;
public int maxDamageHandOne;
protected int minDamageHandTwo;
protected int maxDamageHandTwo;
protected float rangeHandOne;
protected float rangeHandTwo;
protected float speedHandOne;
protected float speedHandTwo;
protected int defenseRating;
public int defenseRating;
protected boolean isActive; // <-Do not use this for deleting character!
protected float altitude = 0; // 0=on terrain, 1=tier 1, 2=tier 2, etc.
protected ConcurrentHashMap<Integer, JobContainer> recycleTimers;
@@ -496,8 +497,13 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
boolean canFly = false;
PlayerBonuses bonus = flyer.getBonuses();
if (bonus != null && !bonus.getBool(ModType.NoMod, SourceType.Fly) && bonus.getBool(ModType.Fly, SourceType.None) && flyer.isAlive())
if (bonus != null && !bonus.getBool(ModType.NoMod, SourceType.Fly) && bonus.getBool(ModType.Fly, SourceType.None) && flyer.isAlive()) {
canFly = true;
}
if(flyer.effects.containsKey("MoveBuff")){
canFly = false;
}
return canFly;
+50 -4
View File
@@ -17,6 +17,7 @@ import org.pmw.tinylog.Logger;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Objects;
/* @Summary - Blueprint class is used for determining
characteristics of instanced player owned
@@ -60,13 +61,12 @@ public class Blueprint {
this.name = rs.getString("MeshName");
this.icon = rs.getInt("Icon");
this.buildingGroup = BuildingGroup.valueOf(rs.getString("BuildingGroup"));
this.maxRank = rs.getInt("MaxRank");
this.maxSlots = rs.getInt("MaxSlots");
this.rank1UUID = rs.getInt("Rank1UUID");
this.rank3UUID = rs.getInt("Rank3UUID");
this.rank7UUID = rs.getInt("Rank7UUID");
this.destroyedUUID = rs.getInt("DestroyedUUID");
this.maxRank = rs.getInt("MaxRank");
}
// Accessors
@@ -173,6 +173,21 @@ public class Blueprint {
}
public int getMaxRank() {
BuildingGroup bg = this.buildingGroup;
switch(bg){
case AMAZONHALL:
case CATHEDRAL:
case GREATHALL:
case KEEP:
case THIEFHALL:
case TEMPLEHALL:
case WIZARDHALL:
case ELVENHALL:
case ELVENSANCTUM:
case IREKEIHALL:
case FORESTHALL:
return 1;
}
return maxRank;
}
@@ -181,6 +196,21 @@ public class Blueprint {
return 1;
if (this.buildingGroup != null && this.buildingGroup.equals(BuildingGroup.TOL))
return 4;
BuildingGroup bg = this.buildingGroup;
switch(bg){
case AMAZONHALL:
case CATHEDRAL:
case GREATHALL:
case KEEP:
case THIEFHALL:
case TEMPLEHALL:
case WIZARDHALL:
case ELVENHALL:
case ELVENSANCTUM:
case IREKEIHALL:
case FORESTHALL:
return 3;
}
return maxSlots;
}
@@ -312,10 +342,24 @@ public class Blueprint {
return 0;
// Early exit for buildings with single or no slots
if (this.maxSlots <= 1 && !this.buildingGroup.equals(BuildingGroup.TOL))
return maxSlots;
BuildingGroup bg = this.buildingGroup;
switch(bg.name()) {
case "AMAZONHALL":
case "CATHEDRAL":
case "GREATHALL":
case "THIEFHALL":
case "TEMPLEHALL":
case "WIZARDHALL":
case "ELVENHALL":
case "ELVENSANCTUM":
case "IREKEIHALL":
case "FORESTHALL":
return 3;
}
if (this.maxRank == 1 && currentRank == 1)
return getMaxSlots();
@@ -332,9 +376,11 @@ public class Blueprint {
case 5:
case 6:
case 7:
case 8:
availableSlots = 3;
break;
case 8:
availableSlots = 4;
break;
default:
availableSlots = 0;
break;
+20
View File
@@ -182,6 +182,22 @@ public class Building extends AbstractWorldObject {
this.setHealth(healthMax);
}
if(!this.ownerIsNPC){
//add extra HP for city walls of R8 trees
City city = ZoneManager.getCityAtLocation(this.loc);
if(city != null){
Building ToL = city.getTOL();
if(ToL != null){
if(ToL.rank == 8){
float currentHealth = this.health.get();
float newHealth = (currentHealth/this.healthMax) * (this.healthMax * 1.1f);
this.healthMax *= 1.1f;
this.setHealth(newHealth);
}
}
}
}
// Null out blueprint if not needed (npc building)
if (blueprintUUID == 0)
@@ -821,6 +837,10 @@ public class Building extends AbstractWorldObject {
return this.meshScale;
}
public void setMeshScale(Vector3f scale) {
this.meshScale = scale;
}
public final int getMeshUUID() {
return this.meshUUID;
}
@@ -610,6 +610,8 @@ public class CharacterItemManager {
if (i == null)
return false;
i.stripCastableEnchants();
if (!this.doesCharOwnThisItem(i.getObjectUUID()))
return false;
@@ -1054,6 +1056,7 @@ public class CharacterItemManager {
// add to Bank
this.bank.add(i);
i.addToCache();
i.stripCastableEnchants();
calculateWeights();
@@ -1202,6 +1205,7 @@ public class CharacterItemManager {
calculateWeights();
i.stripCastableEnchants();
return true;
}
@@ -2009,6 +2013,7 @@ public class CharacterItemManager {
if (item.getItemBase().getType().equals(ItemType.GOLD)) {
int amt = item.getNumOfItems();
item.setNumOfItems(0);
item.stripCastableEnchants();
MobLoot ml = new MobLoot(this.absCharacter, amt);
ml.zeroItem();
ml.containerType = Enum.ItemContainerType.INVENTORY;
+11 -2
View File
@@ -992,6 +992,9 @@ public class CharacterSkill extends AbstractGameObject {
//Get Base skill for unmodified stats
float base = 7f;
if(this.skillsBase.getToken() == -660435875){
base = 0;
}
float statMod = 0.5f;
if (this.skillsBase.getStrMod() > 0)
statMod += (float) this.skillsBase.getStrMod() * (float) (int) ((PlayerCharacter) CharacterSkill.GetOwner(this)).statStrBase / 100f;
@@ -1009,7 +1012,7 @@ public class CharacterSkill extends AbstractGameObject {
statMod = 600f;
base += CharacterSkill.baseSkillValues[(int) statMod];
if (base + bonus < 1f)
if (base + bonus < 1f && this.skillsBase.getToken() != -660435875)
this.baseAmountBeforeMods = 1f;
else
this.baseAmountBeforeMods = base + bonus;
@@ -1084,6 +1087,9 @@ public class CharacterSkill extends AbstractGameObject {
//Get Base skill for modified stats
//TODO this fomula needs verified
float base = 7f;
if(this.skillsBase.getToken() == -660435875){
base = 0;
}
float statMod = 0.5f;
if (this.skillsBase.getStrMod() > 0)
statMod += (float) this.skillsBase.getStrMod() * (float) CharacterSkill.GetOwner(this).getStatStrCurrent() / 100f;
@@ -1099,6 +1105,9 @@ public class CharacterSkill extends AbstractGameObject {
statMod = 1f;
else if (statMod > 600)
statMod = 600f;
if(this.skillsBase.getToken() == -660435875){
statMod = 0;
}
base += CharacterSkill.baseSkillValues[(int) statMod];
SourceType sourceType = SourceType.GetSourceType(this.skillsBase.getNameNoSpace());
@@ -1109,7 +1118,7 @@ public class CharacterSkill extends AbstractGameObject {
base += bonus + CharacterSkill.GetOwner(this).getBonuses().getFloat(ModType.Skill, sourceType);
}
if (base < 1f)
if (base < 1f && this.skillsBase.getToken() != -660435875)
this.baseAmount = 1f;
else
this.baseAmount = base;
+5 -2
View File
@@ -289,8 +289,11 @@ public class City extends AbstractWorldObject {
else
writer.putString(rulingNation.getName());
writer.putInt(city.getTOL().getRank());
if(city.getTOL() != null) {
writer.putInt(city.getTOL().getRank());
} else{
writer.putInt(1);
}
if (city.isNoobIsle > 0)
writer.putInt(1);
else
+6 -2
View File
@@ -92,6 +92,9 @@ public class Contract extends AbstractGameObject {
case 899: //alchemist
this.allowedBuildings.add(Enum.BuildingGroup.TOL);
}
if(this.getName().toLowerCase().contains("sage")){
this.allowedBuildings.add(Enum.BuildingGroup.TOL);
}
this.equipmentSet = rs.getInt("equipSetID");
this.inventorySet = rs.getInt("inventorySet");
@@ -208,9 +211,9 @@ public class Contract extends AbstractGameObject {
for(MobEquipment me : this.sellInventory){
if(me.getItemBase().getType().equals(Enum.ItemType.RESOURCE)){
int amountResource = Warehouse.getSellStackSize(me.getItemBase().getUUID());
me.magicValue = amountResource * me.getItemBase().getBaseValue() * 2;
me.magicValue = amountResource * me.getItemBase().getBaseValue();
} else{
me.magicValue = 100000;
me.magicValue = 1000000;
}
}
}
@@ -289,6 +292,7 @@ public class Contract extends AbstractGameObject {
me.magicValue = 1;
}
}
return this.sellInventory;
}
+29 -10
View File
@@ -9,6 +9,7 @@
package engine.objects;
import engine.Enum;
import engine.Enum.TargetColor;
import engine.gameManager.ZoneManager;
import engine.math.Vector3fImmutable;
@@ -117,6 +118,11 @@ public class Experience {
159932666, // Level 74
169707808, // Level 75
179921247, // Level 76
190585732, // Level 77
201714185, // Level 78
213319687, // Level 79
225415457, // Level 80
238014819 // Level 81
};
@@ -214,7 +220,14 @@ public class Experience {
235166.21f, // Level 72
246039.34f, // Level 73
257240.58f, // Level 74
1 // 268774.71 //Level 75
268774.71f, //Level 75
280647.69f, // Level 76
292865.22f, // Level 77
305433.33f, // Level 78
318358.08f, // Level 79
// R8
1 //331645.74f // Level 80
};
// Used to calcuate the amount of experience a monster grants in the
@@ -268,8 +281,8 @@ public class Experience {
if (level < 1)
level = 1;
if (level > 75)
level = 75;
if (level > MBServerStatics.LEVELCAP)
level = MBServerStatics.LEVELCAP;
return MaxExpPerLevel[level];
}
@@ -279,17 +292,17 @@ public class Experience {
switch (TargetColor.getCon(pc, mob)) {
case Red:
return 1.25;
return 1.1;
case Orange:
return 1.15;
case Yellow:
return 1.05;
return 1.2;
case Blue:
return 1;
return 1.25;
case Cyan:
return 0.8;
return 0.9;
case Green:
return 0.5;
return 0.7;
default:
return 0;
}
@@ -383,6 +396,9 @@ public class Experience {
if (playerCharacter.getLevel() >= MBServerStatics.LEVELCAP)
continue;
if(playerCharacter.level >= 75 && !mob.getObjectType().equals(Enum.GameObjectType.PlayerCharacter))
continue; // cannot PVE higher than level 75
// Sets Max XP with server exp mod taken into account.
grantedExperience = (double) LOOTMANAGER.NORMAL_EXP_RATE * maxXPPerKill(playerCharacter.getLevel());
@@ -428,12 +444,15 @@ public class Experience {
}
} else { // Give EXP to a single character
if (!killer.isAlive()) // Skip if the player is dead.
return;
//if (!killer.isAlive()) // Skip if the player is dead.
// return;
if (killer.getLevel() >= MBServerStatics.LEVELCAP)
return;
if(killer.level >= 75 && !mob.getObjectType().equals(Enum.GameObjectType.PlayerCharacter))
return;
// Get XP and adjust for Mob Level with world xp modifier taken into account
grantedExperience = (double) LOOTMANAGER.NORMAL_EXP_RATE * maxXPPerKill(killer.getLevel());
grantedExperience *= getConMod(killer, mob);
+4
View File
@@ -521,6 +521,10 @@ public class Guild extends AbstractWorldObject {
public void setICMOTD(String value) {
this.icmotd = value;
}
public void setNMOTD(String value) {
this.nmotd = value;
}
public String getNMOTD(){return nmotd;}
public boolean isNPCGuild() {
+29 -1
View File
@@ -23,6 +23,7 @@ import engine.net.client.ClientConnection;
import engine.net.client.msg.DeleteItemMsg;
import engine.powers.EffectsBase;
import engine.powers.effectmodifiers.AbstractEffectModifier;
import engine.powers.effectmodifiers.WeaponProcEffectModifier;
import engine.powers.poweractions.AbstractPowerAction;
import engine.server.MBServerStatics;
import org.pmw.tinylog.Logger;
@@ -816,8 +817,29 @@ public class Item extends AbstractWorldObject {
return ownerID;
}
public void stripCastableEnchants(){
ArrayList<String> keys =new ArrayList<>();
for(String eff : this.effects.keySet()){
for(AbstractEffectModifier mod : this.effects.get(eff).getEffectsBase().getModifiers()){
if(mod.modType.equals(ModType.WeaponProc)){
keys.add(eff);
}
}
}
for(String eff : keys){
try {
this.effects.get(eff).endEffect();
this.effects.remove(eff);
}catch(Exception e){
}
}
}
//Only to be used for trading
public void setOwnerID(int ownerID) {
this.stripCastableEnchants();
this.ownerID = ownerID;
}
@@ -841,6 +863,7 @@ public class Item extends AbstractWorldObject {
public boolean setOwner(AbstractGameObject owner) {
if (owner == null)
return false;
this.stripCastableEnchants();
if (owner.getObjectType().equals(GameObjectType.NPC))
this.ownerType = OwnerType.Npc;
else if (owner.getObjectType().equals(GameObjectType.PlayerCharacter))
@@ -1062,6 +1085,7 @@ public class Item extends AbstractWorldObject {
this.ownerID = pc.getObjectUUID();
this.ownerType = OwnerType.PlayerCharacter;
this.containerType = ItemContainerType.INVENTORY;
this.stripCastableEnchants();
return true;
}
@@ -1082,6 +1106,7 @@ public class Item extends AbstractWorldObject {
this.ownerID = npc.getObjectUUID();
this.ownerType = OwnerType.Npc;
this.containerType = Enum.ItemContainerType.INVENTORY;
this.stripCastableEnchants();
return true;
}
@@ -1099,6 +1124,7 @@ public class Item extends AbstractWorldObject {
this.ownerID = 0;
this.ownerType = null;
this.containerType = Enum.ItemContainerType.INVENTORY;
this.stripCastableEnchants();
return true;
}
@@ -1249,7 +1275,9 @@ public class Item extends AbstractWorldObject {
continue;
}
AbstractPowerAction apa = PowersManager.getPowerActionByIDString(effect.getIDString());
apa.applyBakedInStatsForItem(this, this.getItemBase().getBakedInStats().get(token));
if(apa != null)
apa.applyBakedInStatsForItem(this, this.getItemBase().getBakedInStats().get(token));
}
}
+21 -9
View File
@@ -220,16 +220,28 @@ public class ItemBase {
AnniverseryGifts.add(971008);
AnniverseryGifts.add(971009);
AnniverseryGifts.add(971010);
//AnniverseryGifts.add(5101000);
//AnniverseryGifts.add(5101020);
//AnniverseryGifts.add(5101100);
//AnniverseryGifts.add(5101120);
//AnniverseryGifts.add(5101040);
//AnniverseryGifts.add(5101140);
//AnniverseryGifts.add(5101060);
//AnniverseryGifts.add(5101080);
AnniverseryGifts.add(5101000);
AnniverseryGifts.add(5101020);
AnniverseryGifts.add(5101100);
AnniverseryGifts.add(5101120);
AnniverseryGifts.add(5101040);
AnniverseryGifts.add(5101140);
AnniverseryGifts.add(5101060);
AnniverseryGifts.add(5101080);
//fate peddler presents
AnniverseryGifts.add(971012);
AnniverseryGifts.add(971013);
AnniverseryGifts.add(971014);
AnniverseryGifts.add(971015);
AnniverseryGifts.add(971016);
AnniverseryGifts.add(971017);
AnniverseryGifts.add(971018);
AnniverseryGifts.add(971019);
AnniverseryGifts.add(971020);
AnniverseryGifts.add(971021);
AnniverseryGifts.add(971022);
AnniverseryGifts.add(971023);
}
public static int getDiscPrice(int uuid) {
+45 -8
View File
@@ -73,7 +73,7 @@ public class ItemFactory {
itemManager.updateInventory();
}
public static Item fillForge(NPC npc, PlayerCharacter pc, int itemsToRoll, int itemID, int pToken, int sToken, String customName) {
public static Item ResourceRoll(NPC npc, PlayerCharacter pc, int itemsToRoll, int itemID, int pToken, int sToken, String customName) {
String prefixString = "";
String suffixString = "";
@@ -215,7 +215,7 @@ public class ItemFactory {
pi.setAmount(itemsToRoll);
pi.setRandom(false);
ItemQueue produced = ItemQueue.borrow(pi, (long) (time * Float.parseFloat(ConfigManager.MB_PRODUCTION_RATE.getValue())));
ItemQueue produced = ItemQueue.borrow(pi, (long) time);
ItemProductionManager.send(produced);
return ml;
@@ -410,7 +410,7 @@ public class ItemFactory {
if (overdraft > 0 && !useWarehouse) {
if (pc != null)
ErrorPopupMsg.sendErrorMsg(pc, "Not enough gold in building strongbox." + ib.getName());
ErrorPopupMsg.sendErrorMsg(pc, "Not enough gold in building strongbox. " + ib.getName());
return null;
}
@@ -707,7 +707,7 @@ public class ItemFactory {
if (rollPrefix < 80) {
int randomPrefix = LootManager.TableRoll(vendor.getLevel(), false);
int randomPrefix = TableRoll(vendor.getLevel());
prefixEntry = ModTableEntry.rollTable(prefixTypeTable.modTableID, randomPrefix);
if (prefixEntry != null)
@@ -722,7 +722,7 @@ public class ItemFactory {
if (rollSuffix < 80 || prefixEntry == null) {
int randomSuffix = LootManager.TableRoll(vendor.getLevel(), false);
int randomSuffix = TableRoll(vendor.getLevel());
suffixEntry = ModTableEntry.rollTable(suffixTypeTable.modTableID, randomSuffix);
if (suffixEntry != null)
@@ -774,6 +774,43 @@ public class ItemFactory {
return toRoll;
}
public static int TableRoll(int vendorLevel) {
// Calculate min and max based on mobLevel
int min = 60;
int max = 120;
switch(vendorLevel){
case 20:
min = 70;
max = 140;
break;
case 30:
min = 80;
max = 160;
break;
case 40:
min = 90;
max = 180;
break;
case 50:
min = 100;
max = 200;
break;
case 60:
min = 175;
max = 260;
break;
case 70:
min = 220;
max = 320;
break;
}
int roll = ThreadLocalRandom.current().nextInt(min, max + 1);
return roll;
}
public static MobLoot produceRandomRoll(NPC npc, PlayerCharacter pc, String prefixString, String suffixString, int itemID) {
boolean useWarehouse = false;
@@ -885,8 +922,8 @@ public class ItemFactory {
ItemBase goldIB = ItemBase.getGoldItemBase();
int baseCost = ib.getBaseValue();
int total = (int) (baseCost + baseCost * .10);
//int baseCost = ib.getBaseValue();
int total = ib.getBaseValue();
EffectsBase suffix = null;
@@ -899,7 +936,7 @@ public class ItemFactory {
//calculate gold costs and remove from the warehouse
if (prefix != null || suffix != null) {
int costToCreate = (int) (ib.getBaseValue() + ib.getBaseValue() * .10f);
int costToCreate = ib.getBaseValue();
int buildingWithdraw = BuildingManager.GetWithdrawAmountForRolling(forge, costToCreate);
int overdraft = BuildingManager.GetOverdraft(forge, costToCreate);
+179 -14
View File
@@ -10,8 +10,11 @@
package engine.objects;
import engine.Enum;
import engine.InterestManagement.InterestManager;
import engine.InterestManagement.WorldGrid;
import engine.gameManager.*;
import engine.math.Vector3f;
import engine.math.Vector3fImmutable;
import engine.net.ByteBufferWriter;
import engine.net.client.msg.ErrorPopupMsg;
import engine.server.MBServerStatics;
@@ -58,6 +61,11 @@ public class Mine extends AbstractGameObject {
public final HashSet<Integer> _playerMemory = new HashSet<>();
public ArrayList<PlayerCharacter> affectedPlayers = new ArrayList<>();
//stronghold stuff
public boolean isStronghold = false;
public ArrayList<Mob> strongholdMobs;
public HashMap<Integer,Integer> oldBuildings;
/**
* ResultSet Constructor
*/
@@ -158,8 +166,10 @@ public class Mine extends AbstractGameObject {
ArrayList<Mine> serverMines = MineQueries.GET_ALL_MINES_FOR_SERVER();
for (Mine mine : serverMines) {
Mine.mineMap.put(mine, mine.buildingID);
Mine.towerMap.put(mine.buildingID, mine);
if(mine.capSize != 0) {
Mine.mineMap.put(mine, mine.buildingID);
Mine.towerMap.put(mine.buildingID, mine);
}
}
} catch (Exception e) {
@@ -180,9 +190,15 @@ public class Mine extends AbstractGameObject {
writer.putInt(mine.getObjectType().ordinal());
writer.putInt(mine.getObjectUUID());
writer.putInt(mine.getObjectUUID()); //actually a hash of mine
writer.putString(mine.mineType.name);
if(mine.isStronghold){
writer.putString("STRONGHOLD");
writer.putString("");
}else {
writer.putString(mine.mineType.name);
writer.putString(mine.capSize + " Man ");
}
//writer.putString(mine.zoneName + " " + mine.capSize + " Man ");
writer.putString(mine.capSize + " Man ");
writer.putInt(mine.production.hash);
writer.putInt(mine.production.baseProduction);
writer.putInt(mine.getModifiedProductionAmount()); //TODO calculate range penalty here
@@ -208,10 +224,17 @@ public class Mine extends AbstractGameObject {
writer.putInt(mine.isExpansion() ? mine.mineType.xpacHash : mine.mineType.hash);
writer.putString(mine.guildName);
GuildTag._serializeForDisplay(mine.guildTag, writer);
writer.putString(mine.nationName);
GuildTag._serializeForDisplay(mine.nationTag, writer);
if (mine.isStronghold) {
writer.putString("");
GuildTag._serializeForDisplay(Guild.getErrantGuild().getGuildTag(), writer);
writer.putString("");
GuildTag._serializeForDisplay(Guild.getErrantGuild().getGuildTag(), writer);
}else {
writer.putString(mine.guildName);
GuildTag._serializeForDisplay(mine.guildTag, writer);
writer.putString(mine.nationName);
GuildTag._serializeForDisplay(mine.nationTag, writer);
}
} catch (Exception e) {
Logger.error("Failed TO Serialize Mine Because: " + e.getMessage());
}
@@ -224,8 +247,7 @@ public class Mine extends AbstractGameObject {
// Only inactive mines are returned.
for (Mine mine : Mine.mineMap.keySet()) {
if (mine.owningGuild.getObjectUUID() == guildID &&
mine.isActive == false)
if (mine.owningGuild.getObjectUUID() == guildID)
mineList.add(mine);
}
return mineList;
@@ -297,6 +319,17 @@ public class Mine extends AbstractGameObject {
return true;
}
public static ArrayList<Mine> getMinesToTeleportTo(PlayerCharacter player) {
ArrayList<Mine> mines = new ArrayList<>();
for(Mine mine : Mine.getMines())
if(!mine.isActive)
if(mine.getOwningGuild() != null)
if(mine.getOwningGuild().getNation().equals(player.getGuild().getNation()))
mines.add(mine);
return mines;
}
public boolean changeProductionType(Resource resource) {
if (!this.validForMine(resource))
return false;
@@ -378,9 +411,11 @@ public class Mine extends AbstractGameObject {
}
public boolean validForMine(Resource r) {
if (this.mineType == null)
if (this.mineType == null) {
Logger.error("Mine Was Null Setting Resources for Mine: " + this.getObjectUUID());
return false;
return this.mineType.validForMine(r, this.isExpansion());
}
return this.mineType.validForMine(r);
}
public void serializeForMineProduction(ByteBufferWriter writer) {
@@ -391,10 +426,10 @@ public class Mine extends AbstractGameObject {
writer.putString(this.mineType.name);
writer.putString(this.zoneName);
writer.putInt(this.production.hash);
writer.putInt(this.production.baseProduction);
writer.putInt(this.getModifiedProductionAmount());
writer.putInt(this.getModifiedProductionAmount()); //TODO calculate range penalty here
writer.putInt(3600); //window in seconds
writer.putInt(this.isExpansion() ? this.mineType.xpacHash : this.mineType.hash);
writer.putInt(this.mineType.hash);
}
@Override
@@ -637,4 +672,134 @@ public class Mine extends AbstractGameObject {
_playerMemory.removeAll(toRemove);
}
public static Building getTower(Mine mine){
Building tower = BuildingManager.getBuildingFromCache(mine.buildingID);
if(tower != null)
return tower;
else
return null;
}
public static void serializeForClientMsgTeleport(Mine mine, ByteBufferWriter writer) {
AbstractCharacter guildRuler;
Guild rulingGuild;
Guild rulingNation;
java.time.LocalDateTime dateTime1900;
// Cities aren't a mine without a TOL. Time to early exit.
// No need to spam the log here as non-existant TOL's are indicated
// during bootstrap routines.
Building tower = Mine.getTower(mine);
if (tower == null) {
Logger.error("NULL TOWER FOR " + mine.zoneName + " mine");
return;
}
// Assign mine owner
if (tower.getOwner() != null)
guildRuler = tower.getOwner();
else
guildRuler = null;
// If is an errant tree, use errant guild for serialization.
// otherwise we serialize the soverign guild
if (guildRuler == null)
rulingGuild = Guild.getErrantGuild();
else
rulingGuild = guildRuler.getGuild();
rulingNation = rulingGuild.getNation();
// Begin Serialzing soverign guild data
writer.putInt(mine.getObjectType().ordinal());
writer.putInt(mine.getObjectUUID());
writer.putString(mine.zoneName + " Mine");
writer.putInt(rulingGuild.getObjectType().ordinal());
writer.putInt(rulingGuild.getObjectUUID());
writer.putString(rulingGuild.getName());
writer.putString("");
writer.putString(rulingGuild.getLeadershipType());
// Serialize guild ruler's name
// If tree is abandoned blank out the name
// to allow them a rename.
if (guildRuler == null)
writer.putString("");
else
writer.putString(guildRuler.getFirstName() + ' ' + guildRuler.getLastName());
writer.putInt(rulingGuild.getCharter());
writer.putInt(0); // always 00000000
writer.put((byte)0);
writer.put((byte) 1);
writer.put((byte) 1); // *** Refactor: What are these flags?
writer.put((byte) 1);
writer.put((byte) 1);
writer.put((byte) 1);
GuildTag._serializeForDisplay(rulingGuild.getGuildTag(), writer);
GuildTag._serializeForDisplay(rulingNation.getGuildTag(), writer);
writer.putInt(0);// TODO Implement description text
writer.put((byte) 1);
writer.put((byte) 0);
writer.put((byte) 1);
// Begin serializing nation guild info
if (rulingNation.isEmptyGuild()) {
writer.putInt(rulingGuild.getObjectType().ordinal());
writer.putInt(rulingGuild.getObjectUUID());
} else {
writer.putInt(rulingNation.getObjectType().ordinal());
writer.putInt(rulingNation.getObjectUUID());
}
// Serialize nation name
if (rulingNation.isEmptyGuild())
writer.putString("None");
else
writer.putString(rulingNation.getName());
writer.putInt(1);
writer.putInt(0xFFFFFFFF);
writer.putInt(0);
if (rulingNation.isEmptyGuild())
writer.putString(" ");
else
writer.putString(Guild.GetGL(rulingNation).getFirstName() + ' ' + Guild.GetGL(rulingNation).getLastName());
writer.putLocalDateTime(LocalDateTime.now());
if(tower != null) {
writer.putFloat(tower.loc.x);
writer.putFloat(tower.loc.y);
writer.putFloat(tower.loc.z);
} else{
writer.putFloat(0);
writer.putFloat(0);
writer.putFloat(0);
}
writer.putInt(0);
writer.put((byte) 1);
writer.put((byte) 0);
writer.putInt(0x64);
writer.put((byte) 0);
writer.put((byte) 0);
writer.put((byte) 0);
}
}
+22 -23
View File
@@ -13,21 +13,19 @@ import java.util.HashMap;
public enum MineProduction {
LUMBER("Lumber Camp", new HashMap<>(), Resource.WORMWOOD, 1618637196, 1663491950),
ORE("Ore Mine", new HashMap<>(), Resource.OBSIDIAN, 518103023, -788976428),
GOLD("Gold Mine", new HashMap<>(), Resource.GALVOR, -662193002, -1227205358),
MAGIC("Magic Mine", new HashMap<>(), Resource.BLOODSTONE, 504746863, -1753567069);
LUMBER("Lumber Camp", new HashMap<>(), 1618637196, 1663491950),
ORE("Ore Mine", new HashMap<>(), 518103023, -788976428),
MAGIC("Magic Mine", new HashMap<>(), 504746863, -1753567069),
GOLDMINE("Gold Mine", new HashMap<>(), -662193002, -1227205358);
public final String name;
public final HashMap<Integer, Resource> resources;
public final Resource xpac;
public final int hash;
public final int xpacHash;
MineProduction(String name, HashMap<Integer, Resource> resources, Resource xpac, int hash, int xpacHash) {
MineProduction(String name, HashMap<Integer, Resource> resources,int hash, int xpacHash) {
this.name = name;
this.resources = resources;
this.xpac = xpac;
this.hash = hash;
this.xpacHash = xpacHash;
}
@@ -39,6 +37,7 @@ public enum MineProduction {
MineProduction.LUMBER.resources.put(1580005, Resource.OAK);
MineProduction.LUMBER.resources.put(1580006, Resource.BRONZEWOOD);
MineProduction.LUMBER.resources.put(1580007, Resource.MANDRAKE);
MineProduction.LUMBER.resources.put(1580018, Resource.WORMWOOD);
}
if (MineProduction.ORE.resources.size() == 0) {
MineProduction.ORE.resources.put(7, Resource.GOLD);
@@ -46,14 +45,16 @@ public enum MineProduction {
MineProduction.ORE.resources.put(1580001, Resource.TRUESTEEL);
MineProduction.ORE.resources.put(1580002, Resource.IRON);
MineProduction.ORE.resources.put(1580003, Resource.ADAMANT);
MineProduction.ORE.resources.put(1580019, Resource.OBSIDIAN);
}
if (MineProduction.GOLD.resources.size() == 0) {
MineProduction.GOLD.resources.put(7, Resource.GOLD);
MineProduction.GOLD.resources.put(1580000, Resource.STONE);
MineProduction.GOLD.resources.put(1580008, Resource.COAL);
MineProduction.GOLD.resources.put(1580009, Resource.AGATE);
MineProduction.GOLD.resources.put(1580010, Resource.DIAMOND);
MineProduction.GOLD.resources.put(1580011, Resource.ONYX);
if (MineProduction.GOLDMINE.resources.size() == 0) {
MineProduction.GOLDMINE.resources.put(7, Resource.GOLD);
MineProduction.GOLDMINE.resources.put(1580000, Resource.STONE);
MineProduction.GOLDMINE.resources.put(1580008, Resource.COAL);
MineProduction.GOLDMINE.resources.put(1580009, Resource.AGATE);
MineProduction.GOLDMINE.resources.put(1580010, Resource.DIAMOND);
MineProduction.GOLDMINE.resources.put(1580011, Resource.ONYX);
MineProduction.GOLDMINE.resources.put(1580017, Resource.GALVOR);
}
if (MineProduction.MAGIC.resources.size() == 0) {
MineProduction.MAGIC.resources.put(7, Resource.GOLD);
@@ -62,27 +63,25 @@ public enum MineProduction {
MineProduction.MAGIC.resources.put(1580014, Resource.ANTIMONY);
MineProduction.MAGIC.resources.put(1580015, Resource.SULFUR);
MineProduction.MAGIC.resources.put(1580016, Resource.QUICKSILVER);
MineProduction.MAGIC.resources.put(1580020, Resource.BLOODSTONE);
}
}
public static MineProduction getByName(String name) {
if (name.toLowerCase().equals("lumber"))
if (name.equalsIgnoreCase("lumber"))
return MineProduction.LUMBER;
else if (name.toLowerCase().equals("ore"))
else if (name.equalsIgnoreCase("ore"))
return MineProduction.ORE;
else if (name.toLowerCase().equals("gold"))
return MineProduction.GOLD;
else if (name.equalsIgnoreCase("gold"))
return MineProduction.GOLDMINE;
else
return MineProduction.MAGIC;
}
public boolean validForMine(Resource r, boolean isXpac) {
public boolean validForMine(Resource r) {
if (r == null)
return false;
if (this.resources.containsKey(r.UUID))
return true;
else
return isXpac && r.UUID == this.xpac.UUID;
return this.resources.containsKey(r.UUID);
}
+167 -28
View File
@@ -101,6 +101,14 @@ public class Mob extends AbstractIntelligenceAgent {
private DeferredPowerJob weaponPower;
private DateTime upgradeDateTime = null;
private boolean lootSync = false;
public boolean StrongholdCommander = false;
public boolean StrongholdGuardian = false;
public Mine stronghold = null;
public boolean StrongholdEpic = false;
public boolean isDropper = false;
/**
@@ -265,7 +273,7 @@ public class Mob extends AbstractIntelligenceAgent {
this.notEnemy = EnumBitSet.asEnumBitSet(rs.getLong("notEnemy"), Enum.MonsterType.class);
this.enemy = EnumBitSet.asEnumBitSet(rs.getLong("enemy"), Enum.MonsterType.class);
this.firstName = rs.getString("mob_name");
this.isDropper = rs.getInt("is_dropper") == 1;
if (this.firstName.isEmpty())
this.firstName = this.mobBase.getFirstName();
@@ -289,6 +297,12 @@ public class Mob extends AbstractIntelligenceAgent {
Logger.error("Mobile:" + this.dbID + ": " + e);
}
if(this.firstName.toLowerCase().equals("guardian commander") || this.firstName.toLowerCase().equals("elite guardian")|| this.firstName.toLowerCase().equals("guardian")|| this.firstName.toLowerCase().equals("commander")){
this.despawn();
this.removeFromCache();
DbManager.MobQueries.DELETE_MOB(this);
}
}
public static void serializeMobForClientMsgOtherPlayer(Mob mob, ByteBufferWriter writer) throws SerializationException {
@@ -561,6 +575,32 @@ public class Mob extends AbstractIntelligenceAgent {
return mob;
}
public static Mob createStrongholdMob(int loadID, Vector3fImmutable spawn, Guild guild, boolean isMob, Zone parent, Building building, int contractID, String pirateName, int level) {
// Create a new Mob instance
Mob mobWithoutID = new Mob(pirateName, "", (short) 0, (short) 0, (short) 0, (short) 0, (short) 0, (short) 1, 0, false, false, false, spawn, spawn, Vector3fImmutable.ZERO, (short) 1, (short) 1, (short) 1, guild, (byte) 0, loadID, isMob, parent, building, contractID);
// Check if mobBase is null
if (mobWithoutID.mobBase == null)
return null;
// Set mob level
mobWithoutID.level = (short) level;
// Set the parent zone and parentZoneID
mobWithoutID.parentZone = parent;
mobWithoutID.parentZoneID = parent.getObjectUUID();
// If the mob is in a building, bind it to zero position
if (mobWithoutID.building != null)
mobWithoutID.bindLoc = Vector3fImmutable.ZERO;
// Avoid database actions and directly return the created mobWithoutID
mobWithoutID.setObjectTypeMask(MBServerStatics.MASK_MOB | mobWithoutID.getTypeMasks());
return mobWithoutID;
}
public static Mob createPet(int loadID, Guild guild, Zone parent, PlayerCharacter owner, short level) {
MobBase mobBase = MobBase.getMobBase(loadID);
Mob mob = null;
@@ -1216,6 +1256,10 @@ public class Mob extends AbstractIntelligenceAgent {
@Override
public void killCharacter(AbstractCharacter attacker) {
if(this.StrongholdGuardian || this.StrongholdCommander) {
ChatManager.chatSystemChannel(this.parentZone.getParent().getName() + "'s Stronghold Is Under Attack!");
StrongholdManager.CheckToEndStronghold(this.stronghold);
}
this.stopMovement(this.getMovementLoc());
@@ -1268,7 +1312,7 @@ public class Mob extends AbstractIntelligenceAgent {
}
setLoc(newLoc);
this.region = AbstractWorldObject.GetRegionByWorldObject(this);
this.region = Regions.GetRegionForTeleport(this.loc);//AbstractWorldObject.GetRegionByWorldObject(this);
//Next update will be end Loc, lets stop him here.
}
@@ -1397,11 +1441,6 @@ public class Mob extends AbstractIntelligenceAgent {
loadInventory();
this.updateLocation();
if(Mob.discDroppers.contains(this)){
this.setLevel((short)65);
this.setResists(new Resists("Dropper"));
}
}
public void despawn() {
@@ -1410,6 +1449,10 @@ public class Mob extends AbstractIntelligenceAgent {
WorldGrid.RemoveWorldObject(this);
this.charItemManager.clearInventory();
if(this.StrongholdEpic && this.stronghold != null && this.stronghold.isActive)
this.stronghold.isActive = false;
//StrongholdManager.EndStronghold(this.stronghold);
}
@Override
@@ -1471,11 +1514,31 @@ public class Mob extends AbstractIntelligenceAgent {
} catch (Exception e) {
Logger.error(e.getMessage());
}
//Resists.calculateResists(this);
if(this.StrongholdCommander || this.StrongholdGuardian || this.StrongholdEpic){
this.setResists(new Resists("Elite"));
}else if(Mob.discDroppers.contains(this)) {
this.setResists(new Resists("Dropper"));
} else if(this.isDropper){
this.setResists(new Resists("Dropper"));
} else{
this.setResists(new Resists());
}
this.resists.calculateResists(this, false);
}
public void calculateMaxHealthManaStamina() {
if(this.StrongholdCommander){
this.healthMax = 50000;
return;
} else if(this.StrongholdGuardian){
this.healthMax = 12500;
return;
} else if(this.StrongholdEpic){
this.healthMax = 250000;
return;
}
float h;
float m;
float s;
@@ -1533,6 +1596,46 @@ public class Mob extends AbstractIntelligenceAgent {
public void calculateAtrDefenseDamage() {
if(this.StrongholdCommander){
this.maxDamageHandOne = 3500;
this.minDamageHandOne = 1500;
int atr = 3500;
int defense = 3500;
if (this.bonuses != null) {
defense = GetDefense(defense, this);
atr = GetAttackRating(atr, this);
}
this.defenseRating = defense;
this.atrHandOne = atr;
return;
} else if(this.StrongholdGuardian){
this.maxDamageHandOne = 1550;
this.minDamageHandOne = 750;
int atr = 1800;
int defense = 2200;
if (this.bonuses != null) {
defense = GetDefense(defense, this);
atr = GetAttackRating(atr, this);
}
this.defenseRating = defense;
this.atrHandOne = atr;
return;
} else if(this.StrongholdEpic){
this.maxDamageHandOne = 5000;
this.minDamageHandOne = 2500;
int atr = 5000;
int defense = 3500;
if (this.bonuses != null) {
defense = GetDefense(defense, this);
atr = GetAttackRating(atr, this);
}
this.defenseRating = defense;
this.atrHandOne = atr;
return;
}
if (this.charItemManager == null || this.equip == null) {
Logger.error("Player " + currentID + " missing skills or equipment");
defaultAtrAndDamage(true);
@@ -1545,7 +1648,7 @@ public class Mob extends AbstractIntelligenceAgent {
calculateAtrDamageForWeapon(this.equip.get(MBServerStatics.SLOT_MAINHAND), true);
} catch (Exception e) {
this.atrHandOne = (short) this.mobBase.getAttackRating();
this.atrHandOne = GetAttackRating(this.mobBase.getAttackRating(), this);
this.minDamageHandOne = (short) this.mobBase.getMinDmg();
this.maxDamageHandOne = (short) this.mobBase.getMaxDmg();
this.rangeHandOne = 6.5f;
@@ -1558,7 +1661,7 @@ public class Mob extends AbstractIntelligenceAgent {
} catch (Exception e) {
this.atrHandTwo = (short) this.mobBase.getAttackRating();
this.atrHandTwo = GetAttackRating(this.mobBase.getAttackRating(), this);
this.minDamageHandTwo = (short) this.mobBase.getMinDmg();
this.maxDamageHandTwo = (short) this.mobBase.getMaxDmg();
this.rangeHandTwo = 6.5f;
@@ -1579,23 +1682,7 @@ public class Mob extends AbstractIntelligenceAgent {
// TODO add error log here
if (this.bonuses != null) {
// add any bonuses
defense += (short) this.bonuses.getFloat(ModType.DCV, SourceType.None);
// Finally, multiply any percent modifiers. DO THIS LAST!
float pos_Bonus = 1 + this.bonuses.getFloatPercentPositive(ModType.DCV, SourceType.None);
defense = (short) (defense * pos_Bonus);
//Lucky rune applies next
float neg_Bonus = this.bonuses.getFloatPercentNegative(ModType.DCV, SourceType.None);
defense = (short) (defense * (1 + neg_Bonus));
defense = GetDefense((int)defense, this);
} else
Logger.error("Error: missing bonuses");
@@ -1607,8 +1694,53 @@ public class Mob extends AbstractIntelligenceAgent {
this.defenseRating = (short) this.mobBase.getDefense();
}
// calculate defense for equipment
if(this.isDropper || Mob.discDroppers.contains(this)){
this.defenseRating *= 2;
this.atrHandOne *= 2;
this.atrHandTwo *= 2;
this.minDamageHandOne *= 2;
this.minDamageHandTwo *= 2;
this.maxDamageHandOne *= 2;
this.maxDamageHandTwo *= 2;
}
}
public static int GetDefense(int defense, Mob mob){
// add any bonuses
defense += (short) mob.bonuses.getFloat(ModType.DCV, SourceType.None);
// Finally, multiply any percent modifiers. DO THIS LAST!
float pos_Bonus = 1 + mob.bonuses.getFloatPercentPositive(ModType.DCV, SourceType.None);
defense = (short) (defense * pos_Bonus);
//Lucky rune applies next
float neg_Bonus = mob.bonuses.getFloatPercentNegative(ModType.DCV, SourceType.None);
return (int) (defense * (1 + neg_Bonus));
}
public static int GetAttackRating(int attackRating, Mob mob){
// add any bonuses
attackRating += (short) mob.bonuses.getFloat(ModType.OCV, SourceType.None);
// Finally, multiply any percent modifiers. DO THIS LAST!
float pos_Bonus = 1 + mob.bonuses.getFloatPercentPositive(ModType.OCV, SourceType.None);
attackRating = (short) (attackRating * pos_Bonus);
//Lucky rune applies next
float neg_Bonus = mob.bonuses.getFloatPercentNegative(ModType.OCV, SourceType.None);
return (int) (attackRating * (1 + neg_Bonus));
}
private float getWeaponDefense(HashMap<Integer, MobEquipment> equipped) {
MobEquipment weapon = equipped.get(MBServerStatics.SLOT_MAINHAND);
@@ -1935,6 +2067,13 @@ public class Mob extends AbstractIntelligenceAgent {
this.charItemManager = new CharacterItemManager(this);
this.loadInventory();
if(this.isDropper){
this.setLevel((short)65);
this.setResists(new Resists("Dropper"));
this.atrHandOne *= 2;
this.atrHandTwo *= 2;
}
try {
if (this.equipmentSetID != 0)
this.equip = MobBase.loadEquipmentSet(this.equipmentSetID);
+115 -3
View File
@@ -122,7 +122,11 @@ public class NPC extends AbstractCharacter {
// this.buyPercent = rs.getFloat("npc_buyPercent");
this.buyPercent = .33f;
this.sellPercent = 1;
if(ZoneManager.findSmallestZone(this.loc) != null && ZoneManager.findSmallestZone(this.loc).getSafeZone() == 1){
this.sellPercent = 0;
}else{
this.sellPercent = 1;
}
this.setRot(new Vector3f(0, rs.getFloat("npc_rotation"), 0));
@@ -189,6 +193,18 @@ public class NPC extends AbstractCharacter {
serializeForClientMsgOtherPlayer(npc, writer);
}
public boolean isInSafeZone() {
Zone zone = ZoneManager.findSmallestZone(this.getLoc());
if (zone != null) {
return zone.getSafeZone() == (byte) 1;
}
return false;
//return this.safeZone;
}
public static void serializeForClientMsgOtherPlayer(NPC npc, ByteBufferWriter writer)
throws SerializationException {
@@ -1180,7 +1196,7 @@ public class NPC extends AbstractCharacter {
}
// Cannot roll items without a warehouse.
// Due to the fact fillForge references the
// Due to the fact ResourceRoll references the
// warehouse and early exits. *** Refactor???
serverZone = this.building.getParentZone();
@@ -1214,7 +1230,7 @@ public class NPC extends AbstractCharacter {
if (isRandom)
item = ItemFactory.randomRoll(this, player, amount, itemID);
else
item = ItemFactory.fillForge(this, player, amount, itemID, pToken, sToken, customName);
item = ItemFactory.ResourceRoll(this, player, amount, itemID, pToken, sToken, customName);
if (item == null)
return null;
@@ -1347,4 +1363,100 @@ public class NPC extends AbstractCharacter {
}
}
public ArrayList<MobEquipment> getSellInventorySteward() {
ArrayList<MobEquipment> smallList = new ArrayList<>();
for (MobEquipment me : this.contract.getSellInventory()) {
int rankRequired = 0;
if (me.getItemBase().getType().equals(Enum.ItemType.CONTRACT)) {
switch (me.getItemBase().getUUID()) {
case 866:
case 889:
case 860:
case 850:
case 892:
case 1502003:
case 890:
case 896:
rankRequired = 1;
break;
case 899:
case 801:
case 803:
case 802:
case 821:
case 810:
case 806:
case 818:
case 800:
rankRequired = 2;
break;
case 840:
case 848:
case 813:
case 805:
case 804:
case 838:
rankRequired = 3;
break;
case 815:
rankRequired = 4;
break;
case 847:
case 830:
case 820:
rankRequired = 6;
break;
case 865:
case 252637:
rankRequired = 7;
break;
case 1502002: // harvesters don't need to exist but might one day
case 1502001: //mine guards don't need to exist but might one day
continue;
}
if(me.getItemBase().getName().toLowerCase().contains("trainer") || me.getItemBase().getName().toLowerCase().contains("refiner")){
rankRequired = 5;
}
if (this.getRank() >= rankRequired)
smallList.add(me);
}
}
return smallList;
}
public ArrayList<MobEquipment> getSellInventoryBuilder() {
ArrayList<MobEquipment> smallList = new ArrayList<>();
int maxValue = 0;
switch(this.getRank()){
case 1:
maxValue = 300000;
break;
case 2:
maxValue = 450000;
break;
case 3:
maxValue = 550000;
break;
case 4:
maxValue = 650000;
break;
case 5:
maxValue = 1000000;
break;
case 6:
case 7:
maxValue = 999999999;
break;
}
for(MobEquipment me : this.contract.getSellInventory()){
if(me.getItemBase().getBaseValue() <= maxValue)
smallList.add(me);
}
return smallList;
}
}
+87 -45
View File
@@ -26,6 +26,7 @@ import engine.job.JobScheduler;
import engine.jobs.DeferredPowerJob;
import engine.jobs.FinishSpireEffectJob;
import engine.jobs.NoTimeJob;
import engine.jobs.RefreshGroupJob;
import engine.math.Bounds;
import engine.math.FastMath;
import engine.math.Vector3fImmutable;
@@ -784,6 +785,9 @@ public class PlayerCharacter extends AbstractCharacter {
// Verify Race
int raceID = msg.getRace();
if(raceID == 0)
raceID = 1999;
Race race = Race.getRace(raceID);
if (race == null) {
@@ -816,33 +820,34 @@ public class PlayerCharacter extends AbstractCharacter {
return null;
}
// Verify HairStyle/BeardStyle/SkinColor/HairColor/BeardColor
int hairStyleID = msg.getHairStyle();
int beardStyleID = msg.getBeardStyle();
int skinColorID = msg.getSkinColor();
int hairColorID = msg.getHairColor();
int beardColorID = msg.getBeardColor();
// Verify HairStyle/BeardStyle/SkinColor/HairColor/BeardColor
int hairStyleID = msg.getHairStyle();
int beardStyleID = msg.getBeardStyle();
int skinColorID = msg.getSkinColor();
int hairColorID = msg.getHairColor();
int beardColorID = msg.getBeardColor();
if (!race.isValidHairStyle(hairStyleID)) {
Logger.info("Invalid HairStyleID: " + hairStyleID + " for race: " + race.getName());
return null;
if(raceID != 1999) {
if (!race.isValidHairStyle(hairStyleID)) {
Logger.info("Invalid HairStyleID: " + hairStyleID + " for race: " + race.getName());
return null;
}
if (!race.isValidSkinColor(skinColorID)) {
Logger.info("Invalid skinColorID: " + skinColorID + " for race: " + race.getName());
return null;
}
if (!race.isValidHairColor(hairColorID)) {
Logger.info("Invalid hairColorID: " + hairColorID + " for race: " + race.getName());
return null;
}
if (!race.isValidBeardColor(beardColorID)) {
Logger.info("Invalid beardColorID: " + beardColorID + " for race: " + race.getName());
return null;
}
}
if (!race.isValidSkinColor(skinColorID)) {
Logger.info("Invalid skinColorID: " + skinColorID + " for race: " + race.getName());
return null;
}
if (!race.isValidHairColor(hairColorID)) {
Logger.info("Invalid hairColorID: " + hairColorID + " for race: " + race.getName());
return null;
}
if (!race.isValidBeardColor(beardColorID)) {
Logger.info("Invalid beardColorID: " + beardColorID + " for race: " + race.getName());
return null;
}
// Get stat modifiers
int strMod = msg.getStrengthMod();
int dexMod = msg.getDexterityMod();
@@ -930,11 +935,12 @@ public class PlayerCharacter extends AbstractCharacter {
}
// Validate Rune against Race
if (!race.isAllowedRune(runeBase)) {
Logger.info("Trait Not valid for Race");
return null;
if(raceID != 1999) {
if (!race.isAllowedRune(runeBase)) {
Logger.info("Trait Not valid for Race");
return null;
}
}
// Validate BaseClass against Race
if (!baseClass.isAllowedRune(runeBase)) {
Logger.info("Trait Not valid for BaseClass");
@@ -1123,9 +1129,15 @@ public class PlayerCharacter extends AbstractCharacter {
int kitID = msg.getKit();
// get the correctKit
int raceClassID = Kit.GetKitIDByRaceClass(raceID, baseClassID);
int raceClassID;
if(raceID != 1999){
raceClassID = Kit.GetKitIDByRaceClass(raceID, baseClassID);
}else{
raceClassID = Kit.GetKitIDByRaceClass(2011, baseClassID);
}
ArrayList<Kit> allKits = Kit.RaceClassIDMap.get(raceClassID);
Kit kit = null;
for (Kit k : allKits) {
@@ -1155,6 +1167,13 @@ public class PlayerCharacter extends AbstractCharacter {
clientConnection);
return null;
}
if(raceID == 1999){
hairStyleID = 0;
beardStyleID = 0;
skinColorID = 0;
hairColorID = 0;
beardColorID = 0;
}
// Make PC
PlayerCharacter pcWithoutID = new PlayerCharacter(firstName, lastName, (short) strMod, (short) dexMod, (short) conMod,
@@ -1829,20 +1848,20 @@ public class PlayerCharacter extends AbstractCharacter {
//see if we shold grant xp to attacker
boolean doPVPEXP = false;
long lastKill = att.getLastKillOfTarget(this.getObjectUUID());
if ((System.currentTimeMillis() - lastKill) > MBServerStatics.PLAYER_KILL_XP_TIMER)
if (attacker.getLevel() > 39 && this.getLevel() > 39) {
Guild aN = null;
Guild tN = null;
if (attacker.getGuild() != null)
aN = attacker.getGuild().getNation();
if (this.getGuild() != null)
tN = this.getGuild().getNation();
if (aN == null || tN == null || aN.isEmptyGuild() || Guild.sameGuild(aN, tN) || this.isDeathShroud()) {
//if ((System.currentTimeMillis() - lastKill) > MBServerStatics.PLAYER_KILL_XP_TIMER)
//if (attacker.getLevel() > 39 && this.getLevel() > 39) {
//Guild aN = null;
//Guild tN = null;
//if (attacker.getGuild() != null)
// aN = attacker.getGuild().getNation();
//if (this.getGuild() != null)
// tN = this.getGuild().getNation();
//if (aN == null || tN == null || aN.isEmptyGuild() || Guild.sameGuild(aN, tN) || this.isDeathShroud()) {
//skip giving xp if same guild or attacker is errant, or target is in death shroud.
} else {
//} else {
doPVPEXP = true;
}
}
//}
// }
//apply death shroud to non safeholds.
Zone zone = ZoneManager.findSmallestZone(this.getLoc());
@@ -2029,7 +2048,8 @@ public class PlayerCharacter extends AbstractCharacter {
public void respawn(boolean setAlive, boolean enterWorld, boolean makeCorpse) {
// Recalculate everything
if(this.timestamps.containsKey("DeathTime"))
this.timestamps.remove("DeathTime");
this.recalculatePlayerStats(true);
this.setCombat(false);
@@ -4791,15 +4811,29 @@ public class PlayerCharacter extends AbstractCharacter {
return false;
}
private static void forceRespawn(PlayerCharacter sourcePlayer) throws MsgSendException {
if (sourcePlayer == null)
return;
sourcePlayer.getClientConnection().disconnect();
}
@Override
public void update() {
if (this.updateLock.writeLock().tryLock()) {
try {
if (!this.isAlive())
if (!this.isAlive() && this.isEnteredWorld()) {
if(!this.timestamps.containsKey("DeathTime")){
this.timestamps.put("DeathTime",System.currentTimeMillis());
}
if((System.currentTimeMillis() - this.timestamps.get("DeathTime")) > 600000)
forceRespawn(this);
return;
}
updateLocation();
updateMovementState();
updateRegen();
@@ -4827,6 +4861,14 @@ public class PlayerCharacter extends AbstractCharacter {
PowersManager.applyPower(this, this, Vector3fImmutable.ZERO, 1672601862, 40, false);
}
if(this.isFlying()){
//if (!AbstractCharacter.CanFly(this)) {
if(this.effects.containsKey("MoveBuff")){
GroundPlayer(this);
//ChatManager.chatSystemInfo(this, "You Cannot Fly While Having A MovementBuff");
}
}
} catch (Exception e) {
Logger.error(e);
} finally {
+1
View File
@@ -150,6 +150,7 @@ public class PromotionClass extends AbstractGameObject {
return true;
}
}
return false;
}
+73 -14
View File
@@ -34,6 +34,24 @@ public class Resists {
private int protectionTrains = 0;
private boolean immuneToAll;
public Resists() {
this.immuneToAll = false;
this.resists.put(DamageType.Slash, 0f);
this.resists.put(DamageType.Crush, 0f);
this.resists.put(DamageType.Pierce, 0f);
this.resists.put(DamageType.Magic, 0f);
this.resists.put(DamageType.Bleed, 0f);
this.resists.put(DamageType.Poison, 0f);
this.resists.put(DamageType.Mental, 0f);
this.resists.put(DamageType.Holy, 0f);
this.resists.put(DamageType.Unholy, 0f);
this.resists.put(DamageType.Lightning, 0f);
this.resists.put(DamageType.Fire, 0f);
this.resists.put(DamageType.Cold, 0f);
this.resists.put(DamageType.Healing, 0f);
this.immuneTo.put(DamageType.Siege, true);
}
/**
* Generic Constructor
*/
@@ -49,6 +67,9 @@ public class Resists {
case "Dropper":
setDropperResists();
break;
case "Elite":
setEliteResists();
break;
default:
setGenericResists();
break;
@@ -252,6 +273,24 @@ public class Resists {
this.immuneTo.put(DamageType.Siege, true);
}
public final void setEliteResists() {
this.immuneToAll = false;
this.resists.put(DamageType.Slash, 75f);
this.resists.put(DamageType.Crush, 75f);
this.resists.put(DamageType.Pierce, 75f);
this.resists.put(DamageType.Magic, 75f);
this.resists.put(DamageType.Bleed, 75f);
this.resists.put(DamageType.Poison, 75f);
this.resists.put(DamageType.Mental, 75f);
this.resists.put(DamageType.Holy, 75f);
this.resists.put(DamageType.Unholy, 75f);
this.resists.put(DamageType.Lightning, 75f);
this.resists.put(DamageType.Fire, 75f);
this.resists.put(DamageType.Cold, 75f);
this.resists.put(DamageType.Healing, 0f);
this.immuneTo.put(DamageType.Siege, true);
}
/**
* Create generic resists
*/
@@ -415,7 +454,7 @@ public class Resists {
*/
public float getResistedDamage(AbstractCharacter source, AbstractCharacter target, DamageType type, float damage, int trains) {
//handle fortitudes
damage = handleFortitude(target, type, damage);
//damage = handleFortitude(target, type, damage);
//calculate armor piercing
float ap = source.getBonuses().getFloatPercentAll(ModType.ArmorPiercing, SourceType.None);
float damageAfterResists = damage * (1 - (this.getResist(type, trains) * 0.01f) + ap);
@@ -438,6 +477,7 @@ public class Resists {
}
target.cancelOnTakeDamage(type, (damageAfterResists));
}
damageAfterResists = handleFortitude(target, type, damageAfterResists);
return damageAfterResists;
}
@@ -447,6 +487,38 @@ public class Resists {
// get resists for runes
PlayerBonuses rb = ac.getBonuses();
float slash = 0f, crush = 0f, pierce = 0f, magic = 0f, bleed = 0f, mental = 0f, holy = 0f, unholy = 0f, poison = 0f, lightning = 0f, fire = 0f, cold = 0f, healing = 0f;
if(ac.getObjectType().equals(Enum.GameObjectType.Mob)){
Mob mob = (Mob)ac;
if(mob.StrongholdEpic || mob.StrongholdCommander || mob.StrongholdGuardian) {
slash = 75f;
crush = 75f;
pierce = 75f;
magic = 75f;
bleed = 75f;
mental = 75f;
holy = 75f;
unholy = 75f;
poison = 75f;
lightning = 75f;
fire = 75f;
cold = 75f;
healing = 0f;
} else if(Mob.discDroppers.contains(mob) || mob.isDropper) {
slash = 200f;
crush = 200f;
pierce = 200f;
magic = 200f;
bleed = 200f;
mental = 200f;
holy = 200f;
unholy = 200f;
poison = 200f;
lightning = 200f;
fire = 200f;
cold = 200f;
healing = 0f;
}
}
if (rb != null) {
// Handle immunities
@@ -486,19 +558,6 @@ public class Resists {
cold += rb.getFloat(ModType.Resistance, SourceType.Cold);
healing += rb.getFloat(ModType.Resistance, SourceType.Healing); // DamageType.Healing.name());
//HHO
// String protectionString = rb.getString("protection");
//
// if (protectionString.isEmpty())
// this.protection = null;
// else try {
// this.protection = DamageType.valueOf(rb.getString("protection"));
// } catch (IllegalArgumentException e) {
// Logger.error( "No enum for: " + protectionString);
// this.protection = null;
// }
// this.protectionTrains = rb.getFloat("protection");
}
// get resists from equipment
+2 -2
View File
@@ -112,8 +112,8 @@ public class Zone extends AbstractGameObject {
if (zone.playerCityID > 0) {
writer.put((byte) 1); // Player City - True
writer.putFloat(Enum.CityBoundsType.GRID.extents);
writer.putFloat(Enum.CityBoundsType.GRID.extents);
writer.putFloat(Enum.CityBoundsType.GRID.extents + 128);
writer.putFloat(Enum.CityBoundsType.GRID.extents + 128);
} else
writer.put((byte) 0); // Player City - False
@@ -45,13 +45,10 @@ public class RunegateTeleportPowerAction extends AbstractPowerAction {
Vector3fImmutable rgLoc;
for (Runegate runegate : Runegate._runegates.values()) {
rgLoc = runegate.gateBuilding.getLoc();
float distanceToRunegateSquared = source.getLoc().distanceSquared2D(rgLoc);
if (distanceToRunegateSquared < sqr(dist)) {
dist = sqrt(distanceToRunegateSquared);
float disToGate = source.getLoc().distanceSquared2D(rgLoc);
if(disToGate < dist){
dist = disToGate;
rg = runegate.gateBuilding;
}
}
@@ -78,7 +78,7 @@ public class StealPowerAction extends AbstractPowerAction {
@Override
protected void _startAction(AbstractCharacter source, AbstractWorldObject awo, Vector3fImmutable targetLoc, int trains, ActionsBase ab, PowersBase pb) {
if (source == null || awo == null || !(source.getObjectType().equals(Enum.GameObjectType.PlayerCharacter)) || !(awo.getObjectType().equals(Enum.GameObjectType.Item)))
if (source == null || awo == null || !(source.getObjectType().equals(Enum.GameObjectType.PlayerCharacter)))
return;
PlayerCharacter sourcePlayer = (PlayerCharacter) source;
@@ -131,8 +131,23 @@ public class StealPowerAction extends AbstractPowerAction {
//Handle target attacking back if in combat and has no other target
CombatManager.handleRetaliate(ownerAC, sourcePlayer);
} else
} else if (owner.getObjectType().equals(Enum.GameObjectType.Mob)){
Mob ownerMob = (Mob) owner;
if (ownerMob.isSafeMode() || sourcePlayer.inSafeZone())
return;
if (ownerMob.getLoc().distanceSquared(sourcePlayer.getLoc()) > sqr(MBServerStatics.LOOT_RANGE))
return;
//mark thief and target as player aggressive
sourcePlayer.setLastPlayerAttackTime();
//Handle target attacking back if in combat and has no other target
CombatManager.handleRetaliate(ownerAC, sourcePlayer);
}else{
return;
}
ClientConnection origin = sourcePlayer.getClientConnection();
+1 -1
View File
@@ -357,7 +357,7 @@ public class MBServerStatics {
public static final int COMBAT_SEND_DODGE = 20;
public static final int COMBAT_SEND_BLOCK = 21;
public static final int COMBAT_SEND_PARRY = 22;
public static final short LEVELCAP = 75;
public static final short LEVELCAP = 80;
public static final int LEVEL_CON_WHITE = 7;
public static final int RESPAWN_TIMER = 90 * 1000;
public static final int DESPAWN_TIMER = 12 * 1000;
+4
View File
@@ -210,6 +210,8 @@ public class LoginServer {
nextServerTime = LocalDateTime.now().plusSeconds(1);
}
//load realm for the server pop creation screen
if (LocalDateTime.now().isAfter(nextDatabaseTime)) {
String pop = SimulationManager.getPopulationString();
Logger.info("Keepalive: " + pop);
@@ -276,6 +278,8 @@ public class LoginServer {
Logger.info("Loading All Guilds");
DbManager.GuildQueries.GET_ALL_GUILDS();
Logger.info("Loading All Realms");
Realm.loadAllRealms();
Logger.info("***Boot Successful***");
return true;
+22 -2
View File
@@ -57,6 +57,7 @@ import java.nio.file.Paths;
import java.time.Duration;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Timer;
@@ -595,12 +596,16 @@ public class WorldServer {
mobs = DbManager.MobQueries.GET_ALL_MOBS_FOR_ZONE(zone);
for (Mob m : mobs) {
try{
m.setObjectTypeMask(MBServerStatics.MASK_MOB | m.getTypeMasks());
m.setLoc(m.getLoc());
//ADD GUARDS HERE.
if (m.building != null && m.building.getBlueprint() != null && m.building.getBlueprint().getBuildingGroup() == BuildingGroup.BARRACK)
DbManager.MobQueries.LOAD_PATROL_POINTS(m);
} catch (Exception e) {
Logger.error(m.getObjectUUID() + " returned an Error Message :" + e.getMessage());
}
}
//Handle npc's
@@ -671,6 +676,22 @@ public class WorldServer {
delta = 60000;
}
//get additional logout timer for enemies nearby
if(!playerCharacter.isInSafeZone()){
HashSet<AbstractWorldObject> playersClose = WorldGrid.getObjectsInRangePartial(playerCharacter.loc,MBServerStatics.CHARACTER_LOAD_RANGE, MBServerStatics.MASK_PLAYER);
boolean enemiesClose = false;
for(AbstractWorldObject awo : playersClose){
PlayerCharacter pc = (PlayerCharacter)awo;
if(!pc.guild.getNation().equals(playerCharacter.guild.getNation()))
enemiesClose = true;
}
if(enemiesClose){
delta += 60000;
}
}
playerCharacter.stopMovement(playerCharacter.getLoc());
UpdateStateMsg updateStateMsg = new UpdateStateMsg();
updateStateMsg.setPlayer(playerCharacter);
@@ -688,8 +709,7 @@ public class WorldServer {
playerCharacter.getLoadedStaticObjects().clear();
LogoutCharacterJob logoutJob = new LogoutCharacterJob(playerCharacter, this);
JobContainer jc = JobScheduler.getInstance().scheduleJob(logoutJob,
System.currentTimeMillis() + delta);
JobContainer jc = JobScheduler.getInstance().scheduleJob(logoutJob, System.currentTimeMillis() + delta);
playerCharacter.getTimers().put("Logout", jc);
playerCharacter.getTimestamps().put("logout", System.currentTimeMillis());
@@ -24,7 +24,9 @@ import org.pmw.tinylog.Logger;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ThreadLocalRandom;
import static engine.gameManager.StrongholdManager.EndStronghold;
import static engine.server.MBServerStatics.MINE_LATE_WINDOW;
public class HalfHourlyJobThread implements Runnable {
@@ -39,12 +41,14 @@ public class HalfHourlyJobThread implements Runnable {
try {
ArrayList<Mine> mines = Mine.getMines();
for(Mine mine : mines){
if (mine.isStronghold)
StrongholdManager.EndStronghold(mine);
}
for (Mine mine : mines) {
try {
//handle mines opening on server reboot weird time interval
if(LocalDateTime.now().isAfter(LocalDateTime.now().withHour(mine.openHour).withMinute(mine.openMinute))) {
if (LocalDateTime.now().isAfter(LocalDateTime.now().withHour(mine.openHour).withMinute(mine.openMinute))) {
if (LocalDateTime.now().isBefore(LocalDateTime.now().withHour(mine.openHour).withMinute(mine.openMinute).plusMinutes(30))) {
HalfHourlyJobThread.mineWindowOpen(mine);
continue;
@@ -60,16 +64,20 @@ public class HalfHourlyJobThread implements Runnable {
// Close the mine if it reaches this far
LocalDateTime openTime = LocalDateTime.now().withHour(mine.openHour).withMinute(mine.openMinute);
if(LocalDateTime.now().plusMinutes(1).isAfter(openTime.plusMinutes(30)))
if (LocalDateTime.now().plusMinutes(1).isAfter(openTime.plusMinutes(30)))
mineWindowClose(mine);
} catch (Exception e) {
Logger.error("mineID: " + mine.getObjectUUID(), e.toString());
}
}
//StrongholdManager.processStrongholds();
} catch (Exception e) {
Logger.error(e.toString());
}
}
public static void mineWindowOpen(Mine mine) {